Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Szerintem én is ezt javasoltam, de még nem nézte meg !
Steve
Én a szimulátorra értettem, a kódot ( 4 lapnyi ) először nézze át ő ( és hátha megtanul egy jó hibakeresési technikát is a szimulátorral! ) !
Steve
Ja értem, én meg kértem, hogy tegyen fel kódot. Mindegy...
Egy kis segítséget kérnék.
Egy pic32mx procira rádrótoztam egy 320x240-es színes kijelzőt ami touch-os. A kijelző szépen ad képet, a touch részt is sikerült segítséggel belefaragni a mikrochip-es projektbe. De a probléma az, hogy, hiába kapja vissza az adatokat a gol nem csinál vele semmit. Tehát rányomok egy gombra, és semmi nem történik, a gomb nem reagál. Mi lehet a gond? A main itt kapja vissza az adatot a TouchGetMsg(&msg); részben:
Itt debugger alatt szépen látom is a visszaküldött adatokat. pl: (02, 01, 189,126) az utolsó kettő a visszaküldött x,y koordináta. Valahová kellhet még valami? A hozzászólás módosítva: Jan 24, 2013
Sziasztok!
Talált-e valaki programozási leírást a PIC18F65J94, 66J94, 67J94, 85J94, 86J94, 95J94, 96J94, 97J94, 95J99, 96J99, 97J99 kontrollrekhez? PIC18FxxJ94, in production, adtlap és egy errata tölthető le csak, vagy én nem találom?
Szia !
Ém már működésre bírtam ezt, igaz AVR-rel, de ez a lényeget nem érinti Idézet: „De a probléma az, hogy, hiába kapja vissza az adatokat a gol nem csinál vele semmit.” A TouchGetMsg(&msg) függvény "készíti el" az üzenetet, (mi történt : nyomás, elengedés, nyomvatartás stb. és rendel hozzá x,y koordinátát) A GOLMsg(&msg) függvény végigmegy az objektumokon, és meghívja a pCurrentObj->MsgObj(pCurrentObj, pMsg) függvényt mindegyik objektum esetén. Az objektumok (button, checkbox, progressbar....) ezen függvénye reagál az üzenetre, ha az x,y koordináták beleesnek a "felületébe". Ekkor az objektum visszaküld egy értéket pl. return (BTN_MSG_PRESSED) ez lesz a translatedMsg a GOLMsg függvényen belül. Ezután egyrészt meghívódik a GOLMsgCallback fv. amit neked kell megírni, itt tudsz reagálni a történésre, majd a meghívódik az objektum MsgDefaultObj fv-e, amiben megtörténik az objektum grafikus viselkedésének beállítása pl. SetState(pB, BTN_PRESSED | BTN_DRAW). Az objektum tényleges kirajzolása nem itt történik, hanem majd a GOLDraw() fv. hívja meg annak az objektumnak a draw() rutinját ami az előbb reagált az üzenetre. Röviden ennyi a működés. Lépésenként végig lehet menni és kiíratni az LCD-re különböző soroknál adatokat, így kiderül eljut-e oda. Ha az objektum nem reagál, akkor ennek lehet nagyon egyszerű oka is pl. a touch-nál lentről indul az y koordináta, míg az objektumnál felülről.
Akkor ha jól értem a "GOLMsgCallback" részbe kell írnom hogy mi történjen, ha megnyomom a gombot.
De attól a gomb animációja nem kellene, hogy lefusson? Tehát nem kellene-e benyomódnia a gombnak? Mert nekem ez sem történik meg. Átnézem, hátha jutok valamire. A hozzászólás módosítva: Jan 24, 2013
A gomb lenyomásakor az animációnak meg kell történni, függetlenül attól, hogy lekezeled-e az eseményt, vagy nem. Szerintem kezdd el a TouchGetMsg(&msg) fv. vizsgálatával, írasd ki milyen eseményt és milyen x,y koordinátát ad vissza, ha megnyomod a touch-ot. Ennek minden híváskor kell visszaadni értéket, ha nincs nyomás akkor is ekkor pl. azt, hogy nincs semmi x=0;y=0;. Ennek a rutinnak kell tudni kezelni a lenyomást, elengedést, nyomva tartást, és a nyomás közbeni mozgatást.
Esetleg feltehetnéd ennek a kódját, hátha látszik belőle valami. Mellékelek egy program vázat, kb. így építettem fel a saját programomat.
Csatolom a forráskódomat, hátha csak nem veszek valamit észre.
Bár még nem írtam semmit a "GOLMsgCallback" részbe, de a legnagyobb gondom, hogy maga az animáció sem zajlik már le. A programban jelenleg egyetlen egy gomb van, az is a képernyő közepén. A "TouchGetMsg(&msg);" debug alatt jónak tűnik. A vissza adott érték biztosan belül van a gomb területén. Egy példa: 02,01,168,128 Ez a függvény amit használok a touchhoz:
amit írsz :
Idézet: ez a TouchGetMsg fv. által visszaadott struktúra a pMsg értéke ?„Egy példa: 02,01,168,128” Ha igen, akkor az első paraméter adja meg a beviteli eszközt (type), ami most a TYPE_TOUCHSCREEN, a második paraméter az általa generált esemény (uiEvent), ami az EVENT_MOVE a következő paraméter (param1) az x, a következő pedig (param2) az y koordináta. Szerintem nézd meg a BtnTranslateMsg fv.-t, hogy itt kell-e reagálni az EVENT_MOVE eseményre a nyomógombnak. Esetleg kipróbálhatod, hogy TouchGetMsg fv.-ben ebben a sorban pMsg->uiEvent = EVENT_MOVE;kicseréled az EVENT_MOVE-ot EVENT_PRESS-re és utána rögtön return;. Ha ettől mozogna a nyomógomb képe, akkor itt vana baj, ha nem akkor...
Köszönöm a segítséget. Természetesen használtam volna a szimulátort, ha lenne gyakorlati haszna az én esetemben. Ugyanis nem elég, hogy négy memórialapnyi programot használok, hanem még a TMR1 (mint megszakítás forrás indítása) indítása is teljesen véletlenszerű, több menetet és I2C-n fogadott adat ÉS/VAGY kapcsolatának függvénye. Nem is beszélve arról, hogy szintén véletlenszerű esemény meg is szakíthatja vagy "beletörölhet" Elméletben jó tehát csak a szimulátor, akkor ha számítható a TIMER(ek) futása. De itt nem. Természetesen maga a megszakítás kiszolgáló rész nem ilyen egyszerű, az is tekintélyes, de a flag törlése majd RETFIE-re is ugyanígy viselkedik a program. Éppen ezért programkódot teljesen értelmetlen közölnöm. Született viszont megoldás, de magam sem értem miért jó. Ebben kérném a további segítségeteket! Ha a megszakítás címére (0x0004) egy goto xxxx utasítást teszek és magát a megszakítást végrehajtó rutint "elteszem" onnan ugyanazon memórialap más címére (szubruntinként), úgy a program teljesen jól működik. W, STATUS, PCLATH mentéssel és lapváltásokkal együtt. Tehát az a számomra érthetetlen, hogy miért nem bírja végrehajtani a megszakítás kiszolgálást ha az a 0x0004 címtől folytatólagosan van?
Te írtad:
Idézet: Na ezt kellett volna megnézni és itt mindegy, hogy milyen "variációk" miatt kerül megszakításba ( mivel azt írtad, hogy innen mindig elakad!), látnod kell, hogy mi a gond, mikor kilép!„Köszönöm a válaszokat! Természetesen "tökén fogtam" a PCLATH-ot már, azonban az a rettenetesen érdekes, hogy ha a megszakításban csak annyit csinálok, hogy törlöm az IRQ-FLAG-et, majd zavarom is vissza RETFIE-vel - na ekkor is elkószál...” Steve
Nem látom - a szimulátorban a következő az eredmény:
BCF TMR1IF - végrehajt BSF LED - adott port 1-be áll RETFIE - visszaugrik az eredeti programba p.memórialaptól függetlenül. Valóságban a LED már nem kapcsol be. Ha felcserélem a TMRIF törlése és LED bekapcsolása sorokat, akkor a LED kigyullad, de innen elakad a program. További kiegészítés - módosítom a progit: BSF LED1 - adott port 1-be áll BCF TMR1IF - végrehajt BSF LED2 - adott port 1-be áll RETFIE - visszaugrik az eredeti programba p.memórialaptól függetlenül. vagy: BSF LED1 - adott port 1-be áll BSF LED2 - adott port 1-be áll BCF TMR1IF - végrehajt RETFIE - visszaugrik az eredeti programba p.memórialaptól függetlenül. a LED2 egyik esetben sem kapcsol már be! Bezzeg ha így néz ki a dolog: ORG 0x0004 GOTO Na ebben az esetben szimulátor szerint is és a valóságban is jól működik. Olyan mintha a 0x0005 címen a program megbolondulna. Elképzelhető programmemória hiba szerintetek?
A bankot hol választod ki az interrupt rutinodban? A TMR1IF biztosan nem érhető el minden lapról, tehát előtte el kell mentened a W + STATUS regisztereket, és beállítani a kívánt bankot. Természetesen a visszaállításnak is meg kell lennie a RETFIE előtt.
A BSF LED ugye portbitet állít, az szintén fix bankbeállítást igényel.
Nézd meg ezt a cikket!
Idézet: „Ha a megszakítás címére (0x0004) egy goto xxxx utasítást teszek és magát a megszakítást végrehajtó rutint "elteszem" onnan ugyanazon memórialap más címére (szubruntinként), úgy a program teljesen jól működik. W, STATUS, PCLATH mentéssel és lapváltásokkal együtt.” Ne sértődj meg... Ez a megoldás teljesen hibás! Ha lenne hajam, kitépném. Egy hete mondjuk a megoldást... Ugyanis: A megszakítás a 0x0004 -et tölti be a PC -be, a PCLATH regiszter értéke a megszakítás előtt érték marad. A fent említett goto xxx utasítás a PCLATH értékéből veszi a 4. és 3. bitet, kiegészíti az utasítás alsó 10 bitjével. A Te esetedben pontosan arra a program lapra ugrik (véletlenül), amin a megszakítási rutint tetted. De ez csak egy lapra igaz. Vagy mind a 4 lapra iugyan azt a megszakítási rutin teszed? Ha a megszakítási rutinban elágazol az októl függően és nem állítod a PCLATH -t, a program megint "elkolbászol", ráadásul a megszakítás tilott állapotában. Készíts egy kis eljárást egy harmadik lapra (ne arra, amin a megszakítási rutin van), ami jó sokat vár, tesztnek egy végtelen ciklus is jó lesz, hívd meg. A várakozáshoz goto -t kell használnod, ami erre a lapra kell ugorjon, tehát a PCLATH -t erre a lapra kell beállítanod. A szimulátorban tegyél töréspontot a 0x0004 címen levő goto xxx -re és nézd meg, hova ugrik megszakításkor! Hidd el a szimulátornak, hogy azon a lapon fog a megszakítási rutin kezdőcímére (xxxx & 0x7FF) ugrani, amin a megszakítás bekövetkezéséig futott. Ekkor "kolbászol el"... Egyébként subrutinokat call -al szoktuk hívni, és általában nem tesszük a megszakítás kiszolgálót vagy részeit szubrutinba, főleg nem egy korlátozott férőhelyű hardware stack -kal megáldott kontrolleren. Apropo az "elkolbászolásnak" lehet stack túlírás is az oka, amit a szimulátor jelezne neked... Olvasd már el a cikket, amit ajánlottam. Próbáld ki a benne elmagyarázott programot. Kipróbáltam, működik - Én írtam a cikket és a programot is. De vajon minek, ha nem is olvassák el... Én már tudom, csinálom, örülök, hogy pl. 16F886 -ban több 8000 utasításnál nagyobb programom működik. A hozzászólás módosítva: Jan 25, 2013
Igazad van - azt nem írtam, hogy magát a programot is lehülyítettem, így az org 0x0004-ről való azonnali goto nem okozott problémát, mivel a program mindig page0-n volt mikor az irq bejött. Bármilyen fura - igazolódott, hogy hardverhiba ugyanis másik processzorral kifogástalan az eredeti megszakítás. Ilyennel még nem találkoztam...
Az ICD2 prog/debuggert valóban nem támogatja az MPLAB X? Ezt nem értem......
MPLAB IDE revízióihoz meg nem tudok találni win7 alá drivert. Valaki tud ebben tanácsot adni? Lehet hogy más compilerrel kell használnom ezután az ICD2-őt, ha win7 alatt akarom használni? Idézet: Állítólag Vista driverrel megy. Itt írnak róla. (nem tudom ellenőrizni, mert nekem nincs ICD2-m, csak Guglizni tudok...) „MPLAB IDE revízióihoz meg nem tudok találni win7 alá drivert.”
Csak az a gondom, hogy az alábbi ICD2-m van: P/N 10-00319
Idézet: „Older MPLAB ICD 2 debuggers (P/N 10-00319) will NOT support 64-bit VISTA. ”
Akkor csak XP vagy virtualizált XP segít rajtad.
Ez nem igaz! Hogy egy ilyen banális hibát követek el, nem hiszem el!
Mivel a touch kezelőt részben én írtam, ezért a hardwareprofile-ban nem volt definiálva a #define USE_TOUCHSCREEN(); Ezért hiába is küldte a touch az adatokat, a button.c-ben lévő BtnTranslateMsg fel sem dolgozta. Köszönöm a segítséget.
Ezt akartam elkerülni, most hogy win7-re váltottam.............
Van még valamilyen compiler ami támogatja az ICD2-őt? Idézet: Nem a compiler támogatja az ICD-t, hanem az IDE. A Microchipnek csak MPLAB és MPLAB X van. „Van még valamilyen compiler ami támogatja az ICD2-őt?”
Bocs, rosszul fogalmaztam. Pont arra lennék kíváncsi, hogy az MPLAB és MPLAB X-en kívül van -e fejlesztő környezet ami elfogadja az ICD2-t.
Örülök, hogy sikerült megoldanod!
Én még nem hallottam ilyenről. Égetésre máskor volt valami program, nem jut eszembe a neve, de debuggolásra nem tudok másikról...
Idézet: Ha netán lenne, akkor sem valószínű, hogy saját drivert fejlesztenének hozzá, pláne a "régi" konstrukciójú ICD2 és a 64 bites Win7 pároshoz.„arra lennék kíváncsi, hogy az MPLAB és MPLAB X-en kívül van -e fejlesztő környezet ami elfogadja az ICD2-t.” Ezért nem ajánlottam tegnap sem a régi HI-TIDE (ez akkor volt, amikor a Microchip még nem vásárolta fel a HiTech céget), sem a SourceBoost IDE fejlesztői környezetet. |
Bejelentkezés
Hirdetés |