Encoder by BARTek :D

Gotowe kody obsługi układów elektronicznych udostępnione przez użytkowników forum.
ODPOWIEDZ
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Encoder by BARTek :D

Post autor: niveasoft » 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

[media]https://www.youtube.com/watch?v=VTA-Wkj ... e=emb_logo[/media]
  1. $regfile = "m644pdef.dat"
  2. $crystal = 11059200
  3. $hwstack = 64
  4. $swstack = 32
  5. $framesize = 128
  6.  
  7. ' Cheap encoder PCINT FULLSTEP (one step per click)
  8. ' 2017/01/02 by BARTek EDC
  9.  
  10. Config Submode = New
  11.  
  12. Config Lcdpin = Pin , Rs = Portc.7 , E = Portc.6 , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2
  13. Config Lcd = 16x2
  14. Cursor Off , Noblink
  15. Cls
  16.  
  17. Dim Turn_l As Byte , Turn_r As Byte , Steps As Integer , Milis As Byte
  18. Dim Enc_new As Byte , Steps_old As Integer , State As Byte
  19.  
  20.  
  21. Config Portd.0 = Output : Led_a Alias Portd.0
  22. Config Portd.1 = Output : Led_b Alias Portd.1
  23.  
  24. Config Portd.2 = Input : Encoder_a Alias Pind.2 : Set Portd.2
  25. Config Portd.3 = Input : Encoder_b Alias Pind.3 : Set Portd.3
  26.  
  27. Config Timer2 = Timer , Prescale = 1024 , Compare_a = Disconnect , Clear_timer = 1
  28.  Compare2a = 215                                            '20ms @11MHz/1024
  29.  
  30. Pcmsk3 = &B00001100
  31. Enable Pcint3 : On Pcint3 Encoder_isr Nosave
  32.  
  33. Locate 1 , 6 : : Lcd "Full step"
  34.  
  35. Sub Show_steps()
  36.  Locate 2 , 9 : If Steps > 0 Then Lcd "+" : Lcd Steps ; "    "
  37. End Sub
  38.  
  39.  
  40. Call Show_steps()
  41.  
  42. Enable Interrupts
  43.  
  44. Do
  45.  
  46.  If Turn_l > 0 Then
  47.   Decr Turn_l
  48.    Incr Steps
  49.  End If
  50.  
  51.  If Turn_r > 0 Then
  52.   Decr Turn_r
  53.    Decr Steps
  54.  End If
  55.  
  56.  If Tifr2.ocf2a = 1 Then
  57.   Tifr2.ocf2a = 1
  58.   Incr Milis
  59.    If Milis > 4 Then                                        '5x20ms
  60.     Milis = 0
  61.     If Steps_old <> Steps Then
  62.  
  63.      Call Show_steps()
  64.  
  65.      Steps_old = Steps
  66.     End If
  67.    End If
  68.  End If
  69.  
  70.  Led_a = Encoder_a
  71.  Led_b = Encoder_b
  72.  
  73. Loop
  74. End
  75.  
  76.  
  77. Encoder_isr:
  78.  
  79.   $asm
  80.   !PUSH R16
  81.   !PUSH R24
  82.   !PUSH R26
  83.   !PUSH R27
  84.   !in R24, sreg
  85.   !PUSH  R24
  86.   $end Asm
  87.  
  88.    Enc_new.0 = Encoder_a
  89.    Enc_new.1 = Encoder_b
  90.  
  91.    Select Case Enc_new
  92.  
  93.     Case 1
  94.      Select Case State
  95.       Case 0 : State = 1                                    'pocz L krok 1
  96.       Case 3 : State = 1                                    'revers z 2xHI
  97.       Case 4 : State = 5                                    'progress w prawo krok 3 (bo opadaja naprzemian)
  98.      End Select
  99.  
  100.     Case 2
  101.      Select Case State
  102.       Case 0 : State = 2                                    'pocz R krok 1
  103.       Case 4 : State = 2                                    'revers z 2xHI
  104.       Case 3 : State = 6                                    'progress w lewo krok 3 (bo opadaja naprzemian)
  105.      End Select
  106.  
  107.     Case 0                                                  '2xHI
  108.      Select Case State
  109.       Case 1 : State = 3                                    'byl pocz L krok 1 ->L krok 2 S3
  110.       Case 2 : State = 4                                    'byl pocz R krok 1 ->R krok 2 S4
  111.  
  112.       Case 5 : State = 4                                    'revers
  113.       Case 6 : State = 3                                    'revers
  114.      End Select
  115.  
  116.     Case 3
  117.      Select Case State
  118.       Case 5 : Incr Turn_l
  119.       Case 6 : Incr Turn_r
  120.      End Select
  121.       State = 0
  122.  
  123.    End Select
  124.   '          Tuned with NoSave Tool
  125.  
  126.   $asm
  127.   !POP  R24
  128.   !out sreg, r24
  129.   !POP R27
  130.   !POP R26
  131.   !POP R24
  132.   !POP R16
  133.   $end Asm
  134.  
  135. Return
  1. $regfile = "m644pdef.dat"
  2. $crystal = 11059200
  3. $hwstack = 64
  4. $swstack = 32
  5. $framesize = 128
  6.  
  7. ' Cheap encoder PCINT 4xSTEP (four step per click)
  8. ' 2017/01/02 by BARTek EDC
  9.  
  10. Config Submode = New
  11.  
  12. Config Lcdpin = Pin , Rs = Portc.7 , E = Portc.6 , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2
  13. Config Lcd = 16x2
  14. Cursor Off , Noblink
  15. Cls
  16.  
  17. Dim Turn_l As Byte , Turn_r As Byte , Steps As Integer , Milis As Byte
  18. Dim Enc_new As Byte , Steps_old As Integer , State As Byte
  19.  
  20.  
  21. Config Portd.0 = Output : Led_a Alias Portd.0
  22. Config Portd.1 = Output : Led_b Alias Portd.1
  23.  
  24. Config Portd.2 = Input : Encoder_a Alias Pind.2 : Set Portd.2
  25. Config Portd.3 = Input : Encoder_b Alias Pind.3 : Set Portd.3
  26.  
  27. Config Timer2 = Timer , Prescale = 1024 , Compare_a = Disconnect , Clear_timer = 1
  28.  Compare2a = 215                                            '20ms @11MHz/1024
  29.  
  30. Pcmsk3 = &B00001100
  31. Enable Pcint3 : On Pcint3 Encoder_isr Nosave
  32.  
  33.  
  34. Sub Show_steps()
  35.  Locate 2 , 9 : If Steps > 0 Then Lcd "+" : Lcd Steps ; "    "
  36. End Sub
  37.  
  38. Locate 1 , 5 : : Lcd "Every step"
  39.  
  40. Call Show_steps()
  41.  
  42. Enable Interrupts
  43.  
  44. Do
  45.  
  46.  If Turn_l > 0 Then
  47.   Decr Turn_l
  48.    Incr Steps
  49.  End If
  50.  
  51.  If Turn_r > 0 Then
  52.   Decr Turn_r
  53.    Decr Steps
  54.  End If
  55.  
  56.  If Tifr2.ocf2a = 1 Then
  57.   Tifr2.ocf2a = 1
  58.   Incr Milis
  59.    If Milis > 4 Then                                        '5x20ms
  60.     Milis = 0
  61.     If Steps_old <> Steps Then
  62.  
  63.       Call Show_steps()
  64.  
  65.       Steps_old = Steps
  66.  
  67.     End If
  68.    End If
  69.  End If
  70.  
  71.  Led_a = Encoder_a
  72.  Led_b = Encoder_b
  73.  
  74. Loop
  75. End
  76.  
  77.  
  78. Encoder_isr:
  79.  
  80.   $asm
  81.   !PUSH R16
  82.   !PUSH R24
  83.   !PUSH R26
  84.   !PUSH R27
  85.   !PUSH R30
  86.   !PUSH R31
  87.   !in R24, sreg
  88.   !PUSH  R24
  89.   $end Asm
  90.  
  91.    Enc_new.0 = Encoder_a
  92.    Enc_new.1 = Encoder_b
  93.  
  94.    Select Case Enc_new
  95.  
  96.     Case 1
  97.      Select Case State
  98.       Case 0 : State = 1 : Decr Steps                       'pocz L krok 1
  99.       Case 3 : State = 1 : Incr Steps                       'revers z 2xHI
  100.       Case 4 : State = 5 : Incr Steps                       'progress w prawo krok 3 (bo opadaja naprzemian)
  101.      End Select
  102.  
  103.     Case 2
  104.      Select Case State
  105.       Case 0 : State = 2 : Incr Steps                       'pocz R krok 1
  106.       Case 4 : State = 2 : Decr Steps                       'revers z 2xHI
  107.       Case 3 : State = 6 : Decr Steps                       'progress w lewo krok 3 (bo opadaja naprzemian)
  108.      End Select
  109.  
  110.     Case 0                                                  '2xHI
  111.      Select Case State
  112.       Case 1 : State = 3 : Decr Steps                       'byl pocz L krok 1 ->L krok 2 S3
  113.       Case 2 : State = 4 : Incr Steps                       'byl pocz R krok 1 ->R krok 2 S4
  114.  
  115.       Case 5 : State = 4 : Decr Steps                       'revers
  116.       Case 6 : State = 3 : Incr Steps                       'revers
  117.      End Select
  118.  
  119.     Case 3
  120.      Select Case State
  121.       Case 1 : State = 0 : Incr Steps
  122.       Case 2 : State = 0 : Decr Steps
  123.  
  124.       Case 5 : Incr Steps
  125.       Case 6 : Decr Steps
  126.      End Select
  127.       State = 0
  128.  
  129.    End Select
  130.   '          Tuned with NoSave Tool
  131.  
  132.   $asm
  133.   !POP  R24
  134.   !out sreg, r24
  135.   !POP R31
  136.   !POP R30
  137.   !POP R27
  138.   !POP R26
  139.   !POP R24
  140.   !POP R16
  141.   $end Asm
  142.  
  143. Return
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Encoder by BARTek :D

