Hi zusammen !

Hab mir eine delay-Funktion selbstgebastelt. Verwende dafür den 8 Bit Timer0. Für ein Delay von 1 Sekunde brauch ich bei einer fosc von 4 Mhz und nem Prescaler-Wert von 8 ca. 1953 Timeroverflows (Formeln siehe Quellcode).
In der ISR dekrementiere ich dann diese 1953 und warte dabei in einer Endlosschleife, bis das ganze auf Null ist (damit wäre dann ca. 1 Sekunde vergangen).
Dummerweise wird die while(1)-Schleife in der delay()-Funktion anscheinend nie verlassen, da die LED nicht blinkt...
Hat jemand ne Ahnung warum ??

Gruß schamp

Code:
#include <iom88.h>
#include <ina90.h>

#define  DLY_1_SEC        1953     // Formula: Time for one Timer0 Overflow t=(Prescalevalue*256)/fosc
                                   // Prescalevalue=8, fosc=4MHz --> t=0,512 msec for one overflow
                                   // To get a delay of 1 sec --> 1sec/0,512msec=1953 overflows are needed

volatile unsigned int pause_timer; // must be volatile or the interrupt routine will not change the value

void delay_init(void);

void delay(int tvalue);

__task void main(void)
{

  delay_init();

  while(1)
  {
    delay(DLY_1_SEC);
    PORTB ^= (1<<PB0);  // toggle LED
  }
}


void delay_init(void)
{
  DDRB = 0xff; 	// set for all outputs
  PORTB = 0xff;	// turn off all leds
	
  TCCR0B |= (1 << CS01);  // Timer clock = system clock / 8
}



// Generates an interrupt every 0.512 ms for fosc = 4 MHz and prescale of 8

#pragma vector=TIMER0_OVF_vect
__interrupt void tim0_ovf(void)
{
	// Decrement timer if timer is not 0
	//if (pause_timer != 0)
          pause_timer--;
}


void delay(int tvalue)
{
  pause_timer = tvalue;

  TIMSK0 |= (1<<TOIE0);	  // Enable T/C0 overflow interrupt

  __enable_interrupt();   // enable interrupts

  while(1)
  {
    if(pause_timer == 0) break;
  }

  __disable_interrupt();   // disable interrupts
}