www.mikrocontroller.net

Forum: Compiler & IDEs 16 Bit Timer


Autor: Thomas Schmidt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Thomas Schmidt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Harald (Gast)
Datum:

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

mfG Harald

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.