ATMEGA128: Interruptflag löschen durch setzen?

Gast #629646
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?
#629803
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.
Gast #629850
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!
Moderator Persönliche Seite #630440
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren