115us Timer Interrupt verschiebt sich

Gast #5181938
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
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
Gast
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
Angehängte Dateien:
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.
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.