;-------------------------------; ; Teploměr Voltmetr ; ;-------------------------------; ; 2x DS18B20 (DALLAS 1-Wire) ; ; -55 až 125°C ; ; Signalizace námrazy ; ;-------------------------------; ; Měřené napětí 0 až 30V ; ;-------------------------------; ;)S(2013.06 slovak@post.cz; ;-------------------------------; ;LED displej 3místný, společná anoda. ; ;MENU, automatické přepínání: ;[-0-] nadpis-teplota, čidlo Out, svítí LED_B4 ;[-1-] nadpis-teplota, čidlo In, svítí LED_A3 ;[-U-] nadpis-napětí, svítí obě LED ;Animovaný nadpis 3s. teplota, napětí 15s. ; ;MENU, ruční přepínání: ;[Out] nadpis-venkovní teplota ;[In ] nadpis-vnitřní teplota ;[bAt] nadpis-napětí ;Přepínání - jakékovliv tlačítko. ;Dlouhý stisk - návrat na automatické přepínání. ; ;Porucha při čtení teploty: ;[Er.x.] x=číslo vadného senzoru. ; ;Signalizace námrazy: ;Displej bliká (teplota Out), ;bude-li venkovní teplota (T0) v pásmu 1°C až -1°C ; ;-------------------------------- ;Hledání DS obvodů, načte identifikační kódy po každém startu (resetu). ;Chyba: ;[E.00] nebyl nalezen žádný obvod, vyhledávání se opakuje. ;[E.02] dva nebo několik DS obvodů se stejným kódem, vyhledávání se opakuje. ; ;-------------------------------- ;Mikroprocesor PIC 16F1827 ; ;RB7 Katoda f ;RB6 Katoda a ;RB5 Anoda 1 (DIS vlevo) ;RB4 výstup LED_B4 ;RB3 vstup/výstup sběrnice 1-Wire ;RB2 Katoda e ;RB1 Katoda d ;RB0 Katoda T ; ;RA7 Anoda 3 (DIS vpravo) ;RA6 Anoda 2 (DIS střední) ;RA5 vstup (nevyužito) ;RA4 Katoda g ;RA3 výstup LED_A3 ;RA2 Katoda c ;RA1 vstup Uin měřené napětí (0 až 5V) ;RA0 Katoda b ; ;Napájení senzorů DS18B20. Externí/parazitní, oba způsoby lze kombinovat. ; ;Externí: 3 vodiče, GND/1-wire/+5V ;/|"""|----3 +5V ; |DS |----2 1-wire ;\|___|----1 GND ; ;Parazitní: 2 vodiče, GND/1-wire ;/|"""|----3 GND ; |DS |----2 1-wire ;\|___|----1 GND ; ;-------------------------------- LIST P=16F1827, 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,X2 ; FL ;Flag, příznaky T_RDS ;data, 1-Wire CRC ;kontrolní součet IDS ;index, pořadí DS obvodu (0=1.DS ... 14=15.DS) PDS ;počet nalezených DS obvodů (1 ... 15) KOD0 ;1.DS Kód, sériové číslo (prvních 8 bitů) KOD1 ;2.DS PP0 ;1.DS počítadlo poruch PP1 ;2.DS T0L,T0H ;1.DS teplota Out (dolní/horní bajt) T1L,T1H ;2.DS teplota In UL,UH ;napětí SV1,SV2,SV3 ;součet vzorků napětí PV ;počet vzorků KLVP ;port klávesnice (bit0-TlP, 1-TlM, 2-Tls) 0=stisknuto KLVD ;dělič, čtení klávesnice a další časovače KLVO ;dělič, opakování tlačítka PAUZA ;dělič, pauza pro animovaný nadpis 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) R1,R2,R3,R4 ;výstup převodu HEX/DEC, řád desetin,jedniček,desítek,stovek PPC ;pauza před CONVERT (před převodem) BLIK ;blikání displeje endc #define SC STATUS,C #define SZ STATUS,Z #define DS PORTB,3 ;1-wire sběrnice (BANK0=PORT, BANK1=TRIS, BANK2=LAT) #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 FL,2 ;1=ERROR po RESET/PRESENCE #define SKLO FL,1 ;námraza, 1=signalizace #define DT3 FL,0 ;desetiná tečka vpravo, 1=ZAP #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 LED_B4 #define VA3 LATA,3 ;výstup LED_A3 ;číslo znaku #define . 128 ;tečka (zobrazit 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 (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 ;******************************** ;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, před CONVERT MOVF PPC,F BTFSS SZ ;PPC=0?, SZ=1? DECF PPC,F ;-1 ;počítadlo, PAUZA MOVF PAUZA,F BTFSS SZ ;PAUZA=0?, SZ=1? DECF PAUZA,F ;-1 ;................................ EKLV ;-------------------------------- ;zapnout Katody podle DIS v ukazovátku FSR (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 ;příště další displej (nová 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 BTFSC SZ ;KLVO=0? BSF Znova ;NE, Znova=1 ;-------------------------------- ;dělič pro blikání displeje při nastavování INCF BLIK,F ;+1 ;-------------------------------- ;konec přerušení RETFIE ;******************************** ;převede číslo znaku na sedmisegment Segment MOVF INDF0,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 INDF0,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(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'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 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 ;-------------------------------- ;volná synchronizace s přerušením VSP MOVF TMR0,W ANDLW B'11000000' BTFSS SZ BRA $-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 senzor CALL VSP ;synchronizace ;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 ;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 ; CALL VSP ;synchronizace ;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 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 ; CALL VSP ;synchronizace ;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 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 ;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK ;odeslat Family kód FKOD MOVLW 0x28 ;kód DS18B20 ;odeslat Identifikační kód (z W) IKOD MOVWF A2 ;kód MOVLW 8 ;počet bitů MOVWF A1 ; CALL RDDS2 ;načte 2 bity do T_RDS MOVF A2,W ;kód MOVWF T_RDS ; CALL WRDS1 ;odešle bit0 z T_RDS RRF A2,F ;kód->, příště další bit DECFSZ A1,F ;-1=0? BRA $-6 ;NE, znova RETURN ;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH ;SEARCH ROM 1-Wire, hledat identifikační kódy DS obvodů (prvních 8 bitů) HLEDAT CLRF IDS ;index, číslo DS obvodu CLRF D1 ;kód (0 až 255) HLE1 CALL resds ;RESET/PRESENCE MOVLW 0xF0 ;SEARCH ROM CALL wrds ; CALL FKOD ;poslat Family kód MOVF D1,W ;poslat Identifikační kód CALL IKOD ; CALL RDDS2 ;načte 2 bity z DS do T_RDS,7,6 BTFSC SZ ;T_RDS=00? BRA EDS2 ;ANO, 2 nebo více DS se stejným kódem XORLW B'11000000' BTFSC SZ ;T_RDS=11? BRA HLE2 ;ANO, žádný DS s tímto kódem ;uložit kód MOVF IDS,W ;index ADDLW KOD0 ;+ adresa RAM (kód 1) MOVWF FSR1 ;do ukazovátka MOVF D1,W ;nový kód MOVWF INDF1 ;uložit na adresu v ukazovátku ;další kód INCF IDS,F ;index+1 ;zobrazit číslo nalezeného DS MOVF IDS,W ADDLW . ;+ tečka MOVWF Znak1 ;zobrazit ;test, poslední DS MOVLW 2;15 ;MAX počet DS obvodů SUBWF IDS,W ;IDS-15 BTFSC SC ;=0? záporné? RETURN ;NE, konec, poslední DS ;test, poslední kód HLE2 INCFSZ D1,F ;kód+1=0? BRA HLE1 ;NE, další kód ;test, žádné čidlo MOVF KOD0,F BTFSS SZ ;KOD0=0? RETURN ;NE ;-------------------------------- ;porucha E.00, žádné čidlodlo CLRF Znak3 ;0 BRA EDS3 ;porucha E.02, 2 nebo více DS obvodů se stejným kódem EDS2 MOVLW 2 ;2 MOVWF Znak3 EDS3 CLRF Znak2 ;0 MOVLW zE+. ;E. MOVWF Znak1 RETURN ;================================ TEPNAP ;měření teploty a napětí ;UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU ;měření napětí CLRWDT BANK1 BTFSC ADCON0,GO ;AD převod je dokončen? BRA MT ;NE ;-------------------------------- ;součet vzorků SV1,2,3 + AD převod (256x) ;vstup:ADRESL,H (nový AD převod) ;výstup:SV2,3 (součet/256) MOVF ADRESL,W ;dolní bajt AD převodu BANK0 ADDWF SV1,F ;ADL + SV1 BANK1 MOVF ADRESH,W ;horní bajt AD převodu BANK0 ADDWFC SV2,F ;ADH + SV2 + SC CLRW ADDWFC SV3,F ;SV3 + SC BANK1 BSF ADCON0,GO ;start A/D převod BANK0 ;počet vzorků -1 DECFSZ PV,F ;-1=0? BRA MT ;NE, další vzorky příště ;součet vzorků / 256 = A1,2 MOVF SV2,W MOVWF A1 MOVF SV3,W MOVWF A2 ;nulovat vzorky CLRF SV1 CLRF SV2 CLRF SV3 ;*******************************; ; Výpočet napětí [V*10] ; ; vstup: A1,2 výstup: C1,2 ; ; C1,2 = AD * 200 / 682 ; ;*******************************; ;A1,2 * 200 = C1,2,3 (200=C8h) CLRF A3 MOVLW 0xC8 ;200 MOVWF B1 CLRF B2 CLRF B3 CALL KRAT24 ;C1,2,3 / 681 = C1,2 (681=2A9h) MOVF C1,W MOVWF A1 MOVF C2,W MOVWF A2 MOVF C3,W MOVWF A3 MOVLW 0xA9 ;681 MOVWF B1 MOVLW 0x02 ; MOVWF B2 CALL LOMENO24 ;-------------------------------- ;uložit napětí MOVF C1,W MOVWF UL MOVF C2,W MOVWF UH RETURN ;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ;měření teploty ;pauza před CONVERT MT BANK0 MOVF PPC,F BTFSS SZ ;PPC=0?, SZ=1? RETURN ;NE, ještě čekat ;-------------------------------- ;načte jednu teplotu (IDS = pořadí DS obvodu) ;-------------------------------- CALL ZDS ;zapnout DS, podle ROM kódu BTFSC ERP ;porucha? BRA DDS ;ANO ;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í BTFSC SZ ;CRC=0? BRA $+3 CALL PPER ;NE, počítadlo poruch BRA DDS ;-------------------------------- ;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 ;-------------------------------- ;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) BCF SC RLF IDS,W ;index*2 ADDLW T0L ;+ adresa RAM MOVWF FSR1 ;do ukazovátka MOVF INDF1,W ;minulá teplota L MOVWF A1 ;uložit INCF FSR1,F ;+1 MOVF INDF1,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 DDS ;NE ;použít 85°C MOVLW 0x52 MOVWF A1 MOVLW 0x03 MOVWF A2 ;-------------------------------- ;uložit teplotu (IDS = pořadí aktuálního čila) UT BCF SC RLF IDS,W ;index*2 ADDLW T0L ;+ adresa RAM MOVWF FSR1 ;do ukazovátka MOVF A1,W MOVWF INDF1 ;uložit teplotu L na adresu v ukazovátku INCF FSR1,F ;ukazovátko+1 MOVF A2,W MOVWF INDF1 ;uložit teplotu H na adresu v ukazovátku ;-------------------------------- ;nulovat počítadlo poruch (IDS = pořadí DS obvodu) MOVF IDS,W ;index ADDLW PP0 ;+ adresa RAM MOVWF FSR1 ;do ukazovátka CLRF INDF1 ;nulovat ;-------------------------------- ;další čidlo DDS INCF IDS,F ;index+1 MOVF PDS,W ;MAX počet kódů (připojených DS obvodů) SUBWF IDS,W ;IDS-PDS BTFSS SC ;kladné? (IDS=PDS) BRA $+2 ;NE PCS CLRF IDS ;příště první čidlo (první CONVERT po startu) ;-------------------------------- ;CONVERT (IDS = pořadí DS obvodu) ;Parazitně napájené senzory mají při měření teploty (CONVERT) posílenou sběrnici (log.1). ;-------------------------------- ;zapnout DS, podle ROM kódu CALL ZDS BTFSC ERP ;porucha? BRA NPC ;ANO ;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í ;zapnout DS, podle ROM kódu CALL ZDS BTFSC ERP ;porucha? BRA NPC ;ANO ;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) BSF DS ;=1 BANK1 ;Banka 1 BCF DS ;=OUT BANK0 ;Banka 0 ;nastavit pauzu mezi CONVERT NPC MOVLW 24 ;1,5sek. 1,5*16 (odpočet v přerušení, 16Hz) MOVWF PPC ;pauza před CONVERT, četnost měření ;-------------------------------- ; RETURN GOTO PR ;program regulace ;================================ ;zapnout DS, podle ROM kódu ZDS CALL resds ;RESET BTFSC ERP ;porucha? po RESET/PRESENCE BRA PPER ;ANO MOVLW 0xF0 ;SEARCH ROM CALL wrds ; CALL FKOD ;poslat Family kód MOVF IDS,W ;index ADDLW KOD0 ;+ adresa RAM MOVWF FSR1 ;do ukazovátka MOVF INDF1,W ;načíst kód z adresy v ukazovátku CALL IKOD ;poslat Identifikační kód ;dokončit ROM kód MOVLW 48 ;počet bitů MOVWF A1 ;=sériové číslo-IKOD+CRC (48-8+8) CALL RDDS2 ;načte 2 bity do T_RDS,7,6 BTFSC SZ ;T_RDS=00? BRA PPER ;ANO, nepřípustný stav, jako více DS XORLW B'11000000' ;(st.=0) BTFSC SZ ;T_RDS=11? BRA PPER ;ANO, nepřípustný stav, jako žádné DS CLRW ;(bude vyslána 0) BTFSC T_RDS,6 ;T_RDS=01? MOVLW 1 ;ANO, bude vyslána 1 MOVWF T_RDS CALL WRDS1 ;odešle 1 bit T_RDS,0 DECFSZ A1,F ;-1=0? BRA $-12 ;NE RETURN ;-------------------------------- ;počítadlo poruch (IDS = pořadí vadného DS obvodu) ;(po naplnění se zobrazí ERROR) PPER MOVF IDS,W ;index ADDLW PP0 ;+ adresa RAM MOVWF FSR1 ;do ukazovátka BTFSS INDF1,2 ;4 poruchy (00000100) INCF INDF1,F ;PPx +1 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 ;ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ;zobrazit teplotu (W=číslo teploty 1 až 15 pro T0 až T14) ZTEP ;test počítadla poruch MOVWF A1 ;schovat ADDLW PP0-1 ;+ adresa PP0 -1 = adresa PPx MOVWF FSR1 ;do ukazovátka BTFSC INDF1,2 ;počítadlo poruch je naplněno? BRA ZERR ;ANO, zobrazit poruchu ;nastavit ukazovátko na aktuální teplotu DECF A1,W ;číslo teploty (1 až 15) -1 MOVWF FSR1 ;do ukazovátka BCF SC RLF FSR1,W ;ukazovátko*2 ADDLW T0L ;+ adresa = adresa teploty TxL MOVWF FSR1 ;do ukazovátka ;uložit teplotu do A1,2 MOVF INDF1,W ;teplota TxL MOVWF A1 ; INCF FSR1,F ;ukazovátko +1 MOVF INDF1,W ;teplota TxH MOVWF A2 ; ;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 ; ;-------------------------------- ;typ zobrazení (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 ; BTFSC DT3 ;=1? ; ADDLW . ;ANO, přidat tečku 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 ; BTFSS DT3 ;=0? 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 poruchu ZERR MOVLW zE ;E MOVWF Znak1 MOVLW zr+. ;r. MOVWF Znak2 DECF A1,W ;číslo teploty, 0 nebo 1 ; ADDLW . ;přidat tečku MOVWF Znak3 RETURN ;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT KLV 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 ;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII Init ;základní nastavení procesoru BANK3 MOVLW B'11100010' ;RA1 Analog vstup MOVWF ANSELA ; MOVLW B'00000001' ; ostatní Digt.I/O 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'00100010' ;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'10000111' ;ZAP A/D, AN1 MOVWF ADCON0 ; MOVLW B'10101000' ;vpravo, Fosc/32, Vref-:GND, Vref+:Vdd MOVWF ADCON1 ; BANK0 MOVLW B'00100000' ;přerušení od TMR0 MOVWF INTCON ; CLRF T1CON CLRF T2CON CLRF FSR0H CLRF FSR1H ;první nastavení MOVLW B'00000111' MOVWF KLVP ;port klávesnice CLRF KLVD ;dělič čtení klávesnice CLRF DIS ;pořadí displej BCF VB4 ;VYP LED BCF VA3 ; CLRF SV1 ;vzorky CLRF SV2 ; CLRF SV3 ; CLRF PV ;počet vzorků ;povolit přerušení BSF INTCON,GIE ;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH ;hledat DS obvody, identifikační kódy HLDS CLRWDT ;zobrazit nadpis MOVLW 0+. ;0. MOVWF Znak1 MOVLW zd ;d MOVWF Znak2 MOVLW zS ;S MOVWF Znak3 CALL HLEDAT ;hledat kódy (prvních 8 bitů) ;pauza MOVLW 15 ;1s (1=65ms) MOVWF PAUZA CLRWDT MOVF PAUZA,F BTFSS SZ BRA $-3 ;test E. (chyby) MOVF Znak1,W XORLW zE+. ;(st.=0) BTFSC SZ ;Znak1=E.? (SZ=1?) BRA HLDS ;ANO, opakovat hledání ;uložit MOVF IDS,W MOVWF PDS ;počet nalezených DS obvodů ;první CONVERT po startu CALL PCS ;-------------------------------; ; MENU ; ;-------------------------------; ;Out (T0) MENU BSF VB4 ;LED BCF VA3 ; ;nadpis Out MOVLW 0 ;-0- CALL NADPIS BSF Znova ;=1 MOVLW 214 ;14s (1=65ms) MOVWF PAUZA ;pro zobrazení teploty ZTEP0 CALL KLV BTFSS SZ ;Z=0? neco stisknuto? BRA NTEP0 ;ANO CALL TEPNAP ;měření teploty a napětí ;námraza ? BTFSC SKLO ;=0? BTFSS BLIK,6 ;blikat? BRA $+7 ;NE MOVLW sp ;zhasnout displej MOVWF Znak1 MOVWF Znak3 ADDLW . MOVWF Znak2 BRA $+3 MOVLW 1 CALL ZTEP ;zobrazit teplotu MOVF PAUZA,F BTFSS SZ BRA ZTEP0 ;-------------------------------- ;In (T1) BCF VB4 ;LED BSF VA3 ; ;nadpis In MOVLW 1 ;-1- CALL NADPIS BSF Znova ;=1 MOVLW 214 ;14s (1=65ms) MOVWF PAUZA ;pro zobrazení teploty ZTEP1 CALL KLV BTFSS SZ ;Z=0? neco stisknuto? BRA NTEP1 ;ANO ; BCF DT3 ;VYP CALL TEPNAP ;měření teploty a napětí MOVLW 2 CALL ZTEP ;zobrazit teplotu MOVF PAUZA,F BTFSS SZ BRA ZTEP1 ;-------------------------------- ;U BSF VB4 ;LED BSF VA3 ; ;nadpis U MOVLW 29 ;-U- CALL NADPIS BSF Znova ;=1 MOVLW 214 ;14s (1=65ms) MOVWF PAUZA ;pro zobrazení napětí ZNAP CALL KLV BTFSS SZ ;Z=0? neco stisknuto? BRA NNAP ;ANO CALL TEPNAP ;měření teploty a napětí MOVF UL,W MOVWF A1 MOVF UH,W MOVWF A2 CALL HEXDEC ;zobrazit napětí MOVF PAUZA,F BTFSS SZ BRA ZNAP ;-------------------------------- ;počet připojených DS obvodů musí být 2 MOVF PDS,W SUBLW 2 ;2-PDS BTFSC SZ ;=0? BRA MENU ;ANO BRA HLDS ;NE, hledat znovu ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ;animace nadpisu NADPIS ;zobrazit nadpis [..x] MOVWF Znak3 ;číslo DS obvodu MOVLW sp ;" " MOVWF Znak1 MOVWF Znak2 ;nastavit pauzu MOVLW 10 ;0.7s (1=65ms) MOVWF PAUZA CALL KLV BTFSS SZ ;Z=0? neco stisknuto? RETURN ;ANO MOVF PAUZA,F BTFSS SZ ;=1? BRA $-5 ;NE ;zobrazit nadpis [.x.] MOVF Znak3,W ;číslo DS obvodu MOVWF Znak2 MOVLW sp ;" " ; MOVWF Znak1 MOVWF Znak3 ;nastavit pauzu MOVLW 10 ;0.7s (1=65ms) MOVWF PAUZA CALL KLV BTFSS SZ ;Z=0? neco stisknuto? RETURN ;ANO MOVF PAUZA,F BTFSS SZ ;=1? BRA $-5 ;NE ;zobrazit nadpis [x..] MOVF Znak2,W ;číslo DS obvodu MOVWF Znak1 MOVLW sp ;" " MOVWF Znak2 ; MOVWF Znak3 ;nastavit pauzu MOVLW 10 ;0.7s (1=65ms) MOVWF PAUZA CALL KLV BTFSS SZ ;Z=0? neco stisknuto? RETURN ;ANO MOVF PAUZA,F BTFSS SZ ;=1? BRA $-5 ;NE RETURN ;================================ ;nadpis Out (T0) NTEP0 MOVLW 0 ;O MOVWF Znak1 MOVLW zu ;u MOVWF Znak2 MOVLW zt ;t MOVWF Znak3 BSF VB4 ;LED BCF VA3 ; CLRF KLVO ;MAX čas ;tlačítko TLT0 CLRWDT BTFSS Znova ;odcasovano? BRA $+3 ;NE BCF Znova ;nulovat BRA MENU MOVF KLVP,W XORLW B'00000111' ;st.=0 BTFSS SZ ;něco? BRA TLT0 ;ANO ;teplota 0 TEP0 CALL TEPNAP ;měření teploty a napětí ;námraza ? BTFSC SKLO ;=0? BTFSS BLIK,6 ;blikat? BRA $+7 ;NE MOVLW sp ;zhasnout displej MOVWF Znak1 MOVWF Znak3 ADDLW . MOVWF Znak2 BRA $+3 MOVLW 1 CALL ZTEP ;zobrazit teplotu ;tlačítka CALL KLV BTFSC SZ ;Z=0? neco stisknuto? BRA TEP0 ;NE ;-------------------------------- ;nadpis In (T1) NTEP1 MOVLW 1 ;I MOVWF Znak1 MOVLW zn ;n MOVWF Znak2 MOVLW sp ;" " MOVWF Znak3 BCF VB4 ;LED BSF VA3 ; CLRF KLVO ;MAX čas ;tlačítko TLT1 CLRWDT BTFSS Znova ;odcasovano? BRA $+3 ;NE BCF Znova ;nulovat BRA MENU MOVF KLVP,W XORLW B'00000111' ;st.=0 BTFSS SZ ;něco? BRA TLT1 ;ANO ;teplota 1 TEP1 CALL TEPNAP ;měření teploty a napětí MOVLW 2 CALL ZTEP ;zobrazit teplotu ;tlačítka CALL KLV BTFSC SZ ;Z=0? neco stisknuto? BRA TEP1 ;NE ;-------------------------------- ;nadpis U NNAP MOVLW zb ;b MOVWF Znak1 MOVLW zA ;A MOVWF Znak2 MOVLW zt ;t MOVWF Znak3 BSF VB4 ;LED BSF VA3 ; CLRF KLVO ;MAX čas ;tlačítko TLNAP CLRWDT BTFSS Znova ;odcasovano? BRA $+3 ;NE BCF Znova ;nulovat BRA MENU MOVF KLVP,W XORLW B'00000111' ;st.=0 BTFSS SZ ;něco? BRA TLNAP ;ANO ;napětí NAP CALL TEPNAP ;měření teploty a napětí MOVF UL,W MOVWF A1 MOVF UH,W MOVWF A2 CALL HEXDEC ;zobrazit napětí ;tlačítka CALL KLV BTFSC SZ ;Z=0? neco stisknuto? BRA NAP ;NE BRA NTEP0 ;-------------------------------- ;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 ;-------------------------------- ;program regulace PR BCF SKLO ;VYP ;porucha T0? BTFSC PP0,2 ;=1? RETURN ;ANO ;................................ ;SKLO=0 při T0 > 1°C (SC=1) MOVF T0L,W MOVWF A1 MOVF T0H,W MOVWF A2 MOVLW 10 ;0010 = +1.0°C MOVWF B1 CLRF B2 ; CALL PAB BTFSC SC ;=1? RETURN ;ANO ;SKLO=0 při T0 < -1°C (SC=1) MOVF T0L,W MOVWF B1 MOVF T0H,W MOVWF B2 MOVLW 0xF6 ;FFF6 = -1.0°C MOVWF A1 MOVLW 0xFF ; MOVWF A2 CALL PAB BTFSS SC ;=1? BSF SKLO ;NE, ZAP RETURN ;-------------------------------- END