Fórum témák

» Több friss téma
Cikkek » PIC 18F4550 USB útmutató III
PIC 18F4550 USB útmutató III
Szerző: Gory, idő: Szept 16, 2007, Olvasva: 36286, Oldal olvasási idő: kb. 1 perc
Lapozás: OK   6 / 10

2. lépés: Eredmény elküldése a PC-re

 

Az eredményt majdnem tetszőleges frissítéssel küldhetjük a PC-re, de nem akarjuk ezzel felemészteni a teljes processzor- és átviteli kapacitást, ezért egy számlálóval beállítunk egy körülbelüli értéket. A számláló csak számol, majd ha eléri ezt az értéket, kizárólag akkor konvertál és küldi az adatot. Azt ne kérdezze senki, hogy így milyen gyors a frissítés, ez attól függ, hogy az USB-s feladatokat ellátó kódok milyen gyakorisággal hajtják végre a main() függvényben a ProcessIO() eljárást. Másrészt a konverzió sebessége is határt szab a frissítésnek. Mindenestre 10 ezerre állítva ezt a számlálót, néhány hertz-es frissítést kapunk a PC oldalon. Aki akarja, kisebbre is állíthatja, 5 ezer alatt már egész jó a frissítés, de igazából a késleltetés (latency) az, ami észrevehető nálam, ha valamit még csinál a számítógép.

Mielőtt a függvényhívás kódját elolvasnánk, érdemes átgondolni, hogy a korábbi fejezetben említett adatküldő CDC-s függvényből melyiket kéne használni, és hogyan kéne felparaméterezni ahhoz, hogy az ADRESH és ADRESL regiszterekben levő adatot átpréseljük az USB kábelen. Átküldhetjük nullterminated string formában, ez 3 bájtot venne igénybe. De tudjuk, hogy 2 bájt hosszú, azaz ismert hosszúságú, ezért nem string formában küldjük nyilván, így a put kezdetű függvények kiesnek. Ha bepakoljuk a két regisztert egy bájt tömbbe, akkor program memóriából el tudjuk küldeni. Ezzel a megoldást el is árultam. A bájt tömbnek legalább 2 bájtosnak kell lennie, hogy elférjen benne az adat, de ha egy 64 bájtosat definiáluk és ennek az első két bájtjába tesszük, akkor az mUSBUSARTTxRam függvény felparaméterezése miatt csak az a 2 bájt fog úgyis átmenni. Íme a kód, ne felejtsük el a char input_buffer[2] tömböt valahol előre deklarálni:

 

void SendADC(void)
{
         counter++;
         if (counter==10000)
         {
             counter=0;
             ReadPOT();
             input_buffer[0] = ADRESH;
             input_buffer[1] = ADRESL;               

             if(mUSBUSARTIsTxTrfReady())
            {

                   mUSBUSARTTxRam((byte*)input_buffer,2);
            }  
        }
}


A cikk még nem ért véget, lapozz!
Következő: »»   6 / 10
É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