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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.