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é