Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega8][Bascom] gaszenie diody alarmowej

cugi253 02 Lis 2010 21:05 1247 2
  • #1 02 Lis 2010 21:05
    cugi253
    Poziom 16  

    Witam, mam taki problem. program wg mnie powinien po przekroczeniu ustalonej temperatury wyswietlac na LCD napis, wlaczac Buzzer oraz zapalic diode. A po nacisnieciu przycisku wyłaczyc to wszystko. I problem jest taki ze wylacza wszystko oprocz diody. Tzn po wlaczeniu sie alarmu dioda wogole juz nie gasnie ani po obnizeniu temperatury ani po nacisnieciu przycisku.
    Ktos mi pomoze jaka moze byc przyczyna tego?

    Code:
    If I3 >= 270 Then                                           ' jezeli temp i3> 600 to...
    
    If Flaga2 = 0 Then

    Lowerline

    Lcd " !!PIEC!!" ; Ss ; Chr(0)
    Sound Speaker , 329 , 63                                    ' nuta dzwiekowa
    Sound Speaker , 369 , 99                                    ' nuta dziwekowa
    Portb.2 = 1                                                 'zapalamy diode
    If Pinb.1 = 0 Then Set Flaga2                               'pod pinem b1 jest przycisk switch
    Waitms 50                                                   'kasujemy alarm przytrzymujac go na minimum 50 ms
    End If
    End If
    If I3 < 250 Then Reset Flaga2



    a oto kod calego programu:
    Code:
    $regfile = "m8def.DAT"           'deklaracja procesora Atmega8
    
    $crystal = 1000000                                          'deklaracja cześtotlwiości pracy
    'Deklaracja portów od wyświetlacza LCD
    Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.6 , Rs = Portd.7

    Config Lcd = 20 * 2                                         '


     Config Portb.1 = Input                                     'port b.1 bedzie  wejsciowy (switch- przcisk)
     Config Portb = &B0000000                                   'wszędzie stan spoczynkowy-0 (switch przycisk)




    Config Portb.0 = Output
    Config Portb.2 = Output
    Speaker Alias Portb.0                                       'deklaracja portu glosnika
    Config 1wire = Portd.5                                      'deklaracja portu na którym będą podpięte DS18b20

    Dim I1 As Integer , Ss As String * 6
    Dim I2 As Integer
    Dim I3 As Integer
    Dim I4 As Integer

    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    Dim Dsid3(8) As Byte
    Dim Dsid4(8) As Byte
    Dim B As Byte                                               'deklaracja zmiennej do odczytu kodów ID
    Dim W As Byte                                               'deklaracja zmiennej do odczytu ilośc czujników

    Dim Flaga As Bit                                            ' deklaracja flagi1 dla 82 stopni
    Dim Flaga1 As Bit                                           ' deklaracja flagi dla 75  stopni
    Dim Flaga2 As Bit                                           'deklaracja flagi dla 60 stopni
    Dim Flaga3 As Bit                                           ' deklaracja flagi dla 88 stopni

    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32             'znak stopnia Celsjusza

    Cursor Off                                                  'Wyłącza kursor
    Cls                                                         'Funkcja CLS czyści ekran
    Lcd "  Termometr CO  " ;                                    'ekran startowy (pojawia się tylko podczas włączania urządzenia)
    Lowerline
    Lcd "      PINKI        "
    Wait 5
    Cls
    W = 1wirecount()
    Lcd "Ilosc czujnikow:"                                      'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
    Waitms 500
    Lowerline
    Lcd W
    Wait 3
    Cls                                                         'Znajdź pierwszy czujnik podpięty do portu
    Dsid1(1) = 1wsearchfirst()                                  'Znajdź kolejny czujnik podpięty do portu
    Dsid2(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu
    Dsid3(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu

    '*******************Odczyt numerów ID czujników temperatury*********************

    If Dsid1(8) = Crc8(dsid1(1) , 7) Then                       'ta opcja pojawia się tylko przy włączaniu urządzenia
     Locate 1 , 1
     Lcd "Czujnik 1 OK"
     Wait 1
     Locate 1 , 1
     For B = 1 To 8
     Lcd Hex(dsid1(b))
     Next
    End If
    Wait 2

    If Dsid2(8) = Crc8(dsid2(1) , 7) Then
     Locate 2 , 1
     Lcd "Czujnik 2 OK"
     Wait 1
     Locate 2 , 1
     For B = 1 To 8
     Lcd Hex(dsid2(b))
     Next
    End If
    Wait 2

    If Dsid3(8) = Crc8(dsid3(1) , 7) Then
     Locate 1 , 1
     Lcd "Czujnik 3 OK"
     Wait 1
     Locate 1 , 1
     For B = 1 To 8
     Lcd Hex(dsid3(b))
     Next
    End If
    Wait 2

    Cls

    '*******************koniec odczytu ID czujników temperatury*********************

    Do
       1wreset
       1wwrite &H55
       1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
       1wwrite &HBE
       I1 = 1wread(2)
    '---------------------------------
       1wreset
       1wwrite &H55
       1wverify Dsid2(1)                                        'wysylam adres drugiego czujnika
       1wwrite &HBE
       I2 = 1wread(2)
    '---------------------------------
       1wreset
       1wwrite &H55
       1wverify Dsid3(1)                                        'wysylam adres trzeciego czujnika
       1wwrite &HBE
       I3 = 1wread(2)
    '---------------------------------

    '--------konwersja temp dla wszystkich dsow
       1wreset
       1wwrite &HCC
       1wwrite &H44
    Wait 1



       I1 = I1 * 10
       I1 = I1 / 16
       'If I1 > 0 Then Cls                                       'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss = Str(i1)
       Ss = Format(ss , " 0.0")
       Locate 1 , 1                                             'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
       Lcd "We" ; Ss ; Chr(0) ;

       I2 = I2 * 10
       I2 = I2 / 16
       'If I2 > 0 Then Cls
       Ss = Str(i2)
       Ss = Format(ss , " 0.0")
       Locate 1 , 9
       Lcd "Ze" ; Ss ; Chr(0) ;



       I3 = I3 * 10
       I3 = I3 / 16
       'If I3 > 0 Then Cls
       Ss = Str(i3)
       Ss = Format(ss , " 0.0")
       Lowerline

       Lcd "   PIEC  " ; Ss ; Chr(0)




    If I3 >= 270 Then                                           ' jezeli temp i3> 600 to...
    If Flaga2 = 0 Then

    Lowerline

    Lcd " !!PIEC!!" ; Ss ; Chr(0)
    Sound Speaker , 329 , 63                                    ' nuta dzwiekowa
    Sound Speaker , 369 , 99                                    ' nuta dziwekowa
    Portb.2 = 1                                                 'zapalamy diode
    If Pinb.1 = 0 Then Set Flaga2                               'pod pinem b1 jest przycisk switch
    Waitms 50                                                   'kasujemy alarm przytrzymujac go na minimum 50 ms
    End If
    End If
    If I3 < 250 Then Reset Flaga2






    If I3 >= 750 Then                                           ' jezeli temp i3> 750 to...
    If Flaga1 = 0 Then
    Lowerline

    Lcd " !!PIEC!!" ; Ss ; Chr(0)
    Sound Speaker , 1975 , 50                                   ' nuta dzwiekowa
    Sound Speaker , 261 , 63                                    ' nuta dziwekowa

    If Pinb.1 = 0 Then Set Flaga1                               'pod pinem b1 jest przycisk switch
    Waitms 50                                                   ' kasujemy alarm przytrzymujac go na minimum 50 ms
    End If
    End If
    If I3 < 710 Then Reset Flaga1




      If I3 >= 820 Then                                         ' jezeli temp i3> 820 to...
    If Flaga = 0 Then
    Lowerline

    Lcd " !!PIEC!!" ; Ss ; Chr(0)
    Sound Speaker , 587 , 32                                    ' nuta dzwiekowa
    Sound Speaker , 659 , 26                                    ' nuta dziwekowa

    If Pinb.1 = 0 Then Set Flaga                                'pod pinem b1 jest przycisk switch
    Waitms 50                                                   ' kasujemy alarm przytrzymujac go na minimum 50 ms
    End If
    End If
    If I3 < 800 Then Reset Flaga




    If I3 >= 880 Then                                           ' jezeli temp i3> 880 to...
       If Flaga3 = 0 Then
          Lowerline

          Lcd " !!PIEC!!" ; Ss ; Chr(0)
          Sound Speaker , 587 , 32                              ' nuta dzwiekowa
          Sound Speaker , 587 , 30                              ' nuta dziwekowa

          If Pinb.1 = 0 Then Set Flaga3                         'pod pinem b1 jest przycisk switch
          Waitms 50                                             ' kasujemy alarm przytrzymujac go na minimum 50 ms
       End If
    End If
    If I3 < 870 Then Reset Flaga3                               'Zmieniamy znacznik jeśli temp spadnie ponizej 87st.C



      Loop


    Proszę poprawić tytuł (p.11.1), treść wiadomości(p.15).
    W tytule zastosować tagi np. [ATMega8][Bascom]
    W przyszłości, temat umieścić we właściwym dziale.
    [zumek]

    0 2
  • #2 02 Lis 2010 21:51
    adi84_84
    Poziom 13  

    Code:
    If I3 >= 270 Then                                           ' jezeli temp i3> 600 to...
    
    If Flaga2 = 0 Then

    Lowerline

    Lcd " !!PIEC!!" ; Ss ; Chr(0)
    Sound Speaker , 329 , 63                                    ' nuta dzwiekowa
    Sound Speaker , 369 , 99                                    ' nuta dziwekowa
    Portb.2 = 1                                                 'zapalamy diode
    If Pinb.1 = 0 Then Set Flaga2                               'pod pinem b1 jest przycisk switch
    Waitms 50
    Portb.2 = 0 ' <<<  Moze tak
                                                       'kasujemy alarm przytrzymujac go na minimum 50 ms
    End If
    End If
    If I3 < 250 Then Reset Flaga2

    0
  • #3 02 Lis 2010 22:39
    cugi253
    Poziom 16  

    zapewne tak tez bedzie działać, udalo mi sie z tym poradzić tyle że ja użylem komendy toggle, ale dzieki za pomoc:)

    Code:
    If I3 >= 270 Then                                           ' jezeli temp i3> 600 to...
    
    If Flaga2 = 0 Then

    Lowerline

    Lcd " !!PIEC!!" ; Ss ; Chr(0)
    Sound Speaker , 329 , 63                                    ' nuta dzwiekowa
    Sound Speaker , 369 , 99                                    ' nuta dziwekowa
    Portb.2 = 1                                                 'zapalamy diode
    If Pinb.1 = 0 Then Set Flaga2                              'pod pinem b1 jest przycisk switch
    Waitms 250
    Toggle Portb.2

    Waitms 50                                                   'kasujemy alarm przytrzymujac go na minimum 50 ms
    End If
    End If
    If I3 < 250 Then Reset Flaga2

    0