[Icc-avr] Is there something wrong with this RTC interrupt?

Scott Kelley scottk at skelleyco.com
Fri Jan 4 16:36:19 PST 2008


>> Since you have obviously once done a lot of assembler
programming...
Actually, I have not done Any assembly - it's pretty much
just gibberish to me.  I have a moderate amount of C
experience and understanding, but I know virtually nothing
about what is going on once compiled.


I eliminated the CLI() and SEI() instructions.  No change -
the RTC is still adding about .0026 seconds to each minute.


That's almost 10,000 main clock cycles and about 85 RTC
cycles per minute.  Since there doesn't seem to be a clear
connection to the number of RTC cycles, it does make sense
to me that it is an error in the code execution rather than
in the RTC itself, which I would expect to show up as some
multiple of 60 cycles per minute.

So I'm still stumped.  Any other thoughts?

Here's the code, including changes:

void rtc_init(void) {  // init timer for 1 second interrupt
CLI(); //disable all interrupts - prevent errant interrupts
until set up
TCCR0 &= ~(1<<WGM00); TCCR0 &= ~(1<<WGM01); // Set timer for
normal operation  WGM00 = 0, WGM21 = 0
TCCR0 &= ~0x02; TCCR0 |= 0x05; // counter 0 prescaler = 128
CS02=1, CS01=0, CS00=1 (Timer Clock = 32,768 / TCCR2)
TIMSK &= ~((1<<TOIE0)|(1<<OCIE0)); // Disable Timer0
Interrupt  TOIE0 = 0, OCIE0 = 0 
ASSR |= (1<<AS0);  //set Timer/Counter0 for asynchronous
operation - 32,768 Hz crystal  AS0 = 1  
TCNT0 = 0x00;
TIMSK |= (1<<TOIE0); // Enable Timer0 overflow Interrupt
SEI(); //set the Global Interrupt Enable Bit  
}  //void rtc_init(void)


void timer0_overflow_isr(void) {  // Clock ISR - overflow
occured TCNT2=OCR2
  GeneralTimer++;
  CommunicationsTimeout ++;
  SecondFlag = 1;
  WDTimerFlag = 1;
  if (++second>59) { //keep track of time, date, month, and
year
    second=0;
    MinuteFlag = 1;  // Additional clock service is now
passed back to the main code 
    }
}  
 

> -----Original Message-----
> From: icc-avr-bounces at imagecraft.com 
> [mailto:icc-avr-bounces at imagecraft.com] On Behalf Of John
Baraclough
> Sent: Friday, January 04, 2008 8:58 AM
> To: Discussion list for ICCAVR and ICCtiny Users. You do
NOT 
> need tosubscribe to icc-announce if you are a member of
this.
> Subject: Re: [Icc-avr] Is there something wrong with this
RTC 
> interrupt?
> 
> As Bob has said it is the SEI() at the end of your
interrupt handler 
> that is probably the culprit. The purpose of the '#pragma 
> interrupt_handler' is to force the compiler to put a RETI 
> instruction at 
> the end of the function rather than a normal RET. Have a
look at the 
> list file and see where the SEI() instruction is in
comparison to the 
> RETI and you'll see the problem immediately.
> 
> Since you have obviously once done a lot of assembler
programming, it 
> would help you a great deal if you downloaded  the AVR 
> instruction set 
> document from the Atmel website:
> 
>
http://www.atmel.com/dyn/resources/prod_documents/doc0856.pd
f
> 
> 
> John
> 
> 
> 
> Scott Kelley wrote:
> > I'm well in over my head with this stuff...
> >  
> > I don't understand why cli does nothing...
> >  
> > I've forgotten more than I ever knew about machine
language... what 
> > would be occurring if "The second one reenables ints
BEFORE 
> the regs 
> > are popped"?  What would be the way to deal with this?
> >  
> 
> _______________________________________________
> Icc-avr mailing list
> Icc-avr at imagecraft.com
> http://dragonsgate.net/mailman/listinfo/icc-avr



More information about the Icc-avr mailing list