Forum: Mikrocontroller und Digitale Elektronik µC mit Timer und ADC hat aussetzer


von Klaus (Gast)


Lesenswert?

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

von Später (Gast)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Später (Gast)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

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