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; }
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.
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".
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 | }
|
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 ?!?
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.