Forum: Mikrocontroller und Digitale Elektronik [assembler] frequenz-fortschreitend


von Richard X. (synq1e)


Lesenswert?

hat wer eine idee wie ich eine

von 10 sekunden abwärts zählend linear fortschreitende blinkfrequenz für 
eine led umsetzen kann ?

also 10 sekunden langsames blinken

bis 0 sekunden schnellstes blinken

nen sekunden timer hab ich ja schon.


hab ein sekündliches update von dem vergleichswert probiert also jede 
sekunde minus einen standard wert bei einem timer der in CTC läuft

ich denke irgendwie hängt sich er dann bei dem rechnen auf 
(subtrahieren) weil die led nicht
gleichmäßig bei einer sekunde schneller blinkt, sondern auch mal 
ausbleibt.

bin für jeden tipp dankbar :-)

von Karl H. (kbuchegg)


Lesenswert?

chris __ schrieb:

> hab ein sekündliches update von dem vergleichswert probiert also jede
> sekunde minus einen standard wert bei einem timer der in CTC läuft

klingt doch erst mal nicht schlecht

> ich denke

"ich denke" ist ganz schlecht. Das taugt bei der Fehlersuche bestenfalls 
für eine Hypothese. Anschliessend überlegt man sich, wie man das 
abtesten könnte um aus "Ich denke" ein "Ich weiß" zu machen.

> irgendwie hängt sich er dann bei dem rechnen auf
> (subtrahieren)

Das kann ich mir kaum vorstellen.

> weil die led nicht
> gleichmäßig bei einer sekunde schneller blinkt, sondern auch mal
> ausbleibt.

Daraus kann man aber erst mal nur schliessen, dass du höchst 
wahrscheinlich einen Programmfehler hast

> bin für jeden tipp dankbar :-)

Psst. Nicht weiter sagen - zeig deinen Code!

von Karl H. (kbuchegg)


Lesenswert?

PS: du hast berücksichtigt, dass im CTC Modus der Update des OCR 
Register sofort erfolgt?

Das bedeutet zb, dass wenn dein OCR Register auf 200 steht, der Timer 
gerade bei 150 rumrödelt und du den OCR Wert auf 100 setzt, der Timer 
einmal rundum zählen muss, bis er die 100 das erste mal sieht. Du hast 
ihm sozusagen die Obergrenze zu einem Zeitpunkt gesetzt, so dass er in 
diesem Zähldurchgang die Grenze nicht sehen wird.

Der Fast-PWM Modus macht das anders und kann anstelle des CTC benutzt 
werden, wenn man dieses Problem hat.

von Richard X. (synq1e)


Angehängte Dateien:

Lesenswert?

ich denke [;-)] es ist aber so wie du gesagt hast, dass der timer 
rumtrödelt, meinst du ich soll beim update ein clear timer einfügen ?

code ist angehängt

von Karl H. (kbuchegg)


Lesenswert?

chris __ schrieb:
> ich denke [;-)] es ist aber so wie du gesagt hast, dass der timer
> rumtrödelt, meinst du ich soll beim update ein clear timer einfügen ?

Benutz einfach den Fast-PWM Modus, der auf deinem µC das OCR1A Register 
als Obergrenze nimmt. Dann kümmert sich der Timer selbst darum, dass dir 
das nicht passiert, weil er den eigentlichen Register Update zum 
richtigen Zeitpunkt selbst macht.

Da du nicht gesagt hast, welchen µC du benutzt, kann ich dir nicht 
sagen, welcher Timer Modus das auf deinem µC ist. Auf einem Mega8 wäre 
es der Modus 15 vom Timer 1.


Lass dich nicht von PWM irre machen. Nur weil der Modus PWM heißt, 
bedeutet das ja nicht, dass du da die OCR Pins freischalten musst. 
Einfach den Modus von CTC auf "Fast-PWM mit Overgrenze in OCR1A" 
umstellen und dann sollte das schon flutschen.

von Karl H. (kbuchegg)


Lesenswert?

Schade

hier
1
  ldi r16,high(43200)  ;STARTWERT -> ~0,75 Sekunden
2
  out OCR1AH,r16
3
  ldi r16,low (43200)  ;
4
  out OCR1AL,r16
hast du die Sachlage mit der Dezimalzahl und den high/low Makros so 
schön geschrieben.

Und hier
1
 ldi r19,0xE0;LOW  BYTE  für subtraktion 
