;-------------------------------; ; DS Termostat ; ; pro J ; ;-------------------------------; ; jeden senzor DS18B20 ; ;-------------------------------; ;rozsah: -55 až +125°C ; ;rozlišení: 0,1 (-9,9 až 99,9°C); ;rozlišení: 1 (okrajová pásma); ;-------------------------------; ; 2 impulsní výstupy ; ;-------------------------------; ;)S(2013.04 slovak@post.cz; ;-------------------------------; ; ;LED displej 3 místa, společné anody. ; ;Tlačítka: ;TlS(levé), TlM(střední), TlP(pravé). ; ;TlM/TlP Výběr položky menu (zobrazení nadpisu). Při nastavování +/- ;TlS Zobrazení nadpisu. Zahájení/ukončení nastavování ; ;Menu: ;[°C] teplota, [Err.] chyba čidla ;[H.M.] horní mez ;[d.M.] dolní mez ;[t.A] čas ZAP pro výstup VB4 ;[t.b] čas VYP pro výstup VB4 (0=nečasuje, VB4=Log.1) ;[t.C] čas ZAP pro výstup VA1 ;[t.d] čas VYP pro výstup VA1 (0=nečasuje, VA1=Log.1) ;[ru.P.] ruční provoz ;Automatický návrat na zobrazení teploty po nečinnosti tlačítek (17s.) ;Při nastavování(displej bliká) neplatí automatický návrat ; ;Nastavení mezí: -55 až +125°C krok 0.1 (1) ;Nalistovat požadovanou mez (TlP/TlM) ;TlS držet (2s) hodnota začne blikat ;TlP/TlM změnit +/- (dlouhý stisk - rychlá změna) ;TlS uložit ; ;Nastavení časových úseků A,b,C,d: 0 až 255s krok 1 ;Nalistovat požadovaný čas (TlP/TlM) ;(další postup je stejný jako u mezí) ;A=Log.1, b=Log.0 pro výstup VA1 ;C=Log.1, d=Log.0 pro výstup VB4 ; ;Termostat, výstup VA1: ;VA1 = imp když teplota <= dolní mez ;VA1 = VYP když teplota > dolní mez ;(imp=impuls, Log.1 čas A, Log.0 čas b) ; ;Termostat, výstup VB4: ;VB4 = imp. když teplota >= horní mez ;VB4 = VYP když teploty < horní mez ;(imp=impuls, Log.1 čas C, Log.0 čas d) ; ;ERROR senzor, výstup VA3: ;VA3 = ZAP porucha ; ;Mikroprocesor PIC16F1847 (1827) ;RB7 Katoda f ;RB6 Katoda a ;RB5 Anoda A1 (znak vlevo) ;RB4 výstup VB4 (CON1-B4) ;RB3 1-Wire sběrnice DS18B20 (CON1-B3) ;RB2 Katoda e, TlS ;RB1 Katoda d, TlM (-) ;RB0 Katoda T, TlP (+) ; ;RA7 Anoda A3 (znak vpravo) ;RA6 Anoda A2 (znak střední) ;RA5 vstup (nevyužito) (CON1-A5) ;RA4 Katoda g ;RA3 výstup VA3 ERROR senzor (CON1-A3) ;RA2 Katoda c ;RA1 výstup VA1 (CON1-A1) ;RA0 Katoda b ; ;Napájení senzoru DS18B20 ;Externí: (3 vodiče) ;/¨¨¨|-----3 +5V ;|DS |-----2 DS 1-wire ;\___|-----1 GND ; ;Parazitní: (2 vodiče) ;/¨¨¨|-----3 GND ;|DS |-----2 DS 1-wire (posílena sběrnice při CONVERT) ;\___|-----1 GND ; ;-------------------------------- LIST P=16F1847, R=DEC, MM=ON ;Direktivy překladače include ;Definice názvů registrů ;Nastavení konfigurace procesoru: __CONFIG _CONFIG1,_CP_OFF & _CPD_OFF & _WDTE_ON & _MCLRE_OFF & _FOSC_INTOSC & _CLKOUTEN_OFF & _PWRTE_ON & _BOREN_ON & _IESO_OFF & _FCMEN_OFF __CONFIG _CONFIG2,_WRT_OFF & _LVP_ON & _BORV_LO & _STVREN_OFF & _PLLEN_OFF errorlevel 1, -306 cblock 0x20 A1,A2,A3 ;matematické proměnné B1,B2,B3 ; (a jiné funkce) C1,C2,C3 ; D1,D2,D3 ; X1 ; FL ;Flag, příznaky F1 ; T1,T2 ;teplota (dolní/horní bajt) T_RDS ;data, 1-Wire CRC ;kontrolní součet PP ;počítadlo poruch ZABCD ;zobrazení času A,B,C,D HM1,HM2 ;00 ;horní mez DM1,DM2 ;02 ;dolní mez TA ;04 ;čas ZAP pro VA1 TB ;05 ;čas VYP pro VA1 TC ;06 ;čas ZAP pro VB4 TD ;07 ;čas VYP pro VB4 ;EEPROM DIS ;pořadí, 0=1.displej, 1=2.displej, 2=3.displej Znak1 ;číslo znaku, 1.displej (vlevo) Znak2 ;číslo znaku, 2.displej (uprostřed) Znak3 ;číslo znaku, 3.displej (vpravo) BLIK ;blikání při nastavování KLVP ;port klávesnice, bit 0-TlP, 1-TlM, 2-TlS (Log.0=stisknuto) KLVD ;dělič čtení klávesnice KLVO ;dělič opakování tlačítka R1,R2,R3,R4 ;výstup převodu HEX/DEC, řád desetin, jedniček, desítek, stovek PMC ;pauza mezi CONVERT D244 ;dělič 244/244=1Hz DN ;dělič návrat na zobrazení teploty endc EEADRp EQU 0x7E ;pomocná EE adresa #define SC STATUS,C #define SZ STATUS,Z #define DS PORTB,3 ;DALLAS 1-Wire sběrnice #define Znam FL,7 ;znaménko, 1=záporná hodnota #define Azn FL,6 ;znaménka pro Mat. výpočty #define Bzn FL,5 ; #define Stisk FL,4 ;minule stisknuto #define Znova FL,3 ;znova stisknuto #define ERP F1,7 ;1=ERROR po RESET/PRESENCE #define ERS F1,6 ;1=ERROR senzor (každá porucha) #define CVA1 F1,5 ;1=cykluje VA1 #define CVB4 F1,4 ;1=cykluje VB4 #define TlS KLVP,2 ;tlačítko Set (levé) #define TlM KLVP,1 ;tlačítko Mínus (střední) #define TlP KLVP,0 ;tlačítko Plus (pravé) #define VB4 LATB,4 ;výstup, teplota >= horní mez #define VA1 LATA,1 ;výstup, teplota <= dolní mez #define VA3 LATA,3 ;výstup, porucha čidla ;číslo znaku #define . 128 ;tečka #define zA 10 ;znak A #define zb 11 #define zC 12 #define zd 13 #define zE 14 #define zF 15 #define zG 16 #define zH 17 #define zi 18 #define zJ 19 #define zk 20 #define zL 21 #define zM 22 #define zn 23 #define zo 24 #define zP 25 #define zr 26 #define zS 27 ;(segment a,c,f,g) #define zt 28 #define zu 29 #define zV 30 #define zY 31 #define sp 32 ;space #define zm1 33 ;-1 (segment b,c,g) #define zhm 34 ;(segment a) #define zmi 35 ;- #define z_ 36 ;znak podtržítko (segment d) #define zro 37 ;= (segment d,g) #define z3m 38 ;3x - (segment a,d,g) #define zst 39 ;° #define zc 40 #define zpz 41 ;) #define zII 42 ;(segment b,c,e,f) ;RAM Banka 0 (000-07F) BANK0 macro MOVLB 0 endm ;RAM Banka 1 (080-0FF) BANK1 macro MOVLB 1 endm ;RAM Banka 2 (100-17F) BANK2 macro MOVLB 2 endm ;RAM Banka 3 (180-1FF) BANK3 macro MOVLB 3 endm ;RAM Banka 4 (200-2FF) BANK4 macro MOVLB 4 endm ;************************************************* ORG 0xF000 ;tabulka dat v EEPROM de 0xC8, 0x00, 0xB4, 0x00, 0x01, 0x01, 0x01, 0x01 de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0x29, 0x53, 0x28, 0x32, 0x30, 0x31, 0x33, 0x2E de 0x30, 0x34, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ;******************************** ;reset ORG 0 GOTO Init CALL 41 CALL 83 CALL 40 ;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ;přerušení CLRF BSR ;BANK0 ;-------------------------------- ;od TMR0 (4MHz/4/16/256=244Hz) BCF INTCON,TMR0IF ;nulovat příznak ;Displej, multiplex MOVF DIS,W ;displej pořadí (0=A1, 1=A2, 2=A3) ADDLW Znak1 ; + RAM adresa prvního znaku MOVWF FSR0L ;do ukazovátka ;Zhasnout displej BANK2 BCF LATB,5 ;VYP A1 MOVLW B'00101010' ANDWF LATA,F ;VYP A2,3; nulovat Katody g,c,b MOVLW B'00011000' ANDWF LATB,F ;nulovat Katody f,a,e,d,T BANK0 ;................................ ;dělič pro klávesnici 244/16=15Hz DECFSZ KLVD,F ;-1=0? BRA EKLV MOVLW 16 ;znovu MOVWF KLVD ; naplnit ;čtení tlačítek MOVLW B'00000111' ; BANK1 IORWF TRISB ;1=vstup BANK0 MOVF PORTB,W ;čtení MOVF PORTB,W ; MOVF PORTB,W ; MOVF PORTB,W ; MOVF PORTB,W ; MOVF PORTB,W ; MOVF PORTB,W ; ANDLW B'00000111' ;(1a1=1) MOVWF KLVP ;uložit BANK1 MOVLW B'11111000' ; ANDWF TRISB,F ;1=vstup, 0=výstup BANK0 ;................................ ;počítadlo, pauza mezi CONVERT MOVF PMC,F BTFSS SZ ;PMC=0?, SZ=1? DECF PMC,F ;-1 ;................................ ;dělič pro návrat na 1.displej MOVF DN,F BTFSS SZ ;DN=0?, SZ=1? DECF DN,F ;-1 EKLV ;................................ ;zapnout Katody podle DIS v ukazovátku FSR0 (0=Znak1, 1=Znak2, 2=Znak3) BANK2 CALL Segment ANDLW B'11000110' ;(1a1=1) pouze Katody pro PB BTFSS INDF0,7 ;znak s tečkou? (tečka příslušného znaku svítí pokud bit7=1) ADDLW 1 ;NE, VYP tečku IORWF LATB,F ;(0a0=0) nastavit Katody f,a,e,d,T CALL Segment ANDLW B'00011001' ;(1a1=1) pouze Katody pro PA (g,c,b) ;segment c přesunout z bitu3 na bit2 (0->bit3->bit2) BTFSC WREG,3 ;segment c=1? BSF WREG,2 ;ANO, bit2=1 BCF WREG,3 ;bit3=0 IORWF LATA,F ;(0a0=0) nastavit Katody g,c,b ;rozsvítit displej, zapnout Anodu podle DIS (0:A1, 1:A2, 2:A3) CALL Anoda IORWF LATA,F ;(0a0=0) A2 nebo A3 na PA ANDLW B'00100000' ;(1a1=1) IORWF LATB,F ;(0a0=0) nebo A1 na PB BANK0 ;další displej (příští Anoda) INCF DIS,F ;+1 MOVF DIS,W SUBLW 2 ;2-DIS BTFSS SC ;záporné? CLRF DIS ;ANO, nulovat ;-------------------------------- ;dělič pro opakování KLV DECFSZ KLVO,F ;-1=0? BRA $+2 BSF Znova ;=1 ;-------------------------------- ;dělič pro blikání displeje při nastavování INCF BLIK,F ;+1 ;-------------------------------- ; impulsní výstupy ; ;-------------------------------- ;porucha? BANK2 BTFSS VA3 ;1=ANO ;dělič 244/244=1Hz DECFSZ D244,F ;-1=0? RETFIE ;NE MOVLW 244 ;znovu BANK0 MOVWF D244 ; naplnit ;-------------------------------- ;cyklování VB4 CYVB4 BTFSS CVB4 ;zapnuto? BRA CYVA1 ;NE ;test TB = 0? MOVLW 0x05 ;načíst MOVWF EEADRp ; TB CALL ERead ; z EEPROM MOVWF FSR0L ;schovat TB BTFSC SZ ;TB=0? BRA VB4ZAP ;ANO CYKLA MOVF TA,F BTFSC SZ ;TA=0? BRA CYKLB ;ANO DECFSZ TA,F ;-1=0? BRA CYVA1 ;NE MOVF FSR0L,W ;obnovit TB MOVWF TB ; BANK2 BCF VB4 ;VYP BANK0 BRA CYVA1 CYKLB DECFSZ TB,F ;-1=0? BRA CYVA1 ;NE MOVLW 0x04 ;obnovit MOVWF EEADRp ; TA CALL ERead ; z EEPROM MOVWF TA ; VB4ZAP BANK2 BSF VB4 ;ZAP BANK0 ;-------------------------------- ;cyklování VA1 CYVA1 BTFSS CVA1 ;zapnuto? RETFIE ;NE ;test TD = 0? MOVLW 0x07 ;načíst MOVWF EEADRp ; TD CALL ERead ; z EEPROM MOVWF FSR0L ;schovat TD BTFSC SZ ;TD=0? BRA VA1ZAP ;ANO CYKLC MOVF TC,F BTFSC SZ ;TC=0? BRA CYKLD ;ANO DECFSZ TC,F ;-1=0? RETFIE ;NE MOVF FSR0L,W ;obnovit TD MOVWF TD ; BANK2 BCF VA1 ;VYP BANK0 RETFIE CYKLD DECFSZ TD,F ;-1=0? RETFIE ;NE MOVLW 0x06 ;obnovit MOVWF EEADRp ; TC CALL ERead ; z EEPROM MOVWF TC ; VA1ZAP BANK2 BSF VA1 ;ZAP BANK0 ;-------------------------------- ;konec přerušení RETFIE ;******************************** ;převede číslo znaku na sedmisegment Segment MOVF INDF0,W ;číslo znaku, FSR0 ukazuje na Znak(1,2,3) ANDLW B'01111111' ;odebrat bit 7 pro tečku, zde se nevyhodnocuje SUBLW 45 ;41-W (MAX číslo znaku) MOVF INDF0,W ;obnovit číslo znaku ANDLW B'01111111' ; BTFSS SC ;záporné? (odečet 41-W) MOVLW 36 ;ANO, nahradit znak BRW ;W+PC ;Segmenty(0=svítí)fa_gcedb RETLW B'00110000' ;0/0 RETLW B'11110110' ;1/1 RETLW B'10101000' ;2/2 RETLW B'10100100' ;3/3 RETLW B'01100110' ;4/4 RETLW B'00100101' ;5/5 RETLW B'00100001' ;6/6 RETLW B'10110110' ;7/7 RETLW B'00100000' ;8/8 RETLW B'00100100' ;9/9 RETLW B'00100010' ;10/A RETLW B'01100001' ;11/b RETLW B'00111001' ;12/C RETLW B'11100000' ;13/d RETLW B'00101001' ;14/E RETLW B'00101011' ;15/F RETLW B'00110001' ;16/G RETLW B'01100010' ;17/H RETLW B'11111011' ;18/i RETLW B'11110000' ;19/J RETLW B'01101011' ;20/k RETLW B'01111001' ;21/L RETLW B'00110010' ;22/M RETLW B'11100011' ;23/n RETLW B'11100001' ;24/o RETLW B'00101010' ;25/P RETLW B'11101011' ;26/r RETLW B'00100111' ;27/S RETLW B'01101001' ;28/t RETLW B'11110001' ;29/u RETLW B'01110000' ;30/V RETLW B'01100100' ;31/Y RETLW B'11111111' ;32/ (zhasnuto) RETLW B'11100110' ;33/-1 RETLW B'10111111' ;34/ (segment a) RETLW B'11101111' ;35/- RETLW B'11111101' ;36/_ RETLW B'11101101' ;37/= RETLW B'10101101' ;38/ (segment a,d,g) RETLW B'00101110' ;39/° RETLW B'11101001' ;40/c RETLW B'10110100' ;41/) RETLW B'01110010' ;42/II RETLW B'11111101' ;43/_ RETLW B'11111101' ;44/_ RETLW B'11111101' ;45/_ ;-------------------------------- ;vybere Anodu (1=svítí) Anoda BANK0 MOVF DIS,W BANK2 ANDLW B'00000011' BRW ;W+PC RETLW B'00100000' ;DIS=0, Znak1, A1, vlevo RETLW B'01000000' ;DIS=1, Znak2, A2, střed RETLW B'10000000' ;DIS=2, Znak3, A3, vpravo RETLW B'00100000' ;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW ;čekat 15000us C15000 MOVLW 0x13 MOVWF C2 MOVLW 0x5F BRA CEK ;čekat 4100us ;C4100 MOVLW 0x05 ; MOVWF C2 ; MOVLW 0x49 ; BRA CEK ;čekat 1640us ;C1640 MOVLW 0x02 ; MOVWF C2 ; MOVLW 0x1B ; BRA CEK ;čekat 480us C480 MOVLW 0xA5 BRA CEK0 ;čekat 405us C405 MOVLW 0x8A BRA CEK0 ;čekat 100us ;C100 MOVLW 0x1E ; BRA CEK0 ;čekat 60us C60 MOVLW 0x12 BRA CEK0 ;čekat 46us ;C46 MOVLW 0x0D ; BRA CEK0 ;čekat 40us C40 MOVLW 0x0B BRA CEK0 ;čekat 12us C12 MOVLW 0x01 CEK0 CLRWDT CLRF C2 CEK MOVWF C1 ;čekací smyčka, čas určuje hodnota v C1,2 (XTAL=4MHz) CEKEJ DECFSZ C1,F BRA CEKEJ MOVF C2,W BTFSC SZ RETURN CLRWDT DECF C2,F BRA CEKEJ ;================================ ;Podprogramy: resds, rdds, wrds, vypcrc ;jsou převzaté (upravené) z knihy: ;Komunikace mikrokontrolérů s okolím 1. 2. ;Jiří Hrbáček ;-------------------------------- ;RESET/PRESENCE 1-Wire ;po Resetu odpoví DS Presence pulzem (log.0) resds ;nastavit ERROR test MOVLW 5 ;počet pokusů MOVWF A1 ; BCF ERP ;nulovat ERROR senzor BCF INTCON,GIE ;RESET BANK2 BCF DS ;(LAT) BANK1 ;Banka 1 BCF DS ;=OUT, DS=0 (TRIS) BANK0 ;Banka 0 CALL C480 BANK1 ;Banka 1 BSF DS ;=IN, DS=1 (TRIS) BANK0 ;Banka 0 CALL C60 ;PRESENCE pulz BTFSC DS ;=0? PRESENCE? (PORT) BSF ERP ;NE, nastavit ERROR CALL C405 BSF INTCON,GIE ;ERROR test BTFSS ERP ;=0? v pořádku? RETURN ;ANO DECFSZ A1,F ;-1=0? BRA resds+3 ;NE, opakovat RESET RETURN ;ERROR RESET/PRESENCE (ERP=1) ;-------------------------------- ;READ 1-Wire rdds MOVLW 8 ;počet bitů MOVWF D2 ; BCF INTCON,GIE ;načte data z DS do T_RDS BANK2 BCF DS ;(LAT) rdds1 BANK1 ;Banka 1 BCF DS ;=OUT, DS=0 (TRIS) BRA $+1 ;čekat 5us BRA $+1 ; NOP ; BSF DS ;=IN, DS=1 (TRIS) BANK0 ;Banka 0 CALL C12 ;čekat 14us BRA $+1 ; ;datový bit do SC BCF SC ;Log.0 BTFSC DS ;=1? (PORT) BSF SC ;ANO, Log.1 RRF T_RDS,F ;SC->T_RDS CALL C40 DECFSZ D2,F ;-1=0? BRA rdds1 ;NE BSF INTCON,GIE MOVF T_RDS,W RETURN ;................................ ;načte 2 bity z DS do T_RDS,7,6 RDDS2 CLRF T_RDS MOVLW 2 BRA rdds+1 ;-------------------------------- ;WRITE 1-Wire wrds MOVWF T_RDS MOVLW 8 ;počet bitů MOVWF D2 ; BCF INTCON,GIE ;odeslat data z T_RDS do DS BANK2 BCF DS ;(LAT) BANK0 wrds1 RRF T_RDS,F ;->SC BANK1 ;Banka 1 BCF DS ;=OUT, DS=0 (TRIS) BANK0 ;Banka 0 BTFSS SC ;=1? ;poslat nulu CALL C60 ;NE BRA $+1 ;čekat 2us ;poslat jedničku BANK1 ;Banka 1 BSF DS ;=IN, DS=1 (TRIS) BANK0 ;Banka 0 BTFSC SC ;=0? CALL C60 ;NE CALL C12 DECFSZ D2,F ;-1=0? BRA wrds1 ;NE BSF INTCON,GIE RETURN ;................................ ;odeslat bit0 z T_RDS do DS WRDS1 MOVLW 1 BRA wrds+2 ;-------------------------------- ;výpočet CRC vypcrc MOVF T_RDS,W ;kopírovat MOVWF D1 ; MOVLW 8 ;počte bitů MOVWF D2 ; vypcr0 RRF D1,F ;->SC BTFSC SC ;=0? BRA vypcr3 ;NE BTFSC CRC,7 ;bit7=0? BRA vypcr4 ;NE vypcr1 BCF SC RLF CRC,F ;<-SC vypcr2 DECFSZ D2,F ;-1=0? BRA vypcr0 ;NE RETURN vypcr3 BTFSC CRC,7 ;bit7=0? BRA vypcr1 ;NE vypcr4 MOVLW B'00011000' XORWF CRC,F ;(st.=0) BSF SC RLF CRC,F ;<-SC BRA vypcr2 ;-------------------------------- ;počítadlo poruch, bit4=porucha PPER BSF ERS BTFSC PP,4 ;16 poruch (00010000) BRA $+3 ;ANO ;zvětšit počítadlo INCF PP,F ;PP +1 RETURN ;trvající poruchua BANK2 BSF VA3 ;zapnout výstup ERROR BANK0 GOTO OV ;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT TEPLOTA MOVF PMC,F ;pauza po CONVERT? BTFSS SZ ;nenulové? RETURN ;ANO, ještě čekat BTFSC ERS ;porucha senzoru? BRA CONV ;ANO ;-------------------------------- CALL resds ;RESET BTFSC ERP ;porucha? BRA PPER ;ANO MOVLW 0xCC ;SKIP ROM CALL wrds ; ;nová teplota do B1,2 MOVLW 0xBE ;READ SCRATCHPAD CALL wrds ; CLRF CRC ;načte Temperature LSB do B1 CALL rdds MOVWF B1 CALL vypcrc ;načte Temperature MSB do B2 CALL rdds MOVWF B2 CALL vypcrc ;načte zbytek Scratchpad, pro dokončení CRC MOVLW 7 ;posledních 7 bajtů MOVWF A1 ; CALL rdds CALL vypcrc DECFSZ A1,F ;-1=0? BRA $-3 ;NE ;-------------------------------- ;test CRC MOVF CRC,F ;CRC=0=souhlasí BTFSS SZ ;CRC=0? BRA PPER ;NE, počítadlo poruch ;-------------------------------- ;zkušební teplota (0xFC90 = -55.0°C) ; MOVLW 0x90 ; MOVWF B1 ; MOVLW 0xFC ; MOVWF B2 ;*******************************; ; Výpočet teploty [°C*10] ; ; vstup: B1,2 výstup: A1,2 ; ;-------------------------------; ; A1,2 = B1,2 * 10 / 16 ; ; (MSB=0=kladné, 1=záporné) ; ;*******************************; ; A1,2 = B1,2 * 10 ;A=(B*2)+(B*8) ;B=B*2 CALL Bx2 ;A=B MOVWF A1 MOVF B2,W MOVWF A2 ;B=B*4 CALL Bx2 CALL Bx2 ;A=B+A ADDWF A1,F ;B1+A1 BTFSC SC ;přenos? INCF A2,F ;ANO, A2+1 MOVF B2,W ADDWF A2,F ;B2+A2 ;-------------------------------- ; A1,2 = A1,2 / 16 SWAPF A1,W ;32107654 IORLW B'11110000' ;(0a0=0) ;1111.... MOVWF A1 SWAPF A2,W ;32107654 IORLW B'00001111' ;(0a0=0) ;....1111 ANDWF A1,F ;(1a1=1) SWAPF A2,W ;32107654 ANDLW B'00001111' ;(1a1=1) ;0000.... BTFSC A2,7 ;MSB=1? IORLW B'11110000' ;ANO,(0a0=0) ;1111.... MOVWF A2 ;-------------------------------- ; A1,2 = A1,2 / 2 ;pro DS18S20 ; RLF A2,W ;nastavit SC ; RRF A2,F ; RRF A1,F ;-------------------------------- ;filtr defaultní teploty 85°C (0x0352) XORLW 0x03 BTFSS SZ BRA UT ;pokračovat, jiná teplota MOVF A1,W XORLW 0x52 BTFSS SZ BRA UT ;pokračovat, jiná teplota ;test, minulá teplota > 83°C (ANO=použít defaultní teplotu) MOVF T1,W ;minulá teplota L MOVWF A1 ;uložit MOVF T2,W ;minulá teplota H MOVWF A2 ;uložit MOVLW 0x3E ;830 (83.0°C) MOVWF B1 ; do B1,2 MOVLW 0x03 ; MOVWF B2 ; CALL PAB ;porovnat A > B, SC=1 BTFSS SC ;minulá teplota > 83°C ? BRA CONV ;NE, znova CONVERT ;použít 85°C MOVLW 0x52 MOVWF A1 MOVLW 0x03 MOVWF A2 ;-------------------------------- ;uložit teplotu UT MOVF A1,W MOVWF T1 ;uložit teplotu L MOVF A2,W MOVWF T2 ;uložit teplotu H ;-------------------------------- ;vypnout poruchu BANK2 BCF VA3 BANK0 ;nulovat počítadlo poruch CLRF PP ;-------------------------------- ;Parazitně napájený senzor má při měření teploty (CONVERT) posílenou sběrnici (log.1). CONV CALL resds ;RESET BTFSC ERP ;porucha? BRA PPER ;ANO MOVLW 0xCC ;SKIP ROM CALL wrds ; ;READ POWER SUPPLY MOVLW 0xB4 CALL wrds BCF DS ;=0 BANK1 ;Banka 1 BCF DS ;=OUT (DS=0=čtecí časový úsek) NOP BSF DS ;=IN (=1) BANK0 ;Banka 0 BCF Bzn ;0=parazitní napájení BTFSC DS ;=0? BSF Bzn ;1=externí napájení CALL resds ;RESET BTFSC ERP ;porucha? BRA PPER ;ANO MOVLW 0xCC ;SKIP ROM CALL wrds ; ;CONVERT TEMPERATURE MOVLW 0x44 CALL wrds ;EXTERNI nebo PARAZITNI napájení? BTFSC Bzn ;0=PARAZITNI? BRA NPC ;NE, EXTERNI ;posílit sběrnici pro parazitně napájené senzory (DS=OUT=1) BANK2 BSF DS ;=1 (LAT) BANK1 BCF DS ;=OUT, DS=1 (TRIS) BANK0 ;-------------------------------- ;nastavit pauzu po CONVERT NPC MOVLW 24 ;1,5sek. 1,5*16 (odpočet v přerušení, 16Hz) MOVWF PMC ;pauza po CONVERT, četnost měření BCF ERS ;-------------------------------- GOTO OV ;ovládání výstupů ; RETURN ;-------------------------------; ; Matematicke podprogramy ; ;-------------------------------; ;slovak@post.cz )S(12.2004; ;-------------------------------; ; A1,2,3 / B1,2,3 = C1,2,3 ;24Bit, pouze kladna cisla ;SZ=1=deleni nulou (B1,2,3=0) ;B se nezmeni, v A bude zbytek ;pouziva D1,2,3; X1 LOMENO24 ;test B na nulu; sZ=1=ANO ; MOVF B1,F ; BTFSC STATUS,Z ;nenulove? ; MOVF B2,F ; BTFSC STATUS,Z ;nenulove? ; MOVF B3,F ; BTFSC STATUS,Z ;nenulove? ; RETURN ;B1,2,3=0 ;priprava pro deleni LOM24 MOVF A1,W ;A do D MOVWF D1 ; MOVF A2,W ; MOVWF D2 ; MOVF A3,W ; MOVWF D3 ; CLRF A1 ;nulovat CLRF A2 ; CLRF A3 ; MOVLW 24 ;pocet bitu MOVWF X1 ; BCF STATUS,C ;SC=0 ;deleni LDalsi CALL x2M ;D,A posun vlevo, A-B=C BTFSS STATUS,C ;kladny vysledek? BRA LZapor ;NE ;LKlad MOVWF A3 ;C do A MOVF C2,W ; MOVWF A2 ; MOVF C1,W ; MOVWF A1 ; LZapor DECFSZ X1,F ;-1=0? BRA LDalsi ;jeste neni konec ;vysledek RLF D1,W ;posledni x2 MOVWF C1 ; a W do C RLF D2,W ; MOVWF C2 ; RLF D3,W ; MOVWF C3 ; BCF STATUS,Z ;SZ=0 RETURN ;-------------------------------- ; A1,2,3 / B1,2,3 = C1,2,3 ;23Bit; MSB=0=kladne, 1=zaporne ;SZ=1=deleni nulou (B1,2,3=0) ;B se nezmeni, v A bude zbytek ;pouziva D1,2,3; X1; FL,Azn,Bzn ;LOMENO ;test B na nulu; SZ=1=ANO ; MOVF B1,F ; BTFSC STATUS,Z ;nenulove? ; MOVF B2,F ; BTFSC STATUS,Z ;nenulove? ; MOVF B3,F ; BTFSC STATUS,Z ;nenulove? ; RETURN ;B1,2,3=0 ;test A=zaporne ; BCF Azn ;=0 ; BTFSC A3,7 ;MSB=1? ; CALL ZZA ;zmena znamenka A1,2,3 ;test B=zaporne ; BCF Bzn ;=0 ; BTFSC B3,7 ;MSB=0? ; CALL ZZB ;zmena znamenka B1,2,3 ;vypocet ; CALL LOM24 ;vratit B ; BTFSC Bzn ;=0? ; CALL ZZB ;znamenko C, test Azn = Bzn ; BTFSC Azn ;=0? ; BRA $+4 ;NE ; BTFSC Bzn ;=0? ; BRA $+3 ;NE ; BRA $+3 ;Azn = Bzn = 0 ; BTFSS Bzn ;=1? ; CALL ZZC ;NE, zmena znamenka C1,2,3 ; ; BCF STATUS,Z ;SZ=0 ; RETURN ; ;................................ ; D1,2,3 A1,2,3 * 2 a Minus x2M RLF D1,F ;posuv vlevo RLF D2,F ; RLF D3,F ; RLF A1,F ; RLF A2,F ; RLF A3,F ; ;pokracuje MINUS ;-------------------------------- ; A1,2,3 - B1,2,3 = C1,2,3 ;SC=0=zaporny vysledek ;A,B se nezmeni MINUS MOVF B1,W SUBWF A1,W ;A1-B1 MOVWF C1 ;=C1 MOVF B2,W SUBWFB A2,W ;A2-B2-SC MOVWF C2 ;=C2 MOVF B3,W SUBWFB A3,W ;A3-B3-SC MOVWF C3 ;=C3 RETURN ;-------------------------------- ; A1,2,3 + C1,2,3 = C1,2,3 ;A se nemeni ;PLUS MOVF A1,W ; ADDWF C1,F ;A1+C1=C1 ; MOVF A2,W ; ADDWFC C2,F ;A2+C2=C2 ; MOVF A3,W ; ADDWFC C3,F ;A3+C3=C3 ; RETURN ; ;-------------------------------- ; A1,2,3 * B1,2,3 = C1,2,3 ;24Bit, pouze kladna cisla ;A, B se nezmeni ;pouziva D1,2,3; X1; X2 ;KRAT24 ;schovat A do D ; MOVF A1,W ;A do D ; MOVWF D1 ; ; MOVF A2,W ; ; MOVWF D2 ; ; MOVF A3,W ; ; MOVWF D3 ; ;priprava ; CLRF C1 ;nulovat ; CLRF C2 ; ; CLRF C3 ; ; BCF STATUS,C ; ; MOVLW 25 ;pocet bitu+1 ; MOVWF X1 ; ;hledat jednicku ; RRF B3,F ;posuv vpravo ; RRF B2,F ; ; RRF B1,F ; ; MOVF STATUS,W ;ulozit ; MOVWF X2 ; SC ; BTFSC STATUS,C ;=0? ;A+C=C ; CALL PLUS ;jen pri SC=1 ;A*2 ; RLF A1,F ;posuv vlevo ; RLF A2,F ; ; RLF A3,F ; ; ; MOVF X2,W ;obnovit ; MOVWF STATUS ; SC ; ; DECFSZ X1,F ;-1=0? ; BRA $-13 ;NE ;obnovit A z D ; MOVF D1,W ;D do A ; MOVWF A1 ; ; MOVF D2,W ; ; MOVWF A2 ; ; MOVF D3,W ; ; MOVWF A3 ; ; RETURN ; ;-------------------------------- ; A1,2,3 * B1,2,3 = C1,2,3 ;23Bit, MSB=0=kladne, 1=zaporne ;A, B se nezmeni ;pouziva D1,2,3; X1; X2 ;KRAT ;test A=zaporne ; BCF Azn ; BTFSC A3,7 ;=0? ; CALL ZZA ;zmena znamenka A ;test B=zaporne ; BCF Bzn ; BTFSC B3,7 ;=0? ; CALL ZZB ;zmena znamenka B ;vypocet ; CALL KRAT24 ;A*B=C ;znamenko A ; BTFSC Azn ;=0? ; CALL ZZA ;znamenko B ; BTFSC Bzn ;=0? ; CALL ZZB ;znamenko C, test Azn = Bzn ; BTFSC Azn ;=0? ; BRA $+4 ;NE ; BTFSC Bzn ;=0? ; BRA $+3 ;NE ; BRA $+3 ;Azn = Bzn = 0 ; BTFSS Bzn ;=1? ; CALL ZZC ;NE, zmena znamenka C1,2,3 ; ; BCF STATUS,Z ;SZ=0 ; RETURN ; ;-------------------------------- ;zmena znamenka A1,2,3 ;ZZA BSF Azn ;=1 ; COMF A1,F ; COMF A2,F ; COMF A3,F ; INCFSZ A1,F ;+1,=0? ; RETURN ; INCFSZ A2,F ;+1,=0? ; RETURN ; INCF A3,F ;+1 ; RETURN ; ;-------------------------------- ;zmena znamenka B1,2,3 ;ZZB BSF Bzn ;=1 ; COMF B1,F ; COMF B2,F ; COMF B3,F ; INCFSZ B1,F ;+1,=0? ; RETURN ; INCFSZ B2,F ;+1,=0? ; RETURN ; INCF B3,F ;+1 ; RETURN ; ;-------------------------------- ;zmena znamenka C1,2,3 ;ZZC COMF C1,F ; COMF C2,F ; COMF C3,F ; INCFSZ C1,F ;+1,=0? ; RETURN ; INCFSZ C2,F ;+1,=0? ; RETURN ; INCF C3,F ;+1 ; RETURN ; ;-------------------------------- ;test C=0; SZ=1=ANO ;TC0 MOVF C3,F ; BTFSC STATUS,Z ;nenulove? ; MOVF C2,F ; BTFSC STATUS,Z ;nenulove? ; MOVF C1,F ; RETURN ; ;-------------------------------- ;násobení konstantou 8192 ;pro posunutí desetiné čárky ; A1,2 * 8192 = A1,2,3 ;x8192 SWAPF A2,W ; ANDLW 0xF0 ; MOVWF A3 ; SWAPF A1,W ; ANDLW 0x0F ; IORWF A3,F ; SWAPF A1,W ; ANDLW 0xF0 ; MOVWF A2 ; CLRF A1 ; BCF STATUS,C ; RLF A2,F ; RLF A3,F ; RETURN ; ;-------------------------------- ; B1,2 = B1,2 * 2^W ;x2W MOVWF C1 ;kolikrát ; BCF SC ; RLF B1,F ;<-SC ; RLF B2,F ; ; DECFSZ C1,F ;-1=0? ; BRA $-4 ;znova ;A1,2 = A1,2 + B1,2 ; MOVF B1,W ; ADDWF A1,F ;B1+A1=A1 ; BTFSC SC ;nepřeteklo? ; INCF A2,F ;ANO, +1 ; MOVF B2,W ; ADDWF A2,F ;B2+A2=A2 ; RETURN ; ;-------------------------------- ; B1,2 = B1,2 * 2 Bx2 BCF SC RLF B1,F RLF B2,F MOVF B1,W RETURN ;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH ;převod HEX/DEC, vstup A1,2, výstup R1,2,3,4 HEXDEC ;upravit záporné číslo BCF Znam ;=0 BTFSS A2,7 ;=1? BRA PHD BSF Znam ;=1, záporné ;změna znaménka A1,2 COMF A2,F COMF A1,F INCFSZ A1,F ;+1=0? BRA PHD INCF A2,F ;+1 ;převod PHD CLRF A3 MOVLW 0xE8 ;1000 do B MOVWF B1 ; MOVLW 0x03 ; MOVWF B2 ; CLRF B3 ; CALL LOMENO24 ;A/B=C, zbytek je v A MOVF C1,W ;uložit řád 1000 MOVWF R4 ; HDPA1 MOVLW 0x64 ;100 do B MOVWF B1 ; CLRF B2 ; CALL LOMENO24 ;A/B=C, zbytek je v A MOVF C1,W ;uložit řád 100 MOVWF R3 ; MOVLW 0x0A ;10 do B MOVWF B1 ; CLRF B2 ; CALL LOMENO24 ;A/B=C, zbytek je v A MOVF C1,W ;uložit řád 10 MOVWF R2 ; MOVF A1,W ;uložit řád 1 MOVWF R1 ; RETURN ;-------------------------------- ;zobrazit teplotu ZTEPLO CALL HEXDEC ;zobrazit R1,2,3 ;formát zobrazení teploty (xx.x/xxx./-x.x/-xx.) BTFSC Znam ;záporná teplota? BRA ZTZ ;ANO ;kladná teplota MOVF R4,F BTFSS SZ ;R4=0? BRA ZTKC ;NE ;zobrazit teplotu, kladná s desetinou (00.0 až 99.9) ZTKD MOVF R3,W BTFSC SZ MOVLW sp ;nezobrazovat nulu MOVWF Znak1 ;desítky MOVF R2,W ADDLW . ;přidat tečku MOVWF Znak2 ;jedničky MOVF R1,W MOVWF Znak3 ;desetiny RETURN ;zobrazit teplotu, kladná bez desetiny (100. až 125.) ZTKC MOVF R4,W MOVWF Znak1 ;stovky MOVF R3,W MOVWF Znak2 ;desítky MOVF R2,W ADDLW . ;přidat tečku MOVWF Znak3 ;jedničky RETURN ;zobrazit teplotu, záporná ZTZ MOVLW zmi ;- MOVF R3,F ;test BTFSS SZ ;R3=0? BRA ZTKC+1 ;NE, (-10. až -55.) BRA ZTKD+3 ;(-0.1 až -9.9) ;-------------------------------- ;zobrazit čas ZCAS MOVWF A1 CLRF A2 CLRF A3 CLRF B3 CALL HDPA1 ;zobrazit R1,2,3 (potlačit nevýznamné nuly) MOVF R3,W BTFSC SZ ;R3=0? MOVLW sp ;ANO, " " MOVWF Znak1 ;stovky MOVF R2,W ADDWF R3,F BTFSC SZ ;R2+R3=0? MOVLW sp ;ANO, " " MOVWF Znak2 ;desítky MOVF R1,W MOVWF Znak3 ;jedničky RETURN ;================================ ;test něco stisknuto? TNS CLRWDT CALL TEPLOTA ;nejdřív měření teploty MOVF KLVP,W XORLW B'00000111' ;st.=0 BTFSS SZ ;nic? BRA TNS ;něco MOVLW 255 ;16,5 sekund (1=65ms) MOVWF DN ; pro mávrat na DIS1 RETURN ;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT KLV CALL TEPLOTA ;nejdřív měření teploty CLRWDT ;test KLV + opakovaní, SZ=0=něco stisknuto, 1=žádné tlačítko MOVF KLVP,W XORLW B'00000111' ;(st.=0) BTFSS SZ ;=1?, nenulové? (žádné tlačítko) BRA Neco ;něco stisknuto BCF Stisk ;=0 BSF Znova ;=1 RETURN Neco MOVLW 255 ;16,5 sekund (1=65ms) MOVWF DN ; pro mávrat na DIS1 BTFSS TlS ;stisknuto TlS? BRA $+2 ;ANO CLRF BLIK ;NE, nulovat BSF SZ ;=1 BTFSS Znova ;=1? odčasováno? RETURN ;NE, jako žádné tl. MOVLW 24 ;kratší čas (0,1s) BTFSS Stisk ;minule stisknuto? MOVLW 244 ;delší čas (1s) MOVWF KLVO ;nastavit časovač pro opakování BTFSC TlS ;stisknuto TlS? BRA $+2 CLRF KLVO ;ANO, MAX čas BCF Znova ;=0 BSF Stisk ;=1 BCF SZ ;=0 RETURN ;-------------------------------- ;mez mínus, A1,2 = A1,2 - 1 MEZM ;mez > +1000 MOVLW 0x03 MOVWF B2 MOVLW 0xE8 MOVWF B1 ;03E7=1000 CALL PAB ;A > B SC=1 BTFSC SC BRA MEZM10 ;ANO, na +10 ;mez > -100 MOVLW 0xFF MOVWF B2 MOVLW 0x9C MOVWF B1 ;FF9C=-100 CALL PAB ;A > B SC=1 BTFSC SC BRA MEZM1 ;ANO, na -1 ;mez > -550 MOVLW 0xFD MOVWF B2 MOVLW 0xDA MOVWF B1 ;FDDA=-550 CALL PAB ;A > B SC=1 BTFSC SC BRA MEZM10 ;ANO, na -10 ;vložit maximální mez 1250 MOVLW 0x04 MOVWF A2 MOVLW 0xE2 MOVWF A1 ;04E2=1250 RETURN ;mez-1 MEZM1 MOVLW 1 BRA MEZM10+1 ;mez-10 MEZM10 MOVLW 10 SUBWF A1,F ;A1-1 nebo -10 BTFSS SC ;záporné? DECF A2,F ;ANO, -1 RETURN ;-------------------------------- ;mez plus, A1,2 = A1,2 + 1 MEZP ;mez =< -110 MOVLW 0xFF MOVWF B2 MOVLW 0x92 MOVWF B1 ;FF92=-110 CALL PAB ;A =< B SC=0 BTFSS SC BRA MEZP10 ;ANO, na +10 ;mez =< 999 MOVLW 0x03 MOVWF B2 MOVLW 0xE7 MOVWF B1 ;03E7=999 CALL PAB ;A =< B SC=0 BTFSS SC BRA MEZP1 ;ANO, na +1 ;mez =< 1240 MOVLW 0x04 MOVWF B2 MOVLW 0xD8 MOVWF B1 ;04D8=1240 CALL PAB ;A =< B SC=0 BTFSS SC BRA MEZP10 ;ANO, na +10 ;vložit minimální mez -550 MOVLW 0xFD MOVWF A2 MOVLW 0xDA MOVWF A1 ;FDDA=-550 RETURN ;mez+1 MEZP1 MOVLW 1 BRA MEZP10+1 ;mez+10 MEZP10 MOVLW 10 ADDWF A1,F ;A1+1 nebo +10 BTFSC SC ;přenos? INCF A2,F ;ANO, +1 RETURN ;EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ;čtení EEPROM, adresu do EEADRp, vrátí data v W ERead CLRWDT BANK3 MOVF EEADRp,W ;Adresa MOVWF EEADRL ;do ukazatele BCF EECON1,CFGS ;Deselect Config space BCF EECON1,EEPGD ;Point to DATA memory BSF EECON1,RD ;EE Read MOVF EEDATL,W ;W = EEDATL BANK0 RETURN ;-------------------------------- ;zápis do EEPROM, adresu do EEADRp, data do W EWrite CLRWDT BANK3 MOVWF EEDATL ;Data Memory Value to write MOVF EEADRp,W ;Adresa MOVWF EEADRL ;Data Memory Address to write BCF EECON1,CFGS ;Deselect Configuration space BCF EECON1,EEPGD ;Point to DATA memory BSF EECON1,WREN ;Enable writes BCF INTCON,GIE ;Disable INTs. MOVLW 55h ; MOVWF EECON2 ;Write 55h MOVLW 0AAh ; MOVWF EECON2 ;Write AAh BSF EECON1,WR ;Set WR bit to begin write BSF INTCON,GIE ;Enable Interrupts BCF EECON1,WREN ;Disable writes BTFSC EECON1,WR ;Wait for write to complete BRA $-2 ;Done BANK0 RETURN ;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII Init ;základní nastavení procesoru BANK4 MOVLW B'11111111' ;Pull-up na RA5 MOVWF WPUA ; MOVLW B'00000111' ;Pull-up na RB0-RB2 MOVWF WPUB BANK3 MOVLW B'11100000' ;0=Digt.I/O, 1=Analog vstup MOVWF ANSELA ; MOVLW B'00000001' ; MOVWF ANSELB ; BANK2 MOVLW B'01000000' ;ref.napětí OFF MOVWF FVRCON ; MOVLW B'01011010' ;D/A OFF MOVWF DACCON0 ; MOVLW B'11110111' ;D/A OFF MOVWF DACCON1 ; BANK1 MOVLW B'01101111' ;4MHz MOVWF OSCCON ; vnitřní oscilátor MOVLW B'00100000' ;PORTA, 0=výstup, 1=vstup MOVWF TRISA ; MOVLW B'00001000' ;PORTB, 0=výstup, 1=vstup MOVWF TRISB ; MOVLW B'01000011' ;předdělič 1:16 pro TMR0 MOVWF OPTION_REG ; MOVLW B'10000110' ;A/D OFF MOVWF ADCON0 ; MOVLW B'10101000' ;vpravo, Fosc/32, Vref-:GND, Vref+:Vdd (A/A VYP) MOVWF ADCON1 ; BANK0 MOVLW B'00100000' ;přerušení od TMR0 MOVWF INTCON ; CLRF T1CON CLRF T2CON CLRF FSR0H ; CLRF FSR1H CLRF EEADRH CLRF EEDATH ;obnovení RAM z EEPROM 0x00-0x07 CLRF EEADRp ;počáteční adresa EEPROM MOVLW HM1 ;počáteční adresa RAM MOVWF FSR0L ;do ukazovátka CALL ERead ;čtení EEPROM MOVWF INDF0 ;zápis na adresu v ukazovátku INCF EEADRp,F ;adresa EEPROM+1 INCF FSR0L,F ;ukazovátko+1 MOVF FSR0L,W SUBLW TD ;poslední adresa RAM BTFSC SC ;záporné? BRA $-7 ;NE ;první nastavení CLRF DIS ;pořadí displej MOVLW B'00000111' MOVWF KLVP ;port klávesnice CLRF KLVD ;dělič čtení klávesnice ;zapnout ERROR senzor BANK2 BSF VA3 ;ZAP LED BANK0 BSF ERS CLRF PMC ;povolit přerušení BSF INTCON,GIE ;-------------------------------; ; MENU ; ;-------------------------------; ;nadpis [°C] teplota NTEPLO MOVLW zst ;° MOVWF Znak1 MOVLW zC ;C MOVWF Znak2 MOVLW sp ;" " MOVWF Znak3 CALL TNS ;test neco stisknuto? ;teplota TEPLO BANK2 BTFSS VA3 ;porucha? BRA $+9 ;NE BANK0 MOVLW zmi ;zE ;E MOVWF Znak1 MOVLW zmi ;zr ;r MOVWF Znak2 ; MOVLW zmi ;zr+. ;r. MOVWF Znak3 ; BRA $+7 BANK0 MOVF T1,W MOVWF A1 MOVF T2,W MOVWF A2 CALL ZTEPLO ;zobrazit teplotu ;tlačítka CALL KLV BTFSC SZ ;Z=0? neco stisknuto? BRA TEPLO ;NE BTFSS TlM ;stisknuto? GOTO NRUP ;ANO BTFSC TlP ;stisknuto? BRA NTEPLO ;NE ;-------------------------------- ;nadpis [H.M.] horní mez NHM MOVLW zH+. ;H. MOVWF Znak1 MOVLW zM+. ;M. MOVWF Znak2 MOVLW sp ;" " MOVWF Znak3 CALL TNS ;test neco stisknuto? ;zobrazit HM ZHM MOVF HM1,W MOVWF A1 MOVF HM2,W MOVWF A2 CALL ZTEPLO ;zobrazit teplotu ;návrat MOVF DN,F BTFSC SZ BRA TEPLO ;tlačítka CALL KLV BTFSC SZ ;Z=0? neco stisknuto? BRA $-5 ;NE BTFSS TlM ;stisknuto? BRA NTEPLO ;ANO BTFSS TlP ;stisknuto? BRA NDM ;ANO ;S MOVLW zH+. ;H. MOVWF Znak1 MOVLW zM+. ;M. MOVWF Znak2 MOVLW sp ;" " MOVWF Znak3 ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? BRA ZHM ;NE BTFSS Znova ;odcasovano? BRA $-4 ;NE BCF Znova ;nulovat ;blikat HM BHM BTFSS BLIK,6 BRA $+6 MOVLW sp ;VYP MOVWF Znak1 ; MOVWF Znak2 ; MOVWF Znak3 ; displej BRA $+6 MOVF HM1,W ;ZAP MOVWF A1 ; displej MOVF HM2,W ; MOVWF A2 ; CALL ZTEPLO ;zobrazit teplotu ;tlačítka CALL KLV BTFSC SZ ;Z=0? neco stisknuto? BRA BHM ;NE BTFSS TlS ;stisknuto? BRA UHM ;ANO BTFSS TlP ;stisknuto? BRA HMP ;ANO ;horní mez -1 HMM MOVF HM1,W MOVWF A1 MOVF HM2,W MOVWF A2 CALL MEZM ;mez-1 MOVF A1,W MOVWF HM1 MOVF A2,W MOVWF HM2 BRA BHM ;horní mez +1 HMP MOVF HM1,W MOVWF A1 MOVF HM2,W MOVWF A2 CALL MEZP ;mez+1 MOVF A1,W MOVWF HM1 MOVF A2,W MOVWF HM2 BRA BHM ;uložit do EEPROM UHM MOVLW 0x00 MOVWF EEADRp MOVF HM1,W CALL EWrite INCF EEADRp,F ;+1 MOVF HM2,W CALL EWrite BRA NHM ;-------------------------------- ;nadpis [d.M.] dolní mez NDM MOVLW zd+. ;d. MOVWF Znak1 MOVLW zM+. ;M. MOVWF Znak2 MOVLW sp ;" " MOVWF Znak3 CALL TNS ;test neco stisknuto? ;zobrazit DM ZDM MOVF DM1,W MOVWF A1 MOVF DM2,W MOVWF A2 CALL ZTEPLO ;zobrazit teplotu ;návrat MOVF DN,F BTFSC SZ BRA TEPLO ;tlačítka CALL KLV BTFSC SZ ;Z=0? neco stisknuto? BRA $-5 ;NE BTFSS TlM ;stisknuto? BRA NHM ;ANO BTFSS TlP ;stisknuto? BRA NTA ;ANO ;S MOVLW zd+. ;d. MOVWF Znak1 MOVLW zM+. ;M. MOVWF Znak2 MOVLW sp ;" " MOVWF Znak3 ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? BRA ZDM ;NE BTFSS Znova ;odcasovano? BRA $-4 ;NE BCF Znova ;nulovat ;blikat DM BDM BTFSS BLIK,6 BRA $+6 MOVLW sp ;VYP MOVWF Znak1 ; MOVWF Znak2 ; MOVWF Znak3 ; displej BRA $+6 MOVF DM1,W ;ZAP MOVWF A1 ; displej MOVF DM2,W ; MOVWF A2 ; CALL ZTEPLO ;zobrazit teplotu ;tlačítka CALL KLV BTFSC SZ ;Z=0? neco stisknuto? BRA BDM ;NE BTFSS TlS ;stisknuto? BRA UDM ;ANO BTFSS TlP ;stisknuto? BRA DMP ;ANO ;dolní mez -1 DMM MOVF DM1,W MOVWF A1 MOVF DM2,W MOVWF A2 CALL MEZM ;mez-1 MOVF A1,W MOVWF DM1 MOVF A2,W MOVWF DM2 BRA BDM ;dolní mez +1 DMP MOVF DM1,W MOVWF A1 MOVF DM2,W MOVWF A2 CALL MEZP MOVF A1,W MOVWF DM1 MOVF A2,W MOVWF DM2 BRA BDM ;uložit do EEPROM UDM MOVLW 0x02 MOVWF EEADRp MOVF DM1,W CALL EWrite INCF EEADRp,F ;+1 MOVF DM2,W CALL EWrite BRA NDM ;-------------------------------- ;nadpis [t.A] čas pro VA1 ZAP NTA MOVLW zhm ;zt+. ;t. MOVWF Znak1 MOVLW zA ;A MOVWF Znak2 MOVLW zhm ;sp ;" " MOVWF Znak3 CALL TNS ;test neco stisknuto? MOVLW 0x04 ;načte MOVWF EEADRp ; TA CALL ERead ; z EEPROM MOVWF ZABCD ; ;zobrazit TA ZTA MOVF ZABCD,W CALL ZCAS ;zobrazit čas ;návrat MOVF DN,F BTFSC SZ BRA TEPLO ;tlačítka CALL KLV BTFSC SZ ;neco stisknuto? BRA $-5 ;nic BTFSS TlM ;stisknuto? BRA NDM ;ANO BTFSS TlP ;stisknuto? BRA NTB ;ANO ;S MOVLW zhm ;zt+. ;t. MOVWF Znak1 MOVLW zA ;A MOVWF Znak2 MOVLW zhm ;sp ;" " MOVWF Znak3 ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? BRA ZTA ;NE BTFSS Znova ;odcasovano? BRA $-4 ;NE BCF Znova ;nulovat BCF CVA1 ;VYP cyklocání VA1 ;blikat TA BTA BTFSS BLIK,6 BRA $+6 MOVLW sp ;VYP MOVWF Znak1 ; MOVWF Znak2 ; MOVWF Znak3 ; displej BRA $+3 MOVF ZABCD,W ;ZAP CALL ZCAS ; displej ;tlačítka CALL KLV BTFSC SZ ;Z=0? neco stisknuto? BRA BTA ;NE BTFSS TlS ;stisknuto? BRA UTA ;ANO BTFSS TlP ;stisknuto? BRA TAP ;ANO ;TA -1 TAM DECFSZ ZABCD,F ;-1=0? BRA BTA ;NE DECF ZABCD,F ;-1 BRA BTA ;TA +1 TAP INCFSZ ZABCD,F ;+1=0? BRA BTA ;NE INCF ZABCD,F ;+1 BRA BTA ;uložit do EEPROM UTA MOVLW 0x04 MOVWF EEADRp MOVF ZABCD,W MOVWF TA CALL EWrite BRA NTA ;-------------------------------- ;nadpis [t.b] čas pro VA1 VYP NTB MOVLW z_ ;zt+. ;t. MOVWF Znak1 MOVLW zb ;b MOVWF Znak2 MOVLW z_ ;sp ;" " MOVWF Znak3 CALL TNS ;test neco stisknuto? MOVLW 0x05 ;načte MOVWF EEADRp ; TB CALL ERead ; z EEPROM MOVWF ZABCD ; ;zobrazit TB ZTB MOVF ZABCD,W CALL ZCAS ;zobrazit čas ;návrat MOVF DN,F BTFSC SZ GOTO TEPLO ;tlačítka CALL KLV BTFSC SZ ;neco stisknuto? BRA $-5 ;nic BTFSS TlM ;stisknuto? BRA NTA ;ANO BTFSS TlP ;stisknuto? BRA NTC ;ANO ;S MOVLW z_ ;zt+. ;t. MOVWF Znak1 MOVLW zb ;b MOVWF Znak2 MOVLW z_ ;sp ;" " MOVWF Znak3 ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? BRA ZTB ;NE BTFSS Znova ;odcasovano? BRA $-4 ;NE BCF Znova ;nulovat BCF CVA1 ;VYP cyklocání VA1 ;blikat TB BTB BTFSS BLIK,6 BRA $+6 MOVLW sp ;VYP MOVWF Znak1 ; MOVWF Znak2 ; MOVWF Znak3 ; displej BRA $+3 MOVF ZABCD,W ;ZAP CALL ZCAS ; displej ;tlačítka CALL KLV BTFSC SZ ;Z=0? neco stisknuto? BRA BTB ;NE BTFSS TlS ;stisknuto? BRA UTB ;ANO BTFSS TlP ;stisknuto? BRA TBP ;ANO ;TB -1 TBM DECF ZABCD,F ;-1 BRA BTB ;NE ;TB +1 TBP INCF ZABCD,F ;+1 BRA BTB ;uložit do EEPROM UTB MOVLW 0x05 MOVWF EEADRp MOVF ZABCD,W MOVWF TB CALL EWrite BRA NTB ;-------------------------------- ;nadpis [t.C] čas pro VB4 ZAP NTC MOVLW zhm ;zt+. ;t. MOVWF Znak1 MOVLW zC ;C MOVWF Znak2 MOVLW zhm ;sp ;" " MOVWF Znak3 CALL TNS ;test neco stisknuto? MOVLW 0x06 ;načte MOVWF EEADRp ; TC CALL ERead ; z EEPROM MOVWF ZABCD ; ;zobrazit TC ZTC MOVF ZABCD,W CALL ZCAS ;zobrazit čas ;návrat MOVF DN,F BTFSC SZ GOTO TEPLO ;tlačítka CALL KLV BTFSC SZ ;neco stisknuto? BRA $-5 ;nic BTFSS TlM ;stisknuto? BRA NTB ;ANO BTFSS TlP ;stisknuto? BRA NTD ;ANO ;S MOVLW zhm ;zt+. ;t. MOVWF Znak1 MOVLW zC ;C MOVWF Znak2 MOVLW zhm ;sp ;" " MOVWF Znak3 ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? BRA ZTC ;NE BTFSS Znova ;odcasovano? BRA $-4 ;NE BCF Znova ;nulovat BCF CVB4 ;VYP cyklocání VB4 ;blikat TC BTC BTFSS BLIK,6 BRA $+6 MOVLW sp ;VYP MOVWF Znak1 ; MOVWF Znak2 ; MOVWF Znak3 ; displej BRA $+3 MOVF ZABCD,W ;ZAP CALL ZCAS ; displej ;tlačítka CALL KLV BTFSC SZ ;Z=0? neco stisknuto? BRA BTC ;NE BTFSS TlS ;stisknuto? BRA UTC ;ANO BTFSS TlP ;stisknuto? BRA TCP ;ANO ;TC -1 TCM DECFSZ ZABCD,F ;-1=0? BRA BTC ;NE DECF ZABCD,F ;-1 BRA BTC ;TC +1 TCP INCFSZ ZABCD,F ;+1=0? BRA BTC ;NE INCF ZABCD,F ;+1 BRA BTC ;uložit do EEPROM UTC MOVLW 0x06 MOVWF EEADRp MOVF ZABCD,W MOVWF TC CALL EWrite BRA NTC ;-------------------------------- ;nadpis [t.d] čas pro VB4 VYP NTD MOVLW z_ ;zt+. ;t. MOVWF Znak1 MOVLW zd ;d MOVWF Znak2 MOVLW z_ ;sp ;" " MOVWF Znak3 CALL TNS ;test neco stisknuto? MOVLW 0x07 ;načte MOVWF EEADRp ; TD CALL ERead ; z EEPROM MOVWF ZABCD ; ;zobrazit TD ZTD MOVF ZABCD,W CALL ZCAS ;zobrazit čas ;návrat MOVF DN,F BTFSC SZ GOTO TEPLO ;tlačítka CALL KLV BTFSC SZ ;neco stisknuto? BRA $-5 ;nic BTFSS TlM ;stisknuto? BRA NTC ;ANO BTFSS TlP ;stisknuto? BRA NRUP ;ANO ;S MOVLW z_ ;zt+. ;t. MOVWF Znak1 MOVLW zd ;d MOVWF Znak2 MOVLW z_ ;sp ;" " MOVWF Znak3 ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? BRA ZTD ;NE BTFSS Znova ;odcasovano? BRA $-4 ;NE BCF Znova ;nulovat BCF CVB4 ;VYP cyklocání VB4 ;blikat TD BTD BTFSS BLIK,6 BRA $+6 MOVLW sp ;VYP MOVWF Znak1 ; MOVWF Znak2 ; MOVWF Znak3 ; displej BRA $+3 MOVF ZABCD,W ;ZAP CALL ZCAS ; displej ;tlačítka CALL KLV BTFSC SZ ;Z=0? neco stisknuto? BRA BTD ;NE BTFSS TlS ;stisknuto? BRA UTD ;ANO BTFSS TlP ;stisknuto? BRA TDP ;ANO ;TD -1 TDM DECF ZABCD,F ;-1 BRA BTD ;NE ;TD +1 TDP INCF ZABCD,F ;+1 BRA BTD ;uložit do EEPROM UTD MOVLW 0x07 MOVWF EEADRp MOVF ZABCD,W MOVWF TD CALL EWrite BRA NTD ;-------------------------------- ;nadpis [ru.P.] ruční provoz NRUP MOVLW zr ;r MOVWF Znak1 MOVLW zu+. ;u. MOVWF Znak2 MOVLW zP+. ;P. MOVWF Znak3 CALL TNS ;test neco stisknuto? MOVLW zr+. ;r. MOVWF Znak1 ;zobrazit, stavy výstupů ZRUP MOVLW 1 BANK2 BTFSS VB4 CLRW BANK0 MOVWF Znak2 MOVLW 1 BANK2 BTFSS VA1 CLRW BANK0 MOVWF Znak3 ;návrat MOVF DN,F BTFSC SZ GOTO TEPLO ;tlačítka CALL KLV BTFSC SZ ;neco stisknuto? BRA ZRUP ;nic BTFSS TlM ;stisknuto? BRA NTD ;ANO BTFSS TlP ;stisknuto? GOTO NTEPLO ;ANO ;stisknuto S MOVLW zr ;r MOVWF Znak1 MOVLW zu+. ;u. MOVWF Znak2 MOVLW zP+. ;P. MOVWF Znak3 ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? BRA ZRUP ;NE BTFSS Znova ;odčasováno? BRA $-4 ;NE BCF Znova MOVLW zr+. ;r. MOVWF Znak1 BCF CVA1 ;zastavit cyklování BCF CVB4 ; ;blikat, stavy výstupů BRUP BANK0 BTFSS BLIK,6 BRA $+5 MOVLW sp ;VYP MOVWF Znak2 ; displej MOVWF Znak3 ; BRA $+13 MOVLW 1 ;ZAP BANK2 BTFSS VB4 ; displej CLRW BANK0 MOVWF Znak2 MOVLW 1 BANK2 BTFSS VA1 CLRW BANK0 MOVWF Znak3 ;tlačítka CALL KLV+1 ;bez měření teploty BTFSC SZ ;Z=0? neco stisknuto BRA BRUP ;nic BTFSS TlS ;stisknuto? BRA NRUP ;ANO BTFSS TlP ;stisknuto? BRA VA1ZV ;ANO ;VB4 ZAP/VYP VB4ZV BANK2 BTFSS VB4 BRA $+3 BCF VB4 ;0 VYP BRA BRUP BSF VB4 ;1 ZAP BRA BRUP ;VA1 ZAP/VYP VA1ZV BANK2 BTFSS VA1 BRA $+3 BCF VA1 ;0 VYP BRA BRUP BSF VA1 ;1 ZAP BRA BRUP ;================================ ;teplota T do A T_A MOVF T1,W MOVWF A1 MOVF T2,W WA2 MOVWF A2 RETURN ;-------------------------------- ;teplota T do B T_B MOVF T1,W MOVWF B1 MOVF T2,W WB2 MOVWF B2 RETURN ;-------------------------------- ;horní mez do A H_A MOVF HM1,W MOVWF A1 MOVF HM2,W BRA WA2 ;-------------------------------- ;dolní mez do B D_B MOVF DM1,W MOVWF B1 MOVF DM2,W BRA WB2 ;-------------------------------- ;Porovnat hodnoty A,B ;A <= B SC=0 ;výsledek ovlivní STATUS,C ;B => A SC=0 ; ;A > B SC=1 ; ;B < A SC=1 ; PAB ;porovnat znaménka MOVF A2,W XORWF B2,W ;(stejné=0) ANDLW B'10000000' ;(1a1=1) RLF B2,W ;vlevo(SC=MSB) BTFSS SZ ;stejné znaménka? (SZ=1) RETURN ;NE ;A-B ;ANO CLRF A3 CLRF B3 CALL MINUS ;A-B=C; SC=0=záporný výsledek ;test C=0; SZ=1=ANO MOVF C3,F BTFSC SZ ;nenulove? MOVF C2,F BTFSC SZ ;nenulove? MOVF C1,F BTFSC SZ ;nenulové? BCF SC ;SC=0 (A=B) jako záporné RETURN ;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO; OV; ovládání výstupů ; ;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO; ;test, porucha BANK2 BTFSS VA3 ;=1?, porucha? BRA IMPVA1 ;NE ;zastavit cyklování BCF CVA1 BCF CVB4 ;výstupy při poruše BCF VA1 ;VYP BCF VB4 ;VYP BANK0 RETURN ;-------------------------------- IMPVA1 BANK0 ;výstup VA1 ;................................ ;VA1 = imp. když teplota <= dolní mez CALL T_A ;teplota do A CALL D_B ;dolní mez do B CALL PAB ;porovnat A <= B ; SC=0=ANO, 1=NE BTFSC SC ;ANO? BRA VYPVA1 ;NE ;VA1 BTFSC CVA1 ;ZAP? BRA IMPVB4 ;ANO, časování už běží v přerušení (impulsní výstupy) ;START časování VA1 MOVLW 5 ;zkrátit MOVWF D244 ; dělič MOVLW 1 ;připravit CLRF TA ; časovače tak, MOVWF TB ; aby imp. začal Log.1 BSF CVA1 ;start BRA IMPVB4 ;................................ ;VA1 = 0 když teplota > dolní meze VYPVA1 BANK2 BCF VA1 ;VYP BANK0 BCF CVA1 ;zastavit cyklování ;-------------------------------- IMPVB4 ;výstup VB4 ;................................ ;VB4 = imp. když teplota >= horní mez CALL T_B ;teplota do B CALL H_A ;horní mez do A CALL PAB ;porovnat A <= B ; SC=0=ANO, 1=NE BTFSC SC ;ANO? BRA VYPVB4 ;NE ;VB4 BTFSC CVB4 ;ZAP? RETURN ;ANO, časování už běží V přerušení (impulsní výstupy) ;START časování VB4 MOVLW 5 ;zkrátit MOVWF D244 ; dělič MOVLW 1 ;připravit CLRF TC ; časovače tak, MOVWF TD ; aby imp. začal Log.1 BSF CVB4 ;start RETURN ;................................ ;VB4 = 0 když teploty < horní meze VYPVB4 BANK2 BCF VB4 ;VYP BANK0 BCF CVB4 ;zastavit cyklování RETURN ;-------------------------------- END