Witam,
Konstruuje sobie chronograf na Atmega8. Inspirowałem się tym- http://www.e-tawerna.pl/viewtopic.php?t=2099&postdays=0&postorder=asc&start=0.
Schemat:
Jednak że z programowaniem mam na pieńku to skleciłem takie coś... pomiar czasu przepisałem z książki i lekko zmodyfikowałem. Zależy mi na dokładności pomiarów.
Program zamieszczam, nie chce się skompilować, nie bardzo ogarniam co mam źle, mile widziane sugestie itp.
Założenia urządzenia:
- pomiar prędkości średniej ( regulowany programowo odstęp między bramkami ),
- pomiar prędkości chwilowej ( odstęp również regulowany programowo ),
- pomiar napięcia zasiania i ostrzeżenie o wymianie baterii,
- Regulowane podświetlenie.
"Algorytm"
1)Urządzenie się włącza i jeśli zasilanie jest za słabe to ostrzega o tym,
2)Wybór trybu pracy- prędkość chwilowa czy średnia- po wyborze wpisujemy wartość droga, ostatnie ustawienia (wszystkiego) zapisywane do eeprom,
3)Regulacja podświetlenia
Proszę o propozycje zmian w kodzie, może inny pomiar czasu itp.
Pozdrawiam Paweł
Konstruuje sobie chronograf na Atmega8. Inspirowałem się tym- http://www.e-tawerna.pl/viewtopic.php?t=2099&postdays=0&postorder=asc&start=0.
Schemat:

