picavr вот и я о том же принцип одинаковый, таймер он и в африке таймер, но в АВР таймер по другому вызывается и всякие прерывания, т.е для меня который ни разу не программил для АВР и не работал с прерываниями , это вызывает трудности а в ООП поставил таймер и пиши что хочешь в самом таймера
код я не изменял оставил как есть просто решил сделать для 1 пина.
Т.е получается что при подаче питания на выходах уже 1 вместо 0, также нет полного гашения светодиода.
#define TMR 65380L //0xFF64 : 78 мкс (при тактовой 16МГц и делителе
: 1 такт 128-разрядного ШИМ
#define sbi(p,m) ((p) |= 1‹‹(m)) //установить бит m порта p
#define cbi(p,m) ((p) &= ~(1‹‹(m))) //сбросить бит m порта p
//#define Kanal_0 =0;
volatile unsigned int Tic; //счетчик тиков/прерываний/шагов ШИМ
volatile unsigned int i,m,n;
volatile unsigned char Ch_0,Ch_1,Ch_2,Ch_3,Ch_4,Ch_5,Ch_6,Ch_7,Ch_8,Ch_9, Ch_10,Ch_11,Ch_12,Ch_13,Ch_14,Ch_15;
volatile unsigned char Kanal_0=0,Kanal_1,Kanal_2,Kanal_3,Kanal_4,Kanal_5, Kanal_6,Kanal_7;
volatile unsigned char Kanal_8,Kanal_9,Kanal_10,Kanal_11,Kanal_12,Kanal_1 3,Kanal_14,Kanal_15;
//Прерывание по переполнению таймера 1
ISR(SIG_OVERFLOW1)
{
TCNT1 = TMR; //начальное значение таймера
// Канал 0
if (Tic ‹ Ch_0) sbi(PORTA,0);
else cbi(PORTA,0);
// Канал 1
if (Tic ‹ Ch_1) sbi(PORTA,1);
else cbi(PORTA,1);
// Канал 2
if (Tic ‹ Ch_2) sbi(PORTA,2);
else cbi(PORTA,2);
// Канал 3
if (Tic ‹ Ch_3) sbi(PORTA,3);
else cbi(PORTA,3);
// Канал 4
if (Tic ‹ Ch_4) sbi(PORTA,4);
else cbi(PORTA,4);
// Канал 5
if (Tic ‹ Ch_5) sbi(PORTA,5);
else cbi(PORTA,5);
// Канал 6
if (Tic ‹ Ch_6) sbi(PORTA,6);
else cbi(PORTA,6);
// Канал 7
if (Tic ‹ Ch_7) sbi(PORTA,7);
else cbi(PORTA,7);
// Канал 8 - здесь переходим к следующему порту
if (Tic ‹ Ch_
sbi(PORTC,0);
else cbi(PORTC,0);
// Канал 9
if (Tic ‹ Ch_9) sbi(PORTC,1);
else cbi(PORTC,1);
// Канал 10
if (Tic ‹ Ch_10) sbi(PORTC,2);
else cbi(PORTC,2);
// Канал 11
if (Tic ‹ Ch_11) sbi(PORTC,3);
else cbi(PORTC,3);
// Канал 12
if (Tic ‹ Ch_12) sbi(PORTC,4);
else cbi(PORTC,4);
// Канал 13
if (Tic ‹ Ch_13) sbi(PORTC,5);
else cbi(PORTC,5);
// Канал 14
if (Tic ‹ Ch_14) sbi(PORTC,6);
else cbi(PORTC,6);
// Канал 15
if (Tic ‹ Ch_15) sbi(PORTC,7);
else cbi(PORTC,7);
Tic++; //увеличиваем счетчик тиков
if(Tic==12
{
Tic=0; //начинаем все сначала
//и только теперь переходим к новым значениям яркости
Ch_0=Kanal_0;
Ch_1=Kanal_1;
Ch_2=Kanal_2;
Ch_3=Kanal_3;
Ch_4=Kanal_4;
Ch_5=Kanal_5;
Ch_6=Kanal_6;
Ch_7=Kanal_7;
Ch_8=Kanal_8;
Ch_9=Kanal_9;
Ch_10=Kanal_10;
Ch_11=Kanal_11;
Ch_12=Kanal_12;
Ch_13=Kanal_13;
Ch_14=Kanal_14;
Ch_15=Kanal_15;
}
}
int main(void)
{
DDRA=0xFF; //порты - на выход
PORTA=0x00;
n=10; //задержка в мс между шагами яркости
m=500; //задержка в мс между "кадрами"
TCNT1 = TMR; //начальное значение счетчика
TIMSK &= ~(1‹‹TOIE1); //запрещаем Ovf1
cli(); //запрещаем прерывания
TIMSK |= 1‹‹TOIE1; //Разрешить Ovf1
TCCR1B |= 0x2; //включить таймер 1 с делителем 8
sei(); //разрешить прерывания
while(1)
{
for(i=0;i‹128;i++) {
Kanal_0=i;
_delay_ms(n);
}
/* for(i=128;i›0;i--) {
Kanal_0=i;
_delay_ms(n);
*/
}
}
}