Xmega - inkrementacja zmiennej niezależnie od kierunku

Rodzina procesorów bogatszych w wiele nowych rozwiązań i dlatego warto po nie sięgnąć.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Xmega - inkrementacja zmiennej niezależnie od kierunku

Post autor: Jacek » 23 cze 2021, 21:46

Witam - proszę o pomoc w ustawieniu konfiguracji systemu zdarzeń do enkodera aby niezależnie od kierunku obrotu enkodera zmienna była zawsze inkrementowana w tym przykładzie
  1.  
  2.  '***********************************************************************
  3. 'Xmega quadrature encoder test base on MAK3 exaple
  4.  'Przyklad 2
  5. '$sim
  6. $regfile = "xm128a3udef.dat"
  7. $crystal = 32000000
  8. $hwstack = 64
  9. $swstack = 64
  10. $framesize = 64
  11.  
  12. 'Enable The Osc
  13. Config Osc = Enabled , 32mhzosc = Enabled
  14.  
  15. ' ***************** SYSTEM CLOCK CONFIG ********************************
  16. '                INTERNAL 32MHz NO PRESCALE
  17. '
  18. Config Osc = Disabled , 32mhzosc = Enabled , 32khzosc = Enabled
  19. Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
  20. '
  21. 'ENABLING AUTOMATIC OSCILLATOR CALIBRATION
  22. Osc_dfllctrl.0 = 1
  23. Dfllrc32m_ctrl.0 = 1
  24. '
  25. '***********************************************************************
  26. Config Priority = Static , Vector = Application , Lo = Enabled       'Enable Lo Level Interrupts
  27. '***********************************************************************
  28. '*******************Xmega 128A3U***********************
  29. '* UART *********** TX pin  *  RX pin                 *
  30. '* ****************************************************
  31. '* COM1 - UART_C0 * PORTC.3 * PORTC.2                 *
  32. '******************************************************
  33. '* COM2 - UART_C1 * PORTC.7 * PORTC.6                 *
  34. '******************************************************
  35. '* COM3 - UART_D0 * PORTD.3 * PORTD.2                 *
  36. '******************************************************
  37. '* COM4 - UART_D1 * PORTD.7 * PORTD.6                 *
  38. '******************************************************
  39. '* COM5 - UART_E0 * PORTE.3 * PORTE.2                 *
  40. '******************************************************
  41. '* COM6 - UART_E1 * PORTE.7 * PORTE.6                 *
  42. '******************************************************
  43. '* COM7 - UART_F0 * PORTF.3 * PORTF.2                 *
  44. '******************************************************
  45. '* COM8 - UART_F1 * PORTF.7 * PORTF.6                 *
  46. '******************************************************
  47.  
  48. '***********************************************************************
  49. Dim Buart_channel As Byte                                   '0 = COM1 ...... 7 = COM8
  50. Config Com5 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8       'COM3 - UART_D0 PORTD.3 PORTD.2
  51. Config Com4 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8       'COM3 - UART_D0 PORTD.3 PORTD.2
  52. Config Com3 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8       'COM3 - UART_D0 PORTD.3 PORTD.2
  53. Config Com1 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8       'COM1 - UART_C0 PORTC.3 PORTC.2
  54. Buart_channel = 4
  55.  
  56. Print #buart_channel , "This use COM3"                      'print current Uart
  57. Print #buart_channel , "MCU Rev. = " ; Mcu_revid            'version of the MCU
  58.  
  59.  
  60. '***********************************************************************
  61. Dim Enkoder_tmp As Dword                                    'zmienna dla enkodera
  62. Dim Enkoder_tmp_1 As Dword
  63. Enable Interrupts                                           'włacz przerwania globalne
  64. '***********************************************************************
  65. 'config pinA.2 = input                                       'index pin of encoder
  66. Config Pina.1 = Input                                       'encoder B
  67. Config Pina.0 = Input                                       'enkoder A
  68. 'Config Xpin = PinA.2 , Outpull = pullup , Sense = low_level
  69. Config Xpin = Porta.1 , Outpull = Pullup , Sense = Low_level       'enable Pull up and reaction on low level
  70. Config Xpin = Porta.0 , Outpull = Pullup , Sense = Low_level
  71. 'konfigurujemy system zdarzeń
  72.  
  73. Config Event_system = Dummy , Mux0 = Porta.0 , Qd0 = Enabled , Digflt0 = 8
  74. 'konfiguracja systemu zdarzeń multiplexer kanał 0 , portA.0, obsługa enkodera QDO właczona, filtr  cyfrowy 8
  75.  
  76. 'gdy używamy idndexu musimy dodać QDIO=enabled
  77. 'config Event_system = Dummy , Mux0 = portA.0 , QD0 = enabled , QDI0 = enabled , Digflt0 = 8
  78.  
  79.  
  80. '***********************************************************************
  81. ''Config Tcd0 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec
  82. Config Tcd1 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec
  83. 'konfiguracja timera TCD0 normal= bez generowania sygnałów, preskaler =e0, zródło zdarzenia=podajemy zródło czyli event system
  84. 'kanał 0 , event action =czyli reakcja na zdarzenie QDEC właczenie obsługi enkodera
  85. '***********************************************************************
  86.  
  87. Enkoder_tmp = 0
  88.  
  89.  
  90. Do
  91.  
  92.    If Tcd1_cnt <> Enkoder_tmp Then                          'jesli zawartosc timera TCD0 jest różna od naszej zmiennej to
  93.       Enkoder_tmp = Tcd1_cnt                                'przepisz nową wartość z timera TCD0 do zmiennej enkoder_tmp
  94.       Enkoder_tmp_1 = Enkoder_tmp / 4
  95.       Print #buart_channel , "Enkoder_temp_1 " ; Enkoder_tmp_1       'wyśli przez port szeregowy 2 (zmienna buart=2)
  96.    End If
  97.  
  98.  
  99.   'na ekranie termianla zobaczymy liczbe impulsów policzonych przez nasz timer.
  100.   'na jeden przeskok enkodera przypadaja 4 impulsy
  101.  
  102.  
  103. Loop
  104.  
  105. End                                                         'end program  
  106.  
