www.mikrocontroller.net

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


Autor: Andreas Paulin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe mich eben 5 Stunden von der Input capture unit des ATMEGA128 foppen 
lassen, bis ich im Datasheet folgende Zeilen las:
"• Bit 5 – ICF1: Timer/Counter1, Input Capture Flag
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:
"........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:
" 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?

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Andreas Paulin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jessas.
Unglaublich.........

Hat das irgendeinen Sinn?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Andreas Paulin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ all:
Danke.
Unglaublich!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Paulin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, von Atmel ist dann auch noch echt fix ne Antwort gekommen:
Dear Mr. Paulin,

I am sorry to hear you wasted so much time.

Most of the flags in an AVR is based on strobing, and is not possible
to "set" by code. These can only be set internally by the
hardware. This means that every time they are set they are either
cleared same way set or you have to write a logic one to clear
it. There are many flags in different modules in the AVR that works
exactly this way.

I would always recommend you to read the datasheet and register
description when setting up the registers. Every thing you need should
be explained here.

Please note that the fuses are programmed the same way. By writing a
logic one to fuses means unprogrammed and logic zero means programmed.


Best Regards
Andreas Holm
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!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.