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.

Sprawdzenie wystąpienia przerwania

wojtektorr 20 Lut 2012 19:14 1149 14
  • #1 20 Lut 2012 19:14
    wojtektorr
    Poziom 14  

    Witam.
    Chciałbym zasygnalizować wywołane przerwanie mignięciem diody. Np w takim prostym zegarku RTC co sekundę migniecie ledem.
    Jak mogę sprawdzić np. if (?), kiedy zostało wykonane przerwanie?
    Umieściłem w przerwaniu zmianę stanu portu, do którego jest podłączona dioda ale migniecie jest bardzo krótkie.
    Chciałbym dowolnie wydłużyć czas zaświecenia diody a w przerwaniu _delaya nie mogę dać bo zaburzy działanie programu.

    0 14
  • #2 20 Lut 2012 19:30
    pawel_mr
    Poziom 14  

    Rozwiązań może być kilka. Możesz w przerwaniu ustawiać zmianną a w pętli głownej ją sprawdzać i wtedy zapalać diodę. Możesz też w przerwaniu zapalać diodę i włączać timer, który ją zgasi. Jeśli to ma migać co przerwanie to możesz w przerwaniu zamiast zapalać diodę po prostu zmieniać stan na przeciwny, wtedy dioda będzie gasła i zapalała się co wystąpienie przerwania.

    0
  • #3 20 Lut 2012 21:18
    mirekk36
    Poziom 42  

    1. za pomocą IF() możesz sprawdzać flagę sprzętową przerwania i zmieniać stan diody na przeciwny w pętli głównej - i już masz ładne miganie diody co sekundę od przerwania z RTC ;)

    2. można odpalić przerwanie np INTx i w nim zmieniać stan diody na przeciwny - to jest szybka operacja i znowu masz ładne miganie diody co sekundę ;)

    żadnego _delay'a nie trzeba ani w przerwaniu ani w pętli głównej

    0
  • #4 20 Lut 2012 21:23
    wojtektorr
    Poziom 14  

    Właśnie w przerwaniu zamieniam stan pinu portu do którego jest podłączona dioda ale przerwanie trwa bardzo krótko dlatego dioda bardzo słabo miga. Nie wiem jak wydłużyć jej czas świecenia np. 1s.

    0
  • #5 20 Lut 2012 22:32
    mirekk36
    Poziom 42  

    ;) no a jak ty zmieniasz ten stan pinu na przeciwny bo jak znam życie to zapalasz tę diodę w przerwaniu i zaraz ją gasisz - więc to nie dziwne panie kolego. A mówi ci coś operacja bitowa XOR np:

    Code:
    PORTB ^= (1<<PB4);


    ??? jeśli nie to wypróbuj a potem poczytaj o tym i o kilku innych ciekawych rzeczach w C.

    0
  • #6 04 Mar 2012 11:00
    wojtektorr
    Poziom 14  

    Miganie diody mam robione w przerwaniu w ten sposób:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    a efekt jest taki ze dioda i owszem miga ale bardzo krótki jest czas świecenia takie pikniecie mało zauważalne a chce zeby świeciła i gała w przeciagu jednej sekundy czyli swiecenie i wygaszenie po 0.5s.

    0
  • #7 04 Mar 2012 11:34
    szelus
    Specjalista - Mikrokontrolery

    Jeżeli to przerwanie wywołuje się co 1 sekundę, jak sugerują te if-y i dioda zapala się na b. krótko, to diodę gasi Ci najwyraźniej inny fragment programu.

    0
  • #8 04 Mar 2012 11:50
    wojtektorr
    Poziom 14  

    Nie ma znaczenia czy w przerwaniu są te ify czy jest tylko zmiana stanu pinu do którego podłączona jest dioda efekt jest taki sam. Przerwanie jest wywoływane co jedną sekundę bo zegarek mi działa. Poniżej kod programu bez def funkcji obslugujacej wyswietlacz.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #9 04 Mar 2012 12:13
    zumek
    Poziom 39  

    Pomijając dziwne zachowanie LED-ki, to masz jakiś ... "postmodernistyczny" ten zegarek. Dlaczego doba składa się z 9/18 godzin , godzina z 59 minut, a minuta z 59 sekund :?:
    Poza tym, wartość załadowana do OCR1A jest niewłaściwa - sprawdź w dokumentacji.

    0
  • #10 04 Mar 2012 12:59
    szelus
    Specjalista - Mikrokontrolery

    Wojtek, nie zrozumiałeś. Problem LEDa jest gdzieś poza kodem, który pokazałeś. Także teraz. Jeżeli nie jest gaszona w przerwaniu, to jest gaszona w pętli głównej. No chyba, że w innym przerwaniu. Najprawdopodobniej problem jest właśnie w funkcji obsługi wyświetlacza. Do których portów masz podłączony wyświetlacz?
    A zegarek faktycznie "postmodernistyczny". ;)

    0
  • #11 04 Mar 2012 13:01
    wojtektorr
    Poziom 14  

    :) akurat ten zegarek jest taki prowizoryczny bo mam wyswietlacz 3 cyfrowy i pojawia sie problem z wyswietleniem godz wiekszej niz 9 a to ze godz ma 59 min to czyste przeoczenie, w każym razie nie o to chodzi :P
    Anody wyświetlacza mam podłączone do PORTD a katody odpowiednio do PB0 PB1 i PB2. Poniżej funkcja inicjalizujaca wyswietlacz LED:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Rzeczywiście gdzies popsulem sprawe z maskowaniem pozostalych bitów portu B, kiedy zakomentuje wywołanie funkcji inicjalizujacej wyswietlacz to dioda miga jak nalezy

    0
  • #12 04 Mar 2012 13:41
    zumek
    Poziom 39  

    Już dawno znałbyś odpowiedź na swoje pytanie, gdybyś nie podawał nam swojego "tortu" po kawałku.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #13 04 Mar 2012 13:44
    wojtektorr
    Poziom 14  

    Racja, przepraszam za zamieszanie, czyli jak powinno być poprawnie?? A no i dodatkowow w procedurze obsługi przerwanai LED mam takie cos:
    KATODY_PORT = ~licznik;
    len licznik zapisuje mi piny portu, jak mogę to inaczej rozwiązać??

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #14 04 Mar 2012 15:23
    zumek
    Poziom 39  

    wojtektorr napisał:
    ... jak mogę to inaczej rozwiązać??

    Może tak :?:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    EDIT: Usunąłem zbędną "pionową kreseczkę" w ostatniej linijce kodu.

    0
  • #15 04 Mar 2012 15:24
    wojtektorr
    Poziom 14  

    Jakie to proste :) Dzięki, namieszałem troche...

    0