mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 1 Wire Problem


Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?).

Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zuerst wird der PIN ja als Ausgang deklariert!
Ich hatte mir das in etwa so gedacht!
Beispiel nur für den Reset.
DDRA|=(1<<PA0);
PORTA&=~(1<<PA0);
_delay_us(100);
_delay_us(100);
_delay_us(100);
_delay_us(80);
PORTA|=(1<<PA0);
_delay_us(100);
_delay_us(20);

DDRA&=~(1<<PA0);

if(PINA & (1<<PA0))
{ //hier müsste er dann auf GND gehen!
}
Oder kann man das nicht so machen?

Autor: Gast_1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei mir läuft folgender Code (Ursprung P. Dannegger) im Zweidrahtbetrieb 
mit einem 1k-Pullup nach +5V problemlos:
#define W1_PIN  PD6
#define W1_OUT  PORTD
#define W1_DDR  DDRD

  W1_OUT &= ~(1<<W1_PIN);
  W1_DDR |= 1<<W1_PIN;
   _delay_us( 240 );      // 480 us
   _delay_us( 240 );    
  cli();
  W1_DDR &= ~(1<<W1_PIN);
  _delay_us( 60); 
  sei();
  _delay_us( 207); 
  _delay_us( 207);

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> _delay_us(1);
Bei einem Takt von 4 MHz wird einfach das "Drumrum" schon zuviel Zeit 
brauchen...
/**
   \ingroup util_delay

   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.
 */
void
_delay_us(double __us)
{
  uint8_t __ticks;
  double __tmp = ((F_CPU) / 3e6) * __us;
  if (__tmp < 1.0)
    __ticks = 1;
  else if (__tmp > 255)
  {
    _delay_ms(__us / 1000.0);
    return;
  }
  else
    __ticks = (uint8_t)__tmp;
  _delay_loop_1(__ticks);
}

Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kann ich denn einen zuverlässigen Takt erstellen?

Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du F_CPU auf die Taktfrequenz in Hz definiert?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.