Страница 60 из 421
Добавлено: Ср янв 20, 2010 11:27:36
ARV
вы задали вопрос "правильно делаю?" я ответил четко на вопрос. вы не спрашивали "как правильно сделать?"
допустим, надо ШИМить PORTC.0: частота ШИМ 100 Гц. тогда чисто программно это будет выглядеть примрено так:
Код: Выделить всё
unsigned char PWM, i;
while(1){
PORTC.0 = 1;
for(i = 0; i < PWM; i++)
_delay_us(39);
PORTC.0 = 0;
for(i = 0; i < (255 - PWM); i++)
_delay_us(39);
}
смысл кода: в PWM задаем значение ШИМ от 0 до 255 и получаем на порту сигнал с заданными параметрами. только смысла в такой реализации ШИМ мало: кто и как будет менять PWM? ведь ШИМ требуется изменять по ходу пьесы, а не делать просто неизменный сигнал...
Добавлено: Ср янв 20, 2010 11:32:12
AI_Disable
Например, можно так:
Код: Выделить всё
unsigned char i, pwm;
while(1)
{
if(pwm==i) PORTC.0=0;
if(i==255) PORTC.0=1;
i++;
}
Скважность регулируем записывая в переменную PWM число 0-255. Количество каналов можно легко увеличить в n раз.
Добавлено: Ср янв 20, 2010 11:42:17
ssvd
ARV писал(а):ну, во-первых, рекомендую замыкать кнопки на общий, а на пины подавать подтяжку встроенную. у вас сейчас выходит так, что от кнопки порт заряжается (не забыли, что вход МК это по сути затвор полевика?), а при отпускании кнопки разряжаться ему некуда... вот единичка там и висит. а когда будете замыкать на 0 - затвор разрядится, а при отпускании будет заряжаться от подтяжки - и все будет пучком.
опрос кнопок для практических конструкций логичнее сделать по типу компьютерного, т.е. сделать функцию, которая возвращает код нажатой кнопки. примерно так:
Код: Выделить всё
#define KEY1 1
#define KEY2 2
#define KEY3 3
unsigned char get_key(void){
unsigned char tmp;
tmp = ~PINB & ((1<<KEY1) | (1<<KEY2) | (1<<KEY3));
delay_ms(15); // подавление дребезга
if(tmp != (~PINB & ((1<<KEY1) | (1<<KEY2) | (1<<KEY3))))
return 0; // был дребезг, считаем, что нет нажатых кнопок
else
return tmp; // иначе вернем код нажатых кнопок
}
в основной программе делаете примерно так:
Код: Выделить всё
switch(get_key()){
case KEY1: // тут обрабатываете нажатие первой кнопки
break;
case KEY2: // тут - второй
break;
case KEY1 | KEY2 : // тут можно обработать одновременное нажатие двух кнопок
break;
// и так далее
default:
// тут что-то если не нажата ни одна или запретная комбинация
}
пытаюсь разобраться с этим, что то не выходит.
где я ошибся?
допустим нажат 3й пин
00001000
11110111 инверсия
(1<<KEY1) получается 0000 0010
(1<<KEY2) получается 0000 0100
(1<<KEY3) получается 0000 1000
((1<<KEY1) | (1<<KEY2) | (1<<KEY3)) = 0000 1110
11110111 инверсия & 0000 1110 = 00000111 то есть 7!
tmp =7 и потом идет сравнение! не получается!
где я не так делаю?
Добавлено: Ср янв 20, 2010 11:54:29
ARV
я тут присмотрелся - немножко ошибся я в своем примере
надо было
KEY1 и т.п. описывать сразу как
1<<PB1 и т.п. тогда
(KEY1 | KEY2 | KEY3) = 0000 1110 - это маска, которая оставит от считанного из порта только те биты, которые нам нужны
считываем из порта, в котором нолик - это нажатая кнопка, инвертируем - нажатая кнопка становится 1, накладываем маску - остается только 1 на месте нажатой кнопки.
Добавлено: Ср янв 20, 2010 12:25:41
ssvd
ARV писал(а):я тут присмотрелся - немножко ошибся я в своем примере
надо было
KEY1 и т.п. описывать сразу как
1<<PB1 и т.п. тогда
(KEY1 | KEY2 | KEY3) = 0000 1110 - это маска, которая оставит от считанного из порта только те биты, которые нам нужны
считываем из порта, в котором нолик - это нажатая кнопка, инвертируем - нажатая кнопка становится 1, накладываем маску - остается только 1 на месте нажатой кнопки.
когда кнопки cконфигурированы на вход с подтяжкой, то при НЕ нажатой кнопке на входе будет 1?
Добавлено: Ср янв 20, 2010 12:29:06
evgeniy66
ssvd писал(а):когда кнопки cконфигурированы на вход с подтяжкой, то при НЕ нажатой кнопке на входе будет 1?
Да.
Добавлено: Ср янв 20, 2010 12:30:21
ARV
ssvd писал(а):когда кнопки cконфигурированы на вход с подтяжкой, то при НЕ нажатой кнопке на входе будет 1?
ну естественно! если провода до кнопки короткие.
Добавлено: Ср янв 20, 2010 12:33:41
ssvd
ARV писал(а):ssvd писал(а):когда кнопки cконфигурированы на вход с подтяжкой, то при НЕ нажатой кнопке на входе будет 1?
ну естественно! если провода до кнопки короткие.
как провода на это влияют? насколько короткие?
Добавлено: Ср янв 20, 2010 12:36:56
ARV
скажем, кнопки и МК в пределах одной платы небольшого размера

