UART: atmega32 atmel evaluationboard nur Nullen

Gast #2335200
Lesenswert?

hallo,

bin anfänger und wollte das UART-Tutorial auf dem atmel 
evaluations-board version 2.0.1 ausprobieren.

Problem ich will die Zahlen 0123456789 senden, erhalte am PC aber nur 29 
Nullen (siehe Anhang, hterm.jpg)

zur info: verwende einen usb2serial-adapter, mit dem ich aber ohne 
probleme den atmega programmieren konnte

habe folgenden c-code verwendet
1
#include <avr/io.h> 
2

3
#ifndef F_CPU
4
#define F_CPU 16000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
5
                         // Ohne ergeben sich unten Fehler in der Berechnung
6
#endif
7
 
8
#define BAUD 9600UL      // Baudrate
9
 
10
// Berechnungen
11
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
12
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
13
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
14
 
15
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
16
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
17
#endif 
18

19

20

21

22
void uart_init(void)
23
{
24
  UBRRH = UBRR_VAL >> 8;
25
  UBRRL = UBRR_VAL & 0xFF;
26
 
27
  UCSRB |= (1<<TXEN);  // UART TX einschalten
28
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1 
29
}
30

31
int uart_putc(unsigned char c)
32
{
33
    while (!(UCSRA & (1<<UDRE)))
34
    {
35
    }                             
36
 
37
    UDR = c;
38
    return 0;
39
}
40

41
int main (void) 
42
{
43
  char c;
44
 
45
  uart_init();
46
  for (uint8_t i=0; i<=9; ++i) {
47
    c = i + '0';
48
    uart_putc(c);
49
  }
50
  
51
  while (1)
52
    ;
53
  
54
  return 0;
55
}
Angehängte Dateien:
#2335217
Lesenswert?

Tausch als erstes mal das hier
1
#ifndef F_CPU
2
#define F_CPU 16000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
3
                         // Ohne ergeben sich unten Fehler in der Berechnung
4
#endif

gegen eine Version ohne #ifdef aus
1
#define F_CPU 16000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
2
                         // Ohne ergeben sich unten Fehler in der Berechnung

damit wir mal eine Zahl haben, mit der man rechnen kann.


Dein µC läuft also angeblich mit 16Mhz. Hast du das kontrolliert?
#2335272
Lesenswert?

Giga schrieb:
> Naja, es ist auf dem board ein 16 Mhz quarz an den atmega 32 gehängt

Das heißt noch lange nicht, dass der auch benutzt wird.
Drum hab ich gefragt, ob du das auch kontrolliert hast!

1
#define F_CPU 16000000UL
2

3
#include <avr/io.h>
4
#include <util/delay.h>
5

6
// Porteinstellungen für eine LED
7
#define LED_PORT PORTB  
8
#define LED_DDR  DDRB
9
#define LED_BIT  PB1
10

11
int main()
12
{
13
  LED_DDR |= ( 1 << LED_BIT );
14

15
  while( 1 ) {
16
    LED_PORT |= ( 1 << LED_BIT );
17
    _delay_ms( 1000 );
18
    LED_PORT &= ~( 1 << LED_BIT );
19
    _delay_ms( 1000 );
20
  }
21
}

setz deine Werte für einen Port ein an dem eine LED hängt und lass das 
Programm laufen. Wenn dein µC wirklich mit 16Mhz arbeitet, dann leuchtet 
deine LED 1 Sekunde und ist 1 Sekunde dunkel. Wenn nicht, dann läuft der 
µC höchst wahrscheinlich immer noch mit der Werkseinstellung von 1 MHz 
und die LED ist 16 Sekunden hell und 16 Sekunden dunkel.
Gast #2335319
Lesenswert?

Ok, du hast recht, es braucht ca. 16 Sekunden.
wenn ich jetzt aber F_CPU 1000000UL in mein UART-test-programm eintrage, 
bekomme ich die "Systematischer Fehler der Baudrate grösser 1% und damit 
zu hoch!" - Meldung

ich bin leider ein anfänger, darum die frage:
wie kann das sein, wenn ein 16 MHz Quarz am XTAL1 und XTAL2 hängt?

was kann ich da machen?
Gast #2335473
Lesenswert?

Vielen Dank für den Tipp, jetzt funktioniert der UART perfekt!!!

Zur Info für diejenigen mit dem gleichen problem:
habe jetzt mit avrdude ... -U lfuse:w:0xcf:m -U hfuse:w:0x89:m auf den 
externen quarz umgestellt

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