Aici vom stabili o comunicare între un microcontroler ATmega8 și Arduino Uno. Comunicarea stabilită aici este de tip UART (Universal Asynchronous Receiver Transmitter). Este o comunicare în serie. Prin această comunicare în serie, datele pot fi partajate între două controlere, ceea ce este necesar în diferite aplicații de sistem încorporate.
În sistemele încorporate trebuie să avem cunoștințe de bază despre comunicațiile de sistem, așa că pentru acest lucru realizăm acest proiect. În acest proiect vom discuta despre sistemul de comunicare de bază și vom trimite câteva date de la emițător la receptor în serie.
În acest proiect, ATMEGA8 acționează ca TRANSMITĂTOR, iar ARDUINO UNO acționează ca RECEPTOR. În comunicarea în serie vom trimite date BIT BY BIT, până când un BYTE de date este transferat complet. Datele pot avea o dimensiune de 10 biți, dar vom păstra la 8 BITS pentru moment.
Componente necesare
Hardware: ATMEGA8, ARDUINO UNO, sursă de alimentare (5v), PROGRAMATOR AVR-ISP, condensator 100uF (conectat la sursa de alimentare), rezistor 1KΩ (două bucăți), LED, Buton.
Software: Atmel studio 6.1, progisp sau flash magic, ARDUINO NIGHTLY.
Diagrama și explicația circuitului
Înainte de a discuta schema de circuit și programarea pentru emițător și receptor, trebuie să înțelegem despre comunicația serială. ATMEGA trimite aici date UNO în serie, așa cum am discutat mai devreme.
Are alte moduri de comunicare, cum ar fi comunicarea MASTER SLAVE, comunicarea JTAG, dar pentru o comunicare ușoară alegem RS232. Aici vom conecta PIN-ul TXD (transmițător) al ATMEGA8 la PIN-ul RXD (receptor) al ARDUINO UNO
Comunicarea de date stabilită este programată pentru a avea:
- Opt biți de date
- Două biți de oprire
- Niciun bit de verificare a parității
- Rată de transmisie de 9600 BPS (biți pe secundă)
- Comunicare asincronă (fără cota de ceas între ATMEGA8 și UNO (ambele au unități de ceas diferite))
Pentru stabilirea UART între Arduino Uno și ATMEGA8, trebuie să programăm setarea cu precizie. Pentru aceasta trebuie să păstrăm aceiași parametri menționați la ambele capete. În acesta acționează ca TRANSMITOR și alte acțiuni ca RECEPTOR. Mai jos vom discuta despre fiecare setare laterală.
Acum, pentru interfața RS232, următoarele caracteristici trebuie îndeplinite pentru partea TRANSMITTER (ATMEGA8):
1. PIN-ul TXD (caracteristică de primire a datelor) a primului controler trebuie activat pentru TRANSMITER.
2. Întrucât comunicarea este serială, trebuie să știm ori de câte ori sunt primite datele bye, astfel încât să putem opri programul până când este primit octetul complet. Acest lucru se realizează prin activarea unei întreruperi complete a datelor.
3. DATELE sunt transmise și primite controlerului în modul 8 biți. Deci, două caractere vor fi trimise controlerului odată.
4. Nu există biți de paritate, un bit de oprire în datele trimise de modul.
Funcțiile de mai sus sunt setate în registrele controlerului; le vom discuta pe scurt:
DARK GREY (UDRE): Acest bit nu este setat în timpul pornirii, dar este utilizat în timpul lucrului pentru a verifica dacă emițătorul este gata să transmită sau nu. Consultați programul de pe TRASMITTER SIDE pentru mai multe detalii.
VOILET (TXEN): Acest bit este setat pentru activarea pinului emițătorului pe TRASMITTER SIDE.
GALBEN (UCSZ0, UCSZ1 și UCSZ2): acești trei biți sunt utilizați pentru selectarea numărului de biți de date pe care îi primim sau îi trimitem într-o singură trecere.
Comunicarea dintre două SIDES este stabilită ca o comunicare pe opt biți. Prin potrivirea comunicării cu tabelul pe care îl avem, UCSZ0, UCSZ1 la unu și UCSZ2 la zero.
ORANGE (UMSEL): Acest bit este setat pe baza faptului că sistemul comunică asincron (ambele folosesc ceas diferit) sau sincron (ambele utilizează același ceas).
Ambele SISTEME nu partajează niciun ceas. Întrucât amândoi folosesc propriul ceas intern. Deci, trebuie să setăm UMSEL la 0 în ambele controlere.
VERZ (UPM1, UPM0): Acești doi biți sunt reglați pe baza parității de biți pe care o folosim în comunicare.
Datele ATMEGA aici sunt programate pentru a trimite date fără paritate, deoarece lungimea transmisiei de date este mică, ne putem aștepta în mod clar la pierderi sau erori de date. Deci, nu stabilim nicio paritate aici. Deci, setăm ambele UPM1, UPM0 la zero sau sunt lăsate, deoarece toți biții sunt 0 în mod implicit.
ALBASTRU (USBS): Acest bit este utilizat pentru alegerea numărului de biți de oprire pe care îi folosim în timpul comunicării.
Comunicarea stabilită de ea este de tip asincron, deci pentru a obține o transmisie și recepție mai precisă a datelor, trebuie să folosim doi biți de oprire, prin urmare, setăm USBS la „1” în partea TRANSMITERULUI..
Rata de transmisie este setată în controler alegând UBRRH corespunzător:
Valoarea UBRRH este aleasă prin rata de transmisie încrucișată și frecvența cristalului CPU:
Deci, prin referință încrucișată, valoarea UBRR este văzută ca „6”, astfel încât rata baud este setată.
Cu aceasta am stabilit setări pe TRANSMITTER SIDE; vom vorbi despre PRIMUL LATOR acum.
Activarea comunicării seriale în UNO se poate face utilizând o singură comandă.
|
Comunicarea pe care am presupus că o stabilim se face cu o rată BAUD de 9600 biți pe secundă. Deci, pentru ca UNO să stabilească o astfel de viteză de transmisie și să înceapă comunicarea în serie, folosim comanda „Serial.begin (9600);”. Aici 9600 este rata de transmisie și poate fi modificată.
Acum, toate rămân, dacă pentru a primi date, una a datelor este primită de UNO, acestea vor fi disponibile pentru preluare. Aceste date sunt preluate de comanda „jasotdata = Serial.read ();”. Prin această comandă, datele seriale sunt duse la „date recepționate” numite întregi.
Așa cum se arată în circuit, un buton este conectat pe partea transmițătorului, când acest buton este apăsat, date de opt biți sunt trimise de TRANSMITTOR (ATMEGA8) și aceste date sunt primite de RECEIVER (ARDUINO UNO). La primirea cu succes a acestor date, comută LED-ul conectat la acesta pornit și oprit, pentru a afișa transferul de date cu succes între doi controleri.
Prin această comunicare UART între controlerul ATMEGA8 și ARDUINO UNO se stabilește cu succes.