Fórum témák
» Több friss téma |
Sajnos én is így módosítottam a programot hogy működjön,csak nem értem. A hardware blokséma ugyanezt valósítja meg, akkor csak akkor hívódik meg az interrupt rutin, ha a két feltétel fennáll amit felírtál. Akkor az interrupt rutinban miért nem elég csak a GPIF-et vizsgálni? És miért van az ha az interrupt rutinban a GPIE=0 ra állítom az IOC továbbra is kiváltja a megszakítást, a PGIF et beállítja egyre és valóban csak a kettő együttes vizsgálatval tudom eldönetni hogy a GPIO ról jött e a megszaktás. De letiltott GPIE nél mi váltja ki a megszakítás, mert e rutin végrehajtódik?
Idézet: „És miért van az ha az interrupt rutinban a GPIE=0 ra állítom az IOC továbbra is kiváltja a megszakítást, a PGIF et beállítja egyre és valóban csak a kettő együttes vizsgálatával tudom eldönteni hogy a GPIO ról jött e a megszakítás.” Egy másik engedélyezett megszakítás kérés miatt kerül a vezérlés a megszakítási rutinra.
A timer0 nál is csak T0IF-et szoktam vizsgálni hiszen a hardwer nem váltja ki a megszakítás amíg a T0IE && T0IF együtt nem igaz.
Több szem többet lát:
void pic_beallitas(void) { CMCON= 0b00000111; TRISIO = 0b00011001; ANSEL = 0b00010001; ADCON0 = 0b10000001; OPTION_REG = 0b11000101; IOC = 0b00001000; UZEMLED=0; VILAGITAS_KAPCSOLO=0; TMR0=0; T0IF=0; T0IE=1; GPIF=0; GPIE=1; } Ezzel indítom a picet, a cél két megszakítás volt timer0 és GP3
Ha a Timer0 megszakítás engedélyezett, akkor amikor a T0IF 1 -re vált, a vezérlés a megszakítási rutinra kerül. Ha ott csak a GPIF -et vizsgálja a kód, a GPIO megszakítás kiszolgálása ekkor lefut annak ellenére, hogy a GPIE nem engedélyezi. Ezért kell vizsgálni, hogy a GPIE engedélyezi-e a megszakítás kérését.
Megértettem. Én rontottam el. A timer0 miatt sokszor hívódik a rutin és hiába kapcsoltam ki a GPIE, a timer0 által kiváltott megszakítás nál csak a GPIF-et figyeltem az meg kiváltódik a GPIE-től függetlenül. Ez megoldódott. Köszönöm. Viszont amit végkép nem értek: A GPIF=1 re váltott és utánna egy sorral egy feltételben ellenőrizve mindíg ugyanazt az értéket olvastam be a lábról. Ha a GPIF ellenőrzése és az utánna lévő jel vizsgálata közé tettem egy 100ms os szünetet, akkor már helyes adatot hozott be. itől lehet ez?
if (GPIF) { __delay_ms(100); if (AJTO_ERZEKELO)//ajtó nyit { beep(100,100); nyitas_idozito=0; } else //ajtó bezárt
Sziasztok!
UART-on lehet olvasni egy pic lábának állapotát? (Magas vagy alacsony értéken van?)
Nem, a portláb vagy i/o módban van, akkor tudod olvasni, vagy UART módban.
Alapból nem, de ki lehet trükközni, ha írsz hozzá egy rutint, ami adott UART parancs beérkezésekor lekérdezi és azt visszaküldi.
Ez kellene nekem , ehhez van valami example kód?
Keress UART kezelő rutinokat, próbáld ki őket, utána tedd fel az esetleges további kérdéseket.
Egyébként meg nem írtad le a PIC típusát és azt, hogy milyen környezetben szeretnéd programozni, pl. MPASM vagy XC8 compiler, vagy bármi más amit használni szeretnél.
Igazából kerestem már erre, de nem találtam olyat, amit tudok használni belőle.
A PIC egy 16f628A és mikroC-ben programozom. Az uart kezelő részt már megírtam, csak a port láb állapotának a lekérdezését nem tudom. RB7-6-5 lábak állapotát akarom lekérdezni és nem a serial lábakét. A hozzászólás módosítva: Máj 15, 2019
Nem világos, mit is szeretnél? Ha beolvasod a PORTB-t benne vannak a lábak állapotai...
UART-on szeretném átküldeni az RB6 - os láb állapotát.
Az vmi. ilyesmi lesz, (bár mikroC-t sosem használtam)
Vagy mi a kérdés?? A hozzászólás módosítva: Máj 15, 2019
Ehh, erre nem is gondoltam Köszi , így már megvan . Ez volt. Csak túlbonyolítottam.
A hozzászólás módosítva: Máj 15, 2019
Kell-e hogy az átvitel olvasható (human readable) legyen?
Ha nem: PutCharUSART(PORTB & 0xE0); // A PORTB 7,6,5 bitjeit tartalmazó adat megy át: Az adat felső 3 bitje (balról) az RB7, RB6, RB5 értékének felel meg. Ha kell: PutCharUSART(((PORTB >> 5) & 0x07)+ 0x30); // A PORTB 7,6,5 bitjeit tartalmazó adat megy át, a nyolc állapotbak megfelelően a "0" .. "7" karakter kódja.
Üdv!
Egy HD44780 kijelzőhöz írok programot, a PIC 3,3V-rol üzemel, az LCD pedig 5V-rol. Ha a kijelzőn vizsgálni akatom a foglaltságot (D7) akkor 5V-os jelszintet fog kiadni az LCD? Adatlapban nem találtam meg a választ. Köszi!
Lenne még egy kérdésem:
Ha a D0-D7 kimenetnek van állítva, akkor az irány átállítása nélkül a PORTXbits.RXy -al ki tudom olvasni vagy ez így nem működik?
Igen,5V -ot küld vissza,de van jó pár megoldás,hogy ne legyen gond. A legegyszerűbb,hogy megnézed,hogy melyik láb 5V toleráns,és azokra kötöd .A másik lehetőség,hogy nem használod a busy-t ,hanem késleltetett rutinnal vezéreled.(ha jól írod meg,akkor is eléggé gyors lesz).És még van jó pár lehetőség .
A hozzászólás módosítva: Máj 17, 2019
Köszi a választ!
Marad az 5V toleráns láb akkor!
Ha kimenetnek van állítva,akkor összetűzésbe fog kerülni az lcd-vel,és valamelyik beadja a kulcsot
Értem, akkor jol gondoltam!
Köszi!
Jobban járnál szerintem,a sima késleltetéssel(1-2db Nop).Nálam 128*64-es oled megy,minden gond nélkül.
A figyelés a tft-k felbontásánál számít nagyon,bár ott már használatos a PMP(bár ez 1 picit más).
Na megírtam késleltetéssel, csak valami gond van a programmal!
nem ír ki egy karaktert sem! a felső soron látszik hogy teljesen ki van töltve, ha tekerem a kontrasztállítót. Pedig követtem az adatlap leírását, meg a PIC-kwik-es oldal leírását is.
A 103. sor után kimaradt egy E_Pulse(), így nem történik meg a 0x38 parancs kiküldése: adatút-szélesség (DL), sorok száma (N) és fontméret (F) beállítása.
Odáig eljutottam, hogy ha a mainen belül a függvényeket beteszem egy while ciklusba akkor kiíratja, de összefolynak a betűk. Az LCD-nek nem kellene megtartaniaa a karaktereket, ha beleírtam egy memóriacímre? Vagy folyamatosan frissíteni kell?
A main() függvényben a return 0 helyett egy while(1); ciklus kellene.
A HD44780 LCD kijelzőt nem kell frissíteni, ha egyszer beírtál valamit, akkor kikapcsolásig (vagy felülírásig) mutatja.
Ha csak 1 while-be raktad,akkor folyamatosan meghívja,így olyan,mintha folyamatosan változna,felülírná. Icserny -nél elég jól le van írva,hogy mi-mi.
|
Bejelentkezés
Hirdetés |