Her skal vi etablere en kommunikasjon mellom en ATmega8 mikrokontroller og Arduino Uno. Kommunikasjonen som er etablert her, er av typen UART (Universal Asynchronous Receiver Transmitter). Det er seriekommunikasjon. Ved denne serielle kommunikasjonen kan data deles mellom to kontrollere, noe som kreves i forskjellige innebygde systemapplikasjoner.
I innebygde systemer må vi ha grunnleggende kunnskap om systemkommunikasjon, så for dette gjør vi dette prosjektet. I dette prosjektet vil vi diskutere grunnleggende kommunikasjonssystem, og vi vil sende noen data fra sender til mottaker i serie.
I dette prosjektet fungerer ATMEGA8 som en SENDER og ARDUINO UNO fungerer som en MOTTAKER. I seriell kommunikasjon vil vi sende data BIT BY BIT, til en BYTE av data overføres fullstendig. Dataene kan være på 10bit størrelse, men vi vil holde oss på 8BITS for nå.
Komponenter kreves
Maskinvare: ATMEGA8, ARDUINO UNO, strømforsyning (5v), AVR-ISP-PROGRAMMER, 100uF kondensator (koblet over strømforsyning), 1KΩ motstand (to deler), LED, knapp.
Programvare: Atmel studio 6.1, progisp eller flash magi, ARDUINO NIGHTLY.
Kretsdiagram og forklaring
Før vi diskuterer kretsskjemaet og programmeringen for sender og mottaker, må vi forstå om seriekommunikasjonen. ATMEGA sender her data til UNO i serie som diskutert tidligere.
Den har andre kommunikasjonsmåter som MASTER SLAVE-kommunikasjon, JTAG-kommunikasjon, men for enkel kommunikasjon velger vi RS232. Her vil vi koble TXD (sender) PIN på ATMEGA8 til RXD (mottaker) PIN på ARDUINO UNO
Den etablerte datakommunikasjonen er programmert til å ha:
- Åtte databiter
- To stoppbiter
- Ingen paritetskontrollbit
- Baudrate på 9600 BPS (Bits per sekund)
- Asynkron kommunikasjon (Ingen klokkeandel mellom ATMEGA8 og UNO (begge har forskjellige klokkenheter))
For å etablere UART mellom Arduino Uno og ATMEGA8, må vi programmere innstillingen nøyaktig. For dette må vi holde de ovennevnte parametrene like i begge ender. I denne fungerer som SENDER og andre fungerer som MOTTAKER. Vi vil diskutere hver sideinnstilling nedenfor.
Nå for RS232-grensesnittet, må følgende funksjoner være oppfylt for TRANSMITTER-siden (ATMEGA8):
1. TXD-pinnen (datamottaksfunksjonen) til den første kontrolleren må være aktivert for TRANSMITTER.
2. Siden kommunikasjonen er seriell, må vi vite når data-bye mottas, slik at vi kan stoppe programmet til fullstendig byte er mottatt. Dette gjøres ved å aktivere datamottak fullstendig avbrudd.
3. DATA overføres og mottas til kontrolleren i 8bit-modus. Så to tegn vil bli sendt til kontrolleren om gangen.
4. Det er ingen paritetsbiter, en stoppbit i dataene som sendes av modulen.
Ovennevnte funksjoner er angitt i kontrollerregistrene; vi skal diskutere dem kort:
DARK GRAY (UDRE): Denne biten er ikke innstilt under oppstart, men den brukes under arbeid for å sjekke om senderen er klar til å sende eller ikke. Se programmet på TRASMITTER SIDE for mer informasjon.
VOILET (TXEN): Denne biten er innstilt for å aktivere senderpinnen på TRASMITTER SIDE.
GUL (UCSZ0, UCSZ1 og UCSZ2): Disse tre bitene brukes til å velge antall databiter vi mottar eller sender på en gang.
Kommunikasjonen mellom to SIDER er etablert som åtte-biters kommunikasjon. Ved å matche kommunikasjonen med tabellen har vi, UCSZ0, UCSZ1 til en og UCSZ2 til null.
ORANGE (UMSEL): Denne biten settes ut fra om systemet kommuniserer asynkront (begge bruker annen klokke) eller synkront (begge bruker samme klokke).
Begge SYTEMENE deler ikke noen klokke. Siden begge bruker egen klokke. Så vi må sette UMSEL til 0 i begge kontrollerne.
GRØNN (UPM1, UPM0): Disse to bitene justeres basert på bitparitet vi bruker i kommunikasjon.
Dataene ATMEGA her er programmert til å sende data uten paritet, ettersom dataoverføringslengden er liten, kan vi tydeligvis ikke forvente tap av data eller feil. Så vi setter ikke noen paritet her. Så vi setter både UPM1, UPM0 til null, eller de er igjen, fordi alle biter er 0 som standard.
BLÅ (USBS): Denne biten brukes til å velge antall stoppbiter vi bruker under kommunikasjonen.
Kommunikasjonen som ble etablert av henne, er av asynkron type, så for å få mer nøyaktig dataoverføring og mottak, må vi bruke to stoppbiter, og derfor setter vi USBS til '1' på SENDERSIDEN..
Baudhastigheten stilles inn i kontrolleren ved å velge riktig UBRRH:
UBRRH-verdien velges ved krysshenvisende baudrate og CPU-krystallfrekvens:
Så ved kryssreferanse blir UBRR-verdi sett på som '6', og så blir overføringshastigheten satt.
Med dette har vi etablert innstillinger på TRANSMITTER SIDE; vi vil snakke om MOTTAK SIDE nå.
Seriekommunikasjonen som aktiveres i UNO kan gjøres ved å bruke en enkelt kommando.
|
Kommunikasjonen vi antok å etablere gjøres med en BAUD-hastighet på 9600 bits per sekund. Så for at UNO skal etablere en slik overføringshastighet og starte seriell kommunikasjon, bruker vi kommandoen "Serial.begin (9600);". Her er 9600 baudrate og kan endres.
Nå alle igjen hvis de vil motta data, en data mottas av UNO, vil de være tilgjengelige for å ta. Disse dataene blir plukket opp med kommandoen "mottatt data = Serial.read ();". Ved denne kommandoen blir seriedata ført til 'mottatt data' med navnet heltall.
Som vist i kretsen, blir en knapp koblet på sendersiden, når denne knappen trykkes inn, sendes en åtte-biters data av TRANSMITTER (ATMEGA8) og disse dataene mottas av MOTTAKER (ARDUINO UNO). Når du mottar disse dataene, slår den lysdioden som er koblet til den PÅ og AV, for å vise vellykket dataoverføring mellom to kontrollere.
Med denne UART-kommunikasjonen mellom ATMEGA8-kontrolleren og ARDUINO UNO er vellykket etablert.