Forum: Mikrocontroller und Digitale Elektronik Kommunikation mit DS1820 klappt nicht


von René S. (ren_s)


Lesenswert?

Hi,
habe ein echt komisches, mir nicht nachvollziehbares problem!
Versuche momentan seit 2 tagen einen DS1820 zum kommunizieren zu bringen 
und bin jetzt hier angelangt:
folgende funktion zum senden eines bits habe ich geschrieben:
1
void ds1820_writebit(uint8_t bit)
2
  {
3
    DDRB |= (1<<DDB1);    
4
    PORTB &= ~(1<<PB1);    //Ausgang auf 0
5
    _delay_us(8);      //1µs warten
6
    bit &= 0x01;
7
    if (bit)
8
      {
9
        DDRB |= (1<<DDB1);
10
        PORTB |= (1<<PB1);  //1 anlegen
11
        uart_putc('1');
12
      }
13
    else
14
      uart_putc('0');
15
    
16
    _delay_us(75);  
17
    _delay_us(30);      //40µs warten
18
    DDRB |= (1<<DDB1);
19
    PORTB |= (1<<PB1);    //Ausgang auf 1
20
    _delay_us(1);      //1µs warten
21
  }

an pb1 hängt der ds1820.
die _delays habe ich zerhackt, weil ja angeblich der größtmögliche wert 
die 256 / taktfrequenz in mhz ist...

wenn ich die funktion jetzt einmalig im hauptprogramm jeweils mit einer 
1 oder 0 aufrufe funktioniert alles gut. (nachgemessen mit oszi)
wenn ich dann 2 aufrufe hintereinander mache 00,01,10,11 funktioniert 
auch noch alles.
bei drei einsern hintereinander ebenfalls noch (111).

jetzt kommt das problem:

bei vier einsern kommt der vierte erst nach 900µs, die drei vorherigen 
allerdings normal!

bei 0101 wird nach dem dritten nuller nimmt die dq leitung nicht mehr 
high pegel an...
ich kapiers nicht!

vlt. kann mir jemand helfen?!
gruß René

von Andreas H. (ahz)


Lesenswert?

René S. schrieb:
> vlt. kann mir jemand helfen?!

Nur mal so ins Blaue geraten.
Nimm mal die Uart calls raus und probiers dann noch mal.

Und sag Bescheid, ob das was gebracht hat ;-)

Grüße
Andreas

von René S. (ren_s)


Lesenswert?

mannmannmann...
KLAR!!!!

logisch funktionierts jetzt :) :) :)

Viiiiiiiielen Dank!

Das nennt man "aufmschlauchstehen" :/
Funktioniert alles bestens!

von Peter D. (peda)


Lesenswert?

René S. schrieb:
> PORTB |= (1<<PB1);  //1 anlegen

Verboten, 1-wire ist open-drain.
Niemand darf eine 1 anlegen!
Einzige Ausnahme: parasite Power.

René S. schrieb:
> _delay_us(75);
>     _delay_us(30);      //40µs warten

Was denn nun?
Mit falschen Kommentaren kannst Du hier nicht punkten.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

René S. schrieb:
> habe ein echt komisches, mir nicht nachvollziehbares problem!
Du kannst trotzdem ein SINNVOLLEN Threadtitel wählen, es bringt nichts, 
wenn du da nur deine persönlichen Befindlichkeiten wie "werde noch 
verrückt!" reinschreibst...

von Equinox (Gast)


Lesenswert?

René S. schrieb:
> die _delays habe ich zerhackt, weil ja angeblich der größtmögliche wert
> die 256 / taktfrequenz in mhz ist...

Noch kurz dazu ein Auszug aus der delay.h:
   Perform a delay of \c __us microseconds, using _delay_loop_1().

   The macro F_CPU is supposed to be defined to a
   constant defining the CPU clock frequency (in Hertz).

   The maximal possible delay is 768 us / F_CPU in MHz.

   If the user requests a delay greater than the maximal possible one,
   _delay_us() will automatically call _delay_ms() instead.  The user
   will not be informed about this case.


Du musst das also nicht stückeln, wenn du eine halbwegs aktuelle 
Compilerversion hast ^^

von René S. (ren_s)


Lesenswert?

Peter Dannegger schrieb:
> René S. schrieb:
>> PORTB |= (1<<PB1);  //1 anlegen
>
> Verboten, 1-wire ist open-drain.
> Niemand darf eine 1 anlegen!
> Einzige Ausnahme: parasite Power.
>
> René S. schrieb:
>> _delay_us(75);
>>     _delay_us(30);      //40µs warten
>
> Was denn nun?
> Mit falschen Kommentaren kannst Du hier nicht punkten.

korrigiert:
heisst nun DDRB &= ~(1<<DDB1), wird also durch pull up auf high gezogen.
mit den zeiten hab ich noch rumprobiert, hat aber nix gebracht ;) 
kommentar hald irgendwann stehen lassen, wird ebenfalls korrigiert!

Lothar Miller schrieb:
> Du kannst trotzdem ein SINNVOLLEN Threadtitel wählen, es bringt nichts,
> wenn du da nur deine persönlichen Befindlichkeiten wie "werde noch
> verrückt!" reinschreibst...

das nächste mal wieder, konnte grad nichtmehr klar denken...

Equinox schrieb:
> Du musst das also nicht stückeln, wenn du eine halbwegs aktuelle
> Compilerversion hast ^^

alles klar, vielen dank

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

René S. schrieb:
> kommentar hald irgendwann stehen lassen, wird ebenfalls korrigiert!
Am besten löschen, denn der sagt nichts aus, was nicht die 7 Buchstaben 
vorher auch schon in aller Klarheit aussagen würden...

von Paul B. (paul_baumann)


Lesenswert?

Er hat ja nur angekündigt, verrückt zu werden. Offenbar ist es ihm noch
einmal gelungen, davonzukommen.
;-)
MfG Paul

von Andreas H. (ahz)


Lesenswert?

René S. schrieb:
> Das nennt man "aufmschlauchstehen" :/

Schön dass es jetzt funktioniert.

Und bilde Dir nicht ein, dass Du der Erste bist, der "In dieses Messer" 
läuft. Was dachtest Du, wie ich darauf gekommen bin ;-)

Grüße
Andreas

von Martin K. (maart)


Lesenswert?

Ich habe auch schon die leidvolle Erfahrung mit dem DS1820 gemacht, dass 
es nichts wichtigeres gibt, als das Timing ganz penibel einzuhalten.
Interruptroutinen wärend der Kommunikation können auch lustig werden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.