CTC Timer0 beim Atmega64A Berechnung

Gast #4431999
Lesenswert?
• ▲
▼
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.
Angehängte Dateien:
Gast #4432028
Lesenswert?
• ▲
▼
Wenn ich mir das durchdenke macht das 1/2 in der Formel auch keinen 
Sinn. Mag sein dass das von irgendeineinem internen Ablauf im Atmega 
kommt. Aber falls der Timer bei jedem Takt (und nicht bei jedem 2ten) 
zählt, wäre die Formel für die Frequenz meiner Meinung nach:

f_timer = f_cpu / (1024*OCR0) = ca. 80Hz

Dann käme man mit dem 8bit Timer im CTC-Mode aber nicht auf 40Hz 
herunter. Weil man den OCR0 auf ca. 390 setzten müsste.

OCR0 = f_cpu / (1024 * f_timer)

Da muss man sich dann denk ich was anderes überlegen
#4432083
Lesenswert?
• ▲
▼
Flo schrieb:
> Dann würde aber der Interrupt trotzdem noch mit 80Hz auftreten.

Tut er auch.

> Aber der "Toggle-Modus" erklärt das 1/2 in der Formel.

Genau, die Formel gibt auch die Frequenz des Rechtecks an, nicht den 
Irq.
Wie du schon geschrieben hast: 40Hz sind mit 8-Bit Timer nicht zu 
machen.

Tipp für joo: Zähle mit den 80Hz Irq eine beliebige 8-Bit Variable hoch. 
Prüfe dann ob Bit0 == 1. Diese Bedingung ist dann mit 40Hz 'wahr'.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren