Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Częstościomierz na ATMega16 !!!!

kamil.h
-
-
Posty:1
Rejestracja:19 maja 2005, o 13:37
Lokalizacja:BP
Częstościomierz na ATMega16 !!!!

Postautor: kamil.h » 19 maja 2005, o 13:52

Hey !

Właśnie napisałem program do częstościomierza, ale ni jak nie może pokazać wyniku - cały czas pokazuje zero - nie wiem jak przechwycić wynik końcowy i wrzucić na wyświetlacz LED !
Zasada jest taka, że T/C0 służy do wyznaczenia czasu bramkowania 1s, T/C1 działa tu jako licznik impulsów, których liczba ma się pojawić na wyświetlaczy LED, T/C2 zastosowałem do multipleksacji. Jest to zrobine na ATMega8 z oscylatorem 8 [MHz] - skonfigurowałem bity zezwalające na taką częstotliwość, a impulsy są podawane zgodnie z danymi katalogowymi na wejście PB.1 układu - wejście Timer'a 1.
Jako generatora impulsów użyłem płytki testowej AVR DEMO 2313, jakiej używa się w kursie Oślej Łączki, z programem do generowania impulsów. Układ działa, bo dioda mi miga jak podłączę ją na pin odpowiedni.
Oba układy zasilam z jednego zasilacza, czyli masa jest wspólna.
Poniżej jest program - co jest w nim nie tak - proszę zwróćcie uwagę czy dobrze ustawiłem stan spoczynkowy na porcie B i czy w dobrym miejscu jest polecenie Start Timer1 ?


=================================================================
'zmienne użyte w programie
Dim Jednostki As Byte , Dziesiatki As Byte , Setki As Byte , Tysiace As Byte , Ktorywysw As Byte
Dim Tysiace_1 As Byte , Tysiace_2 As Byte , Tysiace_3 As Byte , Tysiace_4 As Byte
Dim Timebase As Word , Wynik As Word

'konfiguracja portów
'Port A - segmenty wyświetlacza
Config Porta = 255 'wszystkie końcówki jako wyjścia
Porta = 255 'segmenty wygaszone na początek
'=================================================================
'Port C - anody wyświetlaczy
Config Portc = 255 'wszystkie końcówki jako wyjścia
Portc = 255 'wyświetlacze wygaszone na początek
'=================================================================
'Port B - wejście PB.1 do zliczania impulsów
Config Portb = 253 'CZY TU JEST DOBRZE ??
Portb = 253
'=================================================================
'Port D - nie wykorzystany
Config Portd = 255
Portd = 255
'=================================================================

'konfiguracja T/C0
Config Timer0 = Timer , Prescale = 1 'bez preskalera, przepełnienie co 32us

'konfiguracja T/C1
Config Timer1 = Counter , Capture Edge = Rising 'T/C1 jako licznik impulsów

'konfiguracja T/C2
Config Timer2 = Timer , Prescale = 64 'do multipleksacji

'zezwolenie na przerwania
Enable Interrupts
Enable Timer0
Start Timer1 'CZY TU JEST DOBRZE ??
Enable Timer2

Tysiace_4 = 0
Tysiace_3 = 0
Tysiace_2 = 0
Tysiace_1 = 0
Tysiace = 0
Setki = 0
Dziesiatki = 0
Jednostki = 0

On Timer0 Licz 'do odliczania czasu
Timebase = 31250 'dla odmierzenia 1s

On Timer2 Co2ms 'do multipleksacji

Do : Loop : End 'end program

'=================================================================
'bramkowanie co 1s
Licz:
Decr Timebase
If Timebase = 0 Then
Wynik = Timer1

Timer1 = 0
Timebase = 31250

Jednostki = Wynik Mod 10
Wynik = Wynik / 10
Dziesiatki = Wynik Mod 10
Wynik = Wynik / 10
Setki = Wynik Mod 10
Wynik = Wynik / 10
Tysiace = Wynik Mod 10
Wynik = Wynik / 10
Tysiace_1 = Wynik Mod 10
Wynik = Wynik / 10
Tysiace_2 = Wynik Mod 10
Wynik = Wynik / 10
Tysiace_3 = Wynik Mod 10
Wynik = Wynik / 10
Tysiace_4 = Wynik Mod 10
Wynik = Wynik / 10

End If
Return

'=================================================================
'podprogram do multipleksacji wyświetlacza
Co2ms:
Timer2 = 250

Incr Ktorywysw 'następny wyświetlacz
If Ktorywysw = 8 Then
Ktorywysw = 0
End If

Portc = 255 'zaświecamy wyświetlacze

Select Case Ktorywysw
Case 0: 'wyswietl zawartosc licznika jednostek
Porta = Lookup(jednostki , Tabela) 'najpierw przepisz do Portb kody
Portc.7 = 0 'a później włącz T3 - wyświetlacz jednostek
Case 1: 'wyswietl zawartosc licznika dziesiątek
Porta = Lookup(dziesiatki , Tabela)
Portc.6 = 0
Case 2:
Porta = Lookup(setki , Z_dp)
Portc.5 = 0
Case 3:
Porta = Lookup(tysiace , Tabela)
Portc.4 = 0
Case 4:
Porta = Lookup(tysiace_1 , Z_dp)
Portc.3 = 0
Case 5:
Porta = Lookup(tysiace_2 , Tabela)
Portc.2 = 0
Case 6:
Porta = Lookup(tysiace_3 , Z_dp)
Portc.1 = 0
Case 7:
Porta = Lookup(tysiace_4 , Tabela)
Portc.0 = 0
End Select
Return

'=================================================================
Tabela:
Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
Z_dp:
Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16

Pozdrawiam !

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 11 gości