- Componenti richiesti
- Schema del circuito e spiegazione del funzionamento
- Spiegazione della programmazione
In questo progetto progetteremo una semplice sveglia utilizzando i timer ATMEGA32. Il microcontrollore ATmega32A ha un timer a 16 bit e utilizzeremo quel timer per contare i secondi e sviluppare un orologio digitale.
Tutti gli orologi digitali hanno un cristallo al loro interno che è il cuore dell'orologio. Questo cristallo non solo è presente nell'orologio ma è presente in tutti i sistemi informatici in tempo reale. Questo cristallo genera impulsi di clock, necessari per i calcoli di temporizzazione. Sebbene ci siano altri modi per ottenere impulsi di clock, ma per la precisione e la frequenza più alta, la maggior parte preferisce un orologio basato sul cristallo. Collegheremo un cristallo ad ATMEGA32 per ottenere un orologio preciso.
Componenti richiesti
Hardware: microcontrollore ATmega32, cristallo 11.0592MHz, condensatore 22pF (2 pezzi), alimentatore (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2 LCD), condensatore 100uF (collegato all'alimentatore), pulsanti (quattro pezzi), resistenza 10KΩ (sei pezzi), capacità 100nF (quattro pezzi), interruttori a tre pin (2 pezzi), transistor 2N2222, cicalino, resistenza 200Ω.
Software: Atmel studio 6.1, progisp o flash magic.
Schema del circuito e spiegazione del funzionamento
Per una sincronizzazione precisa, abbiamo collegato un cristallo da 11,0592 MHz per l'orologio. Ora per disabilitare l'orologio interno di ATMEGA dobbiamo cambiare i suoi LOW FUSE BITS. Ricorda che non stiamo toccando i bit del fusibile alto, quindi la comunicazione JTAG sarebbe ancora abilitata.
Per dire ad ATMEGA di disabilitare l'orologio interno e di lavorare su quello esterno dobbiamo impostare:
LOW USE BYTE = 0xFF o 0b11111111.
Nel circuito PORTB di ATMEGA32 è collegato alla porta dati LCD. Qui bisogna ricordarsi di disabilitare la comunicazione JTAG nel PORTC di ATMEGA cambiando i byte alti del fusibile, se si vuole usare il PORTC come una normale porta di comunicazione. In 16x2 LCD ci sono 16 pin in tutto se c'è una luce nera, se non c'è retroilluminazione ci saranno 14 pin. Si può alimentare o lasciare i perni della retroilluminazione. Ora nei 14 pin ci sono 8 pin dati (7-14 o D0-D7), 2 pin di alimentazione (1 & 2 o VSS & VDD o gnd & + 5v), 3 ° pin per il controllo del contrasto (VEE-controlla quanto dovrebbero essere spessi i caratteri mostrato) e 3 pin di controllo (RS & RW & E)
Nel circuito, puoi osservare che ho preso solo due pin di controllo. Ciò offre la flessibilità di una migliore comprensione, il bit di contrasto e READ / WRITE non vengono spesso utilizzati in modo che possano essere cortocircuitati a massa. Questo mette l'LCD nel più alto contrasto e modalità di lettura. Abbiamo solo bisogno di controllare i pin ENABLE e RS per inviare caratteri e dati di conseguenza.
Di seguito sono riportati i collegamenti effettuati per l'LCD:
PIN1 o VSS a terra
Alimentazione da PIN2 o VDD o VCC a + 5v
PIN3 o VEE a massa (offre il massimo contrasto migliore per un principiante)
PIN4 o RS (selezione registro) a PD6 di uC
PIN5 o RW (lettura / scrittura) a massa (mette l'LCD in modalità di lettura facilita la comunicazione per l'utente)
PIN6 o E (Abilita) a PD5 di uC
PIN7 o D0 a PB0 di uC
PIN8 o D1 a PB1 di uC
PIN9 o D2 a PB2 di uC
PIN10 o D3 a PB3 di uC
PIN11 o D4 a PB4 di uC
PIN12 o D5 a PB5 di uC
PIN13 o D6 a PB6 di uC
PIN14 o D7 a PB7 di uC
Nel circuito si può vedere che abbiamo utilizzato la comunicazione a 8 bit (D0-D7) tuttavia questo non è obbligatorio, possiamo usare la comunicazione a 4 bit (D4-D7) ma con la comunicazione a 4 bit il programma diventa un po 'complesso. Quindi, come mostrato nella tabella sopra, stiamo collegando 10 pin dell'LCD al controller in cui 8 pin sono pin dati e 2 pin per il controllo.
L'interruttore uno serve per abilitare la funzione di regolazione tra sveglia e ora. Se il pin è basso, possiamo regolare l'ora della sveglia premendo i pulsanti. Se i suoi pulsanti alti servono per regolare solo il TEMPO. Ci sono QUATTRO pulsanti presenti qui, il primo è per aumentare i MINUTI in allarme o ora. Il secondo è per decrementare i MINUTI in allarme o ora. Il terzo è per l'incremento dell'ORA in allarme o ora. QUARTA è per il decremento delle ORE nella sveglia o nell'ora.
I condensatori qui presenti servono ad annullare l'effetto di rimbalzo dei pulsanti. Se vengono rimossi, il controller potrebbe contare più di uno ogni volta che viene premuto il pulsante. Le resistenze collegate per i pin servono per limitare la corrente, quando il pulsante viene premuto per abbassare il pin a terra.
Ogni volta che viene premuto un pulsante, il pin corrispondente del controller viene abbassato a terra e quindi il controller riconosce che è stato premuto un determinato pulsante e viene eseguita l'azione corrispondente.
Prima di tutto, l'orologio che scegliamo qui è 11059200 Hz, dividendolo per 1024 si ottiene 10800. Quindi per ogni secondo otteniamo 10800 impulsi. Quindi avvieremo un contatore con 1024 prescaler per ottenere il clock del contatore a 10800 Hz. Secondo useremo la modalità CTC (Clear Timer Counter) di ATMEGA. Ci sarà un registro a 16 bit dove possiamo memorizzare un valore (valore di confronto), quando il contatore conta fino al valore di confronto è impostato un interrupt per generare.
Imposteremo il valore di confronto a 10800, quindi fondamentalmente avremo un ISR (Interrupt Service Routine su ogni confronto) per ogni secondo. Quindi useremo questa routine tempestiva per ottenere l'orologio di cui avevamo bisogno.
MARRONE (WGM10-WGM13): questi bit servono per selezionare la modalità di funzionamento del timer.
Ora poiché vogliamo la modalità CTC con valore di confronto in byte OCR1A, dobbiamo solo impostare WGM12 su uno, i rimanenti sono lasciati come sono zero per impostazione predefinita.
ROSSO (CS10, CS11, CS12): questi tre bit servono per scegliere il prescalar e ottenere così il contatore di clock appropriato.
Poiché vogliamo un 1024 come prescaling, dobbiamo impostare sia CS12 che CS10.
Ora c'è un altro registro che dovremmo considerare:
VERDE (OCIE1A): questo bit deve essere impostato per ottenere un interrupt sulla corrispondenza di confronto tra il valore del contatore e il valore OCR1A (10800) che abbiamo impostato.
Il valore OCR1A (valore di confronto del contatore) è scritto nel registro sopra.
Spiegazione della programmazione
Il funzionamento della sveglia è spiegato passo dopo passo nel codice seguente:
#include // intestazione per abilitare il controllo del flusso di dati sui pin #define F_CPU 1000000 // indica la frequenza di cristallo del controller collegata #include