Forum: Mikrocontroller und Digitale Elektronik mega32 - TCNT0 zu schnell


von Neubi (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

>bin irgendwie ratlos?!

Nimm CTC und nicht dieses Vorladen.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Noch etwas: Bist du sicher, das dein Controller wirklich mit den 
1.8432MHz läuft?

MfG Spess

von Karl H. (kbuchegg)


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.

von Martin S. (tungl)


Lesenswert?

Sind die Fuses richtig und laeuft das Teil nicht evtl. mit dem internen 
8MHz-Takt?

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.