Hallo,
folgendes Problem: Die Berechnung der Timerfrequenz des Atmega64A 8bit
Timer0 im CTC Mode haut bei mir nicht hin. Ziel ist damit einen COMP
Interrupt mit 40 Hz zu erzeugen.
Reduzierter Code zum reproduzieren (komplette main.c):
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <util/delay.h>
|
4 | #include <stdio.h>
|
5 |
|
6 | #define LED_DDR DDRE //Debug-LED Ausgabe Port // Beliebig
|
7 | #define LED_PORT PORTE
|
8 | #define LED_PIN PE2
|
9 | #define LED_1 LED_PORT|=(1<<LED_PIN)
|
10 | #define LED_0 LED_PORT&=~(1<<LED_PIN)
|
11 |
|
12 |
|
13 | int main() {
|
14 |
|
15 | cli();
|
16 |
|
17 | LED_DDR |= (1 << LED_PIN);
|
18 |
|
19 | OCR0 = 194;
|
20 | TCCR0 |= (1 << WGM01) | (1 << CS02) | (1 << CS01) | (1 << CS00);
|
21 | TIMSK |= (1 << OCIE0);
|
22 |
|
23 | sei();
|
24 |
|
25 | while (1) {
|
26 | }
|
27 | }
|
28 |
|
29 | ISR (TIMER0_COMP_vect)
|
30 | {
|
31 | LED_1;
|
32 | _delay_us(400);
|
33 | LED_0;
|
34 |
|
35 | }
|
Problem ist, dass der Interrupt (siehe oszi-Screenshot) mit doppelter
Frequenz auftritt (80Hz).
Formel entsprechend Datenblatt Seite 198:
http://www.atmel.com/images/atmel-8160-8-bit-avr-microcontroller-atmega64a-datasheet.pdf
f_clock / (2*Prescaler*(OCR0+1)) = f_oc
Bei 16 Mhz und Prescaler von 1024 ergibt es für die Berechnung von OCR0:
(16000000 / 2*1024*40)-1 = 194
Die gesetzten Fusebits sind EF D9 FF (16 Mhz, kein compatiblity mode
etc.)
Hab im Netz keine Infos gefunden, auch hier bei der AVR Checkliste, da
der Atmega64 ja auch sonst paar Eigenheiten hat.
Hoffe jemand kann mir helfen.