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   13 / 32
(#) nemgyuri válasza sonajkniz hozzászólására (») Ápr 7, 2016 /
 
Az encoder A és B jelét ugyanazzal a rutinnal kezelted? (2048-as encoderről PIC16F690-el 8MHz-es órajellel hajtottam, miközben 0,1 másodpercenként kérdezte le a master I2C-n. Én is ki tudtam akasztani, de csak úgy, hogy kézzel jól megpörgettem a tengelyt. Ja és 1 encoder 1 PIC összeállítással a megszakításban csak az encoder kezelés volt!)
(#) sonajkniz válasza nemgyuri hozzászólására (») Ápr 7, 2016 /
 
Nálam kicsit nagyobb a jelsűrűség. Két encodert kezel le a PIC12-es 16MHz-n. Amikor a folyamatos adatátvitelre tettem 150usecenként küldte az adatot 4 biten. Azaz 90 usec szünet után 4 meszakitás kb 15 usec ütemben. Az erederi verzióban, ahol a működés stabil, viszont hibás az adat, kb 70 usecenként küld, de gyakorlatilag csak egy biten. Tehát korántsem terheli úgy a fogadóoldalt, viszont mégis hibázik.
(#) nemgyuri válasza sonajkniz hozzászólására (») Ápr 7, 2016 /
 
Számlálást a PIC12...-es végzi? (A feltett programrészletedből ezt nem látom.) Én legalább 3 byte-os számlálóba írnám az aktuális értéket és azt küldeném át...
(#) sonajkniz válasza nemgyuri hozzászólására (») Ápr 7, 2016 /
 
A PIC 12-es egy előszámlálást végez, mert nincs szükség a teljes felbontásra. A teljes számlálást nem bízhatom rá, plussz adatküldés, mert a motorokat is vele kellene akkor működtetni. Ehez egyrészt kevés a lábszám, de ennél nagyobb problémát jelentene, hogy legalább 32 MHz-n kellene járatni, viszont 8MHz-n tudom megfelelően szabályozni a PWM jelet.
(#) nemgyuri válasza sonajkniz hozzászólására (») Ápr 10, 2016 /
 
Megnéztem még egyszer a megszakítási rutinodat. Nekem túl egyszerűnek tűnik, hogy csak a PORTB,1-től teszed függővé, hogy melyik encoder lépett. Szerintem a változást kell figyelembe venni. Bármelyik encoder okozta a is megszakítást, mindkettőnél meg kell vizsgálni, hogy volt-e változás. Bár meglehetősen zavaró, hogy 1000 inpulzusra pont 940 ill. 1060 a számított érték. (lehet, hogy ez csak szimulátoron ennyi?)
(#) sonajkniz válasza nemgyuri hozzászólására (») Ápr 10, 2016 /
 
Megszakítást csak a portb0 vált ki.
Ekkor kérdezi le portb1 állapotát. Így választja ki, melyik encoder jelzett. Amikor portb0-án megszűnik a jel, újra megnézi portb1-et. Ha 0, kivonás, ha1 hozzáadás.
Az eltérés mértéke nem mindíg ennyi, csak ez körüli. Viszont mindig szimmetrikus. Az értékek a készre szerelt eszköztől jöttek. Szimulátorral nem teszteltem. Kissé macerás.
(#) ktamas66 válasza sonajkniz hozzászólására (») Ápr 10, 2016 /
 
Ha a fogadó PIC tényleg csak 8MHz órajellel jár, akkor inkább valószínű, hogy a lefutó élről marad le néha. Próbáld minél előbbre hozni a feltételvizsgálatot.
(#) nemgyuri válasza sonajkniz hozzászólására (») Ápr 10, 2016 /
 
Ez a negszakítási rutin a PIC12F1840-ben van? Annak csak PORTA-ja van és minden láb kiválthat megszakítást - most futottam át a pdf-et, remélem jól értelmeztem.
(#) sonajkniz válasza nemgyuri hozzászólására (») Ápr 10, 2016 /
 
Nem. A PIC 12 fogadja a két encodertt és küldi a feldolgozott jelet tovább. A fogadó egy PIC18F26K22-es.
(#) sonajkniz válasza ktamas66 hozzászólására (») Ápr 10, 2016 /
 
Elvileg, ahogy számoltam, nem szabadna neki, de egy próbát mindenképpen megér. Ilyen szemszögből átnézve a rutint, van realitása. Kösz a tippet.
(#) sonajkniz hozzászólása Ápr 12, 2016 /
 
Kedves fórumtársak!

Szeretném megköszönni mindenkinek a segítségét!
Végre meglett a hiba. ktamas66 járt a legközelebb az igazsághoz, bár nem a lefutóélről, hanem az encoder azonosításáról maradt le néha. Ezekkel az időzítésekkel most már jól működik.
  1. ;1-es encoder el?re lépett 1-et.
  2.     MOVLB   0x2
  3.     BSF     LATA,0      
  4.     MOVLW   D'15'
  5.     DECFSZ  WREG
  6.     GOTO    $-1
  7.     BSF     LATA,1
  8.     BCF     LATA,0
  9.     MOVLW   D'10'
  10.     DECFSZ  WREG
  11.     GOTO    $-1
  12.     BCF     LATA,1
  13.     RETFIE

Ám ez felvet egy újabb kérdést. Miért tud a megszakítás esetenként akár 10 utasításciklust is késni?
Igaz, az adás 16MHz órajel mellett történik, a vétel pedig csak 8MHz-n, de attol még ennek a rutinnak az adás indulásának pillanatától eredetileg 12 utasításhossznyi ideje volt arra, hogy beazonosítsa az encodert. Elvi számítás alapján a 10.-nél kellett volna mérnie, amit 90%-ban meg is tett.
  1. ;-----------------------------Megszakítás---------------------------------------
  2. MEGSZAKITAS
  3.     MOVWF   W_TAROLAS           ;Letárolja WREG értékét.    
  4.     BTFSS   INTCON,INT0IF       ;El?sz?r ellen?rizi a megszakítást kiváltó
  5.     GOTO    MEGSZAKITAS2        ;okot. Ha ez az INT0, akkor el?sz?r töröli
  6.     BCF     INTCON,INT0IF       ;a kiváltó okot. Ezután megvizsgálja az
  7.     BTFSC   PORTB,1             ;adatbemenetet, és az állapotának megfelel?en
  8.     GOTO    ENCODER2            ;ugrik encoder 1-re, vagy encoder 2-re.
  9.     GOTO    ENCODER1

Ahogy növeltem az adási időt, úgy csökkent egyre lejjebb a hibaszázalék, de teljesen csak a vevő 21 utasításciklusnyi várakoztatása fölött szűnt meg. Mi okozhatja a megszakítás ilyen jelentős, esetenkénti szóródását?
(#) ktamas66 válasza sonajkniz hozzászólására (») Ápr 12, 2016 / 1
 
A réginél én úgy emlékszem azt számoltam, hogy a késleltetés 24 ciklus, a vevőben a legrosszabb esetben az interrupt latency 5 ciklus + a hatodik utasításra vizsgálod a portot, ez 11 ciklus és mivel az órajelek nem szinkronozottak még egy elkóricálhat. Tehát a fogadóban a 12 ciklus pont megegyezik az adó 24 ciklusával az órajelek miatt. A legegyszerűbb megoldás szerintem betenni az első utasításba egy MOVFF PORTB, VIZSGALANDO utasítást, legfeljebb ha másik megszakítás jött, akkor felesleges. Ezt később már vizsgálgathatod. Így az adó részben lecsökkentheted a késleltetést 5-6 ciklusra, csak le ne maradjon a program a második impulzusról.
(#) sonajkniz válasza ktamas66 hozzászólására (») Ápr 12, 2016 /
 
Ez egész tetszetős megoldás. Legközelebb alkalmazni fogom. Viszont ez sem biztos, hogy ki tudná küszöbőlni azt a nagy szóródást, amit tapasztaltam. Mivel amikor hibázott, nem egy-két órajel volt csupán az eltérés.
(#) ktamas66 válasza sonajkniz hozzászólására (») Ápr 12, 2016 /
 
Szerintem nem olyan rettenetes ez, lehet az órajelek pontatlanságából összejön. Én is írtam olyan programot, ahol azt gondoltam, hogy az adott esemény csak a véletlenek szerencsétlen összejátszásával jöhet létre, a valóságban pedig 2-5 percenként stabilan megjelent.
(#) nemgyuri hozzászólása Ápr 17, 2016 /
 
Sziasztok!
MPLAB V8.86-os szimulátoron a következőt tapasztaltam. Megszakításban ez van:
btfss INTCON,RBIF
goto Ki_ISR
; bcf INTCON,INTF
bcf INTCON,RBIF
Az RBIF bitet minden második futásnál törli csak!
Az INTF bitet az első megszakításnál 1-be löki, ez törölhető és többször nem állítja be.
Egyik jelenséget sem értem. MPLAB hiba lenne?
(#) nedudgi válasza nemgyuri hozzászólására (») Ápr 17, 2016 /
 
Melyik PIC?
Miért nem a 8.92 verziót használod?
(#) nemgyuri válasza nedudgi hozzászólására (») Ápr 17, 2016 /
 
16F886 van beállítva. (most ez a verzió van telepítve) 8.92 megbízhatóbb?
(#) Pali79 válasza nemgyuri hozzászólására (») Ápr 17, 2016 /
 
Ennyi infóból azt mondanám, hogy bankváltás gondja van szerintem, de biztosat csak a teljes forrásból lehet mondani.
(#) Hp41C válasza nemgyuri hozzászólására (») Ápr 17, 2016 /
 
Másod be ide a megszakítási rutint.
(#) nemgyuri válasza Hp41C hozzászólására (») Ápr 17, 2016 /
 
Itt a teljes megszakítási rutin:
('nedugi' figyeltem a bankváltásra. Egyébként minden bankban benne van az INTCON)
  1. ORG             0x004           ; interrupt vector location
  2.         movwf           w_temp          ; save off current W register contents
  3.         swapf           STATUS,w        ; move status register into W register
  4.         movwf           status_temp     ; save off contents of STATUS register
  5.         movf            PCLATH,w        ; move pclath register into W register
  6.         movwf           pclath_temp     ; save off contents of PCLATH register
  7. ;       clrf    PCLATH
  8. ;       movf    FSR,W           ;csak akkor kell, ha indirekt címzés is van használva
  9. ;       movwf   FSRsave         ;most nem kell!
  10.  
  11.         btfss   INTCON,RBIF
  12.         goto    Ki_ISR
  13. ;       bcf     INTCON,INTF
  14.         bcf     INTCON,RBIF     ; (~30 cycle max. 50 ha mindkettő házra lép)
  15.  
  16. Lépés:
  17. ;Tükör 0-3    0-1A    1-0B    2-2A    3-2B
  18. ;RBbem 0-3
  19.         movf    PORTB,W
  20.         movwf   TEMP
  21. Jel_1A: btfss   TEMP,0
  22.         goto    Jel_2A
  23.         btfss   TEMP,1
  24.         goto    Előre1
  25.         goto    Hátra1
  26.  
  27. Előre1:
  28.         incfsz  T1L,f           ;
  29.         goto    Jel_2A  ;
  30.         incfsz  T1M,f
  31.         goto    Jel_2A
  32.         incf    T1H,f
  33.         goto    Jel_2A
  34. Hátra1:
  35.         movlw   0x1     ;
  36.         subwf   T1L,f
  37.         btfss   STATUS,C
  38.         subwf   T1M,f
  39.         btfss   STATUS,C
  40.         subwf   T1H,f
  41.         goto    Jel_2A
  42.  
  43. Jel_2A: btfss   TEMP,2
  44.         goto    Lépés_vége
  45.         btfss   TEMP,3
  46.         goto    Előre2
  47.         goto    Hátra2
  48.  
  49. Előre2:
  50.         incfsz  T2L,f           ;
  51.         goto    Lépés_vége   ;
  52.         incfsz  T2M,f
  53.         goto    Lépés_vége
  54.         incf    T2H,f
  55.         goto    Lépés_vége
  56. Hátra2:
  57.         movlw   0x1     ;ez a leggyorsabb!
  58.         subwf   T2L,f
  59.         btfss   STATUS,C
  60.         subwf   T2M,f
  61.         btfss   STATUS,C
  62.         subwf   T2H,f
  63.         goto    Lépés_vége
  64. Lépés_vége:
  65.         goto    Ki_ISR
  66.  
  67.  
  68. Ki_ISR:
  69. ;       banksel FSRsave
  70. ;       movf    FSRsave,W
  71. ;       movwf   FSR    
  72.         movf            pclath_temp,w   ; retrieve copy of PCLATH register
  73.         movwf           PCLATH          ; restore pre-isr PCLATH register contents     
  74.         swapf           status_temp,w   ; retrieve copy of STATUS register
  75.         movwf           STATUS          ; restore pre-isr STATUS register contents
  76.         swapf           w_temp,f
  77.         swapf           w_temp,w        ; restore pre-isr W register contents
  78.         retfie                          ; return from interrupt
A hozzászólás módosítva: Ápr 17, 2016
(#) ktamas66 válasza nemgyuri hozzászólására (») Ápr 17, 2016 /
 
Nem bogarásztam teljesen végig az adatlapot, de ha ez IOC akar lenni én előbb olvasnám a portot, hogy újraírja a latchet és csak utána törölném az RBIF-et, nehogy kétszer jöjjön ugyanaz az IT..
(#) Hp41C válasza nemgyuri hozzászólására (») Ápr 17, 2016 /
 
Mégiscsak a bankváltásnál csöpög be az eső:
A fenti kódban a 11. sorra érve nem tudható a kiválasztott bank száma. Kellene ide (vagy előbbre, de a 3. sor után) egy bankváltás, hogy tisztább legyen a kép.
A bankváltás halogatható a 19. sor előttig, de oda már mindenképen a 0. bank kiválasztása kell. Hova is foglaltál helyet a TEMP, T1L, T1M, T1H, T2L, T2M, T2H változóknak?
(#) nemgyuri válasza Hp41C hozzászólására (») Ápr 17, 2016 /
 
Nincs benne bankváltás, az alapbeállítások után végig a 0-ás bankban van. Az MPLAB alsó sorában mindig lehet látni az aktuális bank számot is, ha váltana.
(#) nemgyuri válasza ktamas66 hozzászólására (») Ápr 17, 2016 /
 
Ennél a PIC-nél IOCB(0-7) van csak és ez az engedélyezés. Átraktam a PORT olvasása utánra az RBIF törlését és így jó lett. Neked van igazad! (Lehet, hogy az MPLAB egyformán kezeli a különböző PIC-ket? 16F886-ban nincs LAT....pdf szerint.)
(#) ktamas66 válasza nemgyuri hozzászólására (») Ápr 17, 2016 /
 
A port olvasása tárolja el azt a értéket, amihez képest a változást figyeli. Ha nem olvasod be, mindig a régi álláshoz képest nézi az eltérést, így újra megkapod az IT-t, amíg a port láb vissza nem áll a régi értékre.
A hozzászólás módosítva: Ápr 17, 2016
(#) nemgyuri válasza ktamas66 hozzászólására (») Ápr 17, 2016 /
 
Biztosan így van, de ezt most már a valóságban is tesztelni fogom, mert az első változatnál a számlálás sem volt jó a szimulátorban. Köszönöm a segítséget.
(#) sonajkniz hozzászólása Ápr 30, 2016 /
 
Sziasztok!

Hosszan szenvedtem egy DS1821-esel.
Végre sikerült működésre bírnom, csak azt nem tudom eldönteni, hogy az adott hőmérő, vagy az adatlap hibás.
Ezt írja az adatlap: (mellékletben a parancskészlet.)
Idézet:
„In one-shot mode the Start
Convert T [EEh] command initiates a single temperature conversion after which the DS1821 returns to a
low-power standby state. In this mode, the microprocessor can monitor the DONE bit in the
configuration register to determine when the conversion is complete: DONE = 0 ― conversion in
progress, DONE = 1 ― conversion complete. The DONE bit does not provide conversion status in
continuous conversion mode since measurements are constantly in progress (i.e., DONE will always be
0).”

Nekem ebből az jött le, hogy az [EE] parancs kiadása után, ki kell adni az [AC] parancsot, kiolvasni, megvizsgálni a 7. bitet. Ezt a bitvizsgálatot addig ismételni, míg a 7. bit 1-re vált. Ezután lehet kiadni az [AA] parancsot, és kiolvasni a hőfokot.
Csakhogy!
Az [EE] parancs kiadásától kezdődően semmilyen parancsot nem fogad el többet, és olvasni sem lehet. Ha várok egy másodpercet, resetelem, majd kiadom az [AA] parancsot, gond nélkül kiadja az előbb lemért hőmérsékleti értéket. Illetve minden egyéb parancsra is reagál.
Szerintetek mi a hibás? Az adatlap, a szenzor, vagy az értelmezésem?
(#) cua válasza sonajkniz hozzászólására (») Ápr 30, 2016 /
 
Teljesen jol mukodik
Amikor elkuldod 1shot-ba, akkor mer es aztan egybol alszik. Ha olvasni akarod elotte fel kell keltened.
Pont ezt csinaltad.
(#) sonajkniz válasza cua hozzászólására (») Ápr 30, 2016 /
 
Akkor viszont az adatlap ír hülyeséget, hogy vizsgáljam a status 7. bitjét.
(#) cua válasza sonajkniz hozzászólására (») Ápr 30, 2016 /
 
Megprobalom eloturni a kodot, hogy anno en hogy oldottam meg.
Következő: »»   13 / 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