IVT for Atmega644ap missing Vectors > __vector_20

Eastman Hackney <[email protected]>
Newsgroups gmane.comp.hardware.avr.gcc
Message-ID <[email protected]>

I'm stumped & some help would be GREATLY appreciated. Weening myself from
Windows and AVR Studio (after realizing that it uses avr-gcc!). I apologize if
this posting is verbose - but I wanted to be thorough. 


Using avr-gcc version 4.3.4 (obtained with 'apt-get install gcc-avr avr-libc avrdude' ...).


Compiling and linking with commands copied from the avr-libc user manual:

 avr-gcc -c -gstabs -g -O0 -mmcu=avr5 -mmcu=atmega644p main.c
 avr-gcc -mmcu=avr5 -mmcu=atmega644pa -o main.elf main.o -lm
 avr-objdump -D -h -S main.elf > main.lst
 avr-gcc -g -mmcu=avr5 -mmcu=atmega644pa -Wl,-Map,main.map -o main.elf main.o
 avr-objcopy -j .text -j .data -O ihex   main.elf   main.hex
 sudo avrdude -P usb -p m644 -c jtagmkII -e -U flash:w:main.hex:a

When flash is loaded, the code runs fine, including a Timer0 ISR. But if I enable the UART1
TXCIE1 interrupt flag (Atmega644 has two Uarts), the USART1_UDRE_vect does not seem 

to show up in the interrupt Vector Table.


Looking at the compiler-generated code in main.lst shows only 21 vectors (Atmega644 datasheet
lists 31 vectors), and does not include a vector for USART1_UDRE_vect. The listed vectors seem 

correct for the Atmega644, but why won't it include  vectors greater than vector_20, and specifically
the one for  USART1_UDRE_vect?

Listing of main.lst:

Disassembly of section .text:

00000000 <__vectors>:
   0:    0c 94 2a 00     jmp    0x54    ; 0x54 <__ctors_end>
   4:    0c 94 60 03     jmp    0x6c0    ; 0x6c0 <__vector_1>
   8:    0c 94 61 03     jmp    0x6c2    ; 0x6c2 <__vector_2>
   c:    0c 94 62 03     jmp    0x6c4    ; 0x6c4 <__vector_3>
  10:    0c 94 47 00     jmp    0x8e    ; 0x8e <__bad_interrupt>
  14:    0c 94 47 00     jmp    0x8e    ; 0x8e <__bad_interrupt>
  18:    0c 94 47 00     jmp    0x8e    ; 0x8e <__bad_interrupt>
  1c:    0c 94 47 00     jmp    0x8e    ; 0x8e <__bad_interrupt>
  20:    0c 94 63 03     jmp    0x6c6    ; 0x6c6 <__vector_8>
  24:    0c 94 47 00     jmp    0x8e    ; 0x8e <__bad_interrupt>
  28:    0c 94 47 00     jmp    0x8e    ; 0x8e <__bad_interrupt>
  2c:    0c 94 47 00     jmp    0x8e    ; 0x8e <__bad_interrupt>
  30:    0c 94 47 00     jmp    0x8e    ; 0x8e <__bad_interrupt>
  34:    0c 94 47 00     jmp    0x8e    ; 0x8e <__bad_interrupt>
  38:    0c 94 47 00     jmp    0x8e    ; 0x8e <__bad_interrupt>
  3c:    0c 94 67 03     jmp    0x6ce    ; 0x6ce <__vector_15>
  40:    0c 94 7e 02     jmp    0x4fc    ; 0x4fc <__vector_16>
  44:    0c 94 47 00     jmp    0x8e    ; 0x8e <__bad_interrupt>
  48:    0c 94 47 00     jmp    0x8e    ; 0x8e <__bad_interrupt>
  4c:    0c 94 47 00     jmp    0x8e    ; 0x8e <__bad_interrupt>
  50:    0c 94 64 03     jmp    0x6c8    ; 0x6c8 <__vector_20>

00000054 <__ctors_end>:
  54:    11 24           eor    r1, r1

The C source code for the USART1_UDRE_vect is:

ISR(USART1_UDRE_vect, ISR_NAKED)  
{
uc cSREG;

         cSREG = SREG;         
         if (U1_tx_count > 0)
            {
            UDR1 = U1_tx_fifo[U1_tx_optr];
            U1_tx_optr++;
            if (U1_tx_optr >= TX_FIFO_SIZ)
                U1_tx_optr = 0;
            U1_tx_count--;
            }
         else
            UCSR1B &= ~(1 << UDRIE1);  
         SREG = cSREG;
         reti();     
}


Thanks for considering this. East Hackney

_______________________________________________
AVR-GCC-list mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/avr-gcc-list
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.