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
[51] wykrywanie dowolnego zbocza
May 18, 2005
23 Replies
asemblera 51 nie znam, ale tak w pseudokodzie:
mov R1,port_1 gugu: mov R2,port_1 cmp R2,R1 beq gugu
Waldek
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
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.
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
Standardowa 51 przerwanie wykrywa tylko przerwania na opadajacym zboczu. Najprosciej podac sygnal na INT0 i zanegowany na INT1 i oba wejscia ustawic na wykrywanie (opadajacego) zbocza. TG
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.
Ja zazwyczaj robiê to poprzez szeregowy wpis stanu portu do najm³odszego bitu w bajcie i przesuwanie tego bajtu w lewo. Jezeli 8 kolejnych odczytow jest takich samych to albo masz w bajcie 00000000 albo 11111111. A przy zmianie to wiadomo. Dodatkowo dzia³a to jako filtr przeciw zak³óceniowy. Mo¿esz te¿ badaæ dwa najm³odze bity w tym bajcie poprzez ich maskowanie itp.
Pzdr megaraptor
Mariusz Dybiec napisał(a):
gorzej jak w trakcie obsługi przerwania zmieni się stan.
w.
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.
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)
*** UWAGA: ODPOWIADAM TYLKO Z ADRESU: pavel(malpa)klub/chip/pl (Wszystko
co piszesz na "odpowiedz", czyli na opajak(malpa)op.pl, jest kasowane)
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
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
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
Nie o to chodzi. Poczatek i koniec impulsu wykrywasz JB/JNB, ale dzieki bramkowaniu odczytujesz z timera _dokladna_ dlugosc impulsu. TG
A mo¿e rozwi±zanie radykalne: zamieñ 51 na jaki¶ _porz±dny_ mikrokontroler. W AVR-ku mo¿esz sobie ustawiaæ zbocze wyzwalaj±ce.
Pozdrawiam Piotr Wyderski
Nie na każdym wejściu przerywającym. A może od razu ARM? :)
A o którym modelu mówisz? Bo wszystkie stosowane przeze mnie chipy (2313, 8515 i 8535) na to pozwala³y.
Jak szaleæ, to szaleæ: Stratix II. :-)
Pozdrawiam 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.
Nie u¿ywa³em meg, ceny Cyclone a ATmega128 zachêcaj± do zakupu tego pierwszego.
Pozwala³, cytat z datasheetu:
". Bit 7 - INT1: External Interrupt Request 1 Enable When the INT1 bit is set (one) and the I-bit in the Status Register (SREG) is set (one), the external pin interrupt is enabled. The Interrupt Sense Control1 bits 1/0 (ISC11 and ISC10) in the MCU general Control Register (MCUCR) define whether the external _interrupt is activated on rising or falling edge of the INT1 pin or level sensed_."
A zw³aszcza tabelka:
". Bits 3, 2 - ISC11, ISC10: Interrupt Sense Control 1 Bits 1 and 0 The External Interrupt 1 is activated by the external pin INT1 if the SREG I-flag and the corresponding interrupt mask in the GIMSK is set. The level and edges on the external INT1 pin that activate the interrupt are defined in Table 9. Table 9. Interrupt 1 Sense Control ISC11 ISC10 Description
0 0 The low level of INT1 generates an interrupt request. 0 1 Reserved 1 0 The falling edge of INT1 generates an interrupt request. 1 1 The rising edge of INT1 generates an interrupt request."Podkre¶lenie moje. I tak samo z drugim wej¶ciem przerwañ zewnêtrznych.
Pozdrawiam Piotr Wyderski
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required