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

[Rozwiązano] Czy poprawnie pozbywam się drgań styków sposobem programowym? ATmega8A/Język C

antoniv10 30 Gru 2020 20:58 696 14
REKLAMA
  • #1 19148078
    antoniv10
    Poziom 3  
    Cześć, mam pytanie dotyczące drgań styków czy ten kod faktycznie ich się pozbywa?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ma on działać na takiej zasadzie, że najpierw sprawdzam czy przycisk jest wciśnięty, potem po 20 ms sprawdzam do drugi raz i jeżeli jest naciśnięty to wykonuję kod. Czy mój sposób jest tu skuteczny? Do odmierzenia czasu używam timera0 Atmegi8A. Wiem, że można też użyć delay_ms, ale nie chcę tego robić ze względu na to, że do obsługi klawisza jest w funkcji obsługi przerwania. Jeżeli mój sposób nie jest dobry to jak to powinienem rozwiązać ?
  • REKLAMA
  • Pomocny post
    #2 19148160
    excray
    Poziom 41  
    Sama idea co najmniej dziwna, plus brak blokowania przerwania. A tak swoją drogą po co angażujesz timer T0 skoro go nie używasz? I jak ma się wywołać przerwanie od T1 skoro nigdzie go nie skonfigurowałeś?
  • #3 19148309
    antoniv10
    Poziom 3  
    excray napisał:
    Sama idea co najmniej dziwna, plus brak blokowania przerwania. A tak swoją drogą po co angażujesz timer T0 skoro go nie używasz? I jak ma się wywołać przerwanie od T1 skoro nigdzie go nie skonfigurowałeś?

    Faktycznie to z ten wektor przerwania przez przypadek źle ustawiłem. A jeżeli chodzi o tą idę to jak to powinno wyglądać?
  • REKLAMA
  • #4 19148325
    excray
    Poziom 41  
    antoniv10 napisał:
    A jeżeli chodzi o tą idę to jak to powinno wyglądać?

    Co kto lubi. Jak dla mnie to bardzo, bardzo nie. Skoro został wciśnięty przycisk, to po co czekać na jakieś drgania? Po prostu realizujesz to co masz zrobić. Całą idea czytania na przerwaniach też mocno dyskusyjna.
  • #5 19148340
    antoniv10
    Poziom 3  
    excray napisał:
    antoniv10 napisał:
    A jeżeli chodzi o tą idę to jak to powinno wyglądać?

    Skoro został wciśnięty przycisk, to po co czekać na jakieś drgania? Po prostu realizujesz to co masz zrobić. Całą idea czytania na przerwaniach też mocno dyskusyjna.

    A jak wglądałby przykładowy kod w tym przypadku?
  • REKLAMA
  • #6 19148369
    excray
    Poziom 41  
    A co to za przypadek?

    Dodano po 19 [minuty]:

    Generalnie ten problem można rozwiązać na 1000 sposobów z czego 900 będzie działać. Ja osobiście jak mam czytać klawiaturę to najczęściej czytam ją w przerwaniu co 50ms lub coś koło tego. Jeśli przy odczycie klawisz jest wciśnięty, a poprzednio nie był, to po prostu realizuję przypisaną do klawisza funkcję.
  • #7 19148575
    antoniv10
    Poziom 3  
    excray napisał:
    A co to za przypadek?

    Dodano po 19 [minuty]:

    Ja osobiście jak mam czytać klawiaturę to najczęściej czytam ją w przerwaniu co 50ms lub coś koło tego. Jeśli przy odczycie klawisz jest wciśnięty, a poprzednio nie był to po prostu realizuję przypisaną do klawisza funkcję.


    "50ms" mam to zrobić za pomocą timera czy delay_ms?
  • #8 19148604
    excray
    Poziom 41  
    Oczywiście, że z pomocą timera.
  • #9 19148939
    antoniv10
    Poziom 3  
    Mam taki kod jak poniżej. Ma on obsługiwać zegar i tutaj napotkałem problem, bo obsłużyłem chcę pozbyć się drgań styków sposobem przedstawionym tutaj. Problem polega na tym, że jak naciskam klawisz aby, np. ustawić godziny na pożądaną wartość na LCD zwiększa się ona o 1 i zaraz wszystko się znowu zeruje. Tak samo jak naciskam przycisk nr4, który włącza timer i zaczyna liczyć czas, jeżeli w tym czasie kliknę przycisk do zwiększania wartość godziny/minut/sekund wszystko się zeruje. Dlaczego tak się dzieje?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #10 19149044
    excray
    Poziom 41  
    Za duży program próbujesz ugryźć na raz i zbyt szybko. Zabierz się najpierw za prostsze kawałki kodu, przetestuj je, a później dopiero sklejaj je w większe.
  • #11 19149116
    antoniv10
    Poziom 3  
    Ale co tu jest nie tak? Tego kodu nie mogę tak zostawić, bo już mam wszystko gotowe tylko te drgania styków muszę wyeliminować.
  • #12 19149139
    excray
    Poziom 41  
    Wszystko jest nie tak. W kodzie jest co najmniej kilka różnych grubych baboli. Jeden związany z inkrementacją zmiennych, kolejny z ich wyświetlaniem. I oczywiście wszystko chcesz robić w pętli głównej. Gdybyś pisał ten kod etapami i każdy z nich sprawdzał, to byś już dawno sam je wychwycił. A tak skleiłeś kod z wielu mniejszych błędnych i teraz się dziwisz, że jako całość nie działa. Co do drgań styków to nawet nie chce mi się w Twoją logikę wnikać, ale nie widzę tam pomysłu, o którym Ci pisałem. Nie będę tego analizować, bo nie akceptuję takiego sposobu pisania - tworzysz setki linijek kodu, którego sam nie rozumiesz i prosisz innych o poprawki. Jak dla mnie to chyba bez sensu zabierasz się za programowanie. Lepiej znajdź inne hobby, albo wróć do podstaw i jeszcze raz je przerób, bo tylko sam się męczysz.
  • #13 19152685
    antoniv10
    Poziom 3  
    excray napisał:
    Co do drgań styków to nawet nie chce mi się w Twoją logikę wnikać, ale nie widzę tam pomysłu, o którym Ci pisałem.

    Przez ostatnie pare dni posiedziałem nad tym i po testowaniu mojego sposobu na innym kontrolerze doszedłem do wniosku, że faktycznie on nie działa (przynajmniej w zdecydowanej większości przypadków). Zrobiłem coś takiego. Czy ten kod poprawnie obsługuję drgania styków?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #14 19152711
    excray
    Poziom 41  
    Po pierwsze - jeśli chcesz się przekonać czy kod działa to go uruchom i to sprawdź. Po drugie - nie wiem po co tak bardzo grzebiesz w rejestrach timera, wpisujesz jakieś własne wartości do TCNT0 i TCCR0 w przerwaniu, jaki to ma cel? Uruchom przerwanie i zapomnij o nim:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #15 19155004
    antoniv10
    Poziom 3  
    Użyłem sposobu przedstawionego w ostatniej odpowiedzi użytkownika excray.

Podsumowanie tematu

Dyskusja dotyczy problemu eliminacji drgań styków w kodzie napisanym dla mikrokontrolera ATmega8A w języku C. Użytkownik przedstawia swój kod, który wykorzystuje przerwania do detekcji wciśnięcia przycisku, jednak spotyka się z krytyką dotyczącą braku blokowania przerwań oraz nieefektywnego użycia timerów. Uczestnicy sugerują różne podejścia do rozwiązania problemu, w tym użycie timerów do cyklicznego odczytu stanu przycisku oraz uproszczenie kodu poprzez testowanie mniejszych fragmentów. Ostatecznie użytkownik decyduje się na implementację rozwiązania zaproponowanego przez innego uczestnika, które ma na celu poprawne obsługiwanie drgań styków.
Podsumowanie wygenerowane przez model językowy.
REKLAMA