Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Mega32][Bascom] zegarek LED a przygasanie wyświetlacza podczas obsługi klawiszy

19 Cze 2012 22:51 2756 29
  • Poziom 16  
    Witam.

    Napisałem taki oto kod:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Program generalnie działa, ale naciśnięcie klawisza powoduje chwilowe przygaśnięcie wyświetlacza, bo program wisi w podprogramie obsługi klawisza. Jest na to jakies lepsze rozwiązanie? Może obsługa klawiszy w przerwaniach?

    Bardzo proszę o jakiekolwiek sugestie. Nie oczekuję gotowego kodu.
  • Poziom 39  
    Skoro przerwanie przemiata wyświetlacz co 4,096ms to może też przemiatać klawisze i analizować ich stan, kolejkując kilka odczytów (np. 5, czy 6) i analizować zmiany stanów - taki debouncing przyrostowo-wagowy zrobiony generalnie z tablicy zapętlonej w bufor typu "pierwszy wchodzi, ostatni wychodzi" oraz z licznika niskich stanów.
  • Poziom 27  
    Ogólnie Debounce wprowadza opóźnienia.
    Spróbuj na początku wpisać:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    i sprawdź co się dzieje.

    Dodano po 1 [minuty]:

    I po co ci Waitus 200?
  • Poziom 16  
    Debounce nie wprowadza migotania wyświetlacza w moim programie. Proszę zerknąć na podprogramy obsługi klawiszy - są w niej pętle, które nie pozwalają na powrót z podprogramu póki klawisz jest naciśnięty. Chciałem w ten sposób uniknąć wielokrotnego odczytu raz naciśniętego klawisza.
  • Poziom 43  
    Wielokrotny odczyt klawisza niczemu nie szkodzi (Nie ma więc sensu go unikać. Chyba że dla samego unikania.).
    Zatrzymywanie programu w pętli już tak.
  • Poziom 27  
    Można też przenieść obsługę klawiszy do pętli głównej, i wywalić debounce.
    Po co stosować debounce i potem zapętlać jeszcze raz program?

    Dodano po 3 [minuty]:

    A poza tym każde DEBOUNCE w standardzie wprowadza 25ms opóźnienia.
    Chyba że zmienimy to poleceniem Config.
  • Poziom 16  
    A więc mam rozumieć, że polecenie debounce zarejestruje naciśnięcie tylko raz nawet w przypadku trzymania tego klawisza w stanie wciśniętym? Jesli tak, pętle w podprogramach mam niepotrzebnie.
  • Poziom 27  
    Cytat:
    polecenie debounce zarejestruje naciśnięcie tylko raz nawet w przypadku trzymania tego klawisza

    TAK.
  • Poziom 16  
    Po usunięciu pętli w podprogramach obsługi klawiszy przygasanie zmniejszyło się o około 90%. Obecnie widzę, że na czas obsługi nacisnięcia wyświetlacz ledwie przygasa. Spróbuję stworzyć obsługę w przerwaniu. Czy mogę w przerwaniu wpakować instrukcję debounce? Wiem, że domyslnie wprowadza 25ms opóźnienia, by wyeliminować drgania styków klawiatury. Wydaje mi się, że takie opóźnienie w obsłudze przerwania będzie miało wpływ na jego dokładność podczas np. czestego korzystania z tychże klawiszy. Idę dobrym torem myślenia?
  • Użytkownik usunął konto  
  • Poziom 16  
    O taką odpowiedź własnie mi chodziło.
    Rodzi sie kolejne pytanie: Skoro timer0 mam już zajęty generowaniem impulsu służącego do naliczania sekund... Mam zaprząc do obsługi wyświetlacza kolejne przerwanie, czy wpakować przełączanie anod, i szukanie odpowiedniej wartości dla portu, na których wiszą katody w tym samym miejscu, co inkrementacja zmiennej A? Nie chcę, by obsługa przerwania była większa od głównej pętli, bo wiem, czym się to skończy - brakiem precyzji zegarka itp.
    Zaprząc do tego odrębny timer?
  • Użytkownik usunął konto  
  • Poziom 16  
    Kupiłem kwarc 16MHZ, 12MHz (pod USB) i zegarkowy, ale nie do końca wiedziałem, czy mogę go podłączyć zamiast obecnego. Mam wlutowany 16, bo początkowo uznałem, że "co za różnica" . Co do Twojego wyjaśnienia... Jeszcze kilka razy to przeczytam i pewnie załapię. W przerwaniu mam mieć sterowanie anodami, a w pętli głównej obsługa katod, czyli segmentów? Oczywiście obsługa katod na podstawie jakiejś zmiennej, która mi powie, że aktualnie obsługa przerwania zaświeciła cyf np.3. Dobrze rozumiem?

    Dodano po 1 [minuty]:

    Jeśłi ustawię fusebity na internal oscilator 8MHz, to timery beda nadal obsługiwane z wykorzystaniem zewnętrznego kwarcu?
  • Użytkownik usunął konto  
  • Poziom 16  
    Bardzo dziękuje za wszelka pomoc. Nie oczekuje gotowych rozwiązań, bo na własnych błedach człowiek najszybciej sie uczy. Anody i katody w przerwaniu - przyjąłem do wiadomości. Obsługa jednym przerwaniem. Proszę jeszcze tylko o krótką odpowiedź odnośnie kwarcu 32768 podłączonego do xtal1 i xtal2 a fusebity ustawione na wewnętrzny oscylator rc

    Dodano po 5 [minuty]:

    Pcb, fakt, jest podła, bo uniwersalna, a zasilacz chyba marnie filtrowany, uC reaguje świrowaniem na włączenie lutownicy właczonej do tego samego gniazda zasilania. Cenna podpowiedź. Postaram się obnizyć taktowanie.
  • Użytkownik usunął konto  
  • Poziom 16  
    Bardzo dziękuję za przedstawienie mechanizmu. Widzę, że muszę się znów douczyć, bo póki co nie potrafie korzystać z z poleceń data i (chyba) read. Jeśli dobrze rozumiem, to:
    Dane zawarte w data mają być na samym końcu programu, po poleceniu End.
    By z nich skorzystać muszę wykonać polecenie restore (etykieta zawierająca dane).
    Czytam dane korzystając z polecenia Read.
    Dobrze to rozumiem?

    Dodano po 4 [minuty]:

    Co do kwarcu: Wlutuję ten 32768, piki mam kupione (2 x 15p). Temat zasilacza przedstawię w innym temacie, by nie robić OT. Wiem, że piszesz w asemblerze, ale może wiesz czy ASSR jest dostępny z poziomu Bascom?

    Dodano po 6 [minuty]:

    Ok, już cokolwiek rozumiem. Mogę użyć takiej składni?:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod
  • Użytkownik usunął konto  
  • Poziom 16  
    Bardzo dziękuję za odpowiedź. Co do składni to był to tylko i wyłącznie przykład wyssany z palca, by wiedzieć czy mogę portowi a przypisać wartość zwracaną innym poleceniem. Oczywiście załatwię to jednym lookup'em. Zajrzę również do noty katalogowej procka. Drążę temat tego zegarka, bo kolega błaga mnie o zrobienie obrotomierza z wyświetlaczem LED do samochodu, a mnie zalezy na tym, by to prawidłowo działało. Lekki offtop: Są wyświetlacze LED wielokolorowe?

    Dodano po 8 [minuty]:

    Według noty katalogowej mam ustawić bit 3 w rejestrze ASSR i wtedy Timer2 będzie taktowany kwarcem podłączonym do pinu TOSC1. Mam rozumieć, że kwarc mam drugą nogą podłaczyć do masy/zasilania?
  • VIP Zasłużony dla elektroda
    Antystatyczny napisał:
    Mam rozumieć, że kwarc mam drugą nogą podłaczyć do masy/zasilania?
    TOSC2
  • Poziom 16  
    Ok, czyli tak jak jego poprzednik, przez piki. Najpierw zmienić fuse bity, by ustawić internal RC oscillator, czy moge od razu wlutować zegarkowy?
  • VIP Zasłużony dla elektroda
    Najbezpieczniej najpierw "przefusować" ;)
  • Poziom 16  
    Zmieniłem fuse'y, teraz piszę nowy kod. Jeśli skończę, jutro go wkleję, by poddać krytyce.
  • Poziom 16  
    Czytam notę katalogową, bo to kopalnia wiedzy. W sekcji dotyczącej timer2 nie jest napisane, ż emam zmienić konfigurację podłączenia kwarcu. Zdziwiło mnie, że napisali jedynie o tym, by wpiąć kwarc do TOSC1, stąd moje pytanie. Standardowe podłączenie jest przez piki i do obu pinów oscylatora. Czytam, naprawdę czytam notę.
  • VIP Zasłużony dla elektroda
    To pozostaje tylko skonfigurować rejestry...
  • Poziom 16  
    Napisałem taki oto kod:
    Kod:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Program się skompilował, ale na wyświetlaczu cisza...
    Jeszcze się temu przyjrzę, ale prosze o jakieś sugestie.

    Dodano po 6 [minuty]:

    dopisałem enable timer0, teraz widzę jakąs tam poświatę pierwszych trzech cyfr na wyświetlaczu. Po raz kolejny zbyt szybko multipleksuję? Jeśli tak, to czy mogę wpakowac w obsługę przerwania komendę wait?

    Dodano po 11 [minuty]:

    teraz jest taki kod:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Teraz program działa, ale wyświetlacz nadal świeci słabo. Dodatkowo martwią mnie te polecenia opóźniające w obsłudze przerwania. Można to zrobić jakoś inaczej? Wyświetlacz świeci słabawo i przy zmianie kąta patrzenia widac jakby migotanie.

    Dodano po 23 [minuty]:

    Jeśli ustawię ASSR= &B00001000, to będę musiał przerzucić obsługe anod na inny port, bo TOSC1 i TOSC2 są na pinach portu C. Własnie się dokładnie wczytałem w notę. Bardzo dziękuje za wszystkie odpowiedzi.
  • Poziom 24  
    Antystatyczny napisał:
    dopisałem enable timer0, teraz widzę jakąs tam poświatę pierwszych trzech cyfr na wyświetlaczu. Po raz kolejny zbyt szybko multipleksuję? Jeśli tak, to czy mogę wpakowac w obsługę przerwania komendę wait?

    Masz mały błąd w podprogramach Anoda0-3, w Anoda0 powinieneś zgasić 4 wyświetlacz i zaświecić 1 , w Anoda1 powinieneś zgasić 1 wyświetlacz i zaświecić 2 itd. Waity nie będą potrzebne. Usuń z przerwania te linie:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod
  • Użytkownik usunął konto  
  • Poziom 16  
    Już analizuję, dziękuję za ten kubeł zimnej wody :D

    Dodano po 5 [minuty]:

    Hmm, a dlaczego zliczanie czasu zostało wywalone do podprogramu? Chodzi o estetykę, czy raczej o prędkość działania i wielkość kodu?

    Dobra, już doczytałem.

    Dodano po 9 [minuty]:

    Co do tych gosub w obsłudze przerwania: Napisałem w ten sposób, bo miałem problem z przypisaniem kilku poleceń do jednego case'a. Teraz widzę, że to był bład składniowy.Początkowo chciałem to zrobić na case'ach bez podprogramów. Polecenia waitus wstawiłem dopiero po tym, gdy się zorientowałem, że wyświetlacz strasznie mizernie świeci, mimo świadomości, że obsługa przerwania ma być jak najkrótsza, bo w tym czasie stoi główna pętla i generalnie wszystko inne.
    Przebuduje układ wedle wskazówek (nie chcę kopiować czyjejś pracy).

    Dodano po 22 [minuty]:

    Oto nowy kod:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Program działa, ale:
    dziesiątki minut świecą jaśniej niż reszta cyfr, pierwsza, druga i czwarta cyfra lekko miga. W cyfrze trzeciej widać duszek segmentu G cyfry drugiej, gdy ten segment jest zaświecony. Kwestia taktowania, czy coś pochrzaniłem w programie? Pętli głównej na razie nie ruszałem, by skupić się na nauce prawidłowej obsługi przerwania.

    Dodano po 1 [minuty]:

    Zapomniałem dodać, że jasnośc świecenia jest zadowalająca, czyli propozycja kolegi Sabotaz działa.

    Dodano po 9 [minuty]:

    Dodałem PORTA = &B11111111 na początku przerwania, bo o tym zapomniałem. Niestety nie pomogło.

    Dodano po 13 [minuty]:

    Miałem błąd w linii 80, teraz świeci prawidłowo, ale mruga sobie radośnie z częstotliwością...Hmm 15Hz? Mruga naprawdę szybko, ale jest to zauważalne dla oka. Jasność świecenia jak najbardziej OK. Brak jakichkolwiek duszków. Rozumiem, że przerwanie musi się odbywać częsciej. Przebudować timer0, by częściej się przepełniał?

    Dodano po 13 [minuty]:

    Oto kod finalny:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Timer0 generuje przerwanie 4 razy szybciej, więc migania już nie widać.

    Bardzo dziękuję wszystkim,a szczególnie koledze Sabotaz, który dzielnie dotrwał ze mną do końca.