Forum: Mikrocontroller und Digitale Elektronik 1 Wire Problem


von Tommy (Gast)


Lesenswert?

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?

von Gast (Gast)


Lesenswert?

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?).

von Tommy (Gast)


Lesenswert?

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?

von Gast_1 (Gast)


Lesenswert?

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);

von (prx) A. K. (prx)


Lesenswert?

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.

von Tommy (Gast)


Lesenswert?

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?

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


Lesenswert?

> _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
}

von Tommy (Gast)


Lesenswert?

Wie kann ich denn einen zuverlässigen Takt erstellen?

von Tommy (Gast)


Lesenswert?

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?

von Ich (Gast)


Lesenswert?

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...

von Uhu U. (uhu)


Lesenswert?

Hast du F_CPU auf die Taktfrequenz in Hz definiert?

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.