Her skal vi etablere en kommunikation mellem en ATmega8 mikrokontroller og Arduino Uno. Kommunikationen etableret her er af typen UART (Universal Asynchronous Receiver Transmitter). Det er seriel kommunikation. Ved denne serielle kommunikation kan data deles mellem to controllere, hvilket er nødvendigt i forskellige indlejrede systemapplikationer.
I indlejrede systemer skal vi have grundlæggende viden om systemkommunikation, så for dette gør vi dette projekt. I dette projekt vil vi diskutere grundlæggende kommunikationssystem, og vi sender nogle data fra sender til modtager i serie.
I dette projekt fungerer ATMEGA8 som en SENDER, og ARDUINO UNO fungerer som en MODTAGER. I seriel kommunikation sender vi data BIT BY BIT, indtil en BYTE af data overføres fuldstændigt. Dataene kan være af 10 bit størrelse, men vi holder os til 8BITS for nu.
Komponenter, der kræves
Hardware: ATMEGA8, ARDUINO UNO, strømforsyning (5v), AVR-ISP-PROGRAMMER, 100uF kondensator (tilsluttet via strømforsyning), 1KΩ modstand (to stykker), LED, knap.
Software: Atmel studio 6.1, progisp eller flash magi, ARDUINO NATT.
Kredsløbsdiagram og forklaring
Før vi diskuterer kredsløbsdiagrammet og programmeringen af sender og modtager, skal vi forstå den serielle kommunikation. ATMEGA sender her data til UNO i serie som beskrevet tidligere.
Det har andre kommunikationsformer som MASTER SLAVE-kommunikation, JTAG-kommunikation, men for nem kommunikation vælger vi RS232. Her forbinder vi TXD (sender) PIN på ATMEGA8 til RXD (modtager) PIN fra ARDUINO UNO
Den etablerede datakommunikation er programmeret til at have:
- Otte databits
- To stopbit
- Ingen paritetskontrolbit
- Baudrate på 9600 BPS (Bits per sekund)
- Asynkron kommunikation (Ingen urdeling mellem ATMEGA8 og UNO (begge har forskellige klokkenheder))
For at etablere UART mellem Arduino Uno og ATMEGA8 er vi nødt til at programmere indstillingen nøjagtigt. Til dette er vi nødt til at holde de ovennævnte parametre ens i begge ender. I denne fungerer den som SENDER og andre fungerer som MODTAGER. Vi diskuterer hver sideindstilling nedenfor.
Nu til RS232-grænsefladen skal følgende funktioner være opfyldt for TRANSMITTER-siden (ATMEGA8):
1. TXD-pin (data-modtagefunktion) på den første controller skal være aktiveret til TRANSMITTER.
2. Da kommunikationen er seriel, skal vi vide, hvornår data-bye modtages, så vi kan stoppe programmet, indtil komplet 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): 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.
VOILET (TXEN): Denne bit er indstillet til at aktivere senderstift på TRASMITTER SIDE.
GUL (UCSZ0, UCSZ1 og UCSZ2): Disse tre bits bruges til at vælge antallet af databits, vi modtager eller sender på en gang.
Kommunikationen mellem to SIDES etableres som otte bit kommunikation. Ved at matche kommunikationen med tabellen har vi, UCSZ0, UCSZ1 til en og UCSZ2 til nul.
ORANGE (UMSEL): Denne bit indstilles på baggrund af, om systemet kommunikerer asynkront (begge bruger forskellige ur) eller synkront (begge bruger det samme ur).
Begge SYTEMER 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): Disse to bits justeres ud fra den bitparitet, vi bruger i kommunikationen.
Data ATMEGA her 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): Denne bit bruges til at vælge antallet af stopbits, vi bruger under kommunikationen.
Kommunikationen, der blev etableret hende, er af asynkron type, så for at få mere nøjagtig datatransmission og modtagelse er vi nødt til at bruge to stopbits, og derfor sætter vi USBS til '1' i TRANSMITTER-siden..
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 '6', og så indstilles baudhastigheden.
Med dette har vi etableret indstillinger på TRANSMITTER SIDE; vi vil tale om at modtage side nu.
Den serielle kommunikation, der aktiveres i UNO, kan udføres ved hjælp af en enkelt kommando.
|
Den kommunikation, vi formodes at etablere, sker ved hjælp af en BAUD-hastighed på 9600 bit pr. Sekund. Så for UNO at etablere en sådan baudrate og starte seriel kommunikation bruger vi kommandoen ”Serial.begin (9600);”. Her er 9600 baudrate og kan ændres.
Nu er alle tilbage, hvis de skal modtage data, en data modtages af UNO, de vil være tilgængelige for optagelse. Disse data hentes af kommandoen "receiveddata = Serial.read ();". Ved denne kommando føres serielle data til 'modtaget data' med navnet heltal.
Som vist i kredsløbet sendes en knap tilsluttet på sendersiden, når denne knap trykkes ned sendes en otte bit data af TRANSMITTER (ATMEGA8), og disse data modtages af RECEIVER (ARDUINO UNO). Når du modtager disse data med succes, skifter den LED, der er tilsluttet den, TIL og FRA for at vise vellykket dataoverførsel mellem to controller.
Ved denne UART kommunikation mellem ATMEGA8 controller og ARDUINO UNO er vellykket etableret.