http://www.maxim-ic.com/appnotes.cfm...te_number/2420

auf deutsch,bitte schön

hoffe das es jetzt klappt [-o<

vielleicht tust du dir leichter wenn du s in Word kopierst..
also..

um das 1-wire protokoll als master zu bertreiben bruacht man nur 2 gpio zustände -> high und low. der folgende code erreicht diese 2 zustände. der pic 16f628 hat 2 gpio ports, porta und portb. beide können für die kommunikation verwendet werden aber in diesem beispiel wird portb verwendet. der folgende code nimmt an, das ein konstanter DQ im assembler code definiert wurde um anzuzeigen, welches bit in portb der 1wire pin ist. im code wird diese bit nummer DQ genannt. von außen muss dieser pin an eine betriebsspannung mit einem pullup widerstand angeschlossen werden.
OW_HIZ:MACRO
;Force the DQ line into a high impedance state.
BSF STATUS,RP0 ; wähle slot 1 im speicher
BSF TRISB, DQ ; setze DQ high
BCF STATUS,RP0 ; wähle slot 0 im speciher
ENDM

OW_LO:MACRO
;Force the DQ line to a logic low.
BCF STATUS,RP0 ; Select Bank 0 of data memory
BCF PORTB, DQ ; resette das DQ bit
BSF STATUS,RP0 ; Select Bank 1 of data memory
BCF TRISB, DQ ; setze DQ pin als ausgang
BCF STATUS,RP0 ; Select Bank 0 of data memory
ENDM

beide code teile sind als makros geschrieben. makros werden automatisch in den assembler code reinghaut indem man das makro aufruft. das bedeutet man muss den code nicht dauernd neu schreiben. das erste makro OW_HIZ zwingt die DQ line high zu gehen. erste schritt -> wähle slot 1 im speicher weil das TRISB register dort ist. dann wird der DQ ausgang auf high gesetzt in dem man das DQ bit im TRISB register setzt. die letzte zeile wechselt das ganze in den slot 0. die letzte zeile ist nicht notwendig aber es bedeutet, dass alle makros und funktions aufrufe den speicher in einem bekannten zustand lassen
das zweite makro OW_LO zwingt die DQ line low zu gehen. zuerst wird slot0 im speicher ausgewählt damit auf das PORTB register zugegriffen werden kann. das PORTB register ist das datenregister und beinhaltet die werte die auf die TRISB pins gelegt werden, wenn diese als ausgang definiert werden

das DQ bit von PORTB ist gelöscht/null gesetzt damit die Line auf low gezigen wird. schlussendliuch wird slot 1 vom speicher ausgewählt und das DQ bit des TRISB registers wird gelöscht/zurückgesetzt und wird somit zum ausgang. wie immer endet das makro mit dem slektieren von slot 0.


ein drittes makro namems WAIT ist dabei um verzögerungen für die 1-wire signalisierung zu produzieren. WAIT wird benutzt um verzögerungen zu erzeugen, die ein vielfaches von 5µs sind. das makro wir mit dem wert TIME in µs aufgerufen und der entsprechende verzögerung wird generiert. das makro berecvhnet einfach die anzahl von zeiten, wo ein 5µs verzögerung gebraucht wird und wiederholt sich dann in einer schelife mit WAIT5U. die routine WAIT5U wird in der nächsten abschnitt geziegt. für jede instruktion innerhalb von WAIT wird die zeit die gebraucht wird um das zu verarbeiten angeziegt um verständlich zu machen, wie die verzögerung erreicht wird.
WAIT:MACRO TIME
;Delay for TIME µs.
;Variable time must be in multiples of 5µs.
MOVLW (TIME/5) - 1 ;1µs to process
MOVWF TMP0 ;1µs to process
CALL WAIT5U ;2µs to process
ENDM


allgemeine 1-wire routinen:
das 1-wire timing protokoll enthält spezifische zeitliche beschränkungen die eingehaltren werden müssen um eine erfolgreiche kommunikation zu erzielen. um im erzeugen von besitmmten verzögerungen zu helfen gibt es die routine WAIT5U die 5µs verzögerungen erzeugt. diese routine wird hier gezeigt.
WAIT5U:
;This takes 5µs to complete
NOP ;1µs to process
NOP ;1µs to process
DECFSZ TMP0,F ;1µs if not zero or 2µs if zero
GOTO WAIT5U ;2µs to process
RETLW 0 ;2µs to process
wenn diese in verbindung mit dem WAIT makro verwendet werden können einfache verzögerungen erzeugt werden. zum beispiel, wenn ein 40µs delay gebraucht wird würde WAIT 0.40 aufgerufen werden. daas veranlasst die ersten 3 zeilen in WAIT auszuühren und 4µs erzeugen. die nächsten 4 zeilen in WAIT5U erzeugen 5µs und wiederholen soich 6mal für ein totale anzahl von 30µs. die letzte schelfie von WAIT5U braucht 6µs und kehrt dann zum WAIT makro zurück. somkit ergibt sich eine summe von 30+4+6=40µs

Table 1. Regular speed 1-Wire interface timing
2.5V < VDD < 5.5V, TA = -20‹C to 70‹C.)
Parameter Symbol Min Typ Max Units
Time Slot tSLOT 60 120 µs
Recovery Time tREC 1 µs
Write 0 Low Time tLOW0 60 120 µs
Write 1 Low Time tLOW1 1 15 µs
Read Data Valid tRDV 15 µs
Reset Time High tRSTH 480 µs
Reset Time Low tRSTL 480 960 µs
Presence Detect High tPDH 15 60 µs
Presence Detect Low tPDL 60 240 µs

