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