1 Wire Problem

Gast #1420427
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?
Gast #1420441
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?).
Gast #1420460
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?
Gast #1420489
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);
#1420503
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.
Gast #1420506
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?
Moderator (Firma: Titel) Persönliche Seite #1420592
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
}
Gast #1420681
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?

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