der anfang jeder 1-wire kommunikation beginnt mit einem reset puls vom master device gefolgt von einem presence detect puls vom slave device. bild 1 zeigt diese aktion. diese initialsierungssequenz can leicht mit einem PIC geschickt werden. der assembler code befindete sich unter bild 1. die 1-wire timing spezifikationen für initialisierung, lesen und schreiben sind oben in tabelle 1. diese paramter werden im ganzen text verwende.
Figure 1. 1-Wire initialization sequence.
OW_RESET:
OW_HIZ ; Start with the line high
CLRF PDBYTE ; Clear the PD byte
OW_LO
WAIT .500 ; Drive Low for 500µs
OW_HIZ
WAIT .70 ; Release line and wait 70µs for PD Pulse
BTFSS PORTB,DQ ; Read for a PD Pulse
INCF PDBYTE,F ; Set PDBYTE to 1 if get a PD Pulse
WAIT .430 ; Wait 430µs after PD Pulse
RETLW 0










die OW_RESET routine beginnt mit dem sicherstellen das der DQ pin auf high ist damit er mit einem pullup widerstand auf high gezogen wrd. dann wird das PDBYTE register gelöscht damit es den nächsten presence detect pusle verabwiten kann. nachher wird der DQ pin für 500µs auf low gezogen. dies kommt dem tRSTL register zugute, der in tabelle 1 gezeigt5 wird und stellt auch einen zusätzlichen 20µs puffer zur verfügung. nachdem der pin low gezofgen wurde wird er auf einen hohen impedanz zustand freeigeben und eine verzögerung von 7µs wird addiert bevor der presence detect pulse glesen wird. diese 70µs ermöglichen es das der pic eine gültige abtastzeit für jede mögliche kombination von tPDL and tPDH. wenn der presence piuls gelsen wurde wird das PDBTE register so eingerichtet das es den logsichen pegel anzeigt. der DQ pin wird im hohen impedanzzustand gelassen für weitere 430µs um sicherzustellen das die tRSTH erfüllt wurde und inmkludiert ienen zusätzlichen 20µs puffer.



