Forum: Compiler & IDEs Overflow Flag ist immer 1??


von Matthias L. (mcl024)


Lesenswert?

Hallo

ich habe folgendes Problem. Das Overflow Falg TOV0 ist immer eins wenn 
ich es in flag schreibe. Das verstehe ich nicht es müsste doch erstmal 
Null sein und wenn der Timer einmal bis 255 durchgelaufen ist dürfte es 
doch erst gesetzt sein. Und wenn es gestzt ist kann ich es doch mit 
schreiben einer 1 wieder zurücksetzen.

#include <avr/io.h>
//#include <stdlib.h>
//#include <stdio.h>
//#include <stdint.h>


//Start des Programms

int main (void)
{
  TCCR0B = 0x02; //Timer aktivieren
  DDRB = 0x08; //Setzt PB3 als Ausgang
  int timer;
  int flag;
  for(;;)
  {
    timer = TCNT0;
    flag = TOV0;
    PORTB ^= 0x08; //Toggle PB3 high
    if(flag == 1)
    {
      TIFR0 = 0x02;
    }
  }
//Ende des Programms
  for(;;) {
  }
}

von Matthias L. (Gast)


Lesenswert?

>flag = TOV0;

Das liest NCIHT das Flag aus, sondern nur die Konstante (Bitnummer) aus 
der Definition (die wohl zufällig eins ist)

von Der Dude (Gast)


Lesenswert?

TIFR0 = 0x01;

von Stefan E. (sternst)


Lesenswert?

Der Dude wrote:
> TIFR0 = 0x01;

Du weißt doch gar nicht, um welchen Controller es konkret geht.
Und wenn TOV0 wirklich 1 ist, dann ist "TIFR0 = 0x02;" richtig.
Allerdings schreibt man besser "TIFR0 = 1<<TOV0;".

von Der Dude (Gast)


Lesenswert?

Ja, kommt auf den uC an. Beim Mega8 ist TOV0 aber Bit0, also 1.

Ausserdem heisst das entsprechende Register TIFR, nicht TIFR0.

von Matthias L. (mcl024)


Lesenswert?

Erstmal Danke für die Antworten, aber wie lese ich denn jetzt das Bit 
(TOV0) aus?? Ich will ja dann etwas mit dem wechsel des Overflow-Flag 
anstellen.

Mit TIFR0 = 1<<TOV0; setzte ich das Bit ja nur wieder zurück das weiss 
ich und das funktioniert auch.

Es handelt sich übrigens um einen ATtiny13

von Stefan E. (sternst)


Lesenswert?

Der Dude wrote:
> Ja, kommt auf den uC an. Beim Mega8 ist TOV0 aber Bit0, also 1.
>
> Ausserdem heisst das entsprechende Register TIFR, nicht TIFR0.

Eben, deswegen kann es schon mal kein Mega8 sein.

von Stefan E. (sternst)


Lesenswert?

Matthias Lobitz wrote:
> Erstmal Danke für die Antworten, aber wie lese ich denn jetzt das Bit
> (TOV0) aus?? Ich will ja dann etwas mit dem wechsel des Overflow-Flag
> anstellen.

flag = TIFR0 & (1<<TOV0);

"if(flag == 1)" funktioniert dann aber nicht. Du musst auf >0 testen, 
also einfach "if (flag)".

von Matthias L. (mcl024)


Lesenswert?

Jo super jetzt klappt es.

Vielen Dank echt super Forum hier.

Ach kann mir vielleicht einer noch sagen wie ich die genaue CPU 
-Frequenz auslesen kann? Im Datenblatt steht nur 0-10Mhz.

Sorry aber ich bin echt neu auf dem Gebiet

von Matthias L. (Gast)


Lesenswert?

>ch kann mir vielleicht einer noch sagen wie ich die genaue CPU
>-Frequenz auslesen kann? Im Datenblatt steht nur 0-10Mhz.

Garnicht. Die legst du selbst fest. Entweder mit externem Quartz oder 
mit internem RC-Oszillator

von Matthias L. (mcl024)


Lesenswert?

Und wo sehe ich wie der interne RC-Oszillator eigestellt ist?

von Matthias L. (Gast)


Lesenswert?

Fusebits auslesen.

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.