Fórum témák

» Több friss téma
Cikkek » PIC 18F4550 USB útmutató II
PIC 18F4550 USB útmutató II
Szerző: Gory, idő: Jún 8, 2007, Olvasva: 25915, Oldal olvasási idő: kb. 1 perc
Lapozás: OK   6 / 7

Gyakorlati tudnivalók

1)       Ne használjunk blokkoló függvényhívásokat (azaz amikor a program futása felfüggesztődik és a függvény visszatérésére vár). Az USB taszkok kiszolgálása un. Polling módszerrel, azaz folyamatos lekérdezéssel történik a fő programciklusban. Éppen ezért ha például beérkező adatra várunk, de nem jön adat valami miatt, akkor holtpont áll elő, nem fog a program továbblépni. Például a fentebb említett while(!mUSBUSARTIsTxTrfReady()); egy kerülendő, blokkoló hívás.

2)       A putrsUSBUSART, putsUSBUSART,mUSBUSARTTxRom és mUSBUSARTTxRam függvényhívások nem blokkolók. Amikor ezeket hívjuk, akkor nem a konkrét adatátvitelt indítjuk el, csak a megfelelő regisztereket állítjuk be. A konkrét átvitelért a CDCTxService() metódus felelős. Ez darabolja fel például a hosszú adatokat kisebb darabokra. A fő programciklusban egyszer hívódik meg a formware-ben az USBTasks() eljárásban. Ennek van egy hátránya, mégpedig az, hogy egy új transzfer kezdete a jelenlegi vagy előző átvitelt felülírhatja. Ez azért van mert a fent említett függvények csak a regisztereket állítják be a küldéshez, nem kezdődik azonnal a küldés, hanem csak ciklusonként egyszer, így két kiszolgálás közt akaratlanul felülírhatjuk a régi adatokat, ha nem figyelünk. Lássunk egy példát:

Heltytelenül:

if(mUSBUSARTIsTxTrfReady())
{
putrsUSBUSART(“Hello World”);
putrsUSBUSART(“Hello Again”);
}//end if

Helyesen:

byte state = 0;
if(state == 0)
{
if(mUSBUSARTIsTxTrfReady())
{
putrsUSBUSART(“Hello World”);
state++;
}//end if
}
else if(state == 1)
{
if(mUSBUSARTIsTxTrfReady())
{
putrsUSBUSART(“Hello Again”);
state++;
}//end if
}//end if
char io_buffer[64];

. . .

// Main Program Loop

while(1)
{
USBTasks();
if (mUSBUSARTIsTxTrfReady())
putsUSBUSART(io_buffer);
// SendToBuffer attachs multiple
// strings together
// (The user will need to provide
// their own SendToBuffer function)
SendToBuffer(“Hello World”);
SendToBuffer(“Hello Again”);
}// end while

3)       A project helyes beállítása CDC használatához:

1. #include "systemusbusb.h" szükséges minden fájl elejére, amelyik használja a CDC    funkciókat

2. USB_USE_CDC definiálni kell a usbcfg.h fájlban ha használjuk a CDC függvényeket.

3. A forrás és header fájlokat hozzá kell adnunk a projecthez. A cdc.c és cdc.h,
               fájlokat, amik a “systemusbclasscdc” Mappában találhatók.

4)       A saját eljárásainkat és módosításainkat a user.c fájlban kell elvégeznünk. Az inicializáló részeket a UserInit-be, a fő programciklusban végrehajtandó dolgokat pedig a ProcessIO-ba kell írni.


A cikk még nem ért véget, lapozz!
Következő: »»   6 / 7
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem