Juni[]r napisał: Idę w jakimś kierunku ....... ?
Niezupełnie, nie najlepsza ta droga.....
Po pierwsze: wybór processora i parametrów.
-Attiny13; praktycznie nie masz możliwości taktowania go 10 Mhz.
Masz do wyboru: 1.2, 4.8, 9.6 Mhz. albo też 'zasilić' go (CLK1) z gotowego (zewnętrznego) źróła zegarowego co nie ma w zasadzie ekonomicznego sensu.
Jego timer0 z przyjętym którymkolwiek taktowaniem i preskalerem nie daje ci elastyczności w dokładności pomiaru czasu jaki chcesz osiągnąć.
Druga rzecz to: Ogólnie wszystkie timery w AVR, w ich podstawowej funkcji to są liczniki impulsów. Jeżeli te impulsy przychodzą z prescalera w z góry znanych odstępach czasu, wtedy ten licznik staje się timerem (mierzy czas jako wynik z obliczenia); oraz analogicznie jeżeli impulsy przychodzą z zewnątrz w dowolnych odstępach czasu, wtedy możesz tylko zliczać ich ilość.
Tryb (charakter) pracy timera oraz źródło impulsów ustalasz w jego konfiguracji i w tym przypadku winien on pracowac jako timer.
Trzecia sprawa to: konzystencja programu a wszczególności 'adresowanie' peryferiów.
Jeżeli zdecydowałeś ze Timer0 ma wykonywać pewne zadanie, to późniejsze instrukcje winny być kierowane do niego a nie do Timer1 (zapewne nie skorygowane kopiowane fragmenty).
Jak ja bym to widział:
Zastosowanie innego processora dającego wiekszą swobodę w doborze taktowania np: ATtiny25/45, ATtiny 2313, ATMega8, etc.
Wybierasz taktowanie: Z zasady jest dowolne, ale od tego wyboru będą zależały dalsze parametry jak: prescaler, graniczne wartości dla instrukcji warunkowych oraz dokładność pomiaru czasu. Możesz wybrać zarówno Timer0 (8 bit) jak i wygodniejszy Timer1 (16 bit). Ten ostatni w pewnych sytuacjach może sprawiać wrażenie że jest dokładniejszy(?!...). Wybór wymaga pewnej (nie wielkiej) optymalizacji.
Przyjąłeś powiedzmy: 8Mhz i prescaler =64 co daje rozdzielczość 8 microsec.
Twoje wartości trwania impulsu dla granicznych położeń serva wynoszą:
-1.25 msec
-1.50 msec
-1.75 msec
Dla tch przewidywanych paramtrów potrzebujesz określić (w uprostrzeniu (!)) ilość zliczonych taktów timera biorąc pod uwagę rozdzielczość.
Zauważ że te wyżej, wartości są
graniczne i w twoim przykładzie raczej tak dokładnie nie wystąpią, zatem potrzebujesz operować pewnymi zakresami czasów zamiast odpowiednikami wyliczonych wartości granicznych.
Twoje założenia też nie przewidują określenia dokładnie kątowego położenia serva a jedynie kierunek wychylenia.
Zatem wykorzystując Timer0; twoje wyliczone graniczne odczyty bedą:
-1.25 msec....... = 156 ticks;
-1.50 msec....... = 187 ticks
-1.75 msec....... = 218 ticks
Mając na uwadze powyższe założenia, interpetacja pomiaru będzie zawarta w instrukcjach warunkowych:
Jeżeli odczytany wynik: 156 <= A < 186 ; -zapal diodę 'R' ;(wychylenie w lewo)_
Jeżeli odczytany wynik: 185< A < 190 ; -zapal diodę 'G' ; (położenie neutralne ~)
Jeżeli odczytany wynik: 189< A =< 218 ; -zapal diodę 'Y' ;(wychył w prawo)
Wygląda to na tutorial; niemniej jednak potrzebujesz troche zrobić sam.
Spróbuj teraz we własnym zakresie :
Użyj Attiny 2313 lub mega8 ; Timer1 z prescalerem = 8............
e marcus