Mehrere konkurrierende IRQs am PIC

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 25 11 2024  09:27:33      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : 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


Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


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