Вот примерно так:
CODE:
#include <iom8.h>
#include <inavr.h>
#define SETBIT(ADDR,BIT) (ADDR |=(1<<BIT))
#define CLRBIT(ADDR,BIT) (ADDR &=~(1<<BIT))
#define CHECKBIT(ADDR, BIT) (ADDR & (1<<BIT))
#define TOGGLEBIT(ADDR, BIT) (ADDR ^= (1 << BIT))
#define Xtal 8000000
unsigned char ok_gen;
unsigned int count1,count2;
#pragma vector=TIMER1_COMPA_vect
__interrupt void timer1_compa_isr(void)
{
if(ok_gen==1)
{
count1++;
count2++;
if(count1==2000)
{
SETBIT(PORTD,1);
SETBIT(PORTD,2);
}
if(count1==4000)
{
CLRBIT(PORTD,1);
CLRBIT(PORTD,2);
count1=0;
}
if(count2<3)
{
SETBIT(PORTD,0)
}
else
{
CLRBIT(PORTD,0)
}
if(count2==250){count2=0;}
}
}
void main(void)
{
asm("cli");
DDRC=0xDF;
PORTC=0x20;
DDRD=0xFF;
PORTD=0x00;
TCCR1A=0x00;
TCCR1B=0x01;
OCR1A=0x018F;
TIMSK=0x10; //Прерывания по 50 мкс
asm("sei");
for(;;)
{
if(CHECKBIT(PINC,5)
{
if(ok_gen==1)
{
CLRBIT(PORTD,3);
ok_gen=0;
}
else
{
SETBIT(PORTD,3);
ok_gen=1;
}
}
__delay_cycles(0.5*Xtal);
}
}
|