PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datenübertragung über RXD und TXD



Heideltrudel
18.05.2006, 09:11
Ich habe folgendes Problem.
2 Atmega 128 sind über die Anschlüsse RXD und TXD verbunden.
Beide Atmegas sollen wechselseitig Daten übertragen mittels Com1.
Das funktioniert auch, aber wenn ich beide Atmegas gleichzeititg an einer Spannungsquelle einschalte. Ich möchte aber einen Atmega steckbar mit einem Anschlusskabel versehen. Wenn ich diesen dann einstecke läuft entweder die Sendestrecke oder die Empfangsstrecke nicht.
Nur selten funktionieren auf Anhieb beide Strecken. Müssen die Atmegas bei Verbindungsaufnahme erst miteinander synchronisiert werden? Oder was mache ich falsch. Komme nicht mehr weiter.
Kann mir jemand dabei helfen. Ein kleiner Tipp?

Gento
18.05.2006, 10:46
den Minus vergessen ?
RXD,TXD und Minus müssen gelegt werden, besteht keine gemeinsame Stromversorgung.
Gento

Heideltrudel
18.05.2006, 13:16
Den Minus habe ich natürlich verbunden.
Es sieht so aus als würde ein RXD-Eingang blockiert werden, denn der entsprechende Atmega führt keinen Interrupt aus.
Mein Programm arbeitet so, daß immer wenn URXC =1 ist die empfangenen Daten in mehrere Variablen abspeichert, um sie später abzuarbeiten.

tanthai
18.05.2006, 14:08
Hallo,

kann jemand mir helfen, wie ich rn-minicontrol atmega168 den rn-motor mittels 3pol rs232 steuern kann ?

was muss ich da tun ? Um die Verbindungen zwischen der beiden herzustellen und einen Befehl von rn-minicontrol zu rn-motor zu schicken.

Danke
Tan Thai

-tomas-
19.05.2006, 09:04
@Heideltrudel
ggf. im Programm auf der RX-Seite in einer Schleife baud=xxx zuweisen. Das initialisiert die Schnittstelle neu - da die Ports auch für andere Zwecke verwendet werden können. (Alternativ in ASM neu initialisieren)

Alternativ: eine Soft-COM-Routine benutzten - die bleibt definitiv nicht hängen. Wenn Du noch RX mit einen INT verbindest, brauchst Du auch nicht auf Daten in einer Schleife warten. Siehe dazu mein Bascom Codeschnipsel:https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=17444

Frank
19.05.2006, 09:16
Zu RN-Motor:

Hier hab ich ein Beispiel für die C-Control von der CD, es läßt sich aber leicht auch auf AVR / andere RN-Boards übertragen. Statt Put musst du in Bascom nur CHR benutzen.
Beispiel:

statt wie bei der C-Control


Print "#rmi" ; : Put 2 : Put 58

schreibt man in Bascom


Print "#rmi" ; chr(2 ); chr(58)

usw.

Statt Pause musst du WAIT schreiben

$Baud=9600 am Anfang nicht vergessen





'DEMO das aufzeigt
'wie einfach RN-Motor über RS232
'auch mit einer C-Control angesteuert werden kann

'Motorstrom festlegen

Print "#rmi" ; : Put 2 : Put 58
pause 20

'beide Motoren ein
Print "#rmo" ; : Put 2
pause 20

'beide motoren rechts
Print "#rmd" ; : Put 2 : Put 0

pause 20
'geschwindigkeit
Print "#rmg" ; : Put 2 : Put 25
pause 20

'endlos drehen
Print "#rme" ; : Put 2

#hinundher
pause 1000

'Linker motor nach links
Print "#rmd" ; : Put 0 : Put 0

'rechter motor nach rechts
Print "#rmd" ; : Put 1 : Put 1

pause 1000

'Linker motor nach rechts
Print "#rmd" ; : Put 0 : Put 1

'rechter motor nach links
'Print "#rmd" ; : Put 1 : Put 0

GoTo hinundher

tanthai
19.05.2006, 14:34
Hallo,

es hat funktioniert.
Es macht wirklich spass, wenn es funktioniert.(hihihihihi)

