Kommunikation mit DS1820 klappt nicht

OP #3164704
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é
Gast #3164765
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 ^^
OP #3164998
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren