Witam!
Mam pytanko, czy ktoś z kolegów robił przyciski podłączane i obsługiwane przez przerwania INT0 i INT1?
Mam program który sobie coś robi i chciałem zwiększać bądź zmniejszać powiedzmy zmienną Licznik przez naciśnięcie przycisków dołączonych do wejść INT0 i INT1 (żeby naciśnięcie przycisku było wykrywane od razy i inkrementacja czy dekrementacja Licznika następowała od razu, a wartość Licznik wyświetlana była na LCD, na którym normalnie wyświetlane są inne zmnienne). Udało mi się zrobić tak że po jednokrotnym naciśnięciu zmienna licznik jest zwiększana bądź zmniejszana o jakąś wartość i jak nie trzeba czyścić wyświetlacza (używam spacji) to wszystko jest OK, ale jak w obsłudze przerwania dam czyszczenie i wyświetlanie to już lipa. A chciałem jeszcze zrobić tak żeby po jednokrotnym naciśnięciu licznik zwiększył się ale po naciśnięciu i trzymaniu przycisku licznik ziększał swoją wartość o jakąś wartość co powiedzmy 100msek (tak jak to jest robione w wielu urządzeniach).
Może ktoś mi pomóc w tej sprawie???
Preferuję wszelkiego rodzaju działające i sprawdzone programiki, lub procedurki.
Pozdrawiam
WERWOLF
Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięPrzyciski na INT'ach
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
nigdy nierób obsługi wyświetlacza na przerwaniach, niech ci tylko przyciski zwiększają/zmniejszają wartość a obsługe wyświetlacza tylko w głównym programie.
Jaja się robią bo uC musi przesłać dane do LCD a to trochę trwa. Przerwanie musi zajmować jak najmniej czasu procesorowi, inaczej traci sens swojej nazwy.
Jaja się robią bo uC musi przesłać dane do LCD a to trochę trwa. Przerwanie musi zajmować jak najmniej czasu procesorowi, inaczej traci sens swojej nazwy.
Przerwania i LCD
Wszystko się zgadza tylko że ja mam wyświetlacz 16x2 który w programie głównym wyświetla stale wartości temperatury (zapełniony jest cały), dlatego w przerwaniu ma być wyświetlana wartość temperatury nastawionej.
Po wejściu do procedury obsługi przerwania wyłączam przerwanie INT0 zwiększam wartość wyświetlam ją sprawdzam czy przycisk jest wciśnięty, jak jest to zwiększam w pętli do loop jak przycisk zwalniam to wychodzę z procedury wcześniej załączając przewranie INT0.
Ogólnie to działa jak nie ma tej pętli do loop, bo jak ona jest to program głupieje.
Zasadniczo to chciałem zrobić coś takiego:
Mierzę sobie cztery temperatury a ich wartości wyświetlam na LCD , jeżeli wartość danejh temperatury jest większa niż nastawiona to ustawia mi któryś port w "1". No a ponieważ nie chciałem się denerwować i czekać aż program dojdzie do momentu obsługi przycisku zwiększającego wartość nastawy, dołączyłem go do INT0 i obsługuję go w przerwaniu.
A ma on działać ta że po naciśnięciu ma zwiększyć nastawę tylko o 1, ale jak przytrzymam go dłużej to ma zwiększać wartość nastawy cyklicznie co 100ms o jeden aż do momentu puszczenia przycisku.
No i tu jest problem JAK TO ZROBIĆ
Wszelka pomoc mile widziana.
WERWOLF
Po wejściu do procedury obsługi przerwania wyłączam przerwanie INT0 zwiększam wartość wyświetlam ją sprawdzam czy przycisk jest wciśnięty, jak jest to zwiększam w pętli do loop jak przycisk zwalniam to wychodzę z procedury wcześniej załączając przewranie INT0.
Ogólnie to działa jak nie ma tej pętli do loop, bo jak ona jest to program głupieje.
Zasadniczo to chciałem zrobić coś takiego:
Mierzę sobie cztery temperatury a ich wartości wyświetlam na LCD , jeżeli wartość danejh temperatury jest większa niż nastawiona to ustawia mi któryś port w "1". No a ponieważ nie chciałem się denerwować i czekać aż program dojdzie do momentu obsługi przycisku zwiększającego wartość nastawy, dołączyłem go do INT0 i obsługuję go w przerwaniu.
A ma on działać ta że po naciśnięciu ma zwiększyć nastawę tylko o 1, ale jak przytrzymam go dłużej to ma zwiększać wartość nastawy cyklicznie co 100ms o jeden aż do momentu puszczenia przycisku.
No i tu jest problem JAK TO ZROBIĆ
Wszelka pomoc mile widziana.
WERWOLF
ja bym to tak widział:
1) wykryto przycisk INT0, wchodzę w przerwanie
2) wyłączam INT0, włączam zegar T0
3) wychodze z przerwania bez włączania ponownie przerwania od INT0
4) T0 wchodzi w przerwanie po odliczeniu czasu
5) wyłączam T0, zwiększam o jeden, sprawdzam czy jest przycisk,
- TAK - włączam T0 i wychodzę z przerwania
- NIE - załączam INT0 i wychodzę z przerwania
6) koniec
warunki konieczne: rejestr TCON.0 = 1 (INT0 - przerwanie od opadającego zbocza w 8051)
oczywiście tam wyświetlasz w przerwaniu ALE TEGO NIE POLECAM!!! zajmować na tak długo procka w przerwaniu to GRZECH
nie wiem czym zajmujesz program że niechce ci się czekać w głównym programie aż wyświetli wartśoci ustawiane!!!
1) wykryto przycisk INT0, wchodzę w przerwanie
2) wyłączam INT0, włączam zegar T0
3) wychodze z przerwania bez włączania ponownie przerwania od INT0
4) T0 wchodzi w przerwanie po odliczeniu czasu
5) wyłączam T0, zwiększam o jeden, sprawdzam czy jest przycisk,
- TAK - włączam T0 i wychodzę z przerwania
- NIE - załączam INT0 i wychodzę z przerwania
6) koniec
warunki konieczne: rejestr TCON.0 = 1 (INT0 - przerwanie od opadającego zbocza w 8051)
oczywiście tam wyświetlasz w przerwaniu ALE TEGO NIE POLECAM!!! zajmować na tak długo procka w przerwaniu to GRZECH
nie wiem czym zajmujesz program że niechce ci się czekać w głównym programie aż wyświetli wartśoci ustawiane!!!
Jak by mi tyle czasu zajmowały wyliczenia to bym podzielił to na dwa procki, 1 odczytuje i przelicza i przekazuje wynik do drugiego nadrzędnego, który steruje LCD, przyciskami i czym tam jeszcze chcesz. Może pomyśl nad tym pomysłem, bo może się okazać żę dalsze dołożenie nowych funkcji do programu może być już niemożliwe. No chyba że finanse i/lub zrobiona płytka już to nie umożliwiają.
PS. Postaraj się to wykonać na jednym zegarze, nie bądź rozrzutny.
PS. Postaraj się to wykonać na jednym zegarze, nie bądź rozrzutny.
A może podziel to na 200 procków wtedy będzie to fajniej wyglšdało. A Tak naprawdę to postaraj się uniknšć przerwań przynajmniej ja tak robię, a napewno nie sš one potrzebne do bsługi klawiatury no chyba że co bardzo długo przeliczasz, a w tym czasie chciałby zareagować na przerwanie. Ale policzmy spokojnie:
nie sšdzę aby kto w cišgu 1 cyklu rozkazowego czyli 1 us nacisnšł i pucił przycisk jest to fizycznie nie możliwe musisz dać mu czas. Ja zwykle stosuję opónienie ok 65 536 us. pomiędzy zdetektowaniem stanu 0 a potwierdzeniem tego stanu, eliminujemy tym sposobem drganie zestyków, a jak się domylam w twoim rozwišzaniu ten problem wystšpi.
Mylę że trzeba to zrobić tak:
- zrobić pętlę która sprawdza na bieżšco stan klawiatury, gdy zdetektowano i upewniono się że nacinięto przycisk to co pewien czas okrelony przez pętlę wewnętrznš aktualizować dane wprowadzone z klawiatury oraz wywietlać je na wywietlaczu gdy nacinięty przycisk
- przerwanie z licznika T0, które to dokonuje pomiaru np. temperatury oraz wywietleniem tego na wywietlaczu
nie sšdzę aby kto w cišgu 1 cyklu rozkazowego czyli 1 us nacisnšł i pucił przycisk jest to fizycznie nie możliwe musisz dać mu czas. Ja zwykle stosuję opónienie ok 65 536 us. pomiędzy zdetektowaniem stanu 0 a potwierdzeniem tego stanu, eliminujemy tym sposobem drganie zestyków, a jak się domylam w twoim rozwišzaniu ten problem wystšpi.
Mylę że trzeba to zrobić tak:
- zrobić pętlę która sprawdza na bieżšco stan klawiatury, gdy zdetektowano i upewniono się że nacinięto przycisk to co pewien czas okrelony przez pętlę wewnętrznš aktualizować dane wprowadzone z klawiatury oraz wywietlać je na wywietlaczu gdy nacinięty przycisk
- przerwanie z licznika T0, które to dokonuje pomiaru np. temperatury oraz wywietleniem tego na wywietlaczu
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 46 gości