Napisałem programik na Atmega16 na pomiar niskich (do 80Hz) częstotliwości. Listing poniżej. Program zlicza wewnętrzne impulsy co 100us na Timer0 i gdy przyjdzie zbocze na INT2, oblicza częstotliwość. Na INT2 podaję badany przebieg prostokątny.
Problem mój w tym, że wynik pomiaru (mierzony z dokładnością do 1 miejsca po przecinku) jest niestabilny właśnie na tym ostatnim miejscu. Dla częstotliwości do 25Hz niestabilności nie widać, ale powyżej, pomiar na ostatnim miejscu zaczyna skakać, najpierw co 0.1, potem więcej, nawet co 0,6 dla 80Hz.
Czym to jest spowodowane? Nie mogę sobie z tym poradzić. Mierzyłem przebieg We na oscyloskopie i ten jest stabilny. Procek napędzany kwarcem zewnętrznym 16MHz.
Kod: Zaznacz cały
$regfile = "m16def.dat"
$crystal = 16000000
Config Porta = &B00111011
Config Portb = &B11111010
Config Portc = &B00011111
Config Portd = &B11111111
Config Int2 = Rising
On Int2 Zlicz
Enable Int2
Config Timer0 = Timer , Prescale = 8
On Timer0 Czas
Enable Timer0
Load Timer0 , 200
Enable Interrupts
Dim Czest As Single
dim licznik as word
Reset Portb.0
Ddrb.0 = 0 'ustawiamy HiZ
Set Portb.2
Do
Rem tu wyświetlanie właściwego wyniku na wyświetlaczach LED
Loop
End
Zlicz: 'przerwanie od INT2
Stop Timer0
Czest = 1 / Licznik
Licznik = 0
Start Timer0
Return
Czas: 'zaglada tu co 100 us
Load Timer0 , 200 'pomijamy 56 i każemy mu zliczyć tylko 200 wartości
Incr Licznik
If Licznik > 5000 Then
Licznik = 65535
Czest = 0
End If
Return