если выносить на шлейфах - лучше ставить внешние подтяжки в виде несколько-килоомных резисторов

Добавлено: Ср янв 20, 2010 12:55:17
ssvd
ARV писал(а):я тут присмотрелся - немножко ошибся я в своем примере
надо было
KEY1 и т.п. описывать сразу как
1<<PB1 и т.п. тогда
(KEY1 | KEY2 | KEY3) = 0000 1110 - это маска, которая оставит от считанного из порта только те биты, которые нам нужны
считываем из порта, в котором нолик - это нажатая кнопка, инвертируем - нажатая кнопка становится 1, накладываем маску - остается только 1 на месте нажатой кнопки.
минус этого способа только то, что порт надо полностью отдавать под кнопки, так?
Добавлено: Ср янв 20, 2010 13:01:54
ssvd
ARV писал(а):вы задали вопрос "правильно делаю?" я ответил четко на вопрос. вы не спрашивали "как правильно сделать?"
допустим, надо ШИМить PORTC.0: частота ШИМ 100 Гц. тогда чисто программно это будет выглядеть примрено так:
Код: Выделить всё
unsigned char PWM, i;
while(1){
PORTC.0 = 1;
for(i = 0; i < PWM; i++)
_delay_us(39);
PORTC.0 = 0;
for(i = 0; i < (255 - PWM); i++)
_delay_us(39);
}
смысл кода: в PWM задаем значение ШИМ от 0 до 255 и получаем на порту сигнал с заданными параметрами. только смысла в такой реализации ШИМ мало: кто и как будет менять PWM? ведь ШИМ требуется изменять по ходу пьесы, а не делать просто неизменный сигнал...
PWM можно же менять по кнопке?
а если не по кнопке, то делать для него цикл с задержкой?
Добавлено: Ср янв 20, 2010 13:22:40
ARV
ну лично я привык делать не так... все процессы непрерывной генерации чего-либо (динамическая индикация, выходные ШИМ-сигналы) я делаю фоновыми по таймеру, а все процессы, которые могут возникать незапланированно (например, работа с кнопками или вывод на индикатор) я делаю в основном цикле.
если же в основном цикле делать ШИМ, то тогда кнопки и прочее придется обрабатывать по прерываниям, что не всегда просто, а для случая, когда надо сохранять интервалы ШИМ из основного цикла - это даже весьма непросто. разумеется, если вы в каком-то прерывании измените значение PWM, у вас и сигнал изменится.
Добавлено: Ср янв 20, 2010 14:11:26
ssvd
ARV писал(а):ну лично я привык делать не так... все процессы непрерывной генерации чего-либо (динамическая индикация, выходные ШИМ-сигналы) я делаю фоновыми по таймеру, а все процессы, которые могут возникать незапланированно (например, работа с кнопками или вывод на индикатор) я делаю в основном цикле.
если же в основном цикле делать ШИМ, то тогда кнопки и прочее придется обрабатывать по прерываниям, что не всегда просто, а для случая, когда надо сохранять интервалы ШИМ из основного цикла - это даже весьма непросто. разумеется, если вы в каком-то прерывании измените значение PWM, у вас и сигнал изменится.
логично
то есть, лучше запустить таймер, допустим на переполнение и писать в PWM его данные?
Добавлено: Ср янв 20, 2010 16:19:12
ARV
если для ШИМ использовать таймер, то есть 2 пути:
1. использовать аппаратные возможности таймера (TIMER1 всегда имеет возможность аппаратно генерировать ШИМ, а другие - в зависимости от модели МК)
2. делать программный ШИМ (на любом таймере можно сделать низкочастотный ШИМ хоть для 32 каналов независимо).
плюс первого подхода - высокая частота ШИМ (в зависимости от разных условий и типа МК может достигать 500 кГц), минус - число аппаратных каналов ШИМ обычно не превышает 3, а в исключительных случаях - 6.
плюс второго подхода - свобода в выборе таймера и возможность реализации числа независимых каналов ШИМ практически равного числу свободных пинов МК. минус - низкая частота программного ШИМ (для 8 бит разрешения ШИМ частота будет не выше, чем тактовая поделенная на 256, фактически - гораздо ниже из-за програмных издержек).
выбирайте