die nächste benöigte routine ist DSTXBYTE die verwedntet wid um daten zu einem slave device zu überttragen. der pic code für diese routine ist unter bild 2. diese routine wird aufgerufen mit den daten die in das WREG register gespeichert werden sollen und wird sofort ins IOBYTE register übertragen. dann ein COUNT register gestartet mit dem wert 8 um die anzahl von bits zu zählen die auf die DQ line gegeben werden. beginnend bei DSTXLP, beginnt der PIC daten ausztusenden. zuerst wird der DQ pin auf low gezigen für 5µs egal welcher logische pegel übertrasgen witrd. das sichert das die tLOW1 zeizt eingehalten witrd.. dann wurd das lsbb von IOBYTE in ein CARRY bit umgewandelt und dann getestet obs ne 1 oder ne 0 ist. wenn der carry ne 1 ist das wird das DQ bit von PORTB gesetzt und changed den pin in einen hohen impedanz zustand und die line wird augf high gezigeb. wenn der caryy ne 0 ist wird die line 0 gehalten. dann wird eine verzögerung von 60µs dazu addiert um auf die minimum tLOW0 zeit zu kommen. nach den 60µs wird der pin in einen hohen impedanzzustand gegeben und zusätzliche 2µs werden für den pullup widerstand addiert. schlussendlich wird das COUNT register dekrementiert. wenn das register 0 ist wurden alle 8 bits vershcikt und die routine ist zu ende. wenns ungleich 0 ist wird ein neues bit gesendete, beninned bei DSTXLP. eine grafische darstellunh davon ist in bild 2 zu sehen









Figure 1. 1-Wire write time slots.
DSTXBYTE: ; Byte to send starts in W
MOVWF IOBYTE ; We send it from IOBYTE
MOVLW .8
MOVWF COUNT ; Set COUNT equal to 8 to count the bits
DSTXLP:
OW_LO
NOP
NOP
NOP
NOP
NOP ; Drive the line low for 5µs
RRF IOBYTE,F ; The data byte
BTFSC STATUS,C ; Check the LSB of IOBYTE for 1 or 0
BSF PORTB,DQ ; Drive the line high if LSB is 1
WAIT .60 ; Continue driving line for 60µs
OW_HIZ ; Release the line for pullup
NOP
NOP ; Recovery time of 2µs
DECFSZ COUNT,F ; Decrement the bit counter
GOTO DSTXLP
RETLW 0












die final routine für die kommunikation ist DSRXBYTE die es dem PIC ermöglicht die information vom slave zu erhalten. der code ist beibild 3. das COUNT register wird initialsiert mit 8 bevor jede DQ aktivität beginnt und ihre funktion ist die erhaltenen bits zu zählen. das DSRXLP beginnt indem es den DQ pin auf low zieht um dem slave device zu signalisieren das der pic bereit ist. die line wird low gezogen für 6µs und dann freigebenen iundem der DQ pin in einen high impedance zustand gezogen wird. dann wartet der pic weitere 4µs vor beginn der abtastung. in OW_LO gibt's eine code zeile nachdem die line auf low gezoigen wird und 3 zeilen innerhalb von OW_HIZ. jede zeile braucht 1µs zur verarbeitung. summe -> 1+6+3+4=14µs was unterhalb der tRDV spezifikationen von 15µs ist. nachdem das PORTB register gelesen wurde, wird des DQ bit demaskiert und das register wird zu 255 dazuaddiert um das CARRY zu zwingen das DQ bit zu spiegeln. das CARRY bit wird dann in IOBYTE kopiert wo das ankommende byte gespeichert wird. wenn das byte gespeichert wurde wird eine verzögerung von 50µs addiert um tSLOT zu erfüllen. der letzte check ist um zu bestimmen ob das COUNT register 0 ist. wenn ja dann wurden 8 bits gelesen und die routine wird verlassen. andernalls wird die schleife wiederholt mit DSRXLP. die read zero und read one aktionen sind in bild 3.

Figure 1. 1-Wire read time slots.
DSRXBYTE: ; Byte read is stored in IOBYTE
MOVLW .8
MOVWF COUNT ; Set COUNT equal to 8 to count the bits
DSRXLP:
OW_LO
NOP
NOP
NOP
NOP
NOP
NOP ; Bring DQ low for 6µs
OW_HIZ
NOP
NOP
NOP
NOP ; Change to HiZ and Wait 4µs
MOVF PORTB,W ; Read DQ
ANDLW 1<<DQ ; Mask off the DQ bit
ADDLW .255 ; C = 1 if DQ = 1: C = 0 if DQ = 0
RRF IOBYTE,F ; Shift C into IOBYTE
WAIT .50 ; Wait 50µs to end of time slot
DECFSZ COUNT,F ; Decrement the bit counter
GOTO DSRXLP
RETLW 0



