hi,
ich möchte gerne die Temperatur eines DS18B20 auslesen. Problem ist
jedoch dass ich den nicht mal ansprechen kann ^^
Ich nutze folgende Funktion:
1 | unsigned char ow_reset (void){
|
2 |
|
3 | unsigned char Erkennung; //Fuer den Rueckgabewert
|
4 |
|
5 | DQ=0; //Portbit loeschen (PORTx=0)
|
6 | TRIS_DQ=0; //Der DQ-IO ist ein Ausgang
|
7 | Delay10TCYx(196); //490µs warten
|
8 | TRIS_DQ=1; //Der DQ-IO ist ein Eingang (DQ=High (Pull-up))
|
9 | Delay10TCYx(24); //60µs warten
|
10 | Erkennung=DQ; //Pegel einlesen
|
11 | Delay10TCYx(96); //240µs warten (Ende)
|
12 |
|
13 | return (Erkennung); //Erkennungsbit zurueck geben
|
14 | }
|
DQ ist der ein/ausgehende Wert (PORTAbits.RA1) und TRIS_DQ ist der Pin
(TRISA.RA0)
Ich verwende den PIC18F442 und habe die Eingänge auf Digital umgestellt:
1 | ADCON1 = 0x07; //Analogports auf Digital umschalten
|
Jedoch erhalte ich als Rückgabewert immer nur 1! Habe es inzwischen mit
3 sensoren getestet und es ist immer das gleiche! Ich gehe davon aus,
dass ich irgendwas mit den Delays falsch gemacht habe... die Hardware
habe ich herz und nieren geprüft. 4k7 Pull-Up auf Vdd(5V). Sensor ist
nicht verpolt oder gar gewesen! Spannung ist stabil.
Ich verwende einen 4MHz Quarz als Takt und habe PLL aktiv! also läuft
der PIC auf HSPLL somit auf 16MHz.
Daher habe ich die Delays wie folgt berechnet:
16MHz/4 = delaytakt = 4MHz
X = anzahl der µs
Also rechne ich:
X*1000000/delaytakt =
490µs * 1000000 / 4MHz = 1960 Zyklen
dafür nutze ich dann delay10TCYx(196)
Vielleicht habe ich einen Fehler gemacht... Auf jeden fall sitze ich
schon tage dran und lese und lese und lese... komme einfach nicht
weiter. Danke für eure Unterstützung!