Hallo, ich habe ein Problem mit einem Attiny44. Ich bin relativ neu in der µC-programmiereung in C und habe mit ein paar kleinen Versuchen angefangen. Als erstes habe ich ein PWM Signal mit dem Timer0, anschließend mit dem Timer1 programmiert. Hat alles wunderbar funktioniert. Danach habe ich mit einem internen ADC eine Bargraphanzeige (über PortB) angesteuert. Auch das klappte einwandfrei. Nun aber zum eigentlichen Problem: Ich will ein PWM mit dem Timer1 erzeugen und die Frequenz mittels ADC einstellen. Jetzt ist es aber so, dass das PWM-signal immer wieder und immer unterschiedlich (sehr lange) Aussetzer von mehreren Sekunden hat. Also ich habe kurz das PWM-signal am Ausgang und dann einen langen Aussetzer. Ich kann leider im moment den Code nicht liefern, da ich nicht Zuhause bin. Werde den aber später nachreichen! Deshalb ist meine Grundsätzliche Frage jetzt erstmal, ob dieses Problem bekannt ist? Ob ich einfach nur irgendetwas vergessen haben könnte? Kann es sein das der ADC sooo lange für eine Konvertierung braucht? Oder kann der Interrupt vom Timer meine ADC-konvertierung unterbrechen? Grundsätzliches zum Programm: Watchdogtimer hab ich ausgeschaltet (hatte schon ähnliche Probleme als dieser eingeschaltet war) Timer1 und ADC1 initilisiert der Timer Interrupt (CTC-Mode) toggelt Pin7 von PortB den ADC starte ich in der Hauptschleife, warte bis die Konvertierung fertig ist und verrechne das Ergebnis mit dem OCR1A-Register Ich hoffe, dass das jetzt verständlich ist und wäre froh wenn ihr mir helfen könntet Gruß, Klaus
Klaus schrieb: > Ich kann leider im moment den Code nicht liefern, da ich nicht Zuhause > bin. Werde den aber später nachreichen! Jetzt bin ich aber gespannt und warte nur noch auf den Code um deine Probleme zu lösen. > > Deshalb ist meine Grundsätzliche Frage jetzt erstmal, ob dieses Problem > bekannt ist? Ob ich einfach nur irgendetwas vergessen haben könnte? Klar, hat wohl jeder schon mal gehabt. > Kann es sein das der ADC sooo lange für eine Konvertierung braucht? > Oder kann der Interrupt vom Timer meine ADC-konvertierung unterbrechen? Wie lange der ADC braucht ist berechenbar und zunächst unabhängig vom Programm. Ein Interrupt kann nicht die Konvertierung unterbrechen, wohl aber die Auswertung des Ergebnisses, sei es im Hauptprogramm oder in einem anderen Interrupt.
Die Hardware PWM eines AVR-Timers interessiert es eigentlich nicht die Bohne, was die Software um ihn herum tut, es sei denn, du fummelst an den Timerregistern oder den Ausgangspins rum. Ansonsten lässt sie sich durch nichts aus dem Tritt bringen.
Später schrieb: > Ein Interrupt kann nicht die Konvertierung unterbrechen, wohl aber die > Auswertung des Ergebnisses, sei es im Hauptprogramm oder in einem > anderen Interrupt. Mit Auswertung meinst du das Berechnen von OCR1A? Aber selbst wenn die unterbrochen werden würde muss das ja nachdem die Interruptroutine abgearbeitet wurde an der Stelle weitermachen oder? Matthias Sch. schrieb: > Die Hardware PWM eines AVR-Timers interessiert es eigentlich nicht die > Bohne, was die Software um ihn herum tut, es sei denn, du fummelst an > den Timerregistern oder den Ausgangspins rum. Ansonsten lässt sie sich > durch nichts aus dem Tritt bringen. Ich habe bei den Timerregistern nur den Prescaler und den CTC-Mode eingestellt. Ich habe auch nur einen Ausgangspin und das ist PA7 beim Attiny44 (hab mich vorher vertan mit PB7).
Das ist das dümmste was du tun kannst, für eine PWM den CTC Modus zu benutzen. Den der UPdate des OCR1A Registers erfolgt 'Immediate' also sofort. Ein Compare Match wird aber nur bei Registergleichstand ausgelöst. Jetzt stell dir mal folgende Situation vor (spiel sie durch): Der OCR1A Wert steht gerade auf 200. Der Timer sei gerade bei 150 jetzt änderst du den OCR1A Wert auf 100. Was passiert? Compare Match hast du bei 100 erst mal keinen, denn 150 ist nicht gleich 100. Compare Match hast du aber auch bei 200 keinen mehr. Denn OCR1A ist ja nicht mehr 200. D.h. der Timer läuft bis zu seinem Endwert durch, macht einen normalen Overflow und erst im nächsten Zyklus kommt dann der Compare Match bei 100. Benutze einen normalen PWM-Modus, dazu ist er gedacht. Oder wenigstens einen PWM Modus (wenn du schon keine Hardware PWM machen willst), nur aus dem einen Grund: damit dir die Hardware den Update des OCR1A Registers mit dem Timer synchronisiert.
Klaus schrieb: > Später schrieb: >> Ein Interrupt kann nicht die Konvertierung unterbrechen, wohl aber die >> Auswertung des Ergebnisses, sei es im Hauptprogramm oder in einem >> anderen Interrupt. > > Mit Auswertung meinst du das Berechnen von OCR1A? Aber selbst wenn die > unterbrochen werden würde muss das ja nachdem die Interruptroutine > abgearbeitet wurde an der Stelle weitermachen oder? Ich rechne das Auslesen des Ergebnisses des ADC mit zur Auswertung. Ja. Es gibt aber so viele Eventualitäten, die in deinem Programm vorhanden sein können, daß ohne Code nur theoretisieren bleibt.
Karl Heinz schrieb: > Compare Match hast du bei 100 erst mal keinen, denn 150 ist nicht gleich > 100. Compare Match hast du aber auch bei 200 keinen mehr. Denn OCR1A ist > ja nicht mehr 200. > D.h. der Timer läuft bis zu seinem Endwert durch, macht einen normalen > Overflow und erst im nächsten Zyklus kommt dann der Compare Match bei > 100. Klingt einleuchtend :) vielen Dank! werde das heute nachmittag dann mal ausprobieren
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.