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
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
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
Blinkende LED habe ich schon programmiert, von Interrupts auch schon mal
gehört noch nicht programmiert, aber dann lassen meine Kenntnisse stark
nach...
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.
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
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.
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
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 ?
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
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.
@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.
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.
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