Mikroprocesorowy miernik częstotliwości...

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Skrzydlaty
Użytkownik
Posty: 126
Rejestracja: 23 wrz 2007, 21:08
Lokalizacja: Krak

Mikroprocesorowy miernik częstotliwości...

Post autor: Skrzydlaty » 25 wrz 2007, 18:12

W EdW z 11.2000 był projekt uP miernika czestotliwości. Zrobiłem na płytce uniwersalnej ten układ ale bez preskalera.... To mniej ważne, a najwązniejszy sam program. Z niego wynika że Timer0 odlicza czas bramkowania równy 1 s.....właśnie! Jest to 1 sekunda czy..może troche więcej lub mniej. jakoś te 4884 mnie nie przekonuje. 4884 * 8 * 256 = 10 002 432! A to jest chyba więcej niż 10MHz. Z tego wynika że częstotliwość wyświetlana będzie większa od rzeczywistej? Bo jakoś nie widze dalej żadnej artmetyki która by dostosowywała zliczoną częstotliwość do wyswietlanej.... gdzie mój tok rozumowania jest zły?
Poniżej zamieszczam program, schematu mysle ze nie trzeba (Wejście Timera1 polaczone z Int0, Portd.6 to wyjscie na preskaler (jesli Portd.6=0 to zliczanie bez preskalera):

Kod: Zaznacz cały

$crystal = 10000000
Config Lcd = 16 * 1a
Dim Ccount As Byte
Dim Maincounter As Long
Dim C_counter As Word
Dim Flag1 As Bit
Dim Flag2 As Word
Dim Tuning As Word
Config Pind.0 = Input
Config Pind.1 = Input
Config Pind.2 = Input
Config Pind.3 = Input
Config Pind.4 = Input
Config Pind.5 = Input
Config Pind.6 = Output
Config Pinb.0 = Output
Load Timer0 20
Declare Sub Frequency
Declare Sub Events
S1 Alias Pind.1
S2 Alias Pind.0
S3 Alias Pind.3
S4 Alias Pind.4
Set Portd.6
Flag2 = 1
Call Frequency
Cls
Sub Frequency
Config Timer0 = Timer , Prescale = 8
Config Timer1 = Counter , Edge = Falling , Noice Cancel = 1
C_counter = 0
Set Portd.6
Cls
Cursor Off

Enable Timer0
Enable Interrupts
On Timer0 Timint
Enable Timer1
Ccount = 0
On Timer1 Int_0
Start Timer0
Start Timer1
Timer1 = 0
Do
Set Pind.1
Debounce Pind.1 , 0 , Main , Sub
Loop
End Sub


Timint:
Incr C_counter
If C_counter = Tuning Then
Stop Timer1
Stop Timer0
Maincounter = Ccount * 65536
Maincounter = Maincounter + Timer1
If Maincounter = 1 Then
Maincounter = 0
End If
If Maincounter < 30000 Then
If Portd.6 = 1 Then
Reset Portd.6
End If : End If

If Maincounter > 4500000 Then
If Portd.6 = 0 Then
Set Portd.6
End If : End If
If Maincounter = 0 Then
Set Portd.6
End If
If Portd.6 = 1 Then
Maincounter = Maincounter / 31
End If
Ccount = 0
If Portd.6 = 0 Then
Tuning = 4884
Else
Tuning = 4844
End If

Timer0 = 0
Cls
If Portd.6 = 0 Then
Lcd "F [Hz]="
Else
Lcd "F[kHz]="
End If
Locate 2 , 1
Lcd "          "
Locate 2 , 1
Lcd Maincounter ;
Locate 2 , 8
Lcd "*"
Waitms 200
Locate 2 , 8
Lcd " "
C_counter = 0
Maincounter = 0
Timer1 = 0
Start Timer0
Start Timer1
End If
Return

Int_0:
      Incr Ccount
Return

Main:
Disable Timer0
Incr Flag2
If Flag2 > 2 Then
Flag2 = 1
End If

Select Case Flag2
Case 1 : Call Frequency
Case 2 : Call Events
End Select
Return

Sub Events
Cls
Stop Timer1
Locate 2 , 7
Lcd "E."
Wait 1
Counter1 = 0
Do

Debounce Pind.1 , 0 , Main , Sub
Home
Lcd Counter1
Set Portd.3
If Pind.3 = 0 Then Counter1 = 0
Set Portd.4
If Pind.4 = 0 Then Stop Timer1
Set Portd.0
If Pind.0 = 0 Then Start Timer1

Loop
End Sub
--------
Proszę przeczytać temat https://forum.elportal.pl/viewtopic.php?t=5072 i w przyszłości
stosować się do zawarych tam zaleceń. Następne takie przewinienie=ostrzeżenie. ZbeeGin
Ostatnio zmieniony 01 sty 1970, 1:00 przez Skrzydlaty, łącznie zmieniany 1 raz.

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 25 wrz 2007, 19:42

Zapewne masz racje, chociaż szczerze mówiąc czas bramkowania 1s to taki sobie. Ja robiłem z bramkowaniem szybszym dzięki temu odczyty były częstrze i bardziej "w czasie rzeczywistym".

Skrzydlaty
Użytkownik
Posty: 126
Rejestracja: 23 wrz 2007, 21:08
Lokalizacja: Krak

Post autor: Skrzydlaty » 25 wrz 2007, 20:23

"Wskazówki" przeanalizowałem, za braki w poście przepraszam.
snow pisze:Zapewne masz racje, chociaż szczerze mówiąc czas bramkowania 1s to taki sobie. Ja robiłem z bramkowaniem szybszym dzięki temu odczyty były częstrze i bardziej "w czasie rzeczywistym".
Czyli mam rozumieć że program z projektu opublikowanego w EdW ma pewne "niedociagniecia"? Myślałem że wzorując sie na tym programie będe mógł napisać włąsny program.... a tu sie okazuje że coś jest nie tak...
Jaki czas bramkowania robiłeś?
Zastanawia mnie jeszcze czas wykonywania instrukcji np. zatrzymania Timera, wlaczenia...ma to jakieś znaczenie i czy duże?

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 25 wrz 2007, 21:11

Bramkowałem co 0,1s ale można i co 0,01s tylko potem kwestia przeliczenia. Ja pisałem w C. Jeden Timer robił za generator czasu bramkowania a drugi zliczał impulsy. W przerwaniu od tego pierwszego była odczytywana liczba impulsów zliczona przez licznik. Nie było zatrzymywania i włączania timera więc nie sprawdzałem czy ten czas ma jakiś wpływ ale zapewne tak bo jeżeli jest włączany i wyłączany programowo to co obrót pętli więc jakieś opóźnienia wystąpią i mogą wpłynąć na pomiar.

Skrzydlaty
Użytkownik
Posty: 126
Rejestracja: 23 wrz 2007, 21:08
Lokalizacja: Krak

Post autor: Skrzydlaty » 25 wrz 2007, 21:32

Widze że weszedłeś na coś, nad czym sie zastanawiałem - włanczanie i wyłanczanie timerów - jak sie bez tego obszedłeś? Bo odczytywanie wartości licznika i jego zerowanie też troche zajmuje, przynajmniej w Bascomie, niewiem jak bardzo w C. Wogóle to nartwienie sie nad tymi opóżnieniami ma jakiś sens czy są to opóźnienia niewarte uwagi?

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 25 wrz 2007, 23:41

Odczytywałem i zerowałem licznik w momencie wystąpienia przerwania zatem trochę czasu zajmie zanim nastąpi kolejne, więc opóźnienia nie miały większego wpływu bo trwały znacznie krócej niż wystąpienie kolejnego przerwania.

Co do dokładności pomiaru częstotliwości to na tyle na ile mogłem pomierzyć to się zgadzało.
Skrzydlaty pisze:Widze że weszedłeś na coś, nad czym sie zastanawiałem - włanczanie i wyłanczanie timerów - jak sie bez tego obszedłeś?
Nie wiem jak w bascomie ale w C nie trzeba timerów wyłączać, po prostu sobie działają.

ODPOWIEDZ