Niestety zmiana enkoderem zmiennej nie idzie płynnie lecz skokowo nie wiem jak to zrobić - proszę o pomoc.
Kod dotychczasowy wygląda tak:
Załączanie wyłączanie Timera odpowiedzialnego za PWM działa dobrze, regulacja potencjometrem PWM również, odczyt temperatury działa dobrze.
pozdrawiam Jacek.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- '******************** Mikrokontroler *******************************************
- '$sim
- $regfile = "m16adef.dat" 'typ mikrokontrolera
- $crystal = 16000000 'częstotliwość taktowania
- $hwstack = 32 'stos sprzętowy
- $swstack = 10 'stos programowy
- $framesize = 40 'wielkość ramki
- Config Submode = Old
- '********************************* LCD **************************************
- 'Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2 'konfiguracja wyświetlacza LCD
- 'Config Lcd = 16 * 4 'typ wyświetlacza LCD
- Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5 'mirley UPT M16
- Config Lcd = 16 * 4
- '********************************** Timer'y ***********************************
- 'Config Timer0 = Pwm , Prescale = 1 , Compare Pwm = Clear Down 'częstotliwość PWM 31.25 kHz
- Config Timer0 = Pwm , Prescale = 8 , Compare Pwm = Clear Down 'częstotliwość PWM 3900 Hz
- 'Config Timer0 = Pwm , Prescale = 64 , Compare Pwm = Clear Down 'częstotliwość PWM 480 Hz
- 'Config Timer0 = Pwm , Prescale = 256 , Compare Pwm = Clear Down 'częstotliwość PWM 125 Hz
- 'Config Timer0 = Pwm , Prescale = 1024 , Compare Pwm = Clear Down 'częstotliwość PWM 30.5 Hz
- Enable Timer0
- 'Config Timer1 = Timer , Prescale = 256
- 'Enable Timer1 : On Timer1 Przer_timer1 '256
- Config Timer1 = Timer , Prescale = 256
- Enable Timer1 : On Timer1 Prztimer1
- Enable Interrupts
- Stop Timer0
- Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32 'znak stopnia
- Deflcdchar 2 , 4 , 4 , 10 , 10 , 10 , 17 , 17 , 31 ' replace [x] with number (0-7)
- '************************************ Przetworniki *****************************
- Config Adc = Single , Prescaler = Auto , Reference = Avcc 'konfiguracja ADC
- Stop Adc
- '******************************** Porty ***************************************
- Config Pind.0 = Input 'ustawienie portu jako wejście
- Config Pind.1 = Input 'ustawienie portu jako wejście
- Set Pind.0 = 1 'ustawienie portu w stan wysoki
- Set Pind.1 = 1 'ustawienie portu w stan wysoki
- Config Pinb.3 = Output 'ustawienie portu jako wyjście
- Config Pind.5 = Output 'ustawienie portu jako wyjście
- Config Pind.2 = Input 'ustawienie portu jako wejście
- Config Pind.3 = Input 'ustawienie portu jako wejście
- Set Portd.2 'ustawienie portu w stan wysoki
- Set Portd.3 'ustawienie portu w stan wysoki
- Config Pinb.0 = Input
- Config Pinb.7 = Output
- Set Portb.7
- Portd = 255
- '*********************** Aliasy ***********************************************
- Start_ Alias Pind.0
- Stop_ Alias Pind.1
- '********************* Deklaracje *********************************************
- Declare Sub Start_timer1
- Declare Sub Stop_timer1
- Declare Sub Pomiar
- Declare Sub Wyswietl
- 'Declare Sub Impulsator
- '********************* Zmienne ***********************************************
- Dim Tryb As Byte , Rezultat As Integer
- Dim Zmienna As Word
- Dim Zmienna1 As Byte
- Dim Enc As Byte
- Dim W As Word
- Dim Z As Word
- Dim A As Long
- Dim Perc As Long
- Dim Zal As Bit
- Dim B1 As Byte
- Dim B2 As Byte
- Dim R As Byte
- Dim Znak1 As String * 1
- Dim T1 As Single
- Dim T2 As Single
- Dim Tmp1 As String * 6
- Dim Temp_zad As Byte 'Long 'zmienna odczytu z enkodera lewy wskaźnik
- Dim F As Long 'zmienna odczytu z enkodera prawy wskaźnik
- Dim Dzielnik(2) As Byte 'dzielniki timera
- Dim Flaga_4ms As Bit , Flaga_500ms As Bit , Flaga_1s As Bit 'flagi przerwa?
- '********************** Początek **********************************************
- Cls
- Cursor Off
- Locate 1 , 1
- Lcd "TEST STEROWANIA"
- Locate 2 , 3
- Lcd "PWM GRZALEK"
- Locate 3 , 3
- Lcd "SQ2EER 2017"
- Wait 2
- Cls
- Locate 1 , 1 'Locate 4 , 1
- Lcd "TIMER0 OFF "
- Locate 2 , 1 'Locate 2 , 1 'lokalizacja wyświetlania zmiennej PWM
- Lcd "PWM :" ; Perc ; "% "
- Locate 3 , 1
- Lcd "TEMP:" ; Znak1 ; Tmp1 ; Chr(1) ; "C "
- Locate 4 , 1
- Lcd "ZAD:" ; Zmienna ; Chr(1) ; "C "
- Set Portb.3
- Z = 0
- Temp_zad = 0
- F = 0
- Zal = 0
- Zmienna = 0
- Wait 2
- Call Wyswietl
- Do
- '*********************************************** co 4ms
- If Flaga_4ms = 1 Then
- Flaga_4ms = 0
- Call Wyswietl
- Gosub Impulsator
- End If
- '***********************************************
- '*********************************************** co 500ms
- If Flaga_500ms = 1 Then
- Flaga_500ms = 0
- End If
- '***********************************************
- '*********************************************** co 1s
- If Flaga_1s = 1 Then
- Flaga_1s = 0
- 'Call Impulsator
- End If
- '***********************************************
- Gosub Impulsator
- If Rezultat <> 0 Then
- Zmienna = Zmienna + Rezultat
- Locate 4 , 1
- Lcd "ZAD:" ; Zmienna ; Chr(1) ; "C "
- 'Zmienna1 = Zmienna / 10
- 'Locate 2 , 11 : Lcd Zmienna ; " "
- Rezultat = 0
- End If
- Call Pomiar
- If Start_ = 0 Then 'skok do podprogramu załączaenia Timer0 , załaczenie ADC
- Gosub Start_timer1
- End If
- If Stop_ = 0 Then 'skok do podprogramu wyłączenia Timer0 , wyłączenie ADC
- Call Stop_timer1
- End If
- If Zal = 1 Then 'sprawdzenie czy zmienna Zal ma wartość 1 aby pobrać wartość ADC
- Z = Getadc(0) 'pobieraie wartości ADC
- A = Z * 100
- Shift Z , Right , 2
- If W <> Z Then
- W = Z 'zamiana z 10 bitowej na 8 bitową wartość
- Pwm0 = W 'wpisanie warotści zmiennej W do Pwm1a
- Perc = A / 1023 'dzielenie uzyskanej wartości ADC pomnożonej przez 100 w celu uzyskania wyniku od 0 do 100
- Locate 2 , 1 'Locate 2 , 1 'lokalizacja wyświetlania zmiennej PWM
- Lcd "PWM :" ; Perc ; "% " 'pokazuje na LCD PWM w % od 0 do 100
- Pwm0 = W
- Call Wyswietl
- End If
- End If
- Loop
- End
- Sub Start_timer1 'podprogram załączenia Timer0 , ADC
- Portd.2 = 0
- Zal = 1
- Start Timer0
- Start Adc
- Locate 1 , 1 'Locate 4 , 1
- Lcd "TIMER0 ON "
- End Sub
- Sub Stop_timer1 'podprogram wyłączenia Timer0 , ADC , zerowanie zmienych dla LCD
- Zal = 0
- Disable Adc
- Stop Timer1
- Pwm1b = 0
- Z = 0
- A = 0
- Perc = 0
- Locate 1 , 1
- Lcd "TIMER0 OFF "
- Set Portd.2
- Set Portb.3
- If W <> Z Then
- W = Z 'zamiana z 10 bitowej na 8 bitową wartość
- Pwm1a = W 'wpisanie warotści zmiennej W do Pwm1a
- Perc = A / 1023 'dzielenie uzyskanej wartości ADC pomnożonej przez 100 w celu uzyskania wyniku od 0 do 100
- Call Wyswietl
- End If
- End Sub
- Sub Pomiar
- '------------------------------------------------------------------------
- '-----------------czujnik DS18B20----------------------------------------
- Config 1wire = Pinb.0 'konfiguracja maistrali 1wire
- 1wreset
- 'podprogram 1wr
- 1wwrite &HCC 'komenda skip ROM
- 1wwrite &H44 'komenda convert T
- 1wreset 'podprogram 1wr
- 1wwrite &HCC 'komenda skip ROM
- 1wwrite &HBE 'komenda read
- B1 = 1wread() 'odczyt z czujnika 1
- B2 = 1wread()
- 'podprogram 1wr
- If B1 >= 248 Then 'jesli temperatura ujemna
- B1 = R - B1 'od 255 odejmujemy B1a
- B2 = R - B2 'od 255 odejmujemy B2a
- Znak1 = "-"
- Else
- Znak1 = "+"
- End If
- T1 = B1 / 16 'przesunięcie w prawo o 4 bajty
- T2 = B2 * 16 'przesunięcie w lewo o 4 bajty
- T1 = T1 + T2
- Tmp1 = Fusing(t1 , "###.&")
- Locate 3 , 1
- Lcd "TEMP:" ; Znak1 ; Tmp1 ; Chr(1) ; "C "
- End Sub
- Sub Wyswietl
- Locate 2 , 1
- Lcd "PWM :" ; Perc ; "% " 'pokazuje na LCD PWM w % od 0 do 100
- Locate 3 , 1
- Lcd "TEMP:" ; Znak1 ; Tmp1 ; Chr(1) ; "C "
- Pwm0 = W
- End Sub
- Prztimer1:
- Timer1 = 3036
- Set Flaga_4ms
- Incr Dzielnik(1)
- If Dzielnik(1) = 125 Then '125
- Dzielnik(1) = 0
- Set Flaga_500ms
- Incr Dzielnik(2)
- If Dzielnik(2) = 2 Then
- Dzielnik(2) = 0
- Set Flaga_1s
- End If
- End If
- Return
- Impulsator:
- Enc.0 = Pind.2
- Enc.1 = Pind.3
- Rezultat = 0
- Select Case Tryb
- Case 0:
- If Enc = 3 Then Incr Tryb 'jeżeli dwa rozwarte
- Case 1:
- If Enc = 2 Then Tryb = 2
- If Enc = 1 Then Tryb = 3
- Case 2:
- If Enc = 1 Then
- Rezultat = 1
- Tryb = 0
- End If
- Case 3:
- If Enc = 2 Then
- Rezultat = -1
- Tryb = 0
- End If
- End Select
- Return
