Witam. Mam z książki Marcina Wiązani listing do zegarka na atmega8. Chciałbym włączyc jeszcze do tego projektu termometr ( możne być DS18B20 lub LM35). Jak to technicznie wykonać?
listing zegara
Jak dodać funkcję termo?
znalazłem projekt z zegarkiem dcf. Tylko ja nie chcę dcfa tylko żeby działał na zew kwarcu 8hmz
listing zegara
'Program zegara wykorzystującego przerwania od Timer1
'Przerwanie przepełnienia Timer1 jest generowane co 1 s
'8 MHz/256/31250 = 1 s
'Przycisk S1 ustawia minuty, a S2 godziny
$regfile = "m8def.dat" 'informuje kompilator o pliku
'dyrektyw mikrokontrolera
$crystal = 8000000 'informuje kompilator
'o częstotliwości oscylatora
'taktującego mikrokontroler
Config Pinb.1 = Input 'linia PB1 jako wejściowa
Config Pinb.2 = Input 'linia PB2 jako wejściowa
Config Lcd = 16 * 2 'konfiguracja typu wyświetlacza
'LCD
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5 'konfiguracja linii
'mikrokontrolera, do których
'dołączono wyświetlacz
'LCD
Config Timer1 = Timer , Prescale = 256
'konfiguracja Timer1 jako timer
'z podziałem preskalera przez
'256
Declare Sub Wysw_czas 'procedura wyświetlająca czas na
'LCD w formacie gg:mm:ss
On Timer1 Odmierz_1s 'przerwanie od przepełnienia
'Timer1 o etykiecie Odmierz_1s
Dim Sekundy As Byte 'zmienna zliczająca sekundy
Dim Minuty As Byte 'zmienna zliczająca minuty
Dim Godziny As Byte 'zmienna zliczająca godziny
Dim Nowa_w As Bit 'flaga zezwolenia aktualizacji
'czasu na LCD
Dim Wart_bcd As Byte 'zmienna pomocnicza, w której
'jest zapisywana wartość BCD
'czasu
S1 Alias Pinb.2 'przypisanie nazwie Pinb.2
'nazwy S1
S2 Alias Pinb.1 'przypisanie nazwie Pinb.1
'nazwy S2
Enable Interrupts 'odblokowanie globalnego systemu
'przerwań
Enable Timer1 'odblokowanie przerwania od
'przepełnienia Timer1
Counter1 = 34286 'wartość początkowa wpisywana do
'Timer1 (65536 - 31250 = 34286)
Set Nowa_w 'zezwolenie na wyświetlenie
'aktualnego czasu
Set Portb.1 'dołączenie do linii PB1
'rezystora podciągającego
Set Portb.2 'dołączenie do linii PB2
'rezystora podciągającego
Do 'pętla główna programu
Call Wysw_czas 'wywołanie procedury
'wyświetlającej aktualny czas
If S1 = 0 Then 'jeśli przyciśnięty S1, to
Waitms 25 'opóźnienie dla eliminacji drgań
'styków
If S1 = 0 Then 'sprawdzenie, czy przycisk S1
'dalej naciśniety, jeśli tak, to
Incr Minuty 'zwiększenie wartości minut
Sekundy = 0 'wyzerowanie zmiennej Sekundy
If Minuty = 60 Then 'jeśli wartość Minuty = 60, to
Minuty = 0 'zerowanie wartości Minuty
End If
Set Nowa_w 'zezwolenie na wyświetlenie
'czasu
Call Wysw_czas 'wywołanie procedury
'wyświetlenia aktualnego czasu
Waitms 200 'opóźnienie 200 ms
End If 'koniec instrukcji warunkowej
End If
If S2 = 0 Then 'jeśli przyciśnięty S2, to
Waitms 25 'opóźnienie dla eliminacji drgań
'styków
If S2 = 0 Then 'sprawdzenie czy przycisk S2
'dalej naciśniety, jeśli tak, to
Incr Godziny 'zwiększenie wartości Godziny
If Godziny = 24 Then 'jeśli wartość Godziny = 24, to
Godziny = 0 'wyzerowanie wartości Godziny
End If
Set Nowa_w 'zezwolenie na wyświetlenie
'czasu
Call Wysw_czas 'wywołanie procedury
'wyświetlenia aktualnego czasu
Waitms 200 'opóźnienie 200 ms
End If 'koniec instrukcji warunkowej
End If
Loop
End 'koniec programu
Sub Wysw_czas 'procedura wyświetlająca czas
If Nowa_w = 1 Then 'jeśli flaga Nowa_w = 1, to
Cls 'czyszczenie LCD
Wart_bcd = Makebcd(godziny) 'zamiana wartości Godziny na
'wartość w kodzie BCD
Lcd Bcd(wart_bcd) ; ":" 'wyświetlenie wartości godzin
'w kodzie BCD zamienionych na
'tekst oraz znaku :
Wart_bcd = Makebcd(minuty) 'zamiana wartości Minuty na
'wartość BCD
Lcd Bcd(wart_bcd) ; ":" 'wyświetlenie wartości minut
'w kodzie BCD zamienionych na
'tekst oraz znaku :
Wart_bcd = Makebcd(sekundy) 'zamiana wartości Sekundy na
'wartość w kodzie BCD
Lcd Bcd(wart_bcd) ; 'wyświetlenie wartości sekund
'w kodzie BCD zamienionych na
'tekst
Reset Nowa_w 'zerowanie flagi Nowa_w
End If
End Sub 'koniec procedury
Odmierz_1s: 'podprogramu obsługi przerwania
'przepełnienia od Timer1
Counter1 = Counter1 + 34286 'wpisanie wartości początkowej
'licznika
Incr Sekundy 'zwiększenie o 1 wartości
'Sekundy
Set Nowa_w 'zezwolenie na wyświetlenie
'czasu
If Sekundy = 60 Then 'jeśli Sekundy = 60, to
Sekundy = 0 'wyzerowanie wartości Sekundy
Incr Minuty 'zwiększenie o 1 wartości Minuty
If Minuty = 60 Then 'jeśli Minuty = 60, to
Minuty = 0 'zerowanie wartości Minuty
Incr Godziny 'zwiększenie o 1 wartości
'Godziny
If Godziny = 24 Then 'jeśli Godziny = 24, to
Godziny = 0 'zerowanie wartości Godziny
End If 'koniec warunków
End If
End If
Return 'powrót z przerwaniaJak dodać funkcję termo?
znalazłem projekt z zegarkiem dcf. Tylko ja nie chcę dcfa tylko żeby działał na zew kwarcu 8hmz
Cytat:'Zegar DCF77
$regfile = "m8def.dat"
$crystal = 8000000
$lib "dcf77.lib"
'Sygnał z odbiornika DCF podłączony do Portb.2
Config Dcf77 = Pinb.2 , Debug = 1 , Inverted = 0 , Check = 1 , Update = 0 , Updatetime = 0 , Secondticks = 50 , Timer1sec = 1 , Powerlevel = 1 , Timer = 1 , Gosub = Sectic
'Config Dcf77 = Pinb.2 , Debug = 1 , Inverted = 0 , Check = 1 , Update = 0 , Updatetime = 0 , Switchpower = 0 , Secondticks = 50 , Timer1sec = 1 , Powerlevel = 1 , Timer = 1 , Gosub = Sectic
'Config Dcf77 = Pinb.1 , Debug = 1 , Inverted = 0 , Check = 2 , Update = 0 , Updatetime = 0 , Switchpower = 0 , Secondticks = 50 , Timer1sec = 1 , Powerlevel = 1 , Timer = 1 , Gosub = Sectic
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 20 * 4
Config 1wire = Portb.0 'deklaracja portu na którym będ? podpięte DS18b20
Klmode Alias Portb.3
Klup Alias Portb.4
Kldown Alias Pinb.5
Set Klmode
Set Klup
Set Kldown
Dim Flaga1 As Bit
Dim I1 As Integer , Ss1 As String * 6
Dim I2 As Integer , Ss2 As String * 6
Dim Dsid1(8) As Byte
Dim Dsid2(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
Cls
Lcd " " ; 'ekran startowy (pojawia się tylko podczas wł?czania urz?dzenia)
Cursor Off
Locate 1 , 17
Lcd " termometr "
Wait 5
Cls
W = 1wirecount()
Dsid1(1) = 1wsearchfirst() 'Znajd? pierwszy czujnik podpięty do portu
Dsid2(1) = 1wsearchnext() 'Znajd? kolejny czujnik podpięty do portu
Enable Interrupts
Config Date = Dmy , Separator = /
Do
If Flaga1 = 1 Then
Flaga1 = 0
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)
'--------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?
Ss1 = Str(i1)
Ss1 = Format(ss1 , " 0.0")
I2 = I2 * 10
I2 = I2 / 16
If I2 > 0 Then Cls
Ss2 = Str(i2)
Ss2 = Format(ss2 , " 0.0")
'Cls
Locate 1 , 1
Lcd Time$ ; " ";
If Pinb.2 = 0 Then Lcd "Rcvr" Else Lcd " "
Locate 2 , 1
Lcd Date$
Locate 2 , 17 'Pozycja wy?wietlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
Lcd "ZEW:" ;
Locate 2 , 23
Lcd Ss1 ; Chr(0) ;
Locate 1 , 17
Lcd "WEW:" ;
Locate 1 , 23
Lcd Ss2 ; Chr(0) ;
Locate 2 , 1
Lcd Date$
End If
' klawisz 1
' klawisz 2
' klawisz 3
Loop
Sectic:
Set Flaga1
Return
End
