Forum: Mikrocontroller und Digitale Elektronik TIFR0&1, Bedeutung


von Anne S. (anne90)


Lesenswert?

Nabend,

ich habe gerade noch in der Firma ein Programm durchchecken müssen und 
mir fiel dabei eine Kombination in den Augen, die ich noch nicht kenne.
Kann mir da jemand Hilfe leisten?
Es geht um das TIFR0&1.
TIFR0=TIFR0|1; bedeutet ja, dass das Register wieder auf den gleichen 
Wert wie es war gesetzt wird, also auf 1 oder direkt auf 1, richtg?
Freue mich auf Hilfe!

Hier ist der Ausschnitt:
...

TCNT0=0;
TCCR0B=0x02;
while(outB == HIGH))
 {
  if(TIFR0&1)
   {
   y=y+1;
   TIFR0=TIFR0|1;
   }

...

von Rene H. (Gast)


Lesenswert?

Anne S. schrieb:
> if(TIFR0&1)

Wenn das letzte Bit von TIFR0 gesetzt ist, dann...

von H.Joachim S. (crazyhorse)


Lesenswert?

Schau ins Datenblatt, diese Bits werden durch Schreiben einer 1 
gelöscht.

"Alternatively, xxx is cleared by writing a logic one to
Bit..."

von Anne S. (anne90)


Lesenswert?

Hallo Rene,

Welches letzte Bit ist gemeint? Warum reicht nicht das TIFR0 aus?

Tschuldige, habe noch sehr wenig Programmierkenntnisse...

von Anne S. (anne90)


Lesenswert?

Hallo Joachim,

..und das kann man mit einem ...&1 realisieren?
Ich dachte immer man muss sowas wie: TIFR0=0; dann schreiben um es 
wieder zu reseten?..

von Mein grosses V. (vorbild)


Lesenswert?

Anne S. schrieb:
> Ich dachte immer man muss sowas wie: TIFR0=0; dann schreiben um es
> wieder zu reseten?..

Und jetzt hast du gelernt, wie es richtig gemacht wird.

von Wolfgang H. (Gast)


Lesenswert?

Hi, Anne S.,

Der Ausdruck "if(TIFR0 & 1)" ist Pfusch, weil der Leser nicht erkennen 
kann, was da eigentlich berechnet wird.
Besser ist "if(TIFR & BV(TOV0))   //pruefe auf Timer/Counter0 Overflow 
Flag

Qualität ist eben nicht allein die Geschwindigkeit der Programmierung, 
kost es später an Zeit, was es wolle. Sondern die Qualität ist hier, die 
gesamte Arbeitszeit bis zum Ende der Wartungsphase zu minimieren.

Aus dem Datenblatt: "Alternatively, TOV0 is cleared by writing a logic 
one to the flag."
Der Ausdruck macht also schon Sinn. Aber wer Qualität liefern will, der 
denkt auch an diejenigen, die seinen Code verstehen sollen und wollen.

Deshalb mein Urteil: "Zurück zum Reißbrett, der Programmierer möchte 
seine Files bitte ordentlich kommentieren!"


Ciao
Wolfgang Horn

von Anne S. (anne90)


Lesenswert?

Hallo Wolfgang,

das selbe dachte ich auch: "Was hat derjenige denn da gemacht, den 
Ausdruck kenne ich nichtmal".

Danke für deine Ausführliche Antwort!!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wolfgang H. schrieb:
> Der Ausdruck "if(TIFR0 & 1)" ist Pfusch, weil der Leser nicht erkennen
> kann, was da eigentlich berechnet wird.

Naja. Mit etwas mehr als drei Monaten C-Erfahrung unter dem Hintern 
liest man so etwas als "werte Bit 0 von TIFR0 aus".

Das sollte man erkennen können.

Unabhängig davon ist es hier schlechter Stil (und insofern hat Wolfgang 
auch wieder recht), weil die Bedeutung von Bit 0 sich so nicht 
erschließt.

von Falk B. (falk)


Lesenswert?

@ Anne Siedel (anne90)

>Es geht um das TIFR0&1.

Das ist ein logischer Ausdruck. Bitweise Verknüpfung des IO-Registers 
TIFR0 mit der Konstante 1. Damit wird geprüft, ob Bit #0 gesetzt ist, 
siehe Bitmanipulation.

>TIFR0=TIFR0|1; bedeutet ja, dass das Register wieder auf den gleichen
>Wert wie es war gesetzt wird, also auf 1 oder direkt auf 1, richtg?

Falsch. Auch hier geht es um Bitmanipulation. Allerdings ist dieser 
Ausdruck zumindest teilweise falsch. Die Wirkung von Schreibzugriffen 
ist hier etwas anders als bei normalen Registern. Besser man schreibt

TIFR0=1;

oder noch besser, weil verständlich.

TIFR0 = (1<<TOV0);

Damit wird der Wert 1 in das Register geschrieben und NUR das Bit #0 
TOV0 gelöscht. Mit der originalen Anweisung

TIFR0=TIFR0|1;

könnten im Einzelfall noch andere, gerade zufällig gesetzte Bits 
gelöscht werden, weil der alte Wert incl. gesetztem Bit 0 
zurückgeschrieben wird. Das ist in einigen Fällen ein Programmierfehler!

MfG
Falk

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.