I denne vejledning skal vi etablere en seriel kommunikation mellem to ATMEGA8 mikrokontrollere. Kommunikationen etableret her er af typen UART (Universal Asynchronous Receiver Transmitter). Ved denne serielle kommunikation kan data deles mellem to mikrocontrollere, hvilket kræves i forskellige indlejrede systemer.
Komponenter, der kræves
Hardware: ATMEGA8 (2 stk.), Strømforsyning (5v), AVR-ISP-PROGRAMMER, 100uF kondensator (forbundet via strømforsyning), 1KΩ modstand (to stykker), LED, knap.
Software: Atmel studio 6.1, progisp eller flash-magi.
Kredsløbsdiagram og forklaring
Lad os forstå den serielle kommunikation i AVR-mikrocontrollere. Her sender ATMEGA data til den anden ATMEGA i serie. Det har en anden kommunikationsform, men for nem kommunikation vælger vi RS232. RS232-stiften på den første ATMEGA8 er forbundet til RXD-stiften på den anden ATMEGA8.
Den etablerede datakommunikation er programmeret til at have:
- Otte databits
- To stopbit
- Ingen paritetskontrolbit
- Baudrate på 2400 BPS (Bits per sekund)
- Asynkron kommunikation (Ingen ur-deling mellem to ATMEGA8)
Så vi har to sæt registre for to ATMEGA8 forskelligt, hvor den ene fungerer som TRANSMITTER og den anden fungerer som MODTAGER.
Nu for RS232-grænsefladen mellem to ATmega-mikrocontrollere skal følgende funktioner være opfyldt for TRANSMITTER og MODTAGER:
1. TXD-stiften (data-modtagefunktion) på den første controller skal være aktiveret for TRANSMITTER, og RXD-stiften på den anden controller skal være aktiveret til RECEIVER.
2. Da kommunikationen er seriel, er vi nødt til at vide, hvornår databyte modtages, så vi kan stoppe programmet, indtil fuldstændig byte er modtaget. Dette gøres ved at aktivere en fuldstændig afbrydelse af datamodtagelse.
3. DATA transmitteres og modtages til controlleren i 8bit-tilstand. Så to tegn sendes til controlleren ad gangen.
4. Der er ingen paritetsbits, en stopbit i de data, der sendes af modulet.
Ovenstående funktioner er indstillet i controllerregistrene; vi vil diskutere dem kort,
DARK GRAY (UDRE): (TRASMITTER SIDE) Denne bit er ikke indstillet under opstart, men den bruges under arbejdet til at kontrollere, om senderen er klar til at sende eller ej. Se programmet på TRASMITTER SIDE for flere detaljer.
LIGHT GREY (RXC): (RECEIVING SIDE) Denne bit er ikke indstillet under opstart, men den bruges under arbejdet til at kontrollere, om modtageren er klar til at modtage data eller ej. Se programmet på MODTAGENDE SIDE for flere detaljer.
VOILET (TXEN): (TRASMITTER SIDE) Denne bit er indstillet til at aktivere senderstift på TRASMITTER SIDE.
RØD (RXEN): (MODTAGENDE SIDE) Denne bit repræsenterer modtagedata-funktion, denne bit skal indstilles for at dataene fra modulet skal modtages af controlleren, det muliggør også RXD-pin af controller.
BRUN (RXCIE): Denne bit skal indstilles for at få en afbrydelse efter vellykket datamodtagelse. Ved at aktivere denne bit lærer vi at vide, lige efter 8 bit data modtagelse. Vi vil ikke bruge denne bit her, så den er alene.
PINK (URSEL): Denne bit skal indstilles, før andre bits aktiveres i UCSRC, efter at andre nødvendige bits er sat i UCSRC; URSEL skal deaktiveres eller sættes til nul. Vi vil ikke bruge denne bit her, så den er alene.
GUL (UCSZ0, UCSZ1, UCSZ2): (MODTAGELSE AF SIDE & TRASMITTER SIDE) Disse tre bits bruges til at vælge det antal databits, vi modtager eller sender på en gang.
Kommunikationen mellem to ATMEGA er etableret som otte bit kommunikation. Ved at matche kommunikationen med tabellen har vi, UCSZ0, UCSZ1 til en og UCSZ2 til nul.
Vi er nødt til at indstille disse på både modtagende og transmitterende side.
ORANGE (UMSEL): (MODTAGELSE AF SIDE & TRASMITTER SIDE) Denne bit indstilles på baggrund af, om systemet kommunikerer asynkront (begge bruger andet ur) eller synkront (begge bruger det samme ur).
Begge controllere deler ikke noget ur. Da begge bruger deres eget interne ur. Så vi er nødt til at indstille UMSEL til 0 i begge controllere.
GRØN (UPM1, UPM0): (MODTAGELSE AF SIDE & TRASMITTER SIDE) Disse to bits justeres ud fra den bitparitet, vi bruger i kommunikationen.
ATMEGA er programmeret til at sende data uden paritet, da datatransmissionslængden er lille, kan vi klart ikke forvente noget datatab eller fejl. Så vi sætter ikke nogen paritet her. Så vi sætter både UPM1, UPM0 til nul, eller de er tilbage, fordi alle bits er 0 som standard..
BLÅ (USBS): (MODTAGELSE AF SIDE & TRASMITTER SIDE) Denne bit bruges til at vælge det antal stopbits, vi bruger under kommunikationen.
Kommunikationen, der er etableret her, er af asynkron type, så for at få mere nøjagtig datatransmission og modtagelse er vi nødt til at bruge to stopbits, derfor sætter vi USBS til '1' i begge controllere.
Baudhastigheden indstilles i controlleren ved at vælge den passende UBRRH.
UBRRH-værdien vælges ved krydsrefererende baudrate og CPU-krystalfrekvens.
Så ved krydshenvisning ses UBRR-værdi som '25', og så indstilles baudhastigheden.
Som vist i kredsløbet er der tilsluttet en knap på sendersiden. Når der trykkes på denne knap, sendes der otte bit data af TRANSMITTER, og disse data modtages af RECEIVER. Ved modtagelse af disse data skifter LED'en tilsluttet den TIL og FRA, hvilket viser vellykket dataoverførsel mellem to controller.