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

Attiny2313 WinAVR201 - Przerwanie INT0 i INT1 wywala błąd przy kompilacji

marek_ka 09 Wrz 2012 21:59 2247 7
REKLAMA
  • #1 11295485
    marek_ka
    Poziom 26  
    Posty: 1019
    Pomógł: 23
    Ocena: 173
    Nie mogę sobie poradzić z przerwaniami, nie widzę w którym miejscu zrobiłem błąd. Kompilator czepia się linii ISR(INT0_vect) i ISR(INT1_vect)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 11295506
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2206
    Czepia się, bo wszystkie funkcje (w tym ISR) umieściłeś w main. ISR z natury są globalne, więc nie mogą być zagnieżdżone w ciele innej funkcji.
  • REKLAMA
  • #3 11295532
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    1. Dlaczego definiujesz funkcje obsługi przerwań w funkcji main() ?
    2. Podobnie z funkcją: IMPULS_ZGRZEWARKI()

    W tym leży Twój problem, który po zlikwidowaniu w efekcie daje:

    Cytat:
    Build started 9.9.2012 at 22:09:48
    avr-gcc -mmcu=attiny2313 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT dd.o -MF dep/dd.o.d -c ../dd.c
    avr-gcc -mmcu=attiny2313 -Wl,-Map=PROBY.map dd.o -o PROBY.elf
    avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature PROBY.elf PROBY.hex
    avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex PROBY.elf PROBY.eep || exit 0
    avr-objdump -h -S PROBY.elf > PROBY.lss

    AVR Memory Usage
    ----------------
    Device: attiny2313

    Program: 442 bytes (21.6% Full)
    (.text + .data + .bootloader)

    Data: 8 bytes (6.3% Full)
    (.data + .bss + .noinit)


    Build succeeded with 0 Warnings...



    EDIT:
    Tmf jest szybki :)
  • #4 11296051
    marek_ka
    Poziom 26  
    Posty: 1019
    Pomógł: 23
    Ocena: 173
    Dziękuję za zainteresowanie. Z powodu grypy nie napisałem precyzyjnie.

    Gdy umieściłem ISR(INT0_vect) przed main lub na końcu to program kompiluje się bez błędów ale nie działają przerwania. W desperacji próbowałem umieścić ISR() w innym miejscu. Układ mam na 100% sprawny, ponieważ jak przerobiłem program na bez przerwań to mam impulsy na PD0.
    Chciałbym jednak korzystać z przerwań.

    Kol. Dondu u ciebie po kompilacji program zajmuje 442 bytes a u mnie 464, skąd taka różnica?
  • REKLAMA
  • #5 11296490
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #6 11297268
    marek_ka
    Poziom 26  
    Posty: 1019
    Pomógł: 23
    Ocena: 173
    Słusznie już poprawiłem, ale i tak nie działa.

    Wcześniej miałem taki zapis:
    GIMSK = 0b11000000; //włącz obsługę przerwań Int0 i Int1
    MCUCR = 0b00001010; // generowanie przerwań przez opadające zbocze na Int0 i Int1
  • #7 11298566
    Konto nie istnieje
    Poziom 1  
  • #8 11299475
    marek_ka
    Poziom 26  
    Posty: 1019
    Pomógł: 23
    Ocena: 173
    Oczywiście przerwania działają.
    Jak się ma grypę to się leży w łóżku. Błąd w programie jest w IMPULS_ZGRZEWARki, zamiast PORTD napisałem DDRD.

    Dziękuję wszystkim za pomoc.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik miał problemy z kompilacją kodu dla mikrokontrolera ATtiny2313, związane z przerwaniami INT0 i INT1. Błąd kompilacji wynikał z umieszczenia funkcji ISR wewnątrz funkcji main, co jest niezgodne z zasadami programowania w C. Po przeniesieniu ISR poza main oraz poprawieniu błędów w rejestrach GIMSK i MCUCR, przerwania zaczęły działać. Ostatecznie problem został rozwiązany, gdy użytkownik zidentyfikował błąd w funkcji obsługi impulsów, gdzie użył niewłaściwego rejestru.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA