schamp
06.07.2005, 09:36
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... :-k
Hat jemand ne Ahnung warum ??
Gruß schamp
#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
}
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... :-k
Hat jemand ne Ahnung warum ??
Gruß schamp
#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
}