WebElektronika

UART alkalmazása a PIC18F családban

person access_time 2016.05.23.
Megnézzük most az UART alkalmazását egy 8 bites mikrovezérlőnél. A PIC18F14K50-es mikrovezérlőben található EUART modult fogjuk felhasználni a most bemutatásra kerülő projektben. Láttuk a korábbi cikkekben, hogy a Quectel által gyártott M66-os modul ezen a soros protokollon érhető el. Nem az a cél, hogy .NET-ben küldjünk TCP socket-eket, hanem az, hogy a különböző AT parancsokat UART-on keresztül adja ki egy mikrovezérlő.


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.

kep
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).

kép
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).

kép
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).

kep
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).

kep
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).

kép
6. ábra   Hibás beállítás
 

Érdemes az eredményeket összevetni az adott karakterek ASCII értékeivel.