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.

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

marek_ka 09 Wrz 2012 21:59 1695 7
  • #1 09 Wrz 2012 21:59
    marek_ka
    Poziom 26  

    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
    Zaloguj się, aby zobaczyć kod

    0 7
  • #2 09 Wrz 2012 22:03
    tmf
    Moderator Mikrokontrolery Projektowanie

    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.

    0
  • #3 09 Wrz 2012 22:09
    dondu
    Moderator Mikrokontrolery Projektowanie

    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 :)

    0
  • #4 10 Wrz 2012 08:01
    marek_ka
    Poziom 26  

    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?

    0
  • #5 10 Wrz 2012 11:30
    voytaschec
    Poziom 24  

    Tym nie włączysz przerwania INT1:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Musi być:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #6 10 Wrz 2012 16:36
    marek_ka
    Poziom 26  

    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

    0
  • #7 10 Wrz 2012 22:20
    voytaschec
    Poziom 24  

    W tym ATtiny nie ma pinu PD6, którego sprawdzasz:

    Kod: C
    Zaloguj się, aby zobaczyć kod


    Pewnie chodziło Ci o pin PD3 (ten od INT1)?

    EDIT: Ups, błąd, jest PD6 :)

    Mógłbyś dodać jakiś schemat albo opisać jak to ma w zamierzeniu działać? W jakim celu blokujesz przerwania?

    0
  • #8 11 Wrz 2012 10:18
    marek_ka
    Poziom 26  

    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.

    0