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
Da steht eigentlich alles drin, was du wissen willst/musst :-)
Hi Willst du jetzt nur eine Frequenz (1:1) von 500Hz oder eine PWM mit 500 Hz? MfG Spess
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.
Hallo Karl Heinz, das ist wirklich nett von dir, das du dir solche Mühe machst!!! Danke! Bernd
> 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.
OK, habe ich verstanden. Mir fehlt einfach noch die Brücke zwischen der Frequenz (Grundfrequenz) und der PWM.
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.
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
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
Super es klappt!!! "Nichts mit Vorladen..." das war es! Danke an alle!!! Gruß aus Moers Bernd
Hi Die Formel dafür steht übrigens im Datenblatt (bei mir S.91). MfG Spess
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.