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.

[ATmega32][avr-gcc] C - Restart mikro-kontrolera podczas powrotu z funkcji

maxmati 29 Kwi 2014 19:03 1536 17
  • #1 29 Kwi 2014 19:03
    maxmati
    Poziom 9  

    Mam poniższy kod który kompiluje avr-gcc i atmega32 restartuje mi się w momencie wyjścia z funkcji void test();

    Kod: c
    Zaloguj się, aby zobaczyć kod


    tutaj jeszcze kod asm do jakiego kompiluje się ten program
    Kod: asm
    Zaloguj się, aby zobaczyć kod

    0 17
  • #2 29 Kwi 2014 19:34
    skalsky5000
    Poziom 20  

    A jak stwierdzasz ze się resetuje ?
    Poza tym używasz ISR(BADISR_vect) a nigdzie nie włączasz jakichkolwiek przerwań.

    0
  • #3 29 Kwi 2014 20:18
    maxmati
    Poziom 9  

    Widzę po zachowaniu się diod(testowałem też na innych programach).
    ISR(BADISR_vect) użyłem ponieważ miałem takie podejrzenie że wywoływane jest jakieś przerwanie a avr-gcc domyślnie w sytuacji nie obsłużonego przerwania restartuje uc

    0
  • #4 29 Kwi 2014 20:41
    skalsky5000
    Poziom 20  

    W jakim środowisku piszesz ? Zdefiniowałeś F_CPU w projekcie ?

    0
  • #5 29 Kwi 2014 20:53
    maxmati
    Poziom 9  

    Programuje w eclipse-avr.
    Mam ustawione MCU type oraz MCU Clock Frequency we właściwościach projektu.

    0
  • #6 29 Kwi 2014 21:02
    bruneq87
    Poziom 9  

    A czy nie trzeba by wyłączyć na początek watchdog-a, żeby nie resetował kontrolera?

    0
  • #7 29 Kwi 2014 21:31
    maxmati
    Poziom 9  

    Niestety ale nie pomogło poza tym watchdog resetował by go w równych odstępach czasu a nie przy wyjściu z funkcji.

    0
  • #8 29 Kwi 2014 23:10
    excray
    Poziom 39  

    A co masz podpięte pod PA0 i w jaki sposób? Nie masz przypadkiem skoku napięcia na zasilaniu? Jak zasilasz uC? Masz kondensatory na zasilaniu? Najlepiej dołącz zdjęcie/schemat. Nie masz przypadkiem ustawionych bitów BODLEVEL?

    0
  • #9 29 Kwi 2014 23:25
    jarekgol
    Poziom 17  

    lub czy też resetu nie wywołuje Ci programator?
    bo program jest tak prosty, że nie bardzo ma co w nim nie działać.
    Ps. za reset uznajesz miganie 2 diod zamiast jednej?

    0
  • #10 30 Kwi 2014 00:25
    maxmati
    Poziom 9  

    Pod PA0 podpiętą mam diodę przez rezystor 4k7(próbowałem też 220R) do zasilania. Próbowałem zasilać go przez zasilacz komputerowy oraz programator usbasb z takim samym skutkiem. Tak mam kondensatory na zasilaniu. Nie mam ustawionych bitów BODLEVEL moje fusbity o E4:99. Poza tym uC się nie resetuje jeżeli funkcja test() jest inline co moim zdaniem sugeruje że problem jest z poleceniem `ret`.

    Próbowałem również bez programatora w układzie. Gdy testowałem dlaczego mi nie działa program robiłem różne programy testowe np. mrugałem klika razy diodą szybko bez użycia funkcji oprócz deley_ms() (która de facto jest traktowana przez kompilator jako inline) a następnie już znacznie wolniej ale opakowując zmianę stanu portu w funkcję. Za reset uznałem to że uC mrugał cały czas z tą większą częstotliwością.

    0
  • #11 30 Kwi 2014 06:52
    bruneq87
    Poziom 9  

    Hm, być może głupia podpowiedź, ale czy próbowałeś użyć innej Atmega32?

    0
  • #12 30 Kwi 2014 08:03
    Eagle
    Poziom 23  

    Na podstawie czego oceniasz, że restartuje się po wyjściu z funkcji ? Ale bardziej konkretnie.
    Jaką wartość F_CPU= masz ustawioną ?
    Czy uC jest na wewnętrznym RC czy zewnętrznym kwarcu.
    W/g mnie powyższy soft nie może restartować po wyjściu z funkcji, na sym w avr studio działa zgonie z oczekiwaniami.

    0
  • #13 30 Kwi 2014 11:30
    maxmati
    Poziom 9  

    Nie nie próbowałem innej atmegi bo takiej nie posiadam ale pewnie będę musiał kupić taką.
    Eagle robiłem różne testy np. Zapalałem diodę przed funkcją drugą w funkcji i trzecia po wyjściu. Efekt był taki ze zapalały się dwie pierwsze.
    F_CPU mam ustawione na 8mhz.uC pracuje na wewnętrznym generatorze

    0
  • #14 30 Kwi 2014 12:10
    Eagle
    Poziom 23  

    Dla sprawdzenia skopilowałem na AVRStudio dostaję taki sam listing jak ty, różni się tylko nagłówkiem.

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    A symulując diodka sympatycznie mruga.
    Szukasz w złym miejscu, powrót z funkcji działa.

    0
  • #15 30 Kwi 2014 16:06
    Brutus_gsm
    Poziom 25  

    Jaki jest efekt działania programu z pierwszego postu? Jak masz ustawioną optymalizację w kompilatorze? Być może problem leży nie w twojej funkcji test, tylko w _delay_ms, które nie działają bez optymalizacji?

    0
  • #16 30 Kwi 2014 16:45
    jarekgol
    Poziom 17  

    To jeszcze jeden test:
    wklej to wielokrotnie (mam nadzieję że nic tego nie "zoptymalizuje") jedno pod drugim w swojej pętli i wtedy zobacz.

    Kod: c
    Zaloguj się, aby zobaczyć kod
    [/code]

    ps. a co masz podpięte pod PA1 ?

    0
  • #17 30 Kwi 2014 17:15
    BlueDraco
    Specjalista - Mikrokontrolery

    Czy masz dobrze wybrany procesor w ustawieniach środowiska? Sprawdź mapę pamięci, czy stos jest pod właściwymi adresami.

    0
  • #18 30 Kwi 2014 22:33
    maxmati
    Poziom 9  

    Przerobiłem na atmege8 bo taką miałem pod ręką i zaczęło działać po majówce kupię atmege32 i zobaczymy czy pomoże.

    0