Forum: Compiler & IDEs ATMEGA128: Interruptflag löschen durch setzen?


von Andreas Paulin (Gast)


Lesenswert?

Habe mich eben 5 Stunden von der Input capture unit des ATMEGA128 foppen 
lassen, bis ich im Datasheet folgende Zeilen las:
1
"• Bit 5 – ICF1: Timer/Counter1, Input Capture Flag
2
This flag is set when a capture event occurs on the ICP1 pin."

OK, dann wird also der Interrupt vom GESETZTEM Flag ausgelöst, sofern 
freigegeben. Weiter:
1
"........ICF1 is automatically cleared when the Input Capture Interrupt vector is executed."

Durch Einsprung in den Int.Handler wird das Flag also automatisch 
gelöscht.
OK, weiter:
1
" Alternatively, ICF1 can be cleared by writing a logic one to its bit location."
Aha, von Hand wird das Flag also auf 0 zurückgesetzt(!), indem man eine 
'1' reinschreibt(!).
...........????????????

Ist das jetzt einfach bescheuert, oder sehe ich irgendeinen Sinn dieser 
verdrehten Logik nicht?

von Johannes M. (johnny-m)


Lesenswert?

Das ist so. Ob das bescheuert ist, sei mal dahingestellt, aber die 
Entwickler von ATMEL werden sich schon was dabei gedacht haben.

von Andreas Paulin (Gast)


Lesenswert?

Jessas.
Unglaublich.........

Hat das irgendeinen Sinn?

von Falk B. (falk)


Lesenswert?

@ Andreas Paulin (Gast)

>Jessas.
>Unglaublich.........
>Hat das irgendeinen Sinn?

42.

;-)

Naja, das hat ATMEL nicht erfunden, das gabs schon vorher. Und ist bei 
ziemlich allen Interrupts beim AVR so.

MfG
Falk

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?


von Andreas Paulin (Gast)


Lesenswert?

@ all:
Danke.
Unglaublich!

von Peter D. (peda)


Lesenswert?

Mach Dir nichts draus, ich hab auch Stunden dafür gebraucht.

In der Hektik passierts selbst später manchmal, aber dann fällts einem 
schnell wieder ein (weils so abstrus ist).

Es gibt sogar einige Bits, die keine Interrupts auslösen und sich 
trotzdem so verhalten.

Sinn macht das keinen, sind eben Entwicklermarotten, muß man hinnehmen.

Logischer wärs gewesen, zum Löschen ne 0 reinzuschreiben und für 
Interruptbits, die nicht gelöscht werden sollen, eine 1:

TIFR = ~(1<<ICF1);


Peter

P.S.:
Es gibt nur eine einzige praktische Anwendung:

Man kann ne neue AD-Wandlung mit Bitbefehl (SBI) starten und dabei wird 
automatisch das Ready-Bit gelöscht.
Solch ein tricky Code ist aber nicht sonderlich lesbar.

von Andreas Paulin (Gast)


Lesenswert?

Ja, von Atmel ist dann auch noch echt fix ne Antwort gekommen:
1
Dear Mr. Paulin,
2
3
I am sorry to hear you wasted so much time.
4
5
Most of the flags in an AVR is based on strobing, and is not possible
6
to "set" by code. These can only be set internally by the
7
hardware. This means that every time they are set they are either
8
cleared same way set or you have to write a logic one to clear
9
it. There are many flags in different modules in the AVR that works
10
exactly this way.
11
12
I would always recommend you to read the datasheet and register
13
description when setting up the registers. Every thing you need should
14
be explained here.
15
16
Please note that the fuses are programmed the same way. By writing a
17
logic one to fuses means unprogrammed and logic zero means programmed.
18
19
20
Best Regards
21
Andreas Holm
22
Atmel AVR Technical Support

Naja.... in Verbindung mit der GLIBC-Erklärung mag das ja irgendwie Sinn 
ergeben fg..... vielleicht auch nicht sfg

Zumindest weiß ichs jetzt.
Und es läuft.. thanks an alle!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Peter Dannegger wrote:

> Logischer wärs gewesen, zum Löschen ne 0 reinzuschreiben und für
> Interruptbits, die nicht gelöscht werden sollen, eine 1:
>
> TIFR = ~(1<<ICF1);

Du meinst ernsthaft, das würden die Leute besser verstehen?

Die würden da wahrscheinlich nach wie vor eine 0 ins ganze Register
reinschreiben, vielleicht verklausuliert als

TIFR = (0 << ICF1);

und sich mindestens genauso lange den Wolf danach suchen, warum
dann wundersame Dinge passieren.

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.