TIFR0&1, Bedeutung

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

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

Antwort schreiben

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.

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.