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;
}
...
Schau ins Datenblatt, diese Bits werden durch Schreiben einer 1 gelöscht. "Alternatively, xxx is cleared by writing a logic one to Bit..."
Hallo Rene, Welches letzte Bit ist gemeint? Warum reicht nicht das TIFR0 aus? Tschuldige, habe noch sehr wenig Programmierkenntnisse...
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?..
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.
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
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!!
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.
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.