www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 1-wire Repeater


Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

hat von euch jemand eine Ahunung, wie ich am besten einen 1-wire
Repeater auf einem Atmega8 programmiere?
Von der Geschwindigkeit her denke ich er müßte es mit 4Mhz schaffen.

Gruß,
chris

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hardware:
Entweder 2 Pins ständig zwischen Ein-und Ausgang umschalten, oder halt
was mit Pull-Ups und Transistor machen (4 Pins nötig).

Software:
if (Eingang1 == Low)
  Ausgang2_low;
if (Eingang2 == low)
  Ausgang1_low;

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörg,
aber ich denke das Problem ist, dass Ausgang2 gleich Eingang2 ist. D.h.
mir geht das ganze dann doch ich so eine art Selbsthaltung.

Evtl vielleicht noch zur Erklärung. Ich habe mehrere DS1820 am Bus
hängen. Jedoch wird es jetzt aufgrund der großen Leitungslänge und der
Anzahl der Sensoren (ca. 13 Stk) dem Bus etwas zu viel und geht in die
Knie.
Deshalb der Repeater.

Wenn nun der Master den Bus auf NULL legt, legt der Repeater den Pin
des Slaves auch auf Null. Dieser muß dann zu gegebener Zeit den Bus
länger auf Null halten wie es der Master eigentlich macht. Das bedeutet
das Spiel dreht sich um. Und da liegt dann irgendwie das Problem
drinnen.

Gruß,
Christian

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei verwendung von nur 2 Pins müssen die im Grundzustand natürlich beide
auf Eingang stehen. Bekommt der Repeater nun ein low an Eingang 1, wird
der Eingang 2 zum Ausgang 2 geschaltet und auf low gelegt. Ist die
Aktion vorbei, wird wieder auf Eingang umgeschaltet.

Wenn man die Gefahr von Fehlumschaltungen (Kurzschluss) vermeiden will,
sollte man halt die Version mit Transistoren und festen Ein-und
Ausgängen wählen.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,
also irgendwie funktioniert das einfach nicht. Der Controller schaltet
zwar durch, aber scheinbar ist er doch zu langsam für die Geschichte.
Bin jetzt auch schon auf 8MHz hoch gegangen.

Hat das noch niemand vor mir ausprobiert oder hat schon so was am
laufen?

Hier mal mein Code:
void init ()
{
DDRC = _BV(3);  //PC3 als Ausgang
PORTC = 0xff;  //ohne

DDRD  = 0x00;    //PD2 als Ausgang
PORTD = 0x00;  //ohne Pull up

}

int main( void )
{
init();

bool master_signal, slave_signal, master_aktiv, slave_aktiv;

for (;1;)
  {

  master_signal = (PIND & (1<<PIND2));
  slave_signal = (PINC & (1<<PINC3));

  if ((!master_aktiv && !slave_aktiv) || (master_signal &&
slave_signal))
  {
  DDRC = 0x00;
  DDRD = 0x00;
  PORTC = 0x00;
  PORTD = 0x00;
  }

  if ((master_signal && !slave_signal) || (slave_aktiv &&
!master_aktiv))
  {
  DDRD  = _BV(2);
  DDRC = 0x00;
  slave_aktiv = !slave_signal;
  PORTD = ((PINC & (1<<PINC3)) >> 1);;
  }

  if ((!master_signal && slave_signal) || (master_aktiv &&
!slave_aktiv))
  {
  DDRC  = _BV(3);
  DDRD = 0x00;
  master_aktiv = !master_signal;
  PORTC = ((PIND & (1<<PIND2)) << 1);;
  }
}
}



Gruß Christian

Autor: Robert Weber (rweber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Christian,

wirf mal einen Blick auf die AN148 von Maxim, Appendix B vielleicht
kannst Du dadurch deine Busläge vergrößern.


Gruß,
rweber

Autor: Axel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man sich das ansieht gibt es einen Problemfall, nämlich wenn der
Slave eine 0 senden will. Ansonsten müsste das so funktionieren.

Aber wenn der Slave eine 0 sendet, passiert folgendes:

Master sendet 0.
Repeater empfängt 0 und gibt diese weiter.
Slave sendet 0.
Master released den Bus auf 1.
Repeater empfängt den Release und gibt seinerseite den Release weiter.

Slave sendet weiter 0.
Repeater erkennt die 0 vom Slave.
Repeater sendet 0 an Master.

Dabei entsteht ein kurzer Peak, wenn der Master den Bus released bis
der Repeater die 0 vom Slave an den Master weitergibt. Ich könnte mir
vorstellen, dass manche Masterbausteine, besonders aber manche Slaves
mit diesem Peak nicht klarkommen.

Eine Lösung könnte sein, dass der Repeater das Timing zum Slave
verändert. Also folgendes
Master sendet 0 (für 1 bis 15 us, wahrscheinlich dürfte das so bei 10us
liegen).
Repeater sendet 1 (für 2-3 us, jedenfalls deutlich kürzer als der
Master).
Slave sendet 0.
Repeater released die Leitung zum Slave und erkennt die 0 vom Slave.
Repeater sendet 0 an Master.
Master released Bus und liest die 0 vom Repeater.

Allerdings gibt es ein Problem beim Reset Pulse. den müsste der
Repeater erkennen (Master low für länger als 480us). Dann muss der
Reset Pulse weitergegeben werden, der dann allerdings etwas verstümmelt
wird.

Das Ganze ist nicht wirklich konform mit der Spek, könnte aber
funktionieren.

Gruss
Axel

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.