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
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;
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
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.
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
Hallo Christian, wirf mal einen Blick auf die AN148 von Maxim, Appendix B vielleicht kannst Du dadurch deine Busläge vergrößern. Gruß, rweber
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.