PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : UART Ein-Ausgabe mit mega168 klappt nicht



sthomson
29.05.2010, 10:57
Hallo

Um die UART Ein- und Ausgabe an einem mega168 zu testen habe ich mir Funktionen für UART Eingabe und Ausgabe in C zusammengstellt.

In der Hauptschleife übergebe ich den Wert dann einfach.
Der Test liefert dann allerding höchst merkwürdige Ergebnisse. Der Ausgabewert stimmt nicht mit dem Eingabewert überein. Ich schicke z.B. 0x47 und es kommt eine 0xF8 zurück.

Woran liegt das? Wenn ich das Ganze auf Basis des mega8 mache, klappt es wunderbar.

Was mache ich falsch?

Nachfolgend das Programm in C

Grüße
Sven




//-------------------------------------------------------------------------
// Titel : Test UART mit 168
//-------------------------------------------------------------------------
// Funktion :
// Schaltung :
//-------------------------------------------------------------------------
// Prozessor : ATmega168
// Takt : 3686400 Hz
// Sprache : C
// Datum : 28.5.2010
// Version : 1.0
// Autor :
// Programmer:
// Port :
//-------------------------------------------------------------------------
// created by myAVR-CodeWizard
//-------------------------------------------------------------------------
//
#define F_CPU 3686400
#include <avr\io.h>
#include <avr\interrupt.h>
#define BAUD 9600
//--------------------------------------------------------------------
// USART_RX_vect - UART Interrupt bei Datenempfang komplett
//--------------------------------------------------------------------
ISR(USART_RX_vect)
{
// Hier Interruptbehandlung
}
//--------------------------------------------------------------------
// USART_UDRE_vect - UART Interrupt bei Senderegister leer
//--------------------------------------------------------------------
ISR(USART_UDRE_vect)
{
// Hier Interruptbehandlung
}
//--------------------------------------------------------------------
// USART_TX_vect - UART Interrupt bei Sendevorgang beendet
//--------------------------------------------------------------------
ISR(USART_TX_vect)
{
// Hier Interruptbehandlung
}

//----------------------------------------------------------------------
// Titel : C-Funktion Zeichen zu UART senden.
//----------------------------------------------------------------------
// Funktion : ...
// IN : char data
// OUT : ...
//----------------------------------------------------------------------
void uartPutChar(char data)
{
//warte bis UDR leer ist UCSRA / USR bei z.B.: 2313
while (!(UCSR0A&32));
//sende
UDR0=data;
}
//----------------------------------------------------------------------
// Titel : C-Funktion Zeichen von UART holen.
//----------------------------------------------------------------------
// Funktion : ...
// IN : ...
// OUT : data
//----------------------------------------------------------------------
char uartGetChar()
{
char data=0;
//warte bis RX-complete RXC UCSRA / USR bei z.B.: AT090S2313
while (!(UCSR0A&128));
//empfangen
data=UDR0;
return data;
}
//----------------------------------------------------------------------
// Titel : C-Funktion Zeichenkette zu UART senden.
//----------------------------------------------------------------------
// Funktion : ...
// IN : char *buffer, Zeichenkette mit NUll abgeschlossen
// OUT : ...
//----------------------------------------------------------------------
void uartPutString(const char *buffer)
{
for (int i=0; buffer[i] !=0;i++) uartPutChar (buffer[i]);
}
//------------------------------------------------------------------------
// Initialisierungen
//------------------------------------------------------------------------
void init()
{
// UART initialisieren
sbi(UCSR0B,3); // TX aktiv
sbi(UCSR0B,4); // RX aktivieren
UBRR0=((F_CPU/BAUD)/16)-1; // Baudrate festlegen
sbi(UCSR0B,7); // UART Interrupt bei Datenempfang komplett
sbi(UCSR0B,5); // UART Interrupt bei Senderegister leer
sbi(UCSR0B,6); // UART Interrupt bei Sendevorgang beendet
//--- Interrupts erlauben ---
sei();
}

/////////////////////////////////////////////////////////////////////////////
// Main-Funktion
/////////////////////////////////////////////////////////////////////////////
main()
{
init(); // Initialisierungen
while (true) // Mainloop-Begin
{
char zeichen;

zeichen=uartGetChar();
uartPutChar(zeichen);


} // Mainloop-Ende
}
//---------------------------------------------------------------------------

sthomson
05.06.2010, 00:41
So...habs rausgefunden. Die Fuses waren falsch gesetzt.