16 Bit Timer

Gast #76157
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
Gast #76158
> 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.)
Gast #76159
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
Gast #76160
> 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?
#76161
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 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.