;-------------------------------; ; 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 16F628A ;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=16F628A, R=DEC, MM=ON ;Direktivy překladače include ;Definice názvů registrů ;Nastavení konfigurace procesoru: __CONFIG _BODEN_ON & _BOREN_ON & _CP_OFF & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTOSC_OSC_NOCLKOUT errorlevel 1, -306 cblock 0x20 MemSTATUS MemPCLATH MemFSR PORTAS ;stínový PORTA 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 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 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 (00-7F) RAM0 macro BCF STATUS,RP0 endm ;RAM banka 1 (80-FF) RAM1 macro BSF STATUS,RP0 endm ;******************************** ;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 PORTAS,F ;VYP A2,3; nulovat Katody g,c,b MOVF PORTAS,W MOVWF PORTA MOVLW B'00011000' ANDWF PORTB,F ;nulovat Katody f,a,e,d,T ;počítadlo, PAUZA RAM1 MOVF PAUZA,F BTFSS SZ ;PAUZA=0?, SZ=1? DECF PAUZA,F ;-1 RAM0 ;................................ ;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 PORTAS,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 PORTAS,F ;(0a0=0) A2 nebo A3 MOVF PORTAS,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 ;-------------------------------- ;konec přerušení 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 45 ;45-W (MAX číslo znaku) MOVF INDF,W ;obnovit číslo znaku ANDLW B'01111111' ; BTFSS SC ;záporné? (odečet 45-W) MOVLW 36 ;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'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 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 ;pauza 1s C1s RAM1 MOVLW 255 MOVWF PAUZA C1s_2 CLRWDT MOVF PAUZA,F BTFSS SZ ;PAUZA=0?, SZ=1? GOTO C1s_2 RAM0 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 ;po Resetu odpoví DS Presence pulzem resds BCF DS ;nastavit ERROR test MOVLW 5 ;počet pokusů MOVWF A1 ; RESO BCF ERS ;nulovat ERROR BCF INTCON,GIE ;RESET 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 ERS ;NE, nastavit ERROR CALL C405 BSF INTCON,GIE ;ERROR test BTFSS ERS ;=0? v pořádku? RETURN ;ANO DECFSZ A1,F ;-1=0? GOTO RESO ;NE, opakovat RESET RETURN ;ERROR RESET/PRESENCE (ERPS=1) ;-------------------------------- ;načte bajt z DS do T_RDS rdds MOVLW 8 ;počet bitů MOVWF D2 ; BCF DS BCF INTCON,GIE 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 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 ; GOTO rdds+1 ; ;-------------------------------- ;odeslat bajt z T_RDS do DS wrds MOVWF T_RDS MOVLW 8 ;počet bitů MOVWF D2 ; BCF DS BCF INTCON,GIE 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 GOTO $+1 ;čekat 2us ;poslat jedničku RAM1 ;Banka 1 BSF DS ;=IN, DS=1 RAM0 ;Banka 0 BTFSC SC ;=0? CALL C60 ;NE CALL C12 DECFSZ D2,F ;-1=0? GOTO wrds1 ;NE BSF INTCON,GIE 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 ; ;-------------------------------- ;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 MOVLW 0x07 ;OFF MOVWF CMCON ; Comparators ;základní nastavení procesoru CLRF PORTA CLRF PORTB BSF STATUS,RP0 ;Banka1 MOVLW B'11111111' ;4MHz MOVWF PCON ; 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'00101010' ;PORTA, 0=výstup, 1=vstup MOVWF TRISA ; MOVLW B'00011000' ;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 ; ;povolit přerušení BSF INTCON,GIE ;-------------------------------; ; 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