Forum: Mikrocontroller und Digitale Elektronik Wie bekomme ich den Timer auf eine Frequenz von 500Hz eingestellt?


von BerndB (Gast)


Lesenswert?

Guten Tag, ich brauche euere Hilfe,

es fällt mir noch schwer mit einem Timer umzugehen.
Wie ich das PWM Puls- Pausenverhältnis einstellen kann ist mir 
mittlerweile
klar geworden.
Das Problem was ich habe ist, wie ich in Assembler bei einem ATmega8 die 
Frequenz einstellen kann. Bei meinem beispiel hier habe ich lediglich 
eine Frequenz von ca. 30Hz, brauche aber 500Hz.

       .EQU XTAL = 4000000
        LDI temp1, 1<<COM1A1 | 1<<WGM11
  OUT TCCR1A, temp1

  LDI temp1, 1<<WGM13 | 1<<WGM12 | 1<<CS10
  OUT TCCR1B, temp1

Vielen Dank für euere Hilfe!

Bernd

von H.Joachim S. (crazyhorse)


Angehängte Dateien:

Lesenswert?

Da steht eigentlich alles drin, was du wissen willst/musst :-)

von spess53 (Gast)


Lesenswert?

Hi

Willst du jetzt nur eine Frequenz (1:1) von 500Hz oder eine PWM mit 500 
Hz?

MfG Spess

von Der kleine Niels (Gast)


Lesenswert?

1. Welche Hardware?
2. Probier mal nen kleineren Prescaler für den Counter
3. Evtl. kann dein AVR? einen CTC-Mode mit PWM, nur dann kannst du 
wirklich annähernd genau 500Hz erzeugen (ohne manuelles rücksetzen des 
Counter in einer ISR).
4. Ansonsten musst du deinen Quarz entsprechend wählen.


Mehr input gibt genaueres und mehr output!!!
Also spuck sie aus deine Infos

von Karl H. (kbuchegg)


Lesenswert?

H.joachim Seifert schrieb:
> Da steht eigentlich alles drin, was du wissen willst/musst :-)

@TO
Und der Rest ist reine Rechnerei.

Wenn du jede Sekunde eine Zahl um 1 erhöhst, wie lange dauert es dann 
bis du bis 1000 gezählt hast?

Bzw. was du brauchst ist die Umkehrung: Wie weit kannst du in 1 Stunde 
zählen?

Bzw. umgelegt auf die Frequenz: Bis zu welcher Zahl musst du zählen, 
damit du in 1 Stunde genau 500 mal diese Zahl erreichst.

(Bei dir im µC dann natürlich nicht Stunden sondern Sekunden. Auf der 
anderen Seite zählt dein µC aber auchnicht jede Sekunde den Zahlenwert 
um 1 hoch, sondern er macht in 1 Sekunde 4 Millionen Zählschritte, da du 
ja einen Vorteiler von 1 hast)

von BerndB (Gast)


Lesenswert?

Tut mir leid,
aber ich glaube ich habe grundlegende Verständnisprobleme!
Ich möchte eine LED dimmen mit einer Grundfrequenz von zB. 250 oder 
500Hz und verstehe einfach nicht wie man den Timer dafür einstellt.

"Bzw. was du brauchst ist die Umkehrung: Wie weit kannst du in 1 Stunde
zählen?"

In meinem Fall habe ich den Prescaler (1<<CS10) gar nicht eingebunden 
und trotzdem flackert die LED.

TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10)

Gruß
Bernd

von Karl H. (kbuchegg)


Lesenswert?

BerndB schrieb:
> Tut mir leid,
> aber ich glaube ich habe grundlegende Verständnisprobleme!
> Ich möchte eine LED dimmen mit einer Grundfrequenz von zB. 250 oder
> 500Hz und verstehe einfach nicht wie man den Timer dafür einstellt.

Dann solltest du damit anfangen zu verstehen, wie ein Timer eigentlich 
arbeitet.

Der zählt einfach vor sich hin
0, 1, 2, 3, 4, ....., 65534, 65535, 0, 1, 2, 3, 4

(weobei er als 16 Bit Zähler nicht weiter als bis 65535 kommt. Danach 
gehts einfach wieder mit 0 weiter)

