In deze tutorial gaan we een seriële communicatie tot stand brengen tussen twee ATMEGA8-microcontrollers. De communicatie die hier tot stand wordt gebracht, is van het UART-type (Universal Asynchronous Receiver Transmitter). Door deze seriële communicatie kunnen gegevens worden gedeeld tussen twee microcontrollers, wat nodig is in verschillende embedded systemen.
Componenten vereist
Hardware: ATMEGA8 (2 stuks), voeding (5v), AVR-ISP PROGRAMMER, 100uF condensator (aangesloten over voeding), 1KΩ weerstand (twee stuks), LED, knop.
Software: Atmel studio 6.1, progisp of flash magie.
Schakelschema en uitleg
Laten we de seriële communicatie in AVR-microcontrollers begrijpen. Hier verzendt ATMEGA gegevens in serie naar de andere ATMEGA. Het heeft een andere communicatiemodus, maar voor gemakkelijke communicatie kiezen we RS232. De RS232-pin van de eerste ATMEGA8 is verbonden met de RXD-pin van de tweede ATMEGA8.
De tot stand gebrachte datacommunicatie is geprogrammeerd om:
- Acht databits
- Twee stopbits
- Geen pariteitscontrolebit
- Baudrate van 2400 BPS (bits per seconde)
- Asynchrone communicatie (geen klokaandeel tussen twee ATMEGA8)
We hebben dus twee ingestelde registers voor twee ATMEGA8 anders, waarbij de ene fungeert als ZENDER en de andere als ONTVANGER.
Voor de RS232-interface tussen twee ATmega-microcontrollers moet nu worden voldaan aan de volgende functies voor de ZENDER en ONTVANGER:
1. De TXD-pin (gegevensontvangstfunctie) van de eerste controller moet ingeschakeld zijn voor ZENDER en de RXD-pin van de tweede controller moet ingeschakeld zijn voor ONTVANGER.
2. Aangezien de communicatie serieel is, moeten we weten wanneer de databyte wordt ontvangen, zodat we het programma kunnen stoppen totdat de volledige byte is ontvangen. Dit wordt gedaan door een volledige onderbreking van de gegevensontvangst mogelijk te maken.
3. GEGEVENS worden verzonden en ontvangen naar de controller in 8bit-modus. Er worden dus twee karakters tegelijk naar de controller gestuurd.
4. Er zijn geen pariteitsbits, één stopbit in de gegevens die door de module worden verzonden.
De bovenstaande functies zijn ingesteld in de registers van de controller; we gaan ze kort bespreken,
DONKERGRIJS (UDRE): (TRASMITTERZIJDE) Deze bit is niet ingesteld tijdens het opstarten, maar wordt tijdens het werk gebruikt om te controleren of de zender klaar is om te zenden of niet. Zie het programma op TRASMITTER SIDE voor meer details.
LICHTGRIJS (RXC): (ONTVANGENDE KANT) Deze bit is niet ingesteld tijdens het opstarten, maar wordt tijdens het werk gebruikt om te controleren of de ontvanger gereed is om gegevens te ontvangen of niet. Zie het programma op ONTVANGENDE KANT voor meer details.
VOILET (TXEN): (TRASMITTER SIDE) Dit bit is ingesteld om de zenderpin op TRASMITTER SIDE in te schakelen.
ROOD (RXEN): (ONTVANGENDE KANT) Deze bit vertegenwoordigt de ontvangstgegevensfunctie, deze bit moet worden ingesteld om de gegevens van de module door de controller te ontvangen, het maakt ook de RXD-pin van de controller mogelijk.
BRUIN (RXCIE): Deze bit moet worden ingesteld om een interrupt te krijgen na succesvolle gegevensontvangst. Door dit bit in te schakelen, leren we het kennen, direct nadat 8 bit data is ontvangen. We gaan dit bit hier niet gebruiken, dus het wordt met rust gelaten.
PINK (URSEL): Deze bit moet worden ingesteld voordat andere bits in UCSRC worden ingeschakeld, na het instellen van andere benodigde bits in UCSRC; URSEL moet worden uitgeschakeld of op nul worden gezet. We gaan dit bit hier niet gebruiken, dus het wordt met rust gelaten.
GEEL (UCSZ0, UCSZ1, UCSZ2): (ONTVANGENDE KANT & TRASMITTERKANT) Deze drie bits worden gebruikt voor het selecteren van het aantal databits dat we in één keer ontvangen of verzenden.
De communicatie tussen twee ATMEGA's wordt tot stand gebracht als 8-bits communicatie. Door de communicatie te matchen met de tabel die we hebben, UCSZ0, UCSZ1 op één en UCSZ2 op nul.
We moeten deze zowel aan de ontvangende als aan de zendende kant instellen.
ORANJE (UMSEL): (ONTVANGENDE KANT & TRASMITTERZIJDE) Deze bit wordt ingesteld op basis van of het systeem asynchroon communiceert (beide gebruiken een andere klok) of synchroon (beide gebruiken dezelfde klok).
Beide controllers delen geen klok. Omdat ze allebei hun eigen interne klok gebruiken. We moeten UMSEL dus in beide controllers op 0 zetten.
GROEN (UPM1, UPM0): (ONTVANGENDE KANT & TRASMITTERZIJDE) Deze twee bits worden aangepast op basis van bitpariteit die we gebruiken in communicatie.
De ATMEGA is geprogrammeerd om gegevens zonder pariteit te verzenden, aangezien de datatransmissielengte klein is, kunnen we duidelijk geen gegevensverlies of fouten verwachten. We stellen hier dus geen pariteit in. Dus stellen we zowel UPM1 als UPM0 in op nul of ze blijven staan, omdat alle bits standaard 0 zijn.
BLAUW (USBS): (ONTVANGENDE KANT & TRASMITTERKANT) Deze bit wordt gebruikt om het aantal stopbits te kiezen dat we gebruiken tijdens communicatie.
De communicatie die hier tot stand wordt gebracht is van het asynchrone type, dus voor een nauwkeurigere gegevensoverdracht en -ontvangst hebben we twee stopbits nodig. Daarom stellen we USBS in op '1' in beide controllers.
De baudrate wordt in de controller ingesteld door de juiste UBRRH te kiezen.
De UBRRH-waarde wordt gekozen door de baudrate en de CPU-kristalfrequentie te wijzigen.
Dus door middel van kruisverwijzing wordt de UBRR-waarde gezien als '25', en dus wordt de baudrate ingesteld.
Zoals te zien is in het circuit, is er een knop aan de zenderzijde aangesloten. Wanneer deze knop wordt ingedrukt, wordt een 8-bit data verzonden door TRANSMITTER en deze data wordt ontvangen door RECEIVER. Bij het succesvol ontvangen van deze gegevens, schakelt het de LED die erop is aangesloten AAN en UIT, wat een succesvolle gegevensoverdracht tussen twee controllers aangeeft.