Forum: Mikrocontroller und Digitale Elektronik Signal zu schnell für Interrupt?


von Rödu (Gast)


Lesenswert?

Ich lese an einem PIN von einem PIC18 einen Manchester Code ein. Dabei 
wird auf jede Flanke (rising  / falling) ein Interrupt ausgelöst. Dieser 
Interrupt misst jedesmal die Zeit im Timerregister.

Nun meine Frage:
Der PIC läuft mit 10Mhz. Kann es sein, dass ein Signal mit einer 
Periodendauer von 250us zu schnell ist, um jedesmal einen IRQ 
auszulösen. Ich habe bemerkt, dass er ab zu die Flanken nicht erkennt 
und dann erst auf die nächste Flanke wieder den TImer resetet.

Dank für die Hilfe.

von Ralph (Gast)


Lesenswert?

Auf Verdacht mal geraten, ja dein PIC ist zu langsam.

Du kannst es aber auch selsbt berechnen.

Sieh dir das Assemblerlisting deiner Interruptroutine an. Dort kannst du 
sehen welche Befehle abgearbeitet werden.
Im Datenblatt steht wieviel Taktzyclen welcher Befehl benötigt.
Damit kennst du die Ausführungszeit der Routine.
Dazu kommt noch die Zeit von Interruptauslösung und eintritt in die 
Routine, dieser Wert steht ebenfalls im Datenblatt.
Jetzt must du noch berechnen oder im Datenblatt nachlesen wie lange bei 
10 MHz ein Taktzyclus dauert.

Und schon weißt du ob dein PIC schnell genug ist.

Ein Tip noch, sieh dir mal das Capture/Compare des PIC an, eventuell 
kannst du damit die Zeiten in HW erfassen und musst die im Interrupt nur 
noch auslesen. Ich kenne den PIC aber nicht genau genug um dir sagen zu 
können ob du beide Flankenwechsel so bekommst , oder nur einen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>>Der PIC läuft mit 10Mhz ... Periodendauer von 250us ...
>ja dein PIC ist zu langsam.
Nein, deine Software ist zu umständlich.
Auch ein PIC kann mit 10MHz noch etwa 2,5MIPS. Also mehr als 600 
Elementar-Operationen pro 250 us. Das sollte für deine Anwendung 
reichen.
>dieser Interrupt misst jedesmal die Zeit im Timerregister
Wenn du allerdings aufwendige Rechenschritte mit in die Interruptroutine 
reinpackst kann es sehr wohl knapp werden.

Wie sieht der Code in der ISR aus?
Werden irgendwoanders Interrupts verriegelt (globales Interrupt-Enable)?

von Adrian (Gast)


Lesenswert?

Ich habe zwei for-Schlaufen. Die eine zählt bis auf 110, um ein Array 
auszulesen.
Ich denke dort könnte ein Problem sein. Ich versuche die Schritte zu 
vereinfachen.

Die interrupts werden während dem Auslesen des Arrays blockiert.

Danke!!

von Sven S. (stepp64) Benutzerseite


Lesenswert?

Schleifen solltest du niemals in Interrupts abarbeiten. In der ISR immer 
nur so wenig Code wie nötig einbauen. Wenn ein Interrupt ankommt liest 
du nur die notwendigen Register aus (z.Bsp. USART Pufferregister, Timer 
etc.) damit es wieder frei wird und speicherst den Wert irgendwo hin. 
Dann setzt du ein Bit, welches deiner Hauptschleife sagt, dass wieder 
ein neuer Wert angekommen ist. In der Hauptschleife können dann deine 
Berechnungen erfolgen. Damit ist die ISR wieder frei und kann auf 
neue/andere Interrupts reagieren. Natürlich musst du in der 
Hauptschleife darauf achten, dass die nicht zu lange läuft. Sonst 
springt der µC immer gleich wieder in die ISR und kommt nicht mehr dazu 
die Hauptschleife abzuarbeiten.

Sven

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Die eine zählt bis auf 110 um ein Array auszulesen.
> Die interrupts werden während dem Auslesen des Arrays blockiert.
> Ich denke dort könnte ein Problem sein.
Sowohl hier als auch dort...
Denn  1. Schleifen gehören nicht in die Interruptroutine
und   2. Interrupts gehören nicht blockiert
         (und wenn, dann nicht länger als ein paar us).
         Sonst werden sie ihrem Namen nicht mehr gerecht.

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.