Hallo zusammen,
vorab, habe gcc tutorial mehr als einmal gelesen und auch in anderen
Threads wurde ich nicht fündig.
Nun zu meinem Problem:
Ich versuche den USART des ATmega32 in gang zu bringen.
Mein Code:
1 | int main(void)
|
2 | {
|
3 | // Initialisieren der Ports
|
4 | PORTA = 0b00000000; // Port B auf Low; vertauscht, um low pulse zu vermeiden
|
5 | DDRA = 0xFF; // Alles Ausgänge, Datenbus zu LCD
|
6 | PORTD = 0b00000000; // Port A auf Low; vertauscht, um low pulse zu vermeiden
|
7 | DDRD = 0b00000001; // PD0 (RXD) als Eingang für RS232 Datenempfang
|
8 |
|
9 | // Initialisieren des USART
|
10 | UBRRH = UBRR_VAL >> 8; // Baudrate auf 4800 setzen
|
11 | UBRRL = UBRR_VAL & 0xFF;
|
12 |
|
13 | UCSRB = (1<<TXEN)|(1<<RXEN);
|
14 |
|
15 | //UCSRC |= (1<<URSEL)|(3<<UCSZ0);
|
16 | UCSRC = (1<<URSEL) | (1<<UCSZ0) | (1<<UCSZ1);
|
17 |
|
18 |
|
19 | char puffer[1024] = {0};
|
20 | uart_gets(puffer, sizeof(puffer));
|
21 |
|
22 | // Endlosschleife
|
23 | while(1)
|
24 | {}
|
25 | return 0; //wird nie erreicht
|
26 | }
|
Die Baudratenbits und die Enable TX, RX Bits werden gesetzt, aber es
werden einfach nicht die Bits URSEL, UCSZ0 und UCSZ1 gesetzt.
Die auskommentierte Zeile darüber funktioniert genausowenig.
Auch die Notation UCSRC |= (1<<URSEL) | (1<<UCSZ0) | (1<<UCSZ1);
funktioniert nicht.
Soweit ich das verstanden habe, ist das UCSRC und UBRRH Register unter
derselben Adresse zu erreichen, deshalb das URSEL Bit.
Kann es daran liegen?
Wenn ich beim debuggen manuell die Bits in AVR Studio (I/O View) setzte,
wird das auch ignoriert, bzw im nächstem Step wieder verworfen.
uart_gets(puffer, sizeof(puffer)); ist die Funktion aus dem gcc
Tutorial.
Ich benutzte AVR Dragon, AVR Studio, JTAG und ATmega32 mit 16 MHz(Fuse
Bits sind entsprechend gesetzt, als UBRR Wert habe ich 0xCF).
Vielen Dank schonmal für eure Hilfe,
mfg Alex