Arduino Workshop 4 Het gebruik van arrays als look-up table. Als een cijfer van een 7-segment display veranderd moet worden, kan het nodig zijn tot zeven I/O pennen een andere waarde te geven. Aangezien het van te voren voor elk cijfer bekend is welke pennen dat zijn, kun je dat vastleggen in een array. Voor elk cijfer van 0-9 leg je in een bitpatroon vast welke segmenten aan en welke uit moeten voor het desbtreffende cijfer. Een voorbeeld: /* abcdefgdp const byte seventab[] = {0b11111100, //0 0b01100000, //1 0b11011010, //2 0b11110010, //3 0b11100110, //4 0b10110110, //5 0b11111010, //6 0b11100000, //7 0b11111110, //8 0b11111010 //9 }; */ Bij de 2x7s sketches is de tabel gesplitst ten behoeve van de PORTx-instucties. In de 2x7s4 is deze splitsing overbodig. In de voorbeelden is de decimale punt van het display uit gelaten. Die kan zonodig met één instructie aan- of uitgezet worden. Het alternatief zou een twee keer zo lange tabel zijn met ook de cijfers met een decimale punt. I/O-poorten. De onderstaande informatie over de I/O-poorten is niet per se nodig voor de in de workshop gevraagde "dobbel" sketches. Veel - vooral 8 bits - microcontrollers hebben één of meer 8 bits I/O-poorten, verbonden met overeenkomende I/O-pennen. Dat ze acht bits breed zijn wil lang niet altijd zeggen dat er ook acht bits beschikbaar zijn. Soms zijn er een paar bits helemaal niet aanwezig en als ze er wel zijn, zijn ze niet altijd bruikbaar. Een pen kan wel vier of meer verschillende functies hebben maar daarvan er maar één gebruikt worden. Om de zaken nog lastiger te maken, gebruiken fabrikanten van processorborden nogal eens een nummering die geheel of gedeeltelijk afwijkt van de nummering die de chipfabrikant specificeert. Zowel bij de Arduino als bij de Raspberry PI is dit het geval maar zeker niet alleen bij hen. Voor de Arduino is het bestand ATmegaxx8 (zie bij de map bestanden) een goed voorbeeld. Hier zie je een PB-poort van acht bits PB0-PB7. PB6 en PB7 vallen af als je een kristal gebruikt voor de clock zoals bij de Arduino. De PC-poort heeft maar zeven bits waarvan er zes als analoge ingangen kunnen worden gebruikt. PC4 en PC5 kunnen ook voor I2C ingezet worden maar dan - uiteraard - niet voor analoog. Ook de PD-poort is acht bits maar de Arduino gebruikt PD0 en PD1 voor communicatie. Van geen van de drie poorten kun je alle acht bits voor digitale I/O gebruiken. Het voordeel van de PORTx-instructies is, dat alle bits van die "port" in één keer gelezen of geschreven kunnen worden. In het geval van de NANO lukt dat maar gedeeltelijk omdat niet alle bits van een poort beschikbaar zijn. Voor het lezen van een poort is dat geen bezwaar. Wat je niet nodig hebt kun je negeren. Voor het schrijven naar een poort is dat niet raadzaam. Je weet immers niet wat je aanricht met de bits van de poort die je niet wilt veranderen. In het ergste geval kun je een I/O-pen of iets dat daarop aangesloten is, opblazen. Maar zelfs als dat niet gebeurt heb je een onbetrouwbare sketch. Er is een truc om dit te omzeilen. Neem als voorbeeld poort D. PORTD &= 0b00001111; PORTD |= sevenad[lsd]; Eerst zet je de bits die je wilt veranderen op 0 met een "and" opdracht. Voor elk bit geldt dat "and" met een 0 een 0 oplevert en "and" met een 1 het bit ongewijzigd laat. Dan "or" je met het bitpatroon dat je wilt. In dit voorbeeld zijn de eerste vier bits van sevenad[lsd] het gewenste patroon. De "or" veranderd alleen de bits van de eerste vier die 1 zijn. De andere vier bits van sevenad[lsd] zijn 0 en die veranderen niets. Deze exercitie moet ook voor de B-poort toegepast worden. Ook daar gebruiken we vier bits van en laten de andere ongewijzigd. Op deze manier verander je acht bits met vier instructies.