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:> 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