;-------------------------------; ; DS Termostat ; ; pro J ; ;-------------------------------; ; jden 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 topení: ;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 chlazení: ;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 PIC16F88 ;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=16F88, R=DEC, MM=ON ;Direktivy překladače include ;Definice názvů registrů ;Nastavení konfigurace procesoru: __CONFIG _CONFIG1,_CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _MCLR_OFF & _PWRTE_OFF & _WDT_ON & _INTRC_IO __CONFIG _CONFIG2,_IESO_OFF & _FCMEN_OFF errorlevel 1, -306 cblock 0x20 MemSTATUS MemPCLATH MemFSR PAS ;stínový PORTA 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 PPC ;pauza po CONVERT D244 ;dělič 244/244=1Hz DN ;dělič návrat na zobrazení teploty endc EEADRp EQU 0x7E ;pomocná EE adresa MemW EQU 0x7F #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 OZS FL,2 ;1=opakovat zpozdění pro TlS #define ERP F1,7 ;1=ERROR po RESET/PRESENCE #define ER F1,6 ;1=ERROR (dlouhotrvající porucha) #define ERS F1,5 ;1=ERROR senzor (každá porucha) #define CVA1 F1,4 ;1=cykluje VA1 #define CVB4 F1,3 ;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 PORTB,4 ;výstup B4 #define VA1 PAS,1 ;výstup A1 #define VA3 PAS,3 ;výstup A3 (porucha čidla) ;číslo znaku #define . 128 ;tečka (příklad zobrazení A s tečkou: MOVLW zA+.) #define zA 10 ;znak A #define zb 11 #define zC 12 #define zd 13 #define zE 14 #define zF 15 #define zH 16 #define zi 17 #define zJ 18 #define zk 19 #define zL 20 #define zM 21 #define zn 22 #define zo 23 #define zP 24 #define zr 25 #define zS 26 ;(segment a,c,f,g) #define zt 27 #define zu 28 #define zV 29 #define zY 30 #define zm1 31 ;-1 (segment b,c,g) #define sp 32 ;space #define zhm 33 ;(segment a) #define zmi 34 ;- #define z_ 35 ;znak podtržítko (segment d) #define zro 36 ;= (segment d,g) #define z3m 37 ;3x - (segment a,d,g) #define zst 38 ;° #define zc 39 #define zpz 40 ;) #define zII 41 ;(segment b,c,e,f) ;RAM banka 0 (00-7F) RAM0 macro BCF STATUS,RP0 endm ;RAM banka 1 (80-FF) RAM1 macro BSF STATUS,RP0 endm ;************************************************* ORG 0x2100 ;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 ;------------------------------- ;přerušení MOVWF MemW SWAPF STATUS,W CLRF STATUS MOVWF MemSTATUS MOVF PCLATH,W MOVWF MemPCLATH MOVF FSR,W MOVWF MemFSR ;-------------------------------- ;od TMR0 (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 FSR ;do ukazovátka ;Zhasnout displej BCF PORTB,5 ;VYP A1 MOVLW B'00101010' ANDWF PAS,F ;VYP A2,3; nulovat Katody g,c,b MOVF PAS,W MOVWF PORTA MOVLW B'00011000' ANDWF PORTB,F ;nulovat Katody f,a,e,d,T ;................................ ;dělič pro klávesnici 244/16=15Hz DECFSZ KLVD,F ;-1=0? GOTO EKLV MOVLW 16 ;znovu MOVWF KLVD ; naplnit ;čtení tlačítek MOVLW B'00000111' ; RAM1 ;Bank1 IORWF TRISB ;1=vstup RAM0 ;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 RAM1 ;Bank1 MOVLW B'11111000' ; ANDWF TRISB,F ;1=vstup, 0=výstup RAM0 ;Bank0 ;................................ ;počítadlo, pauza po CONVERT MOVF PPC,F BTFSS SZ ;PPC=0?, SZ=1? DECF PPC,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 ukazovátka FSR (0=Znak1, 1=Znak2, 2=Znak3) CALL Segment ANDLW B'11000110' ;(1a1=1) pouze Katody pro PB BTFSS INDF,7 ;znak s tečkou? (tečka příslušného znaku svítí pokud bit7=1) ADDLW 1 ;NE, VYP tečku IORWF PORTB,F ;(0a0=0) nastavit Katody f,a,e,d,T CALL Segment ANDLW B'00011001' ;(1a1=1) pouze Katody pro PA MOVWF FSR ;FSR se využívá jako běžný registr pro operaci 0->bit3->bit2 BTFSC FSR,3 ;segment c=1? BSF FSR,2 ;ANO, ZAP bit2 BCF FSR,3 ;VYP bit3 MOVF FSR,W IORWF PAS,F ;(0a0=0) nastavit Katody g,c,b ;rozsvítit displej, zapnout Anodu podle DIS (0:A1, 1:A2, 2:A3) CALL Anoda ANDLW B'11000000' ;(1a1=1) IORWF PAS,F ;(0a0=0) A2 nebo A3 MOVF PAS,W MOVWF PORTA CALL Anoda ANDLW B'00100000' ;(1a1=1) IORWF PORTB,F ;(0a0=0) nebo A1 ;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 DECF KLVO,F ;-1 BTFSS SZ ;KLVO=0? GOTO $+4 ;NE BTFSS OZS ;=1? BSF Znova ;NE, Znova=1 BCF OZS ;-------------------------------- ;dělič pro blikání displeje při nastavování INCF BLIK,F ;+1 ;-------------------------------- ; impulsní výstupy ; ;-------------------------------- ;porucha? BTFSS ER ;1=ANO ;dělič 244/244=1Hz DECFSZ D244,F ;-1=0? GOTO ENDINT ;NE MOVLW 244 ;znovu MOVWF D244 ; naplnit ;-------------------------------- ;cyklování VB4 CYVB4 BTFSS CVB4 ;zapnuto? GOTO CYVA1 ;NE ;test TB = 0? MOVLW 0x05 ;načíst MOVWF EEADRp ; TB CALL ERead ; z EEPROM MOVWF FSR ;schovat TB BTFSC SZ ;TB=0? GOTO VB4ZAP ;ANO CYKLA MOVF TA,F BTFSC SZ ;TA=0? GOTO CYKLB ;ANO DECFSZ TA,F ;-1=0? GOTO CYVA1 ;NE MOVF FSR,W ;obnovit TB MOVWF TB ; BCF VB4 ;VYP GOTO CYVA1 CYKLB DECFSZ TB,F ;-1=0? GOTO CYVA1 ;NE MOVLW 0x04 ;obnovit MOVWF EEADRp ; TA CALL ERead ; z EEPROM MOVWF TA ; VB4ZAP BSF VB4 ;ZAP ;-------------------------------- ;cyklování VA1 CYVA1 BTFSS CVA1 ;zapnuto? GOTO ENDINT ;NE ;test TD = 0? MOVLW 0x07 ;načíst MOVWF EEADRp ; TD CALL ERead ; z EEPROM MOVWF FSR ;schovat TD BTFSC SZ ;TD=0? GOTO VA1ZAP ;ANO CYKLC MOVF TC,F BTFSC SZ ;TC=0? GOTO CYKLD ;ANO DECFSZ TC,F ;-1=0? GOTO ENDINT ;NE MOVF FSR,W ;obnovit TD MOVWF TD ; BCF VA1 ;VYP GOTO ENDINT CYKLD DECFSZ TD,F ;-1=0? GOTO ENDINT ;NE MOVLW 0x06 ;obnovit MOVWF EEADRp ; TC CALL ERead ; z EEPROM MOVWF TC ; VA1ZAP BSF VA1 ;ZAP ;-------------------------------- ;konec přerušení ENDINT MOVF MemFSR,W MOVWF FSR MOVF MemPCLATH,W MOVWF PCLATH SWAPF MemSTATUS,W MOVWF STATUS SWAPF MemW,F SWAPF MemW,W RETFIE ;******************************** ;převede číslo znaku na sedmisegment Segment MOVF INDF,W ;číslo znaku, FSR ukazuje na Znak(1,2,3) ANDLW B'01111111' ;odebrat bit 7 pro tečku, zde se nevyhodnocuje SUBLW 44 ;41-W (MAX číslo znaku) MOVF INDF,W ;obnovit číslo znaku ANDLW B'01111111' ; BTFSS SC ;záporné? (odečet 41-W) MOVLW 42 ;ANO, nahradit znak ADDWF PCL,F ;W+PC ;Segmenty fa gcedb ;(0=svítí) 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'01100010' ;16/H RETLW B'11111011' ;17/i RETLW B'11110000' ;18/J RETLW B'01101011' ;19/k RETLW B'01111001' ;20/L RETLW B'00110010' ;21/M RETLW B'11100011' ;22/n RETLW B'11100001' ;23/o RETLW B'00101010' ;24/P RETLW B'11101011' ;25/r RETLW B'00100111' ;26/S RETLW B'01101001' ;27/t RETLW B'11110001' ;28/u RETLW B'01110000' ;29/V RETLW B'01100100' ;30/Y RETLW B'11100110' ;31/-1 RETLW B'11111111' ;32/ (zhasnuto) RETLW B'10111111' ;33/ (segment a) RETLW B'11101111' ;34/- RETLW B'11111101' ;35/_ RETLW B'11101101' ;36/= RETLW B'10101101' ;37/ (segment a,d,g) RETLW B'00101110' ;38/° RETLW B'11101001' ;39/c RETLW B'10110100' ;40/) RETLW B'01110010' ;41/II RETLW B'11111101' ;42/_ RETLW B'11111101' ;43/_ RETLW B'11111101' ;44/_ ;-------------------------------- ;vybere Anodu (1=svítí) Anoda MOVF DIS,W ANDLW B'00000011' ADDWF PCL,F ;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 GOTO CEK ;čekat 4100us ;C4100 MOVLW 0x05 ; MOVWF C2 ; MOVLW 0x49 ; GOTO CEK ;čekat 1640us ;C1640 MOVLW 0x02 ; MOVWF C2 ; MOVLW 0x1B ; GOTO CEK ;čekat 480us C480 MOVLW 0xA5 GOTO CEK0 ;čekat 405us C405 MOVLW 0x8A GOTO CEK0 ;čekat 100us ;C100 MOVLW 0x1E ; GOTO CEK0 ;čekat 60us C60 MOVLW 0x12 GOTO CEK0 ;čekat 46us ;C46 MOVLW 0x0D ; GOTO CEK0 ;čekat 40us C40 MOVLW 0x0B GOTO 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 GOTO CEKEJ MOVF C2,W BTFSC SZ RETURN CLRWDT DECF C2,F GOTO CEKEJ ;-------------------------------- ;volná synchronizace s přerušením VSP MOVF TMR0,W ANDLW B'11000000' BTFSS SZ GOTO $-3 RETURN ;================================ ;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 CALL VSP ;synchronizace ;RESET BCF DS RAM1 ;Banka 1 BCF DS ;=OUT, DS=0 RAM0 ;Banka 0 CALL C480 RAM1 ;Banka 1 BSF DS ;=IN, DS=1 RAM0 ;Banka 0 CALL C60 ;PRESENCE pulz BTFSC DS ;=0? PRESENCE? BSF ERP ;NE, nastavit ERROR CALL C405 ;ERROR test BTFSS ERP ;=0? v pořádku? RETURN ;ANO DECFSZ A1,F ;-1=0? GOTO resds+3 ;NE, opakovat RESET RETURN ;ERROR RESET/PRESENCE (ERP=1) ;-------------------------------- ;READ 1-Wire rdds MOVLW 8 ;počet bitů MOVWF D2 ; CALL VSP ;synchronizace ;načte data z DS do T_RDS BCF DS rdds1 RAM1 ;Banka 1 BCF DS ;=OUT, DS=0 GOTO $+1 ;čekat 5us GOTO $+1 ; NOP ; BSF DS ;=IN RAM0 ;Banka 0 CALL C12 ;čekat 14us GOTO $+1 ; ;datový bit do SC BCF SC ;Log.0 BTFSC DS ;=1? BSF SC ;ANO, Log.1 RRF T_RDS,F ;SC->T_RDS CALL C40 DECFSZ D2,F ;-1=0? GOTO rdds1 ;NE MOVF T_RDS,W RETURN ;................................ ;načte 2 bity z DS do T_RDS,7,6 RDDS2 CLRF T_RDS MOVLW 2 GOTO rdds+1 ;-------------------------------- ;WRITE 1-Wire wrds MOVWF T_RDS MOVLW 8 ;počet bitů MOVWF D2 ; CALL VSP ;synchronizace ;odeslat data z T_RDS do DS BCF DS wrds1 RRF T_RDS,F ;->SC RAM1 ;Banka 1 BCF DS ;=OUT, DS=0 RAM0 ;Banka 0 BTFSS SC ;=1? ;poslat nulu CALL C60 ;NE CALL C12 GOTO $+1 ;čekat 2us ;poslat jedničku RAM1 ;Banka 1 BSF DS ;=IN, DS=1 RAM0 ;Banka 0 BTFSC SC ;=0? CALL C60 ;NE DECFSZ D2,F ;-1=0? GOTO wrds1 ;NE RETURN ;................................ ;odeslat bit0 z T_RDS do DS WRDS1 MOVLW 1 GOTO 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? GOTO vypcr3 ;NE BTFSC CRC,7 ;bit7=0? GOTO vypcr4 ;NE vypcr1 BCF SC RLF CRC,F ;<-SC vypcr2 DECFSZ D2,F ;-1=0? GOTO vypcr0 ;NE RETURN vypcr3 BTFSC CRC,7 ;bit7=0? GOTO vypcr1 ;NE vypcr4 MOVLW B'00011000' XORWF CRC,F ;(st.=0) BSF SC RLF CRC,F ;<-SC GOTO vypcr2 ;-------------------------------- ;počítadlo poruch, bit4=porucha PPER BSF ERS BTFSC PP,4 ;16 poruch (00010000) GOTO $+3 ;ANO ;zvětšit počítadlo INCF PP,F ;PP +1 RETURN ;trvající poruchua BSF VA3 ;zapnout výstup ERROR BSF ER GOTO OV ;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT TEPLOTA MOVF PPC,F ;pauza po CONVERT? BTFSS SZ ;nenulové? RETURN ;ANO, ještě čekat BTFSC ERS ;porucha senzoru? GOTO CONV ;ANO ;-------------------------------- CALL resds ;RESET BTFSC ERP ;porucha? GOTO 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? GOTO $-3 ;NE ;-------------------------------- ;test CRC MOVF CRC,F ;CRC=0=souhlasí BTFSS SZ ;CRC=0? GOTO 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 GOTO UT ;pokračovat, jiná teplota MOVF A1,W XORLW 0x52 BTFSS SZ GOTO 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 ? GOTO 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 BCF VA3 BCF ER CLRF PP ;nulovat počítadlo poruch ;-------------------------------- ;Parazitně napájený senzor má při měření teploty (CONVERT) posílenou sběrnici (log.1). CONV CALL resds ;RESET BTFSC ERP ;porucha? GOTO PPER ;ANO MOVLW 0xCC ;SKIP ROM CALL wrds ; ;READ POWER SUPPLY MOVLW 0xB4 CALL wrds BCF DS ;=0 RAM1 ;Banka 1 BCF DS ;=OUT (DS=0=čtecí časový úsek) NOP BSF DS ;=IN (=1) RAM0 ;Banka 0 BCF Bzn ;0=parazitní napájení BTFSC DS ;=0? BSF Bzn ;1=externí napájení CALL resds ;RESET BTFSC ERP ;porucha? GOTO PPER ;ANO MOVLW 0xCC ;SKIP ROM CALL wrds ; ;CONVERT TEMPERATURE MOVLW 0x44 CALL wrds ;EXTERNI nebo PARAZITNI napájení? BTFSC Bzn ;0=PARAZITNI? GOTO NPC ;NE, EXTERNI ;posílit sběrnici pro parazitně napájené senzory (DS=OUT=1) BSF DS ;=1 RAM1 ;Banka 1 BCF DS ;=OUT RAM0 ;Banka 0 ;-------------------------------- ;nastavit pauzu po CONVERT NPC MOVLW 24 ;1,5sek. 1,5*16 (odpočet v přerušení, 16Hz) MOVWF PPC ;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? GOTO LZapor ;NE ;LKlad MOVWF A3 ;C do A MOVF C2,W ; MOVWF A2 ; MOVF C1,W ; MOVWF A1 ; LZapor DECFSZ X1,F ;-1=0? GOTO 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? ; GOTO $+4 ;NE ; BTFSC Bzn ;=0? ; GOTO $+3 ;NE ; GOTO $+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 ;W=B1 SUBWF A1,W ;A1-B1=W MOVWF C1 ;C1=W=vysledek1 CLRW ;W=0 BTFSS STATUS,C ;SUB kladne? MOVLW 1 ;W=1 ADDWF B2,W ;B2+W=W CLRF C3 ;C3=0 BTFSC STATUS,C ;ADD nepreteklo? BSF C3,0 ;C3=1 SUBWF A2,W ;A2-W=W MOVWF C2 ;C2=w=vysledek2 MOVF C3,W ;W=C3 BTFSS STATUS,C ;SUB kladne? MOVLW 1 ;W=1 ADDWF B3,W ;B3+W=W CLRF C3 ;C3=0 BTFSC STATUS,C ;ADD nepreteklo? BSF C3,0 ;C3=1 SUBWF A3,W ;A3-W=W BTFSC C3,0 ;C3=0? BCF STATUS,C ;SC=0 MOVWF C3 ;C3=W=vysledek3 RETURN ;-------------------------------- ; A1,2,3 + C1,2,3 = C1,2,3 ;A se nemeni ;PLUS MOVF A1,W ; ADDWF C1,F ;A1+C1=C1 ; BTFSS STATUS,C ;preteklo? ; GOTO $+4 ; INCFSZ C2,F ;+1=0? ; GOTO $+2 ; INCF C3,F ;+1 ; MOVF A2,W ; ADDWF C2,F ;A2+C2=C2 ; BTFSC STATUS,C ;nepreteklo? ; INCF C3,F ;+1 ; MOVF A3,W ; ADDWF 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? ; GOTO $-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? ; GOTO $+4 ;NE ; BTFSC Bzn ;=0? ; GOTO $+3 ;NE ; GOTO $+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? ; GOTO $-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? GOTO PHD BSF Znam ;=1, záporné ;změna znaménka A1,2 COMF A2,F COMF A1,F INCFSZ A1,F ;+1=0? GOTO 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? GOTO ZTZ ;ANO ;kladná teplota MOVF R4,F BTFSS SZ ;R4=0? GOTO 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? GOTO ZTKC+1 ;NE, (-10. až -55.) GOTO 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? GOTO 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) GOTO 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? GOTO $+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? GOTO $+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 GOTO MEZM10 ;ANO, na +10 ;mez > -100 MOVLW 0xFF MOVWF B2 MOVLW 0x9C MOVWF B1 ;FF9C=-100 CALL PAB ;A > B SC=1 BTFSC SC GOTO MEZM1 ;ANO, na -1 ;mez > -550 MOVLW 0xFD MOVWF B2 MOVLW 0xDA MOVWF B1 ;FDDA=-550 CALL PAB ;A > B SC=1 BTFSC SC GOTO 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 GOTO 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 GOTO MEZP10 ;ANO, na +10 ;mez =< 999 MOVLW 0x03 MOVWF B2 MOVLW 0xE7 MOVWF B1 ;03E7=999 CALL PAB ;A =< B SC=0 BTFSS SC GOTO MEZP1 ;ANO, na +1 ;mez =< 1240 MOVLW 0x04 MOVWF B2 MOVLW 0xD8 MOVWF B1 ;04D8=1240 CALL PAB ;A =< B SC=0 BTFSS SC GOTO 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 GOTO 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 BSF STATUS,RP1 ;Banka2 BCF STATUS,RP0 ; MOVF EEADRp,W ;nastavení adresy MOVWF EEADR ;do ukazatele BSF STATUS,RP0 ;Banka3 BTFSC EECON1,WR ;čekání na dokončení GOTO $-1 ;předchozího zápisu BCF EECON1,EEPGD ;aktivace paměti;dat EEPROM BSF EECON1,RD ;zahájení čtení BCF STATUS,RP0 ;Banka2 MOVF EEDATA,W ;načtení dat z EEPROM BCF STATUS,RP1 ;Banka0 RETURN ;-------------------------------- ;zápis do EEPROM, adresu do EEADRp, data do W EWrite CLRWDT BSF STATUS,RP1 ;Banka3 BSF STATUS,RP0 ; BTFSC EECON1,WR ;čekání na dokončení GOTO $-1 ;předchozího zápisu BCF STATUS,RP0 ;Banka2 MOVWF EEDATA ;příprava dat MOVF EEADRp,W ;nastavení adresy MOVWF EEADR ;do ukazatele BSF STATUS,RP0 ;Banka3 BCF EECON1,EEPGD ;aktivace paměti dat EEPROM BSF EECON1,WREN ;povolení zápisu do EEPROM BCF INTCON,GIE ;zákaz přerušení MOVLW 0x55 ; MOVWF EECON2 ;zápis 55h MOVLW 0xAA ; MOVWF EECON2 ;zápis AAh BSF EECON1,WR ;zahájení zápisu BSF INTCON,GIE ;povolení přerušení BCF EECON1,WREN ;zákaz dalších zápisů BCF STATUS,RP0 ;Banka0 BCF STATUS,RP1 ; RETURN ;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII Init ;základní nastavení procesoru CLRF PORTA CLRF PORTB CLRF PAS BSF STATUS,RP0 ;Banka1 MOVLW B'11101000' ;4MHz MOVWF OSCCON ; vnitřní oscilátor MOVLW B'00000000' ;digi. vstupy MOVWF ANSEL MOVLW B'01000011' ;předdělič 1:16 pro TMR0 MOVWF OPTION_REG ; MOVLW B'00100000' ;PORTA, 0=výstup, 1=vstup MOVWF TRISA ; MOVLW B'00001000' ;PORTB, 0=výstup, 1=vstup MOVWF TRISB ; MOVLW B'00000000' ;přerušení od periferií MOVWF PIE1 ;(zatím nic) BCF STATUS,RP0 ;Banka0 MOVLW B'00100000' ;přerušení od TMR0 MOVWF INTCON ; ;obnovení RAM z EEPROM 0x00-0x07 CLRF EEADRp ;počáteční adresa EEPROM MOVLW HM1 ;počáteční adresa RAM MOVWF FSR ;do ukazovátka CALL ERead ;čtení EEPROM MOVWF INDF ;zápis na adresu v ukazovátku INCF EEADRp,F ;adresa EEPROM+1 INCF FSR,F ;ukazovátko+1 MOVF FSR,W SUBLW TD ;poslední adresa RAM BTFSC SC ;záporné? GOTO $-7 ;NE ;první nastavení CLRF DIS ;pořadí displej MOVLW B'00000111' MOVWF KLVP ;port klávesnice CLRF KLVD ;dělič čtení klávesnice BSF VA3 BSF ER BSF ERS CLRF PPC ;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 BTFSS ER ;porucha? GOTO $+8 ;NE MOVLW zmi ;zE ;E MOVWF Znak1 MOVLW zmi ;zr ;r MOVWF Znak2 ; MOVLW zmi ;zr+. ;r. MOVWF Znak3 ; GOTO $+6 MOVF T1,W MOVWF A1 MOVF T2,W MOVWF A2 CALL ZTEPLO ;zobrazit teplotu ;tlačítka CALL KLV BTFSC SZ ;Z=0? neco stisknuto? GOTO TEPLO ;NE BTFSS TlM ;stisknuto? GOTO NRUP ;ANO BTFSC TlP ;stisknuto? GOTO 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 GOTO TEPLO ;tlačítka CALL KLV BTFSC SZ ;Z=0? neco stisknuto? GOTO $-5 ;NE BTFSS TlM ;stisknuto? GOTO NTEPLO ;ANO BTFSS TlP ;stisknuto? GOTO NDM ;ANO ;S MOVLW zH+. ;H. MOVWF Znak1 MOVLW zM+. ;M. MOVWF Znak2 MOVLW sp ;" " MOVWF Znak3 ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? GOTO ZHM ;NE BTFSS Znova ;odcasovano? GOTO $-4 ;NE BCF Znova ;nulovat ;blikat HM BHM BTFSS BLIK,6 GOTO $+6 MOVLW sp ;VYP MOVWF Znak1 ; MOVWF Znak2 ; MOVWF Znak3 ; displej GOTO $+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? GOTO BHM ;NE BTFSS TlS ;stisknuto? GOTO UHM ;ANO BTFSS TlP ;stisknuto? GOTO 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 GOTO 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 GOTO BHM ;uložit do EEPROM UHM MOVLW 0x00 MOVWF EEADRp MOVF HM1,W CALL EWrite INCF EEADRp,F ;+1 MOVF HM2,W CALL EWrite GOTO 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 GOTO TEPLO ;tlačítka CALL KLV BTFSC SZ ;Z=0? neco stisknuto? GOTO $-5 ;NE BTFSS TlM ;stisknuto? GOTO NHM ;ANO BTFSS TlP ;stisknuto? GOTO NTA ;ANO ;S MOVLW zd+. ;d. MOVWF Znak1 MOVLW zM+. ;M. MOVWF Znak2 MOVLW sp ;" " MOVWF Znak3 ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? GOTO ZDM ;NE BTFSS Znova ;odcasovano? GOTO $-4 ;NE BCF Znova ;nulovat ;blikat DM BDM BTFSS BLIK,6 GOTO $+6 MOVLW sp ;VYP MOVWF Znak1 ; MOVWF Znak2 ; MOVWF Znak3 ; displej GOTO $+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? GOTO BDM ;NE BTFSS TlS ;stisknuto? GOTO UDM ;ANO BTFSS TlP ;stisknuto? GOTO 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 GOTO 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 GOTO BDM ;uložit do EEPROM UDM MOVLW 0x02 MOVWF EEADRp MOVF DM1,W CALL EWrite INCF EEADRp,F ;+1 MOVF DM2,W CALL EWrite GOTO 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 GOTO TEPLO ;tlačítka CALL KLV BTFSC SZ ;neco stisknuto? GOTO $-5 ;nic BTFSS TlM ;stisknuto? GOTO NDM ;ANO BTFSS TlP ;stisknuto? GOTO 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? GOTO ZTA ;NE BTFSS Znova ;odcasovano? GOTO $-4 ;NE BCF Znova ;nulovat BCF CVA1 ;VYP cyklocání VA1 ;blikat TA BTA BTFSS BLIK,6 GOTO $+6 MOVLW sp ;VYP MOVWF Znak1 ; MOVWF Znak2 ; MOVWF Znak3 ; displej GOTO $+3 MOVF ZABCD,W ;ZAP CALL ZCAS ; displej ;tlačítka CALL KLV BTFSC SZ ;Z=0? neco stisknuto? GOTO BTA ;NE BTFSS TlS ;stisknuto? GOTO UTA ;ANO BTFSS TlP ;stisknuto? GOTO TAP ;ANO ;TA -1 TAM DECFSZ ZABCD,F ;-1=0? GOTO BTA ;NE DECF ZABCD,F ;-1 GOTO BTA ;TA +1 TAP INCFSZ ZABCD,F ;+1=0? GOTO BTA ;NE INCF ZABCD,F ;+1 GOTO BTA ;uložit do EEPROM UTA MOVLW 0x04 MOVWF EEADRp MOVF ZABCD,W MOVWF TA CALL EWrite GOTO 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? GOTO $-5 ;nic BTFSS TlM ;stisknuto? GOTO NTA ;ANO BTFSS TlP ;stisknuto? GOTO 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? GOTO ZTB ;NE BTFSS Znova ;odcasovano? GOTO $-4 ;NE BCF Znova ;nulovat BCF CVA1 ;VYP cyklocání VA1 ;blikat TB BTB BTFSS BLIK,6 GOTO $+6 MOVLW sp ;VYP MOVWF Znak1 ; MOVWF Znak2 ; MOVWF Znak3 ; displej GOTO $+3 MOVF ZABCD,W ;ZAP CALL ZCAS ; displej ;tlačítka CALL KLV BTFSC SZ ;Z=0? neco stisknuto? GOTO BTB ;NE BTFSS TlS ;stisknuto? GOTO UTB ;ANO BTFSS TlP ;stisknuto? GOTO TBP ;ANO ;TB -1 TBM DECF ZABCD,F ;-1 GOTO BTB ;NE ;TB +1 TBP INCF ZABCD,F ;+1 GOTO BTB ;uložit do EEPROM UTB MOVLW 0x05 MOVWF EEADRp MOVF ZABCD,W MOVWF TB CALL EWrite GOTO 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? GOTO $-5 ;nic BTFSS TlM ;stisknuto? GOTO NTB ;ANO BTFSS TlP ;stisknuto? GOTO 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? GOTO ZTC ;NE BTFSS Znova ;odcasovano? GOTO $-4 ;NE BCF Znova ;nulovat BCF CVB4 ;VYP cyklocání VB4 ;blikat TC BTC BTFSS BLIK,6 GOTO $+6 MOVLW sp ;VYP MOVWF Znak1 ; MOVWF Znak2 ; MOVWF Znak3 ; displej GOTO $+3 MOVF ZABCD,W ;ZAP CALL ZCAS ; displej ;tlačítka CALL KLV BTFSC SZ ;Z=0? neco stisknuto? GOTO BTC ;NE BTFSS TlS ;stisknuto? GOTO UTC ;ANO BTFSS TlP ;stisknuto? GOTO TCP ;ANO ;TC -1 TCM DECFSZ ZABCD,F ;-1=0? GOTO BTC ;NE DECF ZABCD,F ;-1 GOTO BTC ;TC +1 TCP INCFSZ ZABCD,F ;+1=0? GOTO BTC ;NE INCF ZABCD,F ;+1 GOTO BTC ;uložit do EEPROM UTC MOVLW 0x06 MOVWF EEADRp MOVF ZABCD,W MOVWF TC CALL EWrite GOTO 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? GOTO $-5 ;nic BTFSS TlM ;stisknuto? GOTO NTC ;ANO BTFSS TlP ;stisknuto? GOTO 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? GOTO ZTD ;NE BTFSS Znova ;odcasovano? GOTO $-4 ;NE BCF Znova ;nulovat BCF CVB4 ;VYP cyklocání VB4 ;blikat TD BTD BTFSS BLIK,6 GOTO $+6 MOVLW sp ;VYP MOVWF Znak1 ; MOVWF Znak2 ; MOVWF Znak3 ; displej GOTO $+3 MOVF ZABCD,W ;ZAP CALL ZCAS ; displej ;tlačítka CALL KLV BTFSC SZ ;Z=0? neco stisknuto? GOTO BTD ;NE BTFSS TlS ;stisknuto? GOTO UTD ;ANO BTFSS TlP ;stisknuto? GOTO TDP ;ANO ;TD -1 TDM DECF ZABCD,F ;-1 GOTO BTD ;NE ;TD +1 TDP INCF ZABCD,F ;+1 GOTO BTD ;uložit do EEPROM UTD MOVLW 0x07 MOVWF EEADRp MOVF ZABCD,W MOVWF TD CALL EWrite GOTO 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 BTFSS VB4 CLRW MOVWF Znak2 MOVLW 1 BTFSS VA1 CLRW MOVWF Znak3 ;návrat MOVF DN,F BTFSC SZ GOTO TEPLO ;tlačítka CALL KLV BTFSC SZ ;neco stisknuto? GOTO ZRUP ;nic BTFSS TlM ;stisknuto? GOTO NTD ;ANO BTFSS TlP ;stisknuto? GOTO NTEPLO ;ANO ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? GOTO ZRUP ;NE BTFSS Znova ;odčasováno? GOTO $-4 ;NE BCF Znova MOVLW zr+. ;r. MOVWF Znak1 BCF CVA1 ;zastavit cyklování BCF CVB4 ; ;blikat, stavy výstupů BRUP BTFSS BLIK,6 GOTO $+5 MOVLW sp ;VYP MOVWF Znak2 ; displej MOVWF Znak3 ; GOTO $+9 MOVLW 1 ;ZAP BTFSS VB4 ; displej CLRW MOVWF Znak2 MOVLW 1 BTFSS VA1 CLRW MOVWF Znak3 ;tlačítka CALL KLV+1 ;bez měření teploty BTFSC SZ ;Z=0? neco stisknuto GOTO BRUP ;nic BTFSS TlS ;stisknuto? GOTO NRUP ;ANO BTFSS TlP ;stisknuto? GOTO VA1ZV ;ANO ;VB4 ZAP/VYP VB4ZV BTFSS VB4 GOTO $+3 BCF VB4 ;0 VYP GOTO BRUP BSF VB4 ;1 ZAP GOTO BRUP ;VA1 ZAP/VYP VA1ZV BTFSS VA1 GOTO $+3 BCF VA1 ;0 VYP GOTO BRUP BSF VA1 ;1 ZAP GOTO 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 GOTO WA2 ;-------------------------------- ;dolní mez do B D_B MOVF DM1,W MOVWF B1 MOVF DM2,W GOTO 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 BTFSS ER ;=1?, porucha? GOTO IMPVA1 ;NE ;zastavit cyklování BCF CVA1 BCF CVB4 ;výstupy při poruše BCF VA1 ;VYP BCF VB4 ;VYP RETURN ;-------------------------------- IMPVA1 ;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? GOTO VYPVA1 ;NE ;VA1 BTFSC CVA1 ;ZAP? GOTO 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 GOTO IMPVB4 ;................................ ;VA1 = 0 když teplota > dolní meze VYPVA1 BCF VA1 ;VYP 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? GOTO 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 BCF VB4 ;VYP BCF CVB4 ;zastavit cyklování RETURN ;-------------------------------- END