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