Forum: Compiler & IDEs 16 Bit Timer


von Thomas Schmidt (Gast)


Lesenswert?

Hallo,

ich versuche gerade krampfhaft den 16 Bit Timer des Atmega8 zu
programmieren, nur irgendwie ist der Wurm drin.

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

unsigned char time_ist = 0;

SIGNAL (SIG_OVERFLOW1) {
  time_ist++;
}

void timer (unsigned char time_soll) {
  unsigned char time_ist = 0;
  TCNT1 = 0;                //Rücksetzen des Timers
  TCCR1B = _BV(CS11) | _BV(CS10);    //Prescaler 64
  TIMSK = _BV(TOIE1);            //Timer Overflow Interrupt enable
  sei ();
  while (time_soll >= time_ist) {}
}

int main (void) {
  DDRB = 0xff;
  for (;;) {
    PORTB = 0xff;
    timer (1);
    PORTB = 0x00;
    timer (1);
  }
}

Eigentlich sollten die LEDs ca. im Sekundentakt blinken. 4MHz/64/2^16
liefert ungefähr eine Frequenz von einem Hertz.
Wo liegt nun der Fehler?

Thomas

von Joerg Wunsch (Gast)


Lesenswert?

> Wo liegt nun der Fehler?

Im Nicht-Lesen der FAQ.  FAQ#1: wann muß ich volatile benutzen?

(Die FAQ steht als Teil der avr-libc Doku im doc/ Verzeichnis Deines
WinAVR.)

von Thomas Schmidt (Gast)


Lesenswert?

Hallo Joerg,

falls du "volatile unsigned char time_ist = 0;" meinst, das hatte ich
vorher schon stehen. Ich hatte mich dabei an Peters Programm mit der
genauen Sekunde gehalten. Dort wird die Variable ja auch so
initialisiert. Ich habe dann nur rumexperimentiert, da mir nicht klar
war, warum nix geht. Allerdings funktioniert es mit diesem Präfix auch
nicht.

Thomas

von Joerg Wunsch (Gast)


Lesenswert?

> falls du "volatile unsigned char time_ist = 0;" meinst, ...

volatile unsigned char time_ist;

genügt.  Statische Variablen (und globale sind immer statisch) werden
automatisch auf 0 initialisiert.

Wenn's das aber nicht war, vielleicht beschreibst Du ja dann erstmal
Dein Fehlerbild?

von Peter D. (peda)


Lesenswert?

void timer (unsigned char time_soll) {
  unsigned char time_ist = 0;

Damit hast Du eine lokale Variable gleichen Namens erzeugt und dann ist
die globale Variable in dieser Funktion nicht mehr zugreifbar.

Sowas ist in C zwar erlaubt aber kein guter Programmirstil.

Um sowas zu vermeiden, kann man globale Variablen mit einem großen
Anfangsbuchstaben kennzeichnen:

unsigned char Time_ist = 0;


Peter

von Harald (Gast)


Lesenswert?

Ich würde die lobale Variable einfach weglassen, und die globale auf
volatile setzen. Dann müsste es eigentlich klappen.

mfG Harald

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.