TIFR0&1, Bedeutung

OP #4468827
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;
   }

...
Gast #4468889
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
Persönliche Seite #4468966
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.
#4468997
@ 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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.