Begginer 0 4 ноября, 2006 Опубликовано 4 ноября, 2006 · Жалоба Дорброго времени суток! Потребовалась помощь в написании программы для Меги. Задача состоит вот в чем. Есть три светодиода, разного цвета. Подключаются они к МК. На вход МК подаю байт цвета для оного светодиода, потом второго, и третего. В итоге, МК у меня выдает импульсы на выходе ШИМа для каждого светодиода и я получаю разные цвета, в зависимости от входных трех байт. Так вот нужно написать прогу для всего этого. Хочу расчитывать на вас, в частности, подскажите, каким образом сделать 3 шима? Буду очень признателен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
melkij 0 5 ноября, 2006 Опубликовано 5 ноября, 2006 (изменено) · Жалоба Вот литературка по PWM, мож че интересного найдешь. Изменено 5 ноября, 2006 пользователем melkij Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slog 0 5 ноября, 2006 Опубликовано 5 ноября, 2006 · Жалоба В чём помощ-то? Программу за тебя написать? Чтобы запустить ШИМы достаточно даташит прочитать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Begginer 0 5 ноября, 2006 Опубликовано 5 ноября, 2006 · Жалоба Я не говорю за меня. Как сделать ШИМ одноканальный то понятно, а вот как трех? Сделать ешще два выхода и по аналогии считать для них длительность?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 6 ноября, 2006 Опубликовано 6 ноября, 2006 · Жалоба Я не говорю за меня. Как сделать ШИМ одноканальный то понятно, а вот как трех? Сделать ешще два выхода и по аналогии считать для них длительность?? Программно, без использования PWM. простейший пример: unsigned char R = 255; unsigned char G = 70; unsigned char B = 50; #define R_Led (PB0) #define G_Led (PB1) #define B_Led (PB2) main() { unsigned char cnt = 0; unsigned char PortBuf; DDRB = 0xFF; for(;;) { PortBuf = 0; if (R >= cnt) PortBuf |= (1 << R_Led); if (G >= cnt) PortBuf |= (1 << G_Led); if (B >= cnt) PortBuf |= (1 << B_Led); PORTB = PortBuf; cnt++; } } сделайте то же самое, только код перенесите в обработчик прерывания по переполнению например таймера 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slog 0 6 ноября, 2006 Опубликовано 6 ноября, 2006 · Жалоба Я не говорю за меня. Как сделать ШИМ одноканальный то понятно, а вот как трех? Сделать ешще два выхода и по аналогии считать для них длительность?? Не пойму в чем проблема. Например в Mega8 есть 3 аппаратных ШИМа. Два на таймере 1 и один на таймере 2. Запусти сразу все. Если хочешь потрахаться, то программно можно наделать сколько хочешь ШИМов, на сколько выводов хватит. Частота будет ниже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Begginer 0 9 ноября, 2006 Опубликовано 9 ноября, 2006 (изменено) · Жалоба Вот написал прогу, а CodeVisionAVR выбает сообщение об ошибке... Решил использовать Мегу48, т.к. других пока нет. include <mega48.h> #include <delay.h> char R = 255; char G = 70; char B = 50; char cnt = 0; char PortBuf; void main (void){ DDRB = 0x07; while (1){ PortBuf = 0; if (R >= cnt) PortBuf |= (1 << PORTB0); else PortBuf ^= (1 << PORTB0); if (G >= cnt) PortBuf |= (1 << PORTB1); else PortBuf ^= (1 << PORTB1); if (B >= cnt) PortBuf |= (1 << PORTB2); else PortBuf ^= (1 << PORTB2); PORTB = PortBuf; cnt++; if (cnt >=255) cnt = 0; delay_us(1); } } Говорит: undefined symbol 'PORTB0' и так для всех трех.... Что я не так делаю? :( Изменено 9 ноября, 2006 пользователем Begginer Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergSit 0 9 ноября, 2006 Опубликовано 9 ноября, 2006 · Жалоба У тебя не определены эти символы. Самый простой выход вместо PORTB0 поставить 0, вместо PORTB1-1, вместо PORTB2-2. Или же в программе должы быть определения по аналогии как у defunct #define PORTB0 0 #define PORTB1 1 #define PORTB2 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 9 ноября, 2006 Опубликовано 9 ноября, 2006 · Жалоба char cnt = 0; .... cnt++; if (cnt >=255) cnt = 0; Зачем это?! Для начала напишите все точно также как в примере. не char, а unsigned char, без доп проверок. и не стоит проверять char с 255, т.к. по-умолчанию char знаковый и его диапазон - (-128..+127). delay_us тоже можно убрать и без него будет работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Begginer 0 10 ноября, 2006 Опубликовано 10 ноября, 2006 · Жалоба Всем спасибо... сделал как посоветовал SergSit. Получилось, не ругается :)... теперь буду дальше делать.. Если будут вопросы, я вам, мастерам, их обязательно задам. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться