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.
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
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.
Es geht ihm bestimmt nicht um Basic, C, Pascal oder sonstwas, aber ein Seitenlangen Sorcecode direkt zu posten ist schon der Hammer.
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.