[elektro] rotary encoder, mit csinálok rosszul?
elight
elight at gmail.hu
Mon Jan 2 15:46:25 CET 2017
Az ASM melós , és egyben könyörtelen.
Bármi lazaságnak könnyen
végzetes dolog a vége.
És azt hiszem következetesen
és azonnal rá is világítottál egy dologra
ami felett "magas szinten" elsiklottunk! :-)
A ciklikus egyszer olvasás -> kiértékelés
tényleg egy nagyon lényeges dolog!
Talán ezért is említettem
a bitekhez az értéktárolókat..
Üdv István
2017-01-02 15:40 keltezéssel, Karoly Kovacs írta:
> Ne érezd magad őskövületnek, ez szép, tiszta kód!
>
> Károly
>
> nemeth.tibor798 at t-online.hu wrote:
>> Hali!
>>
>> Bár őskövületnek érzem magam, de mivel több mint 20 éve működik a
>> módszer, leírom a lényeget. Én még mindig ASM-ban nyomulok, munkás
>> nagyon, de legalább tudom mit csinálok.
>> A két encoder bit 1 portra megy, a portot csak egyszer olvasom és
>> eltárolom majd feldolgozom. Bár nem teljesen értem a C-t, de ha jól
>> látom a programodban többször van If (ENCx_PORT) és ez gondolom port
>> olvasást jelent. Nos semmi garancia rá, hogy két olvasás között nem
>> változik, már úgy értem egy interrupton belül.
>> A feldolgozásra nagyon gyalog, de szerintem nagyon hatékony, ugrótáblás
>> módszert használok. Van két régi bitem és két aktuális. Ez a 4 bit egy
>> ugrótáblába megy be ami 16 elemű. Az egyidőből származó bitek
>> szomszédosak.
>> Gondolom ez C-ben sem gond, nekem ASM van:
>> Itt W alsó 4 bitje játszik.
>>
>> ANDLW 0FH
>> ADDWF PCL,1
>>
>> GOTO NNOOPP
>> GOTO DECPOSITION
>> GOTO INCPOSITION
>> GOTO ERRORCOUNT
>>
>> GOTO INCPOSITION
>> GOTO NNOOPP
>> GOTO ERRORCOUNT
>> GOTO DECPOSITION
>>
>> GOTO DECPOSITION
>> GOTO ERRORCOUNT
>> GOTO NNOOPP
>> GOTO INCPOSITION
>>
>> GOTO ERRORCOUNT
>> GOTO INCPOSITION
>> GOTO DECPOSITION
>> GOTO NNOOPP
>>
>> A megfelelő címkéken van a növelő, csökkentő, semmittevő és hibaszámláló
>> rutin.
>> Eredetileg PIC16C54-en volt egy 4 dimenziós problélmám, az a PIC csak
>> ezt a feladatot látta el, mivel annak még nem volt megszakítása,
>> egyszerűen polloztam, elég sűrűn. A pozíciókat nyomta ki soroson. A
>> rutinokban elhelyezett NOP-okkal megoldottam, hogy minden ágon azonos
>> legyen a végrehajtási idő. Ez azért kellett mert abban soros harder sem
>> volt, igy a bit-idők voltak kitöltve az encoderek feldolgozásával.
>>
>> Modernebb PIC-ben B port change mexakítást használom, Itt meg kellett
>> tanulnom, hogy ha a port egyéb lábait is használni akarom, akkor arra
>> erősen ügyelni kell, mert a port olvasása törli a hardverbiteket (a
>> változást jelző flipflopot) és szerencsétlen egybeesés esetén elmarad az
>> interrupt.
>>
>> Persze nem árt ha a hardver tiszta jeleket produkál, de a fenti módszer
>> jól tűri, ha az él körül pereg a bit, számlál szépen oda/vissza. Ha a
>> kettő bit egyszerre változik, azt ez sem tudja lekezelni, de az
>> egyértelműen hiba. No és persze olyan is volt, hogy egy nem túl jól
>> kivitelezett kapcsistáp teleszórta zavarral én meg az encoder szidtam.
>> Szóval ez is egy lehetőség.
>>
>> Üdv.
>> Németh Tibor
>>
>> Idézet (Gabor Jordan <jordang.elektro at gmail.com>):
>>
>>> ÜDV,
>>>
>>> Rotary encoder, PIC18F67K90 B3 és B4 lábain csücsül, felhúzva 47k-val
>>> kívülről.
>>>
>>> A lenti megszakítás (XC8) kezelné le, de nem jó. Kb. 10ből 8szor jól
>>> lép, de 2szer vagy rossz irányba, vagy többet. Az ENC1 lefutóél csinál
>>> megszakítást és nézem az ENC2 láb hogyan áll. Mindig is így csináltam
>>> és ment. Optikai enkóderrel most is megy. Így is (lassabban) meg úgy
>>> is, ha kiveszem a késleltetéseket. Hiba nélkül. Gondolom a
>>> mechanikusnál a prell-el vagy kontakt-al van gond. Szkópon nem is túl
>>> szép a kapcsolás, látszik a prell, de lemegy még a késleltetések előtt
>>> (legalábbis amit látok). Mégsem jó, hiába játszom az időzítésekkel.
>>>
>>> Más tipusú enkoderrel jó volt (bourns), de amit most használni akarok,
>>> nem jó. Van több darab, cseréltem is, de nem jó.
>>>
>>> Hogy illik megbízhatóan olvasni ezeket?
>>>
>>> 1 szintű megszakítást használok, a megszakítás kezelést elvileg nem
>>> szakítja meg másik megszakítás (legalábbis az XC9 azt mondja ne
>>> kapcsolgassam a kódban a GIE-t, ő megteszi).
>>>
>>> Köszönöm,
>>>
>>> ÜDV JG
>>>
>>> *****
>>>
>>> if (INTCON3bits.INT3IF==1) // interrupt from rotary encored
>>> {
>>> INTCON3bits.INT3IF=0;
>>> __delay_us(50);
>>> if (ENC1_PORT==0)
>>> {
>>> __delay_us(50);
>>> if (ENC1_PORT==0)
>>> {
>>> __delay_us(50);
>>> if (ENC1_PORT==0)
>>> {
>>> if (ENC2_PORT)
>>> {
>>> //LCDPutCmd(01);
>>> //LCDPutStr("vissza");
>>> pwm = pwm - 16;
>>> }
>>> else
>>> {
>>> //LCDPutCmd(01);
>>> //LCDPutStr("oda");
>>> pwm = pwm + 16;
>>> }
>>> update = 0x01;
>>> }
>>> }
>>> }
>>> }
>>>
>>> *******
>>>
>>> ----------------------------------------- elektro[-flame|-etc]
>> -----------------------------------------
>> elektro[-flame|-etc]
>
> -----------------------------------------
> elektro[-flame|-etc]
More information about the Elektro
mailing list