Перенаправил поток он с АЭС
Клевая мощность два мегаватта,
Быстро горит материнская плата!
Как правильно заметил Alex, ваш алгоритм нам не известен, а так как вы не сильны в программировании, мы не имеем права утверждать, что ваш код соответствует вашему алгоритмуValek3306 писал(а):Не подскажите по чему такой алгоритм не работает... что я делаю не так?
Код: Выделить всё
while (1)
{
// Place your code here
int r = 255; // Step 2 255 000 000
int g = 0;
int b = 0;
int t = 2;
if((r==255)&&(g<255)&&(b==0)) // Step 2 255 255 000
{
OCR0=g;
g++;
delay_ms(t);
};
}
Код: Выделить всё
NS(void) { // Функция неприрывного спектра
while(1){
int r = 254; // Step 1 255 000 000
int g = 0;
int b = 0;
while (g <= 254) // Step 2 255 255 000
{
OCR0=g;
g++;
delay_ms(t);
};
while (r == 0 ) // Step 3 000 255 000
{
OCR1AH=0;
OCR1AL=r;
r--;
delay_ms(t);
};
while (b <= 254 ) // Step 4 000 255 255
{
OCR2=b;
b++;
delay_ms(t);
};
while (g == 0 ) // Step 5 000 000 255
{
OCR0=g;
g--;
delay_ms(t);
};
while (r <= 254 ) // Step 6 255 000 255
{
OCR1AH=0;
OCR1AL=r;
r++;
delay_ms(t);
};
while (b == 0) // Step 7 255 000 000
{
OCR2=b;
b--;
delay_ms(t);
};
};
prog=0;
};
Код: Выделить всё
int r = 255; // Step 2 255 000 000
int g = 0;
int b = 0;
int t = 2;а по-моему это нормальная реализация задачи, хотя можно упроститьValek3306 писал(а):но мне подсказали что это совсем не правильная реализация задачи
Код: Выделить всё
int main()
{
//инициализация портов, ШИМ и пр. .....
//...................
OCR1AH = 0; //задаем один раз и больше не трогаем
//Начальные условия
OCR1AL = 255; //Красный максимум
OCR0 = 0; //Зеленый минимум
OCR2 = 0; //Синий минимум
unsigned char i = 0; //переменная управляющая всеми каналами
while(1)
{
while(i < 255) //Красный в желтый (увеличиваем зеленый)
{
OCR0 = i;
i++;
delay_ms(TIME)
}
while(i > 0) //Желтый в зеленый (уменьшаем красный)
{
OCR1AL = i;
i--;
delay_ms(TIME)
}
while(i < 255) //Зеленый в голубой (увеличиваем синий)
{
OCR2 = i;
i++;
delay_ms(TIME)
}
while(i > 0) //Голубой в синий (уменьшаем зеленый)
{
OCR0 = i;
i--;
delay_ms(TIME)
}
while(i < 255) //Синий в пурпурный (увеличиваем красный)
{
OCR1AL = i;
i++;
delay_ms(TIME);
}
while(i > 0) //Пурпурный в красный (уменьшаем синий)
{
OCR2 = i;
i--;
delay_ms(TIME);
}
}
}Код: Выделить всё
interrupt [TIM1_OVF] void timer1_ovf_isr(void){
static unsigned char cnt_ms_butt=20; // Счётчик для формирования периода в 20 мс.
TCNT1 -= 4000; // Перезапускаем таймер на 1 мс.
//----------------------//
if(!--cnt_ms_butt){ // Формируем 20-ти миллисек. периоды
cnt_ms_butt=20;
mButt_1.cur = (PORT_BUTT_1&(1<<PIN_BUTT_1))!=0; // Считываем текущее значение вывода.
// Дальше работаем с этим битом, т.к. порт может измениться в любой момент.
if((mButt_1.cur==ACT_BUTT_LEV) && (mButt_1.prev!=ACT_BUTT_LEV)) // Если текущее значение - "нажата" и предыдущее - "не нажата"
mButt_1.down = 1; // Устанавливаем флаг down
if((mButt_1.cur!=ACT_BUTT_LEV) && (mButt_1.prev==ACT_BUTT_LEV)) // Если текущее значение - "не нажата" и предыдущее - "нажата"
mButt_1.up = 1; // Устанавливаем флаг up
mButt_1.prev=mButt_1.cur; // Сохраняем текущее значение. Оно для следующего входа будет предыдущим
}
//----------------------//
}Код: Выделить всё
if(!--cnt_ms_butt){ // Формируем 20-ти миллисек. периодыКод: Выделить всё
while (1)
{
// Place your code here
int r = 255; // Step 2 255 000 000
int g = 0;
int b = 0;
int t = 2;
if((r==255)&&(g<255)&&(b==0)) // Step 2 255 255 000
{
OCR0=g;
g++;
delay_ms(t);
};
}http://radiokot.ru/forum/viewtopic.php? ... 9#p1601959Valek3306 писал(а):И все же, по чему это не работает?
пошагай по коду и посмотриValek3306 писал(а):И все же, по чему это не работает?
Код: Выделить всё
#define STEP (1) // значение шага изменения ШИМ
#define STEPS (255/STEP)
#define MAX_CNT (STEPS*6)
signed char Rdir,Gdir,Bdir;
unsigned char R=0,G=255,B=0;
unsigned short cnt;
while(1)
{
/* здесь нужно поместить код, устанавливающий коэффициенты ШИМ равные переменным R,G,B. */
switch(cnt)
{
case 0:
Rdir = 0; Gdir = 0; Bdir = +1; break;
case STEPS:
Rdir = 0; Gdir = -1; Bdir = 0; break;
case 2*STEPS:
Rdir = +1; Gdir = 0; Bdir = 0; break;
case 3*STEPS:
Rdir = 0; Gdir = 0; Bdir = -1; break;
case 4*STEPS:
Rdir = 0; Gdir = +1; Bdir = 0; break;
case 5*STEPS:
Rdir = -1; Gdir = 0; Bdir = 0; break;
default:
break;
}
R += STEP*Rdir; //получение переменных
G += STEP*Gdir;
B += STEP*Bdir;
if(++cnt >= MAX_CNT)
cnt = 0;
} Код: Выделить всё
unsigned int read_word(unsigned int addr)
{
int ind;
addr &=~3
if (!((ind=(addr^0x01300000)) & ~0xFFFFF))
{
return func_blablabla(ind);
}
}