Równanie różnicy w Bascom AVR

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Równanie różnicy w Bascom AVR

Post autor: Jacek » 22 lip 2022, 18:44

Witam czytających, czy w Bascom występuje funkcja różnicy.
Chodzi mi jak zrobić w Bascom'ie zapis:
"jeśli różnica między zmienną A i B wynosi 3 to zrób to"
nie wiem czy dobrze to opisałem, zmienne oczywiście tego samego typu.
pozdrawiam Jacek.
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Równanie różnicy w Bascom AVR

Post autor: niveasoft » 22 lip 2022, 19:04

Może mam jakieś zaćmienie bo akurat pisze coś innego, ale na szybko to piszesz sobie taką funkcję.
Ona zwraca róznicę niezaleznie od tego która wartośc większa a nawet zwróci zero jeśli sa równe.

Potem to Select Case od róznicy i chyba tyle..
  1. Config Submode = New
  2.  
  3. Dim Roznica As Byte
  4.  
  5. Function Calc_diff(byval A As Byte , byval B As Byte) As Byte
  6.  
  7.   Select Case A
  8.    Case Is > B : Calc_diff = A - B : Exit Function
  9.    Case B : Calc_diff = 0 : Exit Function
  10.    Case Is < B : Calc_diff = B - A : Exit Function
  11.   End Select
  12.  
  13. End Function
  14.  
  15. Roznica = Call Calc_diff(8 , 5)
  16.  
  17. Select Case Roznica
  18.   Case 3 :                                                  'zrob to i tamto
  19.   Case Else
  20. End Select
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Równanie różnicy w Bascom AVR

Post autor: Jacek » 22 lip 2022, 19:12

Dzięki Bartek, będę próbował.
pozdrawiam Jacek.
grzeniu 73
Posty: 26
Rejestracja: 07 lip 2019, 0:32

Re: Równanie różnicy w Bascom AVR

Post autor: grzeniu 73 » 24 lip 2022, 22:00

Robię podobnie. Powołuję zmienna różnica: różnica = A-B czy tam inne potrzebne warianty
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Równanie różnicy w Bascom AVR

Post autor: Jacek » 02 sie 2022, 17:11

