$regfile = "m8def.dat" 'informace ze jde o procesor ATmega8. pokud vite co delate, muzete pouzit i jiny procesor $crystal = 8000000 'frekvence krystalu. je nutny aby byla 8MHz, vychaci z toho frekvence casovace Config Portb.0 = Output Config Portd.2 = Input 'tyto dva vstupy jsou pro senzory, nelze menit Config Portd.3 = Input Config Lcd = 16 * 2 'konfigurace LCD Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5 'piny na kterych je LCD je take mozno zmenit podle potreby On Int0 Vstup 'nastaveni podprogramu preruseni On Int1 Vystup Enable Interrupts 'povoleni preruseni Config Timer1 = Timer , Prescale = 8 'konfigurace casovace. f=xtal/8=1MHz => doba jednoho taktu =1us Stop Timer1 'timer je nutno zastavit, sam se rozbehne po konfiguraci Timer1 = 0 'a vynulovat On Timer1 Ovf 'nastaveni podprogramu pri preteceni timeru Enable Ovf1 'povoleni preruseni od timeru Dim N As Byte 'deklarace ruznych promennych Dim Sureshot As Bit Dim Nextshot As Bit Dim V As Single , Vs As String * 10 Dim F As Single , Fs As Long Portb.0 = 1 Portd.2 = 1 'zapnout pull-up na int0 Portd.3 = 1 'zapnout pull-up na int1 Cls 'vymazani LCD Lcd "Strilej, strilej" Lowerline 'timto zacne program psat na dalsi radek displeje Lcd " " 'uvitaci obrazovka Wait 1 'cekani aby to vypadalo zajimave Nextshot = 1 '---------------------------------- Do 'zacatek nekonecne smycky If Nextshot = 1 Then 'zde se overuje zda-li je uz hotove posledni mereni, pokud ano, vsechno se vynuluje a povoli se preruseni od senzoru Nextshot = 0 ' Timer1 = 0 V = 0 : F = 0 : Sureshot = 0 Portb.0 = 0 Wait 1 Enable Int0 Enable Int1 'odted jsou aktivni senzory Portb.0 = 1 End If Loop 'konec hlavni smycky '------------------------------------------------ Vstup: 'preruseni prvniho senzoru Start Timer1 'spusteni casovace, ten bude pocitat autonomne dokud se nezastavi v podprogramu ktery se spusti po pruletu druhym senzorem Disable Int0 'od ted uz prvni senzor nebude reagovat, zabrani dvojitym detekcim a jinym porucham Sureshot = 1 'slouzi pro kontrolu ze kule prosla prvnim senzorem Return Vystup: Stop Timer1 'zastaveni casovace, ted uz program vi jak dlouho trvalo kulicce uletet vzdalenost mezi senzory Disable Int1 'od ted uz druhy senzor nebude reagovat, zabrani dvojitym detekcim a jinym porucham 'vypnuti Disable Int0 Portb.0 = 0 Cls If Sureshot = 0 Then 'kontrola jestli kule prosla pres prvni senzor Lcd "Chyba senzor 1" Lowerline Lcd "Vystrel znovu " Else 'pokud ano, provede se nasledujici: '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! V = 706000 / Timer1 'vypocet rychlosti ze vzdalenosti a casu: mikrometry/mikrosekundy=m/s F = V * 3.280839895 'vypocet stop za sekundu Vs = Fusing(v , "#.#") 'zaokrouhleni Fs = Round(f) N = N + 1 Cls Lcd "Shot" Locate 1 , 7 Lcd Vs ; " m/s " Lowerline Lcd N Locate 2 , 7 Lcd Fs ; " fps " 'zobrazeni vysledku End If Nextshot = 1 Return 'konec obsluzneho programu preruseni Ovf: 'zde se osetruje kdyz kule projde prvnim, ale neprojde druhym senzorem. timer pretece a vyvola toto preruseni Stop Timer1 Timer1 = 0 Disable Int1 Portb.0 = 0 Cls Lcd "Chyba senzor 2" Lowerline Lcd "Vystrel znovu " Nextshot = 1 Return End