Mehrere konkurrierende IRQs am PIC Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
Mehrere konkurrierende IRQs am PIC Suche nach: pic (2056) |
|
|
|
|
BID = 884450
sub205 Schriftsteller
Beiträge: 916 Wohnort: Gründau
|
|
Hallo,
ich habe vor Längerem mal eine Software für einen 16F877 programmiert die mir 2 getrennte Impulse, welche ich damals per CCP1 und CCP2 eingespeist hab, auswertet. Aus den Abständen der Impulse errechne ich mir dann Kenngrößen die ich per RS232 ausgebe.
Nun zu meinem Problem:
Jeder der Eingänge für sich arbeitet perfekt und liefert die erwünschten Daten. Wenn ich nun aber beide gleichzeitig nutze sinken die gemessenen Werte um einige Prozent nach unten.
Vermutung damals: Während der Abarbeitung des ersten Interrupts kommt am 2ten Pin ein Impuls rein.
Programmiert hab ich das ganze in C.
Nun zu meiner Frage:
Wie löße ich dieses Problem möglichst elegant?
2 PICs verwenden die, jeder für sich, die Werte berechnen ist irgendwie Overkill...
Bei größeren Architekturen gibts ja Interrupt-Queues. Der PIC scheint das nicht zu haben.
Zu den Größenordnungen der Impulse:
- CCP1: 1000-16000 Impulse / sec
- CCP2: 1 - 300 Impulse / sec
Ich könnte natürlich noch anfangen und die Impulse am CCP1 runterteilen. Aber vielleicht gibts ne andere Möglichkeit.
Festgelegt auf den 16F877 bin ich nicht, derzeit nutze ich meistens die neueren 18F (4550, 4685, ...)
Gruß, Stephan
_________________
gruß, Stephan
sudo make me a sandwich
[ Diese Nachricht wurde geändert von: sub205 am 19 Apr 2013 8:46 ] |
|
BID = 884459
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
|
Zitat :
| Während der Abarbeitung des ersten Interrupts kommt am 2ten Pin ein Impuls rein. | Es kann sogar noch schlimmer kommen.
Im Extremfall kommen die beiden Impulse nur um ein paar ns getrennt innerhalb des gleichen Clock-Impulses herein, und man will trotzdem wissen, welcher eher da war.
Dann braucht man auf jeden Fall zusätzliche Hardware, die u.U. aber nicht kompliziert sein muß.
Es ist also eine Frage der geforderten zeitlichen Auflösung und der Randbedingungen, wie man das Problem angeht.
|
|
BID = 884465
sub205 Schriftsteller
Beiträge: 916 Wohnort: Gründau
|
Zitat :
perl hat am 19 Apr 2013 10:59 geschrieben :
|
Es kann sogar noch schlimmer kommen.
Im Extremfall kommen die beiden Impulse nur um ein paar ns getrennt innerhalb des gleichen Clock-Impulses herein, und man will trotzdem wissen, welcher eher da war.
Dann braucht man auf jeden Fall zusätzliche Hardware, die u.U. aber nicht kompliziert sein muß.
Es ist also eine Frage der geforderten zeitlichen Auflösung und der Randbedingungen, wie man das Problem angeht.
|
Hm ... ich könnte mir ne Sample&Hold-Geschichte basteln.
FF setzen per Impuls, IRQ an, beide FFs auslesen und resetten.
Zusätzlich minimale Impulsbreite > Dauer der ISR sicherstellen...
Oder man überwacht den PortB, hier kann man ja imho 4 Pins mittels IRQ überwachen, dann könnte ich am Anfang der ISR die Pins abfragen und entsprechende subroutinen ansteuern.
Wie würdest du das Ganze angehen?
_________________
gruß, Stephan
sudo make me a sandwich
|
BID = 884466
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
Zitat :
| Wie würdest du das Ganze angehen? |
Überhaupt nicht.
Ich weiß ja nicht einmal, was "das Ganze" soll.
Der Lösungsansatz hängt wie gesagt von den Randbedingungen ab, also vom Wissen um den ganzen Prozess.
Vielleicht gibt es ja Totzeiten, die man ausnützen kann, vielleicht braucht man auch gar keine hohe zeitliche Auflösung, sondern nur zu wissen welcher Impuls eher da war. Dabei stellt sich natürlich auch die Frage nach dem Bezugspunkt.
Generell schreibt man solche ISRs aber in Assembler, da man nur dann genau weiß, welche Instruktionen in welcher Reihenfolge abgearbeitet werden und wie lange das dauert.
Oft unterteilt man die Interrupt Service Routine auch in zwei Teile:
Die Raw-ISR, in welcher sehr zeitkritische Dinge bearbeitet werden, und die Mediated-ISR, die dann schon wieder durch andere Interrupts unterbrochen werden kann, aber die noch eine Vorverarbeitung der von der Raw-ISR eingesammelten Hardwaredaten vornimmt.
Diesen zweiten Teil kann man oft schon wieder einem Compiler anvertrauen.
|
BID = 884468
sub205 Schriftsteller
Beiträge: 916 Wohnort: Gründau
|
Zitat :
perl hat am 19 Apr 2013 12:08 geschrieben :
|
Überhaupt nicht.
Ich weiß ja nicht einmal, was "das Ganze" soll.
Der Lösungsansatz hängt wie gesagt von den Randbedingungen ab, also vom Wissen um den ganzen Prozess.
Vielleicht gibt es ja Totzeiten, die man ausnützen kann, vielleicht braucht man auch gar keine hohe zeitliche Auflösung, sondern nur zu wissen welcher Impuls eher da war. Dabei stellt sich natürlich auch die Frage nach dem Bezugspunkt.
|
Ich werde mal die Signalform messen, der Drehzahlimpuls dürfte annähernd 50/50 sein, der andere Geber ist ein Hall-Geber und dürfte irgendwas um die 10/90 - 20/80 haben.
Aber in der Tat ist es vielleicht sinnvoll den ersten Impuls soweit runterzuteilen das die Auflösung noch vollkommen ausreichend ist, dafür aber die Frequenz viel niedriger.
Das komplette Projekt stelle ich zu einem späteren Zeitpunkt einmal vor, ist wesentlich umfangreicher, da hängt noch ein Tegra2 SOC, ein 1280x480 TFT und diverse andere Spielereien dran. Bin da aber gerade erst im frühen Prototyping und versuche meine Erkenntnisse und Module aus 2 früheren Projekten einzubringen und anzupassen.
_________________
gruß, Stephan
sudo make me a sandwich
|
BID = 886642
Nukeman Schriftsteller
Beiträge: 754 Wohnort: bei Kleve
|
Hallo Stephan,
Du kannst ja mal den Code des Irq-Handlers posten, vielleicht kann man
da ja schon eine systematische Ursache für das Verschlucken von Impulsen
entdecken.
Gruß,
Stefan
_________________
Alle sagten: Das geht nicht. Dann kam einer, der wusste das nicht und hat´s gemacht.
|
BID = 887336
Brizz Stammposter
Beiträge: 386 Wohnort: Rheine
|
Grundsätzlich reduziert man die Interruptroutinen auf ein Minimum an Befehlen. Den erfassten Rohmesswert abspeichern und später in der Umlaufroutine verarbeiten.
Der Interrupt für die höheren Impulsfrequenzen wird höher priorisiert und darf die niederpriorisierte Interruptroutine unterbrechen. Der relative Fehler für die niedere Frequenz ist dann wesentlich kleiner.
Falls der Prozessor keine Interrupt Hirachien kennt, hängt es natürlich von der geforderten Genauigkeit ab, ob man nicht vielleicht einen leistungsfähigeren Prozessor einsetzt.
CCP1 runterzuteilen verschlechtert die Auflösung Deiner Messungen.
|
BID = 887362
sub205 Schriftsteller
Beiträge: 916 Wohnort: Gründau
|
Das ist klar, soweit praktikabel habe ich das auch immer so gemacht.
Die aktuelle Reinkarnation meines Meßwertaufnehmers basiert auf einem 18F4650. Ich glaube mittlerweile fast schon an einen Bug im damals verwendeten CCSC.
Ein etwas schlechtere Auflösung ist hier nicht kritisch da die Meßwerte sowieso noch in gewissen Grenzen gerundet und gemittelt werden müssen.
Werde die Tage, sofern ich Zeit dazu finde, mal einen Test machen ob ich das Problem von damals überhaupt noch nachvollziehen kann, zumindest der ASM-Code vom Compiler sah diesmal korrekt aus, es wurden entsprechend nur die jeweiligen Interrupt-Bits gelöscht und nicht alle.
_________________
gruß, Stephan
sudo make me a sandwich
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 20 Beiträge im Durchschnitt pro Tag heute wurden bisher 5 Beiträge verfasst © x sparkkelsputz Besucher : 182394128 Heute : 1324 Gestern : 7548 Online : 606 25.11.2024 9:27 5 Besucher in den letzten 60 Sekunden alle 12.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0524389743805
|