Forum: Mikrocontroller und Digitale Elektronik 115us Timer Interrupt verschiebt sich


von Turtok (Gast)


Lesenswert?

Hallo,
ich habe einen STM8 mit einem Timer von etwa 115us.
In dieser Zeit führe ich ein paar Berechnungen aus, die etwa so 10us 
dauern.

Wenn ich nun einen weiteren Codeblock zuschalte, verschiebt sich der 
Timerinterrupt um ein paar Mikrosekunden, dass er dann bei 130us ist.
Das ist aber schlecht, weil ersterer Code immer den gleichen Takt 
braucht.

Weiss jemand wieso das so ist? Ich kenne von Atmegas eigentlich, dass 
der Timer immer zu selben Zeit zuschlägt und sich nicht mit dem inneren 
Code verlängert.
Überlaufen tut er ja auch nicht, es ist eigentlich genug Zeit.

Hat jemand eine Idee?

Danke, Turtok

von Dangerseeker3000 (Gast)


Lesenswert?

Was passiert denn in dem zugeschalteten Codeblock so alles?

von Turtok (Gast)


Lesenswert?

Dangerseeker3000 schrieb:
> Was passiert denn in dem zugeschalteten Codeblock so alles?

Ein paar If Abfragen und ggf ein paar Ausgänge schalten.

Man muss aber sagen, dass sich der Interrupt auch immer bisschen 
verschiebt ohne den Codeblock. Aber halt noch vertretbar, weil die 
Aufgaben im ersten Block recht statisch sind.

Kann es irgendwie sein, dass in diesem kleinen Bereich von 115us der 
Timer nichtmehr ordentlich "genau" sein kann? Der uC läuft auf 16Mhz.

Danke, Turtok

von Turtok (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe es mal mit dem Oszi aufgenommen. Dabei schalte ich 1 bei Start 
des Interrupt und 0 wenn der Interrupt fertig ist.

A = Nur erster Codeblock - Ein Eingang prüfen und ein paar If-Abfragen
A + B = B hinzugekommen, Maximal 8 Ausgänge schalten, einfacher PWM 
Zähler.

Schaut man sich A+B an, sieht man das die Impulsbreite 50us ist und der 
Timer 100us hat. Wieso verschiebt sich dann der Timer, wenn es 
eigentlich passt?

Danke, Turtok

von Checker (Gast)


Lesenswert?

Hallo,

die Frage lautet wie der Timer programmiert ist? Wenn er mit festen 
Werten arbeitet, dann kann sich nichts verschieben. Wenn du im Interrupt 
die Zeit für den nächsten veränderst, dann muss sich das verschieben.

von Carl D. (jcw2)


Lesenswert?

Gibt es den TimerInterrupt als (C-)Sourcecode?

von Turtok (Gast)


Lesenswert?

Carl D. schrieb:
> Gibt es den TimerInterrupt als (C-)Sourcecode?

Checker schrieb:
> die Frage lautet wie der Timer programmiert ist?

Ganz normal als ein Overflow-Interrupt:
1
  TIM1_ARRH = 0x00;             //  Reload counter = 2500
2
  TIM1_ARRL = 0x05;
3
  TIM1_PSCRH = 0x00;            //  Prescalar
4
  TIM1_PSCRL = 0x20;
5
  TIM1_IER_UIE = 1;             //  Turn interrupts on.
6
  TIM1_CR1_CEN = 1;             // Turn of Timer 1
7
  ITC_SPR2_VECT5SPR = 3;        // Priority high

Der Rest ist nur Ausgänge schalten und if-Abfragen.

Habe aber nun rausgefunden, dass wenn ich die Timerzeit etwas erhöhe, 
der Timer konstant bleibt.
Es scheint mir als gäbe es irgendeine Richtlinie, in etwa:
"Timer Interrupt darf max. 50% bis zum nächsten Betragen, ansonsten wird 
einer übersprungen".

Glücklicherweise konnte ich den Code umschreiben des ersten Blocks, 
damit der auch mit dem langsameren (150us) Timer noch funktioniert :-)

Danke!
Turtok

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.