Timer0 Interrupt in C funzt nicht

Gast #260004
Lesenswert?

Morgen,
ich hab n großes kleines Problem, und zwar wollte ich den Timer0 des
AT90s2313 starten, damit ein Register incrementieren und den aktuellen
Wert an einem Port anzeigen. Den Startwert zeigt es auch an, aber von
zählen ist keine Spur. Irgendwie scheint das mit C nicht so einfach zu
sein, kann mir vielleicht wer weiterhelfen?

... das ist mein Code:

#include <avr/io.h>          // ohne wirds nicht gehen
#include <avr/wdt.h>
#include <avr/interrupt.h>        // besser ist das

unsigned char counter = 7;


void main (void)
{
DDRB = 0xff;          // Port B als Ausgang

TCCR0 = 0b00000101;          // ck/1024
TIMSK = 0b00000010;          // TIMER0 aktiv
sei();            // globale Freigabe

for (;;)  {
  PORTB = counter;        // Wert anzeigen
  }          // Endlosschleife
}


SIGNAL (SIG_OVERFLOW0)         // ISR Timer0
{
counter = counter + 1;        // +1
}
Gast #260005
Lesenswert?

Auf den ersten blick (aber ohne in's datenblatt des uC gesehen zu
haben, also ohne anspruch auf vollstaändigkeit)

volatile unsigned char counter = 7;

Dann klapp es etwas besser mit dem Nachbarn ;)
Gast #260007
Lesenswert?

Das ist ein hinweis an den Compiler dass sich der Inhalt der Variablen
jederzeit außerhalb des Programmflusses ändern kann.
Hiermit wird die Optimierung beeinflusst und der Variablenwert nicht in
einem Register vorgemerkt sondern bei jedem Zugriff neu aus dem RAM
geladen.
Du solltest Dir das Assemberlisting einam mit- und einmal ohne
"volatile" ansehen, dann erkennst Du vielleicht den Unterschied.
Gast #260008
Lesenswert?

jo, und für einen 1. Test könnte man auch schreiben:

SIGNAL (SIG_OVERFLOW0)         // ISR Timer0
{
PORTB++;
}

dann brauchst du counter erst mal gar nicht, und du siehst, ob der MC
an sich und der Timer richtig läuft.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren