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

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.

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.