PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Serielle Kommunikation zwischen zwei Atmels...



tobimc
24.07.2004, 14:10
Hi Leute!

Ich habe mal wieder ein Problem...
Und zwar: Ich möchte auf meinem Robby ein en Master und einen Slave Prozessor haben.

Master = Atmega16 (16Mhz ext.)
Slave = 90S4433 (Intern ?)

Der Master krigt alle Sensordaten, gibt Befehle und steuert alles.
Der Slave steuert Servos, den Antrieb usw.

Die zwei sollen über eine serielle Verbindung mit TTL-Pegel verbunden werden. Das habe ich schon gemacht.

Ich habe nachgemessen, Master und Slave können Senden und Empfangen.

Programmiert werden die beiden in BASCOM.

Der Code für den Master (= ATMEGA16):



Dim C As Byte
Dim D As String * 3

C = 0

Sound Portd.2 , 100 , 1000
Wait 1

Do

Input C

If C = 1 Then
Sound Portd.2 , 100 , 1000
End If

Input D

If D = "1" Then
Sound Portd.2 , 100 , 1000
End If


Loop
End



Der Code für den Slave (AT90S4433):



Dim A As Byte

Do

Print "1"

Loop


Also das sieht dann so aus: Der Slave sendet 1 an den Master, der daraufhin piepsen soll.

Ich habe den RXD Eingang des Masters an den TXD Ausgang des Slaves angeschlossen und
den TXD Ausgang des Masters an den RXD Eingang des Slaves angeschlossen.

Was läuft da falsch?

Schonmal vielen Dank.....

Liebe Grüße, Tobi

24.07.2004, 14:14
- HAst du die Massen miteinander verbunden, oder laufen die schon über eine! Spannungsquelle?

- Vielleicht solltest du auch mal die BAudrate setzen!

24.07.2004, 14:15
Außerdem, sorry wenn ich da nciht so die Ahnung habe, müssen im Programm nciht noch Takt etc. angegeben werden?

tobimc
24.07.2004, 14:58
Hi gast!

Die Prozzies sind mit 2 7805ern ausgestattet, die über den gleichen Akku betrieben werden.
Also - = - ;)

Die Baudrate: wies nicht. In den einstellungen steht die selbe Baudrate...
Wo/wie kann man die einstellen? Mit Config... ?

Glaube eher, dass das ein Softwareproblem ist.
Deshalb auch in diesem Forum...

Liebe Grüße, Tobi

RCO
24.07.2004, 15:57
Wegen der Stromversorgung:
Es hätte ja sein können, dass du sie beide mit Batterien oder so betreibst, und dann die Massen nicht verbunden hast.


Hier mal ein Beispiel, wie ein Programmanfang aussehen kann:

$regfile = "m8def.dat"
$crystal = 3686400
$lib "mcsbyte.lbx"
$baud = 9600

Da ich aber leider nicht soviel Ahnung habe, aber es halt bei allen Programmen, die man hier so im Forum findet benutzt wird, wollte ich dir es eben nur sagen.

Kann es sein, dass deine If-Anweisung am Ende des Programms nicht vollständig ist?

tobimc
24.07.2004, 16:06
Hi RCO!

Di untere IF-Anweisung im Master-Programm ist meineswissens
OK. Der Compiler meckert auch nicht.

Ist es nicht möglich, das das Einlesen der Schnittstelle nicht funktioniert?

Liebe Grüße, Tobi

24.07.2004, 16:39
Sorry, da bin ich überfragt

tobimc
24.07.2004, 19:12
Hey leute!

Wo sind denn hier die Schnittstellen-Profis?

Liebe Grüße und Danke schonmal bis hier,
Tobi

avatar
24.07.2004, 19:29
Master = Atmega16 (16Mhz ext.)
Slave = 90S4433 (Intern ?)

Ich denke mal, du solltest beide Prozessoren quarzgenau (extern) takten.
Interner Taktung ist zu ungenau für den Baudratengenerator.

Wie willst du mit einem R/C-Generator (=internet Takt)
die Baudrate genau treffen :?:

tobimc
24.07.2004, 19:36
Hi avatar!

werd ich mal umstellen.......

Mal sehen ob das funktioniert...

Let's hope the best...
(Hoffentlch funktioniert der externe Takt. sonst ist der Atmel verreckt.....)
Habe da aber keine großen bedenken...

Mal sehen...

Liebe Grüße, Tobi

avatar
24.07.2004, 19:51
Hi Tobi,

ich verwende wie schon gesagt zwar keine AVR's
aber ich mache es bei der Auswahl der Quarze auch so wie in diesem
Beispiel. Nämlich, dass der Quarz immer ein ganzzahliges Vielfaches
der Baudrate ist. 3686400 durch 9600 lässt sich ohne Rest teilen.
9830400 würde auch gehen. Es gibt natürlich noch andere Quarze,
die sich zur Baudratenerzeugung eignen.


$regfile = "m8def.dat"
$crystal = 3686400
$lib "mcsbyte.lbx"
$baud = 9600

Musst halt mal ein bisschen rechnen und in der Bastekliste kramen.

LG O:)

tobimc
24.07.2004, 19:55
Hi avatar!

Also habe das in den Fuse-bits geändert.
Der Slave schwingt jetzt mit externen 8Mhz.

Die Quarze sind allesamt Grundtonquarze.

Das Ergebniss:

Wenn es mienen beiden Spaß macht, lässt der eine 1 oder 2 Pieps hören!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Das problem liegt jetzt glaube ich an der Sende/Empfangs synchronisierung.

Denn die UARTs sind nicht gebuffert und werden alle paar Takte eingelesen.
Kann so nicht funzen.

Liebe Grüße, Tobi

avatar
24.07.2004, 20:02
Hi Tobi,

um einen Überlauf bei Empfänger zu vermeiden, kannst du es z.B. so machen, dass der Empfänger jedes Byte quittiert und der Sender erst das nächste Byte sendet wenn er die Quittung für das vorherige bekommen hat. Das wäre ein ganz simples Protokoll (nicht für die Übertragung von großen Datenmengen geeignet).

LG :)

RCO
24.07.2004, 20:04
Das problem liegt jetzt glaube ich an der Sende/Empfangs synchronisierung.

Denn die UARTs sind nicht gebuffert und werden alle paar Takte eingelesen.
Kann so nicht funzen.



Sorry wenn ich jetzt die Fragen stelle, was ist den UART, und wie wendest du es an?

tobimc
24.07.2004, 20:09
Hi

@RCO

UART ist praktisch RS232 mit TTL (5V = 1; GND = 0) Pegel.


@avatar

So ist das geplant... ;)
Ich muss im moment dafür sorgen, dass der Mega16 Empfänger jedes Zeichen empfängt...

Mal sehen...

Liebe Grüße, Tobi

tobimc
24.07.2004, 20:14
Hi leuz

Es funktioniert sowet. Ich habe den Fehler gemacht:

Es ist ja ein gebufferter RS232. ich habe immer direkt eingelesen. Jetzt lese ich den Buffer aus... und siehe da....

LG Tobi

avatar
24.07.2004, 20:20
Hab's schon immer gewusst:
Du bist halt ein Genie :!:
LG O:)

tobimc
24.07.2004, 21:01
Hi avatar!

ES FUNKTIONIERT!!!!!!!!!

Der Master sendet zum Slave "1"
und der Slave antwortet "2"!!!

JJUUUCCHHUUUUUUU!

Oh und danke fürs Kompliment...:D

YES ES TUT!!!!!

Liebe Grüße und Danke euch allen (insbesondere avatar!)

Tobi