Az UART, azaz az aszinkron soros kommunikáció nagyon érzékeny a helyes beállításokra, a baud rate értékre, stb. Ezért nézzük most meg a PIC18F családban található órajelmodult (1. ábra). A most bemutatásra kerülő példánkban a belső RC órajelet fogjuk használni, a 16 MHz-es órajelet.
A mikrovezérlő kaphat külső órajelet, az OSC1-en, OSC2-n keresztül. Létezik még egy másodlagos órajel bemenet is, ez nem látszik az ábrán.
1. ábra A PIC18F14K50 mikrovezérlő órajelmodulja (részlet)
A belső RC órajelforrást fogjuk felhasználni, az előosztót úgy állítjuk be, hogy a belső frekvencia 16 MHz legyen. Ehhez az OSCCON regiszterben lévő összes IRCF bitet logikai 1-be kell állítani. Ezt megtehetjük bitenkénti utasítással is (pl.: OSCCONbits.IRCF0 = 1, stb), de úgy is, hogy ezek egyszerre kapnak értéket (OSCCONbits.IRCF = 7).
Fontos még, hogy be kell állítani azt, hogy a belső órajelforrást használjuk, és nem a külsőt. Ezt a "pragma"-knál tesszük meg.
Az UART kényelmesebb használatáért be kell tennünk a projektünkbe az "usart.h" file-t, ahol a különböző függvények leírását találjuk meg.
A "C" port irányát kimenetre állítjuk a TRISC regiszter értékadásával, illetve az UART kommunikációhoz szükséges két "B" portbit irányát is beállítjuk a main() függvény elején. Itt hozunk létre egy karaktertömböt (uzenet) is, ha nem karaktert, hanem string-et szeretnénk kiküldeni az UART-on.
Ezután az OSCCON regiszter értékadásával beállítjuk a belső 16 MHz-es órajelet.
Az OpenUSART() függvény megfelelő paraméterezésével és meghívásával beállítottuk az EUART modult úgy, hogy nem rendeltünk megszakítást az RX, TX jelekhez, az EUART perifériát aszinkron módban alkalmazzuk, a kommunikáció 8 bites. Ennek a függvénynek a paraméterlistájában kerül elhelyezésre az előbb kiszámolt érték, amely a baud rate meghatározásában játszik szerepet.
#include <p18f14k50.h>
#include <delays.h>
#include <usart.h>#pragma config FOSC = IRC, CPUDIV = NOCLKDIV
#pragma config WDTEN = OFF
#pragma config LVP = OFF
#pragma config PCLKEN = OFF
void main(void)
{
unsigned char uzenet[] = "aB\r";
TRISC=0x00;
TRISBbits.TRISB7 = 0;
TRISBbits.TRISB5 = 1;OSCCONbits.IRCF = 7;
OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE &USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, 7);Delay1KTCYx(4);
while(1)
{
putcUSART('a');
//putsUSART(uzenet);
Delay1KTCYx(1);
}
CloseUSART();
}
Az UART beállítása után a while(1) végtelen ciklusban a putcUSART() függvény segítségével állandóan kiküldjük az "a" karaktert, majd késleltetünk 1000 órajelváltást. A CloseUSART() függvény soha nem kerül meghívásra, mert nem lépünk ki a végtelen ciklusból, a programunkban csak a "korrektség" miatt jelenik meg....
Az 'a' karaktert fogjuk kiküldeni az UART-on, nézzük meg, hogy ez a karakter hogyan jelenik meg a soros porton (2. ábra).
2. ábra A 'a' karakter soros ábrázolása
Most nézzük meg a programunk működését a logikai analizátor segítségével, megint az 'a' karaktert küldjük ki (3. ábra).
3. ábra Az 'a' kiküldése
Ha kinagyítjuk a logikaianalizátoron látható eredményt, akkor jól kivehető az 'a' soros ábrázolása (4. ábra).
4. ábra Egy 'a' az UART-on
Az UART-on most küldjük ki a putcUSART() függvénnyel az 'A' karaktert (5. ábra).
5. ábra Egy új karakter, az 'A' kiküldése
A programunkban az OpenUSART() függvény paraméterénél kell megadni a "X" értékét. Ezt a paramétert a következő képlettel számolhatjuk ki :
Fosc/BaudRate = 16(X+1)
Fosc = 16.000.000 Hz
BaudRate = 115200
Ezeknél az értékeknél az X=7 lesz, ezért szerepel tehát a 7 az OpenUSART() függvény paraméterlistájában.
A következő ábrán azt a mérési eredményt láthatjuk, amikor a baud rate rosszul kerül beállításra. Ekkor a logikai analizátor nem képes a sorosan érkező adat értékét meghatározni (6. ábra).
6. ábra Hibás beállítás
Érdemes az eredményeket összevetni az adott karakterek ASCII értékeivel.
Megismerjük most a PIC18F mikrovezérlők megszakításkezelését, és készítünk két egyszerű példaprogramot is. Ezek az egy- és a kétszintű megszakításkezelést mutatják be, de sablonként is jól használhatók saját fejlesztéseknél is.. . . .
Ebben a cikkben egy kétsoros LCD felprogramozását és a hozzátartozó sajátfüggvényeket, makrókat mutatjuk be. Nem térünk ki viszont az LCD-k felépítésére, vezérlésére.. . . .
Ebben a cikkben egy kétsoros LCD felprogramozását és a hozzátartozó sajátfüggvényeket, makrókat mutatjuk be. Nem térünk ki viszont az LCD-k felépítésére, vezérlésére.. . . .