Forum: Mikrocontroller und Digitale Elektronik Arduino Due Interrupt


von Krimo E. (eniba)


Lesenswert?

Hallo zusammen,

ich programiere zurzeit mit arduino due und ist mir jetzt einen problem 
begegnet.

Ich erzeuge mit meinem code einen 250 KHz rechteck signal, dieses signal 
wird jetzt mit DAU (DAC0) zu einem CAN Transceiver elektrisch gesendet 
und
mit einem digitalen pin von dem arduino due board empfangen.
Auf dem Oscilloscope wird das Tastverhältnis von dem empfangenen signal 
von 250 KHz nicht mehr 50% High und 50% Low.
Das Problem tritt auf nur wenn ich einen Interrupt Service Routine im 
code schreibe,die mir die Äderung des Pegels von High zu Low abfragt.

Kann mir jemanden helfen.

von Mike A. (Gast)


Lesenswert?

Krimo Eniba schrieb:
> Das Problem tritt auf nur wenn ich einen Interrupt Service Routine im
> code schreibe,die mir die Äderung des Pegels von High zu Low abfragt.

Sowas tut man auch nicht per ISR sondern mit Timer Capture, weil man 
selten genau weiß, wie die Interrupt Latenz ist.

von Krimo E. (eniba)


Lesenswert?

Hi Mike,

danke für die Antwort.

Ich habe eine externe rechtecksignal, der ich nach seiner flanke 
abfragen will, deswegen verwende ich einen Interrupt pin.
Wie schafft man das ohne Interrupt?

Danke

von Krimo E. (eniba)


Lesenswert?

Hi,

hat jemand einen beispiel code für capture timer für arduino due?


Danke

von Mike A. (Gast)


Lesenswert?

Krimo Eniba schrieb:
> Ich habe eine externe rechtecksignal, der ich nach seiner flanke
> abfragen will, deswegen verwende ich einen Interrupt pin.
> Wie schafft man das ohne Interrupt?

Einen Interrupt brauchst du trotzdem, um auf die andere Flanke 
umzuschalten und um das Ergebnis zu sichern.

Vielleicht hilft dir dieses Beispiel
https://gist.github.com/billroy/4032657

In initTimer() wird der Timer erstmal für InputCapture auf fallende 
Flanke konfiguriert. Immer nachdem ein Capture Event eingetreten ist, 
wird in ISR(TIMER1_CAPT_vect) die Zeit aus ICR1L und ICR1H ausgelesen, 
der Timer auf die Flanke umkonfiguriert und eventuelle Timer Überläufe 
hinzuaddiert. Das Beispiel ist durch die zusätzliche Verwendung des 
Ringpuffers event_buffer[] etwas länger, aber das Prinzip sollte klar 
werden.

von Krimo E. (eniba)


Lesenswert?

Danke schön Mike.

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.