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.
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.
>>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)?
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!!
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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.