I registri legati alle porte di I/O permettono di accedere a più pin con un’unica istruzione. In Arduino Uno vi sono le seguenti porte multiple trattabili come un normale Byte (8 bit).
- La porta multipla D, che comprende i pin 0, 1, 2, 3, 4, 5, 6 e 7
- La porta multipla B, che comprende i pin 8, 9, 10, 11, 12 e 13
L’insieme delle porte è controllato da 3 registri:
- Il registro DDR (e precisamente DDRD e DDRB) che configura la direzione delle singole porte, bit per bit
- Il registro PORT (e precisamente PORTD e PORTB) che accede fisicamente alla singola porta
- Il registro PIN (e precisamente PIND e PINB) che legge lo stato logico di una singola porta
Esempio: il DDR configura la direzione (input/output) delle singole porte. Per esempio l’istruzione di assegnazione:
DDRD=B11111111
configura il registro DDR della porta “D” al valore binario “11111111”, cioè tutte in output.
Esempio: abilitare la porta D in output ed effettuare il blink su tutti i pin.
I due programmi sotto sono equivalenti e servono a fare il blink contemporaneamente suii pin 0,1,2,3,4,5,6,7 .
Per configurare gli otto pin (0, 1, 2, 3, 4, 5, 6, 7) come output, si può utilizzare l’istruzione DDRD=B11111111. Per settare, invece, la porta 0 e 1 come input e le altre sei come output si deve inoltrare l’istruzione DDRD=B11111100.
Per accendere tutti i Led si inoltri l’istruzione PORTD=B11111111 oppure PORTD=255. Per accendere i LED in posizione pari si usi, invece, il comando PORTD=B10101010 oppure l’equivalente PORTD=170.
Esercizio: far lampeggiare in sequenza tutti i segmenti, far lampeggiare la lettera “O”, far comparire la parola “ciao”.
In questo esercizio sono utilizzate le “porte” o “registri” di Arduino.
Esercizio: generatore di frequenze.
L’istruzione PORTD=B00000001 serve a impostare un livello di tensione alto sul pin 0, l’istruzione PORTD=B00000010 serve a generare un segnale alto sul pin 1 e così via. Possiamo scrivere le istruzioni precedenti in un modo equivalente:
PORTD=B00000001 si può scrivere PORTD=1
PORTD=B00000010 si può scrivere PORTD=2
PORTD=B00000100 si può scrivere PORTD=4
D’altra parte PORTD=11 si può scrivere PORTD= B00001011 e significa mettere nello stato HIGH i pin 0,1,4.
Nel prossimo esercizio, tramite un ciclo FOR si cambia il pin attivo: appena inizia il FOR avremo questi codici:
00000000
00000001
00000010
00000011
00000100
00000101
00000110
00000111
Da cui si vede che il pin 0 cambia stato 1 volta si ed una no, il pin 1 cambia ogni 2 volte, il pin 3 ogni 4 volte.
L’oscilloscopio è impostato a 1ms time per division o 0.1ms time per division.