avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [avr-gcc-list] SIGNAL or INTERRUPT ?!


From: User Tomdean
Subject: Re: [avr-gcc-list] SIGNAL or INTERRUPT ?!
Date: Sun, 4 Sep 2005 06:33:23 -0700 (PDT)

In the ATmega16 application I previously mentioned in the 'Using X and
Z register in global variables' discussion, I used

void SIG_ADC (void) __attribute__ ((naked));
void SIG_ADC (void) {
  register uint8_t tmp;
  register uint8_t HEAD_hi asm ("r31");
  tmp = SREG;
  asm("in r6, %0\n"
      "st Z+, r6\n"
      ::"i"(_SFR_IO_ADDR(UMP2_DATA)));
  /* a byte compare will do, avoid the extra instruction with */
  if (HEAD_hi > 0x04) {
        HEAD = (uint8_t *)0x0100;  /* never actually do this */
  }
  SREG = tmp;
  asm("reti");
}

to make the ISR as fast as possilbe.

I overclock the ADC to 2 mHz and get an interrupt every 6.2 uSec.  The
high byte of the left justified adc seems stable.

If the ISR is time critical, omit the 'call ...' and make everything
inline.  I use avr-objdump to tune the ISR.

The application is small, so I used avr-objdump and grep to verify
there are no conflicts in the use of Z, and, in main(), X.  The whole
application is 0x0129 bytes.

tomdean




reply via email to

[Prev in Thread] Current Thread [Next in Thread]