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.

atmega8, c - Przerwanie wykonuje isę tylko raz

06 Mar 2015 11:18 867 9
  • #1 06 Mar 2015 11:18
    1376867
    Użytkownik usunął konto  
  • #3 06 Mar 2015 14:09
    1376867
    Użytkownik usunął konto  
  • #4 06 Mar 2015 14:30
    chudybyk
    Poziom 26  

    Ja bym stawiał na to, że rtc_get_time_s() lub/i sprintf() wykonuje się tak długo, że przychodzi drugi raz to samo przerwanie, ale jeszcze nie wyszło z aktualnego.

    0
  • #5 06 Mar 2015 14:46
    1376867
    Użytkownik usunął konto  
  • #6 06 Mar 2015 14:55
    dondu
    Moderator Mikrokontrolery Projektowanie

    chudybyk napisał:
    Ja bym stawiał na to, że rtc_get_time_s() lub/i sprintf() wykonuje się tak długo, że przychodzi drugi raz to samo przerwanie, ale jeszcze nie wyszło z aktualnego.

    ... i dlatego co napisał powyżej kol. chudybyk powinieneś swój program zmienić - czytaj cały artykuł, a w szczególności pkt5: http://mikrokontrolery.blogspot.com/2011/04/problemy-c-przerwania.html

    0
  • #7 06 Mar 2015 15:00
    1376867
    Użytkownik usunął konto  
  • #8 06 Mar 2015 15:05
    dondu
    Moderator Mikrokontrolery Projektowanie

    Ujemny napisał:
    Czy pobranie wartości 3 zmiennych z pamięci rtc to skomplikowane obliczenia?

    Ty zastanawiasz się nad tym co piszesz?
    Co wykonuje ta linijka kodu:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    do spóły z tymi dwiema:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    bo moim zdaniem spore opóźnienie - czy zbyt duże, tego nie wiem, bo nie wiemy z jakich z bibliotek (TWI i LCD) korzystasz i nie wiem jak ustawione jest TWI więc nie mamy jak przeanalizować problem.

    Przeczytaj więc artykuł, który Ci wskazałem zanim napiszesz kolejny post.

    Następnie popraw swój program tak, by te operacje nie były wykonywane w przerwaniu i przetestuj, a gdy nadal będzie nieprawidłowo - pokaż program po zmianach.

    EDIT:
    Dodałem Ci 25pkt, bo masz 0, a mogą się przydać.

    0
  • #9 08 Mar 2015 09:42
    1376867
    Użytkownik usunął konto  
  • #10 09 Mar 2015 10:28
    dondu
    Moderator Mikrokontrolery Projektowanie

    Jeżeli przerobiłeś pętlę główną na while(flag) to nie o to chodziło.
    Zostaw więc while(1) w pętli głównej, a while(flag) zamień na if(flag).
    Dodatkowo na początku if przed LCD_GoTo(0, 0) wstaw flaga=0.
    ... i pokaż cały program po zmianach, a nie tylko fragment.

    0