Forum: Mikrocontroller und Digitale Elektronik Frequenzmessung Bascom


von freq (Gast)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Die Stelle im Captureint an der du Nroverflows auf 0 setzt ist zu spät. 
Du kannst zu diesem Zeitpunkt bereits in der while-wend Schleife sein 
und den Zufallswert gegen Maxoverflows prüfen. Die Initialisierung 
sollte vor dem Start der Interrupts erfolgen.

Bei der Berechnung von Maxoverflows: Kannst du diese Zeile näher 
erläutern?

> Maxoverflows = Taktejesekunde / 688117  ' wait max 50ms for rpm

Ich hätte so gerechnet:

Maxoverflows = (16000000 / (65536 * Vorteiler)) * 50/1000

und bekäme ca. 12 (12.2) für Maxoverflows bei Vorteiler==1 raus.

von freq (Gast)


Lesenswert?

Hallo Stefan,

hmm gute Frage. Ehrlich gesagt weiß ich jetzt gerade nicht, wie ich da 
gerechnet hatte :) Ich muss mal heute nochmal intensiv drüber nachdenken 
;)

Mir ist nicht ganz klar, was du mit der Initialisierung meinst. Könntest 
du mir das nochmal erklären?

Danke!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Initialisierung als Nullen von Nroverflows.

1) Nroverflows wird abgefragt, wenn while-wend in Getrpm() betreten 
wird.

2) Nroverflows wird in T1overflow erhöht

3) Nroverflows wird genullt, wenn Captureint auftritt, Updatedisplay 0 
ist und Ersteflanke 1 ist.

Wenn Nroverflows bei 1) oder 2) bearbeitet werden, ist dann 3) schon 
sicher gelaufen oder nicht? Wenn man Nroverflows in Getrpm() vor Enable 
Ovf1 nullt, ist man sicher.

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.