Witam coś mi nie wychodzi z tą funkcją różnicy zmienne A oraz B zmieniłem na Word bo Byte jest za mała
  1.      '$sim
  2. $regfile = "m2560def.dat"
  3. $crystal = 16000000
  4. $hwstack = 255
  5. $swstack = 128
  6. $framesize = 128
  7. $baud = 9600
  8. $eeprom
  9. '****************************************************************
  10. Debug Off
  11. 'Debug On
  12. '-------------------------------------------------------------------------------------------
  13. '****************************************************************
  14. $projecttime = 40
  15. $version 0 , 0 , 861
  16. Config Submode = New
  17. Enable Interrupts
  18. '****************************************************************
  19. '*         CONFIG BUFFERED USART FOR DEBUG via USB                       *
  20. '****************************************************************
  21. Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  22. Config Serialin0 = Buffered , Size = 100                                        'buforowoanie  pierwszy uart
  23. Config Serialout0 = Buffered , Size = 100                                       'buforowoanie  pierwszy uart
  24. Echo Off
  25. Open "COM1:" For Binary As #1
  26. Const Debug_ = 1
  27. '****************************************************************
  28. '*      CONFIG BUFFERED USART FOR RS485_1 FULL DUPLEX           *
  29. '****************************************************************
  30. Config Com2 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  31. Config Serialin1 = Buffered , Size = 100                                        'buforowoanie  drugi uart
  32. Config Serialout1 = Buffered , Size = 100                                       'buforowoanie  drugi uart
  33. Open "COM2:" For Binary As #2
  34. Const RS485_1 = 2
  35. '****************************************************************
  36. '*      CONFIG BUFFERED USART FOR LCD          *
  37. '****************************************************************
  38. Config Com3 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  39. Config Serialin2 = Buffered , Size = 100                                        'buforowoanie  trzeci uart
  40. Config Serialout2 = Buffered , Size = 100                                       'buforowoanie  trzeci uart
  41. Open "COM3:" For Binary As #3
  42. Const LCD_ = 3
  43. '****************************************************************
  44. '*                           CONFIG BUFFERED USART FOR LCD                           *
  45. '****************************************************************
  46. Config Com4 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  47. Config Serialin3 = Buffered , Size = 100                                        'buforowoanie  czwarty uart
  48. Config Serialout3 = Buffered , Size = 100                                       'buforowoanie  czwarty uart
  49. Open "COM4:" For Binary As #4
  50. Const Usb = 4
  51. '****************************************************************
  52. $include "subs\mruganie.inc"
  53. $include "subs\Uartrx0.inc"
  54. $include "subs\Uartrx1.inc"
  55. $include "subs\Uartrx2.inc"
  56. $include "subs\Uartrx3.inc"
  57. $include "subs\Hold_.inc"
  58. $include "subs\Left_.inc"
  59. $include "subs\Right_.inc"
  60. $include "subs\BMP180declarations.inc"
  61. $include "subs\BMP180functions.inc"
  62. '-------------------------------------------------------------------------------------------
  63. 'KONFIGURACJA TIMERA
  64. Config Timer1 = Timer , Prescale = 8
  65. On Timer1 Przertimer1
  66. Enable Timer1
  67. Config Timer2 = Pwm , Compare_a_pwm = Clear_up , Prescale = 1024
  68. Enable timer2
  69. Enable Interrupts
  70.  
  71. '-------------------------------------------------------------------------------------------
  72. '##########################################################
  73. 'KONFIGURACJA PORTÓW
  74. Config Porta.0 = Output : Reset porta.0 : In_a Alias porta.0                    'IN_A
  75. Config porta.1 = Output : Reset porta.1 : In_b Alias porta.1
  76. Config porta.2 = Output : Set porta.2 : Cs_dis Alias porta.2
  77. Config porta.3 = Output : Set porta.3 : Ena_diaga Alias porta.3
  78. Config porta.4 = Output : Set porta.4 : Ena_diagb Alias porta.4
  79. Config porta.5 = Output : Reset porta.5 : Led_hold Alias Porta.5
  80. Config portb.4 = Output : Set portb.4
  81. Config portB.7 = Output : Set portb.7 : Led_Live Alias Portb.7
  82. '##########################################################
  83. '                                                          ZMIENNE                                                 #
  84. '##########################################################
  85. '                                                   ZMIENNE CZASU                                          #
  86. '##########################################################
  87. Dim Timer_tikx10 As Byte                                                        'zmienna liczaca przepełnienie timera
  88. Dim Timertikx100 As Byte                                                        'zmienna liczaca przepełnienie timera x10
  89. Dim Timertikx200 As Byte                                                        'zmienna liczaca przepełnienie timera x 20
  90. Dim Timertikx500 As Byte                                                        'zmienna liczaca przepełnienie timera x 50
  91. Dim Timer_tik_flag As Byte
  92. Flaga10ms Alias Timer_tik_flag.0
  93. Flaga100ms Alias Timer_tik_flag.1
  94. Flaga500ms Alias Timer_tik_flag.2
  95. Flaga1s Alias Timer_tik_flag.3
  96. Flaga2s Alias Timer_tik_flag.4
  97. Flaga2_5s Alias Timer_tik_flag.5
  98.  'zostaly jeszce trzy wolne flagi
  99.  ' a uzylem tylko jednego bajtu
  100.  'Pawer SP9DR
  101. '##########################################################
  102. '                                               ZMIENNE ADRESU                                           #
  103. '##########################################################
  104. Dim Rs485_dane(11) As Byte
  105. 'Dim Rs485_adres_h As Byte
  106. Dim Rs485_komenda As String * 12
  107. Dim Rs485_wartosc As Integer
  108. Dim Rs485_adres_ee As Eram Byte At &H10                                         'Rs485 address
  109. Dim Rs485_adres_temp As Byte                                                    ' potrzebne przy porownywani uadresu odebranego z wlasciwym
  110. '****************************************************************
  111. '**********************zmienne dla uart0***************************
  112. Dim Usb_arr_rx(5) As Byte
  113. Dim Usb_string As string * 5 At Usb_arr_rx(2) overlay
  114. Dim enkoder_1(11) As Byte
  115. '****************************************************************
  116. '**********************zmienne dla uart1***************************                                                     '
  117. Dim Lcount_1 As Byte
  118. Dim Uart_command_1 As String * 20                                               'musi byc wystarczjaco dlugie
  119. Dim Getcommands_1(4) As String * 5                                              'tablica na pociete komendy
  120. Dim Rs485_adres_1 As Byte
  121. Dim komenda_1 As String * 10
  122. Dim wartosc_1 As Word
  123. '****************************************************************
  124. '**********************zmienne dla uart2***************************                                                     '
  125. Dim Lcount_2 As Byte
  126. Dim Uart_command_2 As String * 20                                               'musi byc wystarczjaco dlugie
  127. Dim Getcommands_2(10) As String * 10                                            'tablica na pociete komendy
  128. '****************************************************************
  129. '**********************zmienne dla uart3***************************                                                     '
  130. Dim Lcount_3 As Byte
  131. Dim Uart_command_3 As String * 20                                               'musi byc wystarczjaco dlugie
  132. Dim Getcommands_3(10) As String * 10                                            'tablica na pociete komendy
  133. '****************************************************************
  134. '                                    ZMIENNE STEROWANIA                                            *
  135. '****************************************************************
  136. 'ZMIENNE STEROWNIKA NAPĘDU
  137. Dim Azymut_set As Word
  138. Dim Azymut_old As Word
  139. Dim Azymut_read As Word
  140. Dim Azymut_rs485 As Word
  141. Dim Adres_rs485 As Byte
  142. Dim Pwm_h As Byte
  143. '****************************************************************
  144. 'ZMIENNE SPOWALNIANIA PRĘDKOŚCI NAPĘDU
  145. Dim Roznica As Word
  146.  
  147.  
  148. 'Function Calc_diff(byval A As Word , byval B As Word) As Word
  149. '****************************************************************
  150. '                                                      STAŁE
  151. Const On = 1
  152. Const Off = 0
  153.  
  154. '****************************************************************
  155.  
  156. '-------------------------------------------------------------------------------
  157.  
  158. Const G1_c_1 = "Adres_rs485"                                                    'odczytany adres urzadzenia
  159. Const G1_c_2 = "komenda_1"                                                      '
  160. Const G1_c_3 = "wartosc_1"                                                      '
  161. '------------------------------------------------------------------------------
  162. Const G2_c_1 = "Kat"                                                            '
  163. Const Info_Board = "i"
  164. Const Reboot = "reboot"
  165. Const Help = "?"
  166. Const Notincommands = "nie rozpoznano "
  167. Const Ok = "ack"
  168. Const Prompt = "command>>"
  169. '-------------------------------------------------------------------------------------------
  170. '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  171. '                                        DANE POCZĄTKOWE
  172. Ena_diaga = 1
  173. Ena_diagb = 1
  174. '****************************************************************
  175. '*            ODCZYT Z PAMIĘCI EPROM ADRESU URZĄDZENIA               *
  176. 'Rs485_adres = Rs485_adres_ee
  177. '****************************************************************
  178. Enable Interrupts
  179. Wait 2
  180. '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  181. '            DANE DO TESTOWANIA USUNĄĆ PO TESTACH
  182. Pwm_h = 50
  183.  
  184.  
  185. '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  186. Print #Debug_ , "Rotor board ver: " ; Version(2)
  187. '-------------------------------------------------------------------------------------------
  188. Do
  189. '=====================================================
  190.    If Timer_tikx10 >= 10 Then                                                   'jeśli uplyneło 100ms to
  191.       Flaga100ms = 1                                                            'ustaw flage upłyneło 100ms
  192.       Incr Timertikx100                                                         'zwiększaj Timertikx100
  193.       Timer_tikx10 = 0                                                          'zeruj liczenie
  194.    End If                                                                       'koniec warunku
  195.    If Timertikx100 >= 10 Then                                                   'jeśli uplynela sekunda
  196.       Flaga1s = 1                                                               'ustaw flage upłyneła sekunda
  197.       Incr Timertikx200                                                         'zwiększaj Timertikx200
  198.       Incr Timertikx500
  199.       Timertikx100 = 0                                                          'zeruj liczenie
  200.    End If                                                                       'koniec warunku
  201.    If Timertikx500 >= 5 Then
  202.       Flaga500ms = 1
  203.       Timertikx500 = 0
  204.    End If
  205.    If Timertikx200 >= 2 Then                                                    'jeśli upłyneły dwie sekundy
  206.       Flaga2s = 1                                                               'ustaw flagę upłyneły dwie sekundy
  207.       Timertikx200 = 0                                                          'zeruj liczenie
  208.    End If                                                                       'koniec warunku
  209. '=====================================================
  210.    If Flaga10ms = 1 Then                                                        'jeśli Flaga10ms jest równa 1
  211.       Flaga10ms = 0                                                             'wyzeruj Flaga10ms
  212.    End If                                                                       'koniec warunku
  213. '-------------------------------------------------------------------------------------------
  214.    If Flaga100ms = 1 Then                                                       'jeśli Flaga100ms jest równa 1
  215.       Flaga100ms = 0                                                            'wyzeruj Flaga100ms
  216.    End If                                                                       'koniec warunku
  217. '-------------------------------------------------------------------------------------------
  218.    If Flaga500ms = 1 Then                                                       'jeśli Flaga500ms jest równa 1
  219.       Flaga500ms = 0                                                            'wyzeruj Flaga500ms
  220.    End If                                                                       'koniec warunku
  221. '-------------------------------------------------------------------------------------------
  222.    If Flaga1s = 1 Then                                                          'jeśli Flaga1s jest równa 1
  223.       Flaga1s = 0                                                               'wyzeruj Flaga1s
  224.       Call Mruganie
  225.       Print #RS485_1 , "200 a"
  226.       'Print #RS485_1 , "200 t"
  227.       Print #Debug_ , "AZ=" ; Azymut_read
  228.    End If                                                                       'koniec warunku
  229. '-------------------------------------------------------------------------------------------
  230.    If Flaga2s = 1 Then                                                          'jeśli Flaga2s jest równa 1
  231.       Flaga2s = 0                                                               'wyzeruj Flaga
  232.       'Print #RS485_1 , "200 a"
  233.    End If                                                                       'koniec warunku
  234. '-------------------------------------------------------------------------------------------
  235.    Azymut_read = wartosc_1
  236.    If Azymut_read <= 0 Then
  237.       Azymut_read = 0
  238.    End If
  239.    If Azymut_read => 360 Then
  240.       Azymut_read = 360
  241.    End If
  242.  
  243.  
  244. '-------------------------------------------------------------------------------------------
  245. '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  246. '&&&&&&&&&&&&&&ODBIÓR DANYCH&&&&&&&&&&&&&&&
  247. '-------------------------------------------------------------------------------------------
  248. 'ODBIÓR DANYCH UART3
  249.    While Ischarwaiting(#Usb) <> 0                                               'While data waiting in the buffer
  250.       Inputbin #Usb , Usb_arr_rx(1) , 1                                         'input them in to the array
  251.       Debug #Debug_ , "received_ID= " ; Usb_arr_rx(1)
  252.       Print #Usb , "AZ=" ; Azymut_read
  253.       Select Case Usb_arr_rx(1)                                                 'command  &h00 to &h08
  254.          Case &H43:
  255.             Print #Usb , "AZ=" ; Azymut_read
  256.             'Print #Debug_ , "AZ=" ; Azymut_read
  257.          Case &H04D:
  258.             Inputbin #Usb , Usb_arr_rx(2) , 3
  259.             Print #Debug_ , "usb_string: " ; Usb_string
  260.             Print #Debug_ , "AZ=" ; Azymut_read
  261.       End select
  262.    Wend
  263. '-------------------------------------------------------------------------------------------
  264. 'ODBIÓR DANYCH UART1
  265.    If Ischarwaiting(#RS485_1) > 0 Then                                          'calls _gotchar and use URXC
  266.       Lcount_1 = Inkey(#RS485_1)                                                'pobierz znak z bufora
  267.       If Lcount_1 = 13 Or Len(uart_command_1) > 20 Then                         '20 Then                        ' jeslii ENTER lub wiecej niz 20 znaków to call uartrx
  268.          Call Uartrx1()                                                         'wywołaj podprogram Uartrx1
  269.          'Debug "czyszczenie bufora po odebranje komendzie"                      'Using a constant will let us change the prompt
  270.          'clear serialin                                                            'nie sprawdzone
  271.          Uart_command_1 = ""                                                    ' koniecznie potrzenbe do czysczenia bufora
  272.       Else                                                                      'inaczej
  273.          Uart_command_1 = Uart_command_1 + Chr(Lcount_1)                        'kluczowe budowanie bufora
  274.       End If                                                                    'koniec warunku
  275.    End If                                                                       'koniec warunku
  276. '-------------------------------------------------------------------------------------------
  277. 'ODBIÓR DANYCH UART2
  278.    If Ischarwaiting(#LCD_) > 0 Then                                             'calls _gotchar and use URXC
  279.       Lcount_2 = Inkey(#LCD_)                                                   'pobierz znak z bufora
  280.       If Lcount_1 = 13 Or Len(uart_command_2) > 20 Then                         '20 Then                        ' jeslii ENTER lub wiecej niz 20 znaków to call uartrx
  281.          Call Uartrx2()                                                         'wywołaj podprogram Uartrx1
  282.          'Debug "czyszczenie bufora po odebranje komendzie"                      'Using a constant will let us change the prompt
  283.       'clear serialin  'nie sprawdzone
  284.          Uart_command_2 = ""                                                    ' koniecznie potrzenbe do czysczenia bufora
  285.       Else                                                                      'inaczej
  286.          Uart_command_2 = Uart_command_2 + Chr(Lcount_2)                        'kluczowe budowanie bufora
  287.       End If                                                                    'koniec warunku
  288.    End If                                                                       'koniec warunku
  289. '-------------------------------------------------------------------------------------------
  290. 'ODBIÓR DANYCH UART0
  291.    If Ischarwaiting(#DEBUG_) > 0 Then                                           'calls _gotchar and use URXC
  292.       Lcount_3 = Inkey(#DEBUG_)                                                 'pobierz znak z bufora
  293.       If Lcount_3 = 13 Or Len(uart_command_3) > 20 Then                         '20 Then                        ' jeslii ENTER lub wiecej niz 20 znaków to call uartrx
  294.          Call Uartrx3()
  295.          Print #Debug_ , Prompt                                                 'wywołaj podprogram Uartrx1
  296.          'Debug "czyszczenie bufora po odebranje komendzie"                      'Using a constant will let us change the prompt
  297.       'clear serialin  'nie sprawdzone
  298.          Uart_command_3 = ""                                                    ' koniecznie potrzenbe do czysczenia bufora
  299.       Else                                                                      'inaczej
  300.          Uart_command_3 = Uart_command_3 + Chr(Lcount_3)                        'kluczowe budowanie bufora
  301.       End If                                                                    'koniec warunku
  302.    End If                                                                       'koniec warunku
  303. '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  304. '&                                  STEROWANIE ROTOREM                                         &
  305. '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  306.    If Rs485_adres_1 = 200 And komenda_1 = "kat" Then
  307.       Azymut_read = wartosc_1
  308.    End If
  309. '-------------------------------------------------------------------------------------------
  310.    Azymut_old = Val(Usb_string)
  311.    If Azymut_set <> Azymut_old Then
  312.       Azymut_set = Azymut_old
  313.       Print #Debug_ , "Azymut_set: " ; Azymut_set
  314.    End If
  315. '****************************************************************
  316.    If Azymut_set > Azymut_read Then
  317.       Call Left_
  318.    End If
  319.    If Azymut_set < Azymut_read Then
  320.       Call Right_
  321.    End If
  322.    If Azymut_set = Azymut_read Then
  323.       Call Hold_
  324.    End If
  325. '****************************************************************
  326.    Function Calc_diff(byval A As Word , byval B As Word) As Byte
  327.    A = Azymut_set
  328.    B = Azymut_read
  329.    Select Case A
  330.       Case Is > B : Calc_diff = A - B : Exit Function
  331.       Case B : Calc_diff = 0 : Exit Function
  332.       Case Is < B : Calc_diff = B - A : Exit Function
  333.    End Select
  334.  
  335. End Function
  336.  
  337.    Roznica = Call Calc_diff(8 , 5)
  338.  
  339.    Select Case Roznica
  340.       Case 3 :
  341.          If Roznica = 10 Then
  342.             Pwm_h = 5                                                           'zrob to i tamto
  343.          End If
  344.       Case Else
  345.    End Select
  346. '****************************************************************
  347. Loop
  348. End
  349. '-------------------------------------------------------------------------------------------
  350. '            podprogram przerwań Timer1
  351. Przertimer1:
  352.    Timer1 = 45536                                                               'wstawienie do Timer1 wartości 45536
  353.  
  354.    Incr Timer_tikx10
  355.  
  356.    If Timer_tikx10 = 1 Then
  357.       Set Flaga10ms
  358.    End If
  359.  
  360. Return                                                                          'powrót
  361. '-------------------------------------------------------------------------------------------
Ale wyskakuje błąd Error : 93 Line : 355 Variable not dimensioned [CALL CALC_DIFF(8 , 5)] , in File : J:\Projekty-Bascom\Rotor_2560_MotorDriver\Rotor_2560_MotorDriver.bas

pozdrawiam Jacek.
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Równanie różnicy w Bascom AVR

Post autor: niveasoft » 02 sie 2022, 17:44

Config Submode = New oznacza, że najpierw tworzysz funkcje a potem ich używasz. Czyli nie trzeba robić podwójnej roboty, że najpierw Declare Function ...bla bla bla i potem za End wstawiamy właściwe ciało funkcji.

Jednak Ty to przegiąłeś :D
Jak można definicję i ciało funkcji wrzucić do pętli Main? No jak? :D

Przenieś ten kawałek powyżej "Do - Loop"
Funkcja nie może być deklarowana "w kółko", a tylko raz.
  1. Function Calc_diff(byval A As Word , byval B As Word) As Word  ' <-jeśli zmienna Roznica to WORD to tu też lepiej żeby był WORD
  2.  
  3.    Select Case A
  4.       Case Is > B : Calc_diff = A - B : Exit Function
  5.       Case B : Calc_diff = 0 : Exit Function
  6.       Case Is < B : Calc_diff = B - A : Exit Function
  7.    End Select
  8.  
  9. End Function
A wołaj to tak :
  1. Roznica = Calc_diff(Azymut_set , Azymut_read)
Ty pytałeś tak, że ja to zrozumiałem DOSŁOWNIE tak : "Jak to wykryć, że różnica ma dokładnie trzy".
Tak więc kod "Select Case Roznica -> a potem -> Case 3 i w Case 3 warunek "If Roznica = 10" to jest nigdy nie spełniony. No jak można pytać czy Roznica równa się dziesięć jeśli jesteś w Case 3, czyli Roznica wynosi trzy?

Proponuję wypić kawę i to przemyśleć :D

Analizując Twój kod to zależy Tobie chyba na tym, że im wyższa róznica tym wyższe PWM.

Proponuję, na początek, coś takiego:
  1. Const Max_speed = 100
  2. Const Min_speed = 10
  3. Const Wspolczynnik = 4
  4.  Dim Mycalc As Dword
  5.  
  6.  Roznica = Calc_diff(Azymut_set , Azymut_read)
  7.  
  8. Mycalc = Roznica * Wspolczynnik
  9.   'ograniczanie predkosci
  10.  Select Case Mycalc
  11.   Case Is <  Min_speed : Pwm_h = Min_speed
  12.   Case Is > Max_speed : Pwm_h = Max_speed
  13.   Case Else
  14.    Pwm_h = Mycalc
  15.  End Select
To tak na szybko.... Różnica = 1 to PWM_h = 4 a różnica 10 to PWM_h = 40 zawsze jednak w jakichś ryzach hardware`u.
Żeby nie zerwało jakiejś zębatki to najlepiej by było dodać RAMP czyli takie rozpędzanie i zwalnianie.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Równanie różnicy w Bascom AVR

Post autor: Jacek » 02 sie 2022, 21:37

Ok Bartek a reszta ma pozostać w pętli Do...Loop?
pozdrawiam Jacek.
P.S. chyba pisaliśmy razem
chodzi o to że jeśli różnica między azymutem zadanym a odczytanym będzie równa 10 to ma zmniejszyć pwm
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Równanie różnicy w Bascom AVR

Post autor: Jacek » 03 sie 2022, 9:58

Witam
Deklaracja funkcji przeniesiona przed pętle Do...Loop
  1.  
  2. Pwm_h = 50
  3. '****************************************************************
  4.  
  5.  
  6. '****************************************************************
  7. Declare Function Calc_diff(byval Azymut_set As Word , byval Azymut_read As Word) As Word
  8. '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  9. Print #Debug_ , "Rotor board ver: " ; Version(2)
  10. '-------------------------------------------------------------------------------------------
  11. Do
  12. '=====================================================
  13.    If Timer_tikx10 >= 10 Then                                                   'jeśli uplyneło 100ms to
  14.       Flaga100ms = 1                                                            'ustaw flage upłyneło 100ms
  15.       Incr Timertikx100                                                         'zwiększaj Timertikx100
  16.       Timer_tikx10 = 0                                                          'zeruj liczenie
  17.    End If                                                                       'koniec warunku
  18.    If Timertikx100 >= 10 Then                                                   'jeśli uplynela sekunda
  19.       Flaga1s = 1                                                               'ustaw flage upłyneła sekunda
  20.       Incr Timertikx200                                                         'zwiększaj Timertikx200
  21.       Incr Timertikx500
  22.       Timertikx100 = 0                                                          'zeruj liczenie
  23.    End If                                                                       'koniec warunku
  24.    If Timertikx500 >= 5 Then
  25.       Flaga500ms = 1
  26.       Timertikx500 = 0
  27.    End If
  28.    If Timertikx200 >= 2 Then                                                    'jeśli upłyneły dwie sekundy
  29.       Flaga2s = 1                                                               'ustaw flagę upłyneły dwie sekundy
  30.       Timertikx200 = 0                                                          'zeruj liczenie
  31.    End If                                                                       'koniec warunku
  32. '=====================================================
  33.    If Flaga10ms = 1 Then                                                        'jeśli Flaga10ms jest równa 1
  34.       Flaga10ms = 0                                                             'wyzeruj Flaga10ms
  35.    End If                                                                       'koniec warunku
  36. '-------------------------------------------------------------------------------------------
  37.    If Flaga100ms = 1 Then                                                       'jeśli Flaga100ms jest równa 1
  38.       Flaga100ms = 0                                                            'wyzeruj Flaga100ms
  39.    End If                                                                       'koniec warunku
  40. '-------------------------------------------------------------------------------------------
  41.    If Flaga500ms = 1 Then                                                       'jeśli Flaga500ms jest równa 1
  42.       Flaga500ms = 0                                                            'wyzeruj Flaga500ms
  43.    End If                                                                       'koniec warunku
  44. '-------------------------------------------------------------------------------------------
  45.    If Flaga1s = 1 Then                                                          'jeśli Flaga1s jest równa 1
  46.       Flaga1s = 0                                                               'wyzeruj Flaga1s
  47.       Call Mruganie
  48.       Print #RS485_1 , "200 a"
  49.       'Print #RS485_1 , "200 t"
  50.       Print #Debug_ , "AZ=" ; Azymut_read
  51.    End If                                                                       'koniec warunku
  52. '-------------------------------------------------------------------------------------------
  53.    If Flaga2s = 1 Then                                                          'jeśli Flaga2s jest równa 1
  54.       Flaga2s = 0                                                               'wyzeruj Flaga
  55.       'Print #RS485_1 , "200 a"
  56.    End If                                                                       'koniec warunku
  57. '-------------------------------------------------------------------------------------------
samo obliczanie jest w pętli

  1.  
  2. '****************************************************************
  3.  
  4.    Roznica = Calc_diff(Azymut_set , Azymut_read)
  5.    Mycalc = Roznica * Wspolczynnik
  6.   'ograniczanie predkosci
  7.    Select Case Mycalc
  8.       Case Is < Min_speed : Pwm_h = Min_speed
  9.       Case Is > Max_speed : Pwm_h = Max_speed
  10.       Case Else
  11.          Pwm_h = Mycalc
  12.    End Select
program się kompiluje ale wyskakuje błąd

Error : 61 Line : 252 Label not found [CALC_DIFF] , in File : J:\Projekty-Bascom\Rotor_2560_MotorDriver\Rotor_2560_MotorDriver.bas

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

Re: Równanie różnicy w Bascom AVR

Post autor: Jacek » 06 sie 2022, 12:14

Witam Bartek nie wychodzi z ta funkcją już nie ma błędów przy kompilacji ale wartość Mycalc jest "0"
pozdrawiam Jacek.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Równanie różnicy w Bascom AVR

Post autor: Jacek » 06 sie 2022, 22:31

Witam zrobiłem hamowanie działa, pewnie da się zrobić lepiej
  1.  Roznica = Azymut_set - Azymut_read
  2.    Roznica_h = ABS(Roznica)
  3.    Select Case Roznica_h
  4.       Case 0 To 10 : Pwm_h = 15
  5.       Case 10 To 50 : Pwm_h = 50
  6.       Case Is < 100 : Pwm_h = 100
  7.       Case Else : Pwm_h = 255
  8.    End Select
pozdrawiam Jacek.
ODPOWIEDZ