Archiv verlassen und diese Seite im Standarddesign anzeigen : Serielle Kommunikation zwischen zwei Atmels...
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
- HAst du die Massen miteinander verbunden, oder laufen die schon über eine! Spannungsquelle?
- Vielleicht solltest du auch mal die BAudrate setzen!
Außerdem, sorry wenn ich da nciht so die Ahnung habe, müssen im Programm nciht noch Takt etc. angegeben werden?
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
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?
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
Sorry, da bin ich überfragt
Hey leute!
Wo sind denn hier die Schnittstellen-Profis?
Liebe Grüße und Danke schonmal bis hier,
Tobi
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 :?:
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
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:)
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
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 :)
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?
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
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
Hab's schon immer gewusst:
Du bist halt ein Genie :!:
LG O:)
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.