Myös korttimaksu toimii

Inkrementaalisen dekooderin luku omissa ohjelmissa

Aloittaja Jonne, 02.02.07 - klo:17:54

« edellinen - seuraava »

0 Jäsenet ja 1 Vieras katselee tätä aihetta.

Jonne

Tämä ei varmaan ole ihan oikea palsta missä julkaista tämä
mutta, en oikein parempaakaan keksinyt. Ylläpitäjät, siirtäkää tämä topic,
jos se on väärässä paikassa. Olisi hyvä muuten olla jokin CNC-koneen
ohjauksen ohjelmointi alue...

No niin.

Mietin tässä tänään dekoodereiden toimintaa ja päätin sen tuosta nopeasti
selvittää, korjatkaa jos on virheitä...

Inkrementaalisesta enkooderista tulee kaksi pulssia A ja B ( joissain nolla piste C )
Nämä menevät limittäin seuraavalla tavalla:

  A    11001100110011001100
  B    01100110011001100110
         <----             ----->

Nopeasti voisi ajatella että miten tuosta näkee kumpaan suuntaa kooderi pyörii,
mutta ratkaisu on suht simppeli kun tehdään totuustaulukko:

( Huomasin näin jälkeenpäin että nämä kooderithan perustuvat
   GRAY-koodiin, tuli siis keksittyä gray-koodit uudelleen... )

Selitykset:
A=KANAVA A
B=KANAVA B
E=EDELLINEN MITTAUS ( paikoillaan )
N=NYKYINEN LIIKEEN JÄLKEEN ( muutos, liikettä tapahtunut )

MYÖTÄPÄIVÄÄN          VASTAPÄIVÄÄN
  <----                              ----->
   
      E N                             E N
   A 0 0                           A 0 1
   B 0 1                           B 0 0

   A 0 1                           A 0 0
   B 1 1                           B 1 0

   A 1 0                           A 1 1
   B 0 0                           B 0 1

   A 1 1                           A 1 0
   B 1 0                           B 1 1

Nyt huomataan että myötäpäivään mentäessä
ennen liikettä oleva B ja liikkeen jälkeinen A ovat aina joko 1 ja 1 tai 0 ja 0,
vastapäivään aina 1 ja 0 tai 0 ja 1.
Tästä on helppo määrittää suunta poissulkevaa TAI:ta (XOR) käyttäen.

Totuustaulukko XOR:

A B Tulos
0 0    1
1 0    0
0 1    0
1 1    1

Voi olla helpompia tapojakin mitata suuntaa mutta tämä on
yksi aika selkeä tapa. Keksin tämän tavan puolen tunnin
miettimisen jälkeen, eli ei välttämättä nopein.

Tässä vielä ohjelmointi esimerkit X-enkooderin mittaukseen,
molemmat ohjelmat ovat testattuja eli pitäisivät toimia oikein.

Molemmissa ohjelmissa käytetään LPT:n 8-bit datalinjan
1 ja 0 bittejä. 1 on B:lle ja 0 A:lle.

Basic-ohjelmassa ( tehty BlitzBasic3D:llä ilmainen demo netissä ) on virtuaalinen encoder ja sitä käytetään
nuolinäppäimin. ylempiluku ikkunassa osoittaa mitattua asentoa
ja alempi virtuaalisen encoderin asentoa. kutinsa pitävät. Tosin
encoder-dataa ei kylläkään ajallisesti mittaukseen nähden randomina
heitetä, jos ongelmia ( enkooderi pyörisi nopeammin kuin PC ehtii lukea, en usko.. )
syntyy käytössä oikealla kooderilla niin puskuroiti tuon ongelman poistaa.

Puskurointi puuttuu molemmista ohjelmista, jos joku sellaisen esimerkin
haluaa niin voin kyllä tehdä.

Konekiellä tehty (x86) on aika raakile, mutta sitä voi emuloida esim. emu086:lla ( Ilmainen demo netissä )
ja eiköhän siitä jokainen ymmärrä homman nimen.

Kysyä saa, ja tietenkin korjata jos tuolla virheitä...

Tässä ohjelmat:


086-VERSIO:

;
; Esimerkki inkrementaalisen enkooderin luku A ja B kanavista
; Koodi x86-yhteensopivaa, tehty ja testattu emu8086:lla 
;
; Johannes Thelen 2.2.2007
;

org 100h                                                   ; jatetaan hutia, ei oleellista
                                                               ; maarittetaan muuttujat
