Hallo,
ich benutze einen ATmega165P und AVR-GCC.
Ich habe folgendes Verhalten festgestellt, wenn ich folgendermaßen ein
Zeichen sende funktioniert alles prima
1 | int main ( void )
|
2 | {
|
3 | wdt_disable();
|
4 | port_init();
|
5 |
|
6 | power_usart0_enable();
|
7 | uart_init();
|
8 |
|
9 | while(1)
|
10 | {
|
11 | UCSR0B |= (1<<TXEN0); // UART TX einschalten
|
12 | while (!(UCSR0A & (1<<UDRE0))) // warten bis Senden moeglich ist
|
13 | {
|
14 | }
|
15 |
|
16 | UDR0 = 'A';
|
17 | while (!(UCSR0A & (1<<TXC0))) // warten bis Senden abgeschlossen ist
|
18 | {
|
19 | }
|
20 |
|
21 | long_delay(300);
|
22 | UCSR0B &= ~(1<<TXEN0); // UART TX ausschalten
|
23 | }
|
24 | }
|
wenn ich den TX gleich nach dem senden ausschalte wir das Zeichen nicht
richtig gesendet (das Signal wird länger! Als ob es gleich ein weiters
mal gesendet werden soll?)
1 | int main ( void )
|
2 | {
|
3 | wdt_disable();
|
4 | port_init();
|
5 |
|
6 | power_usart0_enable();
|
7 | uart_init();
|
8 |
|
9 | while(1)
|
10 | {
|
11 | UCSR0B |= (1<<TXEN0); // UART TX einschalten
|
12 | while (!(UCSR0A & (1<<UDRE0))) // warten bis Senden moeglich ist
|
13 | {
|
14 | }
|
15 |
|
16 | UDR0 = 'A';
|
17 | while (!(UCSR0A & (1<<TXC0))) // warten bis Senden abgeschlossen ist
|
18 | {
|
19 | }
|
20 | //// !!!!!!!!!! UNTERSCHIED !!!!!!!!!!!!!
|
21 | UCSR0B &= ~(1<<TXEN0); // UART TX ausschalten
|
22 | long_delay(300);
|
23 | }
|
24 | }
|
Bei einer anderen Schaltung mit einem ATmega48 hat es mit der zweiten
Variante ebenfalls funktioniert.
Kann jemand erklären warum sich das so verhält?