Fórum témák

» Több friss téma
Fórum » PIC programozás assemblyben
 
Témaindító: sonajkniz, idő: Máj 30, 2015
Témakörök:
Lapozás: OK   9 / 32
(#) ktamas66 válasza sonajkniz hozzászólására (») Nov 14, 2015 / 1
 
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.
(#) sonajkniz válasza ktamas66 hozzászólására (») Nov 14, 2015 /
 
Ez is bejött!
Piszkosul bezavartak egymásnak a bemenetek.
Most már minden szuper.
Köszi mindenkinek a segítsséget!
(#) sonajkniz hozzászólása Nov 19, 2015 /
 
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?
(#) Hp41C válasza sonajkniz hozzászólására (») Nov 19, 2015 /
 
PIC Micro Controller ASM Language Routine Library
Sajnos most elérhetetlennek tűnik...
  1. ; Convert 24 bit binary number in BIN_upper:BIN_high:BIN_low
  2. ; to a 8 digit, 32 bit packed BCD number in BCD4:BCD3:BCD2:BCD
  3.  
  4. BIN2BCD24                                       ; 24 bit binary to BCD converter
  5.                 movlw      .24
  6.                 movwf      loopcounter
  7.                 clrf       BCD                  ; Init BCD number
  8.                 clrf       BCD2
  9.                 clrf       BCD3
  10.                 clrf       BCD4
  11.                 clrc
  12.                 goto    BIN2BC2
  13.  
  14. BIN2L
  15.                 movlw   BCD
  16.                 movwf   FSR
  17. BCDADJ
  18.                 movlw   0x33                    ; Prepare to correct both nibbles
  19.                 addwf   INDF,f
  20.                 btfsc   INDF,3
  21.                 andlw   0xF0                    ; Correct only upper nibble
  22.                 btfsc   INDF,7
  23.                 andlw   0x0F                    ; Correct only lower nibble
  24.                 subwf   INDF,f
  25.                 incf    FSR,f
  26.                 movlw   BCD4+1
  27.                 xorwf   FSR,w
  28.                 btfssf  STATUS,Z                ; Do correction for all locations
  29.                 goto    BCDADJ
  30.  
  31. BIN2BC2
  32.                 rlf     BIN_low,f               ; Shift Low   byte
  33.                 rlf     BIN_high,f      ; Shift High  byte
  34.                 rlf     BIN_upper,f     ; Shift Upper byte
  35.                 rlf     BCD,f           ; Shift BCD   bytes
  36.                 rlf     BCD2,f
  37.                 rlf     BCD3,f
  38.                 rlf     BCD4,f
  39.                 decfsz  loopcounter,f   ; Do the conversion for all bits
  40.                 goto      BIN2L
  41.                 return
A hozzászólás módosítva: Nov 19, 2015
(#) sonajkniz válasza Hp41C hozzászólására (») 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.
(#) Hp41C válasza sonajkniz hozzászólására (») Nov 19, 2015 /
 
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
(#) ktamas66 válasza sonajkniz hozzászólására (») Nov 19, 2015 /
 
Meg az INDF, FSR-eket kell kiosztani, ha több is van belőle.
(#) sonajkniz hozzászólása Nov 21, 2015 /
 
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:
  1. MOVLW   B'11001000'
  2.     MOVWF   INTCON
  3.     MOVLW   B'00000001'
  4.     MOVWF   INTCON2
  5.     MOVLW   B'00010000'
  6.     MOVWF   IOCB

Ez pedig a megszakítási ciklus
  1. ENCODER_CONTROL
  2.     MOVF    PORTB,W
  3.     BCF     INTCON,0
  4.     BTFSC   TANIT_GYART
  5.     GOTO    E_C2
  6.     DECF    SZAMLALO
  7.     BTFSC   STATUS,C
  8.     RETFIE
  9.     DECF    SZAMLALO+1
  10.     BTFSC   STATUS,C
  11.     RETFIE
  12.     DECF    SZAMLALO+2
  13.     BTFSC   STATUS,C
  14.     RETFIE
  15.     BCF     KINYIT
  16.     BCF     LEZAR
  17.     BCF     KUSZAS
  18.     BCF     ELORE                ;Minden kimenetet kikapcsol és töröl.
  19.     BCF     HATRA
  20.     BCF     GTP
  21.     CLRF    VREFCON2
  22.     BCF     UTEM_MEHET           ;Törli ütemadatokat és ütem mehet-et.
  23.     BCF     UTEMADATOK
  24.     RETFIE
  25. E_C2
  26.     INCFSZ  SZAMLALO
  27.     RETFIE
  28.     INCFSZ  SZAMLALO+1
  29.     RETFIE
  30.     INCF    SZAMLALO+2
  31.     RETFIE

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.
(#) Hp41C válasza sonajkniz hozzászólására (») Nov 21, 2015 /
 
(#) Pali79 válasza Hp41C hozzászólására (») Nov 21, 2015 /
 
Bár nem írta, de kizártnak tartom, hogy nem 18F-fel dolgozik.
(#) sonajkniz válasza Hp41C hozzászólására (») Nov 21, 2015 /
 
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.
(#) foxi63 válasza sonajkniz hozzászólására (») Nov 21, 2015 /
 
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
(#) sonajkniz válasza foxi63 hozzászólására (») Nov 21, 2015 /
 
Mit értessz 16-os mód alatt?
(#) sonajkniz válasza sonajkniz hozzászólására (») Nov 21, 2015 /
 
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
(#) bbalazs_ válasza sonajkniz hozzászólására (») Nov 21, 2015 /
 
Probalj helyette
NOP
NOP
RETFIE
Igy is osszeomlik?
(#) sonajkniz válasza bbalazs_ hozzászólására (») Nov 21, 2015 /
 
Ha nem törlöm a kiváltó okot, nem fog működni a megszakítás.
(#) sonajkniz válasza bbalazs_ hozzászólására (») Nov 21, 2015 /
 
Azért kipróbáltam amit írtál. Konkrétan be sem indult tőle a program.
(#) bbalazs_ válasza sonajkniz hozzászólására (») Nov 21, 2015 /
 
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 )
(#) sonajkniz válasza bbalazs_ hozzászólására (») Nov 21, 2015 /
 
Így is lefagy. A RABIF bitet csak azután lehet törölni, ha előtte beolvasom a B portot.
(#) ktamas66 válasza sonajkniz hozzászólására (») Nov 21, 2015 /
 
Szerintem bbalazs erre gondol:
Idézet:
„Execute at least one instruction after reading or
writing PORTB, then clear the flag bit, RBIF.”
(#) sonajkniz válasza ktamas66 hozzászólására (») Nov 21, 2015 /
 
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.
(#) bbalazs_ válasza sonajkniz hozzászólására (») Nov 21, 2015 /
 
Azert nezz ra az adatlapban a retfie es a retfie fast kozotti kulonbsegre.
(#) sonajkniz válasza bbalazs_ hozzászólására (») Nov 21, 2015 /
 
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.
(#) bbalazs_ válasza sonajkniz hozzászólására (») Nov 21, 2015 /
 
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.
(#) sonajkniz válasza bbalazs_ hozzászólására (») Nov 21, 2015 /
 
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.
(#) foxi63 válasza sonajkniz hozzászólására (») Nov 21, 2015 /
 
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
(#) Hp41C válasza foxi63 hozzászólására (») 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
(#) Hp41C válasza sonajkniz hozzászólására (») 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.
(#) sonajkniz válasza Hp41C hozzászólására (») Nov 22, 2015 /
 
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
(#) Hp41C válasza sonajkniz hozzászólására (») Nov 22, 2015 /
 
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
Következő: »»   9 / 32
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