Hallo, ich habe ein kleines Problem: Habe eine Frequenzmessung in Bascom implementiert. Es funktioniert soweit alles, aber ein Punkt stört mich noch. Und zwar habe ich es so gemacht, dass maximal 50 ms auf die Frequenzmessung gewartet werden soll (falls keine Frequenz anliegt bzw nichts am Pin hängt). Allerdings wird diese Dauer immer überschritten. Vielleicht sieht jemand den Fehler? µC ist Atmega644p-20pu. 16 mhz Takt.
1 | Maxoverflows = Taktejesekunde / 688117 ' wait max 50ms for rpm |
2 | |
3 | Sub Getrpm() |
4 | |
5 | Stop Timer1 |
6 | Timer1 = 0 |
7 | Tifr1.tov1 = 1 |
8 | Start Timer1 |
9 | Tifr1.icf1 = 1 |
10 | Enable Capture1 |
11 | Enable Ovf1 |
12 | |
13 | While Updatedisplay = 0 |
14 | If Nroverflows > Maxoverflows Then |
15 | Disable Ovf1 |
16 | Disable Capture1 |
17 | Updatedisplay = 1 |
18 | Ersteflanke = 1 |
19 | Frequenz = 1 |
20 | Counterticks = 0 |
21 | Return |
22 | End If |
23 | Wend |
24 | |
25 | ' Messung fertig |
26 | Disable Ovf1 |
27 | Disable Capture1 |
28 | |
29 | |
30 | If Updatedisplay = 1 Then |
31 | |
32 | Counterticks = Nroverflows * 65536 |
33 | Counterticks = Counterticks + Endtime |
34 | Counterticks = Counterticks - Starttime |
35 | |
36 | '// ... mit der bekannten Taktfrequenz ergibt sich dann die Signalfrequenz |
37 | Periodendauer = Counterticks / Taktejesekunde |
38 | Frequenz = 1 / Periodendauer |
39 | |
40 | Counterticks = 0 |
41 | End If |
42 | |
43 | End Sub |
44 | |
45 | |
46 | ' Frequenzmessung |
47 | T1overflow: |
48 | Nroverflows = Nroverflows + 1 |
49 | Return |
50 | |
51 | ' Frequenzmessung |
52 | Captureint: |
53 | If Updatedisplay = 0 Then |
54 | |
55 | If Ersteflanke = 1 Then |
56 | Starttime = Capture1 |
57 | Nroverflows = 0 |
58 | Ersteflanke = 0 ' / / Die Naechste Flanke Ist Das Ende Der Messung |
59 | Else |
60 | Endtime = Capture1 |
61 | Updatedisplay = 1 ' / / Eine Vollständige Messung. Sie Kann Ausgewertet Werden |
62 | Ersteflanke = 1 '/ / Bei Der Naechsten Flanke Beginnt Der Naechste Messzyklus |
63 | End If |
64 | |
65 | End If |
66 | Return |