rotary encoder + Bascom

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
puzzafutar
DrótVégénSzéndarab
Hozzászólások: 47
Csatlakozott: 2007. május 13. vasárnap, 6:00

rotary encoder + Bascom

Hozzászólás Szerző: puzzafutar »

Sziasztok! Talán többeket is érdekel a HDD motorból készűlt rotary encoder építése. a youtube-on van pár ilyen videó. Nekem a hardware megvan és működik is, de belefutottam egy programozói gondba..... Mégpeddig, hogy ha egyik irányba forog a motor, akkor elöbb az első utánna a másik megszakítás lép életbe, ha fordítva forgatom, akkor fordított sorrend lépnek életbe. Ezt nem tudom kitalálni, hogy a Megszakítások sorrendjét hogyan rögzítsem. Én olyan elven indúltam el, hogy kellene egy 2 elemű verem, amely mindig a legfrisebb 2 értéket jegyzi meg, a régebbieket eldobja, de ezt nem tudom, hogy Bascom alatt hogyan lehetne megvalósítani. Ebben kérem a segítségeteket és abban hogy jó felé tapogatózok-e.
Azoknak, akik nem tudják mi az a rotary encoder itt van a link, itt van kapcs. rajz, videó+képek :wink: http://www.fleurey.com/franck/pmwiki.ph ... HDDEncoder
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Hozzászólás Szerző: winnerbt »

Valami jelalak nem ártana. Átfedett a két jel vagy külön-külön jön?
Ha átfedett akkor elég egy "előző" meg "most" változó, ha a 2 egyenlő, akkor nem történt semmi, ha nem, akkor kilogikázod, hogy merre forgott (lépett) egyet. Ha nagyon pipeckedni akarsz, akkor ez egy 16 lépéses tábla lesz, ott már lesz 4/4-es felbontásod és Error jeled is.
JAni
Avatar
puzzafutar
DrótVégénSzéndarab
Hozzászólások: 47
Csatlakozott: 2007. május 13. vasárnap, 6:00

Hozzászólás Szerző: puzzafutar »

Igazából a jelet veszi, csak a feldolgozással van problémám.
Úgy néz ki a dolog, hogy 2 int lábon jön a mikrovezérlőbe a 2 jel, és ennek a két jelnek a sorrendjére apellálok. mert egymás után jönnek az impulzusok, csak ha frodított sorrendben, akkor fordítva is forog. a jelek nem átfedettek, külön-külön kis egymás utánni impulzus
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Hozzászólás Szerző: winnerbt »

Két külön jelből, ami nincs átlapolva és szimmetrikus, szerintem nem tudod eldönteni, hogy milyen sorrendű. Valami szópábra jól jönne.
JAni
Avatar
szegoj
SzínkódFestő
Hozzászólások: 92
Csatlakozott: 2010. február 4. csütörtök, 7:00

Hozzászólás Szerző: szegoj »

http://www.engr.mun.ca/~dpeters/6806/po ... ncoder.pdf

Ezt nézd meg. Mindig csak két bitet kell vizsgálni az egymást követő mintákból, a bitek XOR kapcsolatának értéke adja meg a forgás irányát

Régebben még FastAVR-ben írtam így egy programot, és remekül működött.
Avatar
puzzafutar
DrótVégénSzéndarab
Hozzászólások: 47
Csatlakozott: 2007. május 13. vasárnap, 6:00

Hozzászólás Szerző: puzzafutar »

Köszönöm a PDF-et, áttanúlmányoztam, de nem tudtam belőle kihámozni, hogy hogyan kapom meg az irányt. Ott akadtam el, hogy
(egyik irány)
1100110011
0110011001
ebből XOR művelettel:
1010101010

(másik irány)
1100110011
1001100110
ebből XOR:
0101010101

Ebből hogyan kapom meg az irányt? meg sem tudom különböztetni a 2 jelsorozatot.
Avatar
broland
Tranzisztorgyógyász
Hozzászólások: 152
Csatlakozott: 2009. április 20. hétfő, 6:00

Hozzászólás Szerző: broland »

Szia Puzzafutar

