смысл кода: в PWM задаем значение ШИМ от 0 до 255 и получаем на порту сигнал с заданными параметрами. только смысла в такой реализации ШИМ мало: кто и как будет менять PWM? ведь ШИМ требуется изменять по ходу пьесы, а не делать просто неизменный сигнал...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ARV писал(а):ну, во-первых, рекомендую замыкать кнопки на общий, а на пины подавать подтяжку встроенную. у вас сейчас выходит так, что от кнопки порт заряжается (не забыли, что вход МК это по сути затвор полевика?), а при отпускании кнопки разряжаться ему некуда... вот единичка там и висит. а когда будете замыкать на 0 - затвор разрядится, а при отпускании будет заряжаться от подтяжки - и все будет пучком.
опрос кнопок для практических конструкций логичнее сделать по типу компьютерного, т.е. сделать функцию, которая возвращает код нажатой кнопки. примерно так:
switch(get_key()){
case KEY1: // тут обрабатываете нажатие первой кнопки
break;
case KEY2: // тут - второй
break;
case KEY1 | KEY2 : // тут можно обработать одновременное нажатие двух кнопок
break;
// и так далее
default:
// тут что-то если не нажата ни одна или запретная комбинация
}
пытаюсь разобраться с этим, что то не выходит.
где я ошибся?
я тут присмотрелся - немножко ошибся я в своем примере
надо было KEY1 и т.п. описывать сразу как 1<<PB1 и т.п. тогда (KEY1 | KEY2 | KEY3) = 0000 1110 - это маска, которая оставит от считанного из порта только те биты, которые нам нужны
считываем из порта, в котором нолик - это нажатая кнопка, инвертируем - нажатая кнопка становится 1, накладываем маску - остается только 1 на месте нажатой кнопки.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ARV писал(а):я тут присмотрелся - немножко ошибся я в своем примере
надо было KEY1 и т.п. описывать сразу как 1<<PB1 и т.п. тогда (KEY1 | KEY2 | KEY3) = 0000 1110 - это маска, которая оставит от считанного из порта только те биты, которые нам нужны
считываем из порта, в котором нолик - это нажатая кнопка, инвертируем - нажатая кнопка становится 1, накладываем маску - остается только 1 на месте нажатой кнопки.
когда кнопки cконфигурированы на вход с подтяжкой, то при НЕ нажатой кнопке на входе будет 1?
скажем, кнопки и МК в пределах одной платы небольшого размера если выносить на шлейфах - лучше ставить внешние подтяжки в виде несколько-килоомных резисторов
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ARV писал(а):я тут присмотрелся - немножко ошибся я в своем примере
надо было KEY1 и т.п. описывать сразу как 1<<PB1 и т.п. тогда (KEY1 | KEY2 | KEY3) = 0000 1110 - это маска, которая оставит от считанного из порта только те биты, которые нам нужны
считываем из порта, в котором нолик - это нажатая кнопка, инвертируем - нажатая кнопка становится 1, накладываем маску - остается только 1 на месте нажатой кнопки.
минус этого способа только то, что порт надо полностью отдавать под кнопки, так?
смысл кода: в PWM задаем значение ШИМ от 0 до 255 и получаем на порту сигнал с заданными параметрами. только смысла в такой реализации ШИМ мало: кто и как будет менять PWM? ведь ШИМ требуется изменять по ходу пьесы, а не делать просто неизменный сигнал...
PWM можно же менять по кнопке?
а если не по кнопке, то делать для него цикл с задержкой?
ну лично я привык делать не так... все процессы непрерывной генерации чего-либо (динамическая индикация, выходные ШИМ-сигналы) я делаю фоновыми по таймеру, а все процессы, которые могут возникать незапланированно (например, работа с кнопками или вывод на индикатор) я делаю в основном цикле.
если же в основном цикле делать ШИМ, то тогда кнопки и прочее придется обрабатывать по прерываниям, что не всегда просто, а для случая, когда надо сохранять интервалы ШИМ из основного цикла - это даже весьма непросто. разумеется, если вы в каком-то прерывании измените значение PWM, у вас и сигнал изменится.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ARV писал(а):ну лично я привык делать не так... все процессы непрерывной генерации чего-либо (динамическая индикация, выходные ШИМ-сигналы) я делаю фоновыми по таймеру, а все процессы, которые могут возникать незапланированно (например, работа с кнопками или вывод на индикатор) я делаю в основном цикле.
если же в основном цикле делать ШИМ, то тогда кнопки и прочее придется обрабатывать по прерываниям, что не всегда просто, а для случая, когда надо сохранять интервалы ШИМ из основного цикла - это даже весьма непросто. разумеется, если вы в каком-то прерывании измените значение PWM, у вас и сигнал изменится.
логично
то есть, лучше запустить таймер, допустим на переполнение и писать в PWM его данные?
если для ШИМ использовать таймер, то есть 2 пути:
1. использовать аппаратные возможности таймера (TIMER1 всегда имеет возможность аппаратно генерировать ШИМ, а другие - в зависимости от модели МК)
2. делать программный ШИМ (на любом таймере можно сделать низкочастотный ШИМ хоть для 32 каналов независимо).
плюс первого подхода - высокая частота ШИМ (в зависимости от разных условий и типа МК может достигать 500 кГц), минус - число аппаратных каналов ШИМ обычно не превышает 3, а в исключительных случаях - 6.
плюс второго подхода - свобода в выборе таймера и возможность реализации числа независимых каналов ШИМ практически равного числу свободных пинов МК. минус - низкая частота программного ШИМ (для 8 бит разрешения ШИМ частота будет не выше, чем тактовая поделенная на 256, фактически - гораздо ниже из-за програмных издержек).
выбирайте
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ARV писал(а):если для ШИМ использовать таймер, то есть 2 пути:
1. использовать аппаратные возможности таймера (TIMER1 всегда имеет возможность аппаратно генерировать ШИМ, а другие - в зависимости от модели МК)
2. делать программный ШИМ (на любом таймере можно сделать низкочастотный ШИМ хоть для 32 каналов независимо).
плюс первого подхода - высокая частота ШИМ (в зависимости от разных условий и типа МК может достигать 500 кГц), минус - число аппаратных каналов ШИМ обычно не превышает 3, а в исключительных случаях - 6.
плюс второго подхода - свобода в выборе таймера и возможность реализации числа независимых каналов ШИМ практически равного числу свободных пинов МК. минус - низкая частота программного ШИМ (для 8 бит разрешения ШИМ частота будет не выше, чем тактовая поделенная на 256, фактически - гораздо ниже из-за програмных издержек).
выбирайте
у меня задача сделать контроллер светодиодов на 4 канала, так что выбор соответственно 2 ))) и данной частоты думаю будет с лихвой хватать для этого.
По таймерам просветите пожалуйста, какие регистры надо настраивать и для чего они нужны, а то после прочитанного по ним в голове каша... )))
Контроллер светодиодов на 4 канала ШИМ? всего-то? делайте хоть на тини13 - с успехом хватит ее возможностей для чисто программного ШИМ. код для программного ШИМ вы можете извлечь из исходников к моему микро-проекту "электронная свеча" - смотрите у меня на сайте.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ARV писал(а):Контроллер светодиодов на 4 канала ШИМ? всего-то? делайте хоть на тини13 - с успехом хватит ее возможностей для чисто программного ШИМ. код для программного ШИМ вы можете извлечь из исходников к моему микро-проекту "электронная свеча" - смотрите у меня на сайте.
делаю на atmega8
посмотрел проект, изменение ШИМ мне надо вешать на прерывание? или можно просто считывать значение таймера и подставлять в PWM в том цикле?
ой ли посмотрел? по-моему, после просмотра проекта не должно возникнуть вопросов, подобных заданному...
в проекте таймер реализует программно 6 каналов ШИМ. скважность или коэффициент заполнения каждого канала задается в основном цикле путем записи значения в соответствующий элемент массива.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ой ли посмотрел? по-моему, после просмотра проекта не должно возникнуть вопросов, подобных заданному...
в проекте таймер реализует программно 6 каналов ШИМ. скважность или коэффициент заполнения каждого канала задается в основном цикле путем записи значения в соответствующий элемент массива.
да я не про ваш проект говорю, меня интересует, как можно сделать...