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 }
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 ;)
öhm und was hat es mit volatile auf sich, was macht das ... never heard about that???
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.