;Chip Settings #chip 16F84A,4 #config PWRTE=ON, OSC=XT ;Defines (Constants) #define LCD_IO 4 #define LCD_RS PORTA.2 #define LCD_NO_RW #define LCD_Enable PORTA.3 #define LCD_DB4 PORTB.0 #define LCD_DB5 PORTB.1 #define LCD_DB6 PORTB.2 #define LCD_DB7 PORTB.3 #define VODA PORTB.6 #define RELE PORTB.4 #define ALARM PORTA.1 #define CIDLO_0 PORTB.5 #define CIDLO_1 PORTB.7 ;Variables Dim CIDLO As byte Dim READ_BIT As bit Dim TEPLOTA As byte Dim TEPLOTA_S As byte Dim TEPLOTA_N As byte Dim ERROR As byte Dim VYSOKA_T As bit Dim NENI_CIDLO As bit Dim SOUCET As byte Dim PREHRATI As byte Dim RELE_POMOCNE As bit ' CIDLO_0 - SOLAR ' CIDLO_1 - PANEL 'RELE - vystup pro rele 'VODA - cidlo vody 0 = ok 'ALARM - vystup alarmu 'ERROR.0 - solar neni 'ERROR.1 - nadrz neni 'ERROR.2 - solar prehrati 'ERROR.3 - nadrz prehrati 'ERROR.4 - Rezerva 'ERROR.5 - Rezerva 'ERROR.6 - ztrata vody 'ERROR.7 - Rezerva '***************** '* SMYCKA MERENI * '***************** CLS RELE_POMOCNE = 0 LOOP: ERROR = 0 ERROR.6 = VODA '************************** '* mereni pro cidlo SOLAR * '************************** NENI_CIDLO = 0 VYSOKA_T = 0 'OBSLUHA SBERNICE 1-WIRE RESET_1WIRE_0 TEST_1WIRE_0 Wait 1 ms WRITE_1WIRE_0 (0xCC) 'SkipRom WRITE_1WIRE_0 (0x44) 'ConvertT Wait 1 s 'ceka na dokonceni konverze RESET_1WIRE_0 TEST_1WIRE_0 Wait 1 ms WRITE_1WIRE_0 (0xCC) 'SkipRom WRITE_1WIRE_0 (0xBE) 'ReadScratch READ_1WIRE_0 'ZOBRAZI TEPLOTU PREHRATI = 100 TEPLOTA = TEPLOTA_S Locate 0,0 Print "Solar: " ZOBRAZ Print " " ERROR.0 = NENI_CIDLO ERROR.2 = VYSOKA_T '************************** '* mereni pro cidlo NADRZ * '************************** NENI_CIDLO = 0 VYSOKA_T = 0 'OBSLUHA SBERNICE 1-WIRE RESET_1WIRE_1 TEST_1WIRE_1 Wait 1 ms WRITE_1WIRE_1 (0xCC) 'SkipRom WRITE_1WIRE_1 (0x44) 'ConvertT Wait 1 s 'ceka na dokonceni konverze RESET_1WIRE_1 TEST_1WIRE_1 Wait 1 ms WRITE_1WIRE_1 (0xCC) 'SkipRom WRITE_1WIRE_1 (0xBE) 'ReadScratch READ_1WIRE_1 'ZOBRAZI TEPLOTU TEPLOTA = TEPLOTA_N PREHRATI = 85 Locate 1,0 Print "Nadrz: " ZOBRAZ Print " " Print " " ERROR.1 = NENI_CIDLO ERROR.3 = VYSOKA_T '********************** '* OVLADANI HYSTEREZE * '* nastaveno 7/2 st C * '********************** IF ERROR = 0 THEN ALARM = 0 SOUCET = TEPLOTA_N + 6 If TEPLOTA_S > SOUCET THEN IF RELE_POMOCNE = 0 THEN RELE_POMOCNE = 1 END IF END IF SOUCET = TEPLOTA_N + 3 If TEPLOTA_S < SOUCET THEN IF RELE_POMOCNE = 1 THEN RELE_POMOCNE = 0 END IF END IF IF TEPLOTA_N > 75 THEN RELE_POMOCNE = 0 END IF RELE = RELE_POMOCNE ELSE ALARM = 1 RELE = 0 END IF Goto LOOP '********************** '* sub programy cidel * '********************** '''CTENI BITU SBERNICE 1WIRE Sub READ_1WIRE_1 For I = 1 To 16 Dir CIDLO_1 Out Set CIDLO_1 Off Wait 6 us Dir CIDLO_1 In Wait 9 us If CIDLO_1 1 then READ_BIT = 1 Else READ_BIT = 0 End if Select Case I Case 5 TEPLOTA_N.0 = READ_BIT Case 6 TEPLOTA_N.1 = READ_BIT Case 7 TEPLOTA_N.2 = READ_BIT Case 8 TEPLOTA_N.3 = READ_BIT Case 9 TEPLOTA_N.4 = READ_BIT Case 10 TEPLOTA_N.5 = READ_BIT Case 11 TEPLOTA_N.6 = READ_BIT Case 12 TEPLOTA_N.7 = READ_BIT End Select Wait 50 us Next End Sub '''ZAPIS BITU SBERNICE 1WIRE -ok Sub WRITE_1WIRE_1 (In PRIKAZ) For I = 1 To 8 Dir CIDLO_1 Out Set CIDLO_1 Off Wait 5 us If PRIKAZ.0 = On Then Dir CIDLO_1 In End if Wait 60 us Dir CIDLO_1 In Wait 3 us Rotate PRIKAZ Right Next End Sub '''RESET SBERNICE 1WIRE -ok Sub RESET_1WIRE_1 Dir CIDLO_1 In Dir CIDLO_1 Out Set CIDLO_1 Off Wait 50 10us Dir CIDLO_1 In End Sub '''TEST SBERNICE 1WIRE -ok Sub TEST_1WIRE_1 TEPLOTA_N = 255 Wait 70 us If CIDLO_1 0 Then 'by TEST_CIDLA_1WIRE_1 = 0 you can test presence of DS18B20 TEPLOTA_N = 0 End if wait 43 10us Dir CIDLO_1 In End Sub '''CTENI BITU SBERNICE 1WIRE Sub READ_1WIRE_0 For I = 1 To 16 Dir CIDLO_0 Out Set CIDLO_0 Off Wait 6 us Dir CIDLO_0 In Wait 9 us If CIDLO_0 1 then READ_BIT = 1 Else READ_BIT = 0 End if Select Case I Case 5 TEPLOTA_S.0 = READ_BIT Case 6 TEPLOTA_S.1 = READ_BIT Case 7 TEPLOTA_S.2 = READ_BIT Case 8 TEPLOTA_S.3 = READ_BIT Case 9 TEPLOTA_S.4 = READ_BIT Case 10 TEPLOTA_S.5 = READ_BIT Case 11 TEPLOTA_S.6 = READ_BIT Case 12 TEPLOTA_S.7 = READ_BIT End Select Wait 50 us Next End Sub '''ZAPIS BITU SBERNICE 1WIRE Sub WRITE_1WIRE_0 (In PRIKAZ) For I = 1 To 8 Dir CIDLO_0 Out Set CIDLO_0 Off Wait 5 us If PRIKAZ.0 = On Then Dir CIDLO_0 In End if Wait 60 us Dir CIDLO_0 In Wait 3 us Rotate PRIKAZ Right Next End Sub '''RESET SBERNICE 1WIRE Sub RESET_1WIRE_0 Dir CIDLO_0 In Dir CIDLO_0 Out Set CIDLO_0 Off Wait 50 10us Dir CIDLO_0 In End Sub '''TEST SBERNICE 1WIRE Sub TEST_1WIRE_0 TEPLOTA_S = 255 Wait 70 us If CIDLO_0 0 Then 'by TEST_CIDLA_1WIRE_0 = 0 you can test presence of DS18B20 TEPLOTA_S = 0 End if wait 43 10us Dir CIDLO_0 In End Sub '''VYHODNOTI A UKAZE TEPLOTU Sub ZOBRAZ If TEPLOTA > 126 Then NENI_CIDLO = 1 Print "Err" Print " " Else Print TEPLOTA Print "*C" End If If TEPLOTA > PREHRATI Then Print "!" VYSOKA_T = 1 End If End Sub