Hier gaan we een communicatie tot stand brengen tussen een ATmega8-microcontroller en Arduino Uno. De communicatie die hier tot stand wordt gebracht, is van het UART-type (Universal Asynchronous Receiver Transmitter). Het is seriële communicatie. Door deze seriële communicatie kunnen gegevens worden gedeeld tussen twee controllers, wat vereist is in verschillende embedded systeemtoepassingen.
In embedded systemen moeten we basiskennis hebben over systeemcommunicatie, dus hiervoor doen we dit project. In dit project zullen we het basiscommunicatiesysteem bespreken en zullen we wat gegevens serieel van zender naar ontvanger sturen.
In dit project fungeert ATMEGA8 als een ZENDER en ARDUINO UNO als een ONTVANGER. Bij seriële communicatie sturen we gegevens BIT VOOR BIT, totdat een BYTE aan gegevens volledig is overgedragen. De gegevens kunnen een grootte van 10 bits hebben, maar we houden voorlopig aan 8 bits.
Componenten vereist
Hardware: ATMEGA8, ARDUINO UNO, 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, ARDUINO NIGHTLY.
Schakelschema en uitleg
Voordat we het schakelschema en de programmering voor zender en ontvanger bespreken, moeten we de seriële communicatie begrijpen. De ATMEGA stuurt hier gegevens in serie naar de UNO, zoals eerder besproken.
Het heeft andere communicatiemodi, zoals MASTER SLAVE-communicatie, JTAG-communicatie, maar voor eenvoudige communicatie kiezen we RS232. Hier zullen we de TXD (zender) PIN van ATMEGA8 verbinden met de RXD (ontvanger) PIN van ARDUINO UNO
De tot stand gebrachte datacommunicatie is geprogrammeerd om:
- Acht databits
- Twee stopbits
- Geen pariteitscontrolebit
- Baudrate van 9600 BPS (bits per seconde)
- Asynchrone communicatie (geen klokaandeel tussen ATMEGA8 en UNO (beide hebben verschillende klokeenheden))
Om UART tussen Arduino Uno en ATMEGA8 tot stand te brengen, moeten we de instelling nauwkeurig programmeren. Hiervoor moeten we de bovengenoemde parameters aan beide uiteinden hetzelfde houden. Hierin fungeert de ene als ZENDER en de andere als ONTVANGER. We zullen de instellingen van elke kant hieronder bespreken.
Nu voor de RS232-interface, moet aan de volgende kenmerken worden voldaan voor de ZENDER-zijde (ATMEGA8):
1. De TXD-pin (gegevensontvangstfunctie) van de eerste controller moet zijn ingeschakeld voor ZENDER.
2. Aangezien de communicatie serieel is, moeten we weten wanneer de data bye is 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): 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.
VOILET (TXEN): Deze bit is ingesteld om de zenderpin op TRASMITTER SIDE in te schakelen.
GEEL (UCSZ0, UCSZ1 en UCSZ2): deze drie bits worden gebruikt voor het selecteren van het aantal databits dat we in één keer ontvangen of verzenden.
De communicatie tussen twee SIDES wordt tot stand gebracht als 8 bit communicatie. Door de communicatie te matchen met de tabel die we hebben, UCSZ0, UCSZ1 op één en UCSZ2 op nul.
ORANJE (UMSEL): Deze bit wordt ingesteld op basis van of het systeem asynchroon communiceert (beide gebruiken een andere klok) of synchroon (beide gebruiken dezelfde klok).
Beide SYTEMEN delen geen klok. Omdat ze allebei hun eigen interne klok gebruiken. We moeten UMSEL dus in beide controllers op 0 zetten.
GROEN (UPM1, UPM0): deze twee bits worden aangepast op basis van bitpariteit die we in communicatie gebruiken.
De gegevens ATMEGA hier is geprogrammeerd om gegevens zonder pariteit te verzenden, aangezien de gegevensoverdrachtlengte 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): Deze bit wordt gebruikt om het aantal stopbits te kiezen dat we gebruiken tijdens communicatie.
De communicatie die haar tot stand heeft gebracht, is van het asynchrone type, dus om een nauwkeurigere gegevensoverdracht en -ontvangst te krijgen, hebben we twee stopbits nodig, daarom stellen we USBS in op '1' in ZENDER-zijde.
De baudrate wordt ingesteld in de controller 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 '6', en dus wordt de baudrate ingesteld.
Hiermee hebben we instellingen gemaakt op ZENDERZIJDE; we zullen het nu hebben over ONTVANGENDE KANT.
Het inschakelen van seriële communicatie in UNO kan worden gedaan met behulp van een enkele opdracht.
|
De communicatie die we veronderstelden tot stand te brengen, wordt gedaan met een BAUD-snelheid van 9600 bits per seconde. Dus voor UNO om een dergelijke baudrate vast te stellen en om seriële communicatie te starten, gebruiken we het commando "Serial.begin (9600);". Hier is 9600 baudrate en kan deze worden gewijzigd.
Nu alles over, als u gegevens wilt ontvangen, een gegevens die wordt ontvangen door de UNO, zal deze beschikbaar zijn voor opname. Deze gegevens worden opgehaald door het commando "ontvangendata = Serial.read ();". Door deze opdracht worden seriële gegevens naar 'ontvangen gegevens' met de naam integer gestuurd.
Zoals te zien is in het circuit, is een knop aangesloten aan de zenderzijde, wanneer deze knop wordt ingedrukt, wordt een acht bit-data verzonden door ZENDER (ATMEGA8) en deze gegevens worden ontvangen door ONTVANGER (ARDUINO UNO). Bij het succesvol ontvangen van deze gegevens, schakelt het de LED die erop is aangesloten AAN en UIT, om een succesvolle gegevensoverdracht tussen twee controllers te tonen.
Door deze UART-communicatie tussen ATMEGA8-controller en ARDUINO UNO wordt met succes tot stand gebracht.