Jednak że z programowaniem mam na pieńku to skleciłem takie coś... pomiar czasu przepisałem z książki i lekko zmodyfikowałem. Zależy mi na dokładności pomiarów.
Program zamieszczam, nie chce się skompilować, nie bardzo ogarniam co mam źle, mile widziane sugestie itp.
Założenia urządzenia:
- pomiar prędkości średniej ( regulowany programowo odstęp między bramkami ),
- pomiar prędkości chwilowej ( odstęp również regulowany programowo ),
- pomiar napięcia zasiania i ostrzeżenie o wymianie baterii,
- Regulowane podświetlenie.
"Algorytm"
1)Urządzenie się włącza i jeśli zasilanie jest za słabe to ostrzega o tym,
2)Wybór trybu pracy- prędkość chwilowa czy średnia- po wyborze wpisujemy wartość droga, ostatnie ustawienia (wszystkiego) zapisywane do eeprom,
3)Regulacja podświetlenia
Proszę o propozycje zmian w kodzie, może inny pomiar czasu itp.
Pozdrawiam Paweł
Code:
$regfile = "m8def.dat"
$crystal = 16000000 'trzeba zmienić fusebity na 16MHz
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portd.4 , Rs = Portd.3
Cursor Off
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'konfiguracja wewnętrznego przetwornika A/c
Start Adc 'uruchomienie wewnętrznego przetwornika A/C
Config Timer2 = Timer , Prescale = 64 'timer0 do PWM dla wyświetlacza
On Timer2 Pwm_lcd
Timer2 = 0
Enable Interrupts
Enable Timer2
Config Timer0 = Timer , Prescale = 1 'zwiekszanie T/C2 co 16 us (64*0,24us)
On Timer0 Czas_przejazdu_a
Enable Interrupts
Enable Timer0
'********** Konfiguracja uC kontynuacja ************
'****************** Nazwy **************************
'****************************************************
Config Portc.4 = Output 'wyjście na podświetlenie LCD
Reset Portc.4 'zakładam, że będzie tam tranzystor NPN
Config Portc.0 = Input 'FOTOTRANZYSTOR 1
Set Portc.0
Config Portc.1 = Input 'FOTOTRANZYSTOR 2
Set Portc.1
Config Portc.2 = Input 'FOTOTRANZYSTOR 3
Set Portc.2
Config Portc.3 = Input 'FOTOTRANZYSTOR 4
Set Portc.3
Fototranzystor1a_poczatek Alias Pinc.0
Fototranzystor2a_koniec Alias Pinc.1
Fototranzystor3b_poczatek Alias Pinc.2
Fototranzystor4b_koniec Alias Pinc.3
Config Portd.0 = Input 'przycisk "+"
Set Portd.0
Config Portd.1 = Input 'przycisk "M"
Set Portd.1
Config Portd.2 = Input 'przycisk "-"
Set Portd.2
Plus Alias Pind.0
M Alias Pind.1
Minus Alias Pind.2
Config Portb.1 = Output 'buzzer - tranz. NPN
Set Portb.1
Buzzer Alias Portb.1
'Diody- tranz. NPN
Config Portb.5 = Output
Set Portc.5
Config Portb.4 = Output
Set Portb.4
Led_a Alias Pinb.5
Led_b Alias Pinb.4
'************* Nazwy Koniec ****************
'**************** Zmienne *******************
'*********************************************
Dim Menu As Byte
Dim Czass_a As Double 'czas przekazdu
Dim Czass_b As Double
Dim Predkosc_a As Double
Dim Predkosc_b As Double
Dim Predkosc_ekran_a As Double
Dim Predkosc_ekran_b As Double
Dim Nap_adc As Word 'wartość odczytana z ADC
Dim Napiecie As Single 'wartość napięcia do pokazania na ekranie
Dim Dzies_tys_sek As Byte
Dim Tys_sek As Byte
Dim Setsek As Byte
Dim Dziesek As Byte
Dim Sekjed As Byte
Dim Sekdzies As Byte
Dim Sekset As Byte
Dim Sektys As Byte
Dim Licz As Byte
Dim 10ms As Byte
Dim Dzies_tys_sek_b As Byte
Dim Tys_sek_b As Byte
Dim Setsek_b As Byte
Dim Dziesek_b As Byte
Dim Sekjed_b As Byte
Dim Sekdzies_b As Byte
Dim Sekset_b As Byte
Dim Sektys_b As Byte
Dim Licz_b As Byte
Dim 10ms_b As Byte
Dim Pwm_lcd_licznik As Byte 'wewnętrzny licznik PWM-u
Dim Pwm As Byte 'ustawiona wartość PWM dla podświetlenia lcd
Dim Pwm_zaladowane As Byte 'wartość wypełnienia, które będzie faktycznie działała - przydatne przy funkcji StarLight
'************* Zmienne koniec ****************
'*************** podprogramy ******************
'***********************************************
Declare Sub Odczytnapiecia 'odczyt napięcia z ADC i konwersja na liczbę
Declare Sub Konwert_zmienna_na_czas_a
Declare Sub Konwert_zmienna_na_czas_b
Declare Sub Przelicz_vsr
Declare Sub Przelicz_vch
'***********************************************
'Pwm_zaladowane = Pwm 'zalanczam podswietlenie
Menu = 1
If M = 0 Then
Incr Menu
End If
If Menu >= 4 Then Menu = 0
End If
Gosub Odczytnapiecia 'odczyt napięcia z ADC
If Napiecie_ekran < 6 Then
Locate 1 , 1
Lcd "UWAGA! Niski "
Locate 2 , 1
Lcd " stan baterii ! "
Wait 3
Locate 1 , 1
Lcd " Zmien baterie "
Locate 2 , 1
Lcd "6 x bateria AAA "
End If
Locate 1 , 1 'pierwsza liczba to numer wiersza; druga - numer kolumny w której ustawia się kursor do pisania
Lcd " Witaj! "
Locate 2 , 1
Lcd " "
End If
Wait 3 'czas wyświetlania napisu
Locate 1 , 1 'pierwsza liczba to numer wiersza; druga - numer kolumny w której ustawia się kursor do pisania
Lcd " CHRONOMETR "
Locate 2 , 1
Lcd " "
End If
Wait 3
'-----------------------------------------------------------------------------
'obsługa przycisków
'-----------------------------------------------------------------------------
If Menu >= 1 And Plus = 0 Then
Incr Menu
If Menu >= 4 Then : Menu = 0 : End If 'po przekręceniu się menu, wracamy do pulpitu
End If
If Menu >= 1 And Minus = 0 Then
Decr Menu
If Menu >= 4 Then : Menu = 6 : End If 'po przekręceniu się menu, wracamy do pozycji ostatniej
End If
'-----------------------------------------------------------------------------
'-----------------------------------------------------------------------------
If Menu = 0 Then
Do
'odczyt napięcia z ADC i konwersja na liczbę
Gosub Konwert_zmienna_na_czas_a
Gosub Konwert_zmienna_na_czas_b
Gosub Przelicz_vsr
Gosub Przelicz_vch
If Menu = 0 Then
Locate 1 , 1
Lcd "Pomiar predkosci"
Locate 2 , 1
Lcd " sredniej "
Wait 3
Locate 1 , 1
Lcd " Podaj droge "
Locate 2 , 1
Lcd " "
Lcd " DROGA "
Locate 2 , 1
Lcd "" ; Droga_a ; " centymetrow"
If Plus = 0 Then
Incr Droga_a
End If
If Minus = 0 Then
Decr Droga_a
End If
If M = 0 Then
Writeeeprom Droga_a , 2 : End If
Locate 1 , 1
Lcd "Predkosc: Czas:"
Locate 2 , 1
Lcd "" ; Predkosc_ekran_a ; "km/h" ; Czass_a ; "s"
End If
'####################################################################################################
If Menu = 2 Then
Locate 1 , 1
Lcd "Pomiar predkosci"
Locate 2 , 1
Lcd " chwilowej "
Wait 3
Locate 1 , 1
Lcd " Podaj odstep "
Locate 2 , 1
Lcd "miedzy bramkami "
If Plus = 0 Then
Incr Droga_b
End If
If Minus = 0 Then
Decr Droga_b
Lcd " ODSTEP "
Locate 2 , 1
Lcd "" ; Droga_b ; " centymetrow"
End If
If M = 0 Then
Writeeeprom Droga_b , 2 : End If
Locate 1 , 1
Lcd "Predkosc: Czas:"
Locate 2 , 1
Lcd "" ; Predkosc_ekran_b ; "km/h" ; Czass_b ; "s"
End If
'-----------------------------------------------------------------------------
'przejście do menu nastaw jasności LCD 2/6
'-----------------------------------------------------------------------------
If Menu = 2 And Podmenu = 0 Then
Locate 1 , 1
Lcd " Ustaw Jasnosc "
Locate 2 , 1
Lcd " podswietlenia "
If M = 0 Then : Podmenu = 1 : Opcja = 0 : Waitms 500 : End If 'po wciśnięciu M przejdź do nastawy jasności ręcznej
End If
'-----------------------------------------------------------------------------
'Fragment obsługujący ręczną nastawę jasności
'-----------------------------------------------------------------------------
If Menu = 3 Then
Locate 1 , 1
Lcd " Jasnosc LCD "
Locate 2 , 1
Lcd "- " ; Pwm ; "% +"
Waitms 150
Locate 1 , 1
Lcd " "
Waitms 150
Locate 2 , 1
Lcd " " ; Pwm ; " "
If Plus = 0 Then
Pwm = Pwm + 10
If Pwm >= 101 Then
Pwm = 0
End If
End If
If Minus = 0 Then
Pwm = Pwm - 10
If Pwm >= 101 Then
Pwm = 100
End If
End If
If M = 0 Then : Writeeeprom Pwm , 4 : End If ' po wcisnieciu m przejdz do nastepnej pozycji
End If
Loop
End
'******************************************************************************************
'##########################################################################################
'******************************************************************************************
Co10ms:
Timer0 = 655343.75 ' zakaduj do timier, zeby zliczyl 625 (= 655350- 655343 , 75) impulsów cp 0,1 ms
If Fototranzystor1a_poczatek = 0 Then Licz = 1 'sprawdź stan 1 bramki i ewentualnie rozpocznij zliczanie czasu
If Fototranzystor1a_koniec = 0 Then Licz = 0 'sprawdź stan 2 bramki i ewentualnie zakoncz zliacznie czasu
If Licz = 1 Then
Incr Dzies_tys_sek 'co 10 ms zwieksz wartosc licznika setnych
If Dzies_tys_sek = 10 Then
Dzies_tys_sek = 0
Incr Tys_sek
If Tys_sek = 10 Then
Tys_sekk = 0
Incr Setsek
If Setsek = 10 Then
Setsek = 0
Incr Dziesek
If Dziesek = 10 Then
Dziesek = 0
Incr Sekjed
If Sekjed = 10 Then
Sekjed = 0
Incr Sekdzies
If Sekdzies = 10 Then
Sekdzies = 0
Incr Sekset
If Sekset = 10 Then
Sekset = 0
Incr Sektys
If Sektys = 10 Then Sektys = 0 'liczy do 99,9999 sekund
End If
End If
End If
End If
End If
End If
End If
End If
If Fototranzystor3b_poczatek = 0 Then Licz = 1 'sprawdź stan 1 bramki i ewentualnie rozpocznij zliczanie czasu
If Fototranzystor4b_koniec = 0 Then Licz = 0 'sprawdź stan 2 bramki i ewentualnie zakoncz zliacznie czasu
If Licz = 1 Then
Incr Dzies_tys_sek_b 'co 10 ms zwieksz wartosc licznika setnych
If Dzies_tys_sek_b = 10 Then
Dzies_tys_sek_b = 0
Incr Tys_sek_b
If Tys_sek_b = 10 Then
Tys_sekk_b = 0
Incr Setsek_b
If Setsek_b = 10 Then
Setsek_b = 0
Incr Dziesek_b
If Dziesek_b = 10 Then
Dziesek_b = 0
Incr Sekjed_b
If Sekjed_b = 10 Then
Sekjed_b = 0
Incr Sekdzies_b
If Sekdzies_b = 10 Then
Sekdzies_b = 0
Incr Sekset_b
If Sekset_b = 10 Then
Sekset_b = 0
Incr Sektys_b
If Sektys_b = 10 Then Sektys = 0 'liczy do 99,9999 sekund
End If
End If
End If
End If
End If
End If
End If
End If
'******************************************************************************************
'##########################################################################################
'******************************************************************************************
Pwm_lcd:
Incr Pwm_lcd_licznik
If Pwm_lcd_licznik >= 100 Then
Pwm_lcd_licznik = 0
End If
If Pwm_lcd_licznik < Pwm_zaladowane Then
Set Portc.3
Else
Reset Portc.3
End If
Return
'******************************************************************************************
'##########################################################################################
'******************************************************************************************
Sub Odczytnapiecia
Nap_adc = Getadc(5)
Napiecie = Nap_adc * 0.0151113 'maksimum to 1650
Napiecie_ekran = Fusing(napiecie , "##.&&")
End Sub
'******************************************************************************************
'##########################################################################################
'******************************************************************************************
Sub Konwert_zmienna_na_czass_a
Czass_a =(sektys * 1000 ) +(sekset * 100 ) +(sekdzies * 10 ) + Sekjed +(dziesek * 0 , 1) +(setsek * 0 , 01) +(tys_sek * 0 , 001) +(dzies_tys_sek * 0 , 0001)
End Sub
'******************************************************************************************
'##########################################################################################
'******************************************************************************************
Sub Konwert_zmienna_na_czass_b
Czass_b =(sektys_b * 1000 ) +(sekset_b * 100 ) +(sekdzies_b * 10 ) + Sekjed_b +(dziesek_b * 0 , 1) +(setsek_b * 0 , 01) +(tys_sek_b * 0 , 001) +(dzies_tys_sek_b * 0 , 0001)
End Sub
'##########################################################################################
'******************************************************************************************
Sub Przelicz_vsr
Predkosc_a =(droga_a \ Czass_a) * 3.6 'droga w m/s
Predkosc_ekran_a = Fusing(predkosc_a , "##.&&")
End Sub
'******************************************************************************************
'##########################################################################################
'******************************************************************************************
Sub Przelicz_vch
Gosub
Predkosc_a =(droga_b \ Czass_b ) * 3 , 6
Predkosc_ekran_b = Fusing(predkosc_b , "##.&&")
End Sub