bascom i rozpoznawanie szerokosci impulsu
Marek S - 04-04-2007 15:45
bascom i rozpoznawanie szerokosci impulsu 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
Grzegorz Kurczyk - 04-04-2007 17:45
Użytkownik Marek S napisał:
> 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
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
Konop - 04-04-2007 19:45
> 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
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
Marek S - 04-04-2007 19:45
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
Marek S - 04-04-2007 20:45
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
jarek - 04-04-2007 22:45
Użytkownik "Marek S" <samochodzik2@op.pl> napisał w wiadomości
news:ev0ra8$icf$1@nemesis.news.tpi.pl...
> 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
Uruchomic mozna go tak
If pind.3 = 1 Then 'jeżeli impuls wywola 1 na pinie to
start timer0 'wystartuje timer0
end if
--
Pozdrawiam Jarek O.
jarek54129(małpa)poczta.fm
jarek - 04-04-2007 23:45
Użytkownik "Marek S" <samochodzik2@op.pl> napisał w wiadomości
> 'tu nie wiem jak
> napisac procedure sprawdzenia
> 'czy pojawil sie
> nastepny impuls i zmiany
> 'stanu wyjscia
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
--
Pozdrawiam Jarek O.
jarek54129(małpa)poczta.fm
Marek S - 04-04-2007 23:45
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
Marek S - 05-04-2007 00:45
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
zanotowane.pldoc.pisz.plpdf.pisz.plkonstruktor.keep.pl