Hallo!
Ich hatte auf dem Mega8515 nie Probleme mit dem UART, aber nun gehts
los:
Auf einem Steckbrett steckt ein Mega88. Als Takt dient ein
Quarzoszillator mit 12 MHz (Fuses beachtet, mit _delay_ms(1000) passt
die Geschwindigkeit auch).
Vom PD1 gehts über den Pegelwandler des STK500 zum RS232 Umsetzer des
PCs. (Port umgesteckt -> SPARE).
An PD1 (TxD) hängt parallel eine LED zur Kontrolle des Pegelwechsels mit
Vorwiderstand an GND, an PC5 hängt eine LED mit Vorwiderstand an VCC.
Mein Code, WinAVR-Version: 20090313
1 | #include <avr/io.h>
|
2 |
|
3 | int main (void) {
|
4 |
|
5 | DDRC = 0xFF ; // All out
|
6 | #define BAUD 9600
|
7 | #include <util/setbaud.h>
|
8 | UBRR0H = UBRRH_VALUE;
|
9 | UBRR0L = UBRRL_VALUE;
|
10 | #if USE_2X
|
11 | UCSR0A |= (1 << U2X0);
|
12 | #else
|
13 | UCSR0A &= ~(1 << U2X0);
|
14 | #endif
|
15 |
|
16 | // Enable transmitter
|
17 | UCSR0B = (1<<TXEN0);
|
18 | // Set frame format: 8data, 1stop bit
|
19 | UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
|
20 |
|
21 | while(1) {
|
22 |
|
23 | // Wait for empty transmit buffer
|
24 | while (!(UCSR0A & (1<<UDRE0))){
|
25 |
|
26 | // In diese Schleife wird nur 1x gesprungen
|
27 |
|
28 | // Put data into buffer, sends the data
|
29 | UDR0 = 0x55 ;
|
30 |
|
31 | PORTC ^= (1<<PC5) ; // Test LED
|
32 | } ;
|
33 | } ;
|
34 | } ;
|
Nun scheint es so, als wenn das UDR nur einmal beschrieben wird,
zumindest wird die Schleife nur einmal durchlaufen (mit AVR-Studio
getestet). Die LED am TxD-Port PD1 geht dauer an, geht aber nicht wieder
aus, auch kein Flackern.
Die LED an PC5 bleibt ebenso dauer an, kein Flackern.
Jemand eine Idee die Tomaten auf meinen Augen weg zu pulen?
Gruß
Daniel