Hallo, stehe gerade total neben der Spur. Ich betreibe einen XMEGA256A3BU mit einem 32MHz Oszillator. Nun möchte ich "TIMER0" alle 250ms triggern lassen. Wie berechne ich das ganze? Formel?
32 MHz ist 32 Millionen Mal jede Sekunde. Alle 250 ms ist 4 Mal jede Sekunde. Dazwischen liegt also Faktor 8 Millionen. Diese 8.000.000 musst Du aufteilen auf irgendwelche Teiler zwischen Quarztakt und Peripherietakt, auf den Vorteiler vom Zähler und auf den Zähler selber. Du kannst bestimmt irgendwie den Wert, bis zu dem der Zähler zählt begrenzen. Vorsicht : da der Zähler von 0 los zählt, teilt er durch 10, wenn er bis 9 zählt. Also immer einmal mehr wie Du, würde Mundstuhl sagen. Da die meisten Vorteiler nur 2er Potenzen können, musst Du schauen, wie Du das Verhältnis ganzzahlig hin bekommst. In Primfaktoren zerlegt ist Deine 8.000.000 immerhin 2^9 * 5^6. Wenn Du einen 16-Bit-Timer hast ist das vermutlich kein Problem.
Danke für die Hilfestellung. Gibt es hier jemand der mir einen Code Snippet zeigen kann, wie man den Timer auf Compare Match konfiguriert? Im Datenblatt gibt es zig Bits um irgendwas mit Compare Match einzustellen..
Hilfe zur Selbsthilfe reicht einfach nicht. Es müssen gebratene Tauben in den Mund geflogen kommen.
Danke für eure Mühen. Sehe ich das richtig? Für einen Compare Match, muss ich es wie folgt konfigurieren?
1 | 6.4 Using a Timer/Counter for PWM Generation |
2 | Task: Configure TCC0 for pulse width modulation output with varying duty cycle on |
3 | channel A. |
4 | 1. Configure PC0 for output by setting bit 0 in PORTC.DIR. |
5 | 2. Select the timer period by setting the PER[H:L] register. |
6 | 3. Select a waveform generation mode by setting the WGMODE[2:0] bits in |
7 | 4. Enable Compare Channel A by setting the CCAEN bit in CTRLB. |
8 | 5. Start the TC by selecting a clock source (CLKSEL[3:0] in CTRLA). |
9 | 6. Calculate the desired compare value. |
10 | 7. Write the new compare value to CCA[H:L]. |
11 | 8. Wait for the TC Overflow Flag to be set. (OVFIF in INTFLAGS). |
12 | 9. Clear the TC Overflow flag. |
13 | 10. Go to step 6. |
Das will nicht so ganz.. Was mache ich falsch?
1 | void timerCMPInit( TC0_t *tim ) |
2 | {
|
3 | LED_DIR = 1<<0; |
4 | |
5 | // set up compare matching in the middle of the period
|
6 | TCC0.CCA = 10; // Compare Match Wert |
7 | TCC0.PER = 65535; |
8 | TCC0.CTRLA = TIMER_PRESCALER_gc; |
9 | TCC0.CTRLB = TC0_CCAEN_bm; // Compare Match 'A' aktivieren |
10 | TCC0.INTCTRLB = TC_CCAINTLVL_HI_gc; // Interrupt bei Compare Match 'A' aktivieren |
11 | }
|
PMIC initialisiert? (Sonst kommt kein Interrupt!) ISR vergessen?
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.