Forum: Mikrocontroller und Digitale Elektronik 1-wire Repeater


von chris (Gast)


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

von Jörg S. (Gast)


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;

von chris (Gast)


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

von Jörg S. (Gast)


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.

von chris (Gast)


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

von Robert W. (rweber)


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

von Axel (Gast)


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

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.