Forum: Mikrocontroller und Digitale Elektronik Frequenzzähler


von Wiebke (Gast)


Lesenswert?

Hallo,
kann mir jemand helfen, wie ich einen Frequenzzähler auf dem STK500 
programmiere? Bitte erklärt es gut, denn ich habe noch nicht viele 
Microcontroller-Kenntnisse gesammelt, muss es für eine Hausarbeit aber 
können.
Danke an alle

von willi (Gast)


Lesenswert?

du musst die zeit einer periode messen. bei einer rechteckspannung also 
die zeit von positiver flanke zur nächsten positiven flannke. also timer 
laufen lassen und das rechtecksignal an nen externen interrupt der so 
eingestellt ist das er bei positiver flanke auslöst. der rest sollte 
einfach sein

von Peter D. (peda)


Lesenswert?

Bei konkreten Fragen helfen wir gerne, aber Hausarbeiten machen wir 
grundsätzlich nicht.

Je nach Deinen Vorkenntnissen such Dir irgendnen Frequenzmessercode aus 
dem Web und frage den Autor, ob Du ihn verwenden kannst.

Oder fange von Anfang an, mit Blink-LEDs und Tasten, wie die meisten 
hier es getan haben (Stichwort: AVR-Tutorial).


Peter

von Wiebke (Gast)


Lesenswert?

Blinkende LED habe ich schon programmiert, von Interrupts auch schon mal 
gehört noch nicht programmiert,  aber dann lassen meine Kenntnisse stark 
nach...

von mandrake (Gast)


Lesenswert?

Das Prinzip das oben bereits ansatzweise beschrieben wurde ist recht 
einfach.
Man benutzt einen Zähler und zählt die abfallenden oder ansteigenden 
Flanken des zu messenden Signals. Der Zähler wird jedoch nur über eine 
definierte und damit bekannte Zeit aktiviert.
Ist der Zähler deaktiviert weiß man wieviele z.B. positive Flanken in 
dieser definierten Zeit gezählt wurden. Weiter weiß man damit wieviele 
Perioden während der Zählzeit durchlaufen wurden. Der Zähler zeigt einem 
also praktisch das wievielfache die sog. Torzeit (Zählzeit) von der 
Periodendauer des Signals ist.
Jetzt kann man zurückrechnen wie groß die Periodendauer und damit die 
Frequenz ist.
Umsetzen solltest du das schon alleine. Das Prinzip ist ja kein 
Geheimnis.

Tip: Am Anfang würde ich mich darauf beschränken die Frequenz von 
Rechtecksignalen zu bestimmen. Für andere Signalformen muss man nämlich 
noch das Signal in ein Rechteck umformen.

von Wiebke (Gast)


Lesenswert?

habe mal ein Programmm geschrieben. Die frage: Was fehlt, damit an einem 
angelegten Signal an Pina.0 die Frequenz gemessen werden kann?

$regfile = "m16def.dat"
$crystal = 3690000
$baud = 19200

Const Ticks = 10
Dim Count As Byte

Config Porta = Input
Config Portb = Output

Config Lcd = 16 * 2
Config Lcdmode = Port
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Portb.4,
Config Lcdpin = Pin , Db5 = Portb.5,
Config Lcdpin = Pin , Db6 = Portb.6,
Config Lcdpin = Pin , Db7 = Portb.7,
Config Lcdpin = Pin , E = Portb.3,
Config Lcdpin = Pin , Rs = Portb.2,

Config Timer0 = Counter , Edge = Rising , Clear Timer = 1
Load Timer0 , Ticks

Start Timer0

On Timer0 Timer0_isr

Config Pina.0 = Input

Enable Interrupts
Enable Timer0

Do
 nop
Loop

End

Timer0_isr:
Cls
Waitms 50
Lcd Count
Waitms 500
Return

von Jürgen K. (jk2010)


Lesenswert?

Hi!

in welcher Sprache programmierst Du ??

Habe meinen Assembler Source im RC Line Forum veröffentlicht.
Dort ist eine Abfrage eines Fernsteuersignals als Interrupt 
implementiert.
Damit solltest Du den Frequenzzähler realisieren können.

Grüße

Jürgen

Habe grade erst Dein Listing gesehen.
Du mußt den Interrupt über steigende Flanke einstellen.
Im interrupt (steigende Flanke) timer starten. Interrupt auf fallende 
Flanke stellen.
Wenn fallende Flanke in der ISR Timer auslesen.

Dann hast Du die Pulsbreite

Nachtrag:

Mega 8

