Hallo zusammen! Habe hier ein DS2762K und will es über die 1-Wire Leitung mit einem MC verbinden. Wenn ich jedoch das Reset Signal, bzw. die Leitung für 480us auf low ziehe und dann wieder auf high, sehe ich am Oszi, dass der Baustein die Leitung auf Null ziehen will, jedoch geht die Spannung nur um 0,2 Volt runter anstatt auf GND. Ich habe das Gefühl, dass das ein Masseproblem sein kann, hat vielleicht schon jemand damit Erfahrung sammeln können?
Dann musst Du Dich schlicht auf die Suche nach dem Etwas begeben, das die Leitung unerwünschterweise hochzieht (Externer Pullup-Widerstand? Interner Pullup im Controller? Pin irrtümlich auf Output konfiguriert?).
Zuerst wird der PIN ja als Ausgang deklariert! Ich hatte mir das in etwa so gedacht! Beispiel nur für den Reset.
1 | DDRA|=(1<<PA0); |
2 | PORTA&=~(1<<PA0); |
3 | _delay_us(100); |
4 | _delay_us(100); |
5 | _delay_us(100); |
6 | _delay_us(80); |
7 | PORTA|=(1<<PA0); |
8 | _delay_us(100); |
9 | _delay_us(20); |
10 | |
11 | DDRA&=~(1<<PA0); |
12 | |
13 | if(PINA & (1<<PA0)) |
14 | { //hier müsste er dann auf GND gehen! |
15 | }
|
Oder kann man das nicht so machen?
Bei mir läuft folgender Code (Ursprung P. Dannegger) im Zweidrahtbetrieb mit einem 1k-Pullup nach +5V problemlos:
1 | #define W1_PIN PD6
|
2 | #define W1_OUT PORTD
|
3 | #define W1_DDR DDRD
|
4 | |
5 | W1_OUT &= ~(1<<W1_PIN); |
6 | W1_DDR |= 1<<W1_PIN; |
7 | _delay_us( 240 ); // 480 us |
8 | _delay_us( 240 ); |
9 | cli(); |
10 | W1_DDR &= ~(1<<W1_PIN); |
11 | _delay_us( 60); |
12 | sei(); |
13 | _delay_us( 207); |
14 | _delay_us( 207); |
Tommy schrieb:
> Zuerst wird der PIN ja als Ausgang deklariert!
Der Pin (PORTx Bit) wird auf 0 gesetzt und danach wird nur noch die
Richtung geschaltet. Als Ausgang für 0-Pegel, als Eingang für 1. Der Pin
darf nie aktiv auf 1 gezogen werden! Ausname: parasitäre Versorgung
von Dingern wie den DS18x20 während der Messung, aber auch nur dann.
Habe den Fehler jetzt isolieren können! Habe zwar einen 4MHz Quarz dran, wenn ich allerdings mit _delay_us(1); eine 1us Pause machen will, sehe ich am Oszi eine Pause von 2,5 us. Bzw. ich ziehe für eine us die Leitung runter, aber auf dem Oszi sind es 2,5 us. Wenn ich alerdings aus eine us eine ms mache stimmt es wieder, wie kann das sein?
> _delay_us(1);
Bei einem Takt von 4 MHz wird einfach das "Drumrum" schon zuviel Zeit
brauchen...
1 | /**
|
2 | \ingroup util_delay
|
3 | |
4 | Perform a delay of \c __us microseconds, using _delay_loop_1().
|
5 | |
6 | The macro F_CPU is supposed to be defined to a
|
7 | constant defining the CPU clock frequency (in Hertz).
|
8 | |
9 | The maximal possible delay is 768 us / F_CPU in MHz.
|
10 | |
11 | If the user requests a delay greater than the maximal possible one,
|
12 | _delay_us() will automatically call _delay_ms() instead. The user
|
13 | will not be informed about this case.
|
14 | */
|
15 | void
|
16 | _delay_us(double __us) |
17 | {
|
18 | uint8_t __ticks; |
19 | double __tmp = ((F_CPU) / 3e6) * __us; |
20 | if (__tmp < 1.0) |
21 | __ticks = 1; |
22 | else if (__tmp > 255) |
23 | {
|
24 | _delay_ms(__us / 1000.0); |
25 | return; |
26 | }
|
27 | else
|
28 | __ticks = (uint8_t)__tmp; |
29 | _delay_loop_1(__ticks); |
30 | }
|
Ist vielleicht schlecht ausgedrückt! Ich will keinen stabielen Takt, den habe ich durch den externen 4MHz Quarz. Ich will genau eine us warten. Wie kann ich so ein delay erstellen? Ich programmiere in C, ist das damit unmöglich? Oder wird dafür ein Timer verwendet?
Bist Du sicher das die Fuses richtig eingestellt sind un der uC nicht mit einer anderen Frequ läuft (interner RC) ? Hat mich schon einiges an Zeit gekostet...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.