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

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

Antystatyczny 19 Cze 2012 22:51 2978 29
  • #1 11020410
    Antystatyczny
    Poziom 16  
    Witam.

    Napisałem taki oto kod:

    Kod: text
    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.
  • #2 11020726
    ZbeeGin
    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.
  • #3 11023559
    arktik1
    Poziom 27  
    Ogólnie Debounce wprowadza opóźnienia.
    Spróbuj na początku wpisać:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    i sprawdź co się dzieje.

    Dodano po 1 [minuty]:

    I po co ci Waitus 200?
  • #4 11023572
    Antystatyczny
    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.
  • #5 11023600
    Konto nie istnieje
    Poziom 1  
  • #6 11023642
    arktik1
    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.
  • #7 11024200
    Antystatyczny
    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.
  • #8 11024234
    arktik1
    Poziom 27  
    Cytat:
    polecenie debounce zarejestruje naciśnięcie tylko raz nawet w przypadku trzymania tego klawisza

    TAK.
  • #9 11024370
    Antystatyczny
    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?
  • #10 11024415
    Konto nie istnieje
    Konto nie istnieje  
  • #11 11024467
    Antystatyczny
    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?
  • #12 11024555
    Konto nie istnieje
    Konto nie istnieje  
  • #13 11024590
    Antystatyczny
    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?
  • #14 11024609
    Konto nie istnieje
    Konto nie istnieje  
  • #15 11024618
    Antystatyczny
    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.
  • #16 11026445
    Konto nie istnieje
    Konto nie istnieje  
  • #17 11028251
    Antystatyczny
    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: text
    Zaloguj się, aby zobaczyć kod
  • #18 11028355
    Konto nie istnieje
    Konto nie istnieje  
  • #19 11028382
    Antystatyczny
    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?
  • #21 11028441
    Antystatyczny
    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?
  • #23 11028519
    Antystatyczny
    Poziom 16  
    Zmieniłem fuse'y, teraz piszę nowy kod. Jeśli skończę, jutro go wkleję, by poddać krytyce.
  • #24 11028555
    LordBlick
    VIP Zasłużony dla elektroda
    Nie spojrzałem wcześniej na to, że mówimy o ATmega32. Piny od zegarkowego są inne niż głównego zewnętrznego oscylatora. Żadne "piki", tylko goły oscylator. Może w końcu jednakby zacząć czytać notę katalogową ? ;)
    http://www.atmel.com/devices/ATMEGA32.aspx?tab=documents
    http://www.atmel.com/Images/doc2503.pdf
  • #25 11028580
    Antystatyczny
    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ę.
  • #27 11028639
    Antystatyczny
    Poziom 16  
    Napisałem taki oto kod:
    Kod:
    Kod: text
    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: text
    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.
  • #28 11028979
    Mundi1970
    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: text
    Zaloguj się, aby zobaczyć kod
  • #29 11029921
    Konto nie istnieje
    Konto nie istnieje  
  • #30 11031655
    Antystatyczny
    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: text
    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: text
    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.
REKLAMA