Gokväll!
Börjar få lite fart på min encoder-rutin, men jag har några problem:
1) Vrider man fort så hänger den inte med.
2) Vrider man medsols (skrivet som "Ena hållet" i koden) så räknar den 0, 2, 4, 6, osv, istället för 1, 2, 3, 4.. Vrider man motsols så räknar den en siffra itaget.
3) Ibland (ca 1 gång av 30) så händer det att variabeln data1 hoppar fram flera siffror på en gång, trots att man vrider motsols.
Liten förklaring av koden:
LED1 är en 'symbol' och är ansluten till PORTB.2
ENCODER1a är ena pinnen på encodern. Ansluten till PORTB.4 som ger "interrupt on change".
ENCODER1b är andra pinnen på encodern. Ansluten till PORTC.0 som inte ger något interrupt alls.
Variabeln data1 visas på en LCD-display som en siffra mellan 0 - 9.
Variabeln min1 = 0. Variabeln max1 = 10.
Kod: Markera allt
sub procedure interrupt
'Encoders
if TestBit(INTCON, RBIF) = 1 then
ClearBit(INTCON, RBIF)
tmp1 = PORTB
'Tänd LED1 för att visa att vi fått interrupt
LED1 = 1
'Läs av encoders
nyEnc1a = ENCODER1a
nyEnc1b = ENCODER1b
if (nyEnc1a <> oldEnc1a) OR (nyEnc1b <> oldEnc1b) then
'Ena hållet
if (ENCODER1a = 1) AND (ENCODER1b = 0) then
if data1 < max1 then data1 = data1 + 1 end if
LED3 = 1
end if
if (ENCODER1a = 0) AND (ENCODER1b = 1) then
if data1 < max1 then data1 = data1 + 1 end if
end if
'Andra hållet
if (ENCODER1a = 0) AND (ENCODER1b = 0) then
if data1 > min1 then data1 = data1 - 1 end if
LED2 = 1
end if
if (ENCODER1a = 1) AND (ENCODER1b = 1) then
if data1 > min1 then data1 = data1 - 1 end if
end if
end if
oldEnc1a = nyEnc1a
oldEnc1B = nyEnc1a
end if
end sub
*Tyvärr* stödjer inte MikroBasic lookup-tables, så if-raderna är min lösning på problemet..
Alla tips är av intresse. Vill optimera rutinen så mycket som möjligt eftersom encodern ska styra spänningen på ett digitalt nätagg.
edit: Skrev helt fel ang. ENCODER1b. Den går inte alls till en IOC-pinne. Har ändrat det. Koden stämmer däremot.
