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

Czasowe zapalenie diody po przyciśnięciu przycisku. Bez delay

mat9102 13 Lip 2015 14:06 969 6
  • #1 13 Lip 2015 14:06
    mat9102
    Poziom 8  

    Witam!
    Potrzebuje napisać fragment kodu, który będzie zapalał diodę za pomocą przycisku, na np. 10 sek. Nie mogę użyć funkcji delay. Najlepiej by było, gdyby działało to za pomocą odliczania czasu (1. sprawdź czy przycisk jest wciśnięty, 2. jeśli tak to zapal diodę na 10 sek, 3. jeśli nie to niech stan będzie LOW). Ogólnie u mnie z podpięciami wygląda tak, że przycisk jest podpięty do masy i pinu 3. Stan pinu 3 jest ustawiony na HIGH, a dioda podpięta jest do pinu 4 i jej początkowy stan to LOW. Jeśli zamiast skorzystania z odliczania czasu np."unsigned long dioda_time = millis()+ 1000;" można zastosować jakiś myk sprzętowy to też chętnie przygarnę pomysł :)
    Jak to by komuś pomogło to potrzebuje to do zapalania podświetlania w ekranie LCD.
    Dzięki z góry :)

    0 6
  • #2 13 Lip 2015 14:15
    excray
    Poziom 39  

    Zrób to w przerwaniu od zegara co np. 100mS. Sprawdzasz czy przycisk jest wduszony i jeśli tak to przypisujesz zmiennej typu static wartość 100. Dalej w tym samym przerwaniu sprawdzasz czy ta zmienna jest większa od 0. Jeśli tak to zmniejszasz ją o 1 i zapalasz podświetlenie. Jeśli nie to gasisz podświetlenie.

    0
  • #3 14 Lip 2015 09:32
    mat9102
    Poziom 8  

    To nie jest głupi pomysł :) pomyśle nad tym i dam później znać jak działa. Ale mam jedną wątpliwość. Czy przypadkiem, gdy program będzie wykonywać przerwanie to nie zatrzyma mi wykonywanie programu? tzn. będzie tylko zajmował się porównywaniem zmiennej? bo ja właśnie próbuje tego uniknąć, ponieważ w międzyczasie będę chciał wykonywać inne operacje.

    0
  • #4 14 Lip 2015 09:39
    dondu
    Moderator Mikrokontrolery Projektowanie

    mat9102 napisał:
    Ale mam jedną wątpliwość. Czy przypadkiem, gdy program będzie wykonywać przerwanie to nie zatrzyma mi wykonywanie programu? tzn. będzie tylko zajmował się porównywaniem zmiennej? bo ja właśnie próbuje tego uniknąć, ponieważ w międzyczasie będę chciał wykonywać inne operacje.

    Mikrokontrolery mają tylko jedną jednostkę centralną CPU, przez co nie mogą wykonywać dwóch fragmentów programu jednocześnie. Dlatego z reguły przerwania powinny wykonywać się możliwie jak najszybciej: http://mikrokontrolery.blogspot.com/2011/04/problemy-c-przerwania.html

    Zaglądnij także do spisu treści na powyższej stronie.

    0
  • #5 14 Lip 2015 09:48
    BlueDraco
    Specjalista - Mikrokontrolery

    Przesądy... ;) Nie "jak najszybciej" a "odpowiednio szybko"; np. jedyne w systemie przerwanie zgłaszane co 100 us może być obsługiwane przez 99 us i wszystko będzie ok.

    A co do diody - cały kod, który robi to, co trzeba w przerwaniu zgłaszanym co 10..20 ms, wygląda tak (na STM32F0):

    Kod: c
    Zaloguj się, aby zobaczyć kod

    1
  • #6 14 Lip 2015 09:56
    mat9102
    Poziom 8  

    Wiem, że mikrokontroler (w moim przypadku Atmega328) nie może wykonywać dwóch fragmentów jednocześnie, ale można spowodować złudzenie wielozadaniowości. Ja chciałem zastosować odliczanie czasu od momentu uruchomienia mikrokontrolera. I chodzi o to, że gdy program napotka na przerwanie i załączy na 10 sek diodę, to będę mógł, w między czasie "mieć złudzenie, że mikrokontroler jeszcze mierzy temperaturę w czasie rzeczywistym i np. odczytuje stan potencjometru?".

    Dodano po 4 [minuty]:

    Pytam, bo jeszcze nie miałem potrzeby bawienia się z przerwaniami i nie do końca wiem jak one działają w programie. Trochę czytałem na ten temat i właśnie stąd moje wątpliwość, bo zaczęło mi sie wydawać, że przerwania zatrzymają mi program...

    0
  • #7 14 Lip 2015 10:18
    dondu
    Moderator Mikrokontrolery Projektowanie

    BlueDraco napisał:
    Przesądy... ;) Nie "jak najszybciej" a "odpowiednio szybko"; np. jedyne w systemie przerwanie zgłaszane co 100 us może być obsługiwane przez 99 us i wszystko będzie ok.

    Toć napisałem:

    dondu napisał:
    Dlatego z reguły przerwania powinny wykonywać się możliwie jak najszybciej ...




    mat9102 napisał:
    Wiem, że mikrokontroler (w moim przypadku Atmega328) nie może wykonywać dwóch fragmentów jednocześnie, ale można spowodować złudzenie wielozadaniowości.

    ale zadałeś pytanie niestety inaczej:

    mat9102 napisał:
    Czy przypadkiem, gdy program będzie wykonywać przerwanie to nie zatrzyma mi wykonywanie programu?




    mat9102 napisał:
    I chodzi o to, że gdy program napotka na przerwanie i załączy na 10 sek diodę, to będę mógł, w między czasie "mieć złudzenie, że mikrokontroler jeszcze mierzy temperaturę w czasie rzeczywistym i np. odczytuje stan potencjometru?".

    Jak sądzisz ile czasu trwa włączanie diody?

    Innymi słowy, wszystko zależy jak napiszesz swój program. Jeśli napiszesz go w taki sposób, że funkcja obsługi przerwania będzie trwała 10 sekund, to program główny zostanie wstrzymany na 10 sekund. Jeśli napiszesz program tak by funkcja przerwania wykonywała się np. w 10µs to też na taki czas zostanie wstrzymany program główny.

    Pomijam oczywiście przypadek, gdy w funkcji przerwania włączysz przerwania ... na razie takie sztuczki sobie odpuść, bo polegniesz na nich szybko.


    mat9102 napisał:
    Pytam, bo jeszcze nie miałem potrzeby bawienia się z przerwaniami i nie do końca wiem jak one działają w programie. Trochę czytałem na ten temat i właśnie stąd moje wątpliwość, bo zaczęło mi sie wydawać, że przerwania zatrzymają mi program...

    Dobrze Ci się wydaje - zatrzymują program główny ... reszta opisana powyżej.

    Przeczytaj dokładnie artykuł, który wskazałem Ci w poprzednim poście, a przykłady znajdziesz tutaj: http://mikrokontrolery.blogspot.com/2011/03/drzaskowy-pamietnik-wstep.html

    0