Witam,
jako, że kończą się wakacje postanowiłem udoskonalić trochę soft piórnika - chcę dodać odczyt temp., tylko nie wiem gdzie ją umieścić.
Napisałem prosty program, do obsługi wyłącznie DS18B20 - wszystko działa, problem pojawił się dopiero jak chciałem to dodać do głównego programu.
Mógłby mnie ktoś nakierować? Strasznie ciężko idzie mi pisanie programów..
jako, że kończą się wakacje postanowiłem udoskonalić trochę soft piórnika - chcę dodać odczyt temp., tylko nie wiem gdzie ją umieścić.
Code:
'******************************************************************************'
'* Program Piórnik Mini wersja 1.0 Beta *'
'* Pomysł: FICU *'
'* Programista: Jacek R (Black Jack) Kompilator: BASCOM AVR *'
'* Procesor: ATMega8 - 8 MHz. *'
'* EEPROM: 24c64 LCD: 2 linie po 16 znaków *'
'******************************************************************************'
' konfiguracja dla kompilatora
$regfile = "m8def.dat"
$crystal = 8000000
' konfiguracja urządzeń CPU
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Pinc.2 , Db5 = Pinc.3 , Db6 = Pinb.2 , Db7 = Pinb.1 , E = Pinc.1 , Rs = Pinc.0
Config Rc5 = Pind.2
Config Timer1 = Timer , Prescale = 256
Config Sda = Portc.4
Config Scl = Portc.5
' deklaracja procedur
On Timer1 Czas_sys
Declare Sub Godziny
Declare Sub Wys_czas
Declare Sub Txt_edit
Declare Sub Ustaw_czas
' deklaracje zmiennych
Dim Address As Byte , Command As Byte
Dim Godz As Byte
Dim Minuty As Byte
Dim Sek As Byte
Dim Nowy_czas As Bit
Dim Ekran As Bit
Dim Gora As Bit
Dim Dol As Bit
Dim Odswierz As Bit
Dim Cykl As Bit
Dim Wart_bcd As Byte
Dim Bufor As Byte
Dim Adr_eep As Word At &H69 'Taka nietypowa zmienna
Dim Adr_low As Byte At &H69 Overlay 'jest jedna?, mimo iż
Dim Adr_hi As Byte At &H6A Overlay 'zdefiniowano 3.
Dim I As Byte
' deklaracje stałych
Const Piornik_id = 0
Const Podst_czasu = 49911 'przedtem 34286
Const In_eep = 160 'Adresy dla EEPROM
Const Out_eep = 161
Const Max_eep = 8160
Const Null = 0
Deflcdchar 0 , 28 , 8 , 8 , 30 , 5 , 6 , 5 , 32 'Def ikony IRed
' program główny
Enable Interrupts
Enable Timer1
Stop Timer1
Set Nowy_czas
Reset Ekran
Counter1 = Podst_czasu
Call Ustaw_czas
Start Timer1
Cursor Off
Cls
Adr_eep = 0
Odswierz = 0
Set Cykl
Do
If Nowy_czas = 1 And Ekran = 0 Then
Call Godziny
Call Wys_czas
End If
If Nowy_czas = 1 And Ekran = 1 Then
Call Godziny
If Gora = 1 And Adr_eep <= Max_eep Then
Adr_eep = Adr_eep + 16
Reset Gora
End If
If Dol = 1 And Adr_eep > 15 Then
Adr_eep = Adr_eep - 16
Reset Dol
End If
If Odswierz = 1 Then
Call Txt_edit
Odswierz = Not Odswierz
End If
End If
Getrc5(address , Command)
Command = Command And &B01111111
Select Case Command
Case 11 : Ekran = Not Ekran
Set Odswierz
Cls
Case 12 : If Ekran = 1 Then
Set Gora
Set Odswierz
End If
Case 13 : If Ekran = 1 Then
Set Dol
Set Odswierz
End If
End Select
Loop
End 'end program
' opis procedur
Czas_sys:
Counter1 = Counter1 + Podst_czasu
Cykl = Not Cykl
If Cykl = 1 Then
Incr Sek
End If
Set Nowy_czas
Return
Sub Godziny
If Sek = 60 Then
Sek = 0
Incr Minuty
If Minuty = 60 Then
Minuty = 0
Incr Godz
If Godz = 24 Then
Godz = 0
End If
End If
End If
End Sub
Sub Wys_czas
Locate 1 , 5
Wart_bcd = Makebcd(godz)
If Godz < 10 Then
Lcd " " ; Wart_bcd ; ":"
Else
Lcd Bcd(wart_bcd) ; ":"
End If
Wart_bcd = Makebcd(minuty)
Lcd Bcd(wart_bcd) ; ":"
Wart_bcd = Makebcd(sek)
Lcd Bcd(wart_bcd) ;
Locate 1 , 16
Lcd Chr(0)
Lowerline
Reset Nowy_czas
End Sub
Sub Txt_edit
Home Upper
I2cstart
I2cwbyte In_eep
I2cwbyte Adr_hi
I2cwbyte Adr_low
I2cstart
I2cwbyte Out_eep
For I = 1 To 32
I2crbyte Bufor , Ack
If I = 17 Then
Lowerline
End If
If Bufor < 128 Then
Lcd Chr(bufor)
Else
Lcd " "
End If
Next I
I2crbyte Bufor , Nack
If Bufor < 128 Then
Lcd Chr(bufor)
Else
Lcd " "
End If
I2cstop
Reset Nowy_czas
End Sub
Sub Ustaw_czas
Cls
Call Wys_czas
Lcd " Ustaw godzine"
Do
Getrc5(address , Command)
Command = Command And &B01111111
Select Case Command
Case 11 : Incr Sek
If Sek = 60 Then
Sek = 0
End If
Case 12 : Incr Minuty
If Minuty = 60 Then
Minuty = 0
End If
Case 13 : Incr Godz
If Godz = 24 Then
Godz = 0
End If
End Select
Waitms 250
Call Wys_czas
Lcd " Ustaw godzine"
Loop Until Command = 10
End Sub
Napisałem prosty program, do obsługi wyłącznie DS18B20 - wszystko działa, problem pojawił się dopiero jak chciałem to dodać do głównego programu.
Code:
$regfile = "m8def.dat"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Pinc.2 , Db5 = Pinc.3 , Db6 = Pinb.2 , Db7 = Pinb.1 , E = Pinc.1 , Rs = Pinc.0
Config Rc5 = Pind.2
Config Timer1 = Timer , Prescale = 256
Config Sda = Portc.4
Config Scl = Portc.5
Config 1wire = Portb.0
Deflcdchar 1 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32 ' definicja znaku stopnia
Dim Odczyt(2) As Byte , A As Byte , Licznik As Byte , T As Integer , T1 As Single , Napis As String * 5
Do
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 750
1wreset
1wwrite &HCC
1wwrite &HBE
Odczyt(1) = 1wread(2)
T = Odczyt(2)
Shift T , Left , 8
T = T + Odczyt(1)
T1 = T * 0.0625
Napis = Fusing(t1 , "#.#")
Cls : Cursor Off : Lcd "* Temperatura *"
Lowerline
Lcd "Wynik: " ; Napis ; " " ; Chr(1) ; "C"
Loop : End
Mógłby mnie ktoś nakierować? Strasznie ciężko idzie mi pisanie programów..