Równanie różnicy w Bascom AVR
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Równanie różnicy w Bascom AVR
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.
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.
- niveasoft
- Posty: 1231
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Równanie różnicy w Bascom AVR
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..
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..
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Config Submode = New
- Dim Roznica As Byte
- Function Calc_diff(byval A As Byte , byval B As Byte) As Byte
- Select Case A
- Case Is > B : Calc_diff = A - B : Exit Function
- Case B : Calc_diff = 0 : Exit Function
- Case Is < B : Calc_diff = B - A : Exit Function
- End Select
- End Function
- Roznica = Call Calc_diff(8 , 5)
- Select Case Roznica
- Case 3 : 'zrob to i tamto
- Case Else
- End Select
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Re: Równanie różnicy w Bascom AVR
Dzięki Bartek, będę próbował.
pozdrawiam Jacek.
pozdrawiam Jacek.
-
- Posty: 31
- Rejestracja: 07 lip 2019, 0:32
Re: Równanie różnicy w Bascom AVR
Robię podobnie. Powołuję zmienna różnica: różnica = A-B czy tam inne potrzebne warianty
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Re: Równanie różnicy w Bascom AVR
Witam coś mi nie wychodzi z tą funkcją różnicy zmienne A oraz B zmieniłem na Word bo Byte jest za mała
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.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- '$sim
- $regfile = "m2560def.dat"
- $crystal = 16000000
- $hwstack = 255
- $swstack = 128
- $framesize = 128
- $baud = 9600
- $eeprom
- '****************************************************************
- Debug Off
- 'Debug On
- '-------------------------------------------------------------------------------------------
- '****************************************************************
- $projecttime = 40
- $version 0 , 0 , 861
- Config Submode = New
- Enable Interrupts
- '****************************************************************
- '* CONFIG BUFFERED USART FOR DEBUG via USB *
- '****************************************************************
- Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
- Config Serialin0 = Buffered , Size = 100 'buforowoanie pierwszy uart
- Config Serialout0 = Buffered , Size = 100 'buforowoanie pierwszy uart
- Echo Off
- Open "COM1:" For Binary As #1
- Const Debug_ = 1
- '****************************************************************
- '* CONFIG BUFFERED USART FOR RS485_1 FULL DUPLEX *
- '****************************************************************
- Config Com2 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
- Config Serialin1 = Buffered , Size = 100 'buforowoanie drugi uart
- Config Serialout1 = Buffered , Size = 100 'buforowoanie drugi uart
- Open "COM2:" For Binary As #2
- Const RS485_1 = 2
- '****************************************************************
- '* CONFIG BUFFERED USART FOR LCD *
- '****************************************************************
- Config Com3 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
- Config Serialin2 = Buffered , Size = 100 'buforowoanie trzeci uart
- Config Serialout2 = Buffered , Size = 100 'buforowoanie trzeci uart
- Open "COM3:" For Binary As #3
- Const LCD_ = 3
- '****************************************************************
- '* CONFIG BUFFERED USART FOR LCD *
- '****************************************************************
- Config Com4 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
- Config Serialin3 = Buffered , Size = 100 'buforowoanie czwarty uart
- Config Serialout3 = Buffered , Size = 100 'buforowoanie czwarty uart
- Open "COM4:" For Binary As #4
- Const Usb = 4
- '****************************************************************
- $include "subs\mruganie.inc"
- $include "subs\Uartrx0.inc"
- $include "subs\Uartrx1.inc"
- $include "subs\Uartrx2.inc"
- $include "subs\Uartrx3.inc"
- $include "subs\Hold_.inc"
- $include "subs\Left_.inc"
- $include "subs\Right_.inc"
- $include "subs\BMP180declarations.inc"
- $include "subs\BMP180functions.inc"
- '-------------------------------------------------------------------------------------------
- 'KONFIGURACJA TIMERA
- Config Timer1 = Timer , Prescale = 8
- On Timer1 Przertimer1
- Enable Timer1
- Config Timer2 = Pwm , Compare_a_pwm = Clear_up , Prescale = 1024
- Enable timer2
- Enable Interrupts
- '-------------------------------------------------------------------------------------------
- '##########################################################
- 'KONFIGURACJA PORTÓW
- Config Porta.0 = Output : Reset porta.0 : In_a Alias porta.0 'IN_A
- Config porta.1 = Output : Reset porta.1 : In_b Alias porta.1
- Config porta.2 = Output : Set porta.2 : Cs_dis Alias porta.2
- Config porta.3 = Output : Set porta.3 : Ena_diaga Alias porta.3
- Config porta.4 = Output : Set porta.4 : Ena_diagb Alias porta.4
- Config porta.5 = Output : Reset porta.5 : Led_hold Alias Porta.5
- Config portb.4 = Output : Set portb.4
- Config portB.7 = Output : Set portb.7 : Led_Live Alias Portb.7
- '##########################################################
- ' ZMIENNE #
- '##########################################################
- ' ZMIENNE CZASU #
- '##########################################################
- Dim Timer_tikx10 As Byte 'zmienna liczaca przepełnienie timera
- Dim Timertikx100 As Byte 'zmienna liczaca przepełnienie timera x10
- Dim Timertikx200 As Byte 'zmienna liczaca przepełnienie timera x 20
- Dim Timertikx500 As Byte 'zmienna liczaca przepełnienie timera x 50
- Dim Timer_tik_flag As Byte
- Flaga10ms Alias Timer_tik_flag.0
- Flaga100ms Alias Timer_tik_flag.1
- Flaga500ms Alias Timer_tik_flag.2
- Flaga1s Alias Timer_tik_flag.3
- Flaga2s Alias Timer_tik_flag.4
- Flaga2_5s Alias Timer_tik_flag.5
- 'zostaly jeszce trzy wolne flagi
- ' a uzylem tylko jednego bajtu
- 'Pawer SP9DR
- '##########################################################
- ' ZMIENNE ADRESU #
- '##########################################################
- Dim Rs485_dane(11) As Byte
- 'Dim Rs485_adres_h As Byte
- Dim Rs485_komenda As String * 12
- Dim Rs485_wartosc As Integer
- Dim Rs485_adres_ee As Eram Byte At &H10 'Rs485 address
- Dim Rs485_adres_temp As Byte ' potrzebne przy porownywani uadresu odebranego z wlasciwym
- '****************************************************************
- '**********************zmienne dla uart0***************************
- Dim Usb_arr_rx(5) As Byte
- Dim Usb_string As string * 5 At Usb_arr_rx(2) overlay
- Dim enkoder_1(11) As Byte
- '****************************************************************
- '**********************zmienne dla uart1*************************** '
- Dim Lcount_1 As Byte
- Dim Uart_command_1 As String * 20 'musi byc wystarczjaco dlugie
- Dim Getcommands_1(4) As String * 5 'tablica na pociete komendy
- Dim Rs485_adres_1 As Byte
- Dim komenda_1 As String * 10
- Dim wartosc_1 As Word
- '****************************************************************
- '**********************zmienne dla uart2*************************** '
- Dim Lcount_2 As Byte
- Dim Uart_command_2 As String * 20 'musi byc wystarczjaco dlugie
- Dim Getcommands_2(10) As String * 10 'tablica na pociete komendy
- '****************************************************************
- '**********************zmienne dla uart3*************************** '
- Dim Lcount_3 As Byte
- Dim Uart_command_3 As String * 20 'musi byc wystarczjaco dlugie
- Dim Getcommands_3(10) As String * 10 'tablica na pociete komendy
- '****************************************************************
- ' ZMIENNE STEROWANIA *
- '****************************************************************
- 'ZMIENNE STEROWNIKA NAPĘDU
- Dim Azymut_set As Word
- Dim Azymut_old As Word
- Dim Azymut_read As Word
- Dim Azymut_rs485 As Word
- Dim Adres_rs485 As Byte
- Dim Pwm_h As Byte
- '****************************************************************
- 'ZMIENNE SPOWALNIANIA PRĘDKOŚCI NAPĘDU
- Dim Roznica As Word
- 'Function Calc_diff(byval A As Word , byval B As Word) As Word
- '****************************************************************
- ' STAŁE
- Const On = 1
- Const Off = 0
- '****************************************************************
- '-------------------------------------------------------------------------------
- Const G1_c_1 = "Adres_rs485" 'odczytany adres urzadzenia
- Const G1_c_2 = "komenda_1" '
- Const G1_c_3 = "wartosc_1" '
- '------------------------------------------------------------------------------
- Const G2_c_1 = "Kat" '
- Const Info_Board = "i"
- Const Reboot = "reboot"
- Const Help = "?"
- Const Notincommands = "nie rozpoznano "
- Const Ok = "ack"
- Const Prompt = "command>>"
- '-------------------------------------------------------------------------------------------
- '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
- ' DANE POCZĄTKOWE
- Ena_diaga = 1
- Ena_diagb = 1
- '****************************************************************
- '* ODCZYT Z PAMIĘCI EPROM ADRESU URZĄDZENIA *
- 'Rs485_adres = Rs485_adres_ee
- '****************************************************************
- Enable Interrupts
- Wait 2
- '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ' DANE DO TESTOWANIA USUNĄĆ PO TESTACH
- Pwm_h = 50
- '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- Print #Debug_ , "Rotor board ver: " ; Version(2)
- '-------------------------------------------------------------------------------------------
- Do
- '=====================================================
- If Timer_tikx10 >= 10 Then 'jeśli uplyneło 100ms to
- Flaga100ms = 1 'ustaw flage upłyneło 100ms
- Incr Timertikx100 'zwiększaj Timertikx100
- Timer_tikx10 = 0 'zeruj liczenie
- End If 'koniec warunku
- If Timertikx100 >= 10 Then 'jeśli uplynela sekunda
- Flaga1s = 1 'ustaw flage upłyneła sekunda
- Incr Timertikx200 'zwiększaj Timertikx200
- Incr Timertikx500
- Timertikx100 = 0 'zeruj liczenie
- End If 'koniec warunku
- If Timertikx500 >= 5 Then
- Flaga500ms = 1
- Timertikx500 = 0
- End If
- If Timertikx200 >= 2 Then 'jeśli upłyneły dwie sekundy
- Flaga2s = 1 'ustaw flagę upłyneły dwie sekundy
- Timertikx200 = 0 'zeruj liczenie
- End If 'koniec warunku
- '=====================================================
- If Flaga10ms = 1 Then 'jeśli Flaga10ms jest równa 1
- Flaga10ms = 0 'wyzeruj Flaga10ms
- End If 'koniec warunku
- '-------------------------------------------------------------------------------------------
- If Flaga100ms = 1 Then 'jeśli Flaga100ms jest równa 1
- Flaga100ms = 0 'wyzeruj Flaga100ms
- End If 'koniec warunku
- '-------------------------------------------------------------------------------------------
- If Flaga500ms = 1 Then 'jeśli Flaga500ms jest równa 1
- Flaga500ms = 0 'wyzeruj Flaga500ms
- End If 'koniec warunku
- '-------------------------------------------------------------------------------------------
- If Flaga1s = 1 Then 'jeśli Flaga1s jest równa 1
- Flaga1s = 0 'wyzeruj Flaga1s
- Call Mruganie
- Print #RS485_1 , "200 a"
- 'Print #RS485_1 , "200 t"
- Print #Debug_ , "AZ=" ; Azymut_read
- End If 'koniec warunku
- '-------------------------------------------------------------------------------------------
- If Flaga2s = 1 Then 'jeśli Flaga2s jest równa 1
- Flaga2s = 0 'wyzeruj Flaga
- 'Print #RS485_1 , "200 a"
- End If 'koniec warunku
- '-------------------------------------------------------------------------------------------
- Azymut_read = wartosc_1
- If Azymut_read <= 0 Then
- Azymut_read = 0
- End If
- If Azymut_read => 360 Then
- Azymut_read = 360
- End If
- '-------------------------------------------------------------------------------------------
- '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
- '&&&&&&&&&&&&&&ODBIÓR DANYCH&&&&&&&&&&&&&&&
- '-------------------------------------------------------------------------------------------
- 'ODBIÓR DANYCH UART3
- While Ischarwaiting(#Usb) <> 0 'While data waiting in the buffer
- Inputbin #Usb , Usb_arr_rx(1) , 1 'input them in to the array
- Debug #Debug_ , "received_ID= " ; Usb_arr_rx(1)
- Print #Usb , "AZ=" ; Azymut_read
- Select Case Usb_arr_rx(1) 'command &h00 to &h08
- Case &H43:
- Print #Usb , "AZ=" ; Azymut_read
- 'Print #Debug_ , "AZ=" ; Azymut_read
- Case &H04D:
- Inputbin #Usb , Usb_arr_rx(2) , 3
- Print #Debug_ , "usb_string: " ; Usb_string
- Print #Debug_ , "AZ=" ; Azymut_read
- End select
- Wend
- '-------------------------------------------------------------------------------------------
- 'ODBIÓR DANYCH UART1
- If Ischarwaiting(#RS485_1) > 0 Then 'calls _gotchar and use URXC
- Lcount_1 = Inkey(#RS485_1) 'pobierz znak z bufora
- If Lcount_1 = 13 Or Len(uart_command_1) > 20 Then '20 Then ' jeslii ENTER lub wiecej niz 20 znaków to call uartrx
- Call Uartrx1() 'wywołaj podprogram Uartrx1
- 'Debug "czyszczenie bufora po odebranje komendzie" 'Using a constant will let us change the prompt
- 'clear serialin 'nie sprawdzone
- Uart_command_1 = "" ' koniecznie potrzenbe do czysczenia bufora
- Else 'inaczej
- Uart_command_1 = Uart_command_1 + Chr(Lcount_1) 'kluczowe budowanie bufora
- End If 'koniec warunku
- End If 'koniec warunku
- '-------------------------------------------------------------------------------------------
- 'ODBIÓR DANYCH UART2
- If Ischarwaiting(#LCD_) > 0 Then 'calls _gotchar and use URXC
- Lcount_2 = Inkey(#LCD_) 'pobierz znak z bufora
- If Lcount_1 = 13 Or Len(uart_command_2) > 20 Then '20 Then ' jeslii ENTER lub wiecej niz 20 znaków to call uartrx
- Call Uartrx2() 'wywołaj podprogram Uartrx1
- 'Debug "czyszczenie bufora po odebranje komendzie" 'Using a constant will let us change the prompt
- 'clear serialin 'nie sprawdzone
- Uart_command_2 = "" ' koniecznie potrzenbe do czysczenia bufora
- Else 'inaczej
- Uart_command_2 = Uart_command_2 + Chr(Lcount_2) 'kluczowe budowanie bufora
- End If 'koniec warunku
- End If 'koniec warunku
- '-------------------------------------------------------------------------------------------
- 'ODBIÓR DANYCH UART0
- If Ischarwaiting(#DEBUG_) > 0 Then 'calls _gotchar and use URXC
- Lcount_3 = Inkey(#DEBUG_) 'pobierz znak z bufora
- If Lcount_3 = 13 Or Len(uart_command_3) > 20 Then '20 Then ' jeslii ENTER lub wiecej niz 20 znaków to call uartrx
- Call Uartrx3()
- Print #Debug_ , Prompt 'wywołaj podprogram Uartrx1
- 'Debug "czyszczenie bufora po odebranje komendzie" 'Using a constant will let us change the prompt
- 'clear serialin 'nie sprawdzone
- Uart_command_3 = "" ' koniecznie potrzenbe do czysczenia bufora
- Else 'inaczej
- Uart_command_3 = Uart_command_3 + Chr(Lcount_3) 'kluczowe budowanie bufora
- End If 'koniec warunku
- End If 'koniec warunku
- '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
- '& STEROWANIE ROTOREM &
- '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
- If Rs485_adres_1 = 200 And komenda_1 = "kat" Then
- Azymut_read = wartosc_1
- End If
- '-------------------------------------------------------------------------------------------
- Azymut_old = Val(Usb_string)
- If Azymut_set <> Azymut_old Then
- Azymut_set = Azymut_old
- Print #Debug_ , "Azymut_set: " ; Azymut_set
- End If
- '****************************************************************
- If Azymut_set > Azymut_read Then
- Call Left_
- End If
- If Azymut_set < Azymut_read Then
- Call Right_
- End If
- If Azymut_set = Azymut_read Then
- Call Hold_
- End If
- '****************************************************************
- Function Calc_diff(byval A As Word , byval B As Word) As Byte
- A = Azymut_set
- B = Azymut_read
- Select Case A
- Case Is > B : Calc_diff = A - B : Exit Function
- Case B : Calc_diff = 0 : Exit Function
- Case Is < B : Calc_diff = B - A : Exit Function
- End Select
- End Function
- Roznica = Call Calc_diff(8 , 5)
- Select Case Roznica
- Case 3 :
- If Roznica = 10 Then
- Pwm_h = 5 'zrob to i tamto
- End If
- Case Else
- End Select
- '****************************************************************
- Loop
- End
- '-------------------------------------------------------------------------------------------
- ' podprogram przerwań Timer1
- Przertimer1:
- Timer1 = 45536 'wstawienie do Timer1 wartości 45536
- Incr Timer_tikx10
- If Timer_tikx10 = 1 Then
- Set Flaga10ms
- End If
- Return 'powrót
- '-------------------------------------------------------------------------------------------
pozdrawiam Jacek.
- niveasoft
- Posty: 1231
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Równanie różnicy w Bascom AVR
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ś
Jak można definicję i ciało funkcji wrzucić do pętli Main? No jak?
Przenieś ten kawałek powyżej "Do - Loop"
Funkcja nie może być deklarowana "w kółko", a tylko raz.
A wołaj to tak :
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ć
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:
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.
Jednak Ty to przegiąłeś
Jak można definicję i ciało funkcji wrzucić do pętli Main? No jak?
Przenieś ten kawałek powyżej "Do - Loop"
Funkcja nie może być deklarowana "w kółko", a tylko raz.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- 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
- Select Case A
- Case Is > B : Calc_diff = A - B : Exit Function
- Case B : Calc_diff = 0 : Exit Function
- Case Is < B : Calc_diff = B - A : Exit Function
- End Select
- End Function
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Roznica = Calc_diff(Azymut_set , Azymut_read)
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ć
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:
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Const Max_speed = 100
- Const Min_speed = 10
- Const Wspolczynnik = 4
- Dim Mycalc As Dword
- Roznica = Calc_diff(Azymut_set , Azymut_read)
- Mycalc = Roznica * Wspolczynnik
- 'ograniczanie predkosci
- Select Case Mycalc
- Case Is < Min_speed : Pwm_h = Min_speed
- Case Is > Max_speed : Pwm_h = Max_speed
- Case Else
- Pwm_h = Mycalc
- End Select
Żeby nie zerwało jakiejś zębatki to najlepiej by było dodać RAMP czyli takie rozpędzanie i zwalnianie.
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Re: Równanie różnicy w Bascom AVR
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
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
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Re: Równanie różnicy w Bascom AVR
Witam
Deklaracja funkcji przeniesiona przed pętle Do...Loop
samo obliczanie jest w pętli
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.
Deklaracja funkcji przeniesiona przed pętle Do...Loop
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Pwm_h = 50
- '****************************************************************
- '****************************************************************
- Declare Function Calc_diff(byval Azymut_set As Word , byval Azymut_read As Word) As Word
- '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- Print #Debug_ , "Rotor board ver: " ; Version(2)
- '-------------------------------------------------------------------------------------------
- Do
- '=====================================================
- If Timer_tikx10 >= 10 Then 'jeśli uplyneło 100ms to
- Flaga100ms = 1 'ustaw flage upłyneło 100ms
- Incr Timertikx100 'zwiększaj Timertikx100
- Timer_tikx10 = 0 'zeruj liczenie
- End If 'koniec warunku
- If Timertikx100 >= 10 Then 'jeśli uplynela sekunda
- Flaga1s = 1 'ustaw flage upłyneła sekunda
- Incr Timertikx200 'zwiększaj Timertikx200
- Incr Timertikx500
- Timertikx100 = 0 'zeruj liczenie
- End If 'koniec warunku
- If Timertikx500 >= 5 Then
- Flaga500ms = 1
- Timertikx500 = 0
- End If
- If Timertikx200 >= 2 Then 'jeśli upłyneły dwie sekundy
- Flaga2s = 1 'ustaw flagę upłyneły dwie sekundy
- Timertikx200 = 0 'zeruj liczenie
- End If 'koniec warunku
- '=====================================================
- If Flaga10ms = 1 Then 'jeśli Flaga10ms jest równa 1
- Flaga10ms = 0 'wyzeruj Flaga10ms
- End If 'koniec warunku
- '-------------------------------------------------------------------------------------------
- If Flaga100ms = 1 Then 'jeśli Flaga100ms jest równa 1
- Flaga100ms = 0 'wyzeruj Flaga100ms
- End If 'koniec warunku
- '-------------------------------------------------------------------------------------------
- If Flaga500ms = 1 Then 'jeśli Flaga500ms jest równa 1
- Flaga500ms = 0 'wyzeruj Flaga500ms
- End If 'koniec warunku
- '-------------------------------------------------------------------------------------------
- If Flaga1s = 1 Then 'jeśli Flaga1s jest równa 1
- Flaga1s = 0 'wyzeruj Flaga1s
- Call Mruganie
- Print #RS485_1 , "200 a"
- 'Print #RS485_1 , "200 t"
- Print #Debug_ , "AZ=" ; Azymut_read
- End If 'koniec warunku
- '-------------------------------------------------------------------------------------------
- If Flaga2s = 1 Then 'jeśli Flaga2s jest równa 1
- Flaga2s = 0 'wyzeruj Flaga
- 'Print #RS485_1 , "200 a"
- End If 'koniec warunku
- '-------------------------------------------------------------------------------------------
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- '****************************************************************
- Roznica = Calc_diff(Azymut_set , Azymut_read)
- Mycalc = Roznica * Wspolczynnik
- 'ograniczanie predkosci
- Select Case Mycalc
- Case Is < Min_speed : Pwm_h = Min_speed
- Case Is > Max_speed : Pwm_h = Max_speed
- Case Else
- Pwm_h = Mycalc
- End Select
Error : 61 Line : 252 Label not found [CALC_DIFF] , in File : J:\Projekty-Bascom\Rotor_2560_MotorDriver\Rotor_2560_MotorDriver.bas
pozdrawiam Jacek.
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Re: Równanie różnicy w Bascom AVR
Witam Bartek nie wychodzi z ta funkcją już nie ma błędów przy kompilacji ale wartość Mycalc jest "0"
pozdrawiam Jacek.
pozdrawiam Jacek.
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Re: Równanie różnicy w Bascom AVR
Witam zrobiłem hamowanie działa, pewnie da się zrobić lepiej
pozdrawiam Jacek.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Roznica = Azymut_set - Azymut_read
- Roznica_h = ABS(Roznica)
- Select Case Roznica_h
- Case 0 To 10 : Pwm_h = 15
- Case 10 To 50 : Pwm_h = 50
- Case Is < 100 : Pwm_h = 100
- Case Else : Pwm_h = 255
- End Select