Hallo Leute, ich habe einen ganz normalen ATmega32, welcher auf 16 000 000 MHz läuft, jetzt will ich eine Frequenz auf dem OC0A ausgeben. Die Frequenz soll zwischen 1 - 200 Hz sein. Also einfach eine Rechteckspannung. Ich kann den Pin ja genau so configurieren, dass dieser getooglt wird, sobal mein Timer einen bestimmten Wert erreicht. Aber irgendwie blick ich bei dem ganzen Registerchaos gar nicht mehr durhc. Könntet Ihr mir etwas Hilfestellung geben? wär Euch echt zu Danke verpflichtet ;-) Grüße Timer
timer schrieb: > Aber irgendwie blick ich bei dem ganzen Registerchaos gar nicht mehr > durhc. Ist doch halb so wild. Einfach in Funktionsblöcken vorgehen. Der Timer soll einen Pin toggeln. Wie macht er das? Indem man die Compare Match Unit benutzt. Denn die kann man so verschalten, dass sie bei einem bestimmten Zählerstand den Pin toggelt Wie schnell macht er das? Wenn man nichts tut, kann man den Timer nur mittels des Vorteilers in seiner Geschwindigkeit einbremsen. Das wird aber für dich nicht gut genug sein. ALso brauchst du eine Möglichkeit, bei der du taktgenau dem Timer seinen Zählbereich vorgeben kannst. Der CTC Modus bietet dir das. Und der Rest: der ist jetzt nur noch reine Rechnerei um auf die gewünschte Frequenz zu kommen.
timer schrieb: > einen ganz normalen ATmega32, welcher auf 16 000 000 MHz läuft So einen will ich auch :-) Beste Grüße Alfred
Wie meinst du, taktgenau den wert vorgeben? Also den CTC hab ich ausgewählt, aber wenn ich jetzt eben 8-Bit Counter hab, dann lauft der ja nach 256 zählerschritten über und dann ist das ja viel zu schnell... wenn ich mal verstanden hab wie des funktionieren soll ists kein problem mehr.
timer schrieb: > Wie meinst du, taktgenau den wert vorgeben? > Also den CTC hab ich ausgewählt, aber wenn ich jetzt eben 8-Bit Counter > hab, dann lauft der ja nach 256 zählerschritten über und dann ist das ja > viel zu schnell... Man kann ja auch mitzählen, wie oft der übergelaufen ist. Deine Uhr (der Sekundenzeiger) läuft ja auch laufend über und trotzdem kannst du nur mit dem Sekundenzeiger alleine 324 Sekunden abzählen. Aber: Der 8_Bit Timer ist dazu wirklich nicht ideal geeignet.
Okay, also hier hab ich das jetzt mal so geschrieben:
1 | // Toogle OC0A on Compare -> CTC |
2 | TCCR0A |= (1<<COM0A0) | (1<<WGM1); |
3 | |
4 | // Prescaler = 64 -> 15625 |
5 | TCCR0B |= (1<<CS00) | (1<<CS02) | (1<<CS00); |
6 | |
7 | // Wert, welcher nacher die Frequenz bestimmt |
8 | OCR0B = 100 |
Ich denke das dürfte so gehen oder? Die Frequenz weicht jetzt etwas von meinem angegebenen Wert ab, aber das macht nix, würde es so in der Art gehen? Grüße
Stimmt mein Timer dann jetzt so oder geht das komplett in die Hose? Wäre dankbar über eure Antworten.
Ich kann von deinen 3 Zeilen keine einzige schlüssig nachvollziehen Das fängt schon mal damit an, dass es im Mega32 gar keine Register TCCR0A bzw TCCR0B gibt (1<<CS00) | (1<<CS02) | (1<<CS00) Diese Einstellung ergibt laut Datenblatt keinen Vorteiler von 64 (ganz abgesehen davon, dass es nicht schlau ist, CS00 2-mal aufzuführen) // Prescaler = 64 -> 15625 Wo kommen die 15625 her? Im Eröffnungsposting sagtest du noch, dein µC läuft mit 16Mhz Bei 16Mhz und einem Prescaler von 64 komme ich nicht auf 15625 // Wert, welcher nacher die Frequenz bestimmt OCR0B = 100 Wenn dein Timer in 1 Sekunde von 0 bis 15625 zählen kann, wie lange braucht er dann um von 0 bis 100 zu zählen? 15625 ...... 1 100 ...... x ----------------------- 100 x = ------- = 0.0064 Sekunden 15625 f = 1 / t = 1 / 0.0064 = ~156 Hz Mit dieser Frequenz tritt der Compare Match auf. Du du aber bei jedem Compare Match nur toggelst, ist die Frequenz am Pin genau die Hälfte davon: ~78 Hz
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.