Atmega8 - prośba o pomoc, sterowanie diodą LED.
: środa 04 gru 2013, 16:11
Witam, kolejny raz muszę prosić Was o pomoc. Kiedyś trochę bawiłem sie mikrokontrolerami, ogólnie wiele zapomniałem, teraz zaczynam zabawę na nowo, chcę je troche poznać. Ale natrafiłem na mały problem.
Buduję można powiedzieć termometr, będą cztery kanały, czujniki to populadne DS18B20. I teraz schemat wygląda następująco:
Czyli pomiar temperatur działa dobrze, problemem jest sprawienie aby po przekroczeniu 85C na czujniku numer 1 zapalała się dioda LED podpięta pod jedną z nóżek układu.
Czy móglbym prosić o jakieś rady, pod którą podpiąć i jak zmodyfikować program?
Oto program:
Diode mogę chyba podpiąć do nóżki 23, ale czy ktoś pomógłby zmodyfikować program?
http://i.imgur.com/KXnhdHG.jpg
Buduję można powiedzieć termometr, będą cztery kanały, czujniki to populadne DS18B20. I teraz schemat wygląda następująco:
Czyli pomiar temperatur działa dobrze, problemem jest sprawienie aby po przekroczeniu 85C na czujniku numer 1 zapalała się dioda LED podpięta pod jedną z nóżek układu.
Czy móglbym prosić o jakieś rady, pod którą podpiąć i jak zmodyfikować program?
Oto program:
Kod: Zaznacz cały
$regfile = "m8adef.DAT" 'deklaracja procesora, w tym wypadku Atmega8
$crystal = 8000000 'deklaracja cześtotlwiości pracy (wew oscylator 1MHz w zupełności wystarcza)
'Deklaracja portów od wyświetlacza LCD
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config Lcd = 16 * 2 'ustawiamy typ wyświetlacza (soft jest dostosowany do pracy z wyświetlaczem 2x20, przy pracy z innym wyświetlaczem trzeba będzie skorygować wyświetlanie znaków)
'*************************************WAŻNE**********************************************
'Pamiętać o podłączeniu rezystora podciągającego o wartości 4.7kohm między linią DQ a VCC
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
Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32 'znak stopnia Celsjusza
Deflcdchar 1 , 32 , 31 , 32 , 32 , 32 , 32 , 32 , 32 ' replace ? with number (0-7) ' replace ? with number (0-7)
Deflcdchar 2 , 32 , 32 , 32 , 32 , 32 , 32 , 31 , 32 ' replace ? with number (0-7)' replace ? with number (0-7)
Deflcdchar 3 , 4 , 31 , 17 , 31 , 31 , 31 , 31 , 4 ' replace ? with number (0-7) ' replace ? with number (0-7)
Deflcdchar 4 , 4 , 31 , 31 , 31 , 31 , 17 , 31 , 4 ' replace ? with number (0-7) ' replace ? with number (0-7)
Cursor Off 'Wyłącza kursor
Cls 'Funkcja CLS czyści ekran
Lcd " KOLEKTOR1 " ; 'ekran startowy (pojawia się tylko podczas włączania urządzenia)
Wait 2
Cls 'Funkcja CLS czyści ekran
W = 1wirecount()
Lcd "Czujniki: " 'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
Waitms 1000
Lcd W
Wait 2
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
Dsid4(1) = 1wsearchnext()
'*******************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
Cls
Lcd "T1 id:"
Wait 1
Locate 2 , 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
Cls
Lcd "T2 id:"
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
Cls
Lcd "T3 id:"
Wait 1
Locate 2 , 1
For B = 1 To 8
Lcd Hex(dsid3(b))
Next
End If
Wait 2
If Dsid4(8) = Crc8(dsid4(1) , 7) Then
Locate 1 , 1
Cls
Lcd "T4 id:"
Wait 1
Locate 2 , 1
For B = 1 To 8
Lcd Hex(dsid4(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)
'---------------------------------
1wreset
1wwrite &H55
1wverify Dsid4(1) 'wysylam adres czwartego czujnika
1wwrite &HBE
I4 = 1wread(2)
'--------konwersja temp dla wszystkich dsow
1wreset
1wwrite &HCC
1wwrite &H44
Wait 1
'****Jeśli pracujesz z wyświetlaczem innym niż 2x20 to tutaj trzeba wprowadzić zmiany w LOCATE********
I1 = I1 * 10
I1 = I1 / 16
If I1 > 0 Then '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 Chr(1) ; Ss ; Chr(0) ;
Else
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 Chr(1) ; Ss ; Chr(0) ;
End If
I2 = I2 * 10
I2 = I2 / 16
If I2 > 0 Then
Ss = Str(i2)
Ss = Format(ss , " 0.0")
Locate 1 , 10
Lcd Chr(2) ; Ss ; Chr(0) ;
Else
Ss = Str(i2)
Ss = Format(ss , " 0.0")
Locate 1 , 10
Lcd Chr(2) ; Ss ; Chr(0)
End If
I3 = I3 * 10
I3 = I3 / 16
If I3 > 0 Then
Ss = Str(i3)
Ss = Format(ss , " 0.0")
Locate 2 , 1
Lcd Chr(3) ; Ss ; Chr(0) ;
Else
Ss = Str(i3)
Ss = Format(ss , " 0.0")
Locate 2 , 1
Lcd Chr(3) ; Ss ; Chr(0) ;
End If
I4 = I4 * 10
I4 = I4 / 16
If I4 > 0 Then
Ss = Str(i4)
Ss = Format(ss , " 0.0")
Locate 2 , 10
Lcd Chr(4) ; Ss ; Chr(0) ;
Else
Ss = Str(i4)
Ss = Format(ss , " 0.0")
Locate 2 , 10
Lcd Chr(4) ; Ss ; Chr(0) ;
End If
Loop
Diode mogę chyba podpiąć do nóżki 23, ale czy ktoś pomógłby zmodyfikować program?
http://i.imgur.com/KXnhdHG.jpg