Programowanie chronografu


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ł




Portret użytkownika Pablo201_5

'***********PROGRAM POMIAR

'***********PROGRAM POMIAR PREDKOSCI************
'****************PAWEL REKAS********************
'************* Konfiguracja uC *****************
'***********************************************
 
$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