Atmega32/STK500 -UART senden/empfangen klappt nicht
Hi,
ich hoffe, ich oute mich mit meinem ersten Posting nicht gleich als Volldödel
:oops:
ich bin was Mikrocontroller angeht ein blutiger Anfänger und hänge jetzt schon bei diesem Anfangsproblem fest und komme ohne Hilfe nicht weiter.
Aaaalso, hier die Beschreibung meines kleinen "Problemchen"
Ich habe mir von Reichelt das Entwicklerboard STK500 besorgt und mit einem Atmega32 bestückt.
Programmierumgebung ist AVR Studio 4 und WinAVR (beides frisch runter geladen), ich programmiere in C (ich versuch´s).
Ich stelle über das Terminalprogramm TerraTerm die Verbindung her und möchte ein Zeichen, welches ich an den AVR sende einfach nur zurück gesendet und auf der Terminalschirm dargestellt haben, mehr nicht. Leider klappt´s nicht.
Port A ist als Ausgang definiert, an dem LED´s hängen.
Grundsätzlich funktioniert die Kommunikation irgendwie schon, d.h. ich kann senden, der AVR empfängt was und schickt auch was zurück.
Allerdings nur, wenn ich im Terminalprogramm eine wesentlich geringere Baudrate (=1200) einstelle als eigentlich laut Programm vorgesehen (=9600). Komischerweise werden die nebeneinanderliegenden Tasten "n", "m", ";", ".""-",die Tasten "h", "j", "k","l" und noch einige andereTasten dann richtig zurück gesendet, der Rest aber nicht, z.B. für ein"b" bekomme ich ein "z" zurück geliefert.
Wo ich mir jetzt überhaupt nicht sicher bin, ist die Frage, ob die Initialisierung des UART so richtig ist, oder ob da noch was fehlt und ob der Programmablauf so funktionieren kann.
Könnte jemand mal ein Auge aufs Programm werfen?
Besten Dank im Voraus und ein schönes Wochenende!
Gruß
Leuchtturm
Code:
#include <avr/io.h>
/* CPU Frequenz */
#define F_CPU 3686400L
/* UART Baud Rate */
#define UART_BAUD_RATE 9600L
/* USART Registerdefinitionen*/
#define UBRRL _SFR_IO8(0x09)
#define UCSRB _SFR_IO8(0x0A)
#define UCSRA _SFR_IO8(0x0B)
#define UDR _SFR_IO8(0x0C)
#define UBRRH _SFR_IO8(0x20)
#define UCSRC UBRRH
#define URSEL 7
void uart_init(void)
{
uint16_t ubrr = (uint16_t) ((uint32_t)F_CPU/(16*UART_BAUD_RATE) - 1);
UBRRH = (uint8_t) (ubrr>>8);
UBRRL = (uint8_t) (ubrr);
UCSRB |= ( 1 << RXEN )| ( 1 << TXEN ); //Receive/transmit enablen
UCSRC =(1<<URSEL) |(1<<UCSZ1)|(1<<UCSZ0); //Frame 8/N/1
}
int main()
{
unsigned char test;
DDRA = 0xff;
uart_init();
while(1)
{
while (!(UCSRA & (1<<RXC))); // warten bis Zeichen verfuegbar
test=(unsigned char)UDR;
PORTA=test;
while (!(UCSRA & (1<<UDRE))); // warten bis UDR bereit für neuen Wert
UDR=test;
}
return 0;
}
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo
also ich benutze zum Testen im Moment das Programm "Terminal", hab es mal mit angehängt. Später werde ich dann noch ein C++ Programm dazu schreiben, zum Testen funktioniert das aber einwandfrei.
Mein Quellcode sieht so aus:
#include <avr/io.h>
#include <inttypes.h>
// Sollte schon im Makefile definiert sein.
// In dem Fall hier einfach löschen.
#define F_CPU 7372800UL
#define BAUD 19200UL
#define UBRR_BAUD ((F_CPU/(16L*BAUD))-1)
// USART initialisieren
void uart_init(void)
{
// Baudrate einstellen (Normaler Modus)
UBRRH = (uint8_t) (UBRR_BAUD>>8 );
UBRRL = (uint8_t)UBRR_BAUD;
// Aktivieren von receiver und transmitter
UCSRB = (1<<TXEN) | (1<<RXEN);
// Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
//UCSRC |= (1<<URSEL)|(3<<UCSZ0);
}
int main(void)
{
uint8_t buffer;
// USART initialisieren
uart_init();
while (1)
{
// Warten bis Daten empfangen wurden
while ( !(UCSRA & (1<<RXC)) );
// Empfangsregister auslesen
buffer = UDR;
// Warten bis der Sendepuffer frei ist
while ( !( UCSRA & (1<<UDRE)) );
// Daten in den Puffer schreiben und damit senden
UDR = buffer;
}
return 0;
}
Bei mir funktioniert der mit Terminal. Natürlich müsstet du dann auch noch die entsprechenden Werte im Quelltext ändern (Frequenz..).
Das Programm Terminal sollte von der Bedienung relativ selbsterklärend sein. Einfach entsprechenden Werte einstellen und Open klicken, in Text senden Box klicken, was schreiben und dann sollte normalerweise der Text, den man geschrieben hat im Feld rechts daneben erscheinen.
Gruß micro5