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   15 / 32
(#) sonajkniz válasza nedudgi hozzászólására (») Okt 15, 2016 /
 
Ezt keresem órák óta. Csakhogy az eepromot csak inicializáláskor olvassa a program, és felülíródnak az adatok.
Ezt pedig csak reszeteléskor tehetné meg. Viszont van benne egy biztonsági ciklus is. Bekapcsoláskor a RAM egy byteja az inicializálás legvégén értékkel töltődik fel. Ezt a byteot ellenőrzi, még mielőtt az eepromot olvasná. Ha az érték jó, átugorja a folytatást. Ergo, törlődik ez a byte is.
(#) sonajkniz válasza sonajkniz hozzászólására (») Okt 16, 2016 /
 
Egyre rejtélyesebbek ezek a hibák.
Bakman-nak igaza volt. Egy hibás relékontaktus okozott egy olyan erős tűimpulzust a tápon, hogy újraindult a PIC.
Mi ebben a rejtély? Az, hogy a rendszerben 2 PIC dolgozik, és csak az egyik indult újra. Mindig ugyan az.
De a következő hiba még rejtélyesebb.
Van egy encoder, aminek a jeleit számolja a PIC. Egy matematikai műveletsort végez, aminek az eredményét a kijelzőre írja. Ha az eredmény 0, le kell kapcsoljon egy kimenetet.
Az encoder legyen "A". Az egyik fix érték legyen "B", a másik "C", a harmadik "D"
A műveletek:
A*B=E
E/C=F
D-F=eredmény
Egy-egy alkalommal az eredmény 0. De olyan rövid időre jön a hibás eredmény, hogy a kijelzőn nem jelenik meg. Viszont a kimenetet kikapcsolja. Az encoder értéke nem lehet rossz egy pillanatra sem, mivel akkor nem javulna többé meg.
Hol lehet a hiba?
(#) ktamas66 válasza sonajkniz hozzászólására (») Okt 16, 2016 /
 
Szerintem a programban . Nem tudom van-e megszakítás pl., amiben módosulhat valamelyik regiszter (FSR ha használod), esetleg egy félreváltott bank ...
(#) sonajkniz válasza ktamas66 hozzászólására (») Okt 16, 2016 /
 
Pillanatnyilag megkerültem a hibát. Csak akkor fogadom el a nullát, ha ötször egymás után beadja. (Negatívba nem tud lemenni)
(#) sonajkniz hozzászólása Okt 16, 2016 /
 
Na ez durva volt.
Egy hosszabb leírást írtam, hogy átláthatóbb legyen, és csak az eleje jelent meg.
(#) sonajkniz hozzászólása Okt 17, 2016 /
 
Na akkor nekifutok még egyszer.

Az érdekelne, hogy van-e annak realitása, hogy a hardveres szorzó, ha túl sokat dolgoztatják, tévedjen.
Vagy esetleg az osztórutinban nem következik be egy biteltolás. Az alábbi programrészlet másodpercenként kb 900-1000 alkalommal fut le az osztórutinnal együtt.
A tévedés 0,5- 5 másodperc között következik be. Ha a linealizációt kiiktatom, és az encoder jeleit figyelem közvetlenül, akkor nem hibázik.
  1. LINEALIZALAS
  2.     MOVFF   ENCU,MI20U       ;Encoder értékének átmásolása MI20 változóba
  3.     MOVFF   ENCH,MI20H
  4.     MOVFF   ENCL,MI20L
  5.     BTFSS   MI20U,7          ;Legmagasabb helyiértékű bit ellenőrzése. Ha 1, a
  6.     GOTO    LNL              ;teljes érték átfordítása.
  7.     COMF    MI20U
  8.     COMF    MI20H
  9.     COMF    MI20L
  10. LNL    
  11.     MOVF    MI2L,W           ;MI2 = Ymax.    Az encoder értékét (X) fel kell
  12.     MULWF   MI20L            ;szorozni az Ymax értékkel.
  13.     MOVFF   PRODL,OSZTANDO_L
  14.     MOVFF   PRODH,OSZTANDO_H
  15.     MOVF    MI2L,W
  16.     MULWF   MI20H
  17.     MOVFF   PRODH,OSZTANDO_U
  18.     MOVF    PRODL,W
  19.     ADDWF   OSZTANDO_H
  20.     CLRF    WREG
  21.     ADDWFC  OSZTANDO_U
  22.     MOVF    MI2L,W
  23.     MULWF   MI20U
  24.     MOVFF   PRODH,OSZTANDO_UH
  25.     MOVF    PRODL,W
  26.     ADDWF   OSZTANDO_U
  27.     CLRF    WREG
  28.     ADDWFC  OSZTANDO_UH
  29.     MOVF    MI2H,W
  30.     MULWF   MI20L
  31.     MOVF    PRODH,W
  32.     ADDWF   OSZTANDO_U
  33.     CLRF    WREG
  34.     ADDWFC  OSZTANDO_UH
  35.     MOVF    PRODL,W
  36.     ADDWF   OSZTANDO_H
  37.     CLRF    WREG
  38.     ADDWFC  OSZTANDO_U
  39.     ADDWFC  OSZTANDO_UH
  40.     MOVF    MI2H,W
  41.     MULWF   MI20H
  42.     MOVF    PRODH,W
  43.     ADDWF   OSZTANDO_UH
  44.     MOVF    PRODL,W
  45.     ADDWF   OSZTANDO_U
  46.     CLRF    WREG
  47.     ADDWFC  OSZTANDO_UH
  48.     MOVF    MI2H,W
  49.     MULWF   MI20U
  50.     MOVF    PRODL,W
  51.     ADDWF   OSZTANDO_UH
  52.     ;---------
  53.     CLRF    OSZTO_UH    
  54.     MOVFF   MI1U,OSZTO_U      ;MI1 = Xmax.
  55.     MOVFF   MI1H,OSZTO_H
  56.     MOVFF   MI1L,OSZTO_L    
  57.     CALL    OSZTAS            ;A kapott eredményt el kell osztani Xmax-al
  58.     ;---------
  59.     MOVFF   MI3U,MI21U        ;MI3 = Cél érték
  60.     MOVFF   MI3H,MI21H        ;Mivel a cél érték nem változhat meg, át kell
  61.     MOVFF   MI3L,MI21L        ;tenni egy másik változóba, hogy az osztás
  62.     MOVF    EREDMENY_L,W      ;eredményét ki lehessen belőle vonni.
  63.     SUBWF   MI21L,F
  64.     MOVF    EREDMENY_H,W
  65.     SUBWFB  MI21H,F
  66.     MOVF    EREDMENY_U,W      
  67.     SUBWFB  MI21U,F           ;Mivel a motornak mindíg van valamennyi túlfutása,
  68.     BTFSS   STATUS,C          ;ezért az eredmény le mehet negatívba.
  69.     RETURN                    ;Ilyenkor a kijelzendő érték nem kerül átírásra.
  70.     MOVFF   MI21U,MI24U       ;MI24 = kijelzendő érték.
  71.     MOVFF   MI21H,MI24H       ;A kivonás eredményét (ha nem negatív) át kell  
  72.     MOVFF   MI21L,MI24L       ;írni MI24-be.
  73.     RETURN
(#) Hp41C válasza sonajkniz hozzászólására (») Okt 17, 2016 /
 
Idézet:
„Az érdekelne, hogy van-e annak realitása, hogy a hardveres szorzó, ha túl sokat dolgoztatják, tévedjen.”

Kizárt, hacsak nem hibás a példányod.
Inkább az lehet a gond forrása, ha valamelyik megszakítási rutinod (esetleg mindegyik) is használja a PRODL : PRODH regisztereket és nincsenek mentve a megszakítási rutin(ok) elején és visszaállítva a vég(eike)n.
A hozzászólás módosítva: Okt 17, 2016
(#) sonajkniz válasza Hp41C hozzászólására (») Okt 17, 2016 /
 
Bár a megszakítási rutinon belül nincs szorzás művelet, azért kipróbáltam. Sőt, adtál egy ötletet, hogy esetleg az kavar be, hogy miközben áttöltöm encoder értékét másik változóba, közben következik be megszakítás, és esetleg pont byteot vált a számláló. Úgyhogy a művelet közben letiltottam a megszakítást. De egyik megoldás sem segített.Úgyhogy végül a teljes linealizáció időtartamára tiltottam le a megszakítást, de a hiba változatlanul fennáll. Tehát valami más kavar be.
Várok minden ötletet. Mindet ki fogom próbálni. Az, hogy a többszörös vizsgálat révén működik az eszköz, nem jelenti azt, hogy jó.
(#) nemgyuri válasza sonajkniz hozzászólására (») Okt 17, 2016 /
 
Ha egy 3 byte-os számot szorzunk valamivel az nem biztos, hogy belefér 3 byte-ba. Erre figyeltél? (ez a szorzás-osztandó dolog nekem nem világos)
A hozzászólás módosítva: Okt 17, 2016
(#) sonajkniz válasza nemgyuri hozzászólására (») Okt 17, 2016 /
 
Jelenleg belefér. Az adott gép legnagyobb munkahossza és a mérőhossz szorzata nem haladja meg a 4 byteot.
A linealizáció alapképlete:
Xmax - Xmin = X eredő
Ymax - Ymi = Y eredő
Y = (X-Xmin) / (X eredő / Y eredő) + Ymin
Ha Xmin és Ymin egyaránt 0, (mint esetemben), akkor egyszerűsödik a képlet.
Y = X / (Xmax / Ymax)
A baj csak az, hogy Xmax / Ymax szinte mindig egy több tizedes jegyű szám, amivel igen macerás egy PIC-el számolni. Viszont a képletet meg is lehet fordítani.
Y = (X * Ymax) / Xmax. Ebben az esetben nincs tizedestört. Cserébe van egy szép nagy szorzatunk.
(#) ktamas66 válasza sonajkniz hozzászólására (») Okt 17, 2016 /
 
É nem szoktam letiltani a IT-t, mert akkor elveszhet mérés, egy egyszerű flaggel figyelem jött-e közben IT:
  1. PWM_UJRA
  2.         BSF             KTSTATUS,4              ;a mentés idejére figyeljük az IT-t
  3.                                                         ;ha közben jön IT az törli ezt a bitet
  4.         MOVFW   KT_TMR1_FEL
  5.         MOVWF   REGB0
  6.         MOVFW   KT_TMR1_FEL1
  7.         MOVWF   REGB1
  8.         MOVFW   KT_TMR1_FEL2
  9.         MOVWF   REGB2
  10.         MOVFW   KT_TMR1_FEL3
  11.         MOVWF   REGB3
  12.  
  13.         BTFSS   KTSTATUS,4              ;most már mehet
  14.         BRA             PWM_UJRA

A szám negatívvá alakításánál 1-et hozzá kell adni:
  1. ;*****************************************************************************
  2. ; NAME:         NEG32
  3. ;
  4. ; DESCRIPTION:  32 bit negate
  5. ;
  6. ; ARGUMENTS:    -A => A
  7. ;
  8. ; TIMING (cycles): 9
  9. ;
  10.        
  11. NEG32 MACRO     A
  12.  
  13.         COMF    A+B0, F
  14.         COMF    A+B1, F
  15.         COMF    A+B2, F
  16.         COMF    A+B3, F
  17.         CLRF    WREG, F
  18.         INCF    A+B0, F
  19.         ADDWFC  A+B1, F
  20.         ADDWFC  A+B2, F
  21.         ADDWFC  A+B3, F
  22.  
  23.         ENDM

Ha nem változóval kell szorozni/osztani ezt a generátort szoktam használni.
(#) nemgyuri hozzászólása Okt 25, 2016 /
 
Sziasztok! Órák óta szívok egy léptetőmotoros vezérléssel, PIC16F629A-val. Step 1 vagy 2 bemenetre ha adok négyszögjelet a "saját" kimenetén az jelenik meg amit várok, de közben a másik kimenet fele frekvenciával is lépeget. Ha a nem vezérelt bemenetet lehúzom a földre akkor a hozzá tartozó kimenet leáll, ahogy kell. Megpróbáltam a nem vezérelt lábat fix tápra tenni (hátha zavar bejut) de az nem segített. Mini szkóppal is néztem a nem vezérelt lábat, de nem láttam rajta tüskét sem. A program MPLAB szimulátorával jónak látszik!
PORTA (bemenet) összes lába 4,7k-val tápra van kötve, a step és dir lábakat optócsatoló húzza le vezérléskor. PIC csere nem segített. (Nem látom a fától az erdőt?)
A hozzászólás módosítva: Okt 26, 2016
(#) sonajkniz válasza nemgyuri hozzászólására (») Okt 25, 2016 /
 
Nem teljesen világos a dolog. Egy léptetőmotor vezérlőnek akarsz jeleket küldeni, vagy magát a léptetőmotor vezérlőt akarod legyártani?
(#) eyess válasza nemgyuri hozzászólására (») Okt 25, 2016 /
 
Nem biztos , hogy a pic meg tudja neked hajtani a léptető motorodat , ha ezt szeretnéd.
Sőt szerintem biztos hogy nem.
(#) nemgyuri válasza sonajkniz hozzászólására (») Okt 25, 2016 /
 
Lényegében léptetőmotor vezérlőt készítettem. Step és dir bemenetek felhasználásával unipoláris ( 4 tekercses ) léptetőmotor vezérlése a feladat. Teljesítményfokozat van utána.
(#) nemgyuri válasza eyess hozzászólására (») Okt 25, 2016 /
 
Teljesítményt nem kell tudnia. Egyébként a motorok forognak viszik a szánokat, csak az a baj, hogy az is megy amelyiknek nem kellene.
(#) eyess válasza nemgyuri hozzászólására (») Okt 25, 2016 /
 
Közben láttam , hogy irtad , hogy van teljesitmény fokozat utána.
A négytekercses , azt most nem értem , négy kivezetéses , akkor az két tekercses , ha 4 tekercses , akkor az nyolc kivezetéses .Egyébként milyen motor az típúsra ?
(#) nemgyuri válasza eyess hozzászólására (») Okt 25, 2016 /
 
5 kivezetéses, 1 közös és 4 db 1-1 tekercskivezetésre. A motor 1:64-es fogaskerék-áttétellel rendelkezik, így 1 fordulatra 4096 lépés jut.
(#) eyess válasza nemgyuri hozzászólására (») Okt 25, 2016 /
 
Akkor viszont lehet , hogy nem jól lett rákötve a vezérlő áramkörre, illetve van e annyi láb , és hozzá teljesítmény fokozat , hogy rendesen vezérelje a motort.
Nem tudom mi lesz ez , de ha leírnád lehet , hogy könnyebben tudnánk segíteni is .
(#) nemgyuri válasza eyess hozzászólására (») Okt 25, 2016 /
 
A PIC PORTB alsó 4 bitje vezérli az egyik motor tekercseit, a fölső 4 bitje a másik motor tekercseit. Szimulátoron tökéletesen működik de a valóságban a nem vezérelt motor is megy!
Ez a problémám.
(egyébként egy 4 tengelyes habvágógépet építek)
A hozzászólás módosítva: Okt 25, 2016
(#) eyess válasza nemgyuri hozzászólására (») Okt 25, 2016 /
 
És a két motor egy egy közös tekercs kivezetése azok hová vannak kötve ?Meg kellene nézni , hogy csak egy motor legyen bekötve , és akkor is megjelenik e a másik motor nem kivánt vezérlése .
A hozzászólás módosítva: Okt 25, 2016
(#) foxi63 válasza nemgyuri hozzászólására (») Okt 25, 2016 /
 
Szia!
Mivel a táblázatod addwf PCL,f a programszámlálót lépteti, ezért ha a táblázat laphatárt lép át, (PCH +) rossz helyen fog a progi folytatódni. Ellenőrizd le, hogy egyik tábla se lépjen át laphatárt. illetve gondoskodni kell a PCH visszaállításáról.
A hozzászólás módosítva: Okt 25, 2016
(#) nemgyuri válasza eyess hozzászólására (») Okt 25, 2016 /
 
PIC 4-4 kimenete 1-1 ULN2003-as meghajtóra megy. A motorok közös kivezetése megy a tápra. A tekercsek másik kivezetéseit az ULN 1-1 végtranzisztora húzza a földre.
Ezzel a résszel nincs probléma. A probléma a PIC elvi (szimulátoros) és valós működési közötti különbség.
(#) eyess válasza nemgyuri hozzászólására (») Okt 25, 2016 /
 
Nem biztos , mert ha csak egy motorral nézed , és közben nézed a másik motorhoz menő kivezetéseket , és akkor nem fogsz látni ott vezérlést , akkor úgy müködik , ahogy kell .Viszont , ha látsz ott is vezérlést , akkor az program hiba lesz.
(#) nemgyuri válasza foxi63 hozzászólására (») Okt 25, 2016 /
 
Ha nem tévedek nincs laphatár, mivel 2k az össz. programmemória. (a egész kb 500 byte).
Ha ilyen hiba lenne a szimulátoron is hibázna!?
(#) nemgyuri válasza eyess hozzászólására (») Okt 25, 2016 /
 
LEDekkel is teszteltem az eredmény ugyanaz. (Meghajtók és motorok nélkül is - hátha van valami visszahatás!)
(#) foxi63 válasza nemgyuri hozzászólására (») Okt 25, 2016 /
 
a PCH 256 byte-onként változik. Igen a szimulátor is hibázik.
A hozzászólás módosítva: Okt 25, 2016
(#) eyess válasza nemgyuri hozzászólására (») Okt 25, 2016 /
 
Értem , akkor ott vezérlési hiba van , illetve program hiba .Neked egyidejűleg , csak egy motor vezérlésre van szükséged , ha jól olvastam.Ilyenkor a másik motorhoz tartozó program rész mit csinál , le van tiltva vagy ?
(#) nemgyuri válasza eyess hozzászólására (») Okt 25, 2016 /
 
Az, hogy mikor melyik motornak kell mennie az a számítógépen futó programtól függ. Nekem az a problémám, hogy a NEM vezérelt motor is megy, bár fele sebességgel.
(#) eyess válasza nemgyuri hozzászólására (») Okt 25, 2016 /
 
Értem , és a jelenlegi tesztelésed az hogy történik pc ről , vagy ?Fele sebesség is gyanús nekem , olyan mintha valahonnan máshonnan kapna az a motor vezérlést , és nem a pic felöl.
Következő: »»   15 / 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