mega32 - TCNT0 zu schnell

Gast #2777480
Lesenswert?

hi,

hab eine MEGA32(L) mit 1.843200MHz laufen und möchte jede millisekunde 
einen overflow-int.
1
void InitTimer0 (void)
2
{
3
  TCCR0 = 0x02;            // prescale clock by 8 -> 1.8432MHz / 8
4
  TCNT0 = 0xFF - 230;
5
  OCR0  = 0xFF - 230 - 2;  // to prevent output-compare-int-flag
6
}
1
int i=0;
2
SIGNAL(SIG_OVERFLOW0)
3
{
4
  TCNT0 = 0xFF - 230;         // reload time for 1ms timetick
5
  if(TIFR & 0x02)             // overflow pending
6
    TIFR |= 0x02;
7

8
  if(i++>999)
9
  {
10
    LedToggle();              // led toggle jede sekunde
11
    i=0;
12
  }
13
}


... das ganze funktioniert auch soweit ganz gut, nur blinkt meine led um 
etwa 4x so schnell. mit dem scope kann ich die 1.8432MHz am XTAL gut 
messen ...


bin irgendwie ratlos?!


danke für jede konstruktive idee,
Neubi
#2777512
Lesenswert?

>  TCNT0 = 0xFF - 230;         // reload time for 1ms timetick

Deine Taktfrequenz ist 1843200 Hz
Mit einem Vorteiler von 8, zählt der Timer in 1 Sekunden also bis 
230400. D.h. würdest du 230400 Timerinkrements zählen, wäre 1 Sekunde 
vergangen.

Da du Millisekunden willst, brauchst du 1 Tausendstel davon. Also 230.

D.h. du willst mit dem Timer jeweils 230 Zählvorgänge abzählen, ehe dir 
dann ein Interrupt mitteilt: 1 Tausendstel Sekunde vergangen.

Von daher ist deine Berechnung soweit ok (gut, über +-1 streite ich 
jetzt nicht rum).

Wenn also die effektive Zeit am Pin nicht stimmt, gibts in der ganze 
Rechnerei nur 2 Dinge, die nicht stimmen können:

* die 1843200Hz entsprechen nicht der Realität
* das hier
  TCCR0 = 0x02;
  ist kein Teilerfaktor 8

wenn diese beiden Punkte gegeben sind, dann muss sich daraus zwangsweise 
1 Sekunde an der LED ergeben. Denn eines können wir ausschliessen: Der 
Timer verzählt sich nicht.

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