Qui stabiliremo una comunicazione tra un microcontrollore ATmega8 e Arduino Uno. La comunicazione stabilita qui è di tipo UART (Universal Asynchronous Receiver Transmitter). È una comunicazione seriale. Con questa comunicazione seriale i dati possono essere condivisi tra due controller, cosa necessaria in varie applicazioni di sistema embedded.
Nei sistemi embedded dobbiamo avere una conoscenza di base sulle comunicazioni di sistema, quindi per questo stiamo facendo questo progetto. In questo progetto discuteremo del sistema di comunicazione di base e invieremo alcuni dati dal trasmettitore al ricevitore in seriale.
In questo progetto ATMEGA8 funge da TRASMETTITORE e ARDUINO UNO funge da RICEVITORE. Nella comunicazione seriale invieremo i dati BIT BY BIT, fino al completo trasferimento di un BYTE di dati. I dati possono avere una dimensione di 10 bit, ma per ora manterremo 8BITS.
Componenti richiesti
Hardware: ATMEGA8, ARDUINO UNO, 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, ARDUINO NIGHTLY.
Schema del circuito e spiegazione
Prima di discutere lo schema del circuito e la programmazione per trasmettitore e ricevitore, è necessario comprendere la comunicazione seriale. L'ATMEGA qui invia i dati all'UNO in seriale come discusso in precedenza.
Ha altre modalità di comunicazione come la comunicazione MASTER SLAVE, la comunicazione JTAG ma per una facile comunicazione scegliamo RS232. Qui collegheremo il PIN TXD (Trasmettitore) di ATMEGA8 al PIN RXD (Ricevitore) di ARDUINO UNO
La comunicazione dati stabilita è programmata per avere:
- Otto bit di dati
- Due bit di stop
- Nessun bit di controllo di parità
- Baud rate di 9600 BPS (bit al secondo)
- Comunicazione asincrona (nessuna condivisione di clock tra ATMEGA8 e UNO (entrambi hanno diverse unità di clock))
Per stabilire l' UART tra Arduino Uno e ATMEGA8 dobbiamo programmare accuratamente l'impostazione. Per questo dobbiamo mantenere i parametri sopra menzionati uguali ad entrambe le estremità. In questo uno funge da TRASMETTITORE e altri da RICEVITORE. Discuteremo di seguito le impostazioni di ciascun lato.
Ora per l' interfaccia RS232, devono essere soddisfatte le seguenti caratteristiche per il lato TRASMETTITORE (ATMEGA8):
1. Il pin TXD (funzione di ricezione dati) del primo controller deve essere abilitato per TRANSMITTER.
2. Poiché la comunicazione è seriale, dobbiamo sapere ogni volta che viene ricevuto il bye dei dati, in modo da poter interrompere 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): Questo bit non è 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.
VOILET (TXEN): questo bit è impostato per abilitare il pin del trasmettitore sul LATO TRASMETTITORE.
GIALLO (UCSZ0, UCSZ1 e UCSZ2): questi tre bit vengono utilizzati per selezionare il numero di bit di dati che stiamo ricevendo o inviando in una sola volta.
La comunicazione tra due SIDES viene stabilita come comunicazione a otto bit. Abbinando la comunicazione con la tabella abbiamo, UCSZ0, UCSZ1 a uno e UCSZ2 a zero.
ARANCIONE (UMSEL): 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 SYTEMS non condividono alcun orologio. Poiché entrambi utilizzano il proprio orologio interno. Quindi dobbiamo impostare UMSEL su 0 in entrambi i controller.
VERDE (UPM1, UPM0): questi due bit vengono regolati in base alla parità di bit che stiamo utilizzando nella comunicazione.
I dati ATMEGA qui sono programmati per inviare dati senza parità, poiché la lunghezza di trasmissione dei dati è piccola, possiamo chiaramente aspettarci nessuna 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): questo bit viene utilizzato per scegliere il numero di bit di stop che stiamo utilizzando durante la comunicazione.
La comunicazione stabilita è di tipo asincrono, quindi per ottenere una trasmissione e ricezione dei dati più accurata, dobbiamo utilizzare due bit di stop, quindi impostiamo USBS su "1" nel lato TRASMETTITORE..
La velocità di trasmissione viene impostata nel controller scegliendo l'UBRRH appropriato:
Il valore UBRRH viene scelto incrociato la velocità di trasmissione e la frequenza di cristallo della CPU:
Quindi, per riferimento incrociato, il valore UBRR viene visto come "6", quindi viene impostata la velocità di trasmissione.
Con questo abbiamo stabilito le impostazioni sul LATO TRASMETTITORE; parleremo ora di RECEIVING SIDE.
L'abilitazione alla comunicazione seriale in UNO può essere effettuata utilizzando un unico comando.
|
La comunicazione che presumevamo di stabilire viene eseguita con una velocità BAUD di 9600 bit al secondo. Quindi, affinché UNO stabilisca tale velocità di trasmissione e per avviare la comunicazione seriale, utilizziamo il comando "Serial.begin (9600);". Qui 9600 è il baud rate ed è modificabile.
Ora tutto a sinistra se per ricevere i dati, uno un dato viene ricevuto dall'ONU, sarà disponibile per la presa. Questi dati vengono acquisiti dal comando "receivedata = Serial.read ();". Con questo comando i dati seriali vengono portati a "ricevuti dati" denominato intero.
Come mostrato nel circuito, un pulsante è collegato sul lato trasmettitore, quando questo pulsante viene premuto, un dato a otto bit viene inviato dal TRASMETTITORE (ATMEGA8) e questo dato viene ricevuto dal RICEVITORE (ARDUINO UNO). Dopo aver ricevuto con successo questi dati, accende e spegne il LED ad esso collegato, per mostrare il trasferimento dei dati riuscito tra due controller.
In questo modo la comunicazione UART tra il controller ATMEGA8 e ARDUINO UNO viene stabilita con successo.