vielen Dank !
Tan Thai

Heideltrudel
22.05.2006, 17:25
Hallo tomas
Vielen Dank für deinen Tip. Ich habe das mit dem Baud=115600 in der Interrupt-Routine, als auch in der Hauptschleife verwendet. Leider ohne nennenswerte Veränderung. Das hat mich aber auf eine weitere Idee gebracht. Atmega Nr1 fragt ständig Portzustände ab und gibt die Zustände über TXD raus zu Atmega Nr2. Nach dem Senden der Zustände von
8 Pins ist erst einmal eine Pause von ca. 4 Sekunden. Danach wiederholt Atmega Nr.1 seine Prozedur.
Ich habe herausgefunden, dass immer wenn ich Atmega Nr2 in der Pause resete dann funktioniert die Datenübertragung immer.
D.h. Er synchronisiert sofort richtig.
Gibt es eine Funktion, mit der ich das Öffnen des RXD-Kanals erst in dieser Pause einsetzen lassen kann ? ](*,)

Hanni
22.05.2006, 21:43
Hmm, klingt zwar hart, aber ich tippe auf Software Probleme ....

Ich selbst habe mit diversen ATmega's ein Projekt realisiert, indem auch die µC <-> µC Kommunikation eine große Rolle spielte ... das einzieg Problem, das ich dabei hatte war eine Syncronisation RX/TX zu RS 422 (glaub).

Heideltrudel
23.05.2006, 06:46
Hallo Hanni,
kannst du diese Synchronisation mal ein bischen näher beschreiben ?
Vielleicht hilft es mir mein Problem zu lösen.

Hanni
23.05.2006, 11:34
hmm .. Ich hatte dort zeitweise das Problem, das ich den Bustreiber zu früh (noch während des sendens) in den Empfangsmodus versetzt hatte.

Gelöst hab ich das mittels diverser Messungen & nem saubererem Code in Bezug auf TX.

Heideltrudel
23.05.2006, 18:17
Hanni hast du nicht den URXC benutzt um einen Interrupt zu starten und dann die entsprechenden Daten auszulesen ? Mittels einer Zählervariablen die immer wenn der Interrupt ausgelöst wird hochgezählt wird und dazu benutzt wird ein Array zu füllen. Diese Zählervariable steht auf Null und zählt bis 41.
Danach wird sie zurückgesetzt und das Spiel beginnt erneut. Vielleicht stimmt die Zählervariable nicht mit den Empfangsdaten überein, wenn ich mitten im Sendedatenfluss meinen Emfänger einschalte. Ich überprüfe das noch !
Melde mich wieder !!!

Vitis
23.05.2006, 20:13
es gibt Flags in den AVRs, eines davon zeigt ob der
Senderpuffer leer, also ale Zeichen raus sind.

do
loop until Ucsra.txc=1 (prüfen auf leeren Sendepuffer)

Heideltrudel
25.05.2006, 11:38
Hallo Leute es Klaaaaaapt !!!!!!
Es lag an der Synchronisation. Ich übertrage 41 Bytes hintereinander.
Damit Byte 1 im Sender auch mit Byte 1 im Empfänager übereinstimmt habe ich im Empfänger einen Zähler, der mir jedes empfangene Byte in der richtigen Variable ablegt. Diesen Zähler habe ich immer von Null bis 41 zählen lassen und dann wieder zurückgestellt. Das klappt aber nur, wenn ich beide Atmegas gleichzeitig einschalte. Würde Atmega Nr 1 im Sendevorgang sein und ich dann Atmega Nr2 einschalte, dann kommt er durcheinander.
Also habe ich den Carridge Return ( Zezimal 10 ) der vom Sender immer dann gesendet wird, wenn die 41 Bytes gesendet wurden, verwendet.
Den nehme ich zur Synchronisation meines Zählers und dann kann ich einschalten wann ich will es funktioniert immer !!!!
=D> =D> =D>

Vielen Dank an alle dir mir dabei geholfen haben! Manchmal braucht man nur einen Denkanstoss.
Bis zum nächsten Mal Tschüß O:)