logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

maxmati 29 Kwi 2014 19:03 1851 17
  • #1 13554423
    maxmati
    Poziom 10  
    Posty: 15
    Mam poniższy kod który kompiluje avr-gcc i atmega32 restartuje mi się w momencie wyjścia z funkcji void test();

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    tutaj jeszcze kod asm do jakiego kompiluje się ten program
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #2 13554506
    skalsky5000
    Poziom 21  
    Posty: 485
    Pomógł: 50
    Ocena: 49
    A jak stwierdzasz ze się resetuje ?
    Poza tym używasz ISR(BADISR_vect) a nigdzie nie włączasz jakichkolwiek przerwań.
  • #3 13554667
    maxmati
    Poziom 10  
    Posty: 15
    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
  • #4 13554750
    skalsky5000
    Poziom 21  
    Posty: 485
    Pomógł: 50
    Ocena: 49
    W jakim środowisku piszesz ? Zdefiniowałeś F_CPU w projekcie ?
  • #5 13554803
    maxmati
    Poziom 10  
    Posty: 15
    Programuje w eclipse-avr.
    Mam ustawione MCU type oraz MCU Clock Frequency we właściwościach projektu.
  • #6 13554826
    bruneq87
    Poziom 11  
    Posty: 12
    A czy nie trzeba by wyłączyć na początek watchdog-a, żeby nie resetował kontrolera?
  • #7 13554964
    maxmati
    Poziom 10  
    Posty: 15
    Niestety ale nie pomogło poza tym watchdog resetował by go w równych odstępach czasu a nie przy wyjściu z funkcji.
  • #8 13555415
    excray
    Poziom 41  
    Posty: 5502
    Pomógł: 739
    Ocena: 657
    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?
  • #9 13555465
    jarekgol
    Poziom 40  
    Posty: 5196
    Pomógł: 646
    Ocena: 1152
    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?
  • #10 13555598
    maxmati
    Poziom 10  
    Posty: 15
    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ą.
  • #11 13555744
    bruneq87
    Poziom 11  
    Posty: 12
    Hm, być może głupia podpowiedź, ale czy próbowałeś użyć innej Atmega32?
  • #12 13555826
    Eagle
    Poziom 24  
    Posty: 536
    Pomógł: 57
    Ocena: 31
    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.
  • #13 13556351
    maxmati
    Poziom 10  
    Posty: 15
    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
  • #14 13556473
    Eagle
    Poziom 24  
    Posty: 536
    Pomógł: 57
    Ocena: 31
    Dla sprawdzenia skopilowałem na AVRStudio dostaję taki sam listing jak ty, różni się tylko nagłówkiem.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    A symulując diodka sympatycznie mruga.
    Szukasz w złym miejscu, powrót z funkcji działa.
  • #15 13557064
    Brutus_gsm
    Poziom 25  
    Posty: 728
    Pomógł: 49
    Ocena: 13
    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?
  • #16 13557175
    jarekgol
    Poziom 40  
    Posty: 5196
    Pomógł: 646
    Ocena: 1152
    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 / C++
    Zaloguj się, aby zobaczyć kod
    [/code]

    ps. a co masz podpięte pod PA1 ?
  • #17 13557237
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Czy masz dobrze wybrany procesor w ustawieniach środowiska? Sprawdź mapę pamięci, czy stos jest pod właściwymi adresami.
  • #18 13558081
    maxmati
    Poziom 10  
    Posty: 15
    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.

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono problem resetowania mikrokontrolera ATmega32 po wyjściu z funkcji `test()`, co objawiało się nieprawidłowym działaniem diod LED. Użytkownik podejrzewał, że może to być spowodowane nieobsłużonym przerwaniem, dlatego użył ISR(BADISR_vect). Inni uczestnicy zasugerowali sprawdzenie ustawień F_CPU, wyłączenie watchdog'a, a także zbadanie zasilania i kondensatorów na zasilaniu. Użytkownik potwierdził, że nie ma ustawionych bitów BODLEVEL, a problem nie występuje, gdy funkcja `test()` jest inline. Po przetestowaniu na ATmega8, problem zniknął, co sugeruje, że może być związany z ATmega32.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA