bascom i rozpoznawanie szerokosci impulsu

Apr 04, 2007 8 Replies

Witam chce zrobiæ prosty dekoder który bêdzie rozpoznawa³ szeroko¶æ impulsu od 1 s do 2ms . W zale¿no¶ci od szeroko¶ci bêdzie na pinie 1 lub 0 . Szeroko¶æ podzielona na jedna lub 2 strefy 1 do 1,5 = 0 i 1,5 do 2 ms . Czas pomiaru jakie¶ 0,25 s .Chcia³bym to zrobiæ na ATTiny 12 Marek S



Użytkownik Marek S napisał:

Witam Widzę tu jakieś zastosowania modelarskie ;-) Nie znam Bascoma, ale można skorzystać tu z licznika TIMER0. Ustawić preskaler na taktowanie licznika sygnałem o częstotliwości ok

100kHz (T~10us). Poczekać na narastające zbocze impulsu (można w przerwaniu INT0), odczytać i zapamiętać TCNT0. Poczekać na opadające zbocze impulsu, odczytać TCNT0 i odjąć poprzednią wartość. Masz w ten sposób pomiar czasu impulsu z dokładnością do 10us (co daje 100 kroków w przedziale od 1..2ms)

Pozdrawiam Grzegorz

Z jakiego ¼ród³a pochodz± te sygna³y 0 i 1?? Jak bardzo s± dok³adne?? Ja proponujê zmieniæ ich szeroko¶æ, ¿eby mieæ pewn± tolerancjê: powiedzmy od 1 do 1,25ms to 0, od 1,75 do 2ms to 1. Teraz robisz tak:

-zauwa¿asz pocz±tek impulsu (np. przerwaniem)

- czekasz jakies 1,5ms i sprawdzasz, czy dalej jest impuls - jak tak, to znaczy ¿e jest to "1", jak nie, to "0". Jest to najrpstszy sposób realizacji tego zagadnienia, ale mo¿e wystarczy :).... . Oczekiwanie mo¿esz zrobiæ na timerze albo waitms / waitus <- nie potrzeba du¿ej dok³adno¶ci... Je¶li nie zmienisz tych stref, to bêdzie problem, bo np. 1,499ms to 0 a 1,501ms to juz 1, czyli musisz zmierzyc czas z rozdzielczoscia 0,002ms... w moim rozwiazaniu wystarczy Ci rozdzielczosc pomiaru rzedu 0,5ms.

Pozdrawiam Konop

witam tak to ma byæ prze³±cznik modelarski . Niestety znam trochê bascoma ale jak widzê to na tym procku nie bardzo wiem jak to napisaæ Marek S

Witam nie wiem jak uruchomiæ timer0 z pinu PB3, nie mogê zadeklarowaæ ¿adnej zmiennej tak ¿eby zmieniæ stan wyj¶cia 0 lub 1 chyba to wszystko co na razie nie wiem Marek S

'projekt przelacznika na at tiny 12 'wejscie PB3 wyjscie PB2 oscylator 2 MHz wewnetrzny $regfile = "at12def.dat" $crystal = 2000000 Config Pinb.3 = Input Config Pinb.2 = Output Config Timer0 = Timer , Prescale = 256 'wartosc pocztkowa timer0 244 to daje 1,53 sek Enable Timer0 Enable Interrupts Timer0 = 244 Waitms 150

U¿ytkownik "Marek S" snipped-for-privacy@op.pl napisa³ w wiadomo¶ci news:ev0ra8$icf$ snipped-for-privacy@nemesis.news.tpi.pl...

Uruchomic mozna go tak

If pind.3 = 1 Then 'je¿eli impuls wywola 1 na pinie to start timer0 'wystartuje timer0 end if

Witam na razie tyle wypoci³em gdyby to by³ inny procesor mo¿e by³o by mi ³atwiej . Attiny w bascomie nie przyjmuje deklaracji zmiennych pomocniczych Marek S 'projekt przelacznika na at tiny 12 'wejscie PB3 wyjscie PB2 oscylator 2 MHz wewnetrzny 'program powinien wystartowac timer0 i odliczyc 1,5 ms poczekac 'czy pojawi sie nastepny impuls jak sie pojawi to podac na wyjscie 1 jak nie to 0 '$sim $regfile = "at12def.dat" $crystal = 2000000 Config Pinb.3 = Input Config Pinb.2 = Output Config Int0 = Rising 'wyzwolenie timera0 z zbocza narastajacego Config Timer0 = Timer , Prescale = 256 'wartosc pocztkowa timer0 216 co przerwanie wystepuje co 150 ms Do On Timer0 Alias Pinb.3 Enable Interrupts Timer0 = 244 'tu nie wiem jak napisac procedure sprawdzenia 'czy pojawil sie nastepny impuls i zmiany 'stanu wyjscia Waitms 150

Disable Timer0 Timer0 = 0 Loop

U¿ytkownik "Marek S" snipped-for-privacy@op.pl napisa³ w wiadomo¶ci

Ja bym to zrobil na watchdog-u... jezeli w czasie watch doga nie pojawi sie drugi impuls znaczy sie ze trwal krocej niz 1,5s i program sie zresetuje wystawiajac przy tym 0 jezeli pojawil sie drugi impuls to wystawi 1 i wyzeruje watchdog-a

Witam na razie to na dzi¶ wymordowa³em :( ale jakby dobraæ warto¶ci czasu przerwania to mo¿e by mo¿na zastosowaæ np. uk³ad pracuj±cy na 2 pinach czyli je¶li impuls jest od 1-1,2 ms to 0 od 1,2 do 1,4 ms to 1 np. pin 2 ,a powy¿ej to na pin 4 czyli 2 pozycje wyj¶æ . Marek S

'projekt przelacznika na at tiny 12 'wejscie PB3 wyjscie PB2 oscylator 2 MHz wewnetrzny 'program powinien wystartowac timer0 i odliczyc 1,5 ms poczekac 'czy pojawi sie nastepny impuls jak sie pojawi to podac na wyjscie 1 jak nie to 0 $sim $regfile = "at12def.dat" $crystal = 2000000 Config Pinb.3 = Input Config Pinb.2 = Output Config Int0 = Rising 'wyzwolenie timera0 z zbocza narastajacego Config Timer0 = Timer , Prescale = 256 'wartosc pocztkowa timer0 216 co przerwanie wystepuje co 10 us Do On Timer0 Alias Pinb.3 Enable Interrupts Timer0 = 244 'tu nie wiem jak napisac procedure sprawdzenia 'czy pojawil sie nastepny impuls i czy dobra jest procedura zmiany 'wyjscia

If Timer0 = 122 Then Set Pinb.2 Waitms 10 'If Timer0 = 200 Then Reset Pinb.2 Waitms 50 Disable Timer0 Timer0 = 0 Loop

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required