Pin 3  (PB2) = INT2
Pin 16 (PD2) = INT0
Pin 17 (PD3) = INT1

Wenn ich mich nicht täusche, können an den Pins durch Signale Interrupts 
ausgelöst werden. Dann kannst Du wie oben beschrieben reagieren

von Karl H. (kbuchegg)


Lesenswert?

Wiebke wrote:
> habe mal ein Programmm geschrieben. Die frage: Was fehlt, damit an einem
> angelegten Signal an Pina.0 die Frequenz gemessen werden kann?

So ziemlich alles.

Ich sehe zb. nirgends wo du den Eingang Pina.0 abfrägst und feststellst
ob das Signal seinen Pegel gewechselt hat. Wenn es seinen Pegel von
0 auf 1 wechselt, dann hat deine zu messende Frequenz eine neue
Periode angefangen und das gilt es jetzt mitzuzählen. Du willst
ja anscheinend die Messmethode benutzen: Zähle wieviele Perioden
das Signal in einer bestimmten Zeit macht.

Edit: Wenn ich mir das so ansehe, ist eigentlich überhaupt
noch nicht klar, was du mit dem Timer eigentlich vorhast.
Also, welche Messmethode willst du benutzen und wie hast du
dir das Ganze vorgestellt.

von Avr N. (avrnix) Benutzerseite


Lesenswert?

The TIMER0 does not have a reload mode --> geht nicht mit dein Load 
Befehl siehe Hilfe.

Messung erfolgt über den T0 oder T1 PIN am AVR

Schaue mal meine Programm an ist noch nicht fertig und dient zur 
LC-Messung.
Dort ist auch eine Frequenzmessung drinne.

http://www.comwebnet.de - Bascom Projekte


'###############################################################
'# Der Kopf darf erweitert werden aber nicht gelöscht werden   #
'###############################################################
' Auf http://www.comwebnet.de - wurde veröffentlicht:
'###############################################################
' Prgrammname:   LC-Metermodul  (GPL 2)
'###############################################################
' Programmart: Vollversion, LIB, Include
'###############################################################
' Autor:  Dirk Milewski
' Version: V1.1
' BASCOM AVR Verion: 1.11.8.1
' Datum:         12.02.2008
' HP/Forum: http://www.comwebnet.de ,
' Forum: http://comwebnet.weimars.net/forum
' Kontakt:
' Welchen µC:       Mega32 - 16MHz Quarz
'############################################################### 
iir
' Hardware/Port benutzt: LCD 4 BIT an PortC
' ADC0 -> Batterie Überwachnung
' Portd.1,2,3 Tasten
'
'###############################################################
' Changelog:
' Datum:
' Was wurde geändert:
' Warum wurde was geändert:
' Autor:
' Kontakt:
'#############################################

$crystal = 16000000                                         '
$regfile = "m32def.dat"
'$baud = 19200


$hwstack = 128
$swstack = 128
$framesize = 128

Const Version = "1.1"

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , 
Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0
Cursor Off Noblink


Config Debounce = 30                                        'when the 
config statement is not used a default of 25mS will be used but we 
override to use 30 mS
'#######################################
' Frequenzmessung
'#######################################
Config Timer0 = Counter , Edge = Rising
'Handle frequency timer overflow
On Timer0 Timer0_overflow
'Track number of frequency couter overflows between measurements
Dim Overflow_count As Long
Overflow_count = 0
Dim Freq1 As Single
Dim Freq As Single
Dim Freq11 As Single
Dim Freq22 As Single
Dim Freq2 As Single
Dim Induktion As Single
Dim Kondensator As Single
Dim Cx As Single
Dim Lx As Single

'Calibration factors
Dim Fcal As Single
Dim Ical As Single

' Tastenauswahl der Funktion von L,C,f
Dim Auswahl As Byte



'Konstanten L und C ( ohne Cx,Lx )
Fcal = .000000001
Kondensator = Fcal                                          '1nF
Ical = .001                                                 ' 1mH

Dim W As Byte
Dim W_temp As Word
'Flag designates calibration mode is active
Dim Calibrate As Byte
Calibrate = 0

'Flag designates lock mode is active
Dim Lock As Bit
Lock = 0
Declare Function Frequenz() As Single
Declare Sub Eingabe
'############################################
'   Eingaben
'############################################
Config Pinb.5 = Input
Portb.5 = 1
Cmessung Alias Pinc.5

Config Pinb.6 = Input
Portb.6 = 1
Imessung Alias Pinb.6

Config Pinb.7 = Input
Portb.7 = 1
Fmessung Alias Pinc.7

