Forum: Compiler & IDEs Atmega32u4 USART Atmelstudio 7


von P. F. (funkpurzel)


Lesenswert?

Hallo,

ich wollte mit AtmelSudio 7 an meinem Atmega 32u4 den USART 
ausprobieren. Dazu habe ich ein C-Projekt (für Atmega 32U4) angelegt, 
und den unten stehenden Code (aus dem AVD GCC-Tutorial)  in "main.c" 
eingegeben.
Bereits beim Compilieren erhalte ich eine Reihe von Fehlern, die sich 
all auf  USART-Registernamen des 32U4 beziehen, z, B,

'UBRRH'undeclared (first in this function) usw.

Da mir aus dem Datenblatt des 32u4 nicht klar wurde, wie diese Name 
genau lauten müssen, habe ich sie variiert , z, B,

"UBRRH0, UBRR0H, UBRRH",

erhalte aber stets vergleichbare Fehler für die entsprechenden Register.
Da mir dies als Hinweis auf das Fehlen einer Header-Datei für den 32U4 
erschien (obwohl ich diesen in der Projekterstellung ja gewählt hatte), 
habe ich mal in die avr/io.h hineingeschaut. Dort gibt es einen Verweis 
auf die iom32u4.h. Aber auch in dieser befindet sich keine Definition 
für die USART-Register.

Wo befinden sich diese Definitionen?


/*
 * Versuch in C_1.c
 *
 * Created: 16.06.2016 17:17:04
 * Author : FuPu
 */

#include <avr/io.h>
#include <stdlib.h>
//#include <iom32u4.h>

/*
  UART-Init:
Berechnung des Wertes für das Baudratenregister
aus Taktrate und gewünschter Baudrate
*/

#ifndef F_CPU
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
   F_CPU im Makefile definiert werden, eine nochmalige Definition
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
   #ifndef/#endif

   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio
   verwendet wird und dort eine andere, nicht zur Hardware passende
   Taktrate eingestellt ist: Dann wird die folgende Definition
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?)
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
   noch nicht definiert: */
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 
4000000"
#define F_CPU 16000000UL  // Systemtakt in Hz - Definition als unsigned 
long beachten
                         // Ohne ergeben sich unten Fehler in der 
Berechnung
#endif

#define BAUD 9600UL      // Baudrate

// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = 
kein Fehler.

#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu 
hoch!
#endif


void uart_init(void)
{
UBRRH0 = UBRR_VAL;
  UCSRB |= (1<<TXEN);
  // Frame Format: Asynchron 8N1
  UCSRC = (1<<UCSZ1)|(1<<UCSZ0);
}


int main (void)
{
  char c =0;

  while (!(UCSRA & (1<<UDRE)))  // warten bis Senden moeglich
  {
  }
  UDR = c;                      // sende Zeichen */
  return 0;

}

von Karl M. (Gast)


Lesenswert?

Hallo P. F.,

es ist schon verwunderlich was man alles im Datenblatt eines atmega32u4 
finden kann !

Dieser hat keinen USART0 !

Also nicht klagen, sondern aus dem Datenblatt die benötigten Register 
und Bit-Namen extrahieren.

von Karl M. (Gast)


Lesenswert?

Hallo,

Du kannst ja mal deine *iom32u4.h* mit einer der vielen aus dem INET 
vergleichen.

https://github.com/vancegroup-mirrors/avr-libc/blob/master/avr-libc/include/avr/iom32u4.h

Und dann suche bitte im Datenblatt und in der *iom32u4.h* nach "UCSR1A".

von Frickelfritze (Gast)


Lesenswert?

Karl M. schrieb:
> es ist schon verwunderlich was man alles im Datenblatt eines atmega32u4
> finden kann !

Finde ich auch.

1
/* Versuch in C_1.c
2
 *
3
 * Created: 16.06.2016 17:17:04
4
 * Author : FuPu                        */
5
6
#include <avr/io.h>
7
#include <stdlib.h>
8
9
/*  UART-Init:
10
    Berechnung des Wertes für das Baudratenregister
11
    aus Taktrate und gewünschter Baudrate
12
*/
13
14
#ifndef F_CPU
15
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
16
   F_CPU im Makefile definiert werden, eine nochmalige Definition
17
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
18
   #ifndef/#endif
19
20
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio
21
   verwendet wird und dort eine andere, nicht zur Hardware passende
22
   Taktrate eingestellt ist: Dann wird die folgende Definition
23
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?)
24
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
25
   noch nicht definiert: */
26
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
27
#define F_CPU 16000000UL  // Systemtakt in Hz - Definition als unsigned long beachten
28
                          // Ohne ergeben sich unten Fehler in der Berechnung
29
#endif
30
31
#define BAUD 9600UL      // Baudrate
32
33
// Berechnungen
34
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
35
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
36
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
37
38
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
39
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
40
#endif
41
42
void uart_init(void)
43
{
44
  UBRR1 = UBRR_VAL;
45
  UCSR1B |= (1<<TXEN1);
46
  // Frame Format: Asynchron 8N1
47
  UCSR1C = (1<<USBS1)|(1<<UCSZ10);
48
}
49
50
int main (void)
51
{
52
  char c =0;
53
54
  while (!(UCSR1A & (1<<UDRE1)))  // warten bis Senden moeglich
55
  {
56
  }
57
  UDR1 = c;                      // sende Zeichen */
58
  return 0;
59
60
}

von P. F. (funkpurzel)


Lesenswert?

Hallo, Karl M.

Ich habe inzwischen auf

https://github.com/tomvdb/avr_arduino_leonardo/blob/master/examples/uart/main.c

ein anderes Beispiel gefunden, in dem andere Registernamen verwendet 
werden.
z. B. UBRR1H anstatt der o. a. genannten Namen in meinem Beispiel.

Dieses Beispiel lässt sich builden und meine HW sendet auch, allerdings 
bisher nur unleserliche Zeichen. Das werde ich aber morgen wohl noch 
hinkriegen.

Nicht klar ist mir die "1" in UBRR1H. Das sieht ja so aus, als habe der 
32U4 soger zwei USARTs (0 und 1).

Die bisher von mir verwendeten Header-Dateiein stammen alle aus der 
AtmelStudio-7-Original-Installation, da wurde nichts geändert.

...und Hallo, Frickelfritze,

Wie ich gerade noch sehe, werden in deinem Beispiel ja noch einmal 
andere Registernamnen verwendet ?!?

von Frickelfritze (Gast)


Lesenswert?

P. F. schrieb:
> Wie ich gerade noch sehe, werden in deinem Beispiel ja noch einmal
> andere Registernamnen verwendet ?!?

Oh Mann, das ist alles gaaaaaz simpel aus dem Datenblatt geklaut.

Ist dein PDF kaputt oder dein PDF-Reader?
Oder hast du gar kein Datenblatt?

von Karl M. (Gast)


Lesenswert?

Hallo,

was ist an der Mitteilung - dieser, der atmega32u4, hat keinen USART0" 
unklar ?

Und das Datenblatt ist doch genau so zu lesen, wie es dort geschrieben 
steht. Was verstehst Du daran nicht ?
Am Ende findet man noch eine Auflistung aller Register-Namen und deren 
Bit-Bezeichnungen, also einfacher kann es doch nicht mehr sein !

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.