Che Guevara
22.10.2008, 20:02
hallo alle,
ich möchte gleich vorweg sagen, JA ICH HABE GOOGLE BENUTZT UND JA ICH HABE AUCH DIE SUFU IM ROBOTERNETZ BENUTZT!!!!
ich möchte die kapazität eines kondensators bestimmen, von ungefähr 0.2pf bis 500nf.
dazu hab ich mir überlegt, einen astabilen multivibrator (evtl. mit ne555) aufzubauen und dann die frequenz zu messen. der zu messende c wird dann parallel zu dem anderen c vom multivibrator angeschlossen und verändert somit die frequenz. diese wird dann erneut gemessen und mit der ersten messung verglichen. ich gehe jetzt mal davon aus, dass sich die frequenz proportional zum c verändert?!?!?!
ich hatte dabei an eine frequenz von ungefähr 600kHz gedacht, allerdings ist a) meine messmethode ziemlich ungenau (schwankt um den wert 100) und b) ist die höchste frequenz, die mir der atmega32 bis jetzt angezeigt hat ungefähr 22kHz. das ist definitiv zu wenig!! wie kann ich den höhere frequenzen messen?? ich habe mal gehört, man kann max. eine frequenz von der halben taktfrequenz messen. das wären dann bei mir (16000000/2), also ungefähr 8MHz.
hier mal mein code, ich habe 2 varianten, einmal über timer = counter und einmal mit externem interrupt:
$regfile = "m32def.dat"
$crystal = 16000000
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Config Lcdbus = 4
Initlcd
Cls
Cursor Off Noblink
Config Pinb.0 = Input
Portb.0 = 1
Config Pina.0 = Input
Porta.0 = 1
Config Timer0 = Counter , Edge = Falling
Timer0 = 255
On Timer0 Isr_von_timer0
Stop Timer0
Enable Timer0
Config Timer1 = Timer , Prescale = 1024
Timer1 = 0
Stop Timer1
Enable Timer1
Enable Interrupts
Main:
Dim I As Long
I = 0
Locate 1 , 1
Lcd "Ergibnis in 1 sec"
Waitms 400
Locate 2 , 1
Lcd "ab jetzt"
Start Timer1
Start Timer0
Do
Loop Until Timer1 = 15625
Stop Timer0
Stop Timer1
Timer1 = 0
Locate 3 , 1
Lcd "Wert = " ; I
Do
Loop Until Pina.0 = 0
Cls
Waitms 200
Goto Main
End
Isr_von_timer0:
Timer0 = 255
Incr I
Return
und:
$regfile = "m32def.dat"
$crystal = 16000000
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Config Lcdbus = 4
Initlcd
Cls
Cursor Off Noblink
Config Pind.2 = Input
Portd.2 = 1
Config Pina.0 = Input
Porta.0 = 1
Config Int0 = Falling
On Int0 Isr_von_int0
Config Timer1 = Timer , Prescale = 1024
Timer1 = 0
Stop Timer1
Enable Timer1
Enable Interrupts
Main:
Dim I As Word
I = 0
Locate 1 , 1
Lcd "Ergibnis in 2 sec"
Waitms 400
Locate 2 , 1
Lcd "ab jetzt"
Wait 1
Start Timer1
Enable Int0
Do
Loop Until Timer1 = 15625
Disable Int0
Stop Timer1
Timer1 = 0
Locate 3 , 1
Lcd "Wert = " ; I
Do
Loop Until Pina.0 = 0
Cls
Waitms 200
Goto Main
End
Isr_von_int0:
Incr I
Return
welche möglichkeit ist den am besten?? mit interrupt oder counter?
oder gibt es noch eine andere möglichkeit?
danke schon mal für eure antworten.
gruß
chris
ich möchte gleich vorweg sagen, JA ICH HABE GOOGLE BENUTZT UND JA ICH HABE AUCH DIE SUFU IM ROBOTERNETZ BENUTZT!!!!
ich möchte die kapazität eines kondensators bestimmen, von ungefähr 0.2pf bis 500nf.
dazu hab ich mir überlegt, einen astabilen multivibrator (evtl. mit ne555) aufzubauen und dann die frequenz zu messen. der zu messende c wird dann parallel zu dem anderen c vom multivibrator angeschlossen und verändert somit die frequenz. diese wird dann erneut gemessen und mit der ersten messung verglichen. ich gehe jetzt mal davon aus, dass sich die frequenz proportional zum c verändert?!?!?!
ich hatte dabei an eine frequenz von ungefähr 600kHz gedacht, allerdings ist a) meine messmethode ziemlich ungenau (schwankt um den wert 100) und b) ist die höchste frequenz, die mir der atmega32 bis jetzt angezeigt hat ungefähr 22kHz. das ist definitiv zu wenig!! wie kann ich den höhere frequenzen messen?? ich habe mal gehört, man kann max. eine frequenz von der halben taktfrequenz messen. das wären dann bei mir (16000000/2), also ungefähr 8MHz.
hier mal mein code, ich habe 2 varianten, einmal über timer = counter und einmal mit externem interrupt:
$regfile = "m32def.dat"
$crystal = 16000000
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Config Lcdbus = 4
Initlcd
Cls
Cursor Off Noblink
Config Pinb.0 = Input
Portb.0 = 1
Config Pina.0 = Input
Porta.0 = 1
Config Timer0 = Counter , Edge = Falling
Timer0 = 255
On Timer0 Isr_von_timer0
Stop Timer0
Enable Timer0
Config Timer1 = Timer , Prescale = 1024
Timer1 = 0
Stop Timer1
Enable Timer1
Enable Interrupts
Main:
Dim I As Long
I = 0
Locate 1 , 1
Lcd "Ergibnis in 1 sec"
Waitms 400
Locate 2 , 1
Lcd "ab jetzt"
Start Timer1
Start Timer0
Do
Loop Until Timer1 = 15625
Stop Timer0
Stop Timer1
Timer1 = 0
Locate 3 , 1
Lcd "Wert = " ; I
Do
Loop Until Pina.0 = 0
Cls
Waitms 200
Goto Main
End
Isr_von_timer0:
Timer0 = 255
Incr I
Return
und:
$regfile = "m32def.dat"
$crystal = 16000000
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Config Lcdbus = 4
Initlcd
Cls
Cursor Off Noblink
Config Pind.2 = Input
Portd.2 = 1
Config Pina.0 = Input
Porta.0 = 1
Config Int0 = Falling
On Int0 Isr_von_int0
Config Timer1 = Timer , Prescale = 1024
Timer1 = 0
Stop Timer1
Enable Timer1
Enable Interrupts
Main:
Dim I As Word
I = 0
Locate 1 , 1
Lcd "Ergibnis in 2 sec"
Waitms 400
Locate 2 , 1
Lcd "ab jetzt"
Wait 1
Start Timer1
Enable Int0
Do
Loop Until Timer1 = 15625
Disable Int0
Stop Timer1
Timer1 = 0
Locate 3 , 1
Lcd "Wert = " ; I
Do
Loop Until Pina.0 = 0
Cls
Waitms 200
Goto Main
End
Isr_von_int0:
Incr I
Return
welche möglichkeit ist den am besten?? mit interrupt oder counter?
oder gibt es noch eine andere möglichkeit?
danke schon mal für eure antworten.
gruß
chris