In questo tutorial stabiliremo una comunicazione seriale tra due microcontrollori ATMEGA8. La comunicazione stabilita qui è di tipo UART (Universal Asynchronous Receiver Transmitter). Con questa comunicazione seriale i dati possono essere condivisi tra due microcontrollori, cosa necessaria in vari sistemi embedded.
Componenti richiesti
Hardware: ATMEGA8 (2 pezzi), alimentatore (5v), AVR-ISP PROGRAMMER, condensatore 100uF (collegato all'alimentatore), resistenza 1KΩ (due pezzi), LED, pulsante.
Software: Atmel studio 6.1, progisp o flash magic.
Schema e spiegazione del circuito
Cerchiamo di capire la comunicazione seriale nei microcontrollori AVR. Qui ATMEGA invia i dati all'altro ATMEGA in seriale. Ha altre modalità di comunicazione ma per una facile comunicazione scegliamo RS232. Il pin RS232 del primo ATMEGA8 è collegato al pin RXD del secondo ATMEGA8.
La comunicazione dati stabilita è programmata per avere:
- Otto bit di dati
- Due bit di stop
- Nessun bit di controllo di parità
- Baud rate di 2400 BPS (bit al secondo)
- Comunicazione asincrona (nessuna condivisione di clock tra due ATMEGA8)
Quindi abbiamo due registri impostati per due ATMEGA8 in modo diverso, dove uno funge da TRASMETTITORE e l'altro funge da RICEVITORE.
Ora per l' interfaccia RS232 tra due microcontrollori ATmega, le seguenti caratteristiche devono essere soddisfatte per TRASMETTITORE e RICEVITORE:
1. Il pin TXD (funzione di ricezione dati) del primo controller deve essere abilitato per TRANSMITTER e il pin RXD del secondo controller deve essere abilitato per RECEIVER.
2. Poiché la comunicazione è seriale, dobbiamo sapere ogni volta che viene ricevuto il byte di dati, in modo da poter fermare il programma fino alla ricezione del byte completo. Questo viene fatto abilitando un interrupt completo di ricezione dati.
3. I DATI vengono trasmessi e ricevuti al controller in modalità 8bit. Quindi due caratteri verranno inviati al controller alla volta.
4. Non ci sono bit di parità, un bit di stop nei dati inviati dal modulo.
Le funzionalità di cui sopra sono impostate nei registri del controller; li discuteremo brevemente,
GRIGIO SCURO (UDRE): (LATO TRASMETTITORE) Questo bit non viene impostato durante l'avvio ma viene utilizzato durante il lavoro per verificare se il trasmettitore è pronto per trasmettere o meno. Vedere il programma su TRASMITTER SIDE per maggiori dettagli.
GRIGIO CHIARO (RXC): (LATO RICEVENTE) Questo bit non viene impostato durante l'avvio ma viene utilizzato durante il lavoro per verificare se il ricevitore è pronto a ricevere dati o meno. Vedere il programma sul LATO RICEVENTE per maggiori dettagli.
VOILET (TXEN): (TRASMITTER SIDE) Questo bit è impostato per abilitare il pin del trasmettitore sul TRASMITTER SIDE.
ROSSO (RXEN): (LATO RICEZIONE) Questo bit rappresenta la funzione di ricezione dei dati, questo bit deve essere impostato affinché i dati dal modulo siano ricevuti dal controller, abilita anche il pin RXD del controller.
MARRONE (RXCIE): questo bit deve essere impostato per ottenere un interrupt dopo la corretta ricezione dei dati. Abilitando questo bit si viene a sapere subito dopo la ricezione dei dati a 8 bit. Non useremo questo bit qui, quindi è lasciato solo.
ROSA (URSEL): questo bit deve essere impostato prima di abilitare altri bit in UCSRC, dopo aver impostato altri bit necessari in UCSRC; URSEL deve essere disabilitato o messo a zero. Non useremo questo bit qui, quindi è lasciato solo.
GIALLO (UCSZ0, UCSZ1, UCSZ2): (LATO RICEZIONE E LATO TRASMETTITORE) Questi tre bit vengono utilizzati per selezionare il numero di bit di dati che stiamo ricevendo o inviando in un unico passaggio.
La comunicazione tra due ATMEGA è stabilita come comunicazione a otto bit. Abbinando la comunicazione con la tabella abbiamo, UCSZ0, UCSZ1 a uno e UCSZ2 a zero.
Dobbiamo impostarli sia sul lato di ricezione che di trasmissione.
ARANCIONE (UMSEL): (LATO RICEZIONE E LATO TRASMETTITORE) Questo bit viene impostato in base al fatto che il sistema comunichi in modo asincrono (entrambi utilizzano un clock diverso) o in modo sincrono (entrambi utilizzano lo stesso clock).
Entrambi i controller non condividono alcun orologio. Poiché entrambi utilizzano il proprio orologio interno. Quindi dobbiamo impostare UMSEL su 0 in entrambi i controller.
VERDE (UPM1, UPM0): (LATO RICEZIONE E LATO TRASMETTITORE) Questi due bit vengono regolati in base alla parità di bit che stiamo utilizzando nella comunicazione.
L'ATMEGA è programmato per inviare dati senza parità, poiché la lunghezza di trasmissione dei dati è piccola, non possiamo chiaramente aspettarci alcuna perdita o errore di dati. Quindi non stiamo impostando alcuna parità qui. Quindi impostiamo sia UPM1 che UPM0 a zero o vengono lasciati, perché tutti i bit sono 0 per impostazione predefinita.
BLU (USBS): (LATO RICEZIONE E LATO TRASMETTITORE) Questo bit viene utilizzato per scegliere il numero di bit di stop che stiamo utilizzando durante la comunicazione.
La comunicazione stabilita qui è di tipo asincrono, quindi per ottenere una trasmissione e una ricezione più accurata dei dati, dobbiamo usare due bit di stop, quindi abbiamo impostato USBS su "1" in entrambi i controller.
La velocità di trasmissione viene impostata nel controller scegliendo l'UBRRH appropriato.
Il valore UBRRH viene scelto facendo riferimento incrociato alla velocità di trasmissione e alla frequenza di cristallo della CPU.
Quindi, per riferimento incrociato, il valore UBRR è visto come '25', quindi viene impostata la velocità di trasmissione.
Come mostrato nel circuito, un pulsante è collegato sul lato del trasmettitore. Quando questo pulsante viene premuto, i dati a otto bit vengono inviati dal TRANSMITTER e questi dati vengono ricevuti dal RECEIVER. Alla ricezione di questi dati con successo, accende e spegne il LED ad esso collegato, che mostra il trasferimento dei dati riuscito tra due controller.