Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Idézet: „a GOTO $-1 mennyit megy vissza?” Könnyű lesz megérteni, ha arra gondolsz, hogy nem "mennyit megy vissza?", hanem "milyen címre ugrik?". A "$-1" egy kifejezés, amit a fordító kiértékel, s erre a címre irányítja a GOTO utasítással a programot. A "$-$"kifejezés esetén például a 0 címre ugrik a GOTO utasítás. Ennél "visszább" már nehéz volna küldeni... Idézet: „A "$-1" egy kifejezés, amit a fordító kiértékel, s erre a címre irányítja a GOTO utasítással a programot. A "$-$"kifejezés esetén például a 0 címre ugrik a GOTO utasítás. Ennél "visszább" már nehéz volna küldeni...” Pedig lehet... PAGESEL-t beallitja egy elozo lapra...
A többiek már a lényeget leírták, én még csak annyit tanácsolnék, hogy ne használd. Használj cimkéket, jobban jársz! Persze az így megírt programot értelmezni lehet, nehezen, csak randa és igénytelen. Szerintem!!!
Üdv!
Azt szeretném kérdezni hogy PIC 18-nál a CBLOCK 0X0020 után hány regiszter fér el az Access bankban? Ugyanis mikor a 41. regiszternek értéket adok meghal a program egy része, viszont mikor a 42.-nek is értéket adok, akkor meg helyrejön. (Az utóbb felsorolt 2 regiszter semmit nem csinál a programban csak van.) Ugyanígy elrontja a programot a cblockban 2. helyen álló flag1 reg. 6. és 7. bitjének állítása, hiába hogy azok semmilyen szerepet nem töltenek be a programban.
Az adatlapban kell megnézni,mert van, amelyikben 0-7F az Access Bank RAM része, és van, amelyiknél csak 0-5f (tehát több helyet foglal az SFR tartománya).
Egyébként miért 0x020-tól kezded, miért nem nullától? Idézet: Ezt kicsit érthetőbben is mondd el! „mikor a 41. regiszternek értéket adok meghal a program egy része, viszont mikor a 42.-nek is értéket adok, akkor meg helyrejön.”
Köszönöm mindenkinek a segítséget! :eljen:
Címkékkel tényleg átláthatóbb, akkor majd azzal fogom megcsinálni
Jelenleg a programban 40 regiszter van felsorolova és amikor létrehozok egy 41.-et akkor még semmi gond mindaddig még bármilyen értéket nem adok neki, mert akkor leáll az összes low prioritású megszakítás. Amikor viszont csinálok egy 42.-et és amikor értéket adok neki akkor megint működik a program. Ha 0x000tól kezdem akkor is ugyanez történik.
Csatold a programodat, ami a hibás működést produkálja.
Valamit nyilvanvaloan elirtal amitol az SFR-t turkalod. A 40 db regiszter byte vagy word vagy dwrod meretu amugy?
(amugy javasolnam terj at linker scriptre, ott ilyen jellegu hibak nem lephetnek fel...)
Csatolom a teljes projectet proteus szimulációs fájlal együtt és az IR jeleket is mp3ban, ezeket majd wav-ba kell konvertálni és betallózni proteusban. Az xxx regisztert kiszedve működik rendesen a program. Magamtól sajnos sosem jönnék rá hogy mi a hiba mert még nagyon kezdő vagyok PIC téren, úgyhogy nagyon hálás vagyok minden segítségért!
Ha jól nézem, akkor abszolút módban van a programod írva, viszont relokálható fordítást csinál az MPLAB. A Project->Build Options->Project->MPASM/C17/C18 Suite fülön állítsd át Generate absolute code-ra. Nembiztos, hogy ebből fakad a probléma, de egy hibalehetőséggel kevesebb.
Assembler interrupt kezeléshez nem értek,de néhány dolog feltűnt:
1. Programmegszakításnál nem kellene valamit menteni? (pl. STATUS, WREG) 2. Az LPM-ből való visszatérésnél miért RETFIE FAST szerepel? Az árnyékregisztereket ugyanis HPM használja, illetve felülírja! (a kódot nem látók kedvéért: HPM és LPM a magas, illetve az alacsony prioritású programmegszakítás kiszolgálását végző eljárások a becsatolt programban)
Na ezt nem tudtam. Én azt hittem hogy a low prioritású megszakításnál is használható a retfie fast.
De nem ez a nagyobbik baj. Mi van a mentésekkel? Így soha nem fog működni. Nézd meg az adatlapban miket és hogyan kell menteni.
Nem használható. Sőt egyes chipeknél még a high-nál sem, mert hiba van a chipen. Erratat ellenőrizni kell ezirányba.
Szimulációban mindenesetre működik. Épp most teszteltem hogy ha low-ban átírom a w-t meg a statust, aztán retfie fast-al kilépek a megszakításból akkor visszaállítja a w-t is meg a statust is arra ami a megszakítás előtt volt.
Idézet: „Nem használható. Sőt egyes chipeknél még a high-nál sem, mert hiba van a chipen. Erratat ellenőrizni kell ezirányba.” Azokra volt workaround, de valoban "normalisan" nem lehetett hasznalni, es a workaround miatt meg nem lett sokkal gyorsabb a mentes mintha szoftveresen csinalna azt meg az ember.
A szimulációba nincsenek bedrótozva a chip hibái!
Idézet: „Szimulációban mindenesetre működik.” Szimulatorban vagy a valos chip-en szeretned, hogy mukodjon? Amugy csak a magas prioritasnal lehet hasznalni - pontosabban az alacsonynal is fog mukodni, csak a bibi az az, hogy egyetlen tarolo helye van. Tehat mig szepen az alacsony prioritasu megszakitast kiszolgalod jon egy magas prioritasu megszakitas, ami miatt az az egyetlen helyen tarolt WREG es STATUS szepen felulirodik... mikor az alacsony szintubol kilepsz pedig ezt a mar atirtat fogja vissza tolteni -- hat ezert nem lehet azt alacsony szintunel hasznalni... Magas szintunel pedig a mar emlitett hiba miatt nem lehet -- ha jol tevedek a ket szavas adat mozgatasok kornyeken volt a hiba, es valahogy ugy lehetett megkerulni a problemat, hogy az ISR-t CALL FAST-tal kellett meghivni, az sima RETURN-nel tert vissza majd onnan RETFIE FAST -- utana kellene nezni...
Akkor tehát az alacsony szintű megszakítás közben történhet magas szintű megszakítás? Azt hittem hogy megszakítás alatt tiltva vannak a megszakítások. Lesz mit javítani akkor a programon. De ezek még mindig nem lehetnek felelősek a fő hibáért vagy igen?
Idézet: „Akkor tehát az alacsony szintű megszakítás közben történhet magas szintű megszakítás?” Vajon miért van alacsony szintűnek és magas szintűnek nevezve?
Hát én arra gondoltam hogy azért van hogy ne legyen egyrakáson a sok megszakítás és így jobban elkülönül hogy kétfelé van osztva.
Arra elég lenne néhány szubrutin. Olvasd el az adatlapot, benne van hogy működik...
Sziasztok! Van egy karakteres LCD modulom, amit már nem egyszer működtettem 16F-es PIC-eken. Most építettem egy eszközt, amiben 18F2520-as PIC buzog és a B-portot tüskesoron kivezettem, hogy mindenféle diagnosztikai ki és bemenetnek használhassam. Ráraktam az LCD-t, megírtam a szokásos kis programot és szép kis fekete négyzetekkel tölti ki az egész sort. Utána néztem, ADCOn regiszterben az analóg pineket, digitálisra kapcsoltam, teljes outputnak állítottam be a B-portot és még az INTCON-t is kikapcsoltam. Elvileg minden rendben van és menni kellene... Mivel a 18-as család nekem újdonság ezért kérdezlek titeket, hogy mit lehetne még kipróbálni. Tudom, hogy így elég nehéz, de vannak itt okos elmék, hátha! Köszi urak!
Egyébként hogyan kellett volna írni vagy mit kellene ahhoz változtatni, hogy a program megfeleljen a relocation mód szabályainak?
Mondjuk az időzítésekre tippelek, ha netán gyorsabb az oszci. De igazából ennyiből nem lehet mit mondani.
Mondom tovább, érdekes...vagyis googa tapasztalatlan. Szóval kapott egy LED-sort tesztelés képen a B-port és a program összesen annyi, hogy B-port felkapcsol és úgy marad. Ehhez képest az történik, hogy vagy elindul tápráadásra, vagy nem. Ha elindul, akkor egy következő pillanatban le is kapcsol a LED-sor, talán újraindul a PIC. Ez mitől lehet? Talán, ha ezt rendezem, menni fog az LCD is.
Watchdog kikapcsolva, az nem okozhat resetet... |
Bejelentkezés
Hirdetés |