[En-Nut-Discussion] Interrupt question

Lars Andersson laran at ikp.liu.se
Wed Nov 6 15:38:16 CET 2002


Hi all,

My question is related to the initiation of interrupt routines using Nut-Os. What I really want to do is to setup timer1 on the Mega128 to output a changeable frequency. At the same time I want a function to be executed when output toggles.  So far I have managed to output and control the frequency of the signal by testing it up as CTC using the OCR1A register as top value.
My next problem is to execute the function as I get the compare match on timer1.
Below is some code showing what I have come up with so far. The idea is that the timer output should toggle, and the interrupt should toggle PORTB pin 0. The timer output works fine, but it does not toggle on pin 0.

Please help!
/Lars Andersson



void Timer1CompA_ISR(void *arg)
{
	// Toggle pin 0 on PORTB.
	if((inp(PORTB) & 0x01) == 0x01)
	 cbi(PORTB, 0);
	else
	 sbi(PORTB, 0);
}

THREAD(NutMain, arg)
{
    DDRB=0xFF;		//Set direction of PORTB to output
    PORTB=0x00;	//Set all pinns to low.

    TCCR1A=0x40;	//Toggle output A on compare match
    TCCR1B=0x0D;	//Set operating mode to CTC anf freq. to 14,4 kHz
    OCR1AL=0xFF;	//Set compare match togenerate an output freq of aprox. 28Hz.

    NutRegisterInterrupt  (  IRQ_TIMER1_COMPA, Timer1CompA_ISR, 0);	//Register interrupt
    
    for(;;)
     {
      NutSleep (1000);	//Just so that we do something;
     }
} 



More information about the En-Nut-Discussion mailing list