;-------------------------------; ; MIKRO TERMOSTAT ; ;-------------------------------; ;slovak@post.cz )S(01.2009; ;-------------------------------; ;Displej: (LED 2 místný, společná anoda) ;°C teplota (-45 až 99°C, krok 1°C) ;M0 Mez0 ;M1 Mez1 ;M2 Mez2 ;M3 Mez3 ;M4 Mez4 ;M5 Mez5 ;-------------------------------- ;Tlačítka: ;Tl.S Set, nastavit (levé) ;Tl.M Mínus (prostřední) ;Tl.P Plus (pravé) ;-------------------------------- ;vstup: ;MCLR Teplotní čidlo SMT 160-30 ;-------------------------------- ;Výstupy: ;A0=1 při, teplota < Mez0 ;A0=0 při, teplota => Mez0 ; ;A1=1 při, teplota < Mez1 ;A1=0 při, teplota => Mez1 ; ;A2=1 při, teplota < Mez2 ;A2=0 při, teplota => Mez2 ; ;A3=1 při, teplota < Mez3 ;A3=0 při, teplota => Mez3 ; ;A4=1 při, teplota <= Mez4 ;A4=0 při, teplota => Mez5 ;-------------------------------- LIST P=16F628A, R=DEC ;Direktivy překladače include ;Definice názvů registrů __CONFIG 0x3F54 ;Nastaví následující konfiguraci ; CP=OFF, CPD=OFF, LVP=OFF, BOREN=ON, ; MCLRE=I/O, PWRTEN=Enable, WDTE=ON, OSC=INTRC-I/O cblock 0x20 MemStat A1 ;matematické A2 ; proměnné A3 ; a jiné funkce B1 ; B2 ; B3 ; C1 ; C2 ; C3 ; D1 ; D2 ; D3 ; X1 ; X2 ; FL ;flag,příznaky Znak0 ;číslo znaku, pozice 0 (vlevo) Znak1 ;číslo znaku, pozice 1 (vpravo) PZnak ;pro převod číslo/znak BLIK ;dělič pro blikání displeje KLVP ;číslo stisknutého tlačítka KLVD ;dělič pro čtení tlačítek KLVO ;dělič pro opakování tlačítka PV ;počet vzorků SH1 ;součt úrovně H SH2 ; SH3 ; SP1 ;součet periody P SP2 ; SP3 ; T1 ;teplota [°C*10] T2 ; TEP ;teplota [°C] DN ;dělič pro návrat na teplotu D122 ;dělič 122 DeSR ;dělič pro Stop Regulace po startu ;EEPROM adresa M0 ;00 ;Mez0 M1 ;01 ;Mez1 M2 ;02 ;Mez2 M3 ;03 ;Mez3 M4 ;04 ;Mez4 M5 ;05 ;Mez5 endc EEADRp EQU 0x7F ;pomocná EE adresa MemW EQU 0x7E #define Stisk FL,0 ;minule stisknuto #define Znova FL,1 ;znova stisknuto #define PS FL,2 ;porucha snímače #define NM FL,3 ;neplatné měření #define Znam FL,4 ;znaménko 1=záporná teplota #define Z01 FL,5 ;Znak 0/1 #define Azn FL,6 ;znaménko A, 0=kladné 1=záporné #define Bzn FL,7 ;znaménko B, 0=kladné 1=záporné #define TlS KLVP,2 ;levé tlačítko SET #define TlM KLVP,3 ;prostřední tlačítko MÍNUS #define TlP KLVP,1 ;pravé tlačítko PLUS #define SMT PORTA,5 ;vstup pro teplotní čidlo #define RA0 PORTA,0 ;výstup A0 #define RA1 PORTA,1 ;výstup A1 #define RA2 PORTA,2 ;výstup A2 #define RA3 PORTA,3 ;výstup A3 #define RA4 PORTA,4 ;výstup A4 #define LM PORTB,0 ;LED Mínus ;************************************************* ORG 0x2100 ;tabulka dat v EEPROM de 0x00, 0x0A, 0x14, 0x1E, 0x28, 0x32, 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 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF de 0x29, 0x53, 0x28, 0x30, 0x31, 0x2E, 0x32, 0x30 de 0x30, 0x39, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ;************************************************* ;reset ORG 0 GOTO Init CALL 41 CALL 83 CALL 40 ;================================ ;přerušení MOVWF MemW MOVF STATUS,W CLRF STATUS MOVWF MemStat ;-------------------------------- BTFSS PIR1,TMR1IF ;od TMR1? GOTO ITMR0 ;NE ;................................ ;přerušení od přetečení TMR1 BCF PIR1,TMR1IF ;VYP příznak BSF PS ;ZAP porucha snímače BCF T1CON,TMR1ON ;stop časovač TMR1 CLRF PV ;vynulovat počet vzorků CLRW RETFIE ;-------------------------------- ITMR0 BTFSS INTCON,T0IF ;od TMR0? GOTO EINT ;NE ;................................ ;přerušení od časovače TMR0 122Hz (INTRC OSC 4MHz) BCF INTCON,T0IF ;VYP příznak BSF NM ;ZAP neplatné měření ;dělič pro blikání displeje INCF BLIK,F ;+1 ;dělič pro opakování KLV DECFSZ KLVO,F ;-1=0? GOTO $+2 BSF Znova ;=1 ;-------------------------------- ;obsluha displeje a klávesnice BCF PORTA,7 ;zhasnout displej BCF PORTA,6 ; ;................................ ;dělič pro klávesnici (122/5=24) DECFSZ KLVD,F ;-1=0? GOTO $+19 MOVLW 5 ;znovu MOVWF KLVD ; naplnit ;čtení klávesnice BSF STATUS,RP0 ;Banka1 MOVLW B'00001110' MOVWF TRISB ;1=vstup, 0=výstup BCF STATUS,RP0 ;Banka0 MOVF PORTB,W ;čtení MOVF PORTB,W ;čtení MOVF PORTB,W ;čtení MOVF PORTB,W ;čtení MOVF PORTB,W ;čtení MOVF PORTB,W ;čtení MOVF PORTB,W ;čtení ANDLW B'00001110' ;(1a1=1) MOVWF KLVP ;uložit BSF STATUS,RP0 ;Banka1 CLRF TRISB ;0=výstup BCF STATUS,RP0 ;Banka0 ;................................ MOVLW B'00000001' ;příprava ANDWF PORTB,F ; katod MOVF Znak0,W ;načíst Znak0 BTFSC Z01 ;Znak 0 nebo 1 MOVF Znak1,W ;načíst Znak1 CALL Znak ;převede číslo znaku na sedmisegmentový kód IORWF PORTB,F ;zapnout katody, ostatní bity neměnit ;zapnout anodu BTFSS Z01 BSF PORTA,6 BTFSC Z01 BSF PORTA,7 ;připravit příští anodu BTFSS Z01 GOTO $+3 BCF Z01 GOTO $+2 BSF Z01 ;-------------------------------- ;dělič pro Stop Regulace MOVF DeSR,F BTFSS STATUS,Z ;DeSR=0? INCF DeSR,F ;NE, +1 ;-------------------------------- ;dělič pro návrat na zobrazení teploty DECFSZ D122,F GOTO EINT MOVLW 122 MOVWF D122 MOVF DN,F BTFSS STATUS,Z DECF DN,F ;-------------------------------- ;konec přerušení EINT MOVF MemStat,W MOVWF STATUS SWAPF MemW,F SWAPF MemW,W RETFIE ;================================ Znak MOVWF PZnak SUBLW 0x26 ;26-PZnak MOVF PZnak,W ;původní znak BTFSS STATUS,C ;kladné? MOVLW 0x13 ;NE, nahradit znak ADDWF PCL,F ;k PC se přičte číslo znaku ; bagfedc ;Segment (0=svítí) RETLW B'00100000' ;0x00/0 RETLW B'01111100' ;0x01/1 RETLW B'00010010' ;0x02/2 RETLW B'00011000' ;0x03/3 RETLW B'01001100' ;0x04/4 RETLW B'10001000' ;0x05/5 RETLW B'10000000' ;0x06/6 RETLW B'00111100' ;0x07/7 RETLW B'00000000' ;0x08/8 RETLW B'00001000' ;0x09/9 RETLW B'00000100' ;0x0A/A RETLW B'11000000' ;0x0B/b RETLW B'10100010' ;0x0C/C RETLW B'01010000' ;0x0D/d RETLW B'10000010' ;0x0E/E RETLW B'10000110' ;0x0F/F RETLW B'01000100' ;0x10/H RETLW B'11110110' ;0x11/i RETLW B'01110000' ;0x12/J RETLW B'10011010' ;0x13/ (3x -) RETLW B'11100010' ;0x14/L RETLW B'00100100' ;0x15/M RETLW B'11010100' ;0x16/n RETLW B'11010000' ;0x17/o RETLW B'00000110' ;0x18/P RETLW B'11010110' ;0x19/r RETLW B'10001100' ;0x1A/S RETLW B'11000010' ;0x1B/t RETLW B'11110000' ;0x1C/u RETLW B'01100000' ;0x1D/V RETLW B'01001000' ;0x1E/Y RETLW B'11011110' ;0x1F/- RETLW B'11111110' ;0x20/ (zhasnuto) RETLW B'11011010' ;0x21/= RETLW B'01100100' ;0x22/II RETLW B'11010010' ;0x23/c RETLW B'00111000' ;0x24/) RETLW B'01011100' ;0x25/-1 RETLW B'00001110' ;0x26/° ;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM ;měření teploty MT MOVF PV,F BTFSS STATUS,Z ;PV=0? GOTO $+7 ;NE CLRF SH1 ;vynulovat SH CLRF SH2 ; CLRF SH3 ; CLRF SP1 ;vynulovat SP CLRF SP2 ; CLRF SP3 ; BCF PS ;VYP porucha snímače BCF NM ;VYP nové měření CLRF TMR1L ;vynulovat CLRF TMR1H ; časovač TMR1 BSF T1CON,TMR1ON ;start časovač TMR1 ;................................ ;měření signálu z SMT 160-30 ;čekání na nulu MOVLW 3 CLRWDT BTFSC SMT ;vstup=0? SUBWF PCL,F ;dva kroky zpět BTFSC PS ;porucha snímače? GOTO ES ;ANO ;čekání na jedničku CLRWDT BTFSS SMT ;vstup=1? SUBWF PCL,F ;dva kroky zpět ;start měření CLRF TMR1L ;vynulovat CLRF TMR1H ; časovač TMR1 BTFSC PS ;porucha snímače? GOTO ES ;ANO ;čekání na nulu CLRWDT BTFSC SMT ;vstup=0? SUBWF PCL,F ;dva kroky zpět ;uložit délku úrovně H MOVF TMR1H,W MOVWF A2 MOVF TMR1L,W MOVWF A1 MOVF TMR1H,W XORWF A2,W ;(st.=0),sZ=1 BTFSC STATUS,Z ;jiné? GOTO $+5 ;NE MOVF TMR1L,W MOVWF A1 MOVF TMR1H,W MOVWF A2 BTFSC PS ;porucha snímače? GOTO ES ;ANO ;čekání na jedničku MOVLW 3 CLRWDT BTFSS SMT ;vstup=1? SUBWF PCL,F ;dva kroky zpět ;uložit délku periody, konec měření BCF T1CON,TMR1ON ;stop časovač TMR1 MOVF TMR1L,W MOVWF D1 MOVF TMR1H,W MOVWF D2 BTFSC PS ;porucha snímače? GOTO ES ;ANO ;test neplatné měření BTFSC NM ;neplatné měření? GOTO MT ;ANO, znova měřit teplotu ;v A1,2 je délka úrovně H (H) ;v D1,2 je délka periody (P) ; ______ _____ ; ___| |________| ; ; |--H---| ; |--------P------| ;................................ ;součet vzorků/256 ;délka H; (H1,2+SH3,1,2)/256=SH1,2 MOVF A1,W ADDWF SH3,F ;A1+SH3=SH3 BTFSC STATUS,C ;nepřeteklo? INCF A2,F ;+1 MOVF A2,W ADDWF SH1,F ;A2+SH1=SH1 BTFSC STATUS,C ;nepřeteklo? INCF SH2,F ;+1 ;délka P; (P1,2+SP3,1,2)/256=SP1,2 MOVF D1,W ADDWF SP3,F ;D1+SP3=SP3 BTFSC STATUS,C ;nepřeteklo? INCF D2,F ;+1 MOVF D2,W ADDWF SP1,F ;D2+SP1=SP1 BTFSC STATUS,C ;nepřeteklo? INCF SP2,F ;+1 ;počet vzorků +1 INCFSZ PV,F ;+1=0? RETURN ;NE, další vzorky příště ;-------------------------------- ;výpočet teploty ;v SH1,2 je průměrná délka úrovně H (H) ;v SP1,2 je průměrná délka periody (P) ;příprava MOVF SH1,W ;SH1,2 do C1,2 MOVWF C1 ; MOVF SH2,W ; MOVWF C2 ; MOVF SP1,W ;SP1,2 do B1,2 MOVWF B1 ; MOVF SP2,W ; MOVWF B2 ; ;vzorec H*2128/P-681 = A1,2 [°C*10] ;H*2128=A CALL x2128 ;C1,2 * 2128 = A1,2,3 ;A/P=C CLRF B3 CALL LOMENO24 ;A1,2,3 / B1,2,3 = C1,2,3 ;C-681=A ; MOVLW 0xA9 ;681=0x02A9 MOVLW 0xB8 ;696=0x02B8 (korekce) SUBWF C1,W ;C1-A9 MOVWF A1 ; =A1 BTFSS STATUS,C ;kladné? DECF C2,F ;-1 MOVLW 0x02 SUBWF C2,W ;C2-02 MOVWF A2 ; =A2 ;................................ ;Diference, odstraní chvění na nejnižších bitech. ;VSTUP: A1,2=nová hodnota, T1,2=stará hodnota ;VYSTUP: T1,2=výsledek DIF ;A - B = C MOVF T1,W SUBWF A1,W ;A1-B1=W MOVWF C1 ;uložit MOVF T2,W BTFSS STATUS,C ;kladné? ADDLW 1 ;B2+1=W SUBWF A2,W ;A2-B2=W MOVWF C2 ;uložit ;C2 = nenulové? (AB+255) ; MOVF C2,F BTFSS STATUS,Z ;C2=0? GOTO ADT ;NE, nová hodnota z A ;C1 > 10? (A>B+10) MOVF C1,W SUBLW 20 ;10-C1 BTFSS STATUS,C ;kladné? GOTO ADT ;NE, nová hodnota z A ;C1 <= 4? (A<=B+4) MOVF C1,W SUBLW 9 ;4-C1 BTFSC STATUS,C ;záporné? GOTO T10 ;NE, stará hodnota z T ;C1 > 4 (A>B+4) INCFSZ T1,F ;stará hodnota T+1 GOTO T10 ; INCF T2,F ; GOTO T10 ; ADT MOVF A1,W ;přesun nové hodnoty A do T MOVWF T1 ; MOVF A2,W ; MOVWF T2 ; ;-------------------------------- ;teplota T1,2/10=TEP T10 MOVF T1,W MOVWF A1 MOVF T2,W MOVWF A2 CLRF A3 BTFSC A2,7 DECF A3,F MOVLW 10 MOVWF B1 CLRF B2 CLRF B3 CALL LOMENO MOVF C1,W MOVWF TEP ;Stop Regulace MOVF DeSR,F BTFSC STATUS,Z ;DeSR=0? GOTO PR ;ANO, reguluje se 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 ; ;-------------------------------- ;násobení konstantou 2128 ;pro výpočet teploty ze snímače SMT160-30 ; C1,2 * 2128 = A1,2,3 x2128 CLRF C3 CLRF A1 ;A=0 CLRF A2 ; CLRF A3 ; ;16+64+2048=2128 MOVLW 4 ;4x CALL x2W ; posuv vlevo C =A MOVLW 2 ;2x CALL x2W ; posuv vlevo C =A MOVLW 5 ;5x ; CALL x2W ; posuv vlevo C =A ; RETURN ;C1,2,3 * 2^W = C1,2,3 + A1,2,3 = A1,2,3 x2W MOVWF X2 ;kolikrát BCF STATUS,C ;SC=0 RLF C1,F ;posuv vlevo RLF C2,F ; RLF C3,F ; DECFSZ X2,F ;-1=0? GOTO $-5 ;znova CPA MOVF C1,W ;součet ADDWF A1,F ;C1+A1=A1 BTFSS STATUS,C ;přeteklo? GOTO $+4 INCFSZ A2,F ;+1=0? GOTO $+2 INCF A3,F ;+1 MOVF C2,W ADDWF A2,F ;C2+A2=A2 BTFSC STATUS,C ;nepřeteklo? INCF A3,F ;+1 MOVF C3,W ADDWF A3,F ;C3+A3=A3 RETURN ;-------------------------------- ;Mez + 1 (MAX 99) MP MOVWF A1 DECF A1,F BTFSS A1,7 ;záporné? GOTO $+7 ;NE MOVLW 0xD3 ;-45 SUBWF A1,W ;A1-W BTFSC STATUS,C ;záporné? GOTO $+3 ;NE MOVLW 0x63 ;99 RETURN MOVF A1,W RETURN ;-------------------------------- ;Mez - 1 (MIN -45) MM MOVWF A1 INCF A1,F BTFSC A1,7 ;kladné? GOTO $-5 ;NE MOVF A1,W SUBLW 0x63 ;99-A1 BTFSC STATUS,C ;záporné? GOTO $-9 ;NE MOVLW 0xD3 ;-45 RETURN ;-------------------------------- ;Hex z W převede na Dec do Znak0,1 (zobrazení teploty) HEXDEC MOVWF A1 ;upravit záporné číslo BCF Znam BTFSS A1,7 ;=1? GOTO $+4 BSF Znam ;=1, záporné COMF A1,F INCF A1,F ;+1=0? ;převod MOVLW 10 MOVWF B1 CLRF A2 CLRF A3 CLRF B2 CLRF B3 CALL LOMENO24 MOVF A1,W MOVWF Znak1 BTFSC Znam ;kladný znak? GOTO $+7 ;NE ;kladný znak BCF LM ;VYP MOVF C1,W BTFSC STATUS,Z MOVLW 0x20 ;nezobrazovat nulu MOVWF Znak0 RETURN ;záporný znak MOVF C1,W BTFSC STATUS,Z GOTO $+3 BSF LM ;ZAP GOTO $+3 BCF LM ;VYP MOVLW 0x1F ;znak mínus MOVWF Znak0 RETURN ;================================ ;test něco stisknuto? TNS CLRWDT MOVF KLVP,W ANDLW B'00001110' XORLW B'00001110' ;(st.=0) BTFSS STATUS,Z ;nic? GOTO TNS ;něco RETURN ;-------------------------------- KLVM CLRWDT CALL MT ;nejdřív měření teploty ;test KLV + opakovaní, sZ=0=něco stisknuto, 1=žádné tlačítko KLV CLRWDT MOVF KLVP,W ANDLW B'00001110' XORLW B'00001110' ;(st.=0) BTFSS STATUS,Z ;=1?, nenulové? (žádné tlačítko) GOTO Neco ;něco stisknuto BCF Stisk ;=0 BSF Znova ;=1 RETURN Neco MOVLW 30 ;30 sekund MOVWF DN ; pro mávrat na zobrazení teploty BTFSC TlS ;stisknuto TlS? CLRF BLIK ;NE, nulovat BSF STATUS,Z ;=1 BTFSS Znova ;=1? odčasováno? RETURN ;NE, jako žádné tl. MOVLW 10 ;kratší čas (0.1s) BTFSS Stisk ;minule stisknuto? MOVLW 100 ;delší čas (1s) MOVWF KLVO ;nastavit časovač pro opakování BTFSS TlS ;stisknuto TlS? CLRF KLVO ;ANO, MAX čas (2.5s) BCF Znova ;=0 BSF Stisk ;=1 BCF STATUS,Z ;=0 RETURN ;================================ ;čtení EEPROM, adresu do EEADRp, vrátí data v W ERead BSF STATUS,RP0 ;Banka1 MOVF EEADRp,W MOVWF EEADR ;adresa BSF EECON1,RD ;čtení MOVF EEDATA,W BCF STATUS,RP0 ;Banka0 RETURN ;-------------------------------- ;zápis do EEPROM, adresu do EEADRp, data do W EWrite CLRWDT BCF INTCON,GIE ;zakázat přerušení BSF STATUS,RP0 ;Banka1 BTFSC EECON1,WR ;čekání na dokončení GOTO $-1 ;předchozího zápisu MOVWF EEDATA ;data MOVF EEADRp,W MOVWF EEADR ;adresa BSF EECON1,WREN ;zápis povolen MOVLW 0x55 ;úvodní MOVWF EECON2 ; sekvence MOVLW 0xAA ; MOVWF EECON2 ; BSF EECON1,WR ;zápis BCF EECON1,WREN ;zápis zákázán BCF STATUS,RP0 ;Banka0 BSF INTCON,GIE ;povolit přerušení RETURN ;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ;iniciace Init MOVLW 0x07 ;OFF MOVWF CMCON ; Comparators ;obnovení RAM z EEPROM 0x00-0x05 CLRF EEADRp ;počáteční adresa EEPROM MOVLW M0 ;počáteční adresa RAM MOVWF FSR CALL ERead ;čtení MOVWF INDF ;zápis INCF EEADRp,F ;adresa+1 INCF FSR,F ;data+1 MOVF EEADRp,W SUBLW 0x05 ;poslední adresa EEPROM BTFSC STATUS,C ;záporné? GOTO $-7 ;NE ;základní nastevení BSF STATUS,RP0 ;Banka1 MOVLW B'00100000' ;PORTA výstup mimo A5 MOVWF TRISA ; CLRF TRISB ;PORTB výstup MOVLW B'01000100' ;předdělič 1:32 pro TMR0 MOVWF OPTION_REG ; MOVLW B'00000001' ;přerušení od TMR1 MOVWF PIE1 ; BCF STATUS,RP0 ;Banka0 MOVLW B'10100000' ;přerušení od TMR0 MOVWF INTCON ; MOVLW B'00000101' ;předdělič 1:1 pro TMR1 MOVWF T1CON ; CLRF FL ;nulovat CLRF PV ; MOVLW 1 MOVWF DeSR BCF RA0 BCF RA1 BCF RA2 BCF RA3 BCF RA4 INT MOVLW 255 ;návrat na teplotu MOVWF KLVD ; CLRF KLVP ; ;******************************** ;nadpis [°C] teplota NT BCF LM ;VYP MOVLW 0x26 ;° MOVWF Znak0 MOVLW 0x0C ;C MOVWF Znak1 CALL TNS ;test neco stisknuto? ;zobrazit teplotu ZT BTFSS PS ;porucha snímače? GOTO $+6 MOVLW 0x0E MOVWF Znak0 MOVLW 0x19 MOVWF Znak1 GOTO $+3 MOVF TEP,W ;zobrazit CALL HEXDEC ; teplotu CALL KLVM ;KLV test + Měření BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO ZT ;NE BTFSS TlS ;stisknuto? GOTO NT ;ANO BTFSS TlM ;stisknuto? GOTO NM5 ;ANO, na konec ;-------------------------------- ;nadpis [M0] Mez0 NM0 BCF LM ;VYP MOVLW 0x15 ;M MOVWF Znak0 MOVLW 0x00 ;0 MOVWF Znak1 CALL TNS ;test neco stisknuto? ;zobrazit M0 ZM0 MOVF DN,F ;návrat na teplotu BTFSC STATUS,Z ; GOTO INT ; MOVF M0,W ;zobrazit CALL HEXDEC ; mez CALL KLVM ;test KLV + M BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO ZM0 ;NE BTFSS TlM ;stisknuto? GOTO NT ;ANO BTFSS TlP ;stisknuto? GOTO NM1 ;ANO BCF LM ;VYP MOVLW 0x15 ;M MOVWF Znak0 MOVLW 0x00 ;0 MOVWF Znak1 ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? GOTO ZM0 ;NE BTFSS Znova ;odcasovano? GOTO $-4 ;NE BCF Znova ;nulovat ;Vložit dolní Mez0 EM0 BTFSS BLIK,4 GOTO $+6 MOVLW 0x20 ;VYP MOVWF Znak0 ; displej MOVWF Znak1 ; BCF LM ; GOTO $+3 MOVF M0,W ;zobrazit CALL HEXDEC ; mez CALL KLVM BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO EM0 ;NE BTFSS TlS ;stisknuto? GOTO SM0 ;ANO BTFSS TlP ;stisknuto? GOTO M0P ;ANO ;Mez0 -1 MOVF M0,W CALL MP MOVWF M0 GOTO EM0 ;Mez0 +1 M0P MOVF M0,W CALL MM GOTO $-4 ;uložit do EEPROM SM0 CLRF EEADRp MOVF M0,W CALL EWrite GOTO NM0 ;-------------------------------- ;nadpis [M1] Mez1 NM1 BCF LM ;VYP MOVLW 0x15 ;M MOVWF Znak0 MOVLW 0x01 ;1 MOVWF Znak1 CALL TNS ;test neco stisknuto? ;zobrazit M1 ZM1 MOVF DN,F ;návrat na teplotu BTFSC STATUS,Z ; GOTO INT ; MOVF M1,W CALL HEXDEC CALL KLVM ;test KLV + M BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO ZM1 ;NE BTFSS TlM ;stisknuto? GOTO NM0 ;ANO BTFSS TlP ;stisknuto? GOTO NM2 ;ANO BCF LM ;VYP MOVLW 0x15 ;M MOVWF Znak0 MOVLW 0x01 ;1 MOVWF Znak1 ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? GOTO ZM1 ;NE BTFSS Znova ;odcasovano? GOTO $-4 ;NE BCF Znova ;nulovat ;Vložit dolní Mez1 EM1 BTFSS BLIK,4 GOTO $+6 MOVLW 0x20 ;VYP MOVWF Znak0 ; displej MOVWF Znak1 ; BCF LM ; GOTO $+3 MOVF M1,W CALL HEXDEC CALL KLVM BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO EM1 ;NE BTFSS TlS ;stisknuto? GOTO SM1 ;ANO BTFSS TlP ;stisknuto? GOTO M1P ;ANO ;Mez1 -1 MOVF M1,W CALL MP MOVWF M1 GOTO EM1 ;Mez1 +1 M1P MOVF M1,W CALL MM GOTO $-4 ;uložit do EEPROM SM1 MOVLW 1 MOVWF EEADRp MOVF M1,W CALL EWrite GOTO NM1 ;-------------------------------- ;nadpis [M2] Mez2 NM2 BCF LM ;VYP MOVLW 0x15 ;M MOVWF Znak0 MOVLW 0x02 ;2 MOVWF Znak1 CALL TNS ;test neco stisknuto? ;zobrazit M2 ZM2 MOVF DN,F ;návrat na teplotu BTFSC STATUS,Z ; GOTO INT ; MOVF M2,W CALL HEXDEC CALL KLVM ;test KLV + M BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO ZM2 ;NE BTFSS TlM ;stisknuto? GOTO NM1 ;ANO BTFSS TlP ;stisknuto? GOTO NM3 ;ANO BCF LM ;VYP MOVLW 0x15 ;M MOVWF Znak0 MOVLW 0x02 ;2 MOVWF Znak1 ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? GOTO ZM2 ;NE BTFSS Znova ;odcasovano? GOTO $-4 ;NE BCF Znova ;nulovat ;Vložit dolní Mez2 EM2 BTFSS BLIK,4 GOTO $+6 MOVLW 0x20 ;VYP MOVWF Znak0 ; displej MOVWF Znak1 ; BCF LM ; GOTO $+3 MOVF M2,W CALL HEXDEC CALL KLVM BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO EM2 ;NE BTFSS TlS ;stisknuto? GOTO SM2 ;ANO BTFSS TlP ;stisknuto? GOTO M2P ;ANO ;Mez2 -1 MOVF M2,W CALL MP MOVWF M2 GOTO EM2 ;Mez2 +1 M2P MOVF M2,W CALL MM GOTO $-4 ;uložit do EEPROM SM2 MOVLW 2 MOVWF EEADRp MOVF M2,W CALL EWrite GOTO NM2 ;-------------------------------- ;nadpis [M3] Mez3 NM3 BCF LM ;VYP MOVLW 0x15 ;M MOVWF Znak0 MOVLW 0x03 ;3 MOVWF Znak1 CALL TNS ;test neco stisknuto? ;zobrazit M3 ZM3 MOVF DN,F ;návrat na teplotu BTFSC STATUS,Z ; GOTO INT ; MOVF M3,W CALL HEXDEC CALL KLVM ;test KLV + M BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO ZM3 ;NE BTFSS TlM ;stisknuto? GOTO NM2 ;ANO BTFSS TlP ;stisknuto? GOTO NM4 ;ANO BCF LM ;VYP MOVLW 0x15 ;M MOVWF Znak0 MOVLW 0x03 ;3 MOVWF Znak1 ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? GOTO ZM3 ;NE BTFSS Znova ;odcasovano? GOTO $-4 ;NE BCF Znova ;nulovat ;Vložit dolní Mez3 EM3 BTFSS BLIK,4 GOTO $+6 MOVLW 0x20 ;VYP MOVWF Znak0 ; displej MOVWF Znak1 ; BCF LM ; GOTO $+3 MOVF M3,W CALL HEXDEC CALL KLVM BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO EM3 ;NE BTFSS TlS ;stisknuto? GOTO SM3 ;ANO BTFSS TlP ;stisknuto? GOTO M3P ;ANO ;Mez3 -1 MOVF M3,W CALL MP MOVWF M3 GOTO EM3 ;Mez3 +1 M3P MOVF M3,W CALL MM GOTO $-4 ;uložit do EEPROM SM3 MOVLW 3 MOVWF EEADRp MOVF M3,W CALL EWrite GOTO NM3 ;-------------------------------- ;nadpis [M4] Mez4 NM4 BCF LM ;VYP MOVLW 0x15 ;M MOVWF Znak0 MOVLW 0x04 ;4 MOVWF Znak1 CALL TNS ;test neco stisknuto? ;zobrazit M4 ZM4 MOVF DN,F ;návrat na teplotu BTFSC STATUS,Z ; GOTO INT ; MOVF M4,W CALL HEXDEC CALL KLVM ;test KLV + M BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO ZM4 ;NE BTFSS TlM ;stisknuto? GOTO NM3 ;ANO BTFSS TlP ;stisknuto? GOTO NM5 ;ANO BCF LM ;VYP MOVLW 0x15 ;M MOVWF Znak0 MOVLW 0x04 ;4 MOVWF Znak1 ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? GOTO ZM4 ;NE BTFSS Znova ;odcasovano? GOTO $-4 ;NE BCF Znova ;nulovat ;Vložit dolní Mez4 EM4 BTFSS BLIK,4 GOTO $+6 MOVLW 0x20 ;VYP MOVWF Znak0 ; displej MOVWF Znak1 ; BCF LM ; GOTO $+3 MOVF M4,W CALL HEXDEC CALL KLVM BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO EM4 ;NE BTFSS TlS ;stisknuto? GOTO SM4 ;ANO BTFSS TlP ;stisknuto? GOTO M4P ;ANO ;Mez4 -1 MOVF M4,W CALL MP MOVWF M4 GOTO EM4 ;Mez4 +1 M4P MOVF M4,W CALL MM GOTO $-4 ;uložit do EEPROM SM4 MOVLW 4 MOVWF EEADRp MOVF M4,W CALL EWrite GOTO NM4 ;-------------------------------- ;nadpis [M5] Mez5 NM5 BCF LM ;VYP MOVLW 0x15 ;M MOVWF Znak0 MOVLW 0x05 ;5 MOVWF Znak1 CALL TNS ;test neco stisknuto? ;zobrazit M5 ZM5 MOVF DN,F ;návrat na teplotu BTFSC STATUS,Z ; GOTO INT ; MOVF M5,W CALL HEXDEC CALL KLVM ;test KLV + M BTFSC STATUS,Z ;Z=0? neco stisknuto GOTO ZM5 ;NE BTFSS TlM ;stisknuto? GOTO NM4 ;ANO BTFSS TlP ;stisknuto? GOTO NT ;ANO BCF LM ;VYP MOVLW 0x15 ;M MOVWF Znak0 MOVLW 0x05 ;5 MOVWF Znak1 ;pauza pro S CLRWDT BTFSC TlS ;stisknuto? GOTO ZM5 ;NE BTFSS Znova ;odcasovano? GOTO $-4 ;NE BCF Znova ;nulovat ;Vložit dolní Mez5 EM5 BTFSS BLIK,4 GOTO $+6 MOVLW 0x20 ;VYP MOVWF Znak0 ; displej MOVWF Znak1 ; BCF LM ; GOTO $+3 MOVF M5,W CALL HEXDEC CALL KLVM BTFSC STATUS,Z ;Z=0? neco stisknuto? GOTO EM5 ;NE BTFSS TlS ;stisknuto? GOTO SM5 ;ANO BTFSS TlP ;stisknuto? GOTO M5P ;ANO ;Mez5 -1 MOVF M5,W CALL MP MOVWF M5 GOTO EM5 ;Mez5 +1 M5P MOVF M5,W CALL MM GOTO $-4 ;uložit do EEPROM SM5 MOVLW 5 MOVWF EEADRp MOVF M5,W CALL EWrite GOTO NM5 ;================================ ;Test, porovnat hodnoty A,B ;výsledek ovlivní STATUS,C ;A <= B SC=0 ;B => A SC=0 ;A > B SC=1 ;B < A SC=1 TEST ;porovnat znaménka MOVF A1,W XORWF B1,W ;(stejné=0) ANDLW B'10000000' ;(1a1=1) RLF B1,W ;vlevo(SC=MSB) BTFSS STATUS,Z ;stejné znaménka? (SZ=1) RETURN ;NE ;A-B ;ANO MOVF B1,W SUBWF A1,W ;A-B; SC=0=záporný výsledek BTFSC STATUS,Z ;nenulové? BCF STATUS,C ;SC=0 (A=B) jako záporné RETURN ;EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ;Nastavení výstupů při poruše snímače ES ; BCF RA0 ;výstup A0=0 ; BSF RA0 ;výstup A0=1 ; BCF RA1 ;výstup A1=0 ; BSF RA1 ;výstup A1=1 ; BCF RA2 ;výstup A2=0 ; BSF RA2 ;výstup A2=1 ; BCF RA3 ;výstup A3=0 ; BSF RA3 ;výstup A3=1 ; BCF RA4 ;výstup A4=0 ; BSF RA4 ;výstup A4=1 RETURN ;RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR ;Program Regulace PR ;A0=1 při, teplota < Mez0 ;A0=0 při, teplota => Mez0 MOVF TEP,W MOVWF B1 MOVF M0,W MOVWF A1 CALL TEST ;B Mez1 MOVF TEP,W MOVWF B1 MOVF M1,W MOVWF A1 CALL TEST ;B Mez2 MOVF TEP,W MOVWF B1 MOVF M2,W MOVWF A1 CALL TEST ;B Mez3 MOVF TEP,W MOVWF B1 MOVF M3,W MOVWF A1 CALL TEST ;B Mez5 MOVF TEP,W MOVWF B1 MOVF M5,W MOVWF A1 CALL TEST ;B=>A (SC=0) BTFSS STATUS,C BCF RA4 ;A4=0 RETURN ;-------------------------------- END