Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Нужна помощь с написанием программы
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Begginer
Дорброго времени суток!
Потребовалась помощь в написании программы для Меги. Задача состоит вот в чем.
Есть три светодиода, разного цвета. Подключаются они к МК. На вход МК подаю байт цвета для оного светодиода, потом второго, и третего. В итоге, МК у меня выдает импульсы на выходе ШИМа для каждого светодиода и я получаю разные цвета, в зависимости от входных трех байт. Так вот нужно написать прогу для всего этого. Хочу расчитывать на вас, в частности, подскажите, каким образом сделать 3 шима? Буду очень признателен.
melkij
Вот литературка по PWM, мож че интересного найдешь.
slog
В чём помощ-то? Программу за тебя написать?
Чтобы запустить ШИМы достаточно даташит прочитать.
Begginer
Я не говорю за меня. Как сделать ШИМ одноканальный то понятно, а вот как трех? Сделать ешще два выхода и по аналогии считать для них длительность??
defunct
Цитата(Begginer @ Nov 5 2006, 21:26) *
Я не говорю за меня. Как сделать ШИМ одноканальный то понятно, а вот как трех? Сделать ешще два выхода и по аналогии считать для них длительность??

Программно, без использования 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
Цитата(Begginer @ Nov 5 2006, 21:26) *
Я не говорю за меня. Как сделать ШИМ одноканальный то понятно, а вот как трех? Сделать ешще два выхода и по аналогии считать для них длительность??

Не пойму в чем проблема. Например в Mega8 есть 3 аппаратных ШИМа. Два на таймере 1 и один на таймере 2. Запусти сразу все.
Если хочешь потрахаться, то программно можно наделать сколько хочешь ШИМов, на сколько выводов хватит. Частота будет ниже.
Begginer
Вот написал прогу, а 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' и так для всех трех.... Что я не так делаю? sad.gif
SergSit
У тебя не определены эти символы.
Самый простой выход вместо PORTB0 поставить 0, вместо PORTB1-1, вместо PORTB2-2.
Или же в программе должы быть определения по аналогии как у defunct

#define PORTB0 0
#define PORTB1 1
#define PORTB2 2
defunct
Цитата(Begginer @ Nov 10 2006, 00:27) *
Код
char cnt = 0;
....
     cnt++;
     if (cnt >=255)
          cnt = 0;

Зачем это?!
Для начала напишите все точно также как в примере.
не char, а unsigned char, без доп проверок.
и не стоит проверять char с 255, т.к. по-умолчанию char знаковый и его диапазон - (-128..+127).
delay_us тоже можно убрать и без него будет работать.
Begginer
Всем спасибо... сделал как посоветовал SergSit. Получилось, не ругается smile.gif... теперь буду дальше делать.. Если будут вопросы, я вам, мастерам, их обязательно задам. Спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.