Angenommen der Zähler zählt jede Zehntel Sekunde um 1 hoch, wie lange 
dauert es dann, bis er einmal von 0 bis 0 rum kommt?

Das kann man ausrechnen!

Man kann auch umgekehrt rechnen: Wenn der Zähler mit dieser Rate zählt, 
wie weit kommt er dann, wenn ich ihm (Hausnummer) 2 Minuten Zeit gebe.

Diese Aufgabenstellung kann man auch umdrehen:
Wenn ich aus der vorhergehenden Aufgabenstellung ausgerechnet habe, wie 
weit der Zähler in 2 Minuten kommt, dann kann ich das auch umgekehrt 
betrachten: Wenn der Zähler bis zu dieser Zahl x gekommen ist, dann sind 
2 Minuten vergangen.

Nun zählt dein Timer nicht jede Zehntel Sekunde um 1 hoch, sondern viel 
schneller. Wie schnell? (das hängt von der Taktversorgung und vom 
Prescaler ab - du bist drann mit rechnen)

Und du gibst ihm nicht 2 Minuten Zeit, sondern nur 1/500 Sekunden.

Wie weit kann daher der Timer in diesem Zeitraum zählen?


Erwarte nicht, dass ich dir das jetzt im Detail vorrechne. Sobald du 
verstanden hast wie ein Timer arbeitet (und das ist wirklich primitiv) 
ergibt sich das alles ganz von selbst.


Du benutzt den PWM-Modus 14 (festgelegt durch die WGMxx Bits)
In diesem Modus zählt dein Timer
0, 1, 2, 3, ... , x-2, x-1, x, 0, 1, 2, 3, ... , x-2, x-1, x

wobei das x die Zahl ist, die im ICR1 Register steht. (Siehe Datenblatt, 
der TOP Wert)

Die Frage ist jetzt: wie gross muss x sein, damit der Timer in 1 Sekunde 
genau 500 mal bis x zählen kann. Oder was gleichwertig ist: Wie gross 
muss x sein, damit der Timer in 1/500 Sekunde einmal bis x zählen kann.

Der Rest ist Arithmetik auf Grundschulniveau. Das kriegst du hin.

Und noch ein Hinweis:
Es kann jetzt natürlich sein, dass du für x keinen vernünftigen Wert 
rauskriegst. Entweder weil x 0 oder 1 oder sonst irgendeine kleine Zahl 
ist. Oder weil das x größer als 65535 ist (der Timer kann nur bis 
maximal 65535 zählen). Dann muss man eben einen anderen Vorteiler 
probieren und nochmal rechnen. Generell möchtest du ein x erhalten, 
welches möglichst groß ist (aber kleiner als 65535), denn dieses x 
bestimmt letztendes auch wie fein du die PWM abstufen kannst. Also 
probiert man eben verschiedene Vorteiler aus, bis man einen hat, der 
einem zusagt.

von Karl H. (kbuchegg)


Lesenswert?

BerndB schrieb:

> In meinem Fall habe ich den Prescaler (1<<CS10) gar nicht eingebunden
> und trotzdem flackert die LED.

Was soll das heissen, du hast den Prescaler nicht eingebunden?

Da steht er doch
> TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10)

Sobald ein Timer einen Prescaler hat, zählt er auch. Prescaler auf 0 und 
er hört auf zu zählen.

von BerndB (Gast)


Lesenswert?

Hallo Karl Heinz,

das ist wirklich nett von dir, das du dir solche Mühe machst!!!

Danke!
Bernd

von Rolf Magnus (Gast)


Lesenswert?

> In meinem Fall habe ich den Prescaler (1<<CS10) gar nicht eingebunden
> und trotzdem flackert die LED.

Du hast eingestellt: Fast PWM mit Überlauf des Zählers bei dem Wert, der 
in ICR1 steht. Der Timer läuft mit vollem Prozessortakt. Bei den 
Einstellungen von dir komme ich auf eine Frequenz von ca. 61 Hz, wobei 
ich aber nicht genau weiß, was passiert, wenn man den Zähler bis ICR1 
zählen läßt, ohne vorder dieses Register mit einem sinnvollen Wert 
gefüllt zu haben.
Also mal ganz einfach: Du hast einen Prozessortakt von 4 Mhz und willst 
eine PWM-Frequenz von 500 Hz. Wie weit muß also der Zähler zählen, bis 
er einen Überlauf macht? Was mußt du also in ICR1 schreiben?

