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

ATmega8A - Problem z przerwaniem od przetwornika ADC

Mateusz0944 22 Sty 2017 19:49 972 9
REKLAMA
  • #1 16219966
    Mateusz0944
    Poziom 11  
    Witam. Po dość długim czasie postanowiłem powrócić do programowania AVR ze względu na mały projekt który planuję w niedalekiej przyszłości. Zaopatrzyłem się w oprogramowanie, mikrokontroler i do dzieła. Po całym dniu oprogramowywania różnych peryferiów utknąłem na ADC. Otóż mam taki problem, że nie działa mi procedura obsługi przerwania od ADC umieszczona w pliku adc.c. Po przeniesieniu jej do pliku gdzie znajduje się funkcja main() wszystko działa jak należy. Poniżej zamieszczam dokładniejsze informacje:

    główny plik projektu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    plik adc.h:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    plik adc.c:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i jeszcze makra pomocnicze:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W podanej postaci wszystko działa. Jeżeli jednak obsługa przerwania będzie w pliku adc.c to nie jest ona w ogóle wywoływana. Nie wiem w czym może być problem bo nigdy wcześniej się z czymś podobnym nie spotkałem. Na dodatek inne przerwania działają i ich procedury obsługi są w innych plikach (Timer0, SPI). Długa przerwa od AVR też robi swoje.

    Środowisko: Atmel AVR Studio 5 wersja 5.1.208,
    Tryb budowania: DEBUG,
    Optymalizacja: -O0

    Pozdrawiam
  • REKLAMA
  • #2 16219997
    BlueDraco
    Specjalista - Mikrokontrolery
    Zacznij od wyrzucenia makr zaciemniających i wydłużyjącycgh program. Potem usuń jednoinstrukcyjne procedury oraz nicnierobiącą procedurę obsługi przerwania ADC.

    Czy ja coś przespałem i preprocesor C akceptuje spacje w liście argumentów makra?
  • REKLAMA
  • #3 16220348
    Mateusz0944
    Poziom 11  
    Wyrzucenie makr nic nie daje, a czytelność kodu to kwestia gustu także nie będę o niej dyskutował.
    Problem został rozwiązany. Przyczyna: brak #include <avr/interrupt.h>w pliku adc.c - trywialny błąd. Dlatego makro ISR() nie było poprawnie rozwijane. Naprowadził mnie na to fakt ze przy programowaniu oboma wersjami programu zmieniają się w pamięci flash wartości w wektorze przerwań i przeglądnięcie mapy linkera.

    Pozdrawiam
  • REKLAMA
  • #4 16220729
    dondu
    Moderator na urlopie...
    Mateusz0944 napisał:
    Przyczyna: brak #include <avr/interrupt.h>w pliku adc.c - trywialny błąd. Dlatego makro ISR() nie było poprawnie rozwijane. Naprowadził mnie na to fakt ze przy programowaniu oboma wersjami programu zmieniają się w pamięci flash wartości w wektorze przerwań i przeglądnięcie mapy linkera.

    Tak to jest jak ignoruje się warning-i:

    Cytat:
    Warning return type defaults to 'int'
    Warning type of '__vector_14' defaults to 'int'
    Warning control reaches end of non-void function [-Wreturn-type]


    stopień nr 10: http://mikrokontrolery.blogspot.com/2011/04/pieklo-poczatkujacych.html
  • #5 16220848
    grko
    Poziom 33  
    BlueDraco napisał:
    Zacznij od wyrzucenia makr zaciemniających i wydłużyjącycgh program.


    O jakie mara dokładnie chodzi?


    BlueDraco napisał:

    Czy ja coś przespałem i preprocesor C akceptuje spacje w liście argumentów makra?


    Tak, przespałeś. Nie widziałem jakiejkolwiek implementacji preprocesora, która by tego nie wspierała.
  • #6 16220874
    Konto nie istnieje
    Konto nie istnieje  
  • #7 16220896
    grko
    Poziom 33  
    @Piotrus_999 No rzeczywiście, program przez to nie działa. Nie jestem zwolennikiem tego typu rozwiązań ale te makra są użyte dosłownie w kilku liniach tego programu. Więc ani specjalnie nie zaciemniają programu ani nie wydłużają (jak sugeruje BD). No chyba, że mówimy o zużyciu klawiatury. Wtedy zwracam honor.
  • REKLAMA
  • #8 16220936
    Konto nie istnieje
    Konto nie istnieje  
  • #9 16220957
    BlueDraco
    Specjalista - Mikrokontrolery
    Co jest szybciej napisać: |=, czy SET_BIT()?

    Co się szybciej czyta: prostą instrukcję, czy wywołanie makra + sprawdzenie, co to makro robi, być może w innym pliku?

    Im więcej takich definicji - tym trudniejsza analiza programów i szukanie w nich błędów.

    Racja, same takie definicje - to jeszcze nie błędy, to tylko napraszanie się o błędy.

    Dawno temu była w programowaniu taka zasada KISS, którą ktoś zgrabnie przetłumaczył na polski jako BUZI - Bez Udziwnień Zapisuj, Id... ;)
  • #10 16223403
    Mateusz0944
    Poziom 11  
    Temat rozwiązany. Zamykam.
REKLAMA