Hi...
Keiner ne idee?? Bin schon die ganze zeit am suchen...
derzeitiger stand
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#ifdef F_CPU
#undef F_CPU
#endif
#define F_CPU (1000000*16)
#define MHZ *1000000
// und IRQS_PER_SECOND ein Vielfaches von 100.
// Ausserdem muss gelten F_CPU / IRQS_PER_SECOND <= 65536
#define IRQS_PER_SECOND 1000
// Anzahl IRQs pro 10 Millisekunden
#define IRQS_PER_10MS (IRQS_PER_SECOND / 100)
///////////////////////////////////////////////////////////////////////////////////////////////
// Zähler-Variable. Wird in der ISR erniedrigt und in wait_10ms benutzt.
static volatile uint16_t timer;
// Prototypen
void timer1_init();
void wait (const uint16_t);
////////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
DDRC = 0xFF;//An C liegen die LEDs
PORTC = 0x02;//LEDs aus
// Timer1 initialisieren
timer1_init();
// Interrupts aktivieren
sei();
while (1)
{
// LED an
PORTC |= 0xF0;
// 1 Sekunde warten
wait(50000);
// LED aus
PORTC &= 0x0F;
// 1 Sekunde warten
wait(50000);
}
return;
}
//-----------------------------------------------------------------------------------------------
void timer1_init()
{
// Timer1: keine PWM
TCCR1A = 0;
TCCR1B = (1 << WGM12) | (1 << CS10);
OCR1A = (unsigned short) ((unsigned long) (16 MHZ) / IRQS_PER_SECOND - 1);
TIMSK |= (1 << OCIE1A);
}
//-----------------------------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
void wait(const uint16_t t)
{
timer = t;
while (timer);
}
////////////////////////////////////////////////////////////////////////
SIGNAL (SIG_OUTPUT_COMPARE1A)
{
static uint8_t interrupt_num;
if(++interrupt_num == IRQS_PER_SECOND/100) //eine Zeiteinheit vergangen (10ms/100ms)
{
interrupt_num = 0;
if(timer != 0)timer--;
}
}
warum funktioniert das nicht??
Lesezeichen