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 }
Lesezeichen