Это почему же? Два часа усиленного штудирования публикаций о таймерах/счетчиках, прерываниях и т.д, привело к результату.
Для меня было открытием, что помимо глобального разрешения прерываний #asm("sei") , есть еще и запрет #asm("cli") , теперь все прекрасно работает)))
#include <mega8.h>
#include <delay.h>
#define GREEN PORTC.1=PORTC.2=PORTC.3=PORTC.0
unsigned char i, s, t=5, tt=200;
unsigned char green=255;
unsigned char green_b; //переменные, для буферизации значений скважности ШИМ
unsigned char count; //переменная- счетчик вызовов обработчика прерываний
unsigned char temp=1;
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
count++;
if (count == 0){ //если счетчик переполнился и принял значение 0
//сохранием значения в буфер
green_b = green;
//выставляем ноги, отвечающие за ШИМ в логическую 1
GREEN = 1;
}
//по достижении заданной скважности выводим логический 0 в ножку МК
if (green_b == count) { GREEN = 0;}
}
void main(void)
{
PORTC=0x0F; //конфигурируем порт
DDRC=0x0F;
TCCR0=0x01; //настраиваем таймер
TCNT0=0x00;
TIMSK=0x01; //разрешаем генерацию прерывания по переполнению таймера T0
//глобально разрешаем прерывания
while (1)
{
#asm("sei")
if (temp==1) {if (green < 255) green += 1; else temp = 2;}
if (temp==2) {if (green > 0) green -= 1; else temp = 3;}
if (temp==3) {if (green < 255) green += 1; else temp = 4;}
if (temp==4) {if (green > 0) green -= 1; else temp = 5;}
if (temp==5) {if (green < 255) green += 1; else temp = 6;}
if (temp==6) {if (green > 0) green -= 1; else temp = 7;}
if (temp==7) {if (green < 255) green += 1; else temp = 8;}
if (temp==8) {if (green > 0) green -= 1; else temp = 9;}
if (temp==9) {if (green < 255) #asm("cli"); temp = 10; }
delay_ms(t);
if (temp==10) {if (green == 0)
s=2;
for (i=0;i<=s;i++)
{
PORTC.0=1;
delay_ms(tt);
PORTC.0=0;
PORTC.1=1;
delay_ms(tt);
PORTC.1=0;
PORTC.2=1;
delay_ms(tt);
PORTC.2=0;
PORTC.3=1;
delay_ms(tt);
PORTC.3=0;
}
for (i=0;i<=s;i++)
{
PORTC.3=1;
delay_ms(tt);
PORTC.3=0;
PORTC.2=1;
delay_ms(tt);
PORTC.2=0;
PORTC.1=1;
delay_ms(tt);
PORTC.1=0;
PORTC.0=1;
delay_ms(tt);
PORTC.0=0;
}
for (i=0;i<=s;i++)
{
PORTC.3=1;
delay_ms(tt);
PORTC.2=1;
delay_ms(tt);
;
PORTC.1=1;
delay_ms(tt);
PORTC.0=1;
delay_ms(tt);
PORTC.3=0;
delay_ms(tt);
PORTC.2=0;
delay_ms(tt);
PORTC.1=0;
delay_ms(tt);
PORTC.0=0;
delay_ms(tt);
}
for (i=0;i<=s;i++)
{
PORTC.0=1;
delay_ms(tt);
PORTC.1=1;
delay_ms(tt);
;
PORTC.2=1;
delay_ms(tt);
PORTC.3=1;
delay_ms(tt);
PORTC.0=0;
delay_ms(tt);
PORTC.1=0;
delay_ms(tt);
PORTC.2=0;
delay_ms(tt);
PORTC.3=0;
delay_ms(tt);
}
for (i=0;i<=s;i++)
{
PORTC=0x01;
delay_ms(tt);
PORTC=0x02;
delay_ms(tt);
PORTC=0x04;
delay_ms(tt);
PORTC=0x08;
delay_ms(tt);
PORTC=0x09;
delay_ms(tt);
PORTC=0x0A;
delay_ms(tt);
PORTC=0x0C;
delay_ms(tt);
PORTC=0x0D;
delay_ms(tt);
PORTC=0x0E;
delay_ms(tt);
PORTC=0x0F;
delay_ms(tt);
PORTC=0x07;
delay_ms(150);
PORTC=0x0B;
delay_ms(tt);
PORTC=0x03;
delay_ms(250);
PORTC=0x05;
delay_ms(300);
PORTC=0x09;
delay_ms(350);
PORTC=0x01;
delay_ms(400);
PORTC=0x02;
delay_ms(tt);
PORTC=0x04;
delay_ms(tt);
PORTC=0x08;
delay_ms(tt);
PORTC=0x00;
delay_ms(tt);
}
for (i=0;i<=5;i++)
{
PORTC=0x0f;
delay_ms(100);
PORTC=0x00;
delay_ms(100);
PORTC=0x0f;
delay_ms(100);
PORTC=0x00;
delay_ms(100);
PORTC=0x0f;
delay_ms(100);
PORTC=0x00;
delay_ms(150);
PORTC=0x0f;
delay_ms(300);
PORTC=0x00;
delay_ms(100);
PORTC=0x0f;
delay_ms(300);
PORTC=0x00;
delay_ms(100);
PORTC=0x0f;
delay_ms(300);
PORTC=0x00;
delay_ms(150);
PORTC=0x0f;
delay_ms(100);
PORTC=0x00;
delay_ms(100);
PORTC=0x0f;
delay_ms(100);
PORTC=0x00;
delay_ms(100);
PORTC=0x0f;
delay_ms(100);
PORTC=0x00;
delay_ms(1000); temp=1;
}
#asm("sei")
}
}
}