nykyinentilaX dw 0000 0000b                            ; näihin voit laittaa bittejä
edellinentilaX dw 0000 0000b                              ; testataksesi ohjelman toimivuutta
koordinanttiX dw 0h                                          ; esim. nykyinenX 0000 0001 ja edellinenX 0000 0010
                                                                    ;
LPT equ 378h                                            ; printteriportin osoite, en ole varma,
                                                               ; osoite vaihtelee koneesta riippuen
                                                              ; eli onko portti PCI-vaylassa vai
                                                              ; suoraan emolla...


paaohjelma:

;mov [378h],0000 0001b                            ;tama on testausta varten...           
;.                     
;.                                                           tahan tulee itse paaohjelma
;.
;.
;   
push bx                                                  ; pistetaan talteen rekistereiden arvot
push cx                                                 ;
push dx                                                    ;
mov dx,[LPT]                                         ; kopioidaan printteriportista nykyinentila
mov nykyinentilaX,dx ;       
call xasento                                            ; hypataan aliohjelmaan muutosten maaritykseen
pop bx                                                   ; palautetaan rekisterit mita tarvittiin
pop cx                                                    ;
pop dx                                                       ;
;.
;.                                                taalla jatkuu paaohjelma ...
;.
;.
;hlt                                               ; tamakin on testausta varten
jmp paaohjelma                                    ; ehdoton hyppy alkuun


xasento:
mov bx,edellinentilaX           ; edellinentilax kopio bx:aan
mov cx,nykyinentilaX          ; nykyinentilax  kopio cx:aan
and bx,0000 0011b           ; hukkaa ylimaaraiset loogisella AND:lla bitit,
and cx,0000 0011b            ; tarvitaan vain 0 & 1
cmp bx,cx                      ; vertaa muutoksia
jne suunta                    ; on, hypataan suunnan maaritykseen
ret                                ; ei, palataan

suunta:
mov dx,nykyinentilaX       ; kopioidaan nykyinentila
mov edellinentilaX,dx       ; edelliseksi koska muutos on huomattu
and bx,0000 0001b          ; hukataan edellisesta A-pulssi
and cx,0000 0010b         ; ja nykyisesta B-pulssi
sar cx,1                       ; rullataan yksi bitti oikealle, etta saadaan bitit vertailuun                       
xor bx,cx                      ; poissulkeva TAI
je lisaa                        ; tulos yhtasuuri, hyppaa lisaa
sub koordinanttiX,1         ; erisuuri X-1
ret                              ; paluu paaohjelmaan

lisaa:
add koordinanttiX,1          ; tulos yhtasuuri X+1
ret                                ; paluu






BASIC VERSIO:

; INKREMENTAALISEN ENKOODERIN LUKEMINEN BASICILLÄ
; Tehty BLITZ BASIC 3D:llä, yhteensopiva todennäköisesti muiden blitz versioiden kanssa
; Johannes Thelen 2.2.2007

; Koodi on sotkuista ja sitä ei ole millään tavalla optimoitu.
; Kaikki koodi mikä puolipilkkujen sisällä ei ole millään tavalla oleellista
; enkooderien lukuun, koodi liittyy ainoastaan ylös/alas nuolinäppäinten
; käyttöön. Näillä näppäimmillä käytetään virtuaalista enkoderia.


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                                                                           ;;
Dim a(3)                        ;Tämä osio liittyy enkoderin matkimiseen  ;;
Dim b(3)                         ;näppäimistöllä...                                ;;
                                                                                          ;;
a(0)=%00000000                  ; A-pulssi                                     ;;
a(1)=%00000000                                                                    ;;
a(2)=%00000001                                                                    ;;
a(3)=%00000001                                                      ;;
                                                                                           ;;
b(0)=%00000000                 ; B-pulssi                                       ;;
b(1)=%00000010                                                                   ;;
b(2)=%00000010                                                                   ;;
b(3)=%00000000                                                                   ;;
                                                                                          ;;
nx=a(0) Or b(0)         ; ja tonne molemmat loogisella TAI:lla   ;;
ex=a(0) Or b(0)                                                                     ;;
                                                                                          ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;PÄÄOHJELMA
                           
.main                       
                                                                                   
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
VWait 3                                         ;Viive                                 ;;
LPT=0                                             ;LPT:n nollaus                     ;;
LPT=a(c) Or b(c)                              ;LPT:n lataus A + B datalla    ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                           
                             

nykyinentilaX=LPT                   ; Kopioidaan nykyinen tila   

                 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
If KeyDown(200)                                                                      ;;
   c=c+1                                                                                ;;
     n=n+1                             ; Tämä on näppäimistön lukua         ;;
     If c>3 Then c=0                 ; encoder feikki-datalle                 ;;
