www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frequenzmessung Bascom


Autor: freq (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
Maxoverflows = Taktejesekunde / 688117                      ' wait max 50ms for rpm

Sub Getrpm()

   Stop Timer1
   Timer1 = 0
   Tifr1.tov1 = 1
   Start Timer1
   Tifr1.icf1 = 1
   Enable Capture1
   Enable Ovf1

   While Updatedisplay = 0
      If Nroverflows > Maxoverflows Then
         Disable Ovf1
         Disable Capture1
         Updatedisplay = 1
         Ersteflanke = 1
         Frequenz = 1
         Counterticks = 0
         Return
      End If
   Wend

   ' Messung fertig
   Disable Ovf1
   Disable Capture1


   If Updatedisplay = 1 Then

      Counterticks = Nroverflows * 65536
      Counterticks = Counterticks + Endtime
      Counterticks = Counterticks - Starttime

      '// ... mit der bekannten Taktfrequenz ergibt sich dann die Signalfrequenz
      Periodendauer = Counterticks / Taktejesekunde
      Frequenz = 1 / Periodendauer

      Counterticks = 0
   End If

End Sub


' Frequenzmessung
T1overflow:
   Nroverflows = Nroverflows + 1
Return

' Frequenzmessung
Captureint:
   If Updatedisplay = 0 Then

      If Ersteflanke = 1 Then
         Starttime = Capture1
         Nroverflows = 0
         Ersteflanke = 0                                    ' / / Die Naechste Flanke Ist Das Ende Der Messung
      Else
         Endtime = Capture1
         Updatedisplay = 1                                  ' / / Eine Vollständige Messung. Sie Kann Ausgewertet Werden
         Ersteflanke = 1                                    '/ / Bei Der Naechsten Flanke Beginnt Der Naechste Messzyklus
      End If

   End If
Return

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: freq (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.