podczas kręcenia w prawo zwiększa się od 0 do maksimum, kręcąc w lewo startuje od maksimum i zlicza do zera.
Potrzebuje aby zawsze zliczała od zera do maksimum potrzebne od obrotomierza.
pozdrawiam Jacek.
Awatar użytkownika
niveasoft
Posty: 1207
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Xmega - inkrementacja zmiennej niezależnie od kierunku

Post autor: niveasoft » 23 cze 2021, 22:01

Może nie do końca rozumiem, ale zobacz tak:
  1. If Tcd1_cnt <> Enkoder_tmp Then    'jesli zawartosc timera TCD0 jest różna od naszej zmiennej to
  2.     Enkoder_tmp = Tcd1_cnt    'przepisz nową wartość z timera TCD0 do zmiennej enkoder_tmp
  3.    Incr  Enkoder_tmp_1
  4.     Print #buart_channel , "Enkoder_temp_1 " ; Enkoder_tmp_1       'wyśli przez port szeregowy 2 (zmienna buart=2)
  5. End If
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Xmega - inkrementacja zmiennej niezależnie od kierunku

Post autor: Jacek » 23 cze 2021, 22:22

Witam - dziękuje za odpowiedź może ten filmik zobrazuje co się dzieje https://www.youtube.com/watch?v=FCh0ZKy9ujU

pozdrawiam Jacek
P.S. niestety wstawienie
  1.   Incr Enkoder_tmp
nie pomaga Paweł w tym wątku viewtopic.php?f=18&t=354 sugerował wymuszenie bitu ale nie bardzo wiem jak to ustawić i który to bit.
Awatar użytkownika
niveasoft
Posty: 1207
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Xmega - inkrementacja zmiennej niezależnie od kierunku

