Fórum témák
» Több friss téma |
Olvasd át még egyszer az adatlapot. A Tad időket az órajel alapján ki kell választani (van egy táblázat), az akvizíciós időt ki kell várni, ha nem állítod automatikusra (nem is állítasz be semmit az ADCON2-ben). Az adatlap nem javasolja egy utasításban az AD bekapcsolását és a konverzió elindítását.
Ez is bejött!
Piszkosul bezavartak egymásnak a bemenetek. Most már minden szuper. Köszi mindenkinek a segítsséget!
Sziasztok!
Valaki a PIC kezdőknek fórumon írt valami olyasmiről, hogy egyszerűbb módja is van assemblyben egy szám karakterekre bontásának az aprólékos kivonogatásnál. Valami biteltolást említett. Akkor elsiklottam fölötte, most meg hiába keresem. Ha valaki ismeri ezt a módszert, tenne fel róla mintapéldát?
PIC Micro Controller ASM Language Routine Library
Sajnos most elérhetetlennek tűnik...
A hozzászólás módosítva: Nov 19, 2015
Köszönöm!
Még csak annyit, hogy ez milyen szériájú PIC-re íródott? Kellene valami támpont, hogy át tudjam ültetni PIC 18-ra. Idézet: „... ez milyen szériájú PIC-re íródott?” Több rlf utasítás is szerepel a rutinban... 16F -re készült. A 18F -en rlcf és rlncf van... Meg ne írjam?? A hozzászólás módosítva: Nov 19, 2015
Meg az INDF, FSR-eket kell kiosztani, ha több is van belőle.
Sziasztok!
Már megint gondban vagyok. Egy egyszerű bemenet állapotváltozást figyelő megszakítási rutin összeomlasztja a programomat, ha jelek érkeznek a bemenetre. Ez a beállítás:
Ez pedig a megszakítási ciklus
Gyakorlatilag az encodernek csak az egyik ága van bekötve, és a programtól függően számol le, vagy fel. A program akkor is felborul, ha olyan rutinban van, ahol nem is érdekli a számláló. Bár a megszakítás olyankor is aktív.
Bár nem írta, de kizártnak tartom, hogy nem 18F-fel dolgozik.
A kérdéses kontroller PIC18F46K22.
Elsőre én is azt hittem, hogy esetleg a WREG-el van baj. Csakhogy akkor 1-1 helyen jöhetne be hiba. Tehát mondjuk képernyőfrissítés közben néhány pixel. Viszont a változóba mentett AD konverzió értékétől, a pozíciómentésig egy egész sor változót szétcsap, egészen lassú encoder forgás mellett is.
Szia!
A megszakítás alacsony vagy magas szintű? Esetleg 16-os módban van? Majdnem biztos, hogy a STATUS C bitje zavar be, mert más ugye nem változik a megszakítás ezen részletében. esetleg STATUS Z
Elvégeztem egy kisérletet.
A megszakítási rutin jelenleg ennyiből áll: MOVF PORTA,W BCF INTCON,0 RETFIE Gyakorlatilag a megszakítás nem csinál semmit, a program viszont ugyanúgy összeomlik
Probalj helyette
NOP NOP RETFIE Igy is osszeomlik?
Ha nem törlöm a kiváltó okot, nem fog működni a megszakítás.
Azért kipróbáltam amit írtál. Konkrétan be sem indult tőle a program.
Ja, tenyleg, ott az intcon. Szerintem jobban jarsz, ha nem szammal, hanem szimbolummal hivatkozol az xxxIF bitre.
De akkor probalj NOP bcf INTCON,0 RETFIE Ha igy is osszeomlik, akkor nem a megszakitas a ludas. Szimulator mit mutat? Ott sok kis disznosag ki szokott derulni, heveny homlokracsapasokat eloidezve )
Így is lefagy. A RABIF bitet csak azután lehet törölni, ha előtte beolvasom a B portot.
Szerintem bbalazs erre gondol:
Idézet: „Execute at least one instruction after reading or writing PORTB, then clear the flag bit, RBIF.”
Nos úgy fest, meg van a hiba.
A PIC-nek úgy néz ki, gyári hibás az árnyékregisztere. Elvégeztem a megszakitáskori mentéseket úgy, ahogy a PIC16-osoknál le van írva. Megszünt a hiba! Tehát nem végzi el a mentéseket. Pedig a 18-as szériának meg kellene tennie.
Azert nezz ra az adatlapban a retfie es a retfie fast kozotti kulonbsegre.
Segíts ki légyszives!
Nem is hallottam még a retfie fast-ról. Mi az? Angoltudás hiányában nem biztos, hogy megfelytem az adatlap alapján.
Ahogy az adatlap irja, az egyik esetben visszairja az arnyekregiszter tartalmat, a masikban nem (illetoleg csak korlatozott tartalmakat ir vissza es a WREG valamint a tobbi nem szerepel ott).
Tehat probald ki igy is, hogy a hagyomanyos elmenteseket kikommenteled es ezt beirod a vegere. Vagy retfie 1, ugyanazt jelenti. Az instructions set summary-ban ott van, szerintem nyelvtudas nelkul is ertheto. es megfejtem.
Ez működik.
De ez nem minden PIC-nél van így? Mert korábban ezzel a problémával még nem akadtam össze. Pedig párszor már használtam megszakítást.
Alapból, ha nem engedélyezed a magas és alacsony prioritást, akkor 16-os módban fut a megszakítás
ezt az RCON IPEN bitje határozza meg. A magas prioritású megszakítást retfie fast utasítással kell lezárni. Az alacsonyszintűnél, minden regisztert el kell menteni és visszaállítani (W BSR STATUS) A hozzászólás módosítva: Nov 21, 2015
Öntsünk tiszta vizet a poharakba!
18F kontrollereken: - Mindkét (magas és alacsony) szintű megszakítás a "Fast Register Stack" -re menti a WREG, STATUS és BSR regiszterek tartalmát. Ez a stack egy mélységű. - A call XXX, 1 (call XXX, fast) is ebbe a stack -be menti ezeket a regisztereket. - A return fast és a retfie fast a stack - re mentett értékeket visszaállítja. Miért csak a magas szinten használható ez a mentés? - Az alacsony szintű megszakítás kiszolgálását a magas szintű kérérs elfogadása felbeszakíthatja és az elfogadás pillanatában történő mentés elrontja az alacsony szint által mentett értékeket. Ha biztosítjuk, hogy a magas szintű kérés mindig tiltott, amikor az alacsony szintű kéréseket használjuk, mindkét kiszolgáló használhatja ezt a mentést. Továbbá, ha nem használjuk a megszakítási rendszert, a gyors call (call xxx,1) is használható. Amennyiben a megszakítási rendszert használjuk, a gyors call (call xxx,1) használni nem szabad. Melyik megszakítást milyen retfie utasítással zárjuk? - Annak a megszakítás kiszolgálónak, amelyiknél használjuk a gyors mentést retfie fast (retfie 1) utasítással kell végződnie. Általában a magas szintű kérését. - Gyors call -al hívott eljárásnak return fast (return 1) utasítással kell visszatérnie, hogy a mentést visszaállítsa. A mentés és a prioritásos megszakítás kezelés összefügg? - A mentés a 16F kompatibilis (egyszintű) megszakítás kezelés esetén is működik. A kiszolgálóból a retfie fast (retfie 1) utasítással térjünk vissza. Milyen regisztereket kell menteni? - Minden olyan regiszter tartalmát menteni kell, amit "kényszerűségből" megváltoztat a megszakítási rutin. Kényszerűségből alatt azt értem, hogy a szándékos változtatások elvégzése miatt egyes regisztereket fel kell használni (utasításkésztel miatt, indirekt elérés miatt) illetve a változtatás során értékül megváltozhat (pl. STATUS). Pl. Ha a megszakítás kezelés tartalmaz szorzást (mul??), akkor a PRODL és PRODH regiszterek is mentendők... A hozzászólás módosítva: Nov 21, 2015
Cak a 18C és 18F típusokon működik így.
Figyelmesen el kellene olvasni az adatlapot! Esetleg egy régebben készült típuséban részletesebb lehet a leírás, hiszen akkor sokaknak új volt a megoldás. Pl. 18C242, 18F252, stb.
Szia!
Nagyon köszönöm minden eddigi segítsségedet, és remélem, a jövőben is számíthatok rá. De megkérnélek, mielőtt sokadjára újra rámpirítassz, Idézet: „Figyelmesen el kellene olvasni az adatlapot!” értsd meg, hogy úgy az én angol tudásom, mint sokaké még itt a forumon nem perfekt műszaki nyelvtudás. Többnyire alig valamivel tudunk többet kihámozni az adatlapból, mint ami a képek és ábrák nézegetésével átjön. Ezért kérdezünk folyton, nem lustaságból. Például abból az anyagból, amit nekem küldtél, Bővebben: Link még mindíg nem tudtam rájönni, hogyha egy 24 bites bináris számot akarok 0-9-ig terjedő számjegyekké konvertálni, abból miért csak 4 db számjegy lessz. Tudom, nagy kérés, de ha ilyen esetben magyarul kommentelnél, hihetetlenül nagy segítsség lenne. Fáradozásodat eddig is, és előre is köszönöm. Üdv: János
Packed BCD kódolás egy byte -ban két digitet tárol. A rutin tehát a 24 bites bináris számot 8 digites BCD számmá alakítja.
Próbált már valaki pl. törökül kommentezett programban eligazodni. Nem olyan nehéz ez a szöveg. "During an interrupt, the return PC value is saved on the stack. Additionally, the WREG, STATUS and BSR registers are saved on the fast return stack." A hozzászólás módosítva: Nov 22, 2015
|
Bejelentkezés
Hirdetés |