Come programmare un AVR
L'AVR è un microcontrollore di base RISC della ATMEL. Come esempio ho usato ATMEGA8. Contiene porte digitali I/O, convertitori ADC, porte seriali, PWM, temporizzatori, oscillatori esterni e diversi SPI. Ha una grande memoria flash programmabile, di circa 8K.
Per la programmazione di un AVR è necessario avere due software ed un programmatore ISP. Il software è liberamente scaricabile presso il seguente sito:
Uso di WinAVR e AVR Studio
A questo punto prima si installa WinAVR e dopo AVR Studio. In AVR Studio è possibile programmare sia usando Assembly che C.
Aprire AVR studio cliccando su New Project > AVRGCC for C, quindi selezionare il controller dalla lista, la maggior parte si trova in AVR Simulator o AVR Simulator 2.
La schermata dovrebbe essere la seguente:
Scriveremo un semplice programma che vada a spegnere e accedere le cnnessioni led sul primo piedino della PortB (PB0) con un intervallo di 25ms. Il programma è il segue:
#include< avr\io.h > #include< util\delay.h > int main() { DDRB=(1 << PB0); //Set the data direction register to be output while(1) //This is an infinite loop { PORTB=0×01; //Write 1 to PB0 (first pin on port B) _delay_ms(25); //no explanation needed! PORTB=0×00; //Write 0 to PB0 (first pin on port B) } return 1; //This line is never reached, //just a requirement of the //software as we have set the //return type to be as integer }
Il simbolo " << " è un operatore shift di sinistra. Fondamentalmente serve a spostare il n numeri di bit a sinistra.
Se in AVR vogliamo usare una porta come output, si scriva semplicemente 1 al bit specifico nel registro di DDR della porta specifica. In questo caso si vuole rendere il primo piedino una portB di uscita. Perciò noi ci scriveremo 1. PB0 è un valore definito in
#define PB0 0
La linea:
DDRB=(1 << PB0)
significa:
DDRB = ( 1 << 0 )
ovveo “shift 1, zero volte verso sinistra”. La sequenza finale di bit è così:
0000 0001
Il comando:
DDRB = ( 1 << 3 )
diventa:
0000 1000
ovvero "shift 1(0×01), tre volte verso sinistra".
La prossima linea è:
PORTB=0 ×01;
Questo vuole dire semplicemente girare PB0 verso l’alto. La funzione di intervallo è data in millesimi di secondi e la prossima linea gira la PB0 in basso. L’intera (1) funzione è un ciclo infinite simile a for(;;)
Per simulare il codice cliccare su Build -> Build and Run nel Menu. Il risultato simulato si può vedere nella finestra I/O.
Source: Come programmare un AVR