Hallo Klaus,
Das gibt schon mal einen Pluspunkt (psssst - nicht weitersagen: ich habe immer wieder Dinge abgeschrieben und ans Laufen bekommen ohne sie zu verstehen - aber meistens hinterher versucht, das Getane zu verstehen).Zitat von kolisson
Vermutlich ist es doch etwas anders - und auch anders beschrieben.Zitat von kolisson
Wir schauen und das mal an. Nehmen wir also mal das doc2545 für den mega48/88/168, bei mir steht drauf Rev. 2545M–AVR–09/07 - also aktuell seit letztem September. Gehe nach S 96, Punkt 14.7.2 Clear Timer on Compare Match (CTC) Mode.
In Clear Timer on Compare or CTC mode (WGM02:0 = 2), the OCR0A Register is used to manipulate the counter resolution.
Und GENAU das ist der Trick bei der Geschichte: Manipulation der Zählerauflösung - der zweite Trick ist der Prescaler. Mal der Reihe nach - so Schritt für Schritt.
i) Mit dem Prescaler teilst Du die Controller Frequenz auf eine Frequenz, die Dir angenehm ist - kommt noch.
ii) Mit dem Preset (so nenne ich den Inhalt im OCRnx) - nehmen wir mal an, im OCR0A, also das OCRnx für den Timer/Counter0 - setzen wir nun einen Wert in das Register, bis zu dem NACH dem Prescale der Counter hochzählt - um danach wieder auf Null zu kommen. Das siehst Du ganz genau in diesem Bild. Da sind die Counterstände bei unterschiedlichen OCR0A-Werten gezeigt. Und wenn der Wert erreicht wird, gehts runter auf Null (mit Interruptmöglichkeit und allem). Und jetzt ist es doch klar: großer Presetwert - lange hochzählen, kleiner Presetwert - kurz hochzählen. Oder: kein Prescale - dann wird schnell hochgetackert - mit Prescale entsprechend langsamer.
. . . . . . . . Bild hier
Was hat das für Konsequenzen?
. . . . . . . . Bild hier
Bei Deinem mega88 mit 8 MHz OHNE Prescaler wird der Counter mit 8 MHz hochgezählt. Wenn Du da 10 kHz erreichen willst, dann musst Du 10 000 mal bis 800 zählen - das geht aber nun nicht in den Timer0 hinein, denn das ist, siehe Seite 138, ein “8-bit Timer/Counter0 with PWM”. Bähhhh. Also teilen wir den Prozessortakt mit dem Prescaler 1/8 - und erhalten einen Takt von 1 MHz, mit dem der Counter hochgetackert wird. Für 10 kHz müssen wir wieder 10 000 mal, diesmal aber nur bis 100 zählen - das ist ein Wert der unter 255 liegt - also mit 8 bit definierbar. Und Du siehst auch gleich, was der Zweck des Presets im OCR ist! Steht auch hier, auf S 96: "The OCR0A defines the top value for the counter, hence also its resolution." Wenn Dieser Presetwert erreicht wird, gibt der Counter auf - wird auf Null gesetzt, setzt ein Interruptflag und kann auch den Pin OC0A toggeln (steht auch auf S 96), also Pin 12 bzw. PD6. Wir sind also im CTC-Output Mode A.
Das Excel-blatt für DEINEN Fall mit den 10 kHz habe ich Dir oben dazugegeben. Du kannst nun - wenn Du willst - diesen CTC-Modus (genauer gesagt: den Interrupt) ein- und ausschalten. Dazu wird im Timer/Counter0 Interrupt Mask Register = TIMSK0 das Bit OCIE0A - OC Interrupt Enable 0A - gesetzt oder gelöscht. Und wie oben beschrieben - mit dem Preset kannst Du die Frequenz verstellen. Für das Erreichen einer bestimmten Frequenz kann es erforderlich sein Prescale UND Preset zu ändern. Und manche Frequenzen bekommt man halt nicht genau hin.
Ist das so besser erklärt ? Versuch es mal - bau Dir eine ISR in der Du Deine 10 kHz von 10000 runterzählst und beim Nulldurchgang eine LED toggelst. Dann wird die eine Aktiv-Pausen-Zeit von 1s/1s haben.
Vielleicht ist sie doch geeignet - die Idee?Zitat von kolisson
Lesezeichen