Karl heinz Buchegger schrieb:
> BerndB schrieb:
>
>> In meinem Fall habe ich den Prescaler (1<<CS10) gar nicht eingebunden
>> und trotzdem flackert die LED.
>
> Was soll das heissen, du hast den Prescaler nicht eingebunden?

Ich glaube, er meint, daß der Timer mit vollem Prozessortakt läuft und 
dieser nicht vorher runtergeteilt wird.

von Karl H. (kbuchegg)


Lesenswert?

BerndB schrieb:
> Hallo Karl Heinz,
>
> das ist wirklich nett von dir, das du dir solche Mühe machst!!!

Wichtig ist, dass du verstehst wie das auf Hardware Ebene funktioniert. 
Es ist nicht schwer zu verstehen und wenn man dieses Verständnis erst 
einmal hat und sich nicht scheut mit dem Taschenrechner ein wenig zu 
rechnen, dann ergibt sich aus der Funktionalität alles andere.

von BerndB (Gast)


Lesenswert?

OK, habe ich verstanden.
Mir fehlt einfach noch die Brücke zwischen der Frequenz (Grundfrequenz)
und der PWM.

von Karl H. (kbuchegg)


Lesenswert?

BerndB schrieb:
> OK, habe ich verstanden.
> Mir fehlt einfach noch die Brücke zwischen der Frequenz (Grundfrequenz)
> und der PWM.

Vergiss fürs erste die PWM. Die ist uninteressant, wenn es darum geht, 
welche Werte du einstellen musst, damit der Zähler in 1 Sekunde 500 mal 
'rum zählen' kann. PWM ist dann einfach nur eine Erweiterung: Bei 0 wird 
ein Ausgangspin auf 1 gestellt, bei irgendeinem anderen Zählerwert in 
einem Register wird der Pin wieder auf 0 gestellt. Fertig ist die PWM.
Aber das hat nichts damit zu tun, wie weit der Zähler bei einer 
bestimmten Rate zählen muss, damit er in 1 Sekunde 500 mal bis zu diesem 
Wert zählen kann.

von BerndB (Gast)


Lesenswert?

Hallo Karl Heinz,

meine Rechnung:

F = 4Mhz = 0.25µs
Soll = 500Hz = 0.2ms
Zählschritte = 0.2ms/0.25µs = 8000
ICR1 vorladen mit: 2^16 - 8000 = 57536 = 0xE0C0
Hab ich gemacht, ohne Erfolg. LED blinkt mit 40ms.
Was mache ich falsch?

        LDI temp1, 1<<COM1A1 | 1<<WGM11
  OUT TCCR1A, temp1

  LDI temp1, 1<<WGM13 | 1<<WGM12 | 1<<CS10
  OUT TCCR1B, temp1

  LDI temp1, 0xE0
  OUT ICR1H, temp1
  LDI temp1, 0xC0
  OUT ICR1L, temp1

von spess53 (Gast)


Lesenswert?

Hi

>ICR1 vorladen mit: 2^16 - 8000 = 57536 = 0xE0C0

Falsch. Nichts mit Vorladen. ICR1 ist dein Top-Wert. Also der Timer 
läuft von Null bis ICR1 und fängt dann von Null wieder an. ICR1 musst du 
also mit 8000, oder genaugenommen 7999, laden.

MfG Spess

von BerndB (Gast)


Lesenswert?

Super es klappt!!!

"Nichts mit Vorladen..." das war es!

Danke an alle!!!

Gruß aus Moers
Bernd

von spess53 (Gast)


Lesenswert?

Hi

Die Formel dafür steht übrigens im Datenblatt (bei mir S.91).

MfG Spess

von BerndB (Gast)


Lesenswert?

Danke,

hab ich heute 20 mal überlesen!

Ich merke langsam wie wichtig, aber auch unverständlich Datenblätter 
sind.

Gruß
Bernd

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.