Post autor: niveasoft » 23 cze 2021, 22:38

Nie Encoder_temp tylko Encoder_temp_1
Weź tam gdzie obliczasz te obroty użyj tej drugiej zmiennej. Przecież to ona w Twoim przykładzie jest wysyłana na UART a nie ta pierwsza i ta druga raczej działa.
Ewentualnie będziesz musiał ją przed obliczeniami podzielić przez cztery (Shift Right , 2).
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Xmega - inkrementacja zmiennej niezależnie od kierunku

Post autor: Jacek » 23 cze 2021, 22:55

Czy tak jest poprawnie
  1.  '***********************************************************************
  2. 'Xmega quadrature encoder test base on MAK3 exaple
  3.  'Przyklad 2
  4. '$sim
  5. $regfile = "xm128a3udef.dat"
  6. $crystal = 32000000
  7. $hwstack = 64
  8. $swstack = 64
  9. $framesize = 64
  10.  
  11. 'Enable The Osc
  12. Config Osc = Enabled , 32mhzosc = Enabled
  13.  
  14. ' ***************** SYSTEM CLOCK CONFIG ********************************
  15. '                INTERNAL 32MHz NO PRESCALE
  16. '
  17. Config Osc = Disabled , 32mhzosc = Enabled , 32khzosc = Enabled
  18. Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
  19. '
  20. 'ENABLING AUTOMATIC OSCILLATOR CALIBRATION
  21. Osc_dfllctrl.0 = 1
  22. Dfllrc32m_ctrl.0 = 1
  23. '
  24. '***********************************************************************
  25. Config Priority = Static , Vector = Application , Lo = Enabled       'Enable Lo Level Interrupts
  26. '***********************************************************************
  27. '*******************Xmega 128A3U***********************
  28. '* UART *********** TX pin  *  RX pin                 *
  29. '* ****************************************************
  30. '* COM1 - UART_C0 * PORTC.3 * PORTC.2                 *
  31. '******************************************************
  32. '* COM2 - UART_C1 * PORTC.7 * PORTC.6                 *
  33. '******************************************************
  34. '* COM3 - UART_D0 * PORTD.3 * PORTD.2                 *
  35. '******************************************************
  36. '* COM4 - UART_D1 * PORTD.7 * PORTD.6                 *
  37. '******************************************************
  38. '* COM5 - UART_E0 * PORTE.3 * PORTE.2                 *
  39. '******************************************************
  40. '* COM6 - UART_E1 * PORTE.7 * PORTE.6                 *
  41. '******************************************************
  42. '* COM7 - UART_F0 * PORTF.3 * PORTF.2                 *
  43. '******************************************************
  44. '* COM8 - UART_F1 * PORTF.7 * PORTF.6                 *
  45. '******************************************************
  46.  
  47. '***********************************************************************
  48. Dim Buart_channel As Byte                                   '0 = COM1 ...... 7 = COM8
  49. Config Com5 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8       'COM3 - UART_D0 PORTD.3 PORTD.2
  50. Config Com4 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8       'COM3 - UART_D0 PORTD.3 PORTD.2
  51. Config Com3 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8       'COM3 - UART_D0 PORTD.3 PORTD.2
  52. Config Com1 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8       'COM1 - UART_C0 PORTC.3 PORTC.2
  53. Buart_channel = 4
  54.  
  55. Print #buart_channel , "This use COM3"                      'print current Uart
  56. Print #buart_channel , "MCU Rev. = " ; Mcu_revid            'version of the MCU
  57.  
  58.  
  59. '***********************************************************************
  60. Dim Enkoder_tmp As Dword                                    'zmienna dla enkodera
  61. Dim Enkoder_tmp_1 As Dword
  62. Enable Interrupts                                           'włacz przerwania globalne
  63. '***********************************************************************
  64. 'config pinA.2 = input                                       'index pin of encoder
  65. Config Pina.1 = Input                                       'encoder B
  66. Config Pina.0 = Input                                       'enkoder A
  67. 'Config Xpin = PinA.2 , Outpull = pullup , Sense = low_level
  68. Config Xpin = Porta.1 , Outpull = Pullup , Sense = Low_level       'enable Pull up and reaction on low level
  69. Config Xpin = Porta.0 , Outpull = Pullup , Sense = Low_level
  70. 'konfigurujemy system zdarzeń
  71.  
  72. Config Event_system = Dummy , Mux0 = Porta.0 , Qd0 = Enabled , Digflt0 = 8
  73. 'konfiguracja systemu zdarzeń multiplexer kanał 0 , portA.0, obsługa enkodera QDO właczona, filtr  cyfrowy 8
  74.  
  75. 'gdy używamy idndexu musimy dodać QDIO=enabled
  76. 'config Event_system = Dummy , Mux0 = portA.0 , QD0 = enabled , QDI0 = enabled , Digflt0 = 8
  77.  
  78.  
  79. '***********************************************************************
  80. ''Config Tcd0 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec
  81. Config Tcd1 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec
  82. 'konfiguracja timera TCD0 normal= bez generowania sygnałów, preskaler =e0, zródło zdarzenia=podajemy zródło czyli event system
  83. 'kanał 0 , event action =czyli reakcja na zdarzenie QDEC właczenie obsługi enkodera
  84. '***********************************************************************
  85.  
  86. Enkoder_tmp = 0
  87.  
  88.  
  89. Do
  90.  
  91.    If Tcd1_cnt <> Enkoder_tmp Then                          'jesli zawartosc timera TCD0 jest różna od naszej zmiennej to
  92.       Enkoder_tmp = Tcd1_cnt                                'przepisz nową wartość z timera TCD0 do zmiennej enkoder_tmp
  93.       Enkoder_tmp_1 = Enkoder_tmp
  94.       Incr Enkoder_tmp_1                                    'Enkoder_tmp_1
  95.       Shift Enkoder_tmp_1 , Right , 2                       'Shift Enkoder_tmp_1 , Right , 2
  96.    Print #buart_channel , "Enkoder_temp_1 " ; Enkoder_tmp_1 'wyśli przez port szeregowy 2 (zmienna buart=2)
  97.    End If
  98.  
  99.  
  100.   'na ekranie termianla zobaczymy liczbe impulsów policzonych przez nasz timer.
  101.   'na jeden przeskok enkodera przypadaja 4 impulsy
  102.  
  103.  
  104. Loop
  105.  
  106. End  
