CodeVision und die Timers

Gast #120855
Lesenswert?
• ▲
▼
Hi Leuts,

ich versuche hier mit CodeVision auf einem Mega16 einen Timer von 10 ms
hinzubekommen.
Also alle 10 ms soll ein Interrupt ausgelöst werden.
Zu Testzwecken will ich da bis 100 zählen und dann eine Led blinken
lassen. Die sollte also im Sekundentakt blinken. Aber hier bei mir
dauert das 3 Sekunden. Hat einer eine Idee woran das liegt ? Overhead
von C ?
Quarzfrequenz = 4,194304 MHz

Codeauszug:

Init:
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;

TCCR1A=0x00;
TCCR1B=0x01;
TCNT1H=0x63;
TCNT1L=0xC0;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;



// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer 1 value
TCNT1H=0xC0;
TCNT1L=0x63;
// Place your code here
  if (j < 100)
  {
    j++;
  } else {
    ++i;
    PORTC = ~i;
    j=0;
  }
}
Gast #120856
Lesenswert?
• ▲
▼
......
++i;
PORTC = ~i;

hohohoho, was ist denn das? :)))

an welchem pin hast du denn die led angeschlossen?
schreib' doch z.b.:

if (PORTC.X) PORTC.X=0 else PORTC.X=1;

somit "toggle-st" du den PORT.X pin...
#120861
Lesenswert?
• ▲
▼
Also Reload im Interrupt ist schon mal ganz ungenau.
Vor allem, weil T1 ja schon selber sowas kann (Mode 4, OCR1A als
Endwert).

Und wenn man dazu auch noch in Kopfrechnen schwach ist, dann laß das
mal lieber den Compiler rechnen:

#define XTAL        4.194304e6    // 4,194304 MHz
#define T1_INTERVAL 100           // 100Hz

OCR1A = (unsigned int)(XTAL / T1_INTERVAL - 1);

Nur noch Mode 4 einstellen und fertig.


Peter
Gast #120864
Lesenswert?
• ▲
▼
Aber trotzdem, irgendwo ist da wohl noch ein Denkfehler von mir drin.
Also: Ich habe einen Quarz mit 4,194304 MHz. Nun stelle ich einen
Prescaler von 1024 ein (TCCR0 = 5), ergibt eine Frequenz von 4096 Hz.
Also wird der Zähler alle 244 µs inkrementiert.
Nun will ich alle 20 ms einen Overflow, ergibt also 20 ms / 244 µs =
81,90 (82) Zählschritte. Da er immer bis 256 zählt, alde ich einen
Vorwahlwert von 256 - 82 = 174 nach TCNT0. In der Interruptroutine
zähle ich jetzt nochmals von 0-50 und dann toggle ich ein Bit. das Bit
müßte also alle 50 x 20 ms = 1s wechseln. Tut es aber nicht, es
wechselt ca. alle 3 Sekunden.
Woran kann das liegen ? Ich kann mir einfach nicht vorstellen, dass
Codevision da was vermurkst.
Gast #120867
Lesenswert?
• ▲
▼
..."TCNT0=178;"

ich weiss nicht, ob es so funktioniert, vielleicht ja, vielleicht nein;

ich würde den timer mit TCNT0=0xB2 aufladen, (178 DEC=B2 HEX), weiss
nicht, ob der compiler in diesem fall auch DEC zahlen versteht

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