Hallo,
ich besitze einen STK600 board mit dem ich meinen Atmega324P über JTAG
flash/debug.
Ich habe mir die Doku bereits gelesen und habe die UART Schnittstelle
konfiguriert. Habe #define F_CPU (1000000UL) gesetzt.
Mit der Baudrate von 4800 funktioniert alles.
Problem: Sobald ich die Baudrate oder die F_CPU ändere, wird Schrott
gesendet (z.B statt 0xA0 wird 0XF1 gesendet). Leider habe ich keine
Ahnung woran es liegen kann....
Mit freundlichen Grüßen
Tim
Tim schrieb:> Leider habe ich keine> Ahnung woran es liegen kann....
und du erwartest ernsthaft, dass dir hier jemand helfen kann, ohne dass
du Schaltung und/oder Programm zeigst? Was ist denn das schon wieder für
ein Geheimprojekt?
HI
> Leider habe ich keine Ahnung woran es liegen kann....
Ganz einfach, mit 1MHz Takt sind 4800Bd Ende der Fahnenstange.
>oder die F_CPU ändere
F_CPU muss dem Takt deines Controllers entsprechen.
MfG spess
Tim schrieb:> Ich habe mir die Doku bereits gelesen und habe die UART Schnittstelle> konfiguriert. Habe #define F_CPU (1000000UL) gesetzt.
Also interner Takt.
Ist nicht optimal für eine UART. Denn die 1000000 sind des öfteren schon
mal von 1000000 recht weit entfernt. Quarz wäre besser.
> Mit der Baudrate von 4800 funktioniert alles.>> Problem: Sobald ich die Baudrate
dann musst du natürlich auch auf der Gegenstelle die gleiche Baudrate
einstellen.
> oder die F_CPU ändere
F_CPU alleine ändern bringt nichts. F_CPU ist die Information für den
Compiler. Aber nur weil dur F_CPU änderst, wird der eigentliche µC nicht
anders getaktet. WEnn du mit der Taktfrequenz höher gehen willst, dann
musst du an die Fuses rann, und diese höhere Taktfrequenz dort auch
einstellen bzw. die entsprechende Quarz-Verwendung auch freischalten.
Hast du das gemacht?
Der Witz ist, dass es im Datenblatt Tabellen gibt, die für viele
Kombinationen den errechneten Fehler in Prozent angeben. Alles über 3%
wird nicht funktionieren (zumindest nicht zuverlässig), je näher man an
0% ist desto besser.
Ich dachte alleine mit der #define F_CPU (1000000UL) wird der Takt
angepasst.
Im Anhang sind die Einstellungen für die Fuse die im Moment sind. Was
muss ich dort ändern um einen anderen Takt zu bekommen ?
Danke
Tim schrieb:> Ich dachte alleine mit der #define F_CPU (1000000UL) wird der Takt> angepasst.
nein, wie KHB oben schon schrieb! Mit F_CPU wird nur 'dem Programm'/dem
Compiler mitgeteilt, mit was für einer Takfrequenz der µC laufen wird,
aber dafür musst du dann selbst durch einen passenden externen Quarz
sorgen...
Hi
IntRCOSZI passt schon so. Wenn du den Haken bei CKDIV8 weg machst, hast
du 8MHz.
Trotzdem macht USART mit internem RC-Oszillator keinen Spass.
MfG spess
Tim schrieb:> Vielen Dank mit CKDIV8 Häckchen weg, klappt es bei 8Mhz aber angenommen> ich würde mit 4Mhz arbeiten wollen, was müsste ich da einstellen ?
Dann müsstest Du nicht nur etwas einstellen sondern auch einen 4MHz
Quarz oder Oszillator an den uC anschliessen.
Die einzigen beiden Frequenzen, die Du ohne weitere Hardware erreichst,
also mit dem internen RC-Oszillator sind 1MHz und 8MHz.
Tim schrieb:> aber angenommen> ich würde mit 4Mhz arbeiten wollen, was müsste ich da einstellen ?
Einen 4Mhz externen Quarz/Oszillator dranhängen.
Alleine Einstellungen ändern reicht dann nicht mehr.
> 4Mhz
Geht beim 324 nicht mit Bordmitteln.
In dem Fall wirst du dann einen Quarzoszillator bzw. einen Quarz
anschliessen müssen und den mittels Fuse aktivieren müssen.
PS: Das Datenblatt
http://www.atmel.com/images/doc7674.pdf
ist dein Freund. Da gibt es ein ganzes Kapitel zum Thema "welche
Möglichkeiten der Taktung gibt es?"
... 4MHz gehen nicht durch "einstellen" ... du kannst nur wählen ob Du
mit 8MHz oder 1/8 davon - 1MHz arbeiten möchtest.
Alles andere geht nur durch eine externe Lösung: Quarz,
Quarzoszillator...
Einfach in Deiner Software im Register CLKPR den passenden Teilerfaktor
einstellen. Das Fusebit sorgt auch nur für den passenden Initwert in
diesem Register beim Prozessorstart. Für Powermanagement oder ähnliches
kann man aber zur Laufzeit den Takt bzw. den Teilerfaktor ändern.
Der Witz ist folgender: Beim Reset ist entweder der Faktor 1 oder der
Faktor 8 eingestellt, je nach CKDIV8.
Du kannst dann, z.B. als allererste Aktion in Deinem Programm (aber auch
sonst zu jedem beliebigen Zeitpunkt) mittels CLKPR den Takt verändern.
In der Regel aber kannst Du jede Taktteilung die Du für den UART
benötigst auch über dessen UBR-Register einstellen. Da Du mit dem
RC-Oszillator ohnehin das Problem hast, dass er sehr ungenau ist und
etwa 4800 die Grenze darstellt, spielt es keine große Rolle ob Du nun
den Teilerfaktor im USART oder im Prescaler veränderst - es wird beides
nicht helfen.
Eine eigene Frage?
Dieser Thread ist über 12 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.