[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [avr-gcc-list] ATMega16 interrupt vectors
From: |
James Washer |
Subject: |
Re: [avr-gcc-list] ATMega16 interrupt vectors |
Date: |
Sat, 10 Dec 2005 07:28:51 -0800 |
Just for fun, try adding the -mmcu=atmega16 to the link loader line as well.
On Sat, 10 Dec 2005 14:57:30 +0100
Henrik Brix Andersen <address@hidden> wrote:
> Hi,
>
> I've stumbled across a problem using interrupts with the Atmel AVR
> Mega16(L). I have isolated a small test-case demonstrating the
> problem (attached).
>
> The test case works as expected when compiled with the commercial
> Codevision AVR C compiler, but triggers the wrong ISR when compiled
> with avr-gcc. If I redefine the INT0_vect and INT1_vect values as
> shown at the top of the file, it triggers the correct ISRs. The odd
> thing is that the disassembly looks correct, at least to me.
>
> The code should be self-explaining, but here's a small description of
> what I expect it to do: I enable external interrupts 0 and 1 which are
> both connected to push-buttons, and use them to alter the state of
> PORTB, which is connected to a row of LEDs.
> * At system reset the PD7 LED is turned on.
> * Pulling INT0 low should turn on the PD0 LED.
> * Pulling INT1 low should turn on the PD1 LED.
>
> That's how the program works when compiled with the Codevision AVR C
> compiler.
>
> But this is what actually happens when compiled with avr-gcc:
> * At system reset the PD7 LED is turned on (as expected).
> * Pulling INT0 low turns on PD1 (INT1 ISR is executed?).
> * Pulling INT1 low causes a system reset (or triggers
> __vector_default if specfied).
>
>
> I've used the following software to test this:
>
> avr-libc-1.4.0
>
> $ avr-gcc --version
> avr-gcc (GCC) 3.4.4 (Gentoo 3.4.4-r1, ssp-3.4.4-1.0, pie-8.7.8)
>
> $ avr-objcopy --version
> GNU objcopy 2.16.1
>
> The Codevision AVR C compiler used to verify this was version 1.24.6
> Standard.
>
>
> These are the commands I used for compiling the test case with avr-gcc:
>
> $ avr-gcc -mmcu=atmega16 -Wall -c main.c
> main.c: In function `main':
> main.c:26: warning: large integer implicitly truncated to unsigned type
>
> $ avr-gcc -o interrupt-test.out main.o
>
> $ avr-objcopy -j .text -j .data -O ihex interrupt-test.out
> interrupt-test.hex
>
>
> The resulting interrupt-test.hex file was written to the AVR using
> avrdude-5.0 and an STK500v2 programmer:
>
> $ avrdude -c stk500v2 -p atmega16 -P /dev/ttyUSB0 -e -U
> flash:w:interrupt-test.hex
>
>
> The disassembly (attached) was produced like this:
>
> $ avr-objdump -S interrupt-test.out > interrupt-test.s
>
>
> Can someone explain the cause of this?
>
> Regards,
> Brix
>
> PS: I hope this is the correct mailing list for this kind of questions
> - couldn't find the difference between this list and the avr-libc-dev
> list?
> --
> Henrik Brix Andersen <address@hidden>
> Gentoo Metadistribution | Mobile computing herd
>