...und die Fusebits sind auch so eingestellt, dass das Teil mit 8 MHz läuft? Verwendest Du einen Quarz, oder den internen RC-Oszillator?Ich habe die Crystal auf 8000000 und die Baud auf 19200 eingestellt
Hallo zusammen,
ich versuche seit ein paar Tagen einen Atmega8 mittels MAX485 in ein RS485 Halbduplex netzwerk ein zu binden.
Mein Problem ist, egal was ich den µC senden lasse ich bekomme immer einen Murx raus. Habe versucht per Tastendruck die Zahl 300 als Integer mit Printbin zu senden: Erhalten müsste ich ja etwas wie 00000001 00101100, tatsächlich erhalte ich aber 00000000 10000000. Ich habe die Crystal auf 8000000 und die Baud auf 19200 eingestellt. Das müsste dich so stimmen oder? Wo könnte mein Fehler liegen?
Hier is der Schaltplan des MAX485.
...und die Fusebits sind auch so eingestellt, dass das Teil mit 8 MHz läuft? Verwendest Du einen Quarz, oder den internen RC-Oszillator?Ich habe die Crystal auf 8000000 und die Baud auf 19200 eingestellt
Wie müsste denn die Einstellung der Fusebits aussehen für den Atmega8, dass er mit 8 MHz und 19200 Baud läuft?
Ich dachte das der Atmega8 einen internen Oszillator hat?
Wird eigentlich in Bascom die Einstellung in meinem Projekt gespeichert wenn ich was in den Fusebits ändere?
Geändert von demmy (02.08.2011 um 08:51 Uhr)
Klar, der Mega8 hat natürlich einen internen RC-Oszllator. Im Auslieferungszustand ist der aber auf eine Frequenz von 1 MHz eingestellt. Wenn Du also noch nichts an der Fuses geändert hast, wird er wohl noch mit dieser Taktfrequenz laufen.
Das kannst Du ganz einfach testen, indem Du eine LED in einem bestimmten Takt blinken lässt, z.B. einmal pro Sekunde ein und aus:
Wenn das Programm in "Zeitlupe" läuft, ist der tatsächliche Takt langsamer als der Wert bei $Crystal.Code:$regfile = mega8def.dat (oder so...) $Crystal = 80000000 Config PortX.Y = output Do Toggle PortX.Y Waitms 500 Loop
Mhh ok das heißt also ich muss den Internen Oszillator auch auf 8 MHZ einstellen um 19200 Baud zu erhalten?
Ich habe auch gelesen, dass man einstellen kann ob der interne oder ein externer Oszillator verwendet werden soll. Ich würde gerne den Internen nutzen.
Wie müssten denn die Einstellungen dann aussehen?
Na ja - ob 19.200 Baud mit 1 MHz nicht vielleicht auch klappen könnten, müsste man mal schauen (dazu später mehr). Aber eins steht fest: Die Angabe bei $Crystal legt NICHT fest, mit welchem Takt der Controller läuft! Das kann man ausschließlich mit den Fusebits einstellen (die übrigens auch unverändert bleiben, wenn Du "normalen" Programm-Code in den Controller brennst).Mhh ok das heißt also ich muss den Internen Oszillator auch auf 8 MHZ einstellen um 19200 Baud zu erhalten?
Wenn aber der tatsächliche Takt (Fuses) und die Angabe bei $Crystal nicht übereinstimmen, sind alle zeitlichen Berechnungen falsch, die Bascom macht. Und dann kann´s mit einer koordinierten Übertragung via RS232 nicht klappen.
Also solltest Du vielleicht erstmal den internen Takt auf 8MHz stellen. Wie das in Bascom geht, weiß ich nicht, da ich meine Fusebits mit einem anderen Programm bearbeite. Aber das dürfte ja nicht allzuschwer herauszufinden sein. Vorsicht ist bei der Option "externer" Takt geboten: Wenn Du diese Option einmal gewählt hast, schaltet sich der interne Oszillator ab - und dann hast Du erst wieder Zugriff auf den Controller, wenn Du ihn mit einem externen Taktsignal versorgst (z.B. einem 1MHz-Rechteckgenerator).
Und zu den Baudraten muss man wissen, dass es zu jeder Taktfrequenz "passende" Baudraten gibt, d.h. Baudraten, die sich mit einer tolerablen Fehlerrate generieren lassen. Abweichungen von ein paar Prozent können schon nachhaltige Probleme bei der Datenübertragung verursachen. Deshalb wird auch oft empfohlen einen Quarz zu verwenden, wenn die UART-Schnittstelle benutzt werden soll. Schau im Netz einfach mal unter Baudraten-Rechner nach - da wirst Du einiges finden!
Das Problem bei internen Takt, der ist nicht besonders genau was dann zu fehlern in der Übertragung führt weil die Baudrate nicht ganz stimmt. Mit 2400..4800 geht es noch ganz gut bei 19200 hmmmmm....Wenn Du noch keine Fuse verändert hast, stelle $Baut = 2400 ein und teste erst einmal ob die Übertagung an sich klappt. Wenn das der Fall ist kannst immer noch erhöhen. Denke daran...auf beiden Seiten 2400 Baut 8 N 1. Wie herum die AB TXRX angeschlossen werden müssen kannst Du mit dem Volt Meter messen die Pegel sollen + auf + / - auf- angeschlossen werden
Gruß Richard
Also ich hatte bisher beim internen Oszilator nie Probleme mit dem UART.....selbst 38400 waren kein Problem. Aber wichtig ist halt das die Taktfrequenz intern stimmt damit die Berechnungen die Bascom aufgrund deiner Taktangabe macht, auch richtig sind und funktionieren. Im Zweifelsfall einfach einen Quarz anklemmen. Ist meistens eh besser und kostet auch nicht viel . Es gibt auch Quarze mit speziellen Frequenzen die extra für genaue Baudraten ausgelegt sind.
So also ich habe jetzt versucht die Fusebits zu ändern, allerdings übernimmt er das irgendwie nicht??
Eingestellt war folgendes:
Ich habe dann versucht, dass ein zu stellen:
Wenn ich dann auf Fusebits schreiben klicke wird zwar etwas geschrieben, aber sobald der µC neu ausgelsesen wurde steht der alte Wert wieder drinne.
Ich Benutze einen ISP-Programmer falls das von interesse ist?
Anschließend ist mir aufgefallen dass im Programm folgende Zeile eingefügt wurde.
$prog &H00 , &H00 , &H00 , &H00 ' generated. Take care that the chip supports all fuse bytes.$PROG &H00,&H00,&H00,&H00' generated. Take care that the chip supports all fuse bytes.
Daraufhin habe ich versucht das Programm neu zu übertragen was er auch gemacht hat. Am Ende jedoch stand etwas mit Fuse-bits, was mit einer Fehlermeldung abgebrochen wurde.
Was mache ich falsch?
Ich habe noch mie versucht in Bascom Fusebit's zu setzen viel zu kompliziert. Für so etwas nehme ich das Studio 4, das klappt immer.
Gruß Richard
Lesezeichen