Post autor: niveasoft » 22 paź 2020, 18:13

Wersja na trzy enkodery (kod wycięty z jakiegoś projektu).

Jeśli ma być zastosowany enkoder zwierany do masy należy zmienić stałą Const Intermediate = 0
  1. $regfile = "m644pdef.dat"                                   '64K FLASH, 4K SRAM, 2K EEPROM, 2xUSART
  2. $crystal = 16000000
  3. $hwstack = 128
  4. $swstack = 64
  5. $framesize = 128
  6.  
  7. $baud1 = 115200
  8.  Open "COM2:" For Binary As #2
  9.   Debug Off
  10.  
  11. Config Submode = New
  12.  
  13. Const Intermediate = 1                                      'przy przejściu obydwa plus=1  obydwa minus=0
  14.  
  15.  
  16. '*********************************************************
  17. '*                                                       *
  18. '*********************************************************
  19.   Dim Enc_new As Byte
  20.   Dim Steps(3) As Long , Old_steps(3) As Long , Sign(3) As Long
  21.  
  22. '-----------------------------------[ENC X]---------------
  23.   Dim State1 As Byte
  24.  
  25.   Config Portb.0 = Input : Encoder1_a Alias Pinb.0 : Set Portb.0       'PCINT8
  26.   Config Portb.1 = Input : Encoder1_b Alias Pinb.1 : Set Portb.1       'PCINT9
  27.  
  28.    Pcmsk1 = &B0000_0011
  29.    Enable Pcint1 : On Pcint1 Encoder1_isr Nosave
  30.  
  31. '-----------------------------------[ENC Y]---------------
  32.   Dim State2 As Byte
  33.  
  34.   Config Portc.0 = Input : Encoder2_a Alias Pinc.0 : Set Portc.0       'PCINT16
  35.   Config Portc.1 = Input : Encoder2_b Alias Pinc.1 : Set Portc.1       'PCINT17
  36.  
  37.    Pcmsk2 = &B0000_0011
  38.    Enable Pcint2 : On Pcint2 Encoder2_isr Nosave
  39.  
  40. '-----------------------------------[ENC Z]---------------
  41.   Dim State3 As Byte
  42.  
  43.   Config Portd.0 = Input : Encoder3_a Alias Pind.0 : Set Portd.0       'PCINT24
  44.   Config Portd.1 = Input : Encoder3_b Alias Pind.1 : Set Portd.1       'PCINT25
  45.  
  46.    Pcmsk3 = &B0000_0011
  47.    Enable Pcint3 : On Pcint3 Encoder3_isr Nosave
  48.  
  49.  
  50. Enable Interrupts
  51.  
  52.  
  53. Do
  54.  
  55.  If Old_steps(1) <> Steps(1) Then
  56.   Old_steps(1) = Steps(1)
  57.  
  58.  End If
  59.  
  60.  If Old_steps(2) <> Steps(2) Then
  61.   Old_steps(2) = Steps(2)
  62.  
  63.  End If
  64.  
  65.  If Old_steps(3) <> Steps(3) Then
  66.   Old_steps(3) = Steps(3)
  67.  
  68.  End If
  69.  
  70.  
  71. Loop
  72. End
  73.  
  74. Encoder1_isr:
  75.  
  76.   $asm
  77.   !PUSH R16
  78.   !PUSH R17
  79.   !PUSH R18
  80.   !PUSH R19
  81.   !PUSH R20
  82.   !PUSH R24
  83.   !PUSH R26
  84.   !PUSH R27
  85.   !IN R24, SREG
  86.   !PUSH  R24
  87.   $end Asm
  88.  
  89.    Enc_new = Pinb And &B0000_0011
  90.  
  91.       Select Case Enc_new
  92.  
  93.        Case 1
  94.         Select Case State1
  95.          Case 0 : State1 = 1
  96.          Case 3 : State1 = 1
  97.          Case 4 : State1 = 5
  98.         End Select
  99.  
  100.        Case 2
  101.         Select Case State1
  102.          Case 0 : State1 = 2
  103.          Case 4 : State1 = 2
  104.          Case 3 : State1 = 6
  105.         End Select
  106.  
  107.        #if Intermediate = 1
  108.         Case 3
  109.        #else
  110.         Case 0
  111.        #endif
  112.  
  113.         Select Case State1
  114.          Case 1 : State1 = 3
  115.          Case 2 : State1 = 4
  116.  
  117.          Case 5 : State1 = 4
  118.          Case 6 : State1 = 3
  119.         End Select
  120.  
  121.        #if Intermediate = 1
  122.         Case 0
  123.        #else
  124.         Case 3
  125.        #endif
  126.  
  127.         Select Case State1
  128.          Case 5 : Incr Steps(1)                             ': Set L_led : Reset R_led
  129.          Case 6 : Decr Steps(1)                             ': Set R_led : Reset L_led
  130.         End Select
  131.          State1 = 0
  132.  
  133.       End Select
  134.  
  135.  
  136.   '#  PUT YOUR ISR ROUTINES HERE   #
  137.   '          Tuned with NoSave Tool 1.10
  138.  
  139.   $asm
  140.   !POP  R24
  141.   !OUT SREG, R24
  142.   !POP R27
  143.   !POP R26
  144.   !POP R24
  145.   !POP R20
  146.   !POP R19
  147.   !POP R18
  148.   !POP R17
  149.   !POP R16
  150.   $end Asm
  151.  
  152. Return
  153.  
  154. Encoder2_isr:
  155.  
  156.   $asm
  157.   !PUSH R16
  158.   !PUSH R17
  159.   !PUSH R18
  160.   !PUSH R19
  161.   !PUSH R20
  162.   !PUSH R24
  163.   !PUSH R26
  164.   !PUSH R27
  165.   !IN R24, SREG
  166.   !PUSH  R24
  167.   $end Asm
  168.  
  169.    Enc_new = Pinc And &B0000_0011
  170.  
  171.       Select Case Enc_new
  172.  
  173.        Case 1
  174.         Select Case State2
  175.          Case 0 : State2 = 1
  176.          Case 3 : State2 = 1
  177.          Case 4 : State2 = 5
  178.         End Select
  179.  
  180.        Case 2
  181.         Select Case State2
  182.          Case 0 : State2 = 2
  183.          Case 4 : State2 = 2
  184.          Case 3 : State2 = 6
  185.         End Select
  186.  
  187.        #if Intermediate = 1
  188.         Case 3
  189.        #else
  190.         Case 0
  191.        #endif
  192.  
  193.         Select Case State2
  194.          Case 1 : State2 = 3
  195.          Case 2 : State2 = 4
  196.  
  197.          Case 5 : State2 = 4
  198.          Case 6 : State2 = 3
  199.         End Select
  200.  
  201.        #if Intermediate = 1
  202.         Case 0
  203.        #else
  204.         Case 3
  205.        #endif
  206.  
  207.         Select Case State2
  208.          Case 5 : Incr Steps(3)                             ': Set L_led : Reset R_led
  209.          Case 6 : Decr Steps(3)                             ': Set R_led : Reset L_led
  210.         End Select
  211.          State2 = 0
  212.  
  213.       End Select
  214.  
  215.  
  216.   '#  PUT YOUR ISR ROUTINES HERE   #
  217.   '          Tuned with NoSave Tool 1.10
  218.  
  219.   $asm
  220.   !POP  R24
  221.   !OUT SREG, R24
  222.   !POP R27
  223.   !POP R26
  224.   !POP R24
  225.   !POP R20
  226.   !POP R19
  227.   !POP R18
  228.   !POP R17
  229.   !POP R16
  230.   $end Asm
  231.  
  232. Return
  233.  
  234. Encoder3_isr:
  235.  
  236.   $asm
  237.   !PUSH R16
  238.   !PUSH R17
  239.   !PUSH R18
  240.   !PUSH R19
  241.   !PUSH R20
  242.   !PUSH R24
  243.   !PUSH R26
  244.   !PUSH R27
  245.   !IN R24, SREG
  246.   !PUSH  R24
  247.   $end Asm
  248.  
  249.    Enc_new = Pind And &B0000_0011
  250.  
  251.       Select Case Enc_new
  252.  
  253.        Case 1
  254.         Select Case State3
  255.          Case 0 : State3 = 1
  256.          Case 3 : State3 = 1
  257.          Case 4 : State3 = 5
  258.         End Select
  259.  
  260.        Case 2
  261.         Select Case State3
  262.          Case 0 : State3 = 2
  263.          Case 4 : State3 = 2
  264.          Case 3 : State3 = 6
  265.         End Select
  266.  
  267.        #if Intermediate = 1
  268.         Case 3
  269.        #else
  270.         Case 0
  271.        #endif
  272.  
  273.         Select Case State3
  274.          Case 1 : State3 = 3
  275.          Case 2 : State3 = 4
  276.  
  277.          Case 5 : State3 = 4
  278.          Case 6 : State3 = 3
  279.         End Select
  280.  
  281.        #if Intermediate = 1
  282.         Case 0
  283.        #else
  284.         Case 3
  285.        #endif
  286.  
  287.         Select Case State3
  288.          Case 5 : Incr Steps(2)                             ': Set L_led : Reset R_led
  289.          Case 6 : Decr Steps(2)                             ': Set R_led : Reset L_led
  290.         End Select
  291.          State3 = 0
  292.  
  293.       End Select
  294.  
  295.  
  296.   '#  PUT YOUR ISR ROUTINES HERE   #
  297.   '          Tuned with NoSave Tool 1.10
  298.  
  299.   $asm
  300.   !POP  R24
  301.   !OUT SREG, R24
  302.   !POP R27
  303.   !POP R26
  304.   !POP R24
  305.   !POP R20
  306.   !POP R19
  307.   !POP R18
  308.   !POP R17
  309.   !POP R16
  310.   $end Asm
  311.  
  312. Return
  313.  
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Encoder by BARTek :D

