Leuchtturm
12.01.2007, 16:28
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
#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;
}
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
#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;
}