Frequenzmessung Bascom

Gast #1605589
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.