PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 1Wire DS1820 Problem mit Scratchpad



goethe
26.04.2005, 19:31
Hi,

Ich hab ein Problem mit dem Scratchpad, es zeigt nur NULLER :(

-verwende nur 1nen 1Wire Sensor,
(keinen Touch)
-und hab jeweils einen seperaten Tx und Rx Pin

Kann mal jemand der sich aus kennt einen Blick (oder Zwei ;) )
auf s Programm werfen?



#include <16f870.h>

#use delay(clock=4000000)
#fuses XT,NOWDT,NOLVP

//DS1820 Commandos
#define SKIP_ROM 0xCC /* 204*/

#define CONVERT_T 0x44 /*68*/
#define READ_SCRATCHPAD 0xBE /*190*/

#define Rx_DS18S20 PIN_C4 // Rx TempSensor
#define Tx_DS18S20 PIN_C5 // Tx TempSensor

char D_Presence;
char D_ShortCircuit;

enum BITSTELLE { Bit0=1,BIT1=2,BIT2=4,BIT3=8,BIT4=16,BIT5=32,BIT6=6 4,BIT7=128 };

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

int temp_1,temp_2;
long int null,eins;
int scratchpad[8];


void D_Reset(void)
{
set_tris_c(0x99);
output_low(Tx_DS18S20); // Pin des DS18S20 auf low setzen
delay_us(480);
output_high(Tx_DS18S20); // Pin des DS18S20 auf high setzen
delay_us(40);
D_Presence = input(Rx_DS18S20);
delay_us(350);
D_ShortCircuit = input(Rx_DS18S20);
delay_us(60);
}

void temp_init()
{
output_low(Tx_DS18S20); // Pin des DS18S20 auf low setzen
delay_us(480); // 480us warten
while (input(Rx_DS18S20)); // pruefen ob der 1-wire bus auf low gezogen wird,
delay_ms(5);
}

void temp_send(unsigned char code)
{ int n=0;

for(; n < 8; n++)
{ if(bit_test(code,n))
{
output_low(Tx_DS18S20); //sende 0
delay_us(2); //int write slot
output_high(Tx_DS18S20); //send 1
}
else
{
output_low(Tx_DS18S20); //sende 0
}
delay_us(65); //duration für 1 und fertig
output_high(Tx_DS18S20);
delay_us(2);
}
delay_us(100); //1 Millisekunde
}

unsigned char temp_read(void)
{ unsigned char in=0,j=0;

delay_us(400);
for(; j < 8; j++)
{
delay_us(1);
output_low(Tx_DS18S20); // init read
delay_us(3);
if (input(Rx_DS18S20)) bit_set(in,j);
delay_us(60);
}
return(in);
}


void main()
{ int i;

printf("Hallo\r\n");

D_Reset();
printf("Presence:%d ShortCircuit:%d\r\n",D_Presence,D_ShortCircuit);

while(1)
{ temp_init();
temp_send(SKIP_ROM);
temp_send(CONVERT_T);
delay_ms(500); //warten bis Temp Convert abgeschlossen ist...

temp_send(SKIP_ROM);
temp_send(READ_SCRATCHPAD);

for (i=0; i<8;i++)
{ scratchpad[i] = temp_read();
printf("i:%d/v:%d %d %d",i,scratchpad[i],D_Presence,D_ShortCircuit);
}

printf("Temperatur: %d, %02u C\r\n",temp_2,temp_1);
delay_ms(500);
}
}



VIELEN DANK!!!!

Smi
26.04.2005, 22:49
in asm hätt ich dir helfen können kann aber leider kein c :oops:

goethe
27.04.2005, 16:02
echt???

wow
du bist der erste den ich kenn der zuerst asm gelernt hat
normalerweiße lernen alle zuerst C
--aber was ist schon normal ;)

ja ein asm fürn DS18S20 wäre nicht schlecht
musst mir nur sagen auf welchen PIN du den DQ hängst
und !!!ich verwende kein LCD Display
sondern n RS232

vielen vielen dank

27.04.2005, 23:38
Ich hab wie gesagt keine ahnung von c und wie man ASM routienen implementiert.Variablen konstanten welchen chip welcher pin TTL ST.ist bei mir alles ziehmlich wichtig wenns laufen soll!!

