Gast
#2823576
Hi, ich versuche gerade die Zeit zu messen, die ein Signal im Zustand "high" ist. Das Signal liegt am Input Capture Pin 1 (ICP1) an. Es handelt sich hierbei um einen Ultraschall Entfernungsmesser, aber das sollte nichts zur Sache tun. Im Wesentlichen läuft Timer1 im CTC Modus und löst alle 50 ms einen Interrupt aus. Darin wird der Trigger Pin für das Ultraschall Modul für 10 uS auf High gesetzt sowie der Input Capture Trigger so eingestellt, dass er auf eine Rising Edge reagiert (Bit ICES1 gesetzt). Wie im Datenblatt angegeben lösche ich außerdem das Input Capture Flag (ICF1). Nun gibt es die eigentliche ISR für den Input Capture. Hier wird zunächst geprüft, ob es sich um eine Rising Edge handelt. Sofern dies der Fall ist speichere ich den aktuellen Zählerstand in einer Variable, und setze den Input Capture Trigger auf "Falling Edge" (und lösche das Input Capture Flag wieder entsprechend). Im Fall, dass die ISR bei einer Falling Edge aufgerufen wird, subtrahiere ich den aktuellen Zählerstand vom vorher festgehaltenen und habe damit die Zeit, die das Signal "high" war. In der Theorie ganz einfach. In der Praxis habe ich aber stets ein "paar" Takte Versetzung, da das Einlesen des Zählerstandes (16 Bit Wert), sowie der Vergleich innerhalb der ISR, ob es sich nun um eine Rising bzw. Falling Edge handelt ja auch nicht "umsonst" ist. Insbesondere die Fallunterscheidung gefällt mir nicht so recht. Gibt es hier eine bessere Alternative? Ich arbeite zum Ersten Mal mit dem Input Capture, insofern ist es durchaus möglich, dass ich etwas Grundlegendes übersehe? Ich hänge hier mal noch die beiden ISRs in ihrer aktuellen Form an. In der Hauptschleife passiert nichts wirklich Interessantes. Dort wird nur bei Bedarf etwas auf einem LCD ausgegeben. Ich hoffe, ich konnte den Ablauf halbwegs klar machen und freue mich auf eure Vorschläge!
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |