Az Atmel AVR8-as mikrovezérlőjét, az ATmega8-as mikrokontrollert alkalmazzuk az aszinkron kommunikáció megvalósítása során. Az UART alkalmazása azért fontos, mert ennek segítségvel tudunk AT parancsokat kiküldeni akár a Quectel M66-os moduljára. A PD.0 és a PD.1 portbitek használhatók fel az adatok küldésére és fogadására (1. ábra).

1. ábra A felhasznált ATmega8 lábkiosztása
A BaudRate beállításához szügségünk van az UBRRH és az UBRRL regiszterekre, ahol ez az érték tárolható (2. ábra).

2. ábra UBRRL és az UBRRH regiszterek
Az UDR regiszterben kerül eltárolásra a soros porton érkező 8 bites adat, illetve ide töltjük azt a 8 bites értéket is, amelyet szeretnénk kiküldeni a mikrokontrollerből.

3. ábra UDR regiszter
Az UCSRC regiszterben tudjuk beállítani az adatbitek számát (UCSZ0, UCSZ1, UCSZ2), illetve paritásmódot (UPM0, UPM1) is (4. ábra).

4. ábra UCSRC regiszter felépítése
A programunk elején feltételes fordítást alkalmazunk, beállítjuk a kontroller működési frekvenciáját 12 MHz-re. Ezután a definiáljuk a "BAUD" "változót" 9600-as értékkel, majd meghatározzuk a Baud Rate értékét.
Az uartInit() függvénnyel inicializáljuk az ATmega8 mikrovezérlőben található UART modult, beállítjuk azt, hogy nem használunk interruptot, stb.
Az UCSRC regiszterben található UCSZ0 és az UCSZ1 bitek logikai 1-be kerülnek az uartInit() függvényben, ezért a kommunikáció 8 bites lesz (5. ábra)

5. ábra Adatbitek számának beállítása
Az UPM0 és az UPM1 bitek logikai 1-be történő állítása nem történik meg, ezért default értékben maradnak (logikai 0), tehát a paritás tiltott.
Az uartTransmit() és az uartReceive() függvényekkel kényelmesebbé tesszük az UART kommunikációt.
#include <avr/io.h>
#include <util/delay.h>#ifndef F_CPU
#define F_CPU 12000000UL
#endif#define BAUD 9600
#define BAUDRATE ((F_CPU)/(BAUD*16UL)-1)void uartInit()
{
UBRRH = (BAUDRATE>>8);
UBRRL = BAUDRATE;
UCSRB |= (1 << TXEN) | (1 << RXEN);
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
}void uartTransmit (unsigned char data)
{
while (!( UCSRA & (1 << UDRE)));
UDR = data;
}unsigned char uartReceive (void)
{
while(!(UCSRA) & (1 << RXC));
return UDR;
}int main(void)
{
unsigned char a;
DDRD = 0B11111110;
DDRC = 0xFF;
uartInit();
while(1)
{
a = uartReceive();
PORTC = a;
}
}
A main() függvényben először beállítjuk a "D" port 0. bitjét bemenetre, a többi kimenet lesz. A "C" port minden bitje kimenet lesz (DDRC = 0xFF).
A portok beállítása után inicializáljuk az UART modult (meghívjuk az uartInit() függvényt), majd a while(1) végtelen ciklusban állandóan figyeljuk az UART-on érkező adatokat, amelyeket megjelenítünk a "C" porton.
Természetesen a byte típusú "a" változó elhagyható, és a PORTC = uartReceive(); értékadás is alkalmazható.
Október közepén elindítjuk az Atmel 8 bites mikrovezérlőkről szóló sorozatunkat. Ehhez használnunk kell természetesen egy fejlesztőkörnyezetet is. Több ilyen is létezik, például a WinAVR, vagy az Atmel Studio. Mi az Atmel Studio-t fogjuk használni, e. . . .
A PIC18F mikrovezérlők ma is népszerű a fejlesztők körében. Noha 8 bites architektúráról beszélünk, számos érdekes és hasznos alkalmazás megvalósítható vele. Elég csak az USB-re, vagy akár az Ethernetre gondolnunk. Ezért a Szerkesztőség egy sorozat k. . . .
Megnézzük most néhány példa segítségével a Watchog Timer (WDT) használatát. Írni fogunk közvetlenül regisztert, de használni fogunk makrókat is.. . . .