Smi
27.04.2005, 23:43
Hat mich vergessen einzuloggen sorry.
Kennst du dich mit ASM aus??
ES ist sehr hardwärenahe darum gelern.Hatte nie vor C zu lernen.
Angefangen hat das mit basic aud dem amiga.Pascal könnt ich auch noch paar brocken aus der schule.

goethe
28.04.2005, 20:42
...ähm..

PIC 16F870
4 Mhz Quarz
#fuses XT,NOWDT

..läuft alles auf n PIN C5
bzw. wenn du s mit Tx Rx machst dann C6 C5

läuft dein Prog auch 100%ig?
brauchst noch was?

danke

Smi
28.04.2005, 20:55
Wird schwierig da ich die hardwäre nicht hab mein den 1wire sender!
Kann dir ja mal was schreiben und du kannst es probieren.IIC hab ich auch hinbekommen keine sorge.Mus die routiene irgendwie anders aufgebaut sein?Meine prog lauft sozusagen standalone dan auf dem pic.
Kanns so machen das die daten über RS232 gesendet werden.

goethe
29.04.2005, 08:29
Das Prog sollte bei mir auch Standalone laufen..

RS232 passt,

brauch den Code so schnell wie möglich, ganz wichtig für mich

danke!!

Smi
29.04.2005, 13:28
Häng mich mal dran aber hab das wochenende viel um die ohren.
Jetzt wird landsam ein schwein draus.
Dachte erst du brauchst eine Routine die du in c implementieren kannst.
So fragst du das prog bloß mit einen c programm ab.Datenblatter hab ich schon besorgt. Ich arbeite mit dem 16f873A

goethe
29.04.2005, 20:59
...uj das wird knapp..

Ich müßte das Projekt am Dienstag presentiern..
..Dienstang in der Früh..

und das 1wire.. is halt das einzige das noch nicht funkt...

..schaffst du s bis Sonntag/Montag?
-das wäre echt toll

Smi
30.04.2005, 00:04
Also ich melde mich grad von arbeit.
In der gastronomie is es halt nicht so mit 8 h arbeiten hab 16 uhr angefangen.jetzt werd ich irgendwannmal!! so um 3!!!!ins bett gehen und vieleicht bis um 12 schlafen und Sa um 16 uhr gehts weiter.Sontag hab ich von 10 bis 23 uhr Schicht.werd mi ins zeug legen aber ich denke bis montag abend werden wir ergebnisse haben.

Smi
30.04.2005, 12:15
Bin schon dabei.Zwischenfrage benutzt du die Hardware also PIC + MAX
das erspart mir viel zeit beim proggen.TX is pin 17 und RX is 18.(RS232)
Für den ds... kan ich PORTA auser pin4 und PORt B nehmen.W§ird doch mehr arbeit als ich dachte Es giebt auch ne Softwär und ne schlatung um den chip direckt am pc zu betreiben da sparst du dir den pic.Such mal bei elektor.

goethe
30.04.2005, 18:49
PIC und seperaten MAX
C6 Tx
C7 Rx
bei mir!

alles auf PORT C PIN C4!

...brauchs nicht fürn PC
brauchs fürn PIC
schaffst das?

goethe
30.04.2005, 18:51
ich kann da noch meinen Code zeigen...

..vielleicht findest ja n Fehler so...



CODE:

#include <16f870.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOLVP

#define SKIP_ROM 0xCC
#define CONVERT_T 0x44
#define READ_SCRATCHPAD 0xBE

#define DQ PIN_C4
//#define Tx_DS1820 PIN_C5

#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)


//////////////////////////////////////////////////////////////////////////////
// OW_RESET - performs a reset on the one-wire bus and
// returns the presence detect. Reset is 480us, so delay
// value is (480-24)/16 = 28.5 - we use 29. Presence checked
// another 70us later, so delay is (70-24)/16 = 2.875 - we use 3.
//
unsigned char ow_reset(void)
{
unsigned char presence;
output_low(DQ); //pull DQ line low
delay_us(480); // leave it low for 480us
input(DQ); // allow line to return high
delay_us(70); // wait for presence
presence = DQ; // get presence signal
delay_us(424); // wait for end of timeslot
return(presence); // presence signal returned
} // 0=presence, 1 = no part




