Forum: Compiler & IDEs Interruptproblem


von Matthias Herrmann (Gast)


Lesenswert?

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???

von Matthias Herrmann (Gast)


Lesenswert?

Sorry, keine Ahnung warum das jetzt dreimal im Forum steht!

von Andreas (Gast)


Lesenswert?

Weil Du dreimal auf "Submit" gedrückt hast...

von Jörg Wunsch (Gast)


Lesenswert?

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...

von Matthias Herrmann (Gast)


Lesenswert?

So ist das, wenn man probiert anstatt zu studieren.

Danke noch einmal.

von Matthias Herrmann (Gast)


Lesenswert?

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.

von Matthias Herrmann (Gast)


Lesenswert?

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.

von Jörg Wunsch (Gast)


Lesenswert?

Und wie sieht's in der realen Welt statt im AVR Studio aus?

Simulationen können ja ganz nett sein, aber entscheidend ist immer die
Welt. ;-)

von Florian Pfanner (Gast)


Lesenswert?

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

von Matthias Herrmann (Gast)


Lesenswert?

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.

von Matthias Herrmann (Gast)


Lesenswert?

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

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
Noch kein Account? Hier anmelden.