Forum: Mikrocontroller und Digitale Elektronik ATmega1284p AVR STUDIO 4 Fehlermeldung bei WDTCSR


von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Vielleicht kann mir jemand helfen,

im AVR-Studio 4 erhalte ich bei beim schreiben des WDTCSR-Registers 
immer eine Fehlermeldung:


ldi R16, (1<<WDE) | (1<<WDP2) | (1<<WDP0)
out WDTCSR, r16


error: Operand 1 out of range: 0x60

Aus dem Datenblatt S.54 habe ich dieses Beispiel.


Bernhard

von Rainer V. (rudi994)


Lesenswert?

Habe es mal getestet, gleicher Fehler. Laut AVR-Instruction-Set arbeitet 
der Port-Befehl OUT mit den Registern R0-R31 und den Portadressen 0-63 
bzw. 0x00-0x3F. Aber WDTCSR=0x60, also als Portadresse zu groß.

Atmel-doc8059.pdf für ATmega1284(P), Seite 6, Kap.4. About Code Examples
Bei I/O-Registern (Ports) im erweiterten I/O-Speicherbereich müssen die 
Befehle IN, OUT, SBIS, SBIC, CBI und SBI durch Befehle ersetzt werden, 
die den Zugriff auf erweiterten Speicher erlauben: typischerweise sind 
dies LDS und STS in Kombination mit SBRS, SBRC, SBR und CBR.

: Bearbeitet durch User
von Thomas E. (thomase)


Lesenswert?

Bernhard S. schrieb:
> Aus dem Datenblatt S.54 habe ich dieses Beispiel.

Leider gibt es hin und wieder kleine Copy & Paste-Schlampereien. Dies 
ist eine davon.

Das haben sie wohl vom Atmega8 abgeschrieben.

mfg.

von Bernhard S. (bernhard)


Lesenswert?

Danke Rainer,

LDS und STS ermöglichen den Zugriff auf WDTCSR.

ldi R16, (1<<WDE) | (1<<WDP2) | (1<<WDP0)
STS WDTCSR, r16



-------------------------------------------------------------------

Hier mal ein kleines Beispiel für eine WDR Initialisierung,
nach 2s beißt der Watchdog zu.

Interessant finde ich, wenn WDIE=1 gesetzt wird, dann erfogt bei einer 
Zeitübeschreitung, zuerst ein Interrupt-Aufruf, hier könnte man z.B. die 
Ursache der Zeitüberschreitung darstellen und anschließend, bei einer 
weiteren Zeitübeschreitung, ein Neustart des Systems.



WDR_INITIALISIERUNG:

WDR
LDS R16, WDTCSR
ori R16, (1<<WDCE) | (1<<WDE)
STS WDTCSR, R16

ldi R16, (1<<WDE)| (0<<WDIE)|(0<<WDP3)| (1<<WDP2) | (1<<WDP1) | 
(1<<WDP0)
STS WDTCSR, R16

ret



Bernhard

: Bearbeitet durch User
von Rainer V. (rudi994)


Lesenswert?

Na, dann funktioniert es ja. Auf dem STK500 mit nur 8 LEDs wird es aber 
schwierig, wenn die LEDs die normalen Ausgaben, die Position im Menü und 
dann auch noch Fehlermeldungen anzeigen sollen ;)

Thomas Eckmann schrieb:
> Leider gibt es hin und wieder kleine Copy & Paste-Schlampereien. Dies
> ist eine davon.
>
> Das haben sie wohl vom Atmega8 abgeschrieben.

oder ATmega32/162/8515, ATtiny13/2313 uvm., da ist WDTCR=0x21. Bei z.B. 
ATmega328P gilt wieder die Regel wie bei ATmega1284P, siehe gemeinsames 
Datenblatt ATmega48A/48PA/88A/88PA/168A/168PA/328/328P. Darin steht auf 
S.52 ein Code-Beispiel mit LDS und STS für WDTCSR. Allerdings wird im 
C-Code-Beispiel am Schluß WDTCSR=0x00 gesetzt. Wie das jetzt? Da müßte 
doch beim Compilieren ein Fehler wegen Redefinition von WDTCSR kommen.

von Thomas E. (thomase)


Lesenswert?

Bernhard S. schrieb:
> Interessant finde ich, wenn WDIE=1 gesetzt wird, dann erfogt bei einer
> Zeitübeschreitung, zuerst ein Interrupt-Aufruf, hier könnte man z.B. die
> Ursache der Zeitüberschreitung darstellen und anschließend, bei einer
> weiteren Zeitübeschreitung, ein Neustart des Systems.

Der Interrupt dient dazu, noch irgendwelche Daten ins EEPROM zu retten 
oder der Peripherie nocht etwas mitzuteilen.
Hängt das Programm allerdings in einer ISR, wird der Interrupt nicht 
bedient.

Der Reset findet aber ab auf jeden Fall statt. Ein wdt_reset ist jetzt 
unwirksam. Eine 2. Chance gibt es nicht.

Rainer V. schrieb:
> oder ATmega32/162/8515, ATtiny13/2313 uvm., da ist WDTCR=0x21. Bei z.B.
> ATmega328P gilt wieder die Regel wie bei ATmega1284P, siehe gemeinsames
> Datenblatt ATmega48A/48PA/88A/88PA/168A/168PA/328/328P. Darin steht auf
> S.52 ein Code-Beispiel mit LDS und STS für WDTCSR. Allerdings wird im
> C-Code-Beispiel am Schluß WDTCSR=0x00 gesetzt. Wie das jetzt? Da müßte
> doch beim Compilieren ein Fehler wegen Redefinition von WDTCSR kommen.

