Hallo zusammen,
ich habe hier vor mir einen AVR Butterfly liegen, den ich gerne
programmieren möchte. Ich habe mich dafür erstmal an den Quelltext des
Programms gehalten, was standardmäßig auf dem Butterfly vom Hersteller
installiert ist.
D.h. konkret, ich habe die gesamte Initialisierungsroutine 1 zu 1
übernommen und aus der main() nur die Funktionalitäten rausgeworfen, die
ich nicht brauche. Jetzt versuche ich, über die serielle Schnittstelle
zyklisch ein Zeichen zu senden. Hier mein Quelltext:
1 | __C_task void main(void)
|
2 | {
|
3 | Initialization();
|
4 |
|
5 | while(true) {
|
6 | LCD_puts("UART FAIL",0);
|
7 | Usart_Tx('a');
|
8 | Delay(500);
|
9 | LCD_puts("FAIL UART",0);
|
10 | Delay(500);
|
11 | };
|
12 | }
|
Das Programm lade ich auf den Butterfly und soweit läuft auch alles, der
Text toggelt im Display immer von "UART FAIL" zu "FAIL UART" usw. (Das
Display sieht so aus:
http://www.efo.ru/ftp/pub/atmel/_AVR_MCUs_8bit/_Technical_Library/tools/evk/butterfly/pic/butterfly_high.jpg)
Allerdings kann ich mit dem Hyperterminal kein Zeichen empfangen, da
kommt gar nichts an. Einstellungen: COM1, Baud 9600, Datenbits 8,
Parität keine, Stoppbits 1.
Hier die "Initialization()" von AVR:
1 | void Initialization() {
|
2 | OSCCAL_calibration(); // calibrate the OSCCAL byte
|
3 |
|
4 | // *Schnitt* [...]
|
5 |
|
6 | USART_Init(12); // Baud rate = 9600bps
|
7 |
|
8 | // *Schnitt* [...]
|
9 |
|
10 | LCD_Init(); // initialize the LCD
|
11 | }
|
USART_Init():
1 | void USART_Init(unsigned int baudrate)
|
2 | {
|
3 | // Set baud rate
|
4 | UBRR0H = (unsigned char)(baudrate>>8);
|
5 | UBRR0L = (unsigned char)baudrate;
|
6 |
|
7 | // Enable 2x speed
|
8 | UCSR0A = (1<<U2X0);
|
9 |
|
10 | // Enable receiver and transmitter
|
11 | UCSR0B = (1<<RXEN0)|(0<<TXEN0)|(0<<RXCIE0)|(0<<UDRIE0);
|
12 |
|
13 | // Async. mode, 8N1
|
14 | UCSR0C = (0<<UMSEL0)|(0<<UPM00)|(0<<USBS0)|(3<<UCSZ00)|(0<<UCPOL0);
|
15 | }
|
Und die Usart_Tx-Methode:
1 | void Usart_Tx(char data)
|
2 | {
|
3 | while (!(UCSR0A & (1<<UDRE0)));
|
4 | UDR0 = data;
|
5 | }
|
Die obigen Mehoden stammen alle wie gesagt 1 zu 1 aus dem Programm vom
Hersteller. Die serielle Schnittstelle funktioniert ansonsten, weil ich
den Butterfly nämlich darüber programmiere.
Vlt. hat hier ja jemand eine Idee, was ich verkehrt mache? Danke und
Gruß!