niestety nic to nie dało w terminalu widać że jak kręcę w prawo to zmienna zwiększa się od 0, kręcąc w lewo i przechodząc przez 0 zamiast zwiększać się od 0 to wyskakuje od razu 16384 ( wynik podziału 65536 przez 4 ) i zmniejsza się w dół.
Awatar użytkownika
niveasoft
Posty: 1207
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Xmega - inkrementacja zmiennej niezależnie od kierunku

Post autor: niveasoft » 23 cze 2021, 22:58

Zrób sobie kawę albo idź spać :P
No wykasuj to w linii 93 Enkoder_tmp_1 = Enkoder_tmp. To jest niepotrzebne.
Tylko tej zmiennej tu nie dziel przez cztery bo to też bezsens. Jeden przez cztery to zawsze będzie zero. Usuń linię 95.
Dziel ją tam gdzie robisz obliczenia co sekundę i potem wyzeruj.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Xmega - inkrementacja zmiennej niezależnie od kierunku

Post autor: Jacek » 23 cze 2021, 23:01

hi kawy już nie - rano trza w qrl'u na dachu montować dalej instalację PV.
pozdrawiam Jacek.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Xmega - inkrementacja zmiennej niezależnie od kierunku

Post autor: Jacek » 26 cze 2021, 23:33