Добавлено: Чт янв 21, 2010 06:53:07
ssvd
ARV писал(а):если для ШИМ использовать таймер, то есть 2 пути:
1. использовать аппаратные возможности таймера (TIMER1 всегда имеет возможность аппаратно генерировать ШИМ, а другие - в зависимости от модели МК)
2. делать программный ШИМ (на любом таймере можно сделать низкочастотный ШИМ хоть для 32 каналов независимо).
плюс первого подхода - высокая частота ШИМ (в зависимости от разных условий и типа МК может достигать 500 кГц), минус - число аппаратных каналов ШИМ обычно не превышает 3, а в исключительных случаях - 6.
плюс второго подхода - свобода в выборе таймера и возможность реализации числа независимых каналов ШИМ практически равного числу свободных пинов МК. минус - низкая частота программного ШИМ (для 8 бит разрешения ШИМ частота будет не выше, чем тактовая поделенная на 256, фактически - гораздо ниже из-за програмных издержек).
выбирайте

у меня задача сделать контроллер светодиодов на 4 канала, так что выбор соответственно 2 ))) и данной частоты думаю будет с лихвой хватать для этого.
По таймерам просветите пожалуйста, какие регистры надо настраивать и для чего они нужны, а то после прочитанного по ним в голове каша... )))
Добавлено: Чт янв 21, 2010 08:29:12
ARV
Контроллер светодиодов на 4 канала ШИМ? всего-то?

делайте хоть на тини13 - с успехом хватит ее возможностей для чисто программного ШИМ. код для программного ШИМ вы можете извлечь из исходников к моему микро-проекту "электронная свеча" - смотрите у меня на сайте.
Добавлено: Чт янв 21, 2010 10:00:31
ssvd
ARV писал(а):Контроллер светодиодов на 4 канала ШИМ? всего-то?

делайте хоть на тини13 - с успехом хватит ее возможностей для чисто программного ШИМ. код для программного ШИМ вы можете извлечь из исходников к моему микро-проекту "электронная свеча" - смотрите у меня на сайте.
делаю на atmega8
посмотрел проект, изменение ШИМ мне надо вешать на прерывание? или можно просто считывать значение таймера и подставлять в PWM в том цикле?
Добавлено: Чт янв 21, 2010 10:38:09
ARV
ssvd писал(а):посмотрел проект
ой ли посмотрел? по-моему, после просмотра проекта не должно возникнуть вопросов, подобных заданному...
в проекте таймер реализует программно 6 каналов ШИМ. скважность или коэффициент заполнения каждого канала задается в основном цикле путем записи значения в соответствующий элемент массива.
Добавлено: Чт янв 21, 2010 11:06:36
ssvd
ARV писал(а):ssvd писал(а):посмотрел проект
ой ли посмотрел? по-моему, после просмотра проекта не должно возникнуть вопросов, подобных заданному...
в проекте таймер реализует программно 6 каналов ШИМ. скважность или коэффициент заполнения каждого канала задается в основном цикле путем записи значения в соответствующий элемент массива.
да я не про ваш проект говорю, меня интересует, как можно сделать...
Добавлено: Чт янв 21, 2010 11:20:14
ARV
так я вам и говорю: посмотрите, как делают другие, и сделайте свой выбор. лучше один раз увидеть, чем сто раз услышать
