Технический форум по робототехнике.
paslenok » 17 май 2013, 09:44
необходимо создать программу "комета". светодиоды должны загораться в такой последовательности:
1 такт. загорается светодиод 1(самый яркий) .
2 такт. самым ярким загорается светодиод 2, светодиод 1 имеет меньшую яркость,чем светодиод 2.
3 такт. самый яркий - светодиод 3, светодиод 2 имеет такую же яркость, как светодиод 1 в такте 2, светодиод 1 -самый тусклый .
и так далее, пока все огоньки не пройдут до конца.
пытаюсь разобраться как уменьшать и увеличивать яркость светодиодов. вот код в микропаскаль, но в VMLab он не работает, так как светодиод просто загорается и ничего не меняется. в чем может быть ошибка?
program gasnet;
var
f: byte;
procedure SHIM; org OVF0addr;
begin
OCR2:=0x00;
if (OCR2<0xff) then f:=0;
if (OCR2>0x00) then f:=1;
if f=0 then OCR2:=OCR2+0x01;
if f=1 then OCR2:=OCR2-0x01;
end;
begin
PORTB:=0x00;
DDRB:=0x08;
DDRD:=0xff;
TCCR1A.WGM13:=0;
TCCR1A.WGM12:=1;
TCCR1A.WGM11:=0;
TCCR1A.WGM10:=1;
TCCR1A.COM1A1:=1;
TCCR1A.COM1A0:=0;
TCNT2:=0x00;
OCR2:=50;
while (true) do
begin
end;
end.
avr123.nm.ru » 17 май 2013, 23:37
вместо светика включите резистор и конденсатор - RC фильтр - и на кондере измеряйте напряжение, оно должно быть пропорционально ШИМ.
paslenok » 19 май 2013, 08:38
Зачем подключать RC-фильтр, если в OCR2 можно задавать яркость светодиода (то есть саму ширину импульса)?
avr123.nm.ru » 19 май 2013, 11:04
думать.
Madf » 19 май 2013, 12:22
Вообще для такого эффекта 3 светика мало, выглядеть будет всё не красиво (размаха нет), даже возможно у вас всё работает корректно, только как раз проблема в этом. Я делал как то просто на 4-х светодиодах эффекта аля мерцание звездного неба (так, типа "hello world"), каждый светодиод плавно мигал с разным периодом, выглядело отлично.
В вашем случае алгоритм имеет простую логику:
1. есть массив значений;
2. каждая следующая ячейка на N-раз имеет меньше значение чем предыдущее (коэффициент можно подобрать, рассчитать относительно используемых каналов) и всё это рассчитывается один раз (ДО отображения ШИМом), как шаблон/маска;
3. в один раз/шаг (в 1 единицу времени) все значения в массиве сдвигаются в сторону большего числа (т.е. просто перемещаются по ячейкам массива по условию "roll" (циклично));
4. далее просто отображаем из каждой ячейки массива значение в ШИМ (т.к. ячейки массива ровны количеству каналов/светиков);
5. всё повторяется с пункта N3.
Можно создать разные шаблоны масок и выводить их...универсально.
зы: ШИМ используется как правило 8-бит (т.е. значения от 0 до 255, а не 0 и 1).
paslenok » 19 май 2013, 20:44
у меня будет 8 светодиодов. Идея организации алгоритма мне очень понравилась, спасибо. Думаю, что так и буду реализовывать. Но остается еще проблема - при запуске программы (как например в коде выше)светодиод загорается и не меняет интенсивность. В чем может быть ошибка?
Madf » 19 май 2013, 21:06
вообще у Меги16 всего 4 ШИМа - это значит, что аппаратно сделать можно только 4 канала, а у вас 8, значит придется делать программный шим или брать специализированные чипы или МК семейства AT90PWMххх (или более мощные АВРки)
зы: если проблема с Си, то юзайте
Bascom (значительно проще).
paslenok » 19 май 2013, 21:09
я пишу на микропаскаль
