Arduino UNO Assembly introduzione Confronto tra Arduino UNO
Arduino UNO Assembly introduzione
Confronto tra Arduino UNO e altre versioni
Architettura ATmega 48 A/PA/88 A/PA/168 A/PA/328/P Dallo schema si vede che sono presenti 32 registri GPW (General Purpose Working) connessi alla ALU
Funzioni speciali dei pin • I pin PB 7 e PB 6 sono utilizzati per l’applicazione di un oscillatore a quarzo esterno XTAL 2 o per l’applicazione di una timer asincrono TOSC 2; • I pin PD 2 e PD 3 possono anche essere utilizzati anche come sorgente esterna di interrupt, in corrispondenza della variazione dello stato di tali pin.
Perché programmare in assembly • Per avere accesso diretto e più semplice ai registri • Meno possibilità di sbagliare evitando conflitti tra hardware e software • Si bypassa il codice del compilatore che può introdurre righe di codice ridondanti • Si produce un codice più veloce
Porte INPUT/OUTPUT Per poter programmare in Assembly bisogna conoscere sempre la struttura hardware interna del microcontrollore. Si parte dalle porte Input/output I registri di interfaccia INPUT/OUTPUT di arduino sono denominati B, C, D • B per il controllo dei pin digitali da 8 a 13 • C per il controllo dei pin di ingresso analogico • D per il controllo dei pin digitali da 0 a 7 I registri che controllano i pin di INPUT/OUTPUT sono denominati DDR, PORT, PIN. • Il registro DDR, determina se il pin è un INPUT o OUTPUT. • Il registro PORT controlla se il pin è HIGH o LOW. • l registro PIN legge lo stato dei pin INPUT impostati in ingresso con pin. Mode().
DDR PIN e PORT • • I registri DDR e PORT possono essere sia scritti che letti. I registri PIN controllano lo stato degli ingressi e quindi, possono essere solo letti. PORTD, DDRD, PIND riguardano i pin da 0 a 7; DDRD è il registro di direzione INPUT/OUTPUT , un bit è zero se il relativo pin è di INPUT altrimenti è uno; PIND legge lo stato delle porte se sono di ingresso; PORTD controlla se le porte sono HIGH o LOW Struttura del registro PORTD e DDRD 7 6 5 4 3 2 1 0 bit D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0 pin PORTB, DDRB, PINB riguardano i pin da 8 a 13; DDRB è il registro di direzione INPUT/OUTPUT, un bit è zero se il relativo pin è di INPUT altrimenti è uno; PINB legge lo stato delle porte se sono di ingresso; PORTB controlla se le porte sono HIGH o LOW. Struttura del registro DDRB e PORTB bit pin 7 6 5 4 3 2 1 0 D 13 D 12 D 11 D 10 D 9 D 8 I bit 7 e 6 sono per il quarzo esterno
Porte analogiche • PORTC, DDRC, PINC riguardano i pin analogici • DDRC è il registro di direzione INPUT/OUTPUT; PINC legge lo stato delle porte se sono di ingresso; PORTC controlla se le porte sono HIGH o LOW • Struttura del registro PORTC pin bit 7 6 5 4 3 2 1 0 A 5 A 4 A 3 A 2 A 1 A 0 I bit 7 e 6 sono accessibili solo ad arduino mini
Schema circuitale
Esempi con IDE Arduino blink #define F_CPU 16000000 UL //definisce la frequenza del clock esterno #include <avr/io. h> #include <util/delay. h> int main (void) { DDRB =0 b 00100000; //il terzo bit è a 1, quindi, il pin corrispondente (13) è OUTPUT PORTB=0 b 0000; //tutti i pin sono a 0 V while(1) //fino a che il dispositivo è alimentato { PORTB=0 b 0000; //tutti i pin sono a 0 V _delay_ms(1000); PORTB=0 b 00100000; //dopo 1 s il pin 13 è a 5 V _delay_ms(1000); //lo stato HIGH dura 1 s e poi si ritorna daccapo } }
Osservazioni • • La costante F_CPU definisce la frequenza di clock alla quale lavorerà la CPU del microcontrollore grazie all' oscillatore esterno, ed è obbligatorio dichiararla al principio del codice in caso di utilizzare la funzione _delay_ms o qualsiasi altra funzione dichiarata in utils/delay. h. I valori della costante F_CPU devono essere corretti altrimenti, i ritardi potrebbero essere errati. Nel caso di arduino UNO ragioniamo a 16 MHz _delay_ms appartiene alla libreria utill/delay La funzione I/O è dichiarata nella libreria AVR Un pin digitale è di INPUT se il bit corrispondente del registro DDR è posto a 0 Un pin digitale è di OUTPUT se il bit corrispondente del registro DDR è posto a 1 Se un pin è a livello logico alto, il bit corrispondente di PORT sarà 1 Se un pin è a livello logico basso, il bit corrispondente di PORT sarà 0
Esempi con IDE Arduino comandare il led 13 con un interruttore sul pin 8 #define F_CPU 16000000 UL //definisce la frequenza del clock esterno #include <avr/io. h> #include <util/delay. h> int main (void) { DDRB =0 b 00100000; //il sesto bit è a 1, quindi, il pin corrispondente (13) è OUTPUT PORTB=0 b 0000; //tutti i pin sono a 0 V while(1) //fino a che il dispositivo è alimentato {if(PORTB=0 b 0000)//se tutti i pin sono a 0 V PORTB=0 b 0000; if(PORTB=0 b 00000001)//se il primo bit è 1, cioè il pin 8 di INPUT è a livello logico alto PORTB=0 b 00100000 //il led 13 è acceso _delay_ms(1000); //lo stato HIGH dura 1 s e poi si ritorna daccapo } }
Display a 7 segmenti a catodo comune Ad ogni led del display si associa un pin di arduino Supponiamo di voler fare le seguenti associazioni: led pin Bit del registro D 7 a b c d e f g h 2 3 4 5 6 7 8 9 f e d c b a 7 6 5 4 3 2 6 5 4 h g 3 2 1 1 0 0
Es scrivere 0 e 1 con un ritardo di 1 secondo #define F_CPU 16000000 UL //definisce la frequenza del clock esterno #include <avr/io. h> #include <util/delay. h> int main (void){ DDRB =0 b 00000011; //primo e secondo bit OUTPUT DDRD=0 b 11111100; //tutti i pin sono OUTPUT tranne il primo e secondo while(1) //fino a che il dispositivo è alimentato {PORTB=0 b 11111100)// tutti i pin sono a 1 tranne il primo e secondo PORTD=0 b 0000; tutti i pin sono a zero _delay_ms(1000); // PORTB=0 b 000011000)// il 3 e il 4 sono a 1 e corrispondono a b e c PORTD=0 b 0000 //tutti i pin sono a zero _delay_ms(1000); } }
- Slides: 17