Так тот же самы только я всякие ошибки поубирал
#define TMR 65380L //0xFF64 : 78 мкс (при тактовой 16МГц и делителе : 1 такт 128-разрядного ШИМ
volatile unsigned int i,m,n,nn,mm,q,qq,Counter_chanel;
#define PWM_PORTC_MASK 0xC3
#define PWM_PORTD_MASK 0xE0
volatile unsigned char PWM_buffer[15] ;
void delay_ms(int n)
{
int i;
for(i=0;i‹n;i++){ _delay_ms(1);}
}
//Прерывание по переполнению таймера 1
ISR(SIG_OVERFLOW1)
{
static unsigned char Tic;
static unsigned char PWM_portA;
static unsigned char PWM_portD;
static unsigned char PWM_portC;
TCNT1 = TMR; //начальное значение таймера
PORTA=PWM_portA;
// PWM_portA|=PORTA&~PWM_PORTD_MASK;
PORTC=PWM_portC;
PWM_portC|=PORTC&~PWM_PORTC_MASK;
PORTD=PWM_portD;
PWM_portD|=PORTD&~PWM_PORTC_MASK;
if((Tic++)›=12
Tic=0;
PWM_portA=0;
PWM_portC=0;
PWM_portD=0;
// Канал 0
if (Tic ‹ PWM_buffer[0])PWM_portA|=0x01;
if (Tic ‹ PWM_buffer[1])PWM_portA|=0x02;
if (Tic ‹ PWM_buffer[2])PWM_portA|=0x04;
if (Tic ‹ PWM_buffer[3])PWM_portA|=0x08;
if (Tic ‹ PWM_buffer[4])PWM_portA|=0x10;
if (Tic ‹ PWM_buffer[5])PWM_portA|=0x20;
if (Tic ‹ PWM_buffer[6])PWM_portA|=0x40;
if (Tic ‹ PWM_buffer[7])PWM_portA|=0x80;
// Канал 8 - здесь переходим к следующему порту
if (Tic ‹ PWM_buffer[8])PWM_portC|=0x80;
if (Tic ‹ PWM_buffer[9])PWM_portC|=0x40;
if (Tic ‹ PWM_buffer[10])PWM_portC|=0x01;
if (Tic ‹ PWM_buffer[11])PWM_portD|=0x80;
if (Tic ‹ PWM_buffer[12])PWM_portD|=0x20;
if (Tic ‹ PWM_buffer[13])PWM_portD|=0x40;
if (Tic ‹ PWM_buffer[14])PWM_portC|=0x02;
}
//************************************************** *
// Начало программы
//************************************************** *
int main(void)
{
unsigned char Counter_chanel=0;
unsigned char PWM_value=0;
DDRA=0xFF; //порты - на выход
DDRC=0xFF;
DDRD=0xFF;
PORTA=0x00;
PORTC=0x00;
PORTD=0x00;
delay_ms(1000);
n=5; //задержка в мс между шагами яркости
q=0;
nn=1; // гашение
mm=2; //гашение
m=50; //задержка в мс между "кадрами"
TCNT1 = TMR; //начальное значение счетчика
TIMSK &= ~(1‹‹TOIE1); //запрещаем Ovf1
cli(); //запрещаем прерывания
TIMSK |= 1‹‹TOIE1; //Разрешить Ovf1
TCCR1B |= 0x2; //включить таймер 1 с делителем 8
sei(); //разрешить прерывания
while(1)
{
for(Counter_chanel=0;Counter_chanel‹15;Counter_cha nel++)
{
for(PWM_value=0;PWM_value‹128;PWM_value++)
{
PWM_buffer[Counter_chanel]=PWM_value;
delay_ms(n);
}
delay_ms(m);
}
delay_ms(3000);
}
}