Forum: Mikrocontroller und Digitale Elektronik Timer0 Interrupt in C funzt nicht


von Jens (Gast)


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
}

von Volatileist (Gast)


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 ;)

von Jens (Gast)


Lesenswert?

öhm und was hat es mit volatile auf sich, was macht das ... never heard
about that???

von Volatileist (Gast)


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.

von crazy horse (Gast)


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.

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.