Od pewnego czasu usiłuje napisać program do wytrawiarki. Program jest już prawie gotowy ale z niewiadomych mi przyczyn się krzaczy tzn. na lcd wyskakują jakieś śmieci, to enkoder działa do tyłu zamiast do przodu, albo gubi impulsy. Pompka też sie czasem ze załącza chodz timer chodzi ok. Jak by ktoś spojrzał na ten kod i powiedział co jest nie tego. '******************************************************************************* '***************************** Wytrawiarka ************************************* '** Wersja: 2.0 ** '** Nazwa: Wytrawiarka.bas ** '** Elementy: Atmega8, DS1820, ENC-ecw1j-b24, Buzzer ** '** Autor: Seba, gg: 6312316 ** '********************************* MDE ***************************************** '******************************************************************************* $regfile = "m8def.dat" 'Atmega8 $crystal = 8000000 'zegar $hwstack = 100 $swstack = 110 $framesize = 170 '**************************** Konfiguracja wstępna ***************************** '******************************************************************************* Cha Alias Pind.2 Chb Alias Pind.3 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5 Config Timer0 = Timer , Prescale = 256 Config 1wire = Portb.0 Config Portb.7 = Output Config Portb.6 = Output Config Portd.5 = Output Config Portb.3 = Output Config Pind.7 = Input Config Pind.2 = Input Config Pind.3 = Input Config Pind.6 = Output Config Int0 = Falling Const Debouncetime = 0 '******************************************************************************* Set Chb Set Portd.7 Set Portb.4 Set Portb.5 'Cha Alias Portd.2 'linia encodera ' 'Chb Alias Portd.3 Grzalka Alias Portb.4 Pompka Alias Portb.5 Buz Alias Portd.5 S1 Alias Pind.7 S1l Alias Portb.3 Dim Wtime As Byte Dim Temp(2) As Byte Dim B As Integer Dim C As Integer Dim X As Bit Dim T1 As Byte 'Dim S1 As Bit Dim A1 As Bit Dim Z As Eram Byte Dim Czasds As Byte Dim Czaspompki As Byte Dim Licz8ms As Byte Dim Flaga As Bit Declare Sub Odcz_temp Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32 Deflcdchar 1 , 4 , 10 , 10 , 10 , 17 , 21 , 31 , 14 On Int0 Getencoder On Timer0 Odmierz_1s T1 = 30 'Z = T1 A1 = 0 X = 0 Buz = 0 S1l = 0 Flaga = 0 Pompka = 0 Grzalka = 0 Czaspompki = 0 Cursor Off Cls Locate 1 , 1 Lcd Chr(1) Locate 1 , 2 Lcd "r" Locate 1 , 3 Lcd "=" Locate 1 , 6 Lcd Chr(0) Locate 1 , 7 Lcd "C" Locate 1 , 9 Lcd Chr(1) Locate 1 , 10 Lcd "z" Locate 1 , 11 Lcd "=" Locate 1 , 14 Lcd Chr(0) Locate 1 , 15 Lcd "C" 'Portd = &B11 Enable Interrupts Enable Int0 Enable Timer0 Call Odcz_temp '***************************** Program główny ********************************** '******************************************************************************* Do Locate 1 , 12 Lcd T1 Locate 1 , 4 Lcd Temp(1) If Temp(1) >= T1 Then Waitms 60 If Temp(1) >= T1 Then Reset Grzalka Debounce S1 , 0 , Abc , Sub X = 1 Else Set Grzalka End If End If If Flaga = 1 Then A1 = 1 Set Pompka X = 0 S1l = 1 Locate 2 , 2 Lcd "=TRAWIENIE=" Else Locate 2 , 3 Lcd "NAGRZEWANIE" End If Loop End '******************************************************************************* '************************ Podprogram pomiaru temperatury *********************** '******************************************************************************* Abc: Flaga = 1 Return Sub Odcz_temp 1wreset 1wwrite &HCC 1wwrite &H44 Waitms 750 1wreset 1wwrite &HCC 1wwrite &HBE Temp(1) = 1wread(2) 1wreset If Err = 1 Then Cls Locate 1 , 2 Lcd "Brak czujnika" Locate 2 , 6 Lcd "DS1820" Reset Grzalka Set Pompka Do Buz = 1 Waitms 50 Buz = 0 Waitms 50 Buz = 1 Waitms 50 Buz = 0 Waitms 300 Loop End If If Temp(2) > 0 Then Temp(1) = 256 - Temp(1) End If Temp(1) = Temp(1) / 2 End Sub '******************************************************************************* '**************************** Podprogram encodera ****************************** '******************************************************************************* Getencoder: Waitms Debouncetime If Cha = 0 Then If Chb = 0 Then Decr T1 Else Incr T1 End If Gifr = 64 'T1 = Z 'Writeeeprom Z , 1 If T1 > 55 Then T1 = 55 End If If T1 < 20 Then T1 = 20 End If Return '******************************************************************************* '**************************** Podprogram Timera0 ******************************* '******************************************************************************* Odmierz_1s: Load Timer0 = 250 Incr Licz8ms If Licz8ms = 125 Then Incr Czaspompki Incr Czasds End If If A1 = 0 Then 'Locate 2 , 3 'Lcd "NAGRZEWANIE" If Czaspompki = 30 Then Set Pompka Locate 2 , 15 Lcd "1" End If If Czaspompki = 34 Then Reset Pompka Czaspompki = 0 End If End If If Czasds = 3 Then Call Odcz_temp Czasds = 0 End If If X = 1 Then If Licz8ms = 20 Then Toggle Buz End If End If Return '*******************************************************************************
|
|||
Re: Program
1. Na poczatku programu powinny być zdefiniowany typy wszystkich wyprowadzeń i ich wartości początkowe
2. W programie uzywasz poleceń wait i Debounce, które tez zawiera Wait... Polecał bym wywalić wszystkie tego typu konstrukcje.
3. W pętli głównej wpisujesz dane do LCD bez żadnego opóźnienia, może to powodowac błędne działanie LCD.
4. Obsługa przerwania timera, powinna zawierać tylko ustawienie flag bitowych, np co 1s do pomiaru temperatury, co 8ms do przycisków itp. Masz tam za dużo rzeczy i jeszcze do tego obsługę LCD
Zalecam zacząć pisanie od początku i robić wszystko po kolei. Najpierw sam impulsator, żeby pokazywał liczbe na LCD podczas kręcenia. Potem temperatura i sterowanie grzałką i pompką
UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.