Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Atmega8] BASCOM, Termostat, Prośba o sprawdzenie kodu

Vix 14 Dec 2010 17:41 1077 0
  • #1
    Vix
    Level 21  
    Witam.

    Proszę o przejrzenie kodu i uwagi.
    Zasada działania urządzenia jest prosta. Pomiar temperatury z pieca z centralnego, porównanie , ja ze zmienna alarmową, jeśli się zgadza to sygnał buzera co 250 ms.
    4 przyciski:
    1 - pozwala zwiększyć zmienna alarmową
    2 - pozwala zmniejszyć zmienna alarmową
    3- wyłącza buzer
    4- po naciśnięciu jeśli załączy się alarm, wywołuje przerwę 10min w jego działaniu przy pomocy timer0 po czym jeśli temperatura dalej jest alarmowa uruchamia buzer ponownie.


    Quote:
    $regfile = "m8def.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , E = Portb.4 , Rs = Portb.5
    Config 1wire = Portc.0
    Config Portd = &B00000001
    Portd = &B11111110

    '*****************konfiguracja tajmera
    Config Timer0 = Timer , Prescale = 256
    On Timer0 Od1s
    Dim Licz8ms As Byte
    Enable Interrupts
    Enable Timer0
    Load Timer0 = 250
    ' ****************zmienne i procedury
    Dim Czas As Word
    Dim Lsb As Byte
    Dim Msb As Byte
    Dim Tempstr As String * 5
    Dim Temp As Single
    Dim Tempa As Integer
    Dim Minus As Bit
    Dim Bukl As Bit
    Dim Temal As Single
    Temal = 30

    Declare Sub Odcztemp
    Declare Sub Wb

    '******************************************* przypisanie przyjaznych nazw

    Buzzer Alias Pind.0
    Onoff Alias Pind.1
    Przp Alias Pind.2
    Przm Alias Pind.3
    Wk Alias Pind.4
    Wylb Alias Pind.5



    ' definicja znaku stopnia '
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
    ' ****************************poczatke glownej petli
    Do

    Cls
    Call Odcztemp

    ' If Bukl = 0 Then

    If Minus = 0 Then
    'wyświetla temperatury dodatnie
    Lcd "Temp. Ak."
    Locate 1 , 15
    Lcd Tempstr ; Chr(0) ; "C"
    Else
    'wyświetla temperatury ujemne
    Lcd "Temp. Ak."
    Locate 1 , 15
    Lcd Tempstr ; Chr(0) ; "C"
    End If

    'End If

    Lowerline
    Lcd "Temp. Al." ;
    Locate 2 , 11
    Lcd Temal
    Locate 2 , 15
    Lcd Chr(0) ; "C"

    'kod buzzera ON OFF
    If Onoff = 0 Then
    Waitms 5 ' tu 50
    Toggle Wk
    Do
    Loop Until Onoff = 1
    Cls
    If Wk = 1 Then
    Lcd "Sygal alarmu"
    Lowerline
    Lcd "Wylaczony"
    Else
    Lcd "Sygal alarmu"
    Lowerline
    Lcd "Wlaczony"

    End If
    End If

    'kod przycisku plus
    If Przp = 0 Then
    Waitms 5 ' tu 50
    Do
    Loop Until Przp = 1
    Incr Temal
    End If

    'kod przycisku minus
    If Przm = 0 Then
    Waitms 5 ' tu 50
    Do
    Loop Until Przm = 1
    Decr Temal
    End If



    ' Kod Alarmowania
    If Temal >= Temp And Wk = 1 Then ' sprawdza czy temper alarmowania spelnia warunek i czy buzer jest zalaczony
    Set Buzzer
    Waitms 250 'zalączam buzer w każdym takcie na przemiennie co 250ms
    Reset Buzzer
    Waitms 250 '
    Set Buzzer
    End If

    'wyłaczenie buzera na 10 min
    If Wylb = 0 Then
    Waitms 50
    Call Wb
    End If


    Loop


    End
    '***************************koniec głownej petli


    Sub Odcztemp
    1wreset 'reset magistrali 1-Wire
    1wwrite &HCC 'opuszczenie zapisu numeru ID
    1wwrite &H44 'start pomiaru temperatury
    Waitms 1
    ' tu powinno byc 750 opóźnienie na czas pomiaru
    1wreset 'reset magistrali 1-Wire
    1wwrite &HCC 'opuszczenie zapisu numeru ID
    1wwrite &HBE 'komenda odczytu zmierzonej

    Lsb = 1wread():
    Msb = 1wread():

    1wreset

    Reset Bukl
    Reset Minus

    If Err = 0 Then
    Tempa = Msb * 256
    Tempa = Tempa + Lsb

    If Msb.7 = 0 Then
    Temp = Tempa / 16
    Else
    Set Minus
    Tempa = Not Tempa
    Tempa = Tempa + 1
    Temp = Tempa / 16

    End If

    Tempstr = Fusing(temp , "###.##") 'formatowanie do postaci 000.00
    Else

    Set Bukl

    End If

    End Sub

    Sub Wb

    Od1s:

    Toggle Wk
    Load Timer0 = 250 ' zaczynamy od 250
    Incr Licz8ms ' zwiększam o 1 po każdym przepełnieniu
    If Licz8ms = 125 Then ' jesli 125 przepełnień zeruje zmienna licz8ms a zwiększam zmienna czas o 1 az do 600 (10 min) wtedy aktywuje buzer
    Licz8ms = 0
    Incr Czas
    If Czas = 600 Then
    Toggle Wk
    Czas = 0
    End If
    End If
    End If

    End Sub Wb