реклама на сайте
подробности

 
 
> Нужна помощь с написанием программы, ATmega16 ШИМ и т.д.
Begginer
сообщение Nov 4 2006, 23:39
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 4-11-06
Пользователь №: 21 982



Дорброго времени суток!
Потребовалась помощь в написании программы для Меги. Задача состоит вот в чем.
Есть три светодиода, разного цвета. Подключаются они к МК. На вход МК подаю байт цвета для оного светодиода, потом второго, и третего. В итоге, МК у меня выдает импульсы на выходе ШИМа для каждого светодиода и я получаю разные цвета, в зависимости от входных трех байт. Так вот нужно написать прогу для всего этого. Хочу расчитывать на вас, в частности, подскажите, каким образом сделать 3 шима? Буду очень признателен.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
melkij
сообщение Nov 5 2006, 00:16
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 1-09-06
Пользователь №: 19 996



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

Сообщение отредактировал melkij - Nov 5 2006, 00:17


--------------------
Всем спасибо за понимание и поддержку
Go to the top of the page
 
+Quote Post
slog
сообщение Nov 5 2006, 07:50
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 961
Регистрация: 28-11-05
Пользователь №: 11 489



В чём помощ-то? Программу за тебя написать?
Чтобы запустить ШИМы достаточно даташит прочитать.


--------------------
В действительности всё не так, как на самом деле.
Go to the top of the page
 
+Quote Post
Begginer
сообщение Nov 5 2006, 18:26
Сообщение #4





Группа: Новичок
Сообщений: 6
Регистрация: 4-11-06
Пользователь №: 21 982



Я не говорю за меня. Как сделать ШИМ одноканальный то понятно, а вот как трех? Сделать ешще два выхода и по аналогии считать для них длительность??
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 6 2006, 01:05
Сообщение #5


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(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.
Go to the top of the page
 
+Quote Post
slog
сообщение Nov 6 2006, 18:09
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 961
Регистрация: 28-11-05
Пользователь №: 11 489



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

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


--------------------
В действительности всё не так, как на самом деле.
Go to the top of the page
 
+Quote Post
Begginer
сообщение Nov 9 2006, 21:27
Сообщение #7





Группа: Новичок
Сообщений: 6
Регистрация: 4-11-06
Пользователь №: 21 982



Вот написал прогу, а 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

Сообщение отредактировал Begginer - Nov 9 2006, 21:57
Go to the top of the page
 
+Quote Post
SergSit
сообщение Nov 9 2006, 22:18
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 173
Регистрация: 9-12-05
Пользователь №: 12 031



У тебя не определены эти символы.
Самый простой выход вместо PORTB0 поставить 0, вместо PORTB1-1, вместо PORTB2-2.
Или же в программе должы быть определения по аналогии как у defunct

#define PORTB0 0
#define PORTB1 1
#define PORTB2 2
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 9 2006, 22:55
Сообщение #9


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(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 тоже можно убрать и без него будет работать.
Go to the top of the page
 
+Quote Post
Begginer
сообщение Nov 10 2006, 10:46
Сообщение #10





Группа: Новичок
Сообщений: 6
Регистрация: 4-11-06
Пользователь №: 21 982



Всем спасибо... сделал как посоветовал SergSit. Получилось, не ругается smile.gif... теперь буду дальше делать.. Если будут вопросы, я вам, мастерам, их обязательно задам. Спасибо!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 10:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01417 секунд с 7
ELECTRONIX ©2004-2016