#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,nn,mm,q,qq;
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,Kanal_1,Kanal_2,Kanal_3,Kanal_4,Kanal_5,Ka nal_6,Kanal_7;
volatile unsigned char Kanal_8,Kanal_9,Kanal_10,Kanal_11,Kanal_12,Kanal_1 3,Kanal_14,Kanal_15;
//volatile unsigned int random1[] = {10,4,1,6,5,3,7,8,2,9};
void delay_ms(int n)
{
int i;
for(i=0;i‹n;i++){ _delay_ms(1);}
}
/*
void Kanal_0up(int n1)
{
for(i=0;i‹128;i++) {
Kanal_0=i;
delay_ms(n1);
}}
*/
//Прерывание по переполнению таймера 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,7);
else cbi(PORTC,7);
// Канал 9
if (Tic ‹ Ch_9) sbi(PORTC,6);
else cbi(PORTC,6);
// Канал 10
if (Tic ‹ Ch_10) sbi(PORTC,0);
else cbi(PORTC,0);
// Канал 11
if (Tic ‹ Ch_11) sbi(PORTD,7);
else cbi(PORTD,7);
// Канал 12
if (Tic ‹ Ch_12) sbi(PORTD,5);
else cbi(PORTD,5);
// Канал 13
if (Tic ‹ Ch_13) sbi(PORTD,6);
else cbi(PORTD,6);
// Канал 14
if (Tic ‹ Ch_14) sbi(PORTC,1);
else cbi(PORTC,1);
// Канал 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; //порты - на выход
DDRC=0xFF;
DDRD=0xFF;
//DDRC=0xFF;
PORTA=0x00;
PORTC=0x00;
PORTD=0x00;
delay_ms(1000);
//DDRA=0xFF;
//PORTC=0x0;
//Kanal_0 = 0;
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(i=0;i‹128;i++) {
Kanal_0=i;
delay_ms(n);
}
delay_ms(m);
for(i=0;i‹128;i++) {
Kanal_1=i;
delay_ms(n);
}
delay_ms(m);
for(i=0;i‹128;i++) {
Kanal_2=i;
delay_ms(n);
}
delay_ms(m);
for(i=0;i‹128;i++) {
Kanal_3=i;
delay_ms(n);
}
delay_ms(m);
for(i=0;i‹128;i++) {
Kanal_4=i;
delay_ms(n);
}
delay_ms(m);
for(i=0;i‹128;i++) {
Kanal_5=i;
delay_ms(n);
}
delay_ms(m);
for(i=0;i‹128;i++) {
Kanal_6=i;
delay_ms(n);
}
delay_ms(m);
for(i=0;i‹128;i++) {
Kanal_7=i;
delay_ms(n);
}
delay_ms(m);
for(i=0;i‹128;i++) {
Kanal_8=i;
delay_ms(n);
}
delay_ms(m);
for(i=0;i‹128;i++) {
Kanal_9=i;
delay_ms(n);
}
delay_ms(m);
for(i=0;i‹128;i++) {
Kanal_10=i;
delay_ms(n);
}
delay_ms(m);
for(i=0;i‹128;i++) {
Kanal_11=i;
delay_ms(n);
}
delay_ms(m);
for(i=0;i‹128;i++) {
Kanal_12=i;
delay_ms(n);
}
delay_ms(m);
for(i=0;i‹128;i++) {
Kanal_13=i;
delay_ms(n);
}
delay_ms(m);
for(i=0;i‹128;i++) {
Kanal_14=i;
delay_ms(n);
}
delay_ms(3000);
// */
//
//Гашение
if(q==0){
delay_ms(2000);
for(i=128;i›0;i--) {
Kanal_0=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_1=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_2=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_3=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_4=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_5=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_6=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_7=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_8=i;
delay_ms(nn);
}
delay_ms(m);
for(i=128;i›0;i--) {
Kanal_9=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_10=i;
delay_ms(nn);
}
delay_ms(m);
for(i=128;i›0;i--) {
Kanal_11=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_12=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_13=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_14=i;
delay_ms(nn);
}
}
delay_ms(m);
if(q==1){
delay_ms(2000);
for(i=128;i›0;i--) {
Kanal_14=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_13=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_12=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_11=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_10=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_9=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_8=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_7=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_6=i;
delay_ms(nn);
}
delay_ms(m);
for(i=128;i›0;i--) {
Kanal_5=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_4=i;
delay_ms(nn);
}
delay_ms(m);
for(i=128;i›0;i--) {
Kanal_3=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_2=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_1=i;
delay_ms(nn);
}
delay_ms(mm);
for(i=128;i›0;i--) {
Kanal_0=i;
delay_ms(nn);
q=-1;
}
}
delay_ms(m);
////////////////////////////
for(i=0;i‹128;i++) {
Kanal_0=i;
Kanal_1=i;
Kanal_2=i;
Kanal_3=i;
Kanal_4=i;
Kanal_5=i;
Kanal_6=i;
Kanal_7=i;
Kanal_8=i;
Kanal_9=i;
Kanal_10=i;
Kanal_11=i;
Kanal_12=i;
Kanal_13=i;
Kanal_14=i;
delay_ms(100);
}
delay_ms(3000);
for(i=128;i›0;i--) {
Kanal_0=i;
Kanal_1=i;
Kanal_2=i;
Kanal_3=i;
Kanal_4=i;
Kanal_5=i;
Kanal_6=i;
Kanal_7=i;
Kanal_8=i;
Kanal_9=i;
Kanal_10=i;
Kanal_11=i;
Kanal_12=i;
Kanal_13=i;
Kanal_14=i;
delay_ms(100);
}
delay_ms(m);
q=q+1;
}
}