mikrocontroller.net

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


Autor: Rödu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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)?

Autor: Adrian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.