CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение 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? ведь ШИМ требуется изменять по ходу пьесы, а не делать просто неизменный сигнал...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Сообщение 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 раз.
Аватара пользователя
ssvd
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Ср ноя 04, 2009 18:00:56
Откуда: Алтайский край
Контактная информация:

Сообщение 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 и потом идет сравнение! не получается!
где я не так делаю?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

я тут присмотрелся - немножко ошибся я в своем примере :?
надо было KEY1 и т.п. описывать сразу как 1<<PB1 и т.п. тогда (KEY1 | KEY2 | KEY3) = 0000 1110 - это маска, которая оставит от считанного из порта только те биты, которые нам нужны

считываем из порта, в котором нолик - это нажатая кнопка, инвертируем - нажатая кнопка становится 1, накладываем маску - остается только 1 на месте нажатой кнопки.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ssvd
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Ср ноя 04, 2009 18:00:56
Откуда: Алтайский край
Контактная информация:

Сообщение ssvd »

ARV писал(а):я тут присмотрелся - немножко ошибся я в своем примере :?
надо было KEY1 и т.п. описывать сразу как 1<<PB1 и т.п. тогда (KEY1 | KEY2 | KEY3) = 0000 1110 - это маска, которая оставит от считанного из порта только те биты, которые нам нужны

считываем из порта, в котором нолик - это нажатая кнопка, инвертируем - нажатая кнопка становится 1, накладываем маску - остается только 1 на месте нажатой кнопки.


когда кнопки cконфигурированы на вход с подтяжкой, то при НЕ нажатой кнопке на входе будет 1?
Аватара пользователя
evgeniy66
Нашел транзистор. Понюхал.
Сообщения: 151
Зарегистрирован: Пт май 01, 2009 08:58:42
Откуда: г. Коломна
Контактная информация:

Сообщение evgeniy66 »

ssvd писал(а):когда кнопки cконфигурированы на вход с подтяжкой, то при НЕ нажатой кнопке на входе будет 1?

Да.
RK3DUQ
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

ssvd писал(а):когда кнопки cконфигурированы на вход с подтяжкой, то при НЕ нажатой кнопке на входе будет 1?
ну естественно! если провода до кнопки короткие.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ssvd
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Ср ноя 04, 2009 18:00:56
Откуда: Алтайский край
Контактная информация:

Сообщение ssvd »

ARV писал(а):
ssvd писал(а):когда кнопки cконфигурированы на вход с подтяжкой, то при НЕ нажатой кнопке на входе будет 1?
ну естественно! если провода до кнопки короткие.


как провода на это влияют? насколько короткие?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

скажем, кнопки и МК в пределах одной платы небольшого размера :) если выносить на шлейфах - лучше ставить внешние подтяжки в виде несколько-килоомных резисторов :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ssvd
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Ср ноя 04, 2009 18:00:56
Откуда: Алтайский край
Контактная информация:

Сообщение ssvd »

ARV писал(а):я тут присмотрелся - немножко ошибся я в своем примере :?
надо было KEY1 и т.п. описывать сразу как 1<<PB1 и т.п. тогда (KEY1 | KEY2 | KEY3) = 0000 1110 - это маска, которая оставит от считанного из порта только те биты, которые нам нужны

считываем из порта, в котором нолик - это нажатая кнопка, инвертируем - нажатая кнопка становится 1, накладываем маску - остается только 1 на месте нажатой кнопки.


минус этого способа только то, что порт надо полностью отдавать под кнопки, так?
Аватара пользователя
ssvd
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Ср ноя 04, 2009 18:00:56
Откуда: Алтайский край
Контактная информация:

Сообщение 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 можно же менять по кнопке?
а если не по кнопке, то делать для него цикл с задержкой?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

ну лично я привык делать не так... все процессы непрерывной генерации чего-либо (динамическая индикация, выходные ШИМ-сигналы) я делаю фоновыми по таймеру, а все процессы, которые могут возникать незапланированно (например, работа с кнопками или вывод на индикатор) я делаю в основном цикле.

если же в основном цикле делать ШИМ, то тогда кнопки и прочее придется обрабатывать по прерываниям, что не всегда просто, а для случая, когда надо сохранять интервалы ШИМ из основного цикла - это даже весьма непросто. разумеется, если вы в каком-то прерывании измените значение PWM, у вас и сигнал изменится.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ssvd
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Ср ноя 04, 2009 18:00:56
Откуда: Алтайский край
Контактная информация:

Сообщение ssvd »

ARV писал(а):ну лично я привык делать не так... все процессы непрерывной генерации чего-либо (динамическая индикация, выходные ШИМ-сигналы) я делаю фоновыми по таймеру, а все процессы, которые могут возникать незапланированно (например, работа с кнопками или вывод на индикатор) я делаю в основном цикле.

