The Timer/Counter (TCNT1), Output Compare Registers (OCR1A/B), and Input Capture Register (ICR1) are all 16-bit registers.
Special procedures must be followed when accessing the 16-bit registers.
Описано в Registers для 16-bit Timer/Counter1
Есть там и пример как это сделать
Код:
|
The following code examples show how to do an atomic write of the TCNT1 Register
contents. Writing any of the OCR1A/B or ICR1 Registers can be done by using the
same principle.
C Code Example
void TIM16_WriteTCNT1( unsigned int i )
{
unsigned char sreg;
unsigned int i;
/* Save Global Interrupt Flag */
sreg = SREG;
/* Disable interrupts */
_CLI();
/* Set TCNT1 to i */
TCNT1 = i;
/* Restore Global Interrupt Flag */
SREG = sreg;
} |
TCNT1 замените на OCR1A и OCR1В
В процедуру
Код:
|
interrupt [EXT_INT0] void ext_int0_isr(void)
{ |
добавьте принудительное закрытие тиристора.
Да и включение таймера1 сюда бы перенести.
У вас таймер1 запускается без привязки к напряжению сети вот и получается каша. Я бы так переписал процедуру прерывания
1.закрытие тиристора.
2.остановили таймер1 (для надежности)
3.сбросили таймер1
4.установили OCR1A и OCR1В (так как таймер остановлен, выше приведенную процедуру можете не применять)
5.запустили таймер
При таких изменениях необходимо добавить остановку таймера1 в процедуру
Код:
|
interrupt [TIM1_COMPB] void timer1_compb_isr(void)
{
TRIAC_PIN = 1; // вернулись в режим ожидания |
Это избавит вас от морганий.