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

STM8S - Przerwania - sprawdzanie stanu na wejściu

pzar 05 Kwi 2018 10:57 384 8
  • #1 05 Kwi 2018 10:57
    pzar
    Poziom 10  

    Witam,

    Mam takie pytanie odnośnie przerwań w mikro kontrolerze STM8s.
    Czy jest możliwość jakiegoś resetu stanu przerwania (flagi)? Chodzi mi o coś takiego, aby stm sprawdzał w sposób ciągły, czy na konkretnym pinie wejściowym (dajmy na to PB7) jest podany sygnał masy (w tym przypadku wciśnięty przycisk). Chciałbym, aby był to warunek do wykonywania się części kodu.
    Jeśli jest podawany (ciągły) sygnał masy, to dany kod ma się wykonać, jeśli nie, to ma on przerwać działanie.
    Z tego co widzę, to używając przerwań, wartość zmienia się dopiero po fizycznej zmianie stanu na tym pinie, a więc:

    1. Stan flagi = "0"
    2. Podaję sygnał, czyli wciskam przycisk (flaga zmieni się na z "0" na "1") - startuje pętla
    2. Programowo zmieniam wartości flagi na 0
    3. Wykonanie pętli (kodu)
    4. I tu bym chciał, aby kontroler sprawdzał, czy przycisk nadal jest wciśnięty i jeśli jest, to ponownie wykonał daną pętlę
    Czy to można jakoś na przerwaniach zrobić? Nie wiem, jakiś reset aby ponownie zainicjować flagę stanu na tym pinie.

    Wybrałem do programowania środowisko IAR.
    W pliku stm8s_it.c, w sekcji przerwań dla portu B, mam inicjalizację flagi stanu pinu i ustawienie jej wartości na "1"

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Tu jest ustawiana wartość flagi i po tym kontroler zmienia ją z automatu na "0", oczywiście jeśli przycisk nie jest wciśnięty. Dopiero po podaniu sygnału zmienia się wartość na "1" i rusza pętla.

    Mam nadzieję, że rozumiecie o co mi chodzi :-)

    Z góry dziękuję za pomoc
    Pozdrawiam
    Piotr

    0 8
  • #2 05 Kwi 2018 11:36
    el2010tmp
    Poziom 25  

    pzar napisał:
    Mam nadzieję, że rozumiecie o co mi chodzi :-)


    Może lepiej napisz jaki cel chcesz osiągnąć bo coś mi się wydaje że wybrałeś złą drogę.

    0
  • #3 05 Kwi 2018 14:10
    pzar
    Poziom 10  

    el2010tmp, dzięki za odpowiedź,

    Właśnie udało mi się osiągnąć to co chciałem , ale:
    Poniżej kod który działa tak jak ma działać, czyli przy podanym sygnale na "B7" przekaźniki działają naprzemiennie, w zależności od naruszonego czujnika końcowego. Po zdjęciu sygnału, oba przekaźniki są wyłączane.

    Używając (GPIO_ReadInputData(IGN_KONT_PORT) & IGN_PIN) sprawdzam stan wejścia. jeśli nie ma masy, to wartość = "128", przy podanym sygnale = "0"

    Pytanie czy jest to dobre podejście i czy tak może być?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #4 05 Kwi 2018 15:24
    nowyARM
    Poziom 24  

    pzar napisał:
    Właśnie udało mi się osiągnąć to co chciałem , ale:

    Czyli nie udało.
    Przekaźnik reaguje w ciagu 10..30ms. Czy pętla główna wykonuje się dłużej niż 30ms? Czy reakcja "natychmiastowa" jest konieczna? Może utrudniłeś sobie życie używając przerwań?

    0
  • #5 05 Kwi 2018 15:47
    el2010tmp
    Poziom 25  

    Zgadzam się z @nowyARM. Skoro stan niski na B7 ma tylko zezwalać na obsługę przekaźników to nie ma potrzeby stosowania tutaj przerwań. Po prostu:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #6 05 Kwi 2018 17:18
    pzar
    Poziom 10  

    nowyARM napisał:
    Przekaźnik reaguje w ciagu 10..30ms. Czy pętla główna wykonuje się dłużej niż 30ms? Czy reakcja "natychmiastowa" jest konieczna?


    Jeśli chodzi o czas samej pętli, to przyznam szczerze nie wiem jak zmierzyć.
    Czas pomiędzy przełączeniem przekaźników, a tym samym zadziałania czujnika krańcowego wynosi kilka sekund. Przez ten czas, jeden przekaźnik ma działać.
    Czas przełączenia się przekaźników nie musi być aż tak szybki, to nie jest jakiś precyzyjny mechanizm.
    Jeśli dobrze rozumiem, można by było zostać przy sprawdzaniu wartości na danym wejściu i od razu reagować, bez dodatkowych opóźnień w postaci włączania/ wyłączania flag i sprawdzania ich stanu, czy o to chodzi?

    el2010tmp napisał:
    Skoro stan niski na B7 ma tylko zezwalać na obsługę przekaźników to nie ma potrzeby stosowania tutaj przerwań

    No zgadza się, w sumie to nie ma.

    0
  • #7 05 Kwi 2018 18:57
    nowyARM
    Poziom 24  

    pzar napisał:
    eśli chodzi o czas samej pętli, to przyznam szczerze nie wiem jak zmierzyć.

    Timerem, ale tych w małych prockach brakuje. Skomplikowane programy na 8051 wykonywały pętlę główną w ok 15ms. Oczywiście program musi byc napisany z głową i nie może byc w nim "dealy" a obsługa peryferii (np wysyłanie po USART czy obsługa LCD) na przerwaniach.

    0
  • #8 05 Kwi 2018 21:28
    pzar
    Poziom 10  

    nowyARM napisał:
    Timerem, ale tych w małych prockach brakuje. Skomplikowane programy na 8051 wykonywały pętlę główną w ok 15ms. Oczywiście program musi byc napisany z głową i nie może byc w nim "dealy" a obsługa peryferii (np wysyłanie po USART czy obsługa LCD) na przerwaniach.


    W sumie to i prawda, ale timery to odrębna kwestia i jeszcze muszę się nad nimi pochylić
    W tym konkretnym przypadku chyba nie ma za wiele komplikacji i z poziomu testów organoleptycznych wygląda na to że działa ;-).
    Chciałem tylko się upewnić, czy kod który zastosowałem, nie spowoduje na przykład jakichś błędów.
    I nadal nie znam odpowiedzi na pytanie, czy stosując przerwanie, można je jakoś resetować w trakcie wykonywania kodu. to znaczy czy po podaniu sygnału niskiego lub wysokiego na wejściu, zawsze musi nastąpić jego fizyczna zmiana, czy można jakby (kasować) programowo, aby został on ponownie wykryty i odpowiednio ustawiona flaga?

    0
  • #9 05 Kwi 2018 22:21
    nowyARM
    Poziom 24  

    pzar napisał:
    nadal nie znam odpowiedzi na pytanie, czy stosując przerwanie, można je jakoś resetować w trakcie wykonywania kodu. to znaczy czy po podaniu sygnału niskiego lub wysokiego na wejściu, zawsze musi nastąpić jego fizyczna zmiana, czy można jakby (kasować) programowo, aby został on ponownie wykryty i odpowiednio ustawiona flaga?

    Nie do końca rozumie co chcesz zrobić.
    pzar napisał:

    4. I tu bym chciał, aby kontroler sprawdzał, czy przycisk nadal jest wciśnięty i jeśli jest, to ponownie wykonał daną pętlę
    Czy to można jakoś na przerwaniach zrobić? Nie wiem, jakiś reset aby ponownie zainicjować flagę stanu na tym pinie.

    Przed wyjściem z przerwania sprawdź stan wejścia, jeśli jest aktywne wykonaj ponownie kod. Można też ustawić przerwanie od poziomu a nie zbocza. Gdy wyjdziesz z przerwania a warunek przerwania nadal będzie spełniony, to uC ponownie wejdzie w przerwanie.

    0