если же в основном цикле делать ШИМ, то тогда кнопки и прочее придется обрабатывать по прерываниям, что не всегда просто, а для случая, когда надо сохранять интервалы ШИМ из основного цикла - это даже весьма непросто. разумеется, если вы в каком-то прерывании измените значение PWM, у вас и сигнал изменится.


логично :))

то есть, лучше запустить таймер, допустим на переполнение и писать в PWM его данные?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

если для ШИМ использовать таймер, то есть 2 пути:
1. использовать аппаратные возможности таймера (TIMER1 всегда имеет возможность аппаратно генерировать ШИМ, а другие - в зависимости от модели МК)
2. делать программный ШИМ (на любом таймере можно сделать низкочастотный ШИМ хоть для 32 каналов независимо).

плюс первого подхода - высокая частота ШИМ (в зависимости от разных условий и типа МК может достигать 500 кГц), минус - число аппаратных каналов ШИМ обычно не превышает 3, а в исключительных случаях - 6.

плюс второго подхода - свобода в выборе таймера и возможность реализации числа независимых каналов ШИМ практически равного числу свободных пинов МК. минус - низкая частота программного ШИМ (для 8 бит разрешения ШИМ частота будет не выше, чем тактовая поделенная на 256, фактически - гораздо ниже из-за програмных издержек).

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

Мой уютный бложик... заходите!
Аватара пользователя
ssvd
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Ср ноя 04, 2009 18:00:56
Откуда: Алтайский край
Контактная информация:

Сообщение ssvd »

ARV писал(а):если для ШИМ использовать таймер, то есть 2 пути:
1. использовать аппаратные возможности таймера (TIMER1 всегда имеет возможность аппаратно генерировать ШИМ, а другие - в зависимости от модели МК)
2. делать программный ШИМ (на любом таймере можно сделать низкочастотный ШИМ хоть для 32 каналов независимо).

плюс первого подхода - высокая частота ШИМ (в зависимости от разных условий и типа МК может достигать 500 кГц), минус - число аппаратных каналов ШИМ обычно не превышает 3, а в исключительных случаях - 6.

плюс второго подхода - свобода в выборе таймера и возможность реализации числа независимых каналов ШИМ практически равного числу свободных пинов МК. минус - низкая частота программного ШИМ (для 8 бит разрешения ШИМ частота будет не выше, чем тактовая поделенная на 256, фактически - гораздо ниже из-за програмных издержек).

выбирайте :)


у меня задача сделать контроллер светодиодов на 4 канала, так что выбор соответственно 2 ))) и данной частоты думаю будет с лихвой хватать для этого.

По таймерам просветите пожалуйста, какие регистры надо настраивать и для чего они нужны, а то после прочитанного по ним в голове каша... )))
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Контроллер светодиодов на 4 канала ШИМ? всего-то? :) делайте хоть на тини13 - с успехом хватит ее возможностей для чисто программного ШИМ. код для программного ШИМ вы можете извлечь из исходников к моему микро-проекту "электронная свеча" - смотрите у меня на сайте.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ssvd
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Ср ноя 04, 2009 18:00:56
Откуда: Алтайский край
Контактная информация:

Сообщение ssvd »

ARV писал(а):Контроллер светодиодов на 4 канала ШИМ? всего-то? :) делайте хоть на тини13 - с успехом хватит ее возможностей для чисто программного ШИМ. код для программного ШИМ вы можете извлечь из исходников к моему микро-проекту "электронная свеча" - смотрите у меня на сайте.


делаю на atmega8
посмотрел проект, изменение ШИМ мне надо вешать на прерывание? или можно просто считывать значение таймера и подставлять в PWM в том цикле?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

ssvd писал(а):посмотрел проект
ой ли посмотрел? по-моему, после просмотра проекта не должно возникнуть вопросов, подобных заданному...
в проекте таймер реализует программно 6 каналов ШИМ. скважность или коэффициент заполнения каждого канала задается в основном цикле путем записи значения в соответствующий элемент массива.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ssvd
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Ср ноя 04, 2009 18:00:56
Откуда: Алтайский край
Контактная информация:

Сообщение ssvd »

ARV писал(а):
ssvd писал(а):посмотрел проект
ой ли посмотрел? по-моему, после просмотра проекта не должно возникнуть вопросов, подобных заданному...
в проекте таймер реализует программно 6 каналов ШИМ. скважность или коэффициент заполнения каждого канала задается в основном цикле путем записи значения в соответствующий элемент массива.


да я не про ваш проект говорю, меня интересует, как можно сделать...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

так я вам и говорю: посмотрите, как делают другие, и сделайте свой выбор. лучше один раз увидеть, чем сто раз услышать :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ответить

Вернуться в «AVR»