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.