Guten Abend, ich habe da mal eine wohl recht einfache, aber mich gerade ziemlich auslastende Frage. Ich möchte 3 Pins von einem AVR mit 3 Pins eines anderen AVR verbinden. Ziel ist es, dass, wenn AVR1 etwas an AVR2 senden möchte, PortB.7, PortB.6 und PortB.5 auf Ausgang schaltet, und die Befehle durch ein fix von mir ausgedachtes Protokoll an AVR2, dessen selben Ports auf inupt stehen, sendet. Nun habe ich einfach die Ports ohne irgendetwas miteinander verbunden. Das Problem ist aber, dass die LED an AVR2, welche mir anzeigen soll ob alles Pins von AVR1 auf high sind, mal an oder aus geht. Der Fehler liegt dann ja wahrscheinlich irgendwo beim Pullup. Mein Hänger ist, dass ich ja die Leitungen Bidirektional nutzen möchte und kaum noch Platz auf der Platine hab... weshalb sich eine externe Pullup Beschaltung, zu mindestens erschwert und ich halt auch nicht drauf komme wie ich das zu realisieren habe :/ Hat da jemand einen guten Gedankenanstupser für mich? : ) TxD und RxD sind schon belegt und für TWI sind die Leitungen letztendlich zu lang. Frohen Restweihnachtstag oyla
oyla schrieb: > für TWI sind die Leitungen letztendlich zu lang Wenn sie für TWI zu lang sind, werden sie wohl auch für alles andere zu lang sein. Aber wieso kannst Du nicht die internen Pull-Ups verwenden? Wenn Du von Ausgang zu Eingang umschaltest, kannst Du doch auch direkt im Anschluss die Pull-Ups aktivieren.
oyla schrieb: > Das Problem ist aber, dass die > LED an AVR2, welche mir anzeigen soll ob alles Pins von AVR1 auf high > sind, mal an oder aus geht. Der Fehler liegt dann ja wahrscheinlich > irgendwo beim Pullup. Kann sein. Kann aber auch ein Programmierfehler sein. Oder ein Logikfehler in dem fix ausgedachten Protokoll.
>Aber wieso kannst Du nicht die internen Pull-Ups verwenden? Wenn Du von >Ausgang zu Eingang umschaltest, kannst Du doch auch direkt im Anschluss >die Pull-Ups aktivieren. Also wenn ich die internen Pullups einschalte, dann leuchtet die LED auch Konstant (finde ich logisch, wenn das nicht logisch ist Korrigiert mich ;) ) Hab das Spiel mal ebend mit nur einen Port gemacht (wenn PinB.7 = 1 dann LED = 1), funktioniert schon, wenn ich Pin.7 auf GND schalte geht die LED aus. Aber wie schaffe ich das, das der jeweilige andere AVR auf GND schaltet? muss halt pro Leitung in beide Richtungen Funktionieren. oyla
Unabhängig deines Problems: Schaltet man Ausgänge gegen Ausgänge, d.h., schaltet die Software während des Betriebes die I/O wechselnd auf Input oder Output, kann man dazwischen schon mal Schutzwiderstände vorsehen, Größenordnung 1-5K. Damit es keine Kurzschlüsse gibt. Einfach als Schutzmaßnahme. Sowas ist vor allem nützlich, wenn die Software noch nicht perfekt steht.
So, ich habe mich eben nochmal zum TWI/I2C belesen. Ich kann also, wenn ich 3 AVRs habe, welche alle mit 2 Leitungen verbunden sind auf eine Distanz von 3 Metern Daten Senden/Empfangen und die Hardware ist im ATmega8 schon komplett eingebaut, während Bascom schon fertige Befehle bereit stellt? oO Und den Port für die Datenübertragung kann ich frei Definieren (die 2 Benötigten?) Also wenn das jetzt stimmt, mach ich das so! :D
oyla schrieb: > Also wenn das jetzt stimmt, mach ich das so! :D Aber wo bleibt dann der Spaß und Ehrgeiz? ;)
oyla schrieb: > Befehle durch ein fix von mir ausgedachtes Protokoll an AVR2 Ich kann Dir versichern, daß man ein funktionierendes Protokoll nicht eben mal fix ausdenken kann. Entweder Du steckst mehrere Monate rein oder nimmst was fertiges, z.B.: Beitrag "mehrere MC seriell über Datenbus verbinden (1Draht)" Peter
Rubelus schrieb > Aber wo bleibt dann der Spaß und Ehrgeiz? ;) Das ist schon Richtig, aber mal eine TWI Verbindung zum laufen zu bekommen ist dann auch wieder eine Hürde für sich, zu mindestens für mich :) Peter Dannegger >Ich kann Dir versichern, daß man ein funktionierendes Protokoll nicht >eben mal fix ausdenken kann. Das glaube ich auch, mein Plan war es über die erste Leitung , allen AVR's die mit drinnen hängen mitzuteilen, dass sie gerade nichts melden dürfen, über die 2. Leitung die Daten zu übergeben, dessen Bits mit einem high auf der 3. Leitung übernommen werden. Also sporadisch ausgedacht...hätte mit einer korrekten Beschaltung aber denke ich mal seinen Zweck erfüllt :D Für Fragen zum TWI mach ich einen neuen Threat auf, falls nötig. Ich danke euch, schönen Wochenstart!
>2. Leitung die Daten zu übergeben, dessen Bits mit >einem high auf der 3. Leitung übernommen werden. Und woher wissen die anderen Atmegas, wann ein Bit aufhört und das nächste anfängt?! Wenn schon so krampfig, würde ich wenigstens die 3. Leitung auf einen Interrupt legen und als Taktsignal verwenden. 1. Leitung prüft, ob der Bus frei ist, wenn ja -> Bus blockieren. Andere Atmegas dürfen ab dann nicht mehr senden und müssen ihre Pins auf "Eingang" schalten. 2. Leitung für das Bit, High oder Low 3. Leitung für den Takt, bei jeder steigenden Flanke wird ein Interrupt ausgelöst und das Bit übernommen Z.B. nach 8 Bit ist eine Übertragung beendet und der Bus muss freigegeben werden. Danach darf der nächste Atmega was übertragen. Zwischen zwei Übertragungen sollte jeder Atmega eine Zufalls-Pause einlegen, ansonsten kann es passieren das zwei Atmegas zeitgleich senden wollen. Die I2C-Pins sind übrigens nicht frei definierbar, zumindest wenn du das Hardware-Interface vom Atmega nutzen willst. Welche Pins das sind, steht wie immer im Datenblatt.
Löwe 'Die I2C-Pins sind übrigens nicht frei definierbar, zumindest wenn du das 'Hardware-Interface vom Atmega nutzen willst. Hab ich auch schon gemerkt, das ist aber nicht weiter dramatisch, da die Ports (größtenteils...) frei sind :) Bei meiner Idee wurden die AVRs wie eine Kette aneinander gesetzt, sodass die erste Leitung die einzige Leitung ist, woran alle AVRs angeklemmt sind, sonst wird ein Befehl von A über B nach C übermittelt (halt nur eine fixe Idee gewesen). Der Takt spielte dabei ja keine Rolle, da er nach eine festen Ablauf mit 2ms ca arbeiten sollte, und durch das kurze high auf Leitung 3 einfach den Bit dann übernimmt, solange wartet er bis er das Byte zusammen hat. Aber mal doch eine kurze Frage: Ein mC ist Master (Receiver), 2 sind Slave (Transmitter). nun möchte ich aber von dem jeweiligen Slave Immer einen von 5 Werten abgefragt haben, muss ich ihn Pro Wert auf eine jeweilig andere Adresse ansprechen, oder sag ich vorher welchen Byte ich haben will (so ganz schlüssig ist das gerade für mich nicht). Ich bearbeite gerade die Beispiele von http://www.rn-wissen.de/index.php/TWI_Praxis gruss oyla
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.