ATmega UART spinnt

Gast #3644705
Lesenswert?

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
Gast #3644715
Lesenswert?

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
}
Angehängte Dateien:
Gast #3644716
Lesenswert?

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
#3644717
Lesenswert?

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?
Gast #3644759
Lesenswert?

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.
Gast #3644766
Lesenswert?

... 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...
Gast #3644769
Lesenswert?

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.
Gast #3644785
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren