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

Werwolf
-
-
Posty:5
Rejestracja:10 maja 2003, o 19:45
Przyciski na INT'ach

Postautor: Werwolf » 30 kwie 2004, o 06:33

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

GasM
-
-
Posty:92
Rejestracja:4 lut 2004, o 11:57

Postautor: GasM » 30 kwie 2004, o 07:23

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.

Werwolf
-
-
Posty:5
Rejestracja:10 maja 2003, o 19:45

Przerwania i LCD

Postautor: Werwolf » 30 kwie 2004, o 07:50

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

GasM
-
-
Posty:92
Rejestracja:4 lut 2004, o 11:57

Postautor: GasM » 30 kwie 2004, o 10:51

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!!!

Werwolf
-
-
Posty:5
Rejestracja:10 maja 2003, o 19:45

Postautor: Werwolf » 30 kwie 2004, o 11:35

No cóż kilka pomiarów analogowych po SPI, konwersja i przeliczanie i takie tam. W każdym bądź razie przyznasz że denerwujące jest jak naciskasz przycisk i musisz czekać na reakcję jakiś czas (powiedzmy 1sek)!!!???
Dzięki za podpowiedź przez weekend sprawdzę

WERWOLF

GasM
-
-
Posty:92
Rejestracja:4 lut 2004, o 11:57

Postautor: GasM » 30 kwie 2004, o 12:52

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.

Werwolf
-
-
Posty:5
Rejestracja:10 maja 2003, o 19:45

Postautor: Werwolf » 4 maja 2004, o 05:02

Witam!

Cóż dwa procki to jest rozwiązanie ale niestety płyteczka już zrobiona, finanse też nie za bogate (robię to dla kumpli), a poza tym już sobie prawie poradziłem, program (w zasadzie przyciski) działa prawie że idealnie.

Dzięki
WERWOLF

Guru
-
-
Posty:250
Rejestracja:30 cze 2003, o 13:26
Lokalizacja:Kraków

Postautor: Guru » 4 maja 2004, o 05:59

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 puœcił 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ę domyœlam w twoim rozwišzaniu ten problem wystšpi.
Myœlę że trzeba to zrobić tak:
- zrobić pętlę która sprawdza na bieżšco stan klawiatury, gdy zdetektowano i upewniono się że naciœnięto przycisk to co pewien czas okreœlony przez pętlę wewnętrznš aktualizować dane wprowadzone z klawiatury oraz wyœwietlać je na wyœwietlaczu gdy naciœnięty przycisk
- przerwanie z licznika T0, które to dokonuje pomiaru np. temperatury oraz wyœwietleniem tego na wyœwietlaczu

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 40 gości