'############################################
'    Ausgabe
'############################################

'  relais
Config Pinb.2 = Output
Relais Alias Portb.2


'Induktionfaktor 4 x Pi^2
Const Ifaktor = 39.4784176043574

'Set up timer to track time
Config Timer1 = Timer , Prescale = 1024

Stop Timer1
'Preload timer constant for 1 second duration at 8 MHz
Const Timer1pre = 49910

Timer1 = Timer1pre
'Handle time overflow (occurs every second)
On Timer1 Pulse

Enable Interrupts
Enable Timer0
Enable Timer1
Stop Timer0
Stop Timer1

'Config Pinb.1 = Output

'Enable Timer2
'Config Timer2 = Timer , Prescale = 1 , Compare = Toggle

Cls

Upperline
 Lcd " LC-Messung " ; Version
 Lowerline
 Lcd "www.comwebnet.de"
 Wait 1
Call Eingabe

Gosub Kali
'Start Timer2
Do
Tccr2 = &B00011001
Ocr2 = W

If W = 255 Then W = 0

Incr W

'######################################
' Messung der Frequenzverstimmung
'######################################
Freq2 = Frequenz()

'#######################################
'      Berechnung von Cx oder Lx
'#######################################

Freq22 = Freq2 * Freq2
Freq11 = Freq1 * Freq1
Cx = Freq11 / Freq22
Cx = Cx - 1
Lx = Freq11 / Freq22
Lx = Lx - 1
Cx = Cx * Kondensator
Cx = Cx * 1e6
Lx = Lx * Induktion
Lx = Lx * 1e3

'######################################################
' Je nach Auswahl Kapazität oder Induktivität Ausgabe
'######################################################

If Auswahl = 1 Then
 Cls
 Lcd Fusing(cx , "#.###") ; "uF "
 Cx = Cx * 1000
 Lcd Fusing(cx , "#.###") ; "nF"
 Lowerline
 Cx = Cx * 1000
 Lcd Fusing(cx , "#.##") ; "pF"
End If


If Auswahl = 2 Then
 Cls
 If Freq < 10 Then
   Lcd " Leitung offen!"
   Lowerline
   Lcd " k. Messung"
 Else
  Lcd Fusing(lx , "#.##") ; "uH"
  Lowerline
  Lx = Lx * .001
  Lcd Fusing(lx , "#.###") ; "mH"
 End If
End If


If Auswahl = 3 Then

 Freq = Frequenz()
 'Print Str(w) ; " " ;Str(freq) ; " " ;
 Cls
 Lcd Str(freq) ; " Hz"
 Lowerline
 Freq = 1 / Freq
 Freq = Freq * 1000
 Lcd Str(freq) ; " ms"



 ' Print Str(freq)


End If


If Auswahl = 4 Then
 'rechteckgenerator
 Freq = Frequenz()
 Cls
 Lcd Str(freq) ; " Hz"
 Lowerline
 Freq = 1 / Freq
 Freq = Freq * 1000
 Lcd Str(freq) ; " ms"
End If

'#############################################################
'      wurde eine taste gedrückt
'#############################################################

If Pinb.5 = 0 Or Pinb.6 = 0 Or Pinb.7 = 0 Then
Gosub Kali
Call Eingabe
End If


Loop

End
                          'end program
'###################################
'   Zählen der Frequenz-Overflows
'###################################
Timer0_overflow:
   Incr Overflow_count
   Return

'Frequenzmessung über Timer1 im overflow
Pulse:
   Stop Timer0
   Stop Timer1


   '#########################
   'berchnen der Frequenz
   '#########################
   W_temp = Counter0
   Freq = Overflow_count * 256
   Freq = Freq + W_temp



   'Zähler zurück setzen
   Counter0 = 0
   Overflow_count = 0
   Start Timer0
   Timer1 = Timer1pre
   Start Timer1
   Return

'########################################
'     Ermitteln der Frequenz
'########################################
Function Frequenz() As Single
    Start Timer0
    Start Timer1
    Wait 3
    Stop Timer0
    Stop Timer1
    Frequenz = Freq
End Function

'#########################################
'    Auswahl der Eingabe
'#########################################
Sub Eingabe
 Auswahl = 0
 Cls

 Lcd " Messung C od.L ? "
 Lowerline
 Lcd " oder Frequenz"
 While Auswahl < 3

If Pinb.5 = 0 Then
    Auswahl = 1
    Lowerline
    Lcd " C-Messung"
    Relais = 0
    Wait 1
    Cls
    Lcd "Messletung"
    Lowerline
    Lcd "frei ?"
    Bitwait Pinb.5 , Reset

   Exit While
