Forum: Mikrocontroller und Digitale Elektronik Anweisung mit SFR wird nicht ausgeführt.


von Markus B. (krabbe)


Lesenswert?

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

von Uwe N. (ulegan)


Lesenswert?

Das _BV() Macro ist veraltet und sollte nicht verwendet werden. Stolpert 
der Debugger darüber?
Versuch mal:
UCSR0B &= ~(1<<UDRIE0);
Ist aber eigentlich genau das, was das Macro macht.

von Markus C. (Gast)


Lesenswert?

Danke für den Hinweis.

Hab's ausprobiert, hat leider nicht geholfen.

Er weder im Debugmodus noch "Freilaufend" über diese Zeile hinweg, das 
schließt wohl aus, das es am JTAG liegt - ?!?

Befürchte langsam, das ich gleich anfange AVR Studio 4.13 + WinAVR 
20070525 zu installieren .. hoffentlich hab' ich danach nicht noch mehr 
Fehler.

G

von Peter D. (peda)


Lesenswert?

Markus C. wrote:

> Habe das beim Debuggen mit JTAGICE soweit verfolgt, das ich die Zeile
> "UCSR0B &= ~_BV(UDRIE0);" im ELSE-Zweig erreiche.

Warum probierst Du nicht einfach mal "Real Life" aus, hast Du keine UART 
am PC ?
Dann weißt Du sofort, obs am JTAG liegt oder nicht.


> 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.

Das ist mal ne Fehlerbeschreibung mit der jeder was anfangen kann.
Werd konkreter !


Peter

von Markus B. (krabbe)


Angehängte Dateien:

Lesenswert?

> Warum probierst Du nicht einfach mal "Real Life" aus, hast Du keine UART
> am PC ?
> Dann weißt Du sofort, obs am JTAG liegt oder nicht.

Hatte ich bereits gemacht, daher weiß ich auch, das ich von dort aus 
nicht wieder an die Stelle zurückkomme von wo aus der Aufruf kam.

Im ZIP-File sind zwei Screenshots von vor der Ausführung der Zeile 
"UCSR0B &= ~(1<<UDRIE0);".
Hab' das so dargestellt, das man die USART-Register erkennen und den 
Code sehen kann.
Der dritte Screenshot zeigt die Ausgaben, die ich erzeuge ... leider 
kommt der Debug-Print nicht, der nach dem Rücksprung vorgesehen ist.
Mit oder ohne JTAG macht keinen Unterschied.
Ob das JTAG nicht doch irgendeinen Einfluß hat, kann das deshalb nicht 
so genau beurteilen weil ich dessen Arbeitsweise nicht bis ins letzte 
Detail erforscht habe.

if(1){
    txStringUsart0("Ping X\r\n");    // Schreibt Zeigen in Warteschlange

    // hier erfolgt die Abarbeitung der
    // ISR aus deren ELSE-Zweig ich nicht
    // an die richtige Stelle im Programm
    // zuückkehre.

    return 1;
} else {
    return -2;
}

-> Den Zustand kurz vor der Ausführung von "UCSR0B &= ~(1<<UDRIE0);" ist 
am besten im Screenshot zu erkennen.



Nach dem Build steht folgendes im Memory Usage
program: 32.9% Full
data: 52.1% Full
eeprom: 37.5% Full

... sollte für den Stack genug Raum lassen.

Welche Info wäre sonst noch hilfreich?

Markus

von Peter D. (peda)


Lesenswert?

Markus C. wrote:
> Hatte ich bereits gemacht, daher weiß ich auch, das ich von dort aus
> nicht wieder an die Stelle zurückkomme von wo aus der Aufruf kam.


Was soll wohin zurückkehren ?
Wird denn was von der UART gesendet ?

Vielleicht solltest Du mal nen kompletten Code posten (als Anhang), 
damit man nicht mehr im Nebel stochern muß.

Zu JTAG kann ich nichts sagen, hab ich noch nie benutzt.


Peter

von Markus B. (krabbe)


Lesenswert?

Hab's

Upgrade:
-> AVR Studio 4.13
-> WinAVR 20070525

Compiler zeigte einige Warnigs bzgl. 'type qualifier', die von der 
vorhergenden Insatallation nicht beanstandet wurden.

-> Type Qualifier korrigiert (char bzw. unsigned char)
-> Build ohne Warnings
-> Compilat läuft

... Lessons learned ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.