martedì 24 giugno 2014

Programmare Arduino in puro C #1: Facciamo lampeggiare un led

Voglio iniziare una serie di articoli su come programmare Arduino UNO (basato sull'ATmega328p).
Per programmare non userò il classico IDE di Arduino, ma un programma di casa Atmel: AVR studio 6 che potete scaricare da QUI (dovete registrarvi).
Programmare arduino senza passare dall'IDE ufficiale hai il vantaggio che si può avere il pieno controllo del microcontrollore, e soprattutto è molto utile per capire a fondo come funziona questo micro, lo svantaggio è che è più difficile da programmare, ma con voglia e passione piano piano si impara, il mio obiettivo è di riuscire a fare con Atmel studio tutto quello che so fare con l'IDE ufficiale di Arduino.
Dopo aver installato il programma andare su file --> nuovo progetto


Poi selezioniamo il tipo di progetto: GCC C executable project, scegliamo un nome e facciamo OK.


Poi selezioniamo il modello del microcontrollore di Arduino UNO , l'ATmega328p:


Dovremo trovarci davanti ad una schermata come questa:

Bene, la parte più noiosa è terminata.
L'instruzione while(1), è una condizione sempre vera e corrisponde al void loop() nel linguaggio di Arduino.




Per le numerazioni dei pin del micro non dobbiamo riferirci ai nomi di Arduino, ma al seguente schema:


Nell'ATmega328p ci sono 3 tipi di porte:
  • PORTB: comprende i pin digitali dal 8 al 13
  • PORTC: comprende i pin analogici da A0 a A5
  • PORTD: comprende i pin digitali dal pin 0 al 7
Questi nomi fanno riferimento all'indirizzo di memoria dei registri per poter manipolare i pin.
Per ogni "PORT" (B,C,D) ci sono altri 3 tipi di registri:

Esempio registri della PORTB
  • DDRx: Serve per impostare un pin come input (0) o come output (1), possono essere letti e scritti.
  • PORTx: Serve per impostare il lo stato del pin (HIGH/LOW)
  • PINx: Serve per leggere il valore digitale (0,1) di un pin.

Questo è il programma che ho scritto che andremo ad analizzare:


 /*  
  * Blink ATmega328.c  
  *  
  * Created: 24/06/2014 12:40:41  
  * Author: Alessandro  
  */   
 #define F_CPU_CPU 16000000  
 #include <util/delay.h>  
 #include <avr/io.h>  
 int main(void)  
 {  
      DDRB=0xFF;  
   while(1)  
   {  
           PORTB=0xFF;  
       _delay_ms(500);  
       PORTB=0;  
       _delay_ms(500);            
   }  
 }  
Questo programma farà lampeggiare il led su tutti i pin della PORTB.
  1. La prima istruzione #define F_CPU_CPU 16000000 definisce il clock del micro di 16Mhz
  2. La libreria util/delay.h serve per la funzione di delay, mentrw avr/io.h è una libreria standard.
  3. L'istruzione DDRB=0xFF; dichiara tutti i pin sulla PORTB come output, 0xFF corrisponde a 255 in decimale.
  4. Nel ciclo infinito, while(1) vengono impostati come HIGH tutti i pin sulla PORTB.
  5. L'istruzione _delay_ms(500); corrisponde a delay(500); di arduino e mette in pausa il programma per mezzo secondo.
  6. PORTB=0; spegne tutti i pin sulla PORTB
Poi c'è un altro delay e ciclo ricomincia.
Per compilare il programma basta premere F7, e il file .HEX verrà salvato nella cartella del progetto.
Per caricare il programma sull'Arduino uno dovete scaricare (da QUI) questo semplicissimo programma:


Selezionate il file .HEX, il tipo di Arduino, e la porta seriale.
Collegate un led dal pin 8 al 13 e dovrebbe lampeggiare ;)
Nei prossimi articoli vedremo come manipolare i registri in modo indipendente e come leggere un input da un pulsante.
In questo articolo ho preso spunto in parte da: questo sito



Nessun commento:

Posta un commento