;-------------------------------; ; READ ROM 1-Wire ; ;-------------------------------; ; načte identifikační kód (ID) ; ; jednoho DS obvodu ; ;-------------------------------; ;)S(2017.06 slovak@post.cz; ;-------------------------------; ; ;LED displej 3 místa, společné anody. ; ;zobrazení na displeji: ;1. famili ;2-7. sériové číslo ;8. CRC ; ;Mikroprocesor PIC 16F1847 ;RB7 Katoda f ;RB6 Katoda a ;RB5 Anoda A1 (znak vlevo) ;RB4 (nevyužito) ;RB3 vstup/výstup sběrnice 1-Wire ;RB2 Katoda e ;RB1 Katoda d ;RB0 Katoda T ; ;RA7 Anoda A3 (znak vpravo) ;RA6 Anoda A2 (znak střední) ;RA5 (nevyužito) ;RA4 Katoda g ;RA3 (nevyužito) ;RA2 Katoda c ;RA1 (nevyužito) ;RA0 Katoda b ; ;POZOR, lze připojit pouze jeden senzor ;Napájení senzorů DS18B20, externí/parazitní ;/"""|-----3 +5V ;|DS |-----2 1-wire ;\___|-----1 GND ; ;-------------------------------- LIST P=16F1847, R=DEC, MM=ON ;Direktivy překladače include ;Definice názvů registrů ;Nastavení konfigurace procesoru: __CONFIG _CONFIG1,_CP_OFF & _CPD_OFF & _WDTE_ON & _MCLRE_OFF & _FOSC_INTOSC & _CLKOUTEN_OFF & _PWRTE_ON & _BOREN_ON & _IESO_OFF & _FCMEN_OFF __CONFIG _CONFIG2,_WRT_OFF & _LVP_ON & _BORV_LO & _STVREN_OFF & _PLLEN_OFF errorlevel 1, -306 cblock 0x20 A1 C1,C2 D1,D2 FL ;Flag, příznaky T_RDS ;data, 1-Wire CRC ;kontrolní součet 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) endc cblock 0xA0 PAUZA ;pro zobrazeni kodu endc #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 ERS FL,2 ;1=ERROR senzor (po RESET/PRESENCE/CONVERT) #define ERX FL,1 ;1=ERROR některého senzoru #define OZS FL,0 ;1=opakovat zpozdění pro TlS ;číslo znaku #define . 128 ;tečka #define zA 10 ;znak A #define zb 11 #define zC 12 #define zd 13 #define zE 14 #define zF 15 #define zG 16 #define zH 17 #define zi 18 #define zJ 19 #define zk 20 #define zL 21 #define zM 22 #define zn 23 #define zo 24 #define zP 25 #define zr 26 #define zS 27 ;(segment a,c,f,g) #define zt 28 #define zu 29 #define zV 30 #define zY 31 #define sp 32 ;space #define zm1 33 ;-1 (segment b,c,g) #define zhm 34 ;(segment a) #define zmi 35 ;- #define z_ 36 ;znak podtržítko (segment d) #define zro 37 ;= (segment d,g) #define z3m 38 ;3x - (segment a,d,g) #define zst 39 ;° #define zc 40 #define zpz 41 ;) #define zII 42 ;(segment b,c,e,f) ;RAM Banka 0 (000-07F) BANK0 macro MOVLB 0 endm ;RAM Banka 1 (080-0FF) BANK1 macro MOVLB 1 endm ;RAM Banka 2 (100-17F) BANK2 macro MOVLB 2 endm ;RAM Banka 3 (180-1FF) BANK3 macro MOVLB 3 endm ;RAM Banka 4 (200-2FF) BANK4 macro MOVLB 4 endm ;******************************** ;reset ORG 0 GOTO Init CALL 41 CALL 83 CALL 40 ;------------------------------- ;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 ;zapnout Katody podle DIS v ukazovátku FSR (0=Znak1, 1=Znak2, 2=Znak3) 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 ;počítadlo, PAUZA BANK1 MOVF PAUZA,F BTFSS SZ ;PAUZA=0?, SZ=1? DECF PAUZA,F ;-1 BANK0 ;další displej (příští Anoda) INCF DIS,F ;+1 MOVF DIS,W SUBLW 2 ;2-DIS BTFSS SC ;záporné? CLRF DIS ;ANO, nulovat ;-------------------------------- ;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 45 ;45-W (MAX číslo znaku) MOVF INDF0,W ;obnovit číslo znaku ANDLW B'01111111' ; BTFSS SC ;záporné? (odečet 45-W) MOVLW 36 ;ANO, nahradit znak BRW ;W+PC ;Segmenty(0=svítí)fa_gcedb RETLW B'00110000' ;0/0 RETLW B'11110110' ;1/1 RETLW B'10101000' ;2/2 RETLW B'10100100' ;3/3 RETLW B'01100110' ;4/4 RETLW B'00100101' ;5/5 RETLW B'00100001' ;6/6 RETLW B'10110110' ;7/7 RETLW B'00100000' ;8/8 RETLW B'00100100' ;9/9 RETLW B'00100010' ;10/A RETLW B'01100001' ;11/b RETLW B'00111001' ;12/C RETLW B'11100000' ;13/d RETLW B'00101001' ;14/E RETLW B'00101011' ;15/F RETLW B'00110001' ;16/G RETLW B'01100010' ;17/H RETLW B'11111011' ;18/i RETLW B'11110000' ;19/J RETLW B'01101011' ;20/k RETLW B'01111001' ;21/L RETLW B'00110010' ;22/M RETLW B'11100011' ;23/n RETLW B'11100001' ;24/o RETLW B'00101010' ;25/P RETLW B'11101011' ;26/r RETLW B'00100111' ;27/S RETLW B'01101001' ;28/t RETLW B'11110001' ;29/u RETLW B'01110000' ;30/V RETLW B'01100100' ;31/Y RETLW B'11111111' ;32/ (zhasnuto) RETLW B'11100110' ;33/-1 RETLW B'10111111' ;34/ (segment a) RETLW B'11101111' ;35/- RETLW B'11111101' ;36/_ RETLW B'11101101' ;37/= RETLW B'10101101' ;38/ (segment a,d,g) RETLW B'00101110' ;39/° RETLW B'11101001' ;40/c RETLW B'10110100' ;41/) RETLW B'01110010' ;42/II RETLW B'11111101' ;43/_ RETLW B'11111101' ;44/_ RETLW B'11111101' ;45/_ ;-------------------------------- ;vybere Anodu (1=svítí) Anoda BANK0 MOVF DIS,W BANK2 ANDLW B'00000011' BRW ;W+PC RETLW B'00100000' ;DIS=0, Znak1, A1, vlevo RETLW B'01000000' ;DIS=1, Znak2, A2, střed RETLW B'10000000' ;DIS=2, Znak3, A3, vpravo RETLW B'00100000' ;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW ;pauza 1s C1s BANK1 MOVLW 255 MOVWF PAUZA C1s_2 CLRWDT MOVF PAUZA,F BTFSS SZ ;PAUZA=0?, SZ=1? GOTO C1s_2 BANK0 RETURN ;-------------------------------- ;č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 ;================================ ;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 ; RESO BCF ERS ;nulovat ERROR senzor BCF INTCON,GIE ;RESET BANK2 BCF DS ;(LAT) BANK1 ;Banka 1 BCF DS ;=OUT, DS=0 (TRIS) BANK0 ;Banka 0 CALL C480 BANK1 ;Banka 1 BSF DS ;=IN, DS=1 (TRIS) BANK0 ;Banka 0 CALL C60 ;PRESENCE pulz BTFSC DS ;=0? PRESENCE? (PORT) BSF ERS ;NE, nastavit ERROR CALL C405 BSF INTCON,GIE ;ERROR test BTFSS ERS ;=0? v pořádku? RETURN ;ANO DECFSZ A1,F ;-1=0? BRA RESO ;NE, opakovat RESET RETURN ;ERROR RESET/PRESENCE (ERS=1) ;-------------------------------- ;READ 1-Wire rdds MOVLW 8 ;počet bitů MOVWF D2 ; BCF INTCON,GIE ;načte data z DS do T_RDS BANK2 BCF DS ;(LAT) rdds1 BANK1 ;Banka 1 BCF DS ;=OUT, DS=0 (TRIS) BRA $+1 ;čekat 5us BRA $+1 ; NOP ; BSF DS ;=IN, DS=1 (TRIS) BANK0 ;Banka 0 CALL C12 ;čekat 14us BRA $+1 ; ;datový bit do SC BCF SC ;Log.0 BTFSC DS ;=1? (PORT) BSF SC ;ANO, Log.1 RRF T_RDS,F ;SC->T_RDS CALL C40 DECFSZ D2,F ;-1=0? BRA rdds1 ;NE BSF INTCON,GIE MOVF T_RDS,W RETURN ;................................ ;načte 2 bity z DS do T_RDS,7,6 ;RDDS2 CLRF T_RDS ; MOVLW 2 ; BRA rdds+1 ;-------------------------------- ;WRITE 1-Wire wrds MOVWF T_RDS MOVLW 8 ;počet bitů MOVWF D2 ; BCF INTCON,GIE ;odeslat data z T_RDS do DS BANK2 BCF DS ;(LAT) BANK0 wrds1 RRF T_RDS,F ;->SC BANK1 ;Banka 1 BCF DS ;=OUT, DS=0 (TRIS) BANK0 ;Banka 0 BTFSS SC ;=1? ;poslat nulu CALL C60 ;NE BRA $+1 ;čekat 2us ;poslat jedničku BANK1 ;Banka 1 BSF DS ;=IN, DS=1 (TRIS) BANK0 ;Banka 0 BTFSC SC ;=0? CALL C60 ;NE CALL C12 DECFSZ D2,F ;-1=0? BRA wrds1 ;NE BSF INTCON,GIE RETURN ;................................ ;odeslat bit0 z T_RDS do DS ;WRDS1 MOVLW 1 ; BRA wrds+2 ;-------------------------------- ;výpočet CRC ;vypcrc MOVF T_RDS,W ;kopírovat ; MOVWF D1 ; ; MOVLW 8 ;počte bitů ; MOVWF D2 ; ; ;vypcr0 RRF D1,F ;->SC ; BTFSC SC ;=0? ; BRA vypcr3 ;NE ; BTFSC CRC,7 ;bit7=0? ; BRA vypcr4 ;NE ;vypcr1 BCF SC ; RLF CRC,F ;<-SC ;vypcr2 DECFSZ D2,F ;-1=0? ; BRA vypcr0 ;NE ; RETURN ; ;vypcr3 BTFSC CRC,7 ;bit7=0? ; BRA vypcr1 ;NE ;vypcr4 MOVLW B'00011000' ; XORWF CRC,F ;(st.=0) ; BSF SC ; RLF CRC,F ;<-SC ; BRA vypcr2 ;-------------------------------- ;zobrazit bajt ZB MOVWF Znak1 ;číslo bajtu (1-8) CALL rdds ;načte bajt z DS do T_RDS SWAPF T_RDS,W ANDLW B'00001111' MOVWF Znak2 MOVF T_RDS,W ANDLW B'00001111' MOVWF Znak3 ;pauza GOTO C1s ;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII Init ;základní nastavení procesoru BANK4 MOVLW B'11111111' ;Pull-up na RA5 MOVWF WPUA ; MOVLW B'00000111' ;Pull-up na RB0-RB2 MOVWF WPUB BANK3 MOVLW B'11100000' ;0=Digt.I/O, 1=Analog vstup MOVWF ANSELA ; MOVLW B'00000001' ; MOVWF ANSELB ; BANK2 MOVLW B'01000000' ;ref.napětí OFF MOVWF FVRCON ; MOVLW B'01011010' ;D/A OFF MOVWF DACCON0 ; MOVLW B'11110111' ;D/A OFF MOVWF DACCON1 ; BANK1 MOVLW B'01101111' ;4MHz MOVWF OSCCON ; vnitřní oscilátor MOVLW B'00101010' ;PORTA, 0=výstup, 1=vstup MOVWF TRISA ; MOVLW B'00011000' ;PORTB, 0=výstup, 1=vstup MOVWF TRISB ; MOVLW B'01000011' ;předdělič 1:16 pro TMR0 MOVWF OPTION_REG ; MOVLW B'10000110' ;A/D OFF MOVWF ADCON0 ; MOVLW B'10101000' ;vpravo, Fosc/32, Vref-:GND, Vref+:Vdd (A/A VYP) MOVWF ADCON1 ; BANK0 MOVLW B'00100000' ;přerušení od TMR0 MOVWF INTCON ; ;-------------------------------; ; MENU ; ;-------------------------------; MENU ;zobrazit n.DS (není DS obvod) CLRWDT MOVLW zn+. ;n. MOVWF Znak1 MOVLW zd ;d MOVWF Znak2 MOVLW zS ;S MOVWF Znak3 CALL resds ;RESET/PRESENCE ;ERROR test BTFSC ERS ;=0? v pořádku? GOTO MENU ;NE ;čtení ID kodu MOVLW 0x33 ;READ ROM CALL wrds ; ;zobrazit 1.ID MOVLW 1+. CALL ZB ;zobrazit bajt ;zobrazit 2.ID MOVLW 2+. CALL ZB ;zobrazit bajt ;zobrazit 3.ID MOVLW 3+. CALL ZB ;zobrazit bajt ;zobrazit 4.ID MOVLW 4+. CALL ZB ;zobrazit bajt ;zobrazit 5.ID MOVLW 5+. CALL ZB ;zobrazit bajt ;zobrazit 6.ID MOVLW 6+. CALL ZB ;zobrazit bajt ;zobrazit 7.ID MOVLW 7+. CALL ZB ;zobrazit bajt ;zobrazit 8.ID MOVLW 8+. CALL ZB ;zobrazit bajt GOTO MENU ;-------------------------------- END