Ezen az oldalon is foglalkoznak vele, sample is van.
http://www.qsl.net/pa3ckr/bascom%20and% ... index.html
Üdv Roland
Avatar
szegoj
SzínkódFestő
Hozzászólások: 92
Csatlakozott: 2010. február 4. csütörtök, 7:00

Hozzászólás Szerző: szegoj »

Az ábrán látod, hogy a két dekóderről érkező bitet XOR kapcsolatba hozva, adott irány esetén mindig 0-t vagy 1-et kapunk.

http://kepfeltoltes.hu/view/110125/enco ... es.hu_.jpg

A programrészlet nálam így nézett ki, lásd lejjebb. Probléma volt, hogy a rotary encoder két állás között szeret prellegni, ezért egy számlálóval ellenőriztem a tényleges irányt.
  • ' Föprogram

    PORTB = &B111 ' activate pull up registers
    Cls
    WaitMs 2
    Locate 1, 1: Lcd "_Encoder_test_______"
    New_Value = PINB And &b11 ' enkóder bitek kimaszkolása
    Old_Value = New_Value
    Down_Counter = 0
    Up_Counter = 0
    Reset Encoder_Ready
    Locate 2, 2: Lcd Encoder_Ready
    Do
    Encoder()

    Loop


    ' Szubrutin

    Sub Encoder()
    New_Value = PINB And &b11 ' enkóder bitek kimaszkolása
    If Not PINB.2 Then ' GOMBNYOMÁS esemény lekezelés
    Reset Encoder_Ready
    Locate 2 , 2 ' ideiglenes !!!
    Lcd " " ' ideiglenes !!!
    End If
    If Not Encoder_Ready Then
    If New_Value <> Old_Value Then
    Bit_Temp = New_Value.1
    Bit_Temp1 = Old_Value.0
    Bit_Temp = Bit_Temp Xor Bit_Temp1
    If Bit_Temp Then
    Down_Counter = 0
    Incr Up_Counter
    If Up_Counter>6 Then
    Locate 2 , 2 ' ideiglenes !!!
    Lcd " bal " ' ideiglenes !!!
    Reset Left_Right ' BAL
    Up_Counter = 0
    Set Encoder_Ready
    End If
    Else
    Up_Counter = 0
    Incr Down_Counter
    If Down_Counter>6 Then
    Locate 2 , 2 ' ideiglenes !!!
    Lcd " jobb" ' ideiglenes !!!
    Set Left_Right ' JOBB
    Down_Counter = 0
    Set Encoder_Ready
    End If
    End If
    End If
    WaitMs 2
    Old_Value = New_Value
    End If
    End Sub
    Avatar
    szegoj
    SzínkódFestő
    Hozzászólások: 92
    Csatlakozott: 2010. február 4. csütörtök, 7:00

    Hozzászólás Szerző: szegoj »

    Vagy másképpen, ne az azonos helyi értékű bitekkel számolj, hanem az átlósan egymás alatt lévőket (korábbi - későbbi) biteket hozd XOR kapcsolatba.

    (egyik irány)
    1100110011
    / / / / / / itt a két bit között a XOR mindig 1
    0110011001

    (másik irány)
    1100110011
    / / / / / / itt a két bit között a XOR mindig 0
    1001100110
    Avatar
    kapu48
    Elektronbűvölő
    Hozzászólások: 3375
    Csatlakozott: 2008. augusztus 29. péntek, 6:00

    Hozzászólás Szerző: kapu48 »

    Ha Szegoj által linkelt ábrát nézed.
    Akkor 1-es jel felfutó élre generált megszakításban, megvizsgált 2-es jelszintje mindig 0 vagy a másik irányba mindig 1.
    Ugyanez fordítva, érvényes ha 2-es jelre kérsz megszakítást.
    És ha mindkettőre kérsz felváltva 1 – 1 megszakítást akkor 2* akkora lesz az enkódered felbontása. Tehát pontosabban tudsz szabályozni vele!
    8)
    És a jobb enkóderek már nem mechanikusak, tehát nem preleznek.
    Legföljebb jelváltáskor van egy kis tüske a szkópon nézve. De ez már nem zavaró
    Avatar
    puzzafutar
    DrótVégénSzéndarab
    Hozzászólások: 47
    Csatlakozott: 2007. május 13. vasárnap, 6:00

    Hozzászólás Szerző: puzzafutar »

    Igazából nem sima enkóderrel dolgozok, hanem HDD motor-al, ahogy ez az első témaindító hozzászóásból ki is derül és ma meg is oldottam a problémát, elég egyszerű, nem kell hozzá megszakítás, és a biteket sem kell XOR művelettel kezelni. Már csak egy kicsit finomítani kell a kódon és tökéletes lesz :D Mindenkinek nagyon köszönöm a hozzászólásokat és a képeket, mert így összeállt a dolog.
    Avatar
    evildodo
    Pákabűvész
    Hozzászólások: 213
    Csatlakozott: 2009. február 4. szerda, 7:00

    Hozzászólás Szerző: evildodo »

    puzzafutar írta:Igazából nem sima enkóderrel dolgozok, hanem HDD motor-al, ahogy ez az első témaindító hozzászóásból ki is derül és ma meg is oldottam a problémát, elég egyszerű, nem kell hozzá megszakítás, és a biteket sem kell XOR művelettel kezelni. Már csak egy kicsit finomítani kell a kódon és tökéletes lesz :D Mindenkinek nagyon köszönöm a hozzászólásokat és a képeket, mert így összeállt a dolog.
    Hi!
    Engem azért érdekelne a megoldásod. Ha bemásolnád megszakértenénk :)
    Geht nicht, Gibt's nicht!
    Avatar
    puzzafutar
    DrótVégénSzéndarab
    Hozzászólások: 47
    Csatlakozott: 2007. május 13. vasárnap, 6:00

    Hozzászólás Szerző: puzzafutar »

    Kód: Egész kijelölése

    $regfile = "attiny2313.dat"
    $crystal = 1000000
    
    Config Portd.2 = Input                             'egyik szál
    Config Portd.3 = Input                             'másik szál
    Config Portb = Output                              'ledek
    Config Portd.0 = Output                            'hangszóró
    
    Dim Portok(8) As Byte
    Dim Index As Byte
    Dim Szabad As Bit
    
    Portok(1) = 1
    Portok(2) = 2
    Portok(3) = 4
    Portok(4) = 8
    Portok(5) = 16
    Portok(6) = 32
    Portok(7) = 64
    Portok(8) = 128
    
    Szabad = 1
    Index = 1
    Portb = 1
    
    Do
       If Szabad = 1 Then
       If Pind.2 = 1 And Pind.3 = 0 Then
          Index = Index + 1
          If Index > 8 Then
             Index = 1
          End If
          Portb = Portok(index)
          Sound Portd.0 , 75 , 100
          Szabad = 0
       End If
    
       If Pind.2 = 0 And Pind.3 = 1 Then
          Index = Index - 1
          If Index < 1 Then
             Index = 8
          End If
          Portb = Portok(index)
          Sound Portd.0 , 75 , 100
          Szabad = 0
       End If
    
       End If
    
       If Pind.2 = 0 And Pind.3 = 0 Then
          Szabad = 1
       End If
    Loop
    End
    itt kód... várom majd a véleményeket... :wink:
    Avatar
    kapu48
    Elektronbűvölő
    Hozzászólások: 3375
    Csatlakozott: 2008. augusztus 29. péntek, 6:00

    Hozzászólás Szerző: kapu48 »

    Nem lehet valami gyors a cucc!
    Ha még közben ráérsz muzsikálni is!
    És nem veszít el impulzust?
    1 fordulatra menyi impulzust küld az encoder?

    :?
    Avatar
    puzzafutar
    DrótVégénSzéndarab
    Hozzászólások: 47
    Csatlakozott: 2007. május 13. vasárnap, 6:00

    Hozzászólás Szerző: puzzafutar »

    Ahogy eddig észrevettem nem veszítek impulzust, ha normális sebeséggel tekergetem. De hangot talán felesleges is kiadnia.
    az impulzusok így alakulnak
    egyes szál 110 011
    kettes szál 011 vagy peddig 110
    tehát 1 impulzus 3-3 bit

    Lényegében az első pár(alsó-felső) bitet nézi, és onnan tudja, hogy merre forog, mert vagy 10 vagy peddig 01.
    Válasz küldése