Encoder by BARTek :D
: 22 paź 2020, 18:10
Zapomniałem, że nie zamieściłem kodu do tego filmu.
Ten kod nie myli się nigdy bo używając PCINT reaguje na każdą zmianę stanu pinów. Testowane od kilku lat czasem nawet z trzema enkoderami na raz po 10tyś impulsów na obrót każdy.
UWAGA. Pierwsze dwa kody są właśnie z tego filmu a tam jest użyty enkoder PUSH PULL który przy przejściu daje dwa plusy a nie tak jak te najtańsze zwierane do masy.
To oczywiście dla tych najtańszych tylko kwestia podłączenia, ale niżej zamieszczę kod w którym polaryzację wybiera się stałą Const Intermediate = 0 lub 1
Ten kod nie myli się nigdy bo używając PCINT reaguje na każdą zmianę stanu pinów. Testowane od kilku lat czasem nawet z trzema enkoderami na raz po 10tyś impulsów na obrót każdy.
UWAGA. Pierwsze dwa kody są właśnie z tego filmu a tam jest użyty enkoder PUSH PULL który przy przejściu daje dwa plusy a nie tak jak te najtańsze zwierane do masy.
To oczywiście dla tych najtańszych tylko kwestia podłączenia, ale niżej zamieszczę kod w którym polaryzację wybiera się stałą Const Intermediate = 0 lub 1
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "m644pdef.dat"
- $crystal = 11059200
- $hwstack = 64
- $swstack = 32
- $framesize = 128
- ' Cheap encoder PCINT FULLSTEP (one step per click)
- ' 2017/01/02 by BARTek EDC
- Config Submode = New
- Config Lcdpin = Pin , Rs = Portc.7 , E = Portc.6 , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2
- Config Lcd = 16x2
- Cursor Off , Noblink
- Cls
- Dim Turn_l As Byte , Turn_r As Byte , Steps As Integer , Milis As Byte
- Dim Enc_new As Byte , Steps_old As Integer , State As Byte
- Config Portd.0 = Output : Led_a Alias Portd.0
- Config Portd.1 = Output : Led_b Alias Portd.1
- Config Portd.2 = Input : Encoder_a Alias Pind.2 : Set Portd.2
- Config Portd.3 = Input : Encoder_b Alias Pind.3 : Set Portd.3
- Config Timer2 = Timer , Prescale = 1024 , Compare_a = Disconnect , Clear_timer = 1
- Compare2a = 215 '20ms @11MHz/1024
- Pcmsk3 = &B00001100
- Enable Pcint3 : On Pcint3 Encoder_isr Nosave
- Locate 1 , 6 : : Lcd "Full step"
- Sub Show_steps()
- Locate 2 , 9 : If Steps > 0 Then Lcd "+" : Lcd Steps ; " "
- End Sub
- Call Show_steps()
- Enable Interrupts
- Do
- If Turn_l > 0 Then
- Decr Turn_l
- Incr Steps
- End If
- If Turn_r > 0 Then
- Decr Turn_r
- Decr Steps
- End If
- If Tifr2.ocf2a = 1 Then
- Tifr2.ocf2a = 1
- Incr Milis
- If Milis > 4 Then '5x20ms
- Milis = 0
- If Steps_old <> Steps Then
- Call Show_steps()
- Steps_old = Steps
- End If
- End If
- End If
- Led_a = Encoder_a
- Led_b = Encoder_b
- Loop
- End
- Encoder_isr:
- $asm
- !PUSH R16
- !PUSH R24
- !PUSH R26
- !PUSH R27
- !in R24, sreg
- !PUSH R24
- $end Asm
- Enc_new.0 = Encoder_a
- Enc_new.1 = Encoder_b
- Select Case Enc_new
- Case 1
- Select Case State
- Case 0 : State = 1 'pocz L krok 1
- Case 3 : State = 1 'revers z 2xHI
- Case 4 : State = 5 'progress w prawo krok 3 (bo opadaja naprzemian)
- End Select
- Case 2
- Select Case State
- Case 0 : State = 2 'pocz R krok 1
- Case 4 : State = 2 'revers z 2xHI
- Case 3 : State = 6 'progress w lewo krok 3 (bo opadaja naprzemian)
- End Select
- Case 0 '2xHI
- Select Case State
- Case 1 : State = 3 'byl pocz L krok 1 ->L krok 2 S3
- Case 2 : State = 4 'byl pocz R krok 1 ->R krok 2 S4
- Case 5 : State = 4 'revers
- Case 6 : State = 3 'revers
- End Select
- Case 3
- Select Case State
- Case 5 : Incr Turn_l
- Case 6 : Incr Turn_r
- End Select
- State = 0
- End Select
- ' Tuned with NoSave Tool
- $asm
- !POP R24
- !out sreg, r24
- !POP R27
- !POP R26
- !POP R24
- !POP R16
- $end Asm
- Return
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "m644pdef.dat"
- $crystal = 11059200
- $hwstack = 64
- $swstack = 32
- $framesize = 128
- ' Cheap encoder PCINT 4xSTEP (four step per click)
- ' 2017/01/02 by BARTek EDC
- Config Submode = New
- Config Lcdpin = Pin , Rs = Portc.7 , E = Portc.6 , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2
- Config Lcd = 16x2
- Cursor Off , Noblink
- Cls
- Dim Turn_l As Byte , Turn_r As Byte , Steps As Integer , Milis As Byte
- Dim Enc_new As Byte , Steps_old As Integer , State As Byte
- Config Portd.0 = Output : Led_a Alias Portd.0
- Config Portd.1 = Output : Led_b Alias Portd.1
- Config Portd.2 = Input : Encoder_a Alias Pind.2 : Set Portd.2
- Config Portd.3 = Input : Encoder_b Alias Pind.3 : Set Portd.3
- Config Timer2 = Timer , Prescale = 1024 , Compare_a = Disconnect , Clear_timer = 1
- Compare2a = 215 '20ms @11MHz/1024
- Pcmsk3 = &B00001100
- Enable Pcint3 : On Pcint3 Encoder_isr Nosave
- Sub Show_steps()
- Locate 2 , 9 : If Steps > 0 Then Lcd "+" : Lcd Steps ; " "
- End Sub
- Locate 1 , 5 : : Lcd "Every step"
- Call Show_steps()
- Enable Interrupts
- Do
- If Turn_l > 0 Then
- Decr Turn_l
- Incr Steps
- End If
- If Turn_r > 0 Then
- Decr Turn_r
- Decr Steps
- End If
- If Tifr2.ocf2a = 1 Then
- Tifr2.ocf2a = 1
- Incr Milis
- If Milis > 4 Then '5x20ms
- Milis = 0
- If Steps_old <> Steps Then
- Call Show_steps()
- Steps_old = Steps
- End If
- End If
- End If
- Led_a = Encoder_a
- Led_b = Encoder_b
- Loop
- End
- Encoder_isr:
- $asm
- !PUSH R16
- !PUSH R24
- !PUSH R26
- !PUSH R27
- !PUSH R30
- !PUSH R31
- !in R24, sreg
- !PUSH R24
- $end Asm
- Enc_new.0 = Encoder_a
- Enc_new.1 = Encoder_b
- Select Case Enc_new
- Case 1
- Select Case State
- Case 0 : State = 1 : Decr Steps 'pocz L krok 1
- Case 3 : State = 1 : Incr Steps 'revers z 2xHI
- Case 4 : State = 5 : Incr Steps 'progress w prawo krok 3 (bo opadaja naprzemian)
- End Select
- Case 2
- Select Case State
- Case 0 : State = 2 : Incr Steps 'pocz R krok 1
- Case 4 : State = 2 : Decr Steps 'revers z 2xHI
- Case 3 : State = 6 : Decr Steps 'progress w lewo krok 3 (bo opadaja naprzemian)
- End Select
- Case 0 '2xHI
- Select Case State
- Case 1 : State = 3 : Decr Steps 'byl pocz L krok 1 ->L krok 2 S3
- Case 2 : State = 4 : Incr Steps 'byl pocz R krok 1 ->R krok 2 S4
- Case 5 : State = 4 : Decr Steps 'revers
- Case 6 : State = 3 : Incr Steps 'revers
- End Select
- Case 3
- Select Case State
- Case 1 : State = 0 : Incr Steps
- Case 2 : State = 0 : Decr Steps
- Case 5 : Incr Steps
- Case 6 : Decr Steps
- End Select
- State = 0
- End Select
- ' Tuned with NoSave Tool
- $asm
- !POP R24
- !out sreg, r24
- !POP R31
- !POP R30
- !POP R27
- !POP R26
- !POP R24
- !POP R16
- $end Asm
- Return