Interrupts priorisieren bei 16Fxxx Typen möglich?
Montag, 21. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  CCS Compiler  |  Timer (CCS)  |  Interrupts priorisieren bei 16Fxxx Typen möglich? « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Interrupts priorisieren bei 16Fxxx Typen möglich?  (Gelesen 2670 mal)
 
aerodactyl
Full Member
***
Offline Offline

Beiträge: 220


Profil anzeigen
« am: September 17, 2008, 16:43:33 »

Hallo Gemeinde,

ich bin mal wieder ein bisschen am programmieren und kämpfe mit meinen beiden Timern TMR0 und TMR1. Mit TRM1 zähle ich eine Impulszeit per Interrupt, was auch sehr gut und genau funktioniert. Mit TMR0 steuere ich die Blinksequenz einer LED, auch per Timer-Interrupt. Wenn nun TMR0 gerade einen INT ausgelöst hat und dann gleich TMR0 seinen INT auslöst, bekomme ich natürlich falsche Zählwerte an TMR1.
Nun habe ich von Vergabe von Prioritäten bei den Timern gehört, kann bei meinen Unterlagen aber nichts finden.
CCS 4.069
PIC 16F690

Geht das überhaupt damit?
Gibt es einen Trick, wie man den TMR1 Vorrang gewähren kann?

Bin schon gespannt auf eure Antworten  Augen rollen Augen rollen
Gruß
Uwe

Gespeichert
Edson
Globaler Moderator
Sr. Member
*****
Offline Offline

Beiträge: 373



Profil anzeigen
« Antworten #1 am: September 17, 2008, 18:58:24 »

Hallo aerodactyl,

Zitat
Geht das überhaupt damit?

Nein.

Zitat
Mit TMR0 steuere ich die Blinksequenz einer LED, auch per Timer-Interrupt. Wenn nun TMR0 gerade einen INT ausgelöst hat und dann gleich TMR0 seinen INT auslöst, bekomme ich natürlich falsche Zählwerte an TMR1.

Kannst du genauer erklären, wo das Problem liegt? Ich verstehe nicht wieso die Zählungen von TMR1 durch TMR0 gestört werden sollen.

Zitat
Gibt es einen Trick, wie man den TMR1 Vorrang gewähren kann?

Ja, wenn ich dich richtig verstanden habe. Aber erkläre bitte noch etwas genauer, dann kann ich auch wertvollere Tipps geben.

Gruss,
Edson
Gespeichert
aerodactyl
Full Member
***
Offline Offline

Beiträge: 220


Profil anzeigen
« Antworten #2 am: September 18, 2008, 18:12:39 »

Hallo Edson,

vielen Dank für deine schnelle Antwort.

Das Problem ist folgendes: Wenn der Timer0 (Steuerung der LED Sequenzen) einen Überlauf hat, zähle ich in der Interrupt-Routine die Überläufe.
Wenn der TMR0 INT gerade aktiv ist und dann der Interrupt On Change zuschlägt, der den INT für TMR1 auslöst, wird natürlich erst der INT von TMR0 zu Ende gebracht und dann erst der INT von TMR1 abgearbeitet.
Folge: Der zu vermessende Impuls wird verkürzt oder verlängert vermessen.

Theoretisch könnte ich in der INT von TMR0 den INT von TMR1 disablen, aber das ist auch nicht das Gelbe von Ei, da mir die Messwerte von TMR1 wichtiger sind als die blöde LED Sequenz.

Eine Alternative wäre noch, den digitalen Eingang in einer while-Schleife zu pollen und ohne Interrupt On Change für TMR1 zu arbeiten, aber das gefällt mir nicht so gut.

Weißt du jetzt, was ich meine?

Gruß

Uwe
« Letzte Änderung: September 18, 2008, 21:24:14 von aerodactyl » Gespeichert
Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #3 am: September 18, 2008, 22:12:25 »

Für eine konkrete Lösung fehlen mir noch ein paar Zahlen. In welchem Zeitintervall tritt der Interrupt für die LED-Sequenz auf (ich würde vermuten, daß das Zeitintervall relativ groß ist, da es ansonsten keinen sichtbaren Effekt hätte) und in welchem Zeitintervall der Interrupt für die Impulsmessung? Mein erster genereller Ansatz wäre, das Interrupt-Flag für die LED-Sequenz in main abzufragen (d.h. keinen Interrupt dafür zu verwenden) und dafür zu sorgen, daß die worst-case Durchlaufzeit durch main keinen sichtbaren Effekt auf die LEDs hätte. Ist es in Deiner Anwendung wirklich von Bedeutung, wennn eine LED 10..20ms später (was schon eine relativ große Durchlaufzeit durch main bedeutet) umgeschaltet wird?

Die beim CCS mögliche Prioritätseinstellung über #priority bringt im Endeffekt nicht viel. Sie bestimmt nur, in welcher Reihenfolge die Interrupts in der ISR abgefragt werden (der Interrupt mit der höchsten Priorität wird in der ISR als erstes abgefragt). In der Praxis bringt das nur relativ wenig. Zwar verringert sich dadurch die Wahrscheinlichkeit, daß ein Interrupt mit niedrieger "Priorität" einen mit höherer "Priorität" unterbricht, aber es kann immer noch vorkommen, daß dem nicht so ist. Sobald der Interrupt für die LED-Sequenz als erstes auftritt und der Interrupt für die Impulsmessung direkt nach der Abfrage auf diesen Interrupt folgt, wird die Impulsmessung weiterhin falsche Werte liefern.


Viele Grüße

Bernd
« Letzte Änderung: September 19, 2008, 05:09:24 von Bernd » Gespeichert

aerodactyl
Full Member
***
Offline Offline

Beiträge: 220


Profil anzeigen
« Antworten #4 am: September 19, 2008, 20:20:00 »

Hallo Bernd,

herzlichen Dank für die Antwort.
Ob die LED's 10 oder 20 ms länger oder kürzer an sind ist völlig wurscht.

Wenn ich deinen Vorschlag richtig verstanden habe, sollte ich in main() einfach das INT Flag des TMR0 abfragen, und wenn gesetzt, einen Zähler inkrementieren, korrekt? Muss ich das Flag dann wieder per Software reseten? Ich vermute mal,JA, oder?

Das mit der Priorisierung ist mir jetzt auch klar, vielen Dank für die ausführliche Erklärung.

Salut
Uwe
Gespeichert
Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #5 am: September 20, 2008, 22:04:12 »

Zitat
Wenn ich deinen Vorschlag richtig verstanden habe, sollte ich in main() einfach das INT Flag des TMR0 abfragen, und wenn gesetzt, einen Zähler inkrementieren, korrekt?

Ja.

Zitat
Muss ich das Flag dann wieder per Software reseten?

Ebenfalls ja.


Viele Grüße

Bernd
Gespeichert

aerodactyl
Full Member
***
Offline Offline

Beiträge: 220


Profil anzeigen
« Antworten #6 am: September 20, 2008, 23:53:32 »

Hallo Bernd,

vielen Dank für deine Bestätigungen.

Werde das bei nächster Gelegenheit mal austesten. Sollte aber bei mir funktionieren.
Gruß

Uwe
Gespeichert
aerodactyl
Full Member
***
Offline Offline

Beiträge: 220


Profil anzeigen
« Antworten #7 am: September 21, 2008, 21:13:04 »

Getestet und geht  Lächelnd Lächelnd

Nochmals Danke.

Gruß

Uwe
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.036 Sekunden mit 18 Zugriffen.
 
Top! Top!