Här ska vi skapa en kommunikation mellan en ATmega8-mikrokontroller och Arduino Uno. Den här kommunikationen är av UART- typ (Universal Asynchronous Receiver Transmitter). Det är seriekommunikation. Genom denna seriekommunikation kan data delas mellan två styrenheter, vilket krävs i olika inbäddade systemapplikationer.
I inbäddade system måste vi ha grundläggande kunskaper om systemkommunikation, så för detta gör vi det här projektet. I detta projekt kommer vi att diskutera grundläggande kommunikationssystem och vi kommer att skicka data från sändare till mottagare i serie.
I detta projekt fungerar ATMEGA8 som SÄNDARE och ARDUINO UNO fungerar som MOTTAGARE. I seriekommunikation skickar vi data BIT BY BIT tills en BYTE av data överförs helt. Uppgifterna kan vara av 10 bitars storlek men vi kommer att hålla oss till 8BITS för tillfället.
Komponenter krävs
Hårdvara: ATMEGA8, ARDUINO UNO, strömförsörjning (5v), AVR-ISP-PROGRAMMER, 100uF kondensator (ansluten över strömförsörjningen), 1KΩ motstånd (två delar), LED, knapp.
Programvara: Atmel studio 6.1, progisp eller flash magi, ARDUINO NIGHTLY.
Kretsschema och förklaring
Innan vi diskuterar kretsschemat och programmering för sändare och mottagare måste vi förstå om seriekommunikationen. ATMEGA skickar här data till UNO i serie som diskuterats tidigare.
Den har andra kommunikationssätt som MASTER SLAVE-kommunikation, JTAG-kommunikation men för enkel kommunikation väljer vi RS232. Här ansluter vi TXD (sändar) PIN för ATMEGA8 till RXD (mottagare) PIN för ARDUINO UNO
Den etablerade datakommunikationen är programmerad att ha:
- Åtta databitar
- Två stoppbitar
- Ingen paritetskontrollbit
- Baudhastighet på 9600 BPS (bitar per sekund)
- Asynkron kommunikation (Ingen klockdelning mellan ATMEGA8 och UNO (båda har olika klockenheter))
För att skapa UART mellan Arduino Uno och ATMEGA8 måste vi programmera inställningen exakt. För detta måste vi hålla ovanstående parametrar desamma i båda ändar. I den här fungerar som SÄNDARE och andra fungerar som MOTTAGARE. Vi kommer att diskutera varje sida inställningar nedan.
För RS232-gränssnittet måste följande funktioner vara uppfyllda för TRANSMITTER-sidan (ATMEGA8):
1. TXD-stift (datamottagningsfunktion) på den första styrenheten måste vara aktiverad för SÄNDARE.
2. Eftersom kommunikationen är seriell måste vi veta när data bye tas emot, så att vi kan stoppa programmet tills fullständig byte tas emot. Detta görs genom att möjliggöra en fullständig avbrott för datamottagning.
3. DATA överförs och tas emot till styrenheten i 8bit-läge. Så två tecken kommer att skickas till styrenheten åt gången.
4. Det finns inga paritetsbitar, en stoppbit i data som skickas av modulen.
Ovanstående funktioner ställs in i registerregistret; vi ska diskutera dem kort:
MÖRK GRÅ (UDRE): Denna bit är inte inställd vid start men används under arbetet för att kontrollera om sändaren är redo att sändas eller inte. Se programmet på TRASMITTER SIDE för mer information.
VOILET (TXEN): Denna bit är inställd för att aktivera sändarstift på TRASMITTER SIDE.
GUL (UCSZ0, UCSZ1 och UCSZ2): Dessa tre bitar används för att välja antalet databitar som vi tar emot eller skickar på en gång.
Kommunikationen mellan två SIDES etableras som åtta bitars kommunikation. Genom att matcha kommunikationen med tabellen har vi, UCSZ0, UCSZ1 till en och UCSZ2 till noll.
ORANGE (UMSEL): Denna bit ställs in baserat på om systemet kommunicerar asynkront (båda använder olika klockor) eller synkront (båda använder samma klocka).
Båda SYTEMSEN delar inte någon klocka. Eftersom båda använder sin egen interna klocka. Så vi måste ställa UMSEL till 0 i båda styrenheterna.
GRÖN (UPM1, UPM0): Dessa två bitar justeras baserat på bitparitet som vi använder i kommunikationen.
Data ATMEGA här är programmerad att skicka data utan paritet, eftersom dataöverföringslängden är liten kan vi tydligt förvänta oss ingen dataförlust eller fel. Så vi sätter ingen paritet här. Så vi sätter både UPM1, UPM0 till noll eller så är de kvar eftersom alla bitar är 0 som standard.
BLÅ (USBS): Denna bit används för att välja antalet stoppbitar vi använder under kommunikationen.
Kommunikationen som skapats av henne är av asynkron typ, så för att få mer exakt dataöverföring och mottagning måste vi använda två stoppbitar, därför sätter vi USBS till '1' på SÄNDARE-sidan..
Överföringshastigheten ställs in i styrenheten genom att välja lämplig UBRRH:
UBRRH-värdet väljs genom korshänvisande baudhastighet och CPU-kristallfrekvens:
Så genom korsreferens ses UBRR-värdet som '6', och så ställs baudhastigheten in.
Med detta har vi fastställt inställningar på TRANSMITTER SIDE; vi kommer att prata om att ta emot sidan nu.
Seriekommunikationen som möjliggör i UNO kan göras med ett enda kommando.
|
Kommunikationen vi antagit upprätta sker med en BAUD-hastighet på 9600 bitar per sekund. Så för UNO att upprätta en sådan överföringshastighet och starta seriell kommunikation använder vi kommandot ”Serial.begin (9600);”. Här är 9600 överföringshastighet och kan ändras.
Nu är alla kvar för att ta emot data, en en data tas emot av UNO, den kommer att vara tillgänglig för att ta. Dessa data plockas upp med kommandot "mottagna data = Serial.read ();". Med detta kommando tas seriedata till 'mottagna data' med namnet heltal.
Som visas i kretsen en knapp som är ansluten på sändarsidan, när denna knapp trycks in sänds en åtta bitars data av TRANSMITTER (ATMEGA8) och dessa data tas emot av MOTTAGARE (ARDUINO UNO). Vid framgång med att ta emot dessa data växlar lysdioden som är ansluten till den PÅ och AV för att visa framgångsrik dataöverföring mellan två styrenheter.
Genom denna UART-kommunikation mellan ATMEGA8-styrenhet och ARDUINO UNO upprättas framgångsrikt.