PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : USART Initialization ATmega644 8MHz



AT90S1200
19.03.2011, 15:40
Hallo

Ich versuche schon seit ner weile meinen AVR zu initialisieren, dass Problem mein avr Studio das mit dem winavr-gcc arbeitet findet den 'UBRRH0' ausdruck nicht ich vermute das mir eine include Datei fehlt.
Ich habe mich ganz an das Datenblatt gehalten.


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

#ifndef F_CPU

#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
#define F_CPU 8000000UL // 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

#include <avr/io.h>
#include <avr/interrupt.h>



void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRH0 = (unsigned char)(baud>>8);
UBRRL0 = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
/* Set frame format: 8data, 2stop bit */
UCSR0C = (1<<USBS0)|(3<<UCSZ00);
}

int main (void) {

USART_Init() ;


// bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z.&nbsp;B. fuer ATmega16:
while (!(UCSR0A & (1<<UDRE0))) /* warten bis Senden moeglich */
{
}

UDR0 = 'x'; /* schreibt das Zeichen x auf die Schnittstelle */

}




Und das Resultat ist,


Build started 19.3.2011 at 15:34:49
avr-gcc -mmcu=atmega644 -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT test.o -MF dep/test.o.d -c ../test.c
../test.c:9:2: warning: #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
../test.c: In function 'USART_Init':
../test.c:33: error: 'UBRRH0' undeclared (first use in this function)
../test.c:33: error: (Each undeclared identifier is reported only once
../test.c:33: error: for each function it appears in.)
../test.c:34: error: 'UBRRL0' undeclared (first use in this function)
../test.c: In function 'main':
../test.c:43: error: too few arguments to function 'USART_Init'
make: *** [test.o] Fehler 1
Build failed with 5 errors and 1 warnings...


Ich weis das Es irgendein einfacher Fehler ist nur ich find in nicht.
Danke.

BMS
19.03.2011, 17:28
Hallo,
die Register heißen ein bisschen anders:

UBRRnL and UBRRnH – USART Baud Rate Registers
Du musst also UBRR0L und UBRR0H schreiben, also einfach die Null und den Buchstaben vertauschen.
Beim Aufruf von USART_Init übergibst du keine Baudrate.

USART_Init( Hier muss eine Zahl stehen);
Das war's auch schon ;)
Grüße, Bernhard

AT90S1200
20.03.2011, 00:13
Ich habe das Programm geändert, wie du es vorgeschlagen hast und ich konnte es kompilieren, warum steht das in dem Datenblatt falsch drin?

Jetzt hab ich nur das Problem, das mit dem Hyperterm Terminal nichts vom Problem auf den PC übertragen wird, das heißt ich sollte dort ein x lesen können dort erscheint aber nichts mit HTerm (http://www.der-hammer.info/terminal/) das ich auf Terminals (http://www.rn-wissen.de/index.php/Terminals) Gefunden habe bekomme ich nur solche Zeichen "<\0><\0>" Zumindest bekomme ich was (-;

Ich möchte nur sicher stellen das mein progam funktioniert und ich es für weitere Experimente einsetzen kann.

Richard
20.03.2011, 11:09
Hmm, Du hast im µC 8N2 Data=8, Parity = None Stopbits =2 eingestellt, ist das auch bei Hyperterm genau so eingestellt?

Üblich ist eher 8N1 und in Hyperterm "Flusskontrolle" auf "Keine" sollte auch eingetragen sein!

Gruß Richard

AT90S1200
20.03.2011, 13:57
Danke für die hinweise, ich habe jetzt mein Programm geändert und hab's so eingestellt, wie ihr es empfohlen habt. Hier mein Code


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

#ifndef F_CPU

#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
#define F_CPU 8000000UL // 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

#include <avr/io.h>
#include <avr/interrupt.h>



void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRR0H = (unsigned char)(baud>>8);
UBRR0L = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
/* Set frame format: 8data, 1stop bit */
UCSR0C = 3<<UCSZ00;
}

int main (void) {

USART_Init( BAUD_REAL ) ;



while (!(UCSR0A & (1<<UDRE0))) /* warten bis Senden moeglich */
{
}

UDR0 = 'x'; /* schreibt das Zeichen x auf die Schnittstelle */

}



Im Endeffekt hat sich nichts geändert als Hardware verwende ich ein stk500 und ein usb to rs232 Adapter.

Danke für eure Hilfe ;)

BMS
20.03.2011, 14:31
Hallo,
sind GND von Board und PC durchverbunden? Ich gehe zwar schon davon aus, aber du könntest nochmal kurz mit einem Durchgangsprüfer nachmessen.
Hast du den richtigen Stecker genommen? Das STK500 hat zwei davon!
Und ich vermute, dass hier

USART_Init( BAUD_REAL ) ;wohl eher

USART_Init( BAUD_VAL ) ;stehen sollte.;)
Du kannst auch ein anderes Terminal ausprobieren. Ich verwende dieses hier: http://www.elektronik-labor.de/RS232/2010Terminal.html , das funktioniert auch über einen USB-Seriell-Wandler.

Grüße, Bernhard

AT90S1200
20.03.2011, 14:39
wohl eher

USART_Init( BAUD_VAL ) ;stehen sollte.;)


Das ist es, fielen Dank Ja es geht :p :)

gesamtplan
20.03.2011, 20:54
Hallo zusammen,

ich sitze gerade vor einem ähnlichen Problem und hab mir den hier geposteten Code angesehen. Wo ist hier "BAUD_VAL" definiert? Bei mir hängt, das ganze Prog, wenn ich die Initialisierung aufrufe.

Grüße

Rainer

gesamtplan
20.03.2011, 23:43
So jetzt hab ichs hinbekommen. Es ist die "UBRR_VAL" die übertragen werden muss.