Archiv verlassen und diese Seite im Standarddesign anzeigen : Uart zwischen zwei Megas klemmt - - wieder einmal
Hallihallo :)
Ich möchte 42 Bytes von einem Mega32 zu einem Mega8 schicken.
Hier die Daten:
Mega32: 16MHz Quarz
Mega8: 8MHz interner Oszillator
Baudrate: 9600
TxD vom einen ist an RxD vom Anderen angeschlossen und umgekehrt, physikalischer Kontakt ist gewährleistet.
Der Mega32 sendet die Daten (Print-Befehl in Bascom), auf der Leitung tut sich was. (Oszi)
So sieht die Senderoutine aus:
For i=1 to 42
Print Led(i)
Next
Led ist ein Array, alle Stellen sind beschrieben.
auch wenn ich nach dem Printbefehl etwas warte (10ms) klappts nicht.
Im Empfänger nutze ich den UART-Empfangsinterrupt.
In der Interruptroutine vom Empfang wird das UDR-Byte zu einem vorhanden String hinzuaddiert.
Leider scheint nicht einmal diese Interruptroutine erreicht zu werden, sprich, der Mega8 (Empfänger) tut so, als ob nichts ankäme, werde das morgen nochmals untersuchen.
Frage: stimmt die Hardware (basierend auf obigen Daten)? (besonders Taktraten/Baudraten, passt des?)
Herzlichen Gruss und vielen Dank
linux_80
06.05.2007, 01:22
Hallo,
was mir als erstes dazu einfällt,
sind alle Gnd Anschlüsse beider AVRs miteinander verbunden ?
Zeig evtl. auch den EmpfängerCode, dann lässt sichs leichter drüber nachdenken.
Print Led(i)
da mußt du auf jeden fall ein semikolon anhängen, sonst wird <CR><LF> angehängt (Zeilenvorschub), und da kömmt der Empfänger ins Schleudern
also
Print Led(i) ;
Hmhm, geht noch nicht.
GND verbunden.
Hier die Codes: (nur Wesentliches)
Sender:
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 4800
Ddra.7 = 0
Porta.7 = 1
Ddra.6 = 0
Porta.6 = 1
Ddra.5 = 0
Porta.5 = 1
Ddra.4 = 0
Porta.4 = 1
Dim Led(42) As Byte ' Array für Matrixled: 0= Aus, 1= Grün, 2= Rot, 3=orange
Dim I As Byte
' Zuerst alle aus
For I = 1 To 42
Led(i) = 0
Next
Dim A As Byte
A = 1
Dim B As Byte
B = 1
Do
' Eine Matrix-Led mehr aufleuchten lassen:
If Pina.4 = 0 Then
Waitms 300
Toggle Porta.0
Gosub Matrixchange
End If
Loop
Matrixchange:
' nächste LED
Led(b) = A
Incr B
'Falls alle leuchten:
If B = 43 Then
B = 1
For I = 1 To 42
Led(i) = 0
Next
Incr A
If A = 4 Then
A = 1
End If
End If
' nun noch per UART schicken:
For I = 1 To 42
Print Led(i);
Waitms 2
Next
Return
Und der Empfänger:
$regfile = "m8def.dat"
$crystal = 8000000
$baud = 4800
On Urxc Serielleroutine
Enable Urxc
Enable Interrupts
Dim Empfang As String * 50
Empfang = ""
Do
If Len(empfang) =42 Then
For I = 1 To 42
Blablabla (unwichtig)
Next
Empfang = ""
End If
Loop
Serielleroutine:
Empfang = Empfang + Chr(udr)
Return
Diese If-Abfrage in der Do-loop-Schleife wird nicht erreicht, "Emfpang" wird also nicht 42lang, falls sich überhaupt was tut.
Nun schau ich noch, ob der Serielle Interrupt überhaupt erreicht wird.
Im Empfänger läuft aber noch der Timer0-interrupt, der mit 36kHz einen Interrupt auslöst... Könnte das ein Grund für Störungen sein?
Aaaah, ich habs! Es war tatsächlich der Timer! Hab seinen Prescale mal auf 1024 gestellt, jetzt wird alles sauber und korrekt empfangen...
Jetzt mach ichs einfach so, dass der Mega32 zuerst etwas kurzes schickt, damit der Timer im Mega8 abgestellt werden kann. Dann blinkt halt die Matrix kurz aber was solls.
Herzlichen Gruss und Danke
Mario
Hi,
was mir auffällt:
Bei deinen For-Schleifen schreibst du immer "For x=0 to 100 ... Next"
Das muss dann aber "Next x" heißen. Also bei deinem Sender zum Beispiel:
For I = 1 To 42
Led(i) = 0
Next I
Keine Ahnung obs daran liegt.
MfG
Ne, es geht auch ohne Next I.
Nur wenn ich verschachtelte For-Schleifen habe nehme ich das Next I, wäre aber auch da unnötig.
Der Compiler nimmt dann einfach das Next, das zuerst kommt.
Aber jetzt gehts ja, hab die Baudrate auf 19200 hochgedreht und den Prescaler auf 8. Tipptopp, vielen Dank!
xunwichtig
06.05.2007, 13:16
Was mir dazu nur einfällt ist dein Quarz! ... Der ist nicht wirklich Optimal dimensioniert für eine Stabile übertragung. Die internen 8MHz is eigentlich schon nicht kompatibel zu einem PC (da du aber zwischen 2 selbige 8MHz takt-Controler überträgst, kann man das vernachlässigen) das du allerdings den Internen Quarz nimmst, find ich nicht besonders toll, da dieser doch SEHR ungenau ist, im vergleich zu eienm externen Quarz.
Ich empfehle dir einen Externen Quarz mit >genau< 11059,200 KHz (also .. 11,0592 MHz) ... dieser ist rechnerisch der ideale Takt für die Kommunikation im Baud-Raster mit dem UART.
JimJim
XUN
Hmm.. geht net...
Alle Pins des Mega8 sind besetzt :)
Ist übrigens kein interner Quarz, sondern ein RC-Oszillator (drum ja etwas ungenau)
Ausserdem funktionierts ja... also was solls :)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.