Forum: Mikrocontroller und Digitale Elektronik CTC Timer0 beim Atmega64A Berechnung


von joo (Gast)


Angehängte Dateien:

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.

von Helferlein (Gast)


Angehängte Dateien:

Lesenswert?

ich glaube das ist eine Eigenheit des CTC-Mode.
siehe angehängtes Bild.
Erklärung bekomme ich aus dem Stehgreif nicht hin,
bin aber auch schon drüber gestolpert.

von Flo (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

>Formel entsprechend Datenblatt Seite 198:
>http://www.atmel.com/images/atmel-8160-8-bit-avr-m...

Das gilt nur, wenn der Ausgang bei jedem Erreichen des OC-Wertes 
getoggled wird. Du erzeugst aber eine Schwingung bei jeden OC-Durchgang.

Stell deinen Ausgang auf 'Toggle OC0 on Compare Match', und dann passt 
es.

MfG Spess

von Thomas F. (igel)


Lesenswert?

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.

von Flo (Gast)


Lesenswert?

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 :)

von Thomas F. (igel)


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'.

von joo (Gast)


Lesenswert?

Hatte das 'toggle' beim lesen verschluckt und bin vom Clear/Set on 
Compare Match ausgegangen, gründlich lesen hilft anscheinend doch ;)

Vielen Dank Thomas!

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
Noch kein Account? Hier anmelden.