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.
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
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.
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 SchleudernPrint Led(i)
also
Print Led(i) ;
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hmhm, geht noch nicht.
GND verbunden.
Hier die Codes: (nur Wesentliches)
Sender:Und der Empfänger:Code:$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
Diese If-Abfrage in der Do-loop-Schleife wird nicht erreicht, "Emfpang" wird also nicht 42lang, falls sich überhaupt was tut.Code:$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
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!
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
Lesezeichen