Wie realisiert ihr die messung solch hoher Frequenzen?
Ich muss für ein schulprojekt ein Kapazitätsmessgerät bauen und habe nun auch den Teil zu Frequenzmessung geschrieben, doch er schafft nur frequenzen bis 25 khz richtig anzuzeigen, danach kommt nur noch schrott raus. Ich brauche aber 780khz, also noch über eine Stelle mehr.
Das ganze soll auf einem LCD ausgegeben werden, was die Sache etwas Zeitkitisch macht.
Ich habe, dass zu messende signal an Int0 angeschlossen und lasse bei fallender Flanke eine Variable Hochzählen. Ein interner Timer zählt eine Sekunde und gibt dann Die Variable am Display aus. Eigentlich ganz einfach
Hardware
-Mega 8 8Mhz
-27x4 LCD
-Bascom
-Funktionsgenerator der Schule
Code:
$regfile = "m8def.dat" 'Atmel MEGA 8 controller
$crystal = 8000000 'Quarz auf 8MHz
Ddrd.2 = 0 'PD2/INT0 als Eingang deklarieren
Portd.2 = 1 'Pullup Widerstand aktiveren
'27 x 4 LCD Display angeschlossen
'Festlegen der Verwendeten Ports
Ddrc = &B00111111 ' LCD ANzeige
Ddrd.6 = 1
Ddrd.7 = 1
Dim ___lcdno As Bit
Config Lcdpin = Pin , E = Portc.2 , E2 = Portc.3 , Rs = Portc.0 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portd.6 , Db7 = Portd.7
Config Lcd = 40 * 4
Dim Tasten_zaehler As Integer 'Variable für anzahl der Tastendrücke
Dim Frequenz As Integer 'Frequens den tastendrucks
Dim Timerprescale As Integer 'um timer auf 1 sec ztu stellen
On Int0 Taste0 'Interrupt Unterprogram für Taste 1 festlegen
On Timer0 Ontimer 'Interrupt Programm für Timer0 überlauf
Config Int0 = Falling 'Fallende Flake als Interrupt festlegen
Config Timer0 = Timer , Prescale = 1 'Timer als Timer Festlegen
Enable Int0 'Interruptlauscher Aktivieren
Enable Timer0 'Timer einschalten
Enable Interrupts 'Allgemein Interrupts erlauben
'--Hauptprogramm---------------------------------------------------------------
Tasten_zaehler = 0 'startwert festlegen
Timerprescale = 0 'startwert festlegen
Stop Timer0 'erstmal stop damit nicht schon jetzt interrupts kommen
___lcdno = 0 'Ober Displayhälfte initialisieren, wenn das Display zwei LCD-Controller besitzt
Initlcd
Cursor Off
Cls
___lcdno = 1 'untere Displayhälfte initialisieren, wenn das Display zwei LCD-Controller besitzt
Initlcd
Cursor On
Cls
___lcdno = 0
Home
Lcd "Das neue Frequenzmessgerät"
Locate 2 , 5
Lcd "***** MEGA 8 *****"
___lcdno = 1
Home
Locate 1 , 5
Lcd "(c) Boris Eskin"
Locate 2 , 5
Lcd "(c) Olaf Petersen"
Wait 2
'--jetzt kann es losgehen
___lcdno = 1
Cls
Home
Start Timer0
Do
If Timerprescale >= 31250 Then 'Sekundentakt auswerten der Tasten
Stop Timer0 'damit nicht heimlich weitergezählt wird ffals die Anzeige länger braucht
Disable Int0
Timerprescale = 0
Frequenz = Tasten_zaehler 'Anzahl der Impulse in Frequenz umrechnen (Periodendauer 1sec)
Tasten_zaehler = 0
Locate 1 , 10
Lcd Frequenz , " HZ" 'Ausgabe am LCD
nop
Enable Int0
Start Timer0
End If
Loop
End
'--Unterprogram--Interrupt an Taste 2-------------------------------------------
Taste0:
Incr Tasten_zaehler 'Impulse Zählen
Return
'--Unterprogramm Timer Überlauf 256 mal Quarztakt-------------------------------
Ontimer:
Incr Timerprescale 'Überlaufzähler um eins erhöhen#
Return
Lesezeichen