While...wend


Witam,
Chcę podpiąć 4 fototranzystory pod ATmega8 tak, żeby jeden powodował odliczanie timera0, drugi timera1, trzeci zatrzymywał timer0 a czwarty zatrzymywał timer1.

Są tyko dwa wejścia interruptów więc to odpada, powiedziano mi że można użyć instrukcji while...wend i pominąć interrupty. Jak to zrobić? Zależy mi na bardzo dokładnym pomiarze czasu pomiędzy bramkami (chronograf).

Pozdrawiam Paweł




Portret użytkownika matrix

While...wend

Rzuć schematem to coś pomyślimy.

Portret użytkownika Pablo201_5

Pierwotnie miało być

Pierwotnie miało być tak,

póki co jest tak:

Portret użytkownika Pablo201_5

Chciałem użyć interruptów

Chciałem użyć interruptów jako wejścia do foto*rezys/tranzys*torów ale są tylko 2, a ja mam 2 pary bramek, czyli pogrzebałaby by 4 interruptów.

Jedna para bramek- pomiar v chwilowej, druga średniej.

Portret użytkownika Pablo201_5

Jakieś pomysły?

Jakieś pomysły?

Portret użytkownika matrix

Re: While...wend

A może spróbuj wykorzystać ADC? Tak na szybko coś zapodaję bo schemat słabo wyraźnyjest.

Portret użytkownika Pablo201_5

Jak za pomocą ADC chcesz

Jak za pomocą ADC chcesz startować/zerwać timer i ustawiać flagę?

Portret użytkownika matrix

Re: While...wend

To jest jakaś bariera świetlna, tak? Więc sprawdzaj wartość ADC. Jeśli osiągnie pewną wartość to startuj lub zatrzymuj timery. Ot co.

Portret użytkownika Pablo201_5

Mierzony przedział czasu

Mierzony przedział czasu pomiędzy 1 bramką a 2 bramką jest incrementowany odstępami np. co 4 ms (przy prescale = 1 i zegarze 16 MHZ, timer 8 bit) a jaki czas będzie liczony (z jaka dokładnością) jeżeli impuls na 2 bramce wystąpi gdzieś pomiędzy powiedzmy 4 i 5, według rachunku otrzymam czas = 16 ms gdy tymczasem może on być 19 ms.

Muszę mierzyć całkowity czas nie tylko przepełnienia, ale także pozostały czas naliczony przez timer do momentu impulsu z dokładnością do ostatniej microsec.

Portret użytkownika matrix

Re: While...wend

Ale nie zrozumiałeś mojego pomysłu.
Jeśli dajmy na to fototranzystor jest oświetlany na wejściu ADC masz powiedzmy wartość 100. Jeśli wiązka zostanie przerwana to na wejści będziesz miał wartość dużo wyższą czyli na przykład 800. Wystarczy tu warunek if wartosc_adc >800 then

Mogę się mylić bo to tak na szybko pomyślane bez głębszych przemyśleń.