Die Initialisierung ist soweit ok. Es ist allerdings u.U. besser, TCCR0 wirklich zu setzen, damit alle Bits den gewünschten Wert haben. Sollte bei dir aber egal sein.
Code:
void Timer_Inits(void)
{
//Timer Interrupt=(Quarzfreq 16000000/8Bit-Ueberlauf 256)/ Prescaler 1024= 16mS
//letzte 3 Bit von Timer Clock Control: Prescaler = Quarz/1024:
TCCR0 = (1 << CS00) | (1 << CS02);
//Timer Interrupt Mask Register Bit 1 setzen fuer Timer Overflow Interrupt enable:
TIMSK |=(1<<TOIE0);
}
Wenn ich's recht sehe, willst du so was wie Timeouts machen: Nen Port an und nach ner bestimmten Zeit wieder aus, wahrscheinlich unterschiedliche Zeiten für die verschiedenen Ports...
Du könntest dir eine Struktur machen mit Countdown-Werten, die du setzt und die in der ISR bis aus 0 zurückgezählt werden, eine Einheit pro Tick (16ms):
Code:
typedef struct
{
uint8_t takt;
uint8_t bass;
...
} countdown_t;
volatile countdown_t countdown;
SIGNAL (SIG_OVERFLOW0)
{
uint8_t i = sizeof (countdown_t);
uint8_t * cd = (uint8_t *) &countdown;
cd += i;
do
{
uint8_t wert = *(--cd);
if (wert)
*cd = wert-1;
} while (--i);
}
Dadurch werden in jedem Tick die Elemente von countdown, die nicht 0 sind, um 1 erniedrigt.
Code:
int main()
{
ioinit();
Timer_Inits();
sei();
// Hauptschleife
while (1)
{
if (countdown.takt == 0)
{
countdown.takt = 200;
countdown.bass = 20;
PORTC |= (1 << 1);
}
if (countdown.bass == 0)
{
PORTC &= ~(1 << 1);
}
}
Lesezeichen