hallo ,
ich bedanke mich, für deinen Antwort.
Code:/************************************************************************* * ______ _______ * PORTA _______| |_______________| |________ * .C ____ ____ * OC1 ___________| |_________________| |_________ **************************************************************************/ #include <avr\io.h> // Wir brauchen Zugriff auf die I/O's des Controllers #include <avr\signal.h> #include <avr\interrupt.h> #include <avr\eeprom.h> // Und auf das Flash #include <inttypes.h> volatile int timer_flag1, timer_flag; long t1s; #define FCLOCK 8000000 #define TCNT0_Reload 6 /************************************************************************* * * für Quartz 8.000MHz * *************************************************************************/ SIGNAL(SIG_OVERFLOW0) { outb(TCNT0, TCNT0_Reload); timer_flag=1; } INTERRUPT(SIG_OUTPUT_COMPARE1A){ /* Compare Match INTERRUPT */ outb(TCCR1B, 0x00); // Timer stoppen } int main(void) { outb(DDRA, 0xff); /* A als Ausgang*/ outb(DDRD, 0xff); /* D als Ausgang OC1A*/ outb(TCNT0, TCNT0_Reload); outb(TCCR0, 0x03); // CPU/64 outb(TCNT1H,0xC2); outb(TCNT1L,0xF7); outb(TCCR1B, 0x03);// ab hier fängt Zähler zu zählen outb(TIMSK, inb(TIMSK) | BV(TOIE0)); /* enable T0 IRQ */ outb(TIMSK, inb(TIMSK) | BV(OCIE1A)); /* wenn dieses Bit gesetzt ist, wird beim Erreichen // des Vergleichswert ein Compare Match INTERRUPT ausgelöst*/ outb(OCR1AH, 0x3D); /* vergleichwert wird in Vergleichregister (OCR1A) gelegt */ outb(OCR1AL, 0x09); outb(TCCR1A, (1<<COM1A1)|(1<<COM1A0)); sei(); /* hier wird Interrupt1 gesetzt*/ /************************************************************************* * MAIN_Loop */ for(;;) { // ... ever while(timer_flag==0) { } timer_flag=0; t1s++; if(t1s>=1000){ t1s=0; if(bit_is_clear(PORTA, PINA0)){ sbi(PORTA, 0); sbi(PORTA, 2); sbi(PORTA, 4); }else{ cbi(PORTA, 0); cbi(PORTA, 2); cbi(PORTA, 4); } } } // for(;;) return 0; }







Zitieren

Lesezeichen