Forum: Mikrocontroller und Digitale Elektronik ATmega UART spinnt


von Tim (Gast)


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

von Justus S. (jussa)


Lesenswert?

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?

von Tim (Gast)


Angehängte Dateien:

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
}

von spess53 (Gast)


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

von Karl H. (kbuchegg)


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?

von Tim (Gast)


Lesenswert?

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

von Justus S. (jussa)


Lesenswert?

Tim schrieb:
> bis 8Mhz unterstützt der uC

dann verrate doch bitte mal, wie du die Taktfrequenz des µCs 
einstellst...

von Karl H. (kbuchegg)


Lesenswert?

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
von Tim (Gast)


Angehängte Dateien:

Lesenswert?

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

von Tim (Gast)


Angehängte Dateien:

Lesenswert?

Sry falsches Bildformat

von Justus S. (jussa)


Lesenswert?

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...

von spess53 (Gast)


Lesenswert?

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

von Tim (Gast)


Lesenswert?

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 ?

von Bitflüsterer (Gast)


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.

von Sepp (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

> 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
von SkyperHH (Gast)


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...

von Chefkoch (Gast)


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.

von Chefkoch (Gast)


Lesenswert?

siehe Seite 40 im oben genannten Datenblatt

von Bitflüsterer (Gast)


Lesenswert?

Ui. Da hat der Chefkoch recht. Na, Mahlzeit!

von Bitflüsterer (Gast)


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.

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
Noch kein Account? Hier anmelden.