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?
1 | #ifndef F_CPU
|
2 | #define F_CPU (1000000UL )
|
3 | #endif
|
4 | |
5 | #include <avr/io.h> |
6 | #include <util/delay.h> |
7 | #include <stdlib.h> |
8 | #include <avr/interrupt.h> |
9 | #include <avr/pgmspace.h> |
10 | |
11 | #include "uart.h" |
12 | |
13 | /* 9600 baud */
|
14 | #define UART_BAUD_RATE 9600
|
15 | |
16 | #define LED_PORT PORTB
|
17 | #define LED_DDR DDRB
|
18 | #define LED_PIN PB0
|
19 | |
20 | |
21 | int main(void) |
22 | {
|
23 | uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); |
24 | |
25 | while(1) |
26 | {
|
27 | _delay_ms(100); |
28 | uart_putc(0x60); |
29 | |
30 | }
|
31 | }
|
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: mit 4Mhz klappt gar keine Baudrate und bis 8Mhz unterstützt der uC eigentlich. Alles außer 1Mhz und 4800 Baudrate klappt nicht
Tim schrieb: > bis 8Mhz unterstützt der uC dann verrate doch bitte mal, wie du die Taktfrequenz des µCs einstellst...
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.
:
Bearbeitet durch User
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
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 ?
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?"
:
Bearbeitet durch User
... 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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.