'*****************pomiar V/A,termometr*********
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 64
$swstack = 64
$framesize = 64
Config Portb = &B11111111 : Portb = &B11111111
Config Portc = &B11111100 : Portc = &B11111100
Config Portd = &B11000000 : Portd = &B10111111
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.3 , Db6 = Portb.5 , Db7 = Portb.2 , E = Portb.0 , Rs = Portb.1
Config Lcd = 20 * 2
Cursor Off : Cls
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'Zrodlem odniesienia jest napiecie zasilania
Start Adc ' tu wlaczamy ADC
Enable Interrupts
Buzer Alias Portd.6
Wentylator Alias Portc.5
'*********************************************************
Dim Flaga_4ms As Bit , Flaga_100ms As Bit , Flaga_1s As Bit
Dim Dzielnik As Byte , Dzielnik2 As Byte
'Deklaracja wszystkich zmiennych potrzebnych do pracy programu termostatu
Config 1wire = Portd.3 ' konfiguracja portu PD.3 jako wejścia magistrali 1-wire
Dim Temp As Word , Hsingle As Word , T1_word As Word
Dim Odczyt(2) As Byte , T As Integer , T1 As Single , Napis As String * 5
Dim Alarm As Byte
'deklaracje do pomiaru napiecia
Dim P As Byte 'licznik dla ilosci pomiarow
Dim Probka As Word 'wartosc odczytana z przylozonego do ADC
Dim Napiecie As Word 'dodaje do siebie kolejne odczyty
Dim Napiecie_u As Single 'napiecie usrednione single bo z przecinkiem
Dim Hsingle_1 As Single 'pomocnicza zmienna
Dim Volt As String * 5 'zmienna "tekstowa" 5 znakow ksztaltowana przez "fusing"
Dim Napiecie_alarm As Word 'wylaczenie po osiagnieciu np.15V
Const P_max = 20 'ilosc pomiarow do usredniania
'deklaracje do pomiaru pradu
Dim X As Byte 'licznik dla ilosci pomiarow
Dim Probka_1 As Word 'wartosc odczytana z przylozonego do ADC
Dim Prad As Word 'dodaje do siebie kolejne odczyty
Dim Prad_a As Single 'napiecie usrednione single bo z przecinkiem
Dim Hsingle_2 As Single 'pomocnicza zmienna
Dim Amper As String * 5 'zmienna "tekstowa" 5 znakow ksztaltowana przez "fusing"
Const X_max = 20 'ilosc pomiarow do usredniania
'wczytanie danych z pamieci
Temp = 45
'niech DS ma już gotowa temp
1wreset
1wwrite &HCC
1wwrite &H44
'**********************************************************
Lcd " MAREKSZY "
Lowerline
Lcd " TEST V/A "
Wait 2
Cls
'**********************************************************
Do
If Flaga_4ms = 1 Then 'co 4ms
Flaga_4ms = 0
'co ma byc co 4ms
Gosub Pomiar_v
Gosub Pomiar_a
End If
If Flaga_100ms = 1 Then ' co 100ms
Flaga_100ms = 0
'co ma byc po 100ms
Gosub Wyswietlanie
End If
If Flaga_1s = 1 Then 'co 1s
Flaga_1s = 0
'co ma byc co 1s
Gosub Temperatura
Gosub Napiecie_1
Gosub Prad_1
End If
Loop
End
'***********************Przerwanie timer0**************************************
Prztimer0:
Timer0 = 131
Flaga_4ms = 1
Incr Dzielnik
If Dzielnik = 25 Then '25*4ms = 100ms
Dzielnik = 0
Flaga_100ms = 1
Incr Dzielnik2
If Dzielnik2 = 10 Then '10*100ms=1s'
Dzielnik2 = 0
Flaga_1s = 1
End If
End If
Return
'************************podprogram pom.temperatury****************************
Temperatura:
1wreset ' tu czytasz temperature
1wwrite &HCC
1wwrite &HBE
Odczyt(1) = 1wread(2)
T = Odczyt(2)
Shift T , Left , 8
T = T + Odczyt(1)
T1 = T * 0.0625
T1_word = T1
Napis = Fusing(t1 , "#.#")
' Locate 2 , 13
'Lcd "T:" ; Napis ; "" ; Chr(223) ; "C" 'wyświetl wynik ze zmiennej Word temperatura
1wreset ' tu kazesz DS`owi przygotować nowy odczyt
If Err = 0 Then
1wwrite &HCC ' i za sekunde juz będzie gotowy
1wwrite &H44
Alarm = 0
Else
Alarm = 1
End If
Return
'******************************konw.napiecia***********************************
Napiecie_1:
Hsingle_1 = Napiecie_u * 0.0049
Hsingle_1 = Hsingle_1 * 6
Volt = Fusing(hsingle_1 , "#.&")
Return
'******************************konw.pradu**************************************
Prad_1:
Hsingle_2 = Prad_a * 0.0049
Hsingle_2 = Hsingle_2 * 10
Amper = Fusing(hsingle_2 , "#.&")
Return
'**********************************pomiar V************************************
Pomiar_v:
Incr P 'zwiekszanie licznika dla pomiarow
Probka = Getadc(0) 'zmierz na Pinie 0 ADC
Napiecie = Napiecie + Probka 'dodaj kolejne pomiary
If P >= P_max Then 'gdy pomiarow 20
P = 0
Napiecie_u = Napiecie / P_max 'podziel cala sume przez ilosc pomiarow (usrednij)
Napiecie = 0 'zeruj zmienna by dodawac nowe
End If
Return
''***********************************pomiar A**********************************
Pomiar_a:
Incr X 'zwiekszanie licznika dla pomiarow
Probka_1 = Getadc(1) 'zmierz na Pinie 0 ADC
Prad = Prad + Probka_1 'dodaj kolejne pomiary
If X >= X_max Then 'gdy pomiarow 20
X = 0
Prad_a = Prad / X_max 'podziel cala sume przez ilosc pomiarow (usrednij)
Prad = 0 'zeruj zmienna by dodawac nowe
End If
Return
'**********************************wyswietlanie********************************
Wyswietlanie:
Locate 1 , 1 : Lcd "I:" ; Amper ; "A "
Locate 2 , 1 : Lcd "U:" ; Volt ; "V "
Locate 1 , 10 : Lcd "T:" ; Napis ; "" ; Chr(223) ; "C"
Return