Forum: Mikrocontroller und Digitale Elektronik Timer Counter zu schnell?


von Stefan F. (stefan1987)


Angehängte Dateien:

Lesenswert?

Hi,

hab da mal eine Frage, habe folgendes in meinen µC geladen :
1
#define F_CPU 16000000      //Frequency = 16 MHz
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
#include <avr/interrupt.h>
6
7
//volatile uint8_t keystate = 0;        
8
9
int main(void)
10
{
11
  TCNT0 = 0x00;    // Timer counter mit 0 initialisieren
12
  OCR0 = 0x00;    // beim ersten overflow interrupt
13
  TIMSK |= (1<<OCIE0);    // Timer compare enabled
14
  DDRA = 0x00;        // Port A Input
15
  DDRB = 0xFF;        // Port B Output
16
  DDRC = 0xFF;        // Port C Output
17
  PORTA = 0xFF;        // Pullups an A an
18
  
19
  sei();
20
  
21
  TCCR0 = ((1<<WGM01) | (1<<COM00) | (1<<CS02)|(1<<CS00));    // Toggle Mode on , Prescaler 1024
22
23
  
24
    while(1)
25
    {
26
       
27
    }
28
  return 1;
29
}
30
31
ISR (TIMER0_COMP_vect)
32
{
33
  PORTC^=0X0F;  // Toggle Port C
34
}

meinen Berechnungen zufolge sollte nun alle 16.384 ms der Port toggeln 
(16000000/1024 , Ans/256 , 1/Ans;; durch 1024 wegen prescaler durch 256 
wegen den Steps bis zum timer counter overflow , kehrwert um von Hz auf 
s zu kommen ..)
Wie allerdings auf dem Screenshot von dem Scope zu sehen ist passiert 
das ganze allerdings alle 62 µs ,also fehlt mir der Faktor 256 .
Kann mir jemand sagen wo der Gedannkenfehler ist ???

Target MCU ist n Mega32 mit 16 MHz clock .

Vielen Dank schonmal

von Krapao (Gast)


Lesenswert?

Der Gedankenfehler ist die Zeile

>  OCR0 = 0x00;    // beim ersten overflow interrupt

Dort setzt du den tatsächlichen Vergleichswert.

Die Schlussfolgerung 8-Bit = Faktor 256 ist für den gewählten Modus 2 
CTC (WGM01 gesetzt) nicht richtig. Schau dir an, was dort als TOP 
genommen wird.

von Krapao (Gast)


Lesenswert?

PS: Gute Problembeschreibung bei deiner Frage!

von Stefan F. (stefan1987)


Lesenswert?

Ahh ok , super dankeschön :)

Das erklärt natürlich einiges, bin davon ausgegangen das er pauschal bis 
256 zählt und ich zusätlich mit OCR0 die Abläufe wie oft er bis 256 
zählen soll festlegen kann .

Naja dann wohl doch der 16 bit timer :)


Danke nochmal für die schnelle Antwort,

grüße Stefan

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.