În acest tutorial vom stabili o comunicație serială între două microcontrolere ATMEGA8. Comunicarea stabilită aici este de tip UART (Universal Asynchronous Receiver Transmitter). Prin această comunicare în serie, datele pot fi partajate între două microcontrolere, care sunt necesare în diferite sisteme încorporate.
Componente necesare
Hardware: ATMEGA8 (2 bucăți), 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.
Diagrama și explicația circuitului
Să înțelegem comunicarea serială în microcontrolerele AVR. Aici ATMEGA trimite date către celălalt ATMEGA în serie. Are un alt mod de comunicare, dar pentru o comunicare ușoară alegem RS232. Pinul RS232 al primului ATMEGA8 este conectat la pinul RXD al celui de-al doilea ATMEGA8.
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 2400 BPS (biți pe secundă)
- Comunicare asincronă (fără cota de ceas între două ATMEGA8)
Deci, avem două registre setate pentru două ATMEGA8 diferit, în care unul acționează ca TRANSMITTOR și altul acționează ca RECEPTOR.
Acum, pentru interfața RS232 între două microcontrolere ATmega, următoarele caracteristici trebuie îndeplinite pentru TRANSMITER și RECEPTOR:
1. Pinul TXD (caracteristica de primire a datelor) a primului controler trebuie activat pentru TRANSMITER și pinul RXD al celui de-al doilea controlor trebuie activat pentru RECEIVER.
2. Deoarece comunicarea este serială, trebuie să știm ori de câte ori este primit octetul de date, 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): (TRASMITTER SIDE) 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.
GREY LIGHT (RXC): (LATEA DE RECEPȚIE) Acest bit nu este setat în timpul pornirii, dar este utilizat în timpul lucrului pentru a verifica dacă receptorul este gata să primească date sau nu. Pentru mai multe detalii, consultați programul de pe partea de recepție.
VOILET (TXEN): (TRASMITTER SIDE) Acest bit este setat pentru activarea pinului emițătorului pe TRASMITTER SIDE.
ROȘU (RXEN): (LATEA DE RECEPȚIE) Acest bit reprezintă caracteristica de primire a datelor, acest bit trebuie setat pentru ca datele din modul să fie primite de către controler, de asemenea, activează pinul RXD al controlerului.
MARO (RXCIE): Acest bit trebuie setat pentru a obține o întrerupere după recepționarea cu succes a datelor. Activând acest bit, vom afla, imediat după primirea datelor pe 8 biți. Nu vom folosi acest bit aici, așa că este lăsat singur.
PINK (URSEL): Acest bit trebuie setat înainte de activarea altor biți în UCSRC, după setarea altor biți necesari în UCSRC; URSEL trebuie dezactivat sau pus la zero. Nu vom folosi acest bit aici, așa că este lăsat singur.
GALBEN (UCSZ0, UCSZ1, UCSZ2): (LATEA DE RECEPȚIE ȘI LATUL TRASMITTORULUI) 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ă ATMEGA 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.
Trebuie să le setăm atât pe partea de recepție, cât și pe cea de transmisie.
ORANGE (UMSEL): (LATEA DE RECEPȚIE ȘI LATUL TRASMITTORULUI) Acest bit este setat pe baza faptului că sistemul comunică asincron (ambele folosesc ceas diferit) sau sincron (ambele folosesc același ceas).
Ambele controlere 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): (LATEA DE RECEPȚIE ȘI LATUL TRASMITTORULUI) Acești doi biți sunt reglați pe baza parității de biți pe care o folosim în comunicare.
ATMEGA este programat să trimită 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): (LATEA DE RECEPȚIE ȘI LATUL TRASMITTORULUI) Acest bit este utilizat pentru alegerea numărului de biți de oprire pe care îi folosim în timpul comunicării.
Comunicarea stabilită aici 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 ambele controlere.
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 „25”, deci rata baud este setată.
După cum se arată în circuit, un buton este conectat pe partea transmițătorului. Când acest buton este apăsat, datele de opt biți sunt trimise de TRANSMITER și aceste date sunt primite de RECEIVER. La primirea cu succes a acestor date, comută LED-ul conectat la acesta pornit și oprit, ceea ce arată transferul de date reușit între doi controlori.