www.mikrocontroller.net

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


Autor: Jens (Gast)
Datum:

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

Autor: Volatileist (Gast)
Datum:

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

Autor: Jens (Gast)
Datum:

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

Autor: Volatileist (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

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.