Post autor: Henryk » 23 paź 2020, 10:17

Witam :D
Ciekawość nie dała mi spokoju , musiałem przetestować program na atmegu 328 .
Aby przystosować program z m644 do atmega328 należy wprowadzić zmiany w poniższych liniach ;) testowałem dwa pierwsze przykłady .
  1. Pcmsk2 = &B00001100
  2. Enable Pcint2 : On Pcint2 Encoder_isr Nosave
Dlaczego :?: .....wyjaśnienie w linku :arrow: KLIK
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Encoder by BARTek :D

Post autor: niveasoft » 23 paź 2020, 11:09

No to chyba nie wystarczy :D
Jak już tak piszesz to lepiej zamieść cały działający przykład bo tu trzeba zmienić Aliasy dla Encoder_a i Encoder_b
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Encoder by BARTek :D

Post autor: Henryk » 23 paź 2020, 12:01

A dlaczego miałbym zmieniać aliasy , jeśli chcę zachować te wejścia Encoder_a i Encoder_b :?:
Ktoś kto będzie chciał sobie zmienić , to je sobie zmieni ;)
  1. $regfile = "m328pdef.dat"
  2. $crystal = 11059200
  3. $hwstack = 64
  4. $swstack = 32
  5. $framesize = 128
  6.  
  7. ' Cheap encoder PCINT 4xSTEP (four step per click)
  8. ' 2017/01/02 by BARTek EDC
  9.  
  10. Config Submode = New
  11. Config Lcd = 20x4
  12. Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
  13. Cursor Off , Noblink
  14. Cls
  15.  
  16. Dim Turn_l As Byte , Turn_r As Byte , Steps As Integer , Milis As Byte
  17. Dim Enc_new As Byte , Steps_old As Integer , State As Byte
  18.  
  19.  
  20. Config Portd.0 = Output : Led_a Alias Portd.0
  21. Config Portd.1 = Output : Led_b Alias Portd.1
  22.  
  23. Config Portd.2 = Input : Encoder_a Alias Pind.2 : Set Portd.2
  24. Config Portd.3 = Input : Encoder_b Alias Pind.3 : Set Portd.3
  25.  
  26. Config Timer2 = Timer , Prescale = 1024 , Compare_a = Disconnect , Clear_timer = 1
  27.  Compare2a = 215                                            '20ms @11MHz/1024
  28.  
  29. Pcmsk2 = &B00001100
  30. Enable Pcint2 : On Pcint2 Encoder_isr Nosave
  31.  
  32.  
  33. Sub Show_steps()
  34.  Locate 2 , 9 : If Steps > 0 Then Lcd "+" : Lcd Steps ; "    "
  35. End Sub
  36.  
  37. Locate 1 , 5 : : Lcd "Every step"
  38.  
  39. Call Show_steps()
  40.  
  41. Enable Interrupts
  42.  
  43. Do
  44.  
  45.  If Turn_l > 0 Then
  46.   Decr Turn_l
  47.    Incr Steps
  48.  End If
  49.  
  50.  If Turn_r > 0 Then
  51.   Decr Turn_r
  52.    Decr Steps
  53.  End If
  54.  
  55.  If Tifr2.ocf2a = 1 Then
  56.   Tifr2.ocf2a = 1
  57.   Incr Milis
  58.    If Milis > 4 Then                                        '5x20ms
  59.     Milis = 0
  60.     If Steps_old <> Steps Then
  61.  
  62.       Call Show_steps()
  63.  
  64.       Steps_old = Steps
  65.  
  66.     End If
  67.    End If
  68.  End If
  69.  
  70.  Led_a = Encoder_a
  71.  Led_b = Encoder_b
  72.  
  73. Loop
  74. End
  75.  
  76.  
  77. Encoder_isr:
  78.  
  79.   $asm
  80.   !PUSH R16
  81.   !PUSH R24
  82.   !PUSH R26
  83.   !PUSH R27
  84.   !PUSH R30
  85.   !PUSH R31
  86.   !in R24, sreg
  87.   !PUSH  R24
  88.   $end Asm
  89.  
  90.    Enc_new.0 = Encoder_a
  91.    Enc_new.1 = Encoder_b
  92.  
  93.    Select Case Enc_new
  94.  
  95.     Case 1
  96.      Select Case State
  97.       Case 0 : State = 1 : Decr Steps                       'pocz L krok 1
  98.       Case 3 : State = 1 : Incr Steps                       'revers z 2xHI
  99.       Case 4 : State = 5 : Incr Steps                       'progress w prawo krok 3 (bo opadaja naprzemian)
  100.      End Select
  101.  
  102.     Case 2
  103.      Select Case State
  104.       Case 0 : State = 2 : Incr Steps                       'pocz R krok 1
  105.       Case 4 : State = 2 : Decr Steps                       'revers z 2xHI
  106.       Case 3 : State = 6 : Decr Steps                       'progress w lewo krok 3 (bo opadaja naprzemian)
  107.      End Select
  108.  
  109.     Case 0                                                  '2xHI
  110.      Select Case State
  111.       Case 1 : State = 3 : Decr Steps                       'byl pocz L krok 1 ->L krok 2 S3
  112.       Case 2 : State = 4 : Incr Steps                       'byl pocz R krok 1 ->R krok 2 S4
  113.  
  114.       Case 5 : State = 4 : Decr Steps                       'revers
  115.       Case 6 : State = 3 : Incr Steps                       'revers
  116.      End Select
  117.  
  118.     Case 3
  119.      Select Case State
  120.       Case 1 : State = 0 : Incr Steps
  121.       Case 2 : State = 0 : Decr Steps
  122.  
  123.       Case 5 : Incr Steps
  124.       Case 6 : Decr Steps
  125.      End Select
  126.       State = 0
  127.  
  128.    End Select
  129.   '          Tuned with NoSave Tool
  130.  
  131.   $asm
  132.   !POP  R24
  133.   !out sreg, r24
  134.   !POP R31
  135.   !POP R30
  136.   !POP R27
  137.   !POP R26
  138.   !POP R24
  139.   !POP R16
  140.   $end Asm
  141.  
  142. Return
W tym programie zmieniłem również LCD , z racji "sztywnego" połączenia na płycie testowej .
ODPOWIEDZ