Hallo, ich verwende Bascom 1.11.9.1 und will mit nem ATmega8 eine Frequenz messen. Meine Idee ist nun, die Frequenz am ATmega entweder an Pin T1 oder an Pin ICP1 anzulegen, der den Timer 1 hochzählt. Timer 2 dient als Zeitbasis, der den Zählerstand in regelmäßigen Zeitabständen auslesen und auf 0 setzen soll. Nun stellt sich mir folgendes Problem: Wie erreiche ich es, dass die angelegte Frequenz den Timer 1 erreicht. Und welcher Eingangs-Pin ist besser geeignet T1 oder ICP1? Wie muß ich den Timer1 configurieren, daß T1 den Timer1 hochzählt? Wie muß ich den Timer1 konfigurieren, daß ICP1 den Timer1 hochzählt? Mitch.
Also der ICP zählt nicht in dem Sinne... du kriegst da eine Pulsbreite! Was "besser" ist richtet sich auch etwas nach der Frequenz. Für niedrige Frequenzen ist ICP idr besser, für hohe ist zählen mit T1 besser.
Ich möchte einen kleinen frequenzzähler bauen, der im Bereich 1Hz bis etwa 1MHz gehen soll. Leider kriege ich es nicht hin, dass T1 den Timer1 hochzählt. die Register TCCR1A=0 und TCCR1B=7 müßten richtig gesetzt sein. Irgendwie kommt das Signal am Pin T1 nicht zum Timer1 Habe keine Ahnung warum. Im Datenblatt steht unter der Tabelle der Taktquelle noch ein Satz, wie der Zühler Software-seitig kontrolliert werden kann. Den T1-Pin als Ausgang schalten. das klingt für mich aber etwas unlogisch.
Also hier habe ich ein LC-Messgerät welches über Frequenzmessung L und C erechnet. Es Wird auch die Frequenzausgegeben. Die Frequenz wird über T1 gezählt. Das Programm ist noch nicht fertig, die Frequenzmessung und Messung von L und C geht aber. Du kannst die wesentlichen Sachen gerne anschauen. Das Programm kommt wenn es fertig ist auf meine HP. 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 + Frequenzzähler (GPL 2) '############################################################### ' Programmart: Vollversion '############################################################### ' 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 des Frequenz-Overflows '################################### Timer0_overflow: Incr Overflow_count Return 'Frequenzmessung über Timer1 im overflow Pulse: Stop Timer0 Stop Timer1 '######################### 'berechnen 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 ' frequenzteileransteuerung ' rechteckgerator
Hallo AVR NIX, danke für dein Programm. Muß ich mal genauer anschauen. Eine Frage dazu hätte ich. Wie regst du den Schwingkreis an, um dann die Frequenz zu messen? Zurück zu meinem Problem: Ich habe es gelöst. Der Fehler war in der OC2-Interrupt-Routine. Hatte den falschen Zähler zurückgesetzt und ausgelesen. (War wohl müde!) Aber jetzt funzt es! Gruß Mitch. PS: Vergesse meine Frage nicht!
Gute Frage ! ich weis es nicht vielleicht durch die Energie der Schaltung, oder der Empfang von Störungen, keine Ahnung. Die Schaltung ( LC-Messmodul auf meiner HP ) ist hier auch schon gewesen, allerdings in C. Wegen den Aufbau etc. Frage im Forum auf http://www.comwebnet.de nach.
> Im Datenblatt steht unter der Tabelle der Taktquelle noch ein Satz, wie > der Zühler Software-seitig kontrolliert werden kann. Den T1-Pin als > Ausgang schalten. das klingt für mich aber etwas unlogisch. Warum denn? Dann kannst du, indem du mit der Software den Ausgangs-Pin toggelst den Timer hochzählen. Nicht ganz das, was du willst, aber es scheint Leute zu geben, die das wollen, deswegen steht es im Datenblatt... MfG, Heiko
Hallo @ He Ro habs ausprobiert, das funktioniert tatsächlich. Aber eine Anwendung fällt mir jetzt dazu keine ein. Mitch.
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.