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   12 / 32
(#) sonajkniz hozzászólása Feb 25, 2016 /
 
Megszokhattam volna már, hogy ha valami értelmetlen működést produkál, többnyire én vagyok a hülye.

Ez helyett:
MOVLW B'00000110'
MOVWF T2CON
ez volt beírva:
MOVLB B'00000110'
MOVWF T2CON
(#) bbalazs_ válasza sonajkniz hozzászólására (») Feb 25, 2016 / 1
 
En ezert mar nagyon regen keszitettem egy sima MOV makrot, ami

mov macro hova, mit
movlw mit
movf hova
endm

ennyit csinal osszesen. Azert MACROassembler a fordito. Nagyon sok munkat megkonnyit, pontosan tudod, hogy mit fordit, nem kotelezo hasznalni sem, ha valami kulonleges modot akarsz (pl. ugyanazt az erteket harom kulonbozo helyre akarod beirni, akkor a rendes asm utasitasokat hasznalod, nem pazarlod a helyet).

Ja, es a kovetkezo hiba majd az lesz, hogy nem tudod, hogy erteket vagy cimet toltesz be
ha valami nevre hivatkozol. Az assembly szepsegei.
A hozzászólás módosítva: Feb 25, 2016
(#) kissi válasza bbalazs_ hozzászólására (») Feb 25, 2016 /
 
Idézet:
„movf hova”

Helyett inkább movwf hova !
(#) sonajkniz válasza bbalazs_ hozzászólására (») Feb 25, 2016 /
 
Kipróbáltam.

Ez marha jó! Köszönöm!
(#) sonajkniz válasza bbalazs_ hozzászólására (») Feb 25, 2016 /
 
Még így, együtt is működnek:
  1. MOV MACRO HOVA,MIT
  2.     MOVLW   MIT
  3.     MOVWF   HOVA
  4.     ENDM
  5.    
  6. MOVB MACRO HOVA,MIT
  7.     MOVLB   0F
  8.     MOVLW   MIT
  9.     MOVWF   HOVA,BANKED
  10.     MOVLB   0
  11.     ENDM
(#) bbalazs_ válasza kissi hozzászólására (») Feb 25, 2016 /
 
Oh, teljesen igazad van!
Meg szerencse, hogy sonajkniz jol ertette.
(#) ktamas66 válasza sonajkniz hozzászólására (») Feb 25, 2016 / 1
 
Ezekkel a bankváltásos makrokkal észnél kell lenni. Szerintem inkább:
MOVLW MIT
MOVFF WREG, HOVA
(#) sonajkniz válasza ktamas66 hozzászólására (») Feb 25, 2016 /
 
Ezt kifejtenéd bővebben?
(#) ktamas66 válasza sonajkniz hozzászólására (») Feb 25, 2016 / 1
 
A MOVFF egyik regisztert másolja a másikba és bankfüggetlen (cserébe két utasítás ciklusig tart). Tehát a MIT beteszem a W-be, majd kiírom a HOVÁ-ba ( a WREG a W regiszter neve, ha megnézed a memória kiosztását FE8h).
A változókat az ember megpróbálja olyan bankokba csoportosítani, ahol egyszerre kellenek, hogy minél kevesebbet kelljen váltani, ezét figyelni kell az ilyen makrokat mikor használja az ember, mivel mindig a 0 bankra vált.
A hozzászólás módosítva: Feb 25, 2016
(#) sonajkniz válasza ktamas66 hozzászólására (») Feb 26, 2016 /
 
Köszönöm a választ.
Jó ötlet.
(#) sonajkniz hozzászólása Ápr 5, 2016 /
 
Sziasztok!

Az lenne a kérdésem, lehetséges olyasmi egy PIC esetében, hogy 16MHz-n egy kimenet ki-, vagy bekapcsolása néha nem hajtódik végre?
A jelenség a következő:
Van két encoderes léptetőmotor. Az encoderek gyárilag vannak beépítve a motorokba. Ergo, azonos elfordulásra, azonos jelmennyiségű jel jön az encoderekből. A két encoder jelét egy PIC12F1840-es dolgozza fel és továbbítja egy végtelenül leegyszerűsített egyetlen jelként két vezetéken. A probléma az, hogy ha pl: encoderenként kellene kapjak 1000 jelet, akkor az egyiken 940, a másikon 1060 jel keletkezik. Ami arra utal, hogy ami az egyikből hiányzik, azt a másik kapja meg. Az eltérés ahoz kevés, hogy programhiba okozhassa. Ha a feltevésem helytálló, hogyan védhető ez ki?
Mellékelem a küldő rutinokat.
  1. ;1-es encoder előre lépett 1-et.
  2.     MOVLB   0x2
  3.     BSF     LATA,0      
  4.     MOVLW   D'8'
  5.     DECFSZ  WREG
  6.     GOTO    $-1
  7.     BSF     LATA,1
  8.     NOP
  9.     BCF     LATA,0
  10.     MOVLW   D'8'
  11.     DECFSZ  WREG
  12.     GOTO    $-1
  13.     BCF     LATA,1
  14.     GOTO    KILEPES
  15.          ;1-es encoder hátra lépett 1-et.
  16.     MOVLB   0x2
  17.     BSF     LATA,0
  18.     MOVLW   D'8'
  19.     DECFSZ  WREG
  20.     GOTO    $-1
  21.     BCF     LATA,0
  22.     GOTO    KILEPES
  23.      ;2-es encoder előre lépett 1-et.
  24.     MOVLB   0x2
  25.     BSF     LATA,1
  26.     NOP
  27.     BSF     LATA,0
  28.     MOVLW   D'8'
  29.     DECFSZ  WREG
  30.     GOTO    $-1
  31.     BCF     LATA,0
  32.     MOVLW   D'8'
  33.     DECFSZ  WREG
  34.     GOTO    $-1
  35.     BCF     LATA,1
  36.     GOTO    KILEPES    
  37.      ;2-es encoder hátra lépett 1-et.
  38.     MOVLB   0x2
  39.     BSF     LATA,1
  40.     NOP
  41.     BSF     LATA,0
  42.     MOVLW   D'8'
  43.     DECFSZ  WREG
  44.     GOTO    $-1
  45.     BCF     LATA,0
  46.     BCF     LATA,1
  47.     GOTO    KILEPES
(#) Zsora válasza sonajkniz hozzászólására (») Ápr 5, 2016 /
 
Az enkóderek kimenete Grey kódolású. A rajzon nem az van.
(#) ktamas66 válasza sonajkniz hozzászólására (») Ápr 5, 2016 /
 
Mivel nem látjuk a enkóder bemeneti részét, bennem inkább az merült fel, hogy a motor fordulatszám és az enkóder osztása alapján biztos, hogy elég gyors lesz így a program?
(#) sonajkniz válasza Zsora hozzászólására (») Ápr 5, 2016 /
 
A rajzon a program alapján létrehozott kód van. Ezt továbbítja a PIC12-es. Egy ezres felbontású encoderről összesen 4000 jel vehető le. De nekem csak 500-ra van szükségem. Azaz csak minden második teljes lépés után küld tovább jelet.

ktamas66! Elég necces, mert a két encoder jelsebessége a feldolgozáskori utasításokkal csaknem 2,5 millió utasításciklus másodpercenként. Mindez megszakításban. De mivel a program maga csak egy GOTO $-0 utasításból áll, azaz innen megy megszakításba, és ide is tér vissza, így a 16MHz-be belefér.
(#) ktamas66 válasza sonajkniz hozzászólására (») Ápr 5, 2016 /
 
De ha ezek a késleltetések a megszakításban vannak, az nem okozhatja az enkóder jeleinek hibás felismerését (bár nem tudom, az hogyan történik)?
(#) sonajkniz válasza ktamas66 hozzászólására (») Ápr 5, 2016 /
 
Bocsánat, az előbb a teljes lefutást szoroztam a teljes impulzusszámmal. Csak 1800000 utasítássor.
A két encoder A és B ága egyaránt IOC bemenetre fut. A megszakítás kezdetén megnézem, melyik bemenet jelzett. Azután azt vizsgálom, magas vagy alacsony jelzés jött-e. Azután megnézem, hogy a párja magas, vagy alacsony. Ez alapján dönt a program, hogy az adott encoder felfelé, vagy lefelé számoljon. Ez a leghosszabb részen, a számolással együtt is csak 26 utasítássor. A számláló felfelé számoláskor minden 8. lépésnél nulláz, visszafelé pedig ha elérte a 0-át, 7-et ír a számlálóba. minden lépésfordításnál küldi el az adatot, ami 88 utasításhosszt vesz igénybe. Mivel két encoder van, így kétszeres az adatmennyiség. A motorok percenkénti fordulata 200.
(#) ktamas66 válasza sonajkniz hozzászólására (») Ápr 5, 2016 /
 
Könnyű lenne azt mondani, hogy értem . Én minden esetre végiggondolnám a az IT kezelését. A konkurens IT-k kezelésének egyik problémája a "Interrupt Latency". Ez azt jelenti, hogy mivel az IT nem azonnal hajtódik végre (alapban 3-4 instrukciós ciklus, de mivel a főprogramodban a GOTO 2 ciklusos, akár 5-is lehet), lehetséges, hogy mire a programod az IT-ben megvizsgálja melyik jel okozta az IT-t, más egy másik jel is be lehet billenve, így esetleg helytelen eredmény születhet.
(#) sonajkniz válasza ktamas66 hozzászólására (») Ápr 5, 2016 /
 
Erre gondoltam én is. Azért is matekoztam vele annyit. De egy ciklusidőn belül max. a másik encodertől jöhet be jel, az meg nem probléma, ha egy körrel később hajtódik végre. Ugyanazon encodertől érkező két jel között elég nagy a szünet. 300 utasításciklus lemehet közte. Abba pedig belefér az előző jel feldolgozása, plusz a másik encodertől időközben bejött jel feldolgozása, még ha mindkettő épp adattovábbítási ciklusba volt is, akkor is rövidebb 300 sornál. Tehát elvileg nem maradhat le a jelről. Mint ahogy nem is marad le, mert ha encoderenként 1000 jelnek kell lennie, a végeredményben ott a 2000 jel, csak nem a helyén. Ezért kérdeztem, hogy előfordulhat-e olyan, hogy nem vált egy kimenet, vagy hogy egy bemenet érzékelése a vevő oldalon hibázik?
(#) Hp41C válasza sonajkniz hozzászólására (») Ápr 6, 2016 /
 
Idézet:
„A két encoder A és B ága egyaránt IOC bemenetre fut.”

Optikai vagy mechanikus az encoder? Ha mechanikus, az érintkezői prellegnek.
(#) sonajkniz válasza Hp41C hozzászólására (») Ápr 6, 2016 /
 
Ipari, optikai encoderek.
(#) Peter65 válasza sonajkniz hozzászólására (») Ápr 6, 2016 /
 
Szia!
Régebben én is készítettem enkóder jelfeldolgozó programot. Szerintem nem jó írány a megszakításos kezelés. Én más utat jártam, abból kiindulva, hogy az enkóder A és B jele négy különböző állapotban lehet, és ezek követési rendje részben kötött. Így az aktuális állapotnak megfelelő programrészlethez ugrottam. Ez a jittereket is normálisan lekezelte. Ez az irányok figyelembevételével 8 kis programrészletet igényelt. Ha a bemeneti állapotok változása abnormális volt (pl.: AB 00 állapot nem válthat AB 11 állapotra), akkor hibát jelzett.
Az állapotok beolvasást egyrészt Schmitt-triggeres-re kialakított komparátorokkal, illetve 4-szeres digitális szűréssel igyekeztem biztonságossá tenni. Ha igazak a régi jegyzeteim, akkor ez egy PIC16F636-on 50kHz-es élváltásokat még éppen észrevett, azaz az impulzusok frekvenciája max. kb. 10kHz lehetett. A feldolgozása 4x-es, külön kimeneten az előre, külön kimeneten a hátra impulzusok.
Ez csak 1db jeladó feldolgozását tudta, ha 2db kell, akkor elvileg 64 hasonló programrészlet kellene.
Sajnos régen még olyan "okos" voltam, hogy kevés kommentet írtam, de azért csatolom az asm fájl, hátha segít.

enkod.asm.asm
    
(#) sonajkniz válasza Peter65 hozzászólására (») Ápr 6, 2016 /
 
Igazán kedves vagy, de mint írtam, nem az encoderek jelfeldolgozásával van a gond.
Eredetileg egy PIC csinált mindent. A billentyűzeten bevitt célt a kijelzőn megjelenítette, az encoderek helyzetéhez képest azonosította, elindította a motorokat, a célnál megállt, és kiírta, hogy
"Méreten" Hibátlanul működött. De a főnökömnek ez így nem felelt meg. Ő a következőt akarta látni a kijelzőn:" Cél: 436,4 mm" , " Pos: 320,0 mm" és azt kérte, a számok pörögjenek a haladásnak megfelelően, hogy látványos legyen. Na ezt már nem bírta a PIC tüdővel. Ehez már külső órajel kellett volna, legalább 40MHz-vel. Ekkor viszont a kijelzőkezelés lesz macerás. Mivel, mint írtam, nem volt szükségem a teljes jelmennyiségre, ezért ketté vettem a feldolgozást. Így valahol az adatátadásban kell legyen a hiba. Ha a hiba mértéke nagy lenne, valószínűleg már megtaláltam volna. Pont az a baj, hogy az eltérés túl kicsi ahhoz, hogy egyértelműen ki lehessen jelenteni, a szoftverrel van a baj. Ráadásul szimmetrikus. Azaz amennyivel az egyik kevesebbet számol, annyival számol a másik többet.
(#) ktamas66 válasza sonajkniz hozzászólására (») Ápr 6, 2016 /
 
A leírtakhoz hasonló probléma a fogadó részben is lehet.
(#) sonajkniz válasza ktamas66 hozzászólására (») Ápr 6, 2016 /
 
Ebben?
Hol? Ennél még egy ledvillogtatás is bonyolultabb.
  1. ;-----------------------------Megszakítás---------------------------------------
  2. MEGSZAKITAS
  3.     NOP
  4.     MOVWF   W_TAROLAS           ;Letárolja WREG értékét.    
  5.     BTFSS   INTCON,INT0IF       ;El?sz?r ellen?rizi a megszakítást kiváltó
  6.     GOTO    MEGSZAKITAS2        ;okot. Ha ez az INT0, akkor el?sz?r töröli
  7.     BCF     INTCON,INT0IF       ;a kiváltó okot. Ezután megvizsgálja az
  8.     BTFSC   PORTB,1             ;adatbemenetet, és az állapotának megfelel?en
  9.     GOTO    ENCODER2            ;ugrik encoder 1-re, vagy encoder 2-re.
  10.     GOTO    ENCODER1
  11. MEGSZAKITAS2  
  12.     NOP
  13.     BTFSC   PIR2,2             ;Ha a tápfesz lecsökken, pozíció mentésre ugrik,
  14.     GOTO    POZICIO_MENTESE    ;leállítja az orsókat és elmenti a pozíciókat.
  15. ENCODER1
  16.     NOP    
  17.     BTFSC   PORTB,0            ;Várakozás  az adásjel megszünésére.
  18.     GOTO    $-2
  19.     NOP                        ;Rövid szünet.
  20.     NOP
  21.     BTFSS   PORTB,1            ;Megvizsgáljuk PORTB 1-es bitjét. Ha 0, ugrás
  22.     GOTO    ENCODER1_MINUSZ    ;kivonásra, ha 1, tovább hozzáadásra
  23. ENCODER1_PLUSSZ


  1. ENCODER2
  2.     NOP    
  3.     BTFSC   PORTB,0            ;Várakozás  az adásjel megszünésére.
  4.     GOTO    $-2
  5.     NOP                        ;Rövid szünet.
  6.     NOP
  7.     BTFSS   PORTB,1            ;Megvizsgáljuk PORTB 1-es bitjét. Ha 0, ugrás
  8.     GOTO    ENCODER2_MINUSZ    ;kivonásra, ha 1, tovább hozzáadásra
  9. ENCODER2_PLUSSZ
(#) ktamas66 válasza sonajkniz hozzászólására (») Ápr 6, 2016 /
 
Első ránézésre nem tűnik rossznak, lehet valami hazárd jelenséged van. Én megnövelném a kezdő impulzusok közötti időt (lehet kevés az 1 NOP), akár a időzítés rovására. De az is lehet, hogy pont fordítva van (nem tudom a másik PIC-nek milyen az órajele), mire a 8. sorig eljut letelik a másik PIC időzítése, vagy csak nagyon a határon van, és néha hibázik. Nem tudom ott a NOP-nak mi a szerepe, a W-t automatikusan menti az IT, a kiváltó ok törlése is mehet későbbre.
(#) sonajkniz válasza ktamas66 hozzászólására (») Ápr 6, 2016 /
 
Kaptam olyan infót, hogy a tris regiszter hajlamos elmászkálni. még nem próbáltam ki, de ha így van, az magyarázat lehet. Illetve, még az jutott eszembe, nem lehet áramköri probléma?
A mellékelt képen körberajzoltam a két PIC összeköttetését. Nem itt van probléma? Esetleg kellene közé ellenállás?

Névtelen.jpg
    
(#) Bell válasza sonajkniz hozzászólására (») Ápr 6, 2016 /
 
Bocsánat, hogy belekotyogok, de egy megszakításban bármilyen várakozás illetlenségnek tűnik, természetes következménye az adatvesztés.
  1. ENCODER1
  2.     NOP  
  3.     BTFSC   PORTB,0            ;Várakozás  az adásjel megszűnésére.
  4.     GOTO    $-2
(#) ktamas66 válasza sonajkniz hozzászólására (») Ápr 7, 2016 /
 
Ha a TRIS elállítódik mi teszi helyre a következő impulzusnál. A gyanú az első impulzus kezelésére terelődik, főleg ha a le/fel számolásnál már nincs probléma. Vagy egyenlőre csak egy irányba mozog, és úgy véti a hibát?
A hozzászólás módosítva: Ápr 7, 2016
(#) nemgyuri válasza sonajkniz hozzászólására (») Ápr 7, 2016 /
 
Szia! Ez a 1060 - 940 jel nekem azt mondja, hogy az enkóderek jelfeldolgozásával van gond. (Pl. közel egyidőben jön jel az 1. és 2. enkóderből és ekkor a másik enkóderhez tartozó számlálót lépteted.) A jelvezetékek "tiszta" jeleket adnak a PIC bemenetére? Egy kis RC tag segíthet.
(#) sonajkniz válasza nemgyuri hozzászólására (») Ápr 7, 2016 /
 
Az encoderek optocsatolókon át kapcsolódnak a PIC-hez. Készítettem egy más fajta átviteli rutint. Ez adott időnként küldi az adatokat, hasonló megoldással, mint az I2C. Ebben az esetben nem keletkezett eltérés, viszont a fogadó oldalon négyszer több megszakítás generálódott. Mivel ezek a megszakítások akkor is mennek, ha épp nem lenne rájuk szükség, többször felborult már a program. Amit leginkább nem értek, mitől átvitelbiztosabb a sok jel. Mint a kevés.
Következő: »»   12 / 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