//////////////////////////////////////////////////////////////////////////////
// READ_BIT - reads a bit from the one-wire bus. The delay
// required for a read is 15us, so the DELAY routine won't work.
// We put our own delay function in this routine in the form of a
// for() loop.
//
unsigned char read_bit(void)
{
unsigned char i;
output_low(DQ); // pull DQ low to start timeslot
input(DQ);// then return high
for (i=0; i<3; i++); // delay 15us from start of timeslot
return(DQ); // return value of DQ line
}




//////////////////////////////////////////////////////////////////////////////
// WRITE_BIT - writes a bit to the one-wire bus, passed in bitval.
//
void write_bit(char bitval)
{
output_low(DQ); // pull DQ low to start timeslot
if(bitval==1) input(DQ); // return DQ high if write 1
delay_us(104); // hold value for remainder of timeslot
input(DQ);
}// Delay provides 16us per loop, plus 24us. Therefore delay(5) = 104us


//////////////////////////////////////////////////////////////////////////////
// READ_BYTE - reads a byte from the one-wire bus.
//
unsigned char read_byte(void)
{
unsigned char i;
unsigned char value = 0;
for (i=0;i<8;i++)
{
if(read_bit()) value|=0x01<<i; // reads byte in, one byte at a time and then
// shifts it left
delay_us(120); // wait for rest of timeslot
}
return(value);
}



//////////////////////////////////////////////////////////////////////////////
// WRITE_BYTE - writes a byte to the one-wire bus.
//
void write_byte(char val)
{
unsigned char i;
unsigned char temp;
for (i=0; i<8; i++) // writes byte, one bit at a time
{
temp = val>>i; // shifts val right 'i' spaces
temp &= 0x01; // copy that bit to temp
write_bit(temp); // write bit in temp into
}
delay_us(104);
}

void main()
{
char get[10];
int k;
char temp_f,temp_c;

while(1)
{

ow_reset();
write_byte(0xCC); //Skip ROM
write_byte(0x44); // Start Conversion
delay_us(104);
ow_reset();
write_byte(0xCC); // Skip ROM
write_byte(0xBE); // Read Scratch Pad
for (k=0;k<9;k++)
{ get[k]=read_byte();
}

printf("\n ScratchPAD DATA = %X%X%X%X%X\n",get[8],get[7],get[6],get[5],get[4],get[3],get[2],get[1],get[0]);


}
}

Smi
01.05.2005, 16:22
(Wieder auf arbeit)Wie ich schon sagte kann kein C
ASM BASIC HTML bissel Pascal und java aber kein c is mir zu unübersichtlich.ich brauch grad mal das komma und den Hochstrich ' .
und 35 befehle.
Ach ja schau mal hier im forum da giebt es einen threat über den ds.
Mit lcd ansteuerung.Das ganze in C geschrieben.Das kann dir sicherlich weiterhelfen.

Werd mal sehen wann ich hier heute rauskomme und mich dransetzen.wenn ich nicht einschlafe.Hast du icq oder sowas wenn ich progge must du ein zwei mal bestimmt das prog draufbrennen.
Hab mir die 1wire routienen schon mal überlegt das init kann ich jetzt auch endlich anfangen.Montag hab ich frei und Zeit.

goethe
01.05.2005, 18:32
Icq:95-809-519
hab aber nur n Galep brenner...

kyky
thxthx

;)

Smi
01.05.2005, 22:47
Solange der die progs bennt solte es gehen.wie hast du morgen zeit?

So lade das mal drauf schließ alles an ds an C4 und loß comterminal auf 2400 Baud einstellen.wenn der max und der chip gehen müßte im terminel check stehen.is nur das init des ds das Das die kom. klappt.

goethe
02.05.2005, 21:27
http://www.maxim-ic.com/appnotes.cfm/appnote_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
;
; *******************************************;

02.05.2005, 21:27
;
; VCC
; ^
; |
; |
; /
; \ Rpup
; /
; \
; |
; 16F628 | DS2761
; RB1 (pin 7) ------------------------------ DQ (pin 7)
;
; *******************************************;

;---------------------------------------------------------
; List your processor here.

list p=16F628

; Include the processor header file here.

#include <p16F628.inc>
;---------------------------------------------------------
; Assign the PORTB with Constants

constant DQ=1 ; Use RB1 (pin7) for 1-Wire
;--------------------------------------------------------
; These constants are standard 1-Wire ROM commands