Das ist keine Definition, sondern ins WDTSCR wird Ox00 geschrieben.

Im Zusammenhang der 0x21 handelt es sich um die Definition von WDTCR für 
den Präprozessor.

mfg.

: Bearbeitet durch User
von Bernhard S. (bernhard)


Lesenswert?

>wenn die LEDs die normalen Ausgaben, die Position im Menü und
>dann auch noch Fehlermeldungen anzeigen sollen ;)

Manchmal genügt eine einzige LED, um wenigsten den Fehler einzugrenzen.


>Hängt das Programm allerdings in einer ISR, wird der Interrupt nicht
>bedient.

Seitdem man arbeitet mit verschachtelten Interrupts

von Thomas E. (thomase)


Lesenswert?

Bernhard S. schrieb:
> Seitdem man arbeitet mit verschachtelten Interrupts

Die aber nicht zum Repertoire eines AVR gehören.

mfg.

von Bernhard S. (bernhard)


Lesenswert?

>> Seitdem man arbeitet mit verschachtelten Interrupts

>Die aber nicht zum Repertoire eines AVR gehören.

Was hältst Du von dieser Variante:

Kurz nach einem Interruptaufruf, werden die Interrupts
wieder freigegeben, ein weiterer interrupt (z.B. ein TIMER)
könnte diese Interruptroutine (INT0) unterbrechen und ersteinmal 
abgearbeitet werden?


INT0:
sei   ' Interrupts wieder freigeben
...
...
reti

: Bearbeitet durch User
von Thomas E. (thomase)


Lesenswert?

Bernhard S. schrieb:
> Was hältst Du von dieser Variante:

Gar nichts.
So ein Hackermist ist meistens der Grund dafür, dass man überhaupt einen 
Watchdog braucht.

Die Abarbeitung eines Interrupts beim AVR geht sehr schnell. Wer dazu 
noch verschachtelte Interrupts braucht, macht grundsätzlich etwas 
falsch.

mfg.

: Bearbeitet durch User
von Bernhard S. (bernhard)


Lesenswert?

>> Was hältst Du von dieser Variante:

>Gar nichts.

Aber dennoch möglich ^^

>macht grundsätzlich etwas falsch.

Kann, muss aber nicht sein.

: Bearbeitet durch User
von Thomas E. (thomase)


Lesenswert?

Bernhard S. schrieb:
> Aber dennoch möglich ^^

Ja und? Es ist auch möglich, sich einen Atmega aufs Knie zu nageln.

Bernhard S. schrieb:
> INT0:
> sei   ' Interrupts wieder freigeben

Ausserdem ist diese Methode vom Timing her schlecht.

Dafür gibt es das Attribut ISR_NOBLOCK. Damit erfolgt die Freigabe mit 
dem ersten Befehl in der ISR, noch vor der evtl. push- und 
Initialisierungs-Orgie.

Bernhard S. schrieb:
> Kann, muss aber nicht sein.

Jetzt tu mal nicht so, als wärst hier der grosse Crack:

Bernhard S. schrieb:
> im AVR-Studio 4 erhalte ich bei beim schreiben des WDTCSR-Registers
> immer eine Fehlermeldung:

mfg.

: Bearbeitet durch User
von Bernhard S. (bernhard)


Lesenswert?

"ISR_NOBLOCK" scheint es aber beim ATmega1284p nicht zu geben, zumindest 
finde ich es im Datenblatt nicht?

von Thomas E. (thomase)


Lesenswert?

Bernhard S. schrieb:
> "ISR_NOBLOCK" scheint es aber beim ATmega1284p nicht zu geben,
> zumindest
> finde ich es im Datenblatt nicht?

Herrje, das steht doch nicht im Datenblatt.

http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html#ga44569cb914d2aaf8fbb436f8f7c4ca68

mfg.

von Rainer V. (rudi994)


Lesenswert?

Rainer V. schrieb:
> wird im C-Code-Beispiel am Schluß WDTCSR=0x00 gesetzt.

Thomas Eckmann schrieb:
> Das ist keine Definition, sondern ins WDTSCR wird Ox00 geschrieben.

Sorry! Habe es jetzt gesehen, keine Direktive, sondern normaler Code.

> Es ist auch möglich, sich einen Atmega aufs Knie zu nageln.

So einen F**k macht doch keine S**. Im TV war aber mal ein armer Russe, 
der hat mittels heissem Lötkolben ein Geschwür aus seinem Knie entfernt.

Übrigends: Irgendwo war zu lesen, daß bei gleichzeitig auftretenden 
Interrupts sich der AVR diese merkt und dann in Reihenfolge der 
Priorität abarbeitet. Wo merkt er sich diese denn? Und werden ältere 
Interrupts bei Bedarf verworfen oder gibt es irgendwann einen Overflow?

von spess53 (Gast)


Lesenswert?

Hi

>Wo merkt er sich diese denn?

In den Interrupt-Flags der entsprechenden IO-Module.

Ein Interrpt-Flag kann sich genau ein Interruptereignis merken.

Deswegen macht man Interruptroutinen so kurz wie möglich.

Allerdings unterschätzen Anfänger die Abarbeitungsgeschwindgkeiten meist 
gewaltig. Und dann kommen sie auf solche Ideen, wie z.B. verschachtelte 
Interrupts.

MfG Spess

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.