Wytrawiarka pomoc w programie


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
 
'*******************************************************************************




Portret użytkownika mirley

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.