CTC Timer0 beim Atmega64A Berechnung

Gast #4431999
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
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
#4432040
joo schrieb:
> f_clock / (2*Prescaler*(OCR0+1)) = f_oc

Diese Formel ist für den Pin-Toggle-Mode um ein Rechteck-Signal mit 
dieser Frequenz zu erzeugen, steht aber so im Text des Datenblatts.

Für den reinen Irq hat Flo es richtig beschrieben.


Edit: spess war schneller auf der Tastatur.
Gast #4432052
Dann würde aber der Interrupt trotzdem noch mit 80Hz auftreten. Das war 
glaub ich das Problem. Aber der "Toggle-Modus" erklärt das 1/2 in der 
Formel. Da war ich zu faul um genau zu lesen :)
#4432083
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'.
Gast #4432134
Hatte das 'toggle' beim lesen verschluckt und bin vom Clear/Set on 
Compare Match ausgegangen, gründlich lesen hilft anscheinend doch ;)

Vielen Dank Thomas!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.