Witajcie.
Zaczynam swoja przygodę z mikrokontrolerami AVR -> Atmega8.
Postawiłem sobie za problem zmierzenie czasów migawki starych aparatów fotograficznych. Myślę sobie problem banalny więc do dzieła... niestety poległem.
O ile program wykorzystujący polecenie waitus1 faktycznie działał to jednak nie do końca.
Czyli
Jednak to nie to, te czasy jakiś dziwne wychodzą.
Profesjonalnie powinno się wykorzystać wbudowany w procesor timer. No właśnie tylko jak. Ani ośla łączka ani książka Marcina Wiązani nie naprowadziła mnie na dobrą drogę.
Czasy które chce zmierzyć to odcinki od 0,001s do 1s.
I tak procesor taktowany 8MHz, preskaler ustawiany na 64 co daje okres impulsów licznika 8µs. Licznik ma zliczać do 125 co daje 125 x 8µs = 1000µs czyli 1ms czyli 0,001s.
Możecie rzucić okiem na program czy dobrze mam skonfigurowany timer0? Bo czasy jakie mi wychodzą są kosmiczne (oczywiście chwilowo migawkę udaję "mikrosłiczem" ale to chyba nie ma znaczenia jeśli przycisk trzymam 3s a na wyświetlaczu dostaje wartość np 87).
Naciśniecie przycisku pod pinb.5 ma uruchomić odczyt wyniku na 5 sekund.
Oto mój tragiczny program:
Wszelkie sugestie mile widziane.
Pozdrawiam Was Konrad
Zaczynam swoja przygodę z mikrokontrolerami AVR -> Atmega8.
Postawiłem sobie za problem zmierzenie czasów migawki starych aparatów fotograficznych. Myślę sobie problem banalny więc do dzieła... niestety poległem.
O ile program wykorzystujący polecenie waitus1 faktycznie działał to jednak nie do końca.
Czyli
Do
waitus 1
Incr X
LoopJednak to nie to, te czasy jakiś dziwne wychodzą.
Profesjonalnie powinno się wykorzystać wbudowany w procesor timer. No właśnie tylko jak. Ani ośla łączka ani książka Marcina Wiązani nie naprowadziła mnie na dobrą drogę.
Czasy które chce zmierzyć to odcinki od 0,001s do 1s.
I tak procesor taktowany 8MHz, preskaler ustawiany na 64 co daje okres impulsów licznika 8µs. Licznik ma zliczać do 125 co daje 125 x 8µs = 1000µs czyli 1ms czyli 0,001s.
Możecie rzucić okiem na program czy dobrze mam skonfigurowany timer0? Bo czasy jakie mi wychodzą są kosmiczne (oczywiście chwilowo migawkę udaję "mikrosłiczem" ale to chyba nie ma znaczenia jeśli przycisk trzymam 3s a na wyświetlaczu dostaje wartość np 87).
Naciśniecie przycisku pod pinb.5 ma uruchomić odczyt wyniku na 5 sekund.
Oto mój tragiczny program:
'pomiar ultrakrotkich czasow
$regfile = "m8def.dat" 'informuje kompilator o pliku
'dyrektyw mikrokontrolera
$crystal = 8000000 'informuje kompilator
'o częstotliwości oscylatora
'taktującego mikrokontroler
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2
Config Portb.0 = Output 'konfiguracja buzerka
Config Portb.3 = Input 'konfiguracja wlacznika S1
Config Portb.5 = Input 'konfiguracja wlacznika S3
Dim X As Single 'deklaracja zmiennej X do wait X
Set Portb.3 'dołączenie do linii
Set Portb.5 'rezystora podciagajacego
'*******************************************************************************
Config Timer0 = Timer , Prescale = 64
Enable Interrupts
Enable Timer0
Load Timer0 = 125
'*******************************************************************************
Cursor Off Noblink 'Likwiduje mruganie kursora na koncu slowa
Cls
Lcd " POMIAR"
Lowerline : Lcd " MIGAWKI"
Waitms 1500
Portb.0 = 1
Waitms 50
Portb.0 = 0
Waitms 100
Start:
Cls
Lcd "Wyzwalaj"
Lowerline : Lcd "migawke..."
Do
If Pinb.3 = 0 Then
Start Timer0
Incr X
Else
Stop Timer0
End If
Loop Until Pinb.5 = 0
X = X / 1000
Cls
Lcd "T= " ; X
Wait 5
X = 0
Goto Start
EndWszelkie sugestie mile widziane.
Pozdrawiam Was Konrad
