Forum: Mikrocontroller und Digitale Elektronik CodeVision und die Timers


von Karlheinz Druschel (Gast)


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;
  }
}

von emil (Gast)


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

von emil (Gast)


Lesenswert?

sorry, muss natürlich:

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

heissen...

von chrissy (Gast)


Lesenswert?

oder PORTC.X ^= 0x??

von chrissy (Gast)


Lesenswert?

naja PORTC ^= 0x??

von Karlheinz Druschel (Gast)


Lesenswert?

Naja, das Problem ist ja nicht das toggeln der LD, sondern die
Timerzeit.
Die sollte eigentlich bei 1 Sekunde liegen, liegt aber aber ca. 3
Sekunde. Warum ?

von Peter D. (peda)


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

von emil (Gast)


Lesenswert?

das problem liegt genau beim "toggeln", wie du es jetzt "realisiert"
hast; bedenk' mal, was du eigentlich machst mit:

++i;
PORTC = ~i;

:))

von Karlheinz Druschel (Gast)


Lesenswert?

sorry emil, aber deine änderung bewirkt leidern ichts. immer noch ca.
3.3 sekunden.
also klemm ich mich mal an peters idee

trotzdem thanks a lot

von Karlheinz Druschel (Gast)


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.

von emil (Gast)


Lesenswert?

vielleicht postest du hier endlich dein gesamtes programm?
wie jemand hier zu sagen pflegt: die glaskugel wird gerade repariert...

von Karlheinz Druschel (Gast)


Angehängte Dateien:

Lesenswert?

nichts leider als das

von emil (Gast)


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

von Karlheinz Druschel (Gast)


Lesenswert?

Danke für den Hinweis, aber die Änderung bringt nichts.
Ich habe auch mal im Listfile geguckt, die Zahl wird schon richtig
übersetzt.

Greetings
Karlheinz

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.