logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak zrobić nieblokującą procedurę klawiatury PC w BASCOM dla AT89S52?

sho 28 Wrz 2004 19:12 3617 16
REKLAMA
  • #1 880312
    sho
    Poziom 11  
    Posty: 23
    Mam podlaczona klawiaturke do AT89S52. Clk do INT1 a Dta do T0.
    Mam procedurke do odbioru kodu klawisza (z reszta znalazlem na tym forum). Wszystko dziala ok gdyby nie to ze procedurka jest blokujaca a chodzi mi o to aby nie byla. Probuje zrobic to od paru dni ale bezskutecznie. Jesli jest tu jakis guru BASCOMA :) to prosze o pomoc. Chce przerobic ta procedurke aby gdy przycisk byl nacisniety wywolywane jest przerwanei mojego procka i wywolywana procedurka odbierajaca. Ale jak juz wczesniej napisalem zabardzo mi to nie wychodzi.
    Z gory dzieki za pomoc
  • REKLAMA
  • #2 880492
    wisiena
    Poziom 18  
    Posty: 223
    Pomógł: 21
    Ocena: 5
    Witam !!!!
    Niestety nie widziałem tej procedury (może wstawisz ją tutaj) ale na pewno zwraca ona odebrany klawisz. Jest też w niej pewnie jakiś warunek którego niespełnienie każa czekać procedurce dalej (ponownie sprawdzać). Możesz do tego if'a dodać elsa i zwracać np -1. Najlepiej jednak bedzie jak wyślesz mi ją to poprawimy.
    Pozdrawiam (M.)
  • #3 880729
    sho
    Poziom 11  
    Posty: 23
    Ok a wiec wstawiam plik z procedurka w bascomie..
    Załączniki:
    • Klawiatura.txt (1.09 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #4 880762
    wisiena
    Poziom 18  
    Posty: 223
    Pomógł: 21
    Ocena: 5
    Witaj !!!
    Nie pisałem już pare lat w Bascomie. Powiedz mi czy Bitwait to Twoja procedura czy wbudoana. To ona powoduje blokowanie. Jeżeli jest Twoja to ją doślij, jeżeli Bascoma to trzeba będzie to inaczej napisać.

    Pozdrawiam (M.)
  • #5 880774
    sho
    Poziom 11  
    Posty: 23
    Bitwait jest z Bascoma
  • REKLAMA
  • #6 880849
    Robot_
    Poziom 18  
    Posty: 277
    Pomógł: 22
    Witam,
    Z BASCOM'A nie jest za dobry, ale z tego co widze to ta procedura nigdy nie odbierze poprawnego znaku zawsze bedzie FF. Ddzieje się tak dlatego ponieważ reaguje ona na zegar a nie na dane. W załączniku przesyłam opis transmisji.
    Pozdrawiam
    Załączniki:
    • keyb.zip (49.99 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #7 880877
    sho
    Poziom 11  
    Posty: 23
    Ale ona dziala bardzo dobrze :) tyle ze wlasnei przez ten bitwait blokuje mi reszte programu i np gdy chce odswierzyc pomiar temperatury z dsa to musze wciskac przyciski co jest bezsensu.
  • #8 880883
    Robot_
    Poziom 18  
    Posty: 277
    Pomógł: 22
    Witam,
    sorki za drugi post, ale znalazłem sample do obsługi klawiatury PC. Sample są dla AVR'a dla '51 nie znalazłem, podaje link i dołączam plik.
    http://www.mcselec.com/download/avr/samples.zip
    Pozdrawiam
    Załączniki:
    • samples(1).zip (174.48 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #9 880948
    Robot_
    Poziom 18  
    Posty: 277
    Pomógł: 22
    Witam,
    Chyba mam rozwiązanie, ale uprzedzam z góry że ma pewną wade, mianowicie według standardu zegar typowo zawiera się w przedziale 20-30 kHz i żeby nie zgubić znaku musisz próbkować linie kbdClk odpowiednio często np. w przerwaniu. Postaram się wymyślić coś bardziej eleganckiego.
    Pozdrawiam
    Załączniki:
    • Klawiatura_zmod.zip (373 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • #10 881220
    wisiena
    Poziom 18  
    Posty: 223
    Pomógł: 21
    Ocena: 5
    Witam !!!
    Zainstalowałem specjalnie BASCOM'a i stwierdzam, że trzeba to napisać od nowa. Najlepiej będzie Clk klawiatury wpakować na przerwanie zewnętrzne typu "any change". Kiedy clock wyzwoli przerwanie, sprawdzasz w petli dane i po sprawie.

    (M.)
  • #11 882056
    Robot_
    Poziom 18  
    Posty: 277
    Pomógł: 22
    wisiena napisał:
    Witam !!!
    Zainstalowałem specjalnie BASCOM'a i stwierdzam, że trzeba to napisać od nowa. Najlepiej będzie Clk klawiatury wpakować na przerwanie zewnętrzne typu "any change". Kiedy clock wyzwoli przerwanie, sprawdzasz w petli dane i po sprawie.

    (M.)

    Witam, masz racje, że trzeba to włożyć do przerwania, ale nie trzeba pisać tego od nowa. Dzisiaj poprawiłem programik. Zaznaczam jednak, że nie mam zainstalowanego kompilatora więc nie ręcze, ze program nie ma błędów. pisałem to opierając się na helpie. powodzenia w uruchamianiu.
    Pozdrawiam.
    Załączniki:
    • Klawiatura_zmod2.zip (496 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • #12 882149
    sho
    Poziom 11  
    Posty: 23
    Dzieki Robot_ za procedurke. Po malej zmianie dziala calkiem dobrze.
    Ale np niekiedy wogole nie jest wywolywane te przerwanie, a niekiedy za kazdym razem. Czym to moze byc spowodowane ?
  • #13 882168
    Robot_
    Poziom 18  
    Posty: 277
    Pomógł: 22
    Witam
    Jesli mozesz podeslij mi caly program albo na forum albo mail'a, może występuje gdzieś konflikt zasobów. procedurka wygląda wporządku.
    Pozdrawiam
  • #14 882542
    sho
    Poziom 11  
    Posty: 23
    Wystawiam tutaj. Nie jest to jakis super kod :)
    Załączniki:
    • Projekt.BAS.txt (3.11 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #15 882589
    Robot_
    Poziom 18  
    Posty: 277
    Pomógł: 22
    Witam,
    spróbuj teraz przeniosłem procedurke odczytu bezpośrednio do przerwania, według mnie to czekanie sekundy i wyświetlanie było powodem problemów. Jeszcze jedno po co czekasz sekunde w obsłudze Menutemperatury?.
    Pozdrawiam
    Załączniki:
    • Projekt_zmod.zip (877 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • #16 883003
    sho
    Poziom 11  
    Posty: 23
    Twoja zmiana niestety nie pomogla ale juz wiem co jest nie tak. Wypisalem sobie na lcd kbd_klawisz i niezgadzaja sie scancody klawiszy,
    wychodzi na to ze jest jakis blad w transmisji i raz dziala a raz nie. Waita musialem dodac bo nie nadazalem z odczytaniem czegokolwiek. Zbyt szybko lcd sie odswiezal i byl efekt migotania.
  • #17 883096
    Robot_
    Poziom 18  
    Posty: 277
    Pomógł: 22
    Juz wiem czemu sie tak dzieje, poniewaz cala procedurka dziala na 8 bitach i dopóki były same instrukcje BitWait nie było problemu ponieważ on tylko tyle szczytywał, teraz mamy inną sytuacje ponieważ zbocze opadające przy włączonym przerwaniu uruchamia ponownie odczyt klawisza. Spróbuj po ostatniej instrukcji BitWait KbdClk , Set dać instrukcje Waitms 1 powinno pomóc jeśli nie spróbuj zwiększyć czas opóżnienia pamiętaj tylko żeby ten czas był zanim włączysz przerwania.
    Pozdrawiam

    Dodano 30-09-2004
    Zapominiałem jeszce o jednym, po naciśnięciu klawisza wysylany jest jego kod, następnie po zwolnieniu pojawia się kolejny informujący o zwolnieniu, więc instrukcja Wait musi byc na tyle długa, żeby ten kod nie wywołał ponownie przerwania ponieważ wtedy obierzesz zły znak, po zwolnieniu wysyłany jest kod F0 i kod klawisz który puściłeś. więc możliwe że uaktywniło się przerwanie, gdy wysyłany był kod zwolnienia klawisza.

Podsumowanie tematu

✨ Dyskusja dotyczy implementacji nieblokującej procedury obsługi klawiatury PC podłączonej do mikrokontrolera AT89S52 w języku BASCOM. Problemem jest blokujące działanie funkcji BitWait, która powoduje zatrzymanie programu podczas odbioru kodu klawisza. Proponowane rozwiązania obejmują przeniesienie obsługi sygnału zegara klawiatury (Clk) do przerwania zewnętrznego (INT1) typu "any change", co pozwala na asynchroniczne odczytywanie danych bez zatrzymywania głównego programu. Wskazano, że procedura powinna reagować na zbocze zegara i w przerwaniu odczytywać stan linii danych (Dta). Zwrócono uwagę na konieczność odpowiedniego opóźnienia (np. Waitms 1) po odczycie, aby uniknąć wielokrotnego wywoływania przerwania spowodowanego kodem zwolnienia klawisza (kod F0). Dyskutowano również o problemach z poprawnym odczytem kodów skanowania (scancodes) i konieczności synchronizacji odczytu z sygnałem zegara. Przykłady i fragmenty kodu były modyfikowane i testowane, a także udostępniono próbki kodu dla AVR, które mogą być inspiracją do implementacji dla '51. Ostatecznie rekomendowane jest wykorzystanie przerwań do obsługi klawiatury, eliminując blokujące funkcje i poprawiając responsywność programu, np. przy jednoczesnym odświeżaniu pomiarów temperatury z czujnika DSA.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA