Код: Выделить всё
#include <mega128.h>
#include <delay.h>
#define BUTTON_READY PORTA.0
#define BEEP PORTA.1
int unsigned WaitCounter = 0;
int unsigned iHzCounter = 0;
int unsigned beepCounter = 0;
bit ReadyLightStatus = 0;
bit beepUBeep =0;
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
iHzCounter++;
beepCounter++;
//счетчик милисекунд
{
if (beepCounter>50)
{
beepCounter=0;
if (beepUBeep==0)
{
beepUBeep=1;
BEEP=1;
}
else
{
beepUBeep=0;
BEEP=0;
}
}
if (iHzCounter >= 125)//т.е. 1 мсек
{
iHzCounter =0;
WaitCounter++;
if (WaitCounter>=500)//т.е. каждые 500 мсек (ДОЛЖНО БЫТЬ) меняем состояние
{
WaitCounter=0;
if (ReadyLightStatus == 1)
{
BUTTON_READY=1;
ReadyLightStatus=0;
}
else
{
BUTTON_READY=0;
ReadyLightStatus=1;
}
}
}
}
TCNT0=0;
}
void main(void)
{
PORTA=0x00;
DDRA=0xFF;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
ASSR=0x00;
TCCR0=0x05;
TCNT0=0x00;
OCR0=1;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;
ETIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;// Global enable interrupts
#asm("sei")
while (1)
{
};
}
кварц: 16mHz
цель: получить внутренний ТОЧНЫЙ таймер
Он должен каждые 500мсек менять состояние, т.е. период включение(начало)-выключение-включение(начало) должен проходить за 1сек, а в реальности проходит около 2 сек.
Как заставить его давать мне точное время?
Второе прерывание? А если оно сгенерируется во время работы первого? Прервет ли оно первое?
Или отдельные часы на какой-нибудь тиньке?
ЗЫ: весь код несколько больше и в прерывании реализован ШИМ(программно) и 2 пищалки.
заранее спасибо.
UPD: обновил код, чтобы не возникало вопросов по поводу возможного упрощения.