End If

If Pinb.6 = 0 Then
    Auswahl = 2
     Lowerline
    Lcd " L-Messung"
    Relais = 1
    Wait 1
    Cls
    Lcd "Messleitung"
    Lowerline
    Lcd "Kurzschliesen"
    Bitwait Pinb.6 , Reset
    Exit While
   End If

If Pinb.7 = 0 Then
Relais = 0
    Auswahl = 3
     Lowerline
    Lcd " Frequenz"
    Exit While
End If

Wend

End Sub

Kali:
Freq1 = Frequenz()

Upperline
Lcd "Freq1:" ; Str(freq1)
Lowerline
Induktion = Freq1 * Freq1
Induktion = Induktion * Ifaktor
Induktion = Induktion * Fcal
Induktion = 1 / Induktion
Induktion = Induktion * 1000                                ' mH Einheit
Lcd "* Kalibriert *"
'Print "Wert Frequenz ms"
Wait 1
Cls
Return

von Avr Nix (Gast)


Lesenswert?

Ich bin ein Spammer

von Avr N. (avrnix) Benutzerseite


Lesenswert?

Falscher Avr Nix wrote:
> Ich bin ein Spammer

Du bist ein spinn... ;-)


Kannst du mal was anständiges beitragen, als dein Mist ?
Du bist doch bestimmt der aus dem bascom-forum ?

von Der da (Gast)


Lesenswert?

Diese Forum war früher mal ein Interessantes Teil zum Lesen. Heut
ist es von Aroganten Spinner leider zugemüllt.Ich weiss nicht warum
immer auf Bascom herumgeritten wird, machen wir Bascomer mit den 
Assemblern und C bzw C++ Benutzern und soweiter doch auch nicht.Die 
jenigen die sich so äussern sollten dann etwas Beitragen und Beweisen 
das sie es können in ihrer Programmier-Sprache und nicht nur Behaupten.

Also gebt Ruhe und behaltet eure Bemerkungen für euch.
Es steht jedem frei hier zu helfen und wenn es sein muss auch belehren,
nur lasst die untertönigen Beiträge.

Danke

von Avr N. (avrnix) Benutzerseite


Lesenswert?

Da habe ich auch keine Ahnung, warum das so ist, Bascom ist leicht zu 
erlernen, aber die feinheiten muss man sich raussuchen :( .
Aber da hilft das Datenblatt und die Befehle kann man auch in Bascom 
benutzen, vielleicht ist das den C,ASM Proggern ein Dorn im Auge. Keine 
Ahnung Bascom finde ich Klasse weils man gut lesen kann :)

Ich hoffe das Problem hier wurde gelöst. Oft ist das aber dann so das 
C-progger dann in Basic helfen wollen und dann merken das es nur etwas 
anders geht, hab ich so mit bekommen.

von Martin (Gast)


Lesenswert?

Es geht ihm bestimmt nicht um Basic, C, Pascal oder sonstwas, aber ein 
Seitenlangen Sorcecode direkt zu posten ist schon der Hammer.

von Avr N. (avrnix) Benutzerseite


Lesenswert?

@Martin - deine Aussage ist ein Hammer, weil ohne Sinn oder hast du eine 
Lösung ? Und wenn du mal woanders reinrucken kannst da sind noch mehre 
Hammer drin. Der Sourcode Funktioniert, deine Sprüche nicht.

Und dich habe ich auch nicht gefragt.

von Martin (Gast)


Lesenswert?

Ich bin nichr der AVR Nix von oben.

Wenn du bei so einer harmlosen Aussage solche Sprüche klöpfst, und dich 
nicht an Fornregeln hälst, dann wird es nix mit Hilfe.

Ein "OK in zukunft mach es es besser" währe eher angebracht.

von Peter D. (peda)


Lesenswert?

Avr Nix wrote:
> Kannst du mal was anständiges beitragen, als dein Mist ?
> Du bist doch bestimmt der aus dem bascom-forum ?

Wie wärs, einfach mal die Regeln zu lesen, bevor Du postest:

Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang!

Was ist daran nicht zu kapieren?


Daß Du damit einen Thread totmachst, weil die Leute Schwielen beim 
Scrollen kriegen, ist klar.
Und dann gibts eben unfreundliche Reaktionen.


Peter

von Avr N. (avrnix) Benutzerseite


Lesenswert?

Das hätte man auch klar sagen können und nicht - bla, bla bla machen 
brauchen oder doch.

thx werde ich mir merken.

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.