Forum: Mikrocontroller und Digitale Elektronik UART: atmega32 atmel evaluationboard nur Nullen


von giga (Gast)


Angehängte Dateien:

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
}

von Karl H. (kbuchegg)


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?

von Giga (Gast)


Lesenswert?

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

von Giga (Gast)


Lesenswert?

Habe jetzt das ifndef entfernt, hat aber leider nichts bewirkt

von Karl H. (kbuchegg)


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.

von giga (Gast)


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?

von Karl H. (kbuchegg)


Lesenswert?

giga schrieb:

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

Du musst die Fuses umstellen, damit der AVR auch weiß, dass er da einen 
Quarz hängen hat den eer benutzen soll.

Aber Vorsicht:
http://www.mikrocontroller.net/articles/AVR_Fuses#Taktquellen_Fuse_Einstellung

von giga (Gast)


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

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.