Frequenzmessung Bascom

Gast #1605589
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
Persönliche Seite #1605767
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.
Gast #1606339
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!
Persönliche Seite #1606441
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren