;DS1820PC.inc ; ; Include-File fr das Auslesen des DS 1820 ; ; aber an PORT C ! ! ! ; UP fuer Zeitschleife von 10 usec -- __10usec movwf _time10us ; Zeit = 'W' * 10 usec __10usec1 nop nop nop nop nop nop nop decfsz _time10us,f ; herunterz„hlen und auf 0 berprfen goto __10usec1 ; sonst nochmal schleife return ;----------------UP INIT --------------------------- ;--- bzw presence - abfrage-------------------- _INIT ;call _PIN_HI call _PIN_LO ; resetpulse des Masters movlw d'75' ; 750 usec warten call __10usec ; call _PIN_HI ; hochsetzen und auf antwort warten movlw d'35' ; vorher noch 80usec warten call __10usec return ;----------------UP WAIT --------------------- ; -------- S T R O N G - P U L L - U P ------------- _WAIT movf _DATA_PIN,w ;lade w mit _DATA_PIN iorwf PORTC,f ; movwf PORTC ;setze PIN(_DATA_PIN) auf HI bank_1 ; w„hle Bank 1 comf _DATA_PIN,w andwf TRISC,f ; setze ein PIN als Ausgang bank_0 ;w„hle Bank 0 call __05s call __05s ; call _PIN_LO return ;----------------UP _PIN_HI ------------------------------------- ; _PIN_HI bank_1 ;W„hle Bank 1 movlw b'11111111' ; alle pins auf Eingang ; movf _DATA_PIN,w ; nur aktuellen Pin auf Eingang ; iorwf TRISC,f movwf TRISC ; und somit auf HI bank_0 ;W„hle Bank 0 return ;----------------UP _PIN_LO ------------------------------------- ; _PIN_LO comf _DATA_PIN,w movwf PORTC ;l”sche den DATAPIN ; andwf PORTC,f bank_1 ;W„hle Bank 1 ; andwf TRISC,f ;nur Data_PIN als Ausgang movwf TRISC ; setze Port C als Ausgang ; und somit auf LO bank_0 ;W„hle Bank 0 return ;-------------- UP _IN_BYTE ----------------------------------- ; _IN_BYTE movlw d'8' ; 8 Bits lesen movwf _N clrf _I_BYTE ; reg: _I_BYTE l”schen _INBYTE_1 Call _PIN_LO ; kurz low setzen Call _PIN_HI ;dann Hi nop nop nop ; und 7 usec warten nop nop nop nop nop nop nop nop movf PORTC,w ; lies Port A andwf _DATA_PIN,w ; erstes um rest zu löschen ; zweites überprüft andwf _DATA_PIN,w ; nur ein Pin ist interessant btfsc STATUS,Z ; ist es eine 1 (und somit Z=0) dann ; berspringe bcf STATUS,C ; setzte C auf 0 btfss STATUS,Z ;ist es eine 0 (Z=1) dann berspringe bsf STATUS,C ; setzte C auf 1 rrf _I_BYTE,f ; schiebe C in _I_BYTE(rechts) movlw d'7' Call __10usec ;warte 70 usec decfsz _N,f ; n„chstes Bit goto _INBYTE_1 ; wenn noch nicht alle gelesen movfw _I_BYTE ; Ergebnis ins W-reg return ;---------UP _OUT_BYTE ----------------------------------------- ; _OUT_BYTE movlw d'8' ; 8 Bits schreiben movwf _N _OUTBYTE1 nop nop nop ; Recover-Time nop ; von mind 10 usec nop ; aber nicht vor nop ; Strong Pull up nop nop nop nop rrf _O_BYTE,f ; rechts schieben zu C btfss STATUS,C ;Teste C- berspringe wenn 1 goto _OUT_0 goto _OUT_1 _OUTBYTE2 decfsz _N,f ;n„chstes Bit goto _OUTBYTE1 ; wenn noch nicht alle geschrieben return _OUT_0 call _PIN_LO ; setze auf lo movlw d'6' ; fr 60 usec call __10usec call _PIN_HI ; und danach wieder HI goto _OUTBYTE2 ; BIT fertig _OUT_1 call _PIN_LO ; setze auf lo call _PIN_HI ; und sofort auf HI movlw d'6' ; und warte jetzt 60 usec call __10usec goto _OUTBYTE2 ; BIT fertig