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

Atmega8 odłączenie wejścia w zależności od stanu na wyjściu.

opaaa 19 Wrz 2021 23:02 450 6
REKLAMA
  • #1 19617349
    opaaa
    Poziom 4  
    Witam. Napisałem pewien program działający na atmedze8. Do PD3 podłączyłem przycisk, do PB1 diodę katodą. Program w przerwaniu taktowym asynchronicznie odlicza czas inkrementując zmienną co sekundę. Po wciśnięciu przycisku (PD3) na (PB1) ma się pojawić stan niski czyli dioda ma świecić przez określony czas (t) i tak się dzieje, program działa bez zarzutu do tego momentu. Kiedy trzymam przycisk dioda świeci cały czas czyli na PB1 mam stan niski. Kiedy wcisnę ponownie przycisk zanim zostanie odliczony czas (t) stan niski na PB1 zaczyna być odliczany od momentu zwolnienia przycisku. Chciał bym zrobić żeby po wciśnięciu i zwolnieniu przycisku program nie reagował na ponowne wciśnięcie przycisku. Próbowałem zrobić z użyciem rejestru PINB w ten sposób że do czasu kiedy na PB1 panuje stan niski PD3 ustawiam jako wyjście zw stanem niskim gdyż przycisk zwiera PD3 do masy. Ale ten sposób mi nie działa albo coś źle piszę. Proszę podrzućcie mi jakiś pomysł na rozwiązanie tego problemu.
  • REKLAMA
  • #2 19617367
    gps79
    Poziom 35  
    Pokaż program. Może będzie mniej zawiły, niż opis.
  • REKLAMA
  • #3 19617374
    opaaa
    Poziom 4  
    Nie wiem czy będzie prościej bo jestem na etapie nauki programowania i z tego powodu zrobiłem 5 plików *.h i 6 plików *.c, sporo definicji. Chyba nie będzie prościej. Ale jak będzie się bardzo upierać to pokażę.
  • REKLAMA
  • #4 19617705
    ex-or
    Poziom 28  
    Problem jest typowy i ma typowe rozwiązanie. W dorobku dziedziny wiedzy jaką jest inżynieria oprograowania mamy coś takiego jak wzorce projektowe, które pokazują jak sobie poradzić z daną klasą problemów. To taki szablon który, niemal bezmyślnie przykładasz, trochę przykrajasz i naciągasz tu i tam, i włala, sprawa załatwiona. Tutaj zastosowanie ma wzorzec "stan" https://refactoring.guru/pl/design-patterns/state
    Jest kilka pojęć: stan, przejścia międzystanowe, warunki przejścia oraz akcje. Program znajduje się w jakimś stanie (początkowo w stanie oczekiwania), w momecie zaistnienia zdarzenia (tutaj mamy trzy zdarzenia: nacisni,ecie przycisku, zwolnienie przycisku oraz upływ czasu, ale w stanie oczekiwania system przyjmuje wyłącznie wciśniecie przycisku, inne ignoruje), jeżeli spełniony jest warunek (tutaj brak warunku) wykonuje się przejście do innego stanu, jednocześnie wykonując jakąś akcję (tutaj: zmiana stanu IO oraz rozpoczęcie odliczania czasu).
    Teraz trzeba sobie rozpisać całość na stany, zdarzenia, warunki i akcje, opisowo albo w formie graficznej, jak kto lubi (graficznie lepiej wszystko widać) i tyle. Zaprogrmamowanie to już male piwo. Opis który podałeś jest niestety sprzeczny, jak sie domyślam, z powodu wymieszania opisu obecnego działania z działaniem porządanym.
    Tyle można Ci poradzić na chwilę obecną.
  • REKLAMA
  • #5 19617929
    excray
    Poziom 41  
    Po wykryciu stanu niskiego na PD3 zablokuj przerwanie od tego pinu i odblokuj je dopiero przy ustawianiu stanu wysokiego na PB1. Pamiętaj aby przed odblokowaniem przerwania wyzerować flagę przerwania.
  • #6 19620597
    gaskoin
    Poziom 38  
    Można też podejść do problemu od drugiej strony. Nie blokować przerwań, tylko sprawdzić czy został spełniony warunek do zajścia zmiany (minął czas t). Jeżeli tak to ustawić odpowiedni pin/flage/cokolwiek a jeżeli nie, to nie robić nic.
  • #7 19621208
    opaaa
    Poziom 4  
    Przycisk nie reaguje w przerwaniu.

    Dodano po 9 [godziny] 33 [minuty]:

    A czy jeżeli PB1 jest wyjściem można stan pinu odczytać przez (PINB & (1<<PB1)) i z zależności od jego stanu wykonać warunek bądź nie? Czy rejestr PINx ma zastosowanie tylko dla wejść?
REKLAMA