Witam - zadziałało - mierzy obroty i w lewo i w prawo
Sub pomiaru obrotów wygląda tak:
  1.  'odczyt obrotów wrzeciona tokarki
  2. $nocompile
  3. Sub Rpm_odczyt
  4.  '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
  5.  'by Paweł Pikczu & Bartek Niveasoft
  6.    If Tce0_cnt <> Rpm_enkoder_tmp Then                      'jesli zawartosc timera TCD0 jest różna od naszej zmiennej to
  7.       Rpm_enkoder_tmp = Tce0_cnt                            'przepisz nową wartość z timera TCD0 do zmiennej enkoder_tmp
  8.       Incr Rpm_enkoder_tmp_1
  9.    End If
  10. '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
  11. End Sub
Wywołanie suba:
  1. Do
  2. '''Waitms 500
  3. '''Printbin #dwin , &H5A ; &HA5 ; &H04 ; &H83 ; &H140 ; &H01   '[pl] wyslij zapytanie do LCD  [en] sent request to lcd
  4. '#dwin -[pl] numer portu com deklarowany w w prgramie glownym  [en] com port declared in mian file
  5. '&H5a -[pl] naglowek transmisi 1 [en] transmistion header 1
  6. '&Ha5 -[pl] naglowek transmisi 2 [en] transmistion header 2
  7. '&H04 -[pl] ile bajtow wysylamy  [en] nuber of bytes to sent
  8. '&H83- [pl] komenda odczyt       [en] read commnad
  9. 'Dwin_ad- [pl] adres w pamieci wyswietlacza [en] memmory adress
  10. '&H01-[pl] ile zimmeych odczytaj (word) [en] numer of words to read
  11. '[pl] tu odczytujemy tyko jednego worda [en] we are reading only one word here
  12.  
  13.    Call Rpm_odczyt
  14.    If Sw_auto = 0 Then
  15.       Call Posuw_auto
  16.    End If
  17.    If Sw_man = 0 Then
  18.       Call Z_os_odczyt
  19.    End If
  20.  
  21. '------------------------------------------------
  22.    If Tcf0_intflags.0 = 1 Then
  23.       Flaga1ms = 1
  24.       Incr Timer_tikx1
  25.       Tcf0_intflags.0 = 1
  26.    End If
  27. '------------------------------------------------
  28.    If Timer_tikx1 >= 10 Then
  29.       Incr Timer_tikx10
  30.       Flaga10ms = 1
  31.       Timer_tikx1 = 0
  32.    End If
  33. '------------------------------------------------
  34.    If Timer_tikx10 >= 5 Then
  35.       Incr Timer_tikx50
  36.       Flaga50ms = 1
  37.       Timer_tikx10 = 0
  38.    End If
  39. '------------------------------------------------
  40.    If Timer_tikx50 >= 2 Then
  41.       Incr Timer_tikx100
  42.       Flaga100ms = 1
  43.       Timer_tikx50 = 0
  44.    End If
  45. '------------------------------------------------
  46.    If Timer_tikx100 >= 5 Then
  47.       Incr Timer_tikx500
  48.       Flaga500ms = 1
  49.       Timer_tikx100 = 0
  50.    End If
  51. '------------------------------------------------
  52.    If Timer_tikx500 >= 2 Then
  53.       Incr Timer_tikx1000
  54.       Flaga1s = 1
  55.       Timer_tikx500 = 0
  56.    End If
  57. '======================================
  58.    If Flaga1ms = 1 Then
  59. '***********************PRACA RĘCZNA*****************************
  60.       If Sw_man = 0 Then
  61. '***********************OŚ Z*********************************************
  62.          If Motor_step_pin_z = 1 Then                       'jeżeli na pinie Motor_step_z jest stan wysoki
  63.             Reset Motor_step_pin_z                          'ustaw stan niski na pinie Motor_step_z
  64.          Else                                               ' inaczej
  65.             Select Case Steps_z                             'zmienna typu integer
  66.                Case Is < 0                                  'jeśli zmienna Steps_z jest mniejsza od 0 to
  67.                   Incr Steps_z                              'zwiększaj zmienną Steps_z
  68.                   'Incr Z_dro_tmp
  69.                   Call Ustaw_kierunek_z_l                   'wywołaj podprogram zmiany kierunku obrotów silnika w lewo
  70.                   Set Motor_step_pin_z                      'ustaw stan wysoki na pinie Motor_step_z
  71.                Case Is > 0                                  'jeśli zmienna Steps_z jest większa od 0 to
  72.                   Decr Steps_z                              'zmiejszaj zmienną Steps_z
  73.                   'Decr Z_dro_tmp
  74.                   Call Ustaw_kierunek_z_r                   'wywołaj podprogram zmiany kierunku obrotów silnika w prawo
  75.                   Set Motor_step_pin_z                      'ustaw stan wysoki na pinie Motor_step_z
  76.             End Select
  77.          End If                                             'koniec warunku Motor_step_pin_z
  78. '********************** OŚ X*****************************************
  79. '         If Motor_step_pin_x = 1 Then
  80. '            Reset Motor_step_pin_x
  81. '         Else
  82. '            Select Case Steps_x
  83. '               Case Is < 0
  84. '                  Incr Steps_x
  85. '                  Call Ustaw_kierunek_x_l
  86. '                  Set Motor_step_pin_x
  87. '               Case Is > 0
  88. '                  Decr Steps_x
  89. '                  Call Ustaw_kierunek_x_r
  90. '                  Set Motor_step_pin_x
  91. '            End Select
  92. '         End If
  93.       End If
  94. '******************************************************************
  95. '******************PRACA AUTOMATYCZNA*************************
  96.       If Sw_auto = 0 Then
  97. '*****************OŚ Z***********************************************
  98.          If Motor_step_pin_z = 1 Then                       'jeżeli na pinie Motor_step_z jest stan wysoki
  99.             Reset Motor_step_pin_z                          'ustaw stan niski na pinie Motor_step_z
  100.          Else                                               ' inaczej
  101.             Select Case Steps_z_auto                        'zmienna typu integer
  102.                Case Is < 0                                  'jeśli zmienna Steps_z jest mniejsza od 0 to
  103.                   Incr Steps_z_auto                         'zwiększaj zmienną Steps_z_auto
  104.                   Call Ustaw_kierunek_z_l                   'wywołaj podprogram zmiany kierunku obrotów silnika w lewo
  105.                   Set Motor_step_pin_z                      'ustaw stan wysoki na pinie Motor_step_z
  106.                Case Is > 0                                  'jeśli zmienna Steps_z jest większa od 0 to
  107.                   Decr Steps_z_auto                         'zmiejszaj zmienną Steps_z_auto
  108.                   Call Ustaw_kierunek_z_r                   'wywołaj podprogram zmiany kierunku obrotów silnika w prawo
  109.                   Set Motor_step_pin_z                      'ustaw stan wysoki na pinie Motor_step_z
  110.             End Select
  111.          End If                                             'koniec warunku Motor_step_pin_z
  112.       End If
  113.    End If
  114. '------------------------------------------------
  115.    If Flaga10ms = 1 Then
  116.       Flaga10ms = 0
  117.    End If
  118. '------------------------------------------------
  119.    If Flaga100ms = 1 Then
  120.       Flaga100ms = 0
  121.    End If
  122. '-----------------------------------------------
  123.    If Flaga500ms = 1 Then
  124.       Toggle Led_live
  125.       Flaga500ms = 0
  126.    End If
  127. '------------------------------------------------
  128.    If Flaga1s = 1 Then
  129.       Shift Rpm_enkoder_tmp_1 , Right , 2
  130.       Rpm_a = Rpm_enkoder_tmp_1 / 1000                      '720                       'Rpm_a-zmienna single, Rpm_enkoder_tmp_2-zmienna single
  131.       Rpm_c = Rpm_a * 60                                    'Rpm_c-zmienna single
  132.       Rpm_r = Rpm_c                                         'Rpm_r-zmienna word
  133.  
  134.       'Print #4 , "wynik " ; Dwin_var_rx
  135.       'Print #4 , "tab_rx 1 " ; Hex(dwin_arr_rx(1))
  136.       'Print #4 , "tab_rx 2 " ; Hex(dwin_arr_rx(2))
  137.       'Print #4 , "tab_rx 3 " ; Hex(dwin_arr_rx(3))          'ile zmiennych 5 defaultowo!
  138.       'Print #4 , "tab_rx 4 " ; Hex(dwin_arr_rx(4))          'read
  139.       'Print #4 , "tab_rx 5 " ; Hex(dwin_arr_rx(5))          'address_h"
  140.       'Print #4 , "tab_rx 6 " ; Hex(dwin_arr_rx(6))          'address_l
  141.       'Print #4 , "tab_rx 7 " ; Hex(dwin_arr_rx(7))          'ile word odczytać
  142.       'Print #4 , "tab_rx 8 " ; Hex(dwin_arr_rx(8))          'value_h
  143.       'Print #4 , "tab_rx 9 " ; Hex(dwin_arr_rx(9))          'value_l
  144.       Print #4 , "***************************************"
  145.       Print #4 , "Rpm_enkoder_tmp     " ; Rpm_enkoder_tmp
  146.       Print #4 , "Rpm_enkoder_tmp_1 " ; Rpm_enkoder_tmp_1
  147.       Print #4 , "RPM " ; Rpm_r
  148.       Posuw_z_lcd = Dwin_lcd_get_var_value(&H140 )          'wstaw do zmiennej wartość z adresu hex
  149.       If Posuw_z_lcd <> Posuw_z Then                        'jeśli zmienna programu jest różna od zmiennej z adresu hex
  150.          Posuw_z = Posuw_z_lcd                              'to do zmiennej programu wstaw wartość zmiennej z adresu hex
  151.          Posuw_z_eeprom = Posuw_z_lcd                       'wartość zmiennej z adresu hex wstaw do zmiennej do zapisu zmiennej w eeprom
  152.          Posuw_z_tmp_1 = Posuw_z_lcd / 1000
  153.          Posuw_z_tmp_2 = Fusing(posuw_z_tmp_1 , "###.###")
  154.          Print #4 , "NOWY SKOK POSUWU Z " ; Posuw_z_tmp_2
  155.          Writeeeprom Posuw_z_eeprom , 100                   ' zapisz zmienną w eeprom w komórce
  156.       End If
  157.  
  158.  
  159.       Call Lcd_var_write(&H120 , Rpm_r)
  160.       'Call Lcd_var_write(&H130 , Z_dro)
  161.       Tce0_cnt = 0                                          'Zerowanie Timer'a enkodera RPM
  162.       Flaga1s = 0
  163.    End If
  164.  '*************************************************************************************************
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174. Loop
  175.  
  176. End
jedno co mnie martwi to że jest zawyżony odczyt obrotów, na ekranie lcd w porównaniu do tachometru fabrycznego o około 80 obr/min.
pozdrawiam Jacek.
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Xmega - inkrementacja zmiennej niezależnie od kierunku

Post autor: Henryk » 28 cze 2021, 10:42

Witam .
Spróbuj skrócić czas pomiaru , błąd powinien zmaleć .
Źródłem impulsów jest enkoder ? ile impulsów daje na jeden obrót ?

Pozdrawiam Henryk .
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Xmega - inkrementacja zmiennej niezależnie od kierunku

Post autor: Jacek » 28 cze 2021, 18:32

Witam - tak źródłem sygnału jest enkoder 1000imp/obr muszę sprawdzić jak jest z zaokrąglaniem wyniku.
pozdrawiam Jacek.
ODPOWIEDZ