2
 ldi r20,0x10;HIGH BYTE für subtraktion  ->10er schritte subtrahieren (-4320)
fällst du wieder in eine der unbrauchbareren Schreibweisen zurück.
Warum nicht gleiche Schreibweise?
1
  ldi r19, low(4320)
2
  ldi r20, high(4320)

und schon braucht kein Mensch mehr den Kommentar. Und was noch wichtiger 
ist: Kein Mensch muss lang umtun, um sich zu vergewissern, dass deine 
Hex-Zahlen tatsächlich dem entsprechen, was im Kommentar behauptet wird.

von Karl H. (kbuchegg)


Lesenswert?

Aber der Rest sieht schon ganz ordentlich aus.
weiter so!

von Richard X. (synq1e)


Lesenswert?

> fällst du wieder in eine der unbrauchbareren Schreibweisen zurück.
sind doch nur schreibweisen ^^

beim fast pwm setzt sich der timer dann auch beim erreichen des OCR 
wertes zurück ?
mich verwirrt es ein bisschen weil CTC heißt ja clear timer on compare

von Karl H. (kbuchegg)


Lesenswert?

chris __ schrieb:
>> fällst du wieder in eine der unbrauchbareren Schreibweisen zurück.
> sind doch nur schreibweisen ^^

Schon. Aber such mal in einem 3000 Zeilen Programm Fehler, wenn du bei 
jeder dritten Anweisung den Taschenrechner zücken musst um etwas 
auszurechnen, was du mit der richtigen Schreibweise im Code sehen 
könntest.

>
> beim fast pwm setzt sich der timer dann auch beim erreichen des OCR
> wertes zurück ?

Jep.
In diesem Modus, in dem du dem Timer in OCR1A eine Obergrenze vorgeben 
kannst, passiert in dieser Hinsicht genau das gleiche.

> mich verwirrt es ein bisschen weil CTC heißt ja clear timer on compare

Ja, macht ja nichts.
Sieh diesen Fast-PWM Modus als einen "Spezial-CTC-Modus" an, bei dem 
zusätzlich noch die Möglichkeit besteht, dass du einen Portpin an die 
PWM koppeln kannst.  .... kannst, aber nicht musst.

von Spess53 (Gast)


Lesenswert?

Hi

>bei dem
>zusätzlich noch die Möglichkeit besteht, dass du einen Portpin an die
>PWM koppeln kannst.  .... kannst, aber nicht musst.

Ist bei CTC genau so.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Spess53 schrieb:
> Hi
>
>>bei dem
>>zusätzlich noch die Möglichkeit besteht, dass du einen Portpin an die
>>PWM koppeln kannst.  .... kannst, aber nicht musst.
>
> Ist bei CTC genau so.

Äh, ja.
Danke
Bin schon ganz verwirrt.

@TO
Ändert aber nix daran, dass dieser PWM Modus deine Lösung ist. Du musst 
ja die PWM Funktionalität nicht nutzen.

von amateur (Gast)


Lesenswert?

>meinst du ich soll beim update ein clear timer einfügen ?

Bringt nichts!

Wenn Du Karl Heinz Beispiel zugrunde legst, zählst Du zwar nicht einmal 
"hinten rum" aber ... 150 - 0 - 100 ergibt auch eine Spanne von 250 beim 
Umschalten. Deine Beleuchtung bekommt also auch 'nen 'Schluckauf'.

von Richard X. (synq1e)


Lesenswert?

verstehe ich das jetzt richtig der unterschied zwischen CTC und fast PWM

Timer bei CTC:
wenn das OCR register beschrieben wird findet der update
von  OCR SOFORT statt egal wo der counter TCNT steht

Timer bei Fast PWM:
wenn das OCR register beschrieben wird findet der update
von  OCR erst statt wenn TCNT OCR erreicht hat

von Karl H. (kbuchegg)


Lesenswert?

chris __ schrieb:
> verstehe ich das jetzt richtig der unterschied zwischen CTC und fast PWM
>
> Timer bei CTC:
> wenn das OCR register beschrieben wird findet der update
> von  OCR SOFORT statt egal wo der counter TCNT steht
>
> Timer bei Fast PWM:
> wenn das OCR register beschrieben wird findet der update
> von  OCR erst statt wenn TCNT OCR erreicht hat

Genau.
(Das ist natürlich noch nicht alles, aber es ist der für dich relevante 
Unterschied)

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.