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