Interruptproblem

Gast #76766
Hallo,
ich als WinAVR- Anfänger habe mal wieder ein Problem. Bin gerade dabei,
ein bisschen mit PWM und Interrupts zu spielen:

#include <avr/io.h>
#include <avr/interrupt.h>
unsigned int tests=0;

SIGNAL (SIG_OVERFLOW1)
  {
  tests++;
  }


int main (void)
  {

  timer_enable_int (_BV(TOIE1));
  sei();


  //PWM initialisieren
  TCCR1A = 0x81;
  TCCR1B = 0x01;
  OCR1L = 0x08;
  while (1)
    {
    };
  return 0;
  }
Ich teste dieses Programm mit AvrStudio. Dabei sollte die Variable
tests hochgezählt werden. Der Interrupt wird zwar ausgelöst, aber die
Variable wird nicht inkrementiert. Was hab ich da schon wieder
vergessen???
Gast
FAQ #1 nicht gelesen...

Im WinAVR-Verzeichnis, dort unter "doc", die avr-libc Doku ansehen.
Auf der Einstiegsseite ist ein Pointer auf die FAQ.  Es ist wirklich
der allererste Eintrag...
Gast
nun hab ichs doch noch einmal probiert und die Zeile geändert. Es klappt
trotzdem nicht. Ich hab auch einmal die Optimierung rausgenommen. Auch
das hat nichts geändert.
Laut Disassembler ist der Wert in 0x0060 abgelegt. Dort wird der
Anfangswert auch abgelegt, aber dann passiert da nichts mehr.
Gast
ich bin es heute noch einmal Zeile für Zeile durchgegangen (AVRStudio).
Die Interrupt-Routine wird doch nicht ausgeführt. Wird der Interrupt
ausgelöst (TOV1=1), dann springt der Zeiger an den Anfang der main-
Funktion und das I-Bit im SREG wird gelöscht. Ich denke, das sieht nach
einem Reset des Controllers aus. Leider weiss ich nicht, warum er das
tut.
Gast
Hallo,

ich habs mal Compiliert und Simuliert. Also ich kanns so gar nicht
Compilieren, der Compiler mecker nur rum. Wenn ich aber noch die Zeile
#include <avr/signal.h> am anfang einfüge, klappts. Auch in der
Simulation ist alles wunderbar.

Was du mit dem Programm bezwecken willst, ist mir nicht ganz klar. Auf
der einen Seite willst du den PWM aktivieren und auf der anderen Seite
den Timer Overflow-Interrupt nutzen. Eigentlich schließt das eine das
andere aus???????

Gruß, Florian
Gast
das Programm ist so auch noch nicht fertig. Es war ein erster Versuch.
Das eine schließt das andere eben nicht aus. Den Overflow- Interrupt
möchte ich dazu nutzen, um in OCR1L den Wert jedesmal zu verändern.
Dadurch kann man, so denke ich, z.B. ein Sinussignal mittels PWM
erzeugen.

Das mit der signal.h werd ich nochmal ausprobieren.
Gast
das mit der signal.h funktioniert tatsächlich.

Danke Florian.

Das mit der Hardware muss noch warten, bis das Programm das tut was es
soll. Schließlich soll die mal richtig Leistung wechselrichten

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.