Appendix A: 1-Wire Include File (1W_16F6X.INC)
; ************************************************** *****
;
; Dallas 1-Wire Support for PIC16F628
;
; Processor has 4MHz clock and 1µs per instruction cycle.
;
; ************************************************** *****


; ************************************************** *****
; Dallas Semiconductor 1-Wire MACROS
; ************************************************** *****
OW_HIZ:MACRO
BSF STATUS,RP0 ; Select Bank 1 of data memory
BSF TRISB, DQ ; Make DQ pin High Z
BCF STATUS,RP0 ; Select Bank 0 of data memory
ENDM
; --------------------------------------------------------
OW_LO:MACRO
BCF STATUS,RP0 ; Select Bank 0 of data memory
BCF PORTB, DQ ; Clear the DQ bit
BSF STATUS,RP0 ; Select Bank 1 of data memory
BCF TRISB, DQ ; Make DQ pin an output
BCF STATUS,RP0 ; Select Bank 0 of data memory
ENDM
; --------------------------------------------------------
WAIT:MACRO TIME
;Delay for TIME µs.
;Variable time must be in multiples of 5µs.
MOVLW (TIME/5)-1 ;1µs
MOVWF TMP0 ;1µs
CALL WAIT5U ;2µs
ENDM

; ************************************************** *****
; Dallas Semiconductor 1-Wire ROUTINES
; ************************************************** *****
WAIT5U:
;This takes 5uS to complete
NOP ;1µs
NOP ;1µs
DECFSZ TMP0,F ;1µs or 2µs
GOTO WAIT5U ;2µs
RETLW 0 ;2µs
; --------------------------------------------------------
OW_RESET:
OW_HIZ ; Start with the line high
CLRF PDBYTE ; Clear the PD byte
OW_LO
WAIT .500 ; Drive Low for 500µs
OW_HIZ
WAIT .70 ; Release line and wait 70µs for PD Pulse
BTFSS PORTB,DQ ; Read for a PD Pulse
INCF PDBYTE,F ; Set PDBYTE to 1 if get a PD Pulse
WAIT .400 ; Wait 400µs after PD Pulse
RETLW 0
; --------------------------------------------------------
DSRXBYTE: ; Byte read is stored in IOBYTE
MOVLW .8
MOVWF COUNT ; Set COUNT equal to 8 to count the bits
DSRXLP:
OW_LO
NOP
NOP
NOP
NOP
NOP
NOP ; Bring DQ low for 6µs
OW_HIZ
NOP
NOP
NOP
NOP ; Change to HiZ and Wait 4µs
MOVF PORTB,W ; Read DQ
ANDLW 1<<DQ ; Mask off the DQ bit
ADDLW .255 ; C=1 if DQ=1: C=0 if DQ=0
RRF IOBYTE,F ; Shift C into IOBYTE
WAIT .50 ; Wait 50µs to end of time slot
DECFSZ COUNT,F ; Decrement the bit counter
GOTO DSRXLP
RETLW 0
; --------------------------------------------------------
DSTXBYTE: ; Byte to send starts in W
MOVWF IOBYTE ; We send it from IOBYTE
MOVLW .8
MOVWF COUNT ; Set COUNT equal to 8 to count the bits
DSTXLP:
OW_LO
NOP
NOP
NOP
NOP
NOP ; Drive the line low for 5µs
RRF IOBYTE,F ; The data byte
BTFSC STATUS,C ; Check the LSB of IOBYTE for 1 or 0
BSF PORTB,DQ ; Drive the line high if LSB is 1
WAIT .60 ; Continue driving line for 60µs
OW_HIZ ; Release the line for pullup
NOP
NOP ; Recovery time of 2µs
DECFSZ COUNT,F ; Decrement the bit counter
GOTO DSTXLP
RETLW 0
; --------------------------------------------------------

Appendix B: PIC16F628 to DS2761 Assembly Code (PIC_2_1W.ASM)
; *******************************************
;
; Dallas Semiconductor PIC code
;
; This code will interface a PIC16F628 microcontroller to
; a DS2761 High-Precision Li+ Battery Monitor
;
; *******************************************;