PIC24 Interrupt Problem

Gast #6984555
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
Angehängte Dateien:
Gast #6984575
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?
Gast #6984751
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
Gast #6984757
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
#6985250
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren