[erledigt] globale Variable in ISR ändern + im Hauptprogramm
Hai,
ich hab ein Problem mit einer Interrupt-Routine. Ich habe folgenden Code (Ausschnit).
Code:
#include <../include/avr/io.h>
#include <../include/avr/interrupt.h>
#include <../include/stdlib.h>
#include <../include/util/delay.h>
volatile uint16_t Zeittick = 0 ;
SIGNAL (TIM1_OVF_vect)
{
// ISR-Code
//PORTB ^= (1<<PB2);
PORTB |= (1 << PB2); /* setzt Bit 3 an PortB auf 1 */
//PORTB &= ~(1 << PB2); /* loescht Bit 3 an PortB */
Zeittick++;
}
int main (void) {
//Zeittick = 0;
if (Zeittick >= 20)
{
//PORTB ^= (1<<PB3);
//Zeittick = 0;
PORTB |= (1 << PB3); // setzt Bit 3 an PortB auf 1
}
Die ISR "TIM1_OVF_vect" wird angesprungen, der Timer läuft, alles prima. Aber die If-Abfrage im Hauptprogramm wird einfach nich ausgeführt. Stecke ich diese Abfrage in die ISR gehts. Wo hab ich da einen Fehler drin ? Wie kann ich eine Variable in einer ISR sonst manipulieren und im Hauptprogramm abfragen ?
Ist die If-Agbfrage in der ISR taucht das Problem auf, dass die Variable Zeittick bei einem Softreset nicht zuverlässig auf Null gesetzt wird. ICh versteh aber nicht warum.... :(
Internette Grüße
Stefan
Liste der Anhänge anzeigen (Anzahl: 1)
nö, ich spare nicht. Ich erhielt nur die Nachricht, dass mein Beitrag zu lang wäre, daher dachte ich, ich beschränke mich auf den (wichtigen?) Anfang. Aber ich kann die Datei natürlich auch als Attachment dranhängen, hatte ich garnicht dran gedacht.
Internette Grüße
Stefan
die Datei bitte in main.lss umbenennen, ist unsinnig 21kb zu zippen, aber anders akzeptiert das Forum die Datei nicht (?)
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Abend,
also so langsam gehen mir die Ideen aus. Ich hab mal deinen Code genommen und compiliert. Das Ergebnis ist das gleiche wie bei mir. Anscheinend wird der Zeittick nicht global verändert. Kannst du mir mal dein hex-File schicken, vielleicht liegts ja an meinem Compiler oder an meinen Einstellungen. Ich häng mal mein Makefile an. Seht ihr da einen Fehler ? Die *.txt Endung ist nur fürs Forum.
Ich hab auch alle Optimierungsstufen durchprobiert, Ergebnis negativ. Das kann doch alles nicht sein. Ich glaub ich werd doch lieber Gärtner...
Internette Grüße
Stefan
PS: hab grad was interessantes entdeckt. Schreibe ich in die Overflow ISR NUR meinen Zeittick rein, geht es. Die Variable wird im Hauptprogramm richtig erkannt. Steht noch eine weitere Zeile in der ISR geht es nicht ?! Es spielt auch keine Rolle wo der Zeittick steht, ist die Zeile allein - ok ; ist eine weitere Zeile dabei - nicht ok
HEUREKA ich hab's gefunden
Hai,
das Problem hat mir einfach keine Ruhe gelassen. Jetzt viele Kaffee und wenig schlaf später hab ich es, glaube ich gefunden. Das kommt davon, wenn man so viele Dinge auf einmal testen will. Das Problem liegt in dem aktivierten PIN-Interrupt "PCMSK = 0b00000100; ". Den hatte ich auch mal getestet und leider aktiviert gelassen. Das Interrupt hab ich gelassen, die ISR allerdings gelöscht bzw. auskommentiert. Lege ich eine leere ISR an oder deaktiviere das Interrupt klappt alles wie erwartet.
Danke an alle, die an der Lösungs dieses Problems mitgewirkt haben.
Internette Grüße
Stefan