[51] wykrywanie dowolnego zbocza

Powitanko, O ile wykrycie narastajacego ALBO opadajcego zbocza jest banalne, 2 linijki w asm, to zapetlilem sie nad problemem jak rozpoznac dowolne zbocze (czyli zmiane stanu 1 linni portu, bez wzgledu na to, w ktora strone). Poratuje ktos pomyslem idei?:-) Pozdroofka, Pawel Chorzempa

Reply to
Pawel "O'Pajak
Loading thread data ...

asemblera 51 nie znam, ale tak w pseudokodzie:

mov R1,port_1 gugu: mov R2,port_1 cmp R2,R1 beq gugu

Waldek

Reply to
Waldemar Krzok

Powitanko,

Cos w tym rodzaju kombinowalem, tylko, ze jesli zmiana nastapi np w trakcie porownywania r1 i r2, to kicha:-( Wykryje tylko zmiany pomiedzy kolejnymi "mov"... Pozdroofka, Pawel Chorzempa

Reply to
Pawel "O'Pajak

Oczywiście można odczytywać port i porównywać z poprzednim odczytem. Tylko albo to będzie powolne albo zużyjesz całą moc. Można to zrobić na wejściu przerwania. Przy starcie procka ustaw przerwanie na stan przeciwny niż widzi port. W obsłudze przerwania zmieniasz na odwrotny.

Reply to
Mariusz Dybiec

opóźnienie zawsze będzie. A to cmp złapie wtedy za następnym przejściem. Nie wykryjesz, jak między mov-ami masz przejście 0-1-0 lub 1-0-1. Ten podany kod to oczywiście jeden "szczał", dalej musi być mov R1,R2 (albo neg R1) i możesz szukać dalej. Jak chcesz szybciej, to tylko układ różniczkujący na wejściu przerwania może pomóc.

Waldek

Reply to
Waldemar Krzok
Reply to
invalid unparseable

No tak już zapomniałem jak jest w czystym 51. W C535 starsze wejścia: INT2 i INT3 można programować na zbocze opadające lub narastające.

Reply to
Mariusz Dybiec

Mariusz Dybiec napisał(a):

gorzej jak w trakcie obsługi przerwania zmieni się stan.

w.

Reply to
Wojtek Kaniewski

Gdyby był wyzwalany stanem a nie zboczem to wychodząc z przerwania natychmiast zareagowałby na następne. Ale to akurat teoretyzowanie bo faktycznie nie ma możliwości zmiany na wyzwalanie wysokim.

Reply to
Mariusz Dybiec

Powitanko, Wielkie dzieki wszystkim za rady. Ukladzik, ktory cwicze bedzie badal czas trwania impulsu i odpowiednio to obrabial. Zbocza nie beda czesciej niz co 200uS, wiec czasu jest duzo i nie trzeba przerwan. Rozwiazanie w mieszance asm/bascom, moze komus sie przyda: Dim Flag As Bit Pocz: jnb p3.3,petl0 jb p3.3,petl1

!petl0: jnb p3.3,petl0 Flag = 1 Gosub Obs1

!petl1: jb p3.3,petl1 Flag = 1 Gosub Obs1 Goto Pocz

Obs1: If Flag = 1 Then P3.7 = 0 Waitms 5 P3.7 = 1 Flag = 0 End If Return

Pozdroofka, Pawel Chorzempa

--
"-Tato, po czym poznaæ ma³± szkodliwo¶æ spo³eczn±?
-Po wielkiej szkodzie prywatnej" (kopyrajt: S.  Mro¿ek)
 Click to see the full signature
Reply to
Pawel "O'Pajak"

Hej,

Ja podrzuce idee magicznej funkcji : XOR. wynik xora dla dwoch takich samych bitow jest 0, a roznych 1. Wystarczy wiec xorowac wartosc poprzednia z obecna i jak jest 1 to znaczy, ze sa rozne.

Mozesz czytac caly port do bufora i xorowac od razu cale bajty, bedziesz mial maske bitowa tego, co sie zmienilo. (a to mozna przesunieciem cyklicznym przez CY i od razu skakac gdzie trzeba... ale nie rozpedzajmy sie :).

Pozdrawiam

-- Piotr Nabielec

formatting link

Reply to
Piotr Nabielec

Zwykle do tego celu wykorzystywa³o siê wej¶cia INT0/INT1 w trybie bramkowania zegara timerów T0/T1... Czy w programie przewidzia³e¶ sytuacjê ¿e impuls siê nie pojawi lub pojawi siê i bêdzie za d³ugi albo... w ogóle nie zniknie? TG

Reply to
Tomasz Gumny

Powitanko,

Odpalac timer mozna tez inaczej, flaga. Inty sa niestety na falling edge, a ja musze reagowac takze na narastajace...

Wlasnie do tego chce wykorzystac przerwanie od timera. W obsludze bedzie wyskok z petli glownej. Pozdroofka, Pawel Chorzempa

Reply to
Pawel "O'Pajak
Reply to
invalid unparseable
Reply to
Piotr Wyderski

Nie na każdym wejściu przerywającym. A może od razu ARM? :)

Reply to
Adam Dybkowski
Reply to
Piotr Wyderski

Na przykład ATmega128: na pinach INT4..7 można wybrać wyzwalanie dowolnym zboczem a na pinach INT0..3 tylko wyzwalanie rosnącym/malejącym/niskim poziomem. Nie mam pojęcia, dlaczego na tym zaoszczędzili kilka tranzystorów. A mowa w wątku była o wyzwalaniu _dowolnym_ zboczem bez ciągłego przeprogramowywania rosnącym/malejącym/rosnącym... BTW: AT90S8535 w ogóle nie pozwalał na wyzwalanie dowolnym zboczem.

Reply to
Adam Dybkowski
Reply to
Piotr Wyderski

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.