Forum: Mikrocontroller und Digitale Elektronik Pins von 2 AVR's verbinden, Problem mit Pullup


von oyla (Gast)


Lesenswert?

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

von Fabian (Gast)


Lesenswert?

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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von oyla (Gast)


Lesenswert?

>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

von Wilhelm F. (Gast)


Lesenswert?

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.

von oyla (Gast)


Lesenswert?

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

von Rubelus (Gast)


Lesenswert?

oyla schrieb:
> Also wenn das jetzt stimmt, mach ich das so! :D

Aber wo bleibt dann der Spaß und Ehrgeiz? ;)

von Peter D. (peda)


Lesenswert?

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

von oyla (Gast)


Lesenswert?

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!

von Löwe (Gast)


Lesenswert?

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

von oyla (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.