EndIf                                                                                      ;;
                                                                                           ;;
If KeyDown(208)                                                                    ;;
   c=c-1                                                                                ;;
     n=n-1                                                                              ;;
     If c<0 Then c=3                                                                ;;
EndIf                                                                                     ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


Gosub asentoX                                           ; chekataan muutokset


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                                ;;
If MouseHit(1) Then End              ;Täässä osiossa näytetään X:n arvo ;;
CLS                                                                                        ;;
Locate 1,1                                                                               ;;
Print Xkoordinantti                                                                      ;;
Locate 1,20                                                                              ;;
Print n                                                                                     ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Goto main                           ; takaisin alkuun


.asentoX

nx=nykyinentilaX      ; kopio apumuuttujiin
ex=edellinentilaX
nx=nx And %00000011      ; ylimääräiset bitit pois
ex=ex And %00000011
If ex=nx            ; onko muutoksia?
    Return            ; nop, takaisin
Else
    edellinentilaX=nykyinentilaX           ; on, kopiodaan nykyinen edelliseen
    nx=nx And %00000001          ; taas hyödyttömät bitit pois
    ex=ex And %00000010
    ex=ex Shr 1                  ; oikealle pykälän verran bittejä edellisestäX:stä
    tulos=ex Xor nx               ; Xor eli kumpaan suuntaan ollaan matkalla
   
   If tulos=1                  ; lisää yksi
       Xkoordinantti=Xkoordinantti+1
         Return
        Else
          Xkoordinantti=Xkoordinantti-1                 ; vähennä yksi
             Return
    EndIf
       
EndIf




TÄSSÄ VIELÄ PIC:lle NETISTÄ LÖYDETTY:



'****************************************************************
'* Name : rce.BAS *
'* Author : John Lighton <lighton@sablesys.com>modified by dj sniff*
'* Notice : Copyright (c) 2003 [set under view...options] *
'* : All Rights Reserved *
'* Date : 9/22/03 *
'* Version : 1.0 *
'* Notes : pic16F876 , Grayhill 25LB10 encoders *
'* : *
'****************************************************************
' rotary encoder test
'setting up debuger'''''''''''''''''''''''''''''''
' open the file with the definitions that we need:
INCLUDE "modedefs.bas"
' Set Debug pin port
DEFINE DEBUG_REG PORTC
' Set Debug pin BIT (RC4 in this case)
DEFINE DEBUG_BIT 4
' Set Debug baud rate
DEFINE DEBUG_BAUD 9600
' Set Debug mode: 0 = true, 1 = inverted
DEFINE DEBUG_MODE 1
' set up constant value for linefeed (ASCII value 10)
lf CON 10
' set up constant value for carriage return (ASCII value 13)
cr CON 13
'''''''''''''''''''''''''''''''''''''''''''''''''
DEFINE osc 20
'''''''''''''''''''''''''''''''''''''''''''''''
'rotary encoder stuff'''''''''''''''''''''''''
OldA var byte ' Previous state of encoder A bits
NewA var byte ' Current state of encoder A bits
DirectionA var bit ' Direction of encoder A travel; 1=CCW.
zza6 var NewA.0 ' the first bit
zza15 var OldA.1 ' the second bit
PositionA var word ' 0 to 65536
true con 1
false con 0
OPTION_REG = %00000000 ' Port B pullup enabled

''''''''''''
' Rotary encoders connected as follows:
'RenA1 var PortB.5
'RenA2 var PortB.4

'''''''''''''''''''''''''''''''''''''''''''
pause 200

MainLoop:
high PORTA.0 'check led

OldA = NewA

NewA = PortB & %00110000 'input of PortB.5 & PortB.4
NewA = NewA >> 4 'shift input of PortB the first and second bit
IF NewA <> OldA Then Gosub ChangedA

Goto MainLoop

ChangedA:
DirectionA = zza6 ^ zza15 'bitwise XOR
' give 1 if the two bits are different, and 0 if they are the same,

IF DirectionA = 1 Then ' first bit and second bit are different
debug "backward!"
else
debug "forward!" ' first bit and second bit are same
endif
' how does it know the initial direction, if XOR is returning
' 1 for both bits

Return

Delta Electronics -tuotteet www.thelentech.fi - Blogi ennenmikrotietokoneita.blogspot.fi

Jonne

#1
- Muokattu aavistuksen selkeämmäksi...
- 5.2.07 lisätty PIC:lle koodi esimerkki.
Delta Electronics -tuotteet www.thelentech.fi - Blogi ennenmikrotietokoneita.blogspot.fi

Powered by EzPortal
SMF spam blocked by CleanTalk