Forum: Mikrocontroller und Digitale Elektronik PIC24 Interrupt Problem


von PIC24 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe eine Schaltung entworfen, welche einen Komparator besitzt (s. 
Bild "Schaltung"). Der Komparator wandelt mir eigentlich nur ein 
Sinussignal mit 5 kHz in ein Rechtecksignal mit passender Spannung um. 
Von diesem Ausgangssignal ("s. Bild "Ausgang Komparator") würde ich nun 
gerne die Frequenz bestimmen. Dazu gebe ich das Ausgangssignal auf einen 
externen Interrupt Pin meines PIC's (PIC24FJ48GA002). Hierbei verwende 
ich den Pin 16 (RB7, INT0)(s. Bild PIC).

Die Konfiguration des Interrupts könnt ihr im Bild "INT0_Setup" sehen, 
die dazugehörige ISR im Bild "ISR".

Die Zeit zwischen zwei Interrupts will ich über den Timer2 messen.
Das heißt, ich bilde die Differenz der Timer2 Werte von zwei Interrupts.
Hier tritt nun das Problem auf, dass die Differenz immer völlig 
unterschiedliche Werte aufweist. Die Werte wiederholen sich auch nicht, 
es sind immer andere.

Um einen Fehler meiner "Berechnung" auszuschließen, habe ich die 
Berechnung mal in meinem Timer1 Interruput eingesetzt, welcher alle 1 ms 
passiert. Hier bekomme ich dann immer dieselben Werte, welche ich auch 
auf 1 ms wieder umrechnen kann.

Es hat also den anschein, dass mit meinem externen Interrupt irgendwas 
nicht stimmt. Hat jemand eine Idee, warum dieser auf mein Rechtecksignal 
nicht richtig reagiert? Fehler in der Beschaltung? Konfiguration falsch?

Hier noch das Datenblatt des PIC'S.
https://eu.mouser.com/datasheet/2/268/39881e-277964.pdf

Grüße

von Teo D. (teoderix)


Lesenswert?

So wir das nix!
Du brauchst das CCP-Modul!
(Capture/Compare)

von Ingo Less (Gast)


Lesenswert?

Ich kenne die PIC nicht, haben die keine Input-Capture-Einheit? Die 
macht genau das in Hardware, fast, was du da versuchst. Nächste wichtige 
Frage: Wie sind die Variablen deklariert? static? volatile? weder noch?

von PIC24 (Gast)


Lesenswert?

Teo D. schrieb:
> So wir das nix!
> Du brauchst das CCP-Modul!
> (Capture/Compare)

Danke für deine Antwort! Ich habe es jetzt über Input Capture gemacht 
und es funktioniert. Hier wird der Timerwert nun über IC1BUF abgefragt 
und nicht direkt vom Timer TMR2. Weißt du auch warum das über einen 
normalen externen Interrupt nicht funktioniert?

Grüße

von PIC24 (Gast)


Lesenswert?

Ingo Less schrieb:
> Ich kenne die PIC nicht, haben die keine Input-Capture-Einheit?
> Die
> macht genau das in Hardware, fast, was du da versuchst. Nächste wichtige
> Frage: Wie sind die Variablen deklariert? static? volatile? weder noch?

Danke für deine Antwort!
Ich habe aus Verzweiflung bereits sämtliche Deklarationen ohne Erfolg 
ausprobiert. Über Input Capture funktionierts jetzt.

Grüße

von Ingo L. (corrtexx)


Lesenswert?

PIC24 schrieb im Beitrag #6984751:
> Weißt du auch warum das über einen
> normalen externen Interrupt nicht funktioniert?
Du benötigst ja den Wert zum Zeitpunkt des Interrupt/Capture Events. In 
deiner ersten Variante liest du aber den Wert erst aus, wenn du die ISR 
betreten hast. Somit unterliegt der Wert immer einer gewissen Schwankung 
und somit sind die Werte nie konstant. Das Capture-Modul nimmt dir das 
Auslesen des Timers ab und du musst den Wert nur vor dem nächsten 
Capture ausgewertet haben, mehr oder weniger zeit-unkritisch.

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.