PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RS232 2xAvr's+PC mit Busy Leitung



Lenox
31.05.2007, 12:33
Ich habe das Problem das ich 2 Avr's mit dem PC verbinden will.
Ich es zunächst mit einer "Reihenschaltung" probiert PC|Mega8|Mega32
aber da gibt es Probleme mit dem Software UART des Mega8.

Jetzt hab ich mir überlegt die beiden Rxds der Avr's zu verbinden und halt an den Txd vom PC zu hängen, und das gleiche auch mit den Txd der Avrs an den Rxd vom PC.

Der Emfang wäre ja kein Problem, nur wenn beide senden wollten das geht natürlich nicht.
Ich hatte mir überlegt einfach ein Kabel zwischen den Avr's zu legen, eine art Busy-Leitung.
Per Software also einfach 5V oder GND auf die Leitung legen wenn einer der µC's gerade senden bzw nicht senden will.

Kann ich einfach ein Kabel so zwischen die Pins hängen?

franzl
31.05.2007, 12:41
Hi,
ja klingt für mich plausibel genug um einen Versuch zu wagen. Ich denke normalerweiße müsst das so funktionieren.
Mfg franz

Lenox
31.05.2007, 13:07
Ich hab etwas sorgen was passiert wenn es mal vorkommt, dass beide die Busy Leitung high schalten wollen.

franzl
31.05.2007, 13:29
Ja ich denke das lässt sich vermeiden in dem es einfach nicht möglich ist das beide die Leitung high schalten. Du musst dann eben den Pin abfragen und wenn der eben schon high ist kann eben der eine so lange nicht senden bis die Leitung wieder low wird.
Mfg franz

Lenox
31.05.2007, 15:42
Jo so wollte ich das auch machen.

Hm, aber ich müsste die Leitung ja immer in einem definierten Zustand haben.
Also beispielsweise per 10K gegen GND.

geht das so?

Lenox
31.05.2007, 15:53
Hm so hab mal was gecodet.
Der Avr emfängt ein Befehl, startet dann den Motor.
Anschließend versuch er solang eine Bestätigung zurückzuschicken bis die Leitung frei ist.



If Command = "move forward" Then
Speed_left = 200
While Fertig = 0
If Rs232busy = 0 Then
Rs232busy = 1
Print "forward"
Rs232busy = 0
Fertig = 1
End If
Wend
Fertig = 0
End If

Lenox
31.05.2007, 16:15
So habs grad getestet, das Ergebnis ist sehr lustig.

Der M8 soll
Print "forwardm8" bzw Print "stopm8" machen, und der M32
Print "forwardm32" bzw Print "stopm32"

Nun darfst du raten was dabei rausgekommen ist..

forwardm;?stopm;?

Lenox
31.05.2007, 16:22
Hm ich brauch 2 Leitungen zwischen den AVRs, ich kann ja nicht einen als Ein- und Ausgang definieren.

vklaffehn
31.05.2007, 16:30
Moin!
Ich hab da 'nen Vorschlag :

Setze an jedem µC den Pin als Eingang und häng an die Leitung einen Pullup-Widerstand. Dann liest jeder den Pin, und wenn der Pin High ist, darf der Controller seinen Pin als Augang schalten und die Leitung auf Low ziehen, solange er sendet, danach schaltet er den Pin wieder als Eingang, der Pullup zieht das ganze auf High und so weiter.....

MfG
Volker

franzl
31.05.2007, 17:19
Hallo,
den Vorschlag von Volker find ich gut hab ich eigentlich auch so gedacht, auch wenn ich das vielleicht nicht so zu Papier gebracht hab.
Mfg franz

Lenox
31.05.2007, 17:50
So in der Art hatte ich das eben auch probiert, aber es funktionierte nicht (evt. war da noch ein programmfehler drinne).

Ich hab mich jetzt dazu endschieden einfach ein Ring aufzubauen, geht wohl am schnellsten.

Lenox
31.05.2007, 18:30
Hm so funktioniert so halb.
Der erste Befehl kommt auch richtig zurück, aber bei den nächsten kommt irgentwie noch ein Viereck mit.. (hier im Editor macht der ein Zeilenumbruch an der Stelle).

usr> move forward
BlackBot> forward
usr> move stop
BlackBot>
stop

Lenox
31.05.2007, 19:13
So ich habs, man war das ein Hantier.

Man musste hinter Print ein ; setzen.
Dann einfach mit Inkey() ein Array füllen, so lange bis der letze Buchstabe eintrifft.