constant SRCHROM=0xF0
constant RDROM=0x33
constant MTCHROM=0x55
constant SKPROM=0xCC
;---------------------------------------------------------
; These constants are used throughout the code

cblock 0x20
IOBYTE
TMP0 ; Address 0x23
COUNT ; Keep track of bits
PICMSB ; Store the MSB
PICLSB ; Store the LSB
PDBYTE ; Presence Detect Pulse
endc
;---------------------------------------------------------
; Setup your configuration word by using __config.

; For the 16F628, the bits are:
; CP1,CP0,CP1,CP0,N/A, CPD, LVP, BODEN, MCLRE, FOSC2, PWRTE, WDTE, FOSC1, FOSC0
; CP1 and CP0 are the Code Protection bits
; CPD: is the Data Code Protection Bit
; LVP is the Low Voltage Programming Enable bit
; PWRTE is the power-up Timer enable bit
; WDTE is the Watchdog timer enable bit
; FOSC2, FOSC1 and FOSC0 are the oscillator selection bits.

; CP disabled, LVP disabled, BOD disabled, MCLR enabled, PWRT disabled, WDT disabled, INTRC I/O oscillator
; 11111100111000

__config 0x3F38
;---------------------------------------------------------
; Set the program origin for subsequent code.

org 0x00
GOTO SETUP
NOP
NOP
NOP
GOTO INTERRUPT ; PC 0x04...INTERRUPT VECTOR!
;---------------------------------------------------------
INTERRUPT:
SLEEP
;---------------------------------------------------------
; Option Register bits
; ____
; RBPU,INTEDG,TOCS,TOSE,PSA,PS2,PS1,PS0
; 7=PORTB Pullup Enable, 6=Interrupt Edge Select, 5=TMR0 Source,
; 4=TMR0 Source Edge, 3=Prescaler Assign, 2-0=Prescaler Rate Select

; 11010111
; PORTB pullups disabled,rising edge,internal,hightolow,TMR0,1:256

SETUP:
BCF STATUS,RP1
BSF STATUS,RP0 ; Select Bank 1 of data memory
MOVLW 0xD7
MOVWF OPTION_REG
BCF STATUS,RP0 ; Select Bank 0 of data memory
;---------------------------------------------------------

BCF INTCON,7 ; Disable all interrupts.

;---------------------------------------------------------
GOTO START
;---------------------------------------------------------
; Include the 1-Wire communication routines and macros

#INCLUDE 1w_16f6x.inc
;---------------------------------------------------------
START:
;---------------------------------------------------------
GET_TEMP:
CALL OW_RESET ; Send Reset Pulse and read for Presence Detect Pulse
BTFSS PDBYTE,0 ; 1 = Presence Detect Detected
GOTO NOPDPULSE
MOVLW SKPROM
CALL DSTXBYTE ; Send Skip ROM Command (0xCC)
MOVLW 0x69
CALL DSTXBYTE ; Send Read Data Command (0x69)
MOVLW 0x0E
CALL DSTXBYTE ; Send the DS2761 Current Register MSB address (0x0E)
CALL DSRXBYTE ; Read the DS2761 Current Register MSB
MOVF IOBYTE,W
MOVWF PICMSB ; Put the Current MSB into file PICMSB
CALL DSRXBYTE ; Read the DS2761 Current Register LSB
MOVF IOBYTE,W
MOVWF PICLSB ; Put the Current LSB into file PICLSB
CALL OW_RESET

NOPDPULSE: ; Add some error processing here!
SLEEP ; Put PIC to sleep
;---------------------------------------------------------
end

Smi
03.05.2005, 05:12
erledigt und läuf in 24h ohne hardware geproggt!!!

goethe
04.05.2005, 08:33
Leute dieser Fall hat sich erledigt, großen RESPEKT an Herrn Smi,
er hat es tatsächlich geschaft den 1Wire Sensor (ohne die benötigte Hardware zu haben!!!!) zu programmieren =D> =D> =D> =D>

..das kann nicht jeder, und es wäre sicher nicht jeder von euch wäre so hilfsbereit gewesen um die ganze Nacht aufzubleiben und mir zu Helfen

Herr Smi hat nicht nur den Tag aber auch mein Leben gerettet .
nochmals vielen vielen vielen Dank, Smi
=D> =D> =D> =D> =D> =D> =D>


PS: nie wieder CCS C bei 1Wire..gleich von Anfang an ASM!