Hi,
verwende zur Zeit folgende ISR aus der Bibliothek vom Peter Fleury:
1 | SIGNAL(SIG_USART0_DATA){
|
2 | unsigned char tmptail;
|
3 | if (USART0_TxHead != USART0_TxTail) {
|
4 | tmptail = (USART0_TxTail + 1) & USART0_TX_BUFFER_MASK;
|
5 | USART0_TxTail = tmptail;
|
6 | UDR0 = USART0_TxBuf[tmptail];
|
7 | }else{
|
8 | UCSR0B &= ~_BV(UDRIE0);
|
9 | }
|
10 | }
|
Macht (sollte) folgendes:
Wenn die Indizes des Ringspeichers, in dem die über USART0 zu
verschickenden Zeichen liegen, gleich sind, dann ist der Ringspeicher
leer und im ELSE-Zweig wird sichergestellt, das die ISR nicht erneut
aufgerufen wird.
Habe das beim Debuggen mit JTAGICE soweit verfolgt, das ich die Zeile
"UCSR0B &= ~_BV(UDRIE0);" im ELSE-Zweig erreiche. Wenn ich nun mit "F11"
die Zeile ausführen lasse, dann braucht es eine Weile und es erscheint
der Disassembler .. naja - ab da ist dann keine nachvollziehbare
Ausführung mehr möglich. Habe einige andere Schreibweisen probiert, hat
aber leider nichts geholfen.
Gibt's irgendeinen Grund im Zusammenhang mit anderen Flags oder
sonstwas, der erklären könnte warum ich "UDRIE0" nicht mit dieser
Anweisung, an dieser Stelle oder nicht zu diesem Zeitpunkt löschen
kann/darf?
Verwende zur Zeit:
WinAVR-20060421
AVR Studio 4.12SP4
ATmega162
Markus