Forum: Mikrocontroller und Digitale Elektronik ICF1 Flag löschen bei Änderung von Edge Select


von Conny P. (conny_phi)


Lesenswert?

Hallo,

im Datenblatt (z.B. ATmega16a) findet man einen Hinweis, dass man das 
ICF1 Flag löschen muss, wenn man die Trigger Flanke für den Capture 
Event z.B. von steigend auf fallend umschaltet:
"After a change of the edge, the Input Capture Flag (ICFn) must be
cleared by software."

Meine Frage bezieht sich nun auf die anschließend genannte Ausnahme von 
dieser Regel:
"For measuring frequency only, the clearing of the ICF1 Flag is not 
required (if an interrupt handler is used)."

Was ist mit "measuring frequency only" gemeint?
Oder konkret, muss ich in folgendem Geradeausfall, am Ende das ICF1 Flag 
löschen?
1
ISR(TIMER1_CAPT_vect)
2
{
3
  if (TCCR1B & (1<<ICES1))      //aktuell steigende Flanke?
4
  {
5
    capturewert = ICR1;   
6
    TCCR1B &= ~(1<<ICES1); //umschalten auf fallende Flanke
7
                           //für nächstes Capture Ereignis
8
    TIFR = (1<<ICF1);      //ICF1 löschen notwendig???
9
  }

Vielen Dank für jede Erklärung zu diesem Thema.

von Falk B. (falk)


Lesenswert?

@  Conny Phi (conny_phi)

>"For measuring frequency only, the clearing of the ICF1 Flag is not
>required (if an interrupt handler is used)."

>Was ist mit "measuring frequency only" gemeint?

Wenn man nur die Periodendauer eines Eingangssignals mißt und demzufolge 
die Flanke nicht umstellt.

>Oder konkret, muss ich in folgendem Geradeausfall, am Ende das ICF1 Flag
>löschen?

Ja.

von Conny P. (conny_phi)


Lesenswert?

Falk, danke für die Antwort.
Erlaube mir eine kurze Nachfrage...

Falk B. schrieb:
> @  Conny Phi (conny_phi)
>
>>"For measuring frequency only, the clearing of the ICF1 Flag is not
>>required (if an interrupt handler is used)."
>
>>Was ist mit "measuring frequency only" gemeint?
>
> Wenn man nur die Periodendauer eines Eingangssignals mißt und demzufolge
> die Flanke nicht umstellt.

In dem Abschnitt des Datenblatts geht es aber nach meinem Verständnis 
NUR um den Fall "After change of the edge...". Dass man das ICF1 Flag 
NICHT von Hand löschen muss, wenn man die Flankenerkennung beibehält, 
ist doch eigentlich außer Frage und müsste nicht im Datenblatt erwähnt 
werden, oder?
Mich macht dabei auch der Hinweis "if an interrupt handler is used" 
stutzig.

>
>>Oder konkret, muss ich in folgendem Geradeausfall, am Ende das ICF1 Flag
>>löschen?
>
> Ja.

In meinem Beispiel wird doch ein Interrupt Handler verwendet. Warum muss 
ich trotzdem das ICF1 Flag löschen?

von Falk B. (falk)


Lesenswert?

@  Conny Phi (conny_phi)


>In meinem Beispiel wird doch ein Interrupt Handler verwendet. Warum muss
>ich trotzdem das ICF1 Flag löschen?

Na weil sonst der Interrupt sofort wieder aktiv werden würde, obwohl gar 
keine echte Flanke erkannt worden ist. Durch das Wechseln der Flanke 
"verschluckt" sich die Logik und braucht einen Reset.

von Conny P. (conny_phi)


Lesenswert?

Falk B. schrieb:
> @  Conny Phi (conny_phi)
>
>
>>In meinem Beispiel wird doch ein Interrupt Handler verwendet. Warum muss
>>ich trotzdem das ICF1 Flag löschen?
>
> Na weil sonst der Interrupt sofort wieder aktiv werden würde, obwohl gar
> keine echte Flanke erkannt worden ist. Durch das Wechseln der Flanke
> "verschluckt" sich die Logik und braucht einen Reset.

Hab das gerade mal ausprobiert und einen Interrupt Zähler eingerichtet. 
Es hat sich aber nicht gezeigt, dass er durch das Umstellen der Flanke 
sofort wieder den Interrupt aktiviert und die ISR ein zweites Mal 
durchläuft. Hm...

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.