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???
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...
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.
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.
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. ;-)
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.