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

[C]Jak opóźnić działanie przerwania?

Modecom601 27 Mar 2012 23:38 4127 15
  • #1 27 Mar 2012 23:38
    Modecom601
    Poziom 13  

    Witam serdecznie!
    Przejdę od razu do sedna. Napisałem program do megi328, z przerwaniem INT1, odpowiednio poustawiałem rejestry, uruchomiłem globalną obsługę przerwań sei(), i niestety atmega po podłączeniu zasilania od razu wykonuje przerwanie, mimo, iż switch nie został wciśnięty, wiem, że tak się dzieje, ponieważ w przerwaniu dla przykładu zapalam diodę. Czy istnieje programowa możliwość opóźnienia działania zewnętrznego przerwania? Próbowałem jakieś małe opóźnienie rzędu 10ms po deklaracji portów, nic to nie dało. Przerwanie wykonuje się bez różnicy, czy przerwanie ma być wykonane na zboczu narastającym, czy opadającym. Na pinie PD3 ustawiam w definicji portów stan logiczny '1', wydaje mi się, że ustawienie tej jedynki wykonuje się "później" niż przerwanie, bo przerwanie to priorytet uC dobrze mówię??

    Zagwostkę rozwiązałem w sposób inny, PD3 podciągnałem do 5V rezystorem 1K, by od razu ustawić na PD3 '1' - wtedy przerwanie nie wykonuje się samoistnie po włączeniu zasilania.

    Czy istnieje programowy sposób zapisu w języku C przerwania tak, by nie wywoływał się po włączeniu zasilania? Oszczędziłbym na płytce 1k rezystor. Jestem w 99% przekonany, że istnieje odpowiedź na moje pytanie, lecz nie znam na nie odpowiedzi - stąd temat w dziale początkujący z wiadomych przyczyn :)

    Zamieszczam fragment testowego programu

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Proszę o pomoc

    Pozdrawiam

    0 15
  • Arrow Multisolution Day
  • Pomocny post
    #2 27 Mar 2012 23:51
    Zocha24
    Poziom 21  

    przed odblokowanie przerwań daj _delay_ms(200);

    0
  • Arrow Multisolution Day
  • Pomocny post
    #3 27 Mar 2012 23:55
    michalko12
    Specjalista - Mikrokontrolery

    Zanim odblokujesz przerwania za pomocą sei(), w rejestrze EIFR wykasuj flagę INTF1

    Cytat:
    INTF1: External Interrupt Flag 1
    When an edge or logic change on the INT1 pin triggers an interrupt request, INTF1 becomes set
    (one). If the I-bit in SREG and the INT1 bit in EIMSK are set (one), the MCU will jump to the corresponding
    Interrupt Vector. The flag is cleared when the interrupt routine is executed.
    Alternatively, the flag can be cleared by writing a logical one to it. This flag is always cleared
    when INT1 is configured as a level interrupt.


    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #4 27 Mar 2012 23:59
    dondu
    Moderator Mikrokontrolery Projektowanie

    Ale nadal pozostaje pytanie: Dlaczego flaga INTF1 jest ustawiona, skoro po resecie powinna być 0?
    Skoro pull-up wewnętrzny nie daje właściwego rezultatu, a rezystor 1k tak, to czy nie masz czasem jakichś zakłóceń na płytce - zasilanie itp. prawidłowe?

    0
  • #5 28 Mar 2012 00:08
    Modecom601
    Poziom 13  

    Zocha24
    Przed sei(); wpisywałem nawet _delay_ms(1000); - bez skutku.

    michalko12
    widzę, że przeoczyłem to w nocie, zastosuję to jutro i dam znać.


    dondu
    jeśli Ty nie wiesz, ja tym bardziej :)
    EDIT: płytka testowa to ZL2AVR ze wszystkimi filtrami itp. - chyba to wykluczyć powinienem.
    Zasilanie usb z komputera, wydaje mi się, że po prostu to jest chyba wina tego priorytetu wykonania się przerwania, ale to ja Was o to pytam. Jak widzicie w kodzie podciągneicie PD3 następuje zaraz po ustawieniu DDRD.

    0
  • Pomocny post
    #6 28 Mar 2012 00:09
    dondu
    Moderator Mikrokontrolery Projektowanie

    Modecom601 napisał:
    dondu
    jeśli Ty nie wiesz, ja tym bardziej :)

    To było pytanie do michalko12 :)

    Modecom601 napisał:
    michalko12
    widzę, że przeoczyłem to w nocie, zastosuję to jutro i dam znać.
    Wykasować flage czyli ustawić bit na 0, a w syntax wrzucasz ustawienie bitu, pomyłka rozumiem?

    Nie i michalko12 zacytował Ci wytłuszczając i na czerwono odpowiedni fragment datasheet.
    Więcej znajdziesz tutaj: AVR: Czyhające pułapki

    0
  • Pomocny post
    #7 28 Mar 2012 00:13
    mirekk36
    Poziom 42  

    Modecom601 napisał:

    Wykasować flage czyli ustawić bit na 0, a w syntax wrzucasz ustawienie bitu, pomyłka rozumiem?....


    Przeczytaj to co masz w cytacie z noty PDF na czerwono - przecież jak byk podkreślone, że kasowanie bitu poprzez wpisanie wartości 1 - a ty się pytasz czy to pomyłka w kodzie.

    0
  • Pomocny post
    #8 28 Mar 2012 00:14
    michalko12
    Specjalista - Mikrokontrolery

    Modecom601 napisał:
    Wykasować flage czyli ustawić bit na 0, a w syntax wrzucasz ustawienie bitu, pomyłka rozumiem?

    Nie, to nie jest nie pomyłka!
    Przeczytaj co jest pogrubione i zaznaczone na czerwono w cytacie.

    0
  • #9 28 Mar 2012 00:15
    Modecom601
    Poziom 13  

    "Flaga zostaje wyzerowana (Wyczyszczona) poprzez wpisanie logicznej jedynki" - mój błąd, nie doczytałem. Wydaje się to być prostym rozwiązaniem, jutro zastosuję i dam znać.


    dondu
    chyba najczęściej z czytelników przeglądam Twoje poradniki, znam ten temat :)

    Bardzo dziękuję Wszystkim za pomoc.

    0
  • Pomocny post
    #11 28 Mar 2012 00:25
    michalko12
    Specjalista - Mikrokontrolery

    dondu napisał:
    Ale nadal pozostaje pytanie: Dlaczego flaga INTF1 jest ustawiona, skoro po resecie powinna być 0?



    Do tego momentu wejście sobie pływa i logika od wykrywania zbocz może już je rejestrować.
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Tutaj:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    następuje przełączenie przerwania na inny układ logiczny. Możemy teraz domniemać czy przypadkiem INTF1 nie jest po prostu przełączany z masy na ten układ logiczny, który już wcześniej zarejestrował te zmiany.

    0
  • #12 28 Mar 2012 00:25
    Modecom601
    Poziom 13  

    zwykły switch podłączony do masy. coś może z tą nadrzędnością przerwania, nie wiem, ja tutaj jestem początkujący :)

    Nie mogłem tego zostawić na jutro, włączyłem laptop, dopisałem i... DZIAŁA! :)
    Nauczka, by czytać dokładniej DataSheety i nie ustawiać się na przegranej pozycji.

    Bardzo dziękuję za pomoc wszystkim!
    Pozdrawiam i życzę dobrej nocy

    0
  • #13 28 Mar 2012 00:32
    dondu
    Moderator Mikrokontrolery Projektowanie

    michalko12 napisał:
    Do tego momentu wejście sobie pływa i logika od wykrywania zbocz może już je rejestrować ...... Możemy teraz domniemać czy przypadkiem INTF1 nie jest po prostu przełączany z masy na ten układ logiczny, który już wcześniej zarejestrował te zmiany.

    No tak, ja założyłem, że INTF1 nie może być ustawione, gdy nie ma włączonych przerwań z INT1, czyli nie jest ustawiona flaga INT1.
    A tak nie jest, czyli flaga INTF1 ustawia się niezależnie od tego, czy jest zezwolenie na fladze INT1.

    0
  • #14 28 Mar 2012 00:35
    gaskoin
    Poziom 38  

    heh :) bo to nie przerwanie ustawia flagi, tylko wręcz przeciwnie.

    0
  • #15 28 Mar 2012 00:40
    michalko12
    Specjalista - Mikrokontrolery

    dondu napisał:
    czyli flaga INTF1 ustawia się niezależnie od tego, czy jest zezwolenie na fladze INT1.


    To jest standard. Zawsze możesz programowo sprawdzać czy dane zdarzenie miało miejsce bez wywoływania sprzętowego przerwania. Są też inne rozwiązania gdzie są dodatkowe flagi za rejestrem maskującym.

    0