PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Uart zwischen zwei Megas klemmt - - wieder einmal



Murus
05.05.2007, 23:08
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, 00: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.

PicNick
06.05.2007, 08:48
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) ;

Murus
06.05.2007, 10:43
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

coCo
06.05.2007, 10:50
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

Murus
06.05.2007, 11:00
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, 12: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

Murus
06.05.2007, 16:12
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 :)