Перейти к содержанию
    

Нужна помощь с написанием программы

Дорброго времени суток!

Потребовалась помощь в написании программы для Меги. Задача состоит вот в чем.

Есть три светодиода, разного цвета. Подключаются они к МК. На вход МК подаю байт цвета для оного светодиода, потом второго, и третего. В итоге, МК у меня выдает импульсы на выходе ШИМа для каждого светодиода и я получаю разные цвета, в зависимости от входных трех байт. Так вот нужно написать прогу для всего этого. Хочу расчитывать на вас, в частности, подскажите, каким образом сделать 3 шима? Буду очень признателен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот литературка по PWM, мож че интересного найдешь.

Изменено пользователем melkij

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В чём помощ-то? Программу за тебя написать?

Чтобы запустить ШИМы достаточно даташит прочитать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не говорю за меня. Как сделать ШИМ одноканальный то понятно, а вот как трех? Сделать ешще два выхода и по аналогии считать для них длительность??

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не говорю за меня. Как сделать ШИМ одноканальный то понятно, а вот как трех? Сделать ешще два выхода и по аналогии считать для них длительность??

Программно, без использования 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не говорю за меня. Как сделать ШИМ одноканальный то понятно, а вот как трех? Сделать ешще два выхода и по аналогии считать для них длительность??

Не пойму в чем проблема. Например в Mega8 есть 3 аппаратных ШИМа. Два на таймере 1 и один на таймере 2. Запусти сразу все.

Если хочешь потрахаться, то программно можно наделать сколько хочешь ШИМов, на сколько выводов хватит. Частота будет ниже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот написал прогу, а 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' и так для всех трех.... Что я не так делаю? :(

Изменено пользователем Begginer

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У тебя не определены эти символы.

Самый простой выход вместо PORTB0 поставить 0, вместо PORTB1-1, вместо PORTB2-2.

Или же в программе должы быть определения по аналогии как у defunct

 

#define PORTB0 0

#define PORTB1 1

#define PORTB2 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

char cnt = 0;
....
     cnt++;
     if (cnt >=255)
          cnt = 0;

Зачем это?!

Для начала напишите все точно также как в примере.

не char, а unsigned char, без доп проверок.

и не стоит проверять char с 255, т.к. по-умолчанию char знаковый и его диапазон - (-128..+127).

delay_us тоже можно убрать и без него будет работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо... сделал как посоветовал SergSit. Получилось, не ругается :)... теперь буду дальше делать.. Если будут вопросы, я вам, мастерам, их обязательно задам. Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...