Свежие обсуждения
Микроконтроллеры

AVR начинающим - вопросы и ответы

1 10 68

Выручите, коллеги - http://pro-radio.ru/controllers/4960/

 

А никому не попадалась сводная таблица ног, для програмирования, у разных чипов?
Говорят, есть на Атмеле. Но я там, что-то не нашёл такого...

 

Подскажите пожалуйста алгоритм как повесить кнопку без фиксации на любую ножку порта, чтоб раз нажал -1, второй раз нажал - 0.А если нажал и ждешь то остается текущее значение. А то что-то запутался

 

Если просто, без прерываний, то примерно так... Заводим битовую переменную. В ней храним состояние кнопки. Кнопку опрашиваем в цикле. Как только стало 0 (предполагаем, что на ноге висит подтягивающий резистор), вызываем функцию, в которой сначала ждем отпускания кнопки while(!PINB.0), а потом инвертируем нашу битовую переменную (меняем значение на противоположное текущему). Если без поиска изящных решений - то просто в условии проверяем значение и меняем на противоположное. Вот вроде... Паузы для "антидребезга" можно воткнуть в в самом начале фукции обработчика нажатия кнопки. Миллисекунд 50 хватит. С уважением, Николай.

 

Подскажите пожалуйста как мне запрограммировать контроллер ATmega16. Задача такая: на вход поступает аналоговый сигнал , нужно оцифровать его и сравнить с эталоном(это что-то вроде оптимального сигнала). Если оцифрованный сигнал меньше по значению чем эталон, то результат этого сравнения будет 0, если больше то 1. Помощь мне нужна в написании самого программного кода. Можно в Си можно Асм. Или подскажите литературку(на РУС.яз)?

 

shemmer: если нажал и ждешь то остается текущее значение.
А вот для этого в момент нажатия запускаешь таймер, и если отпускание произошло ПОЗЖЕ
какого либо значения в TCNT, то бит не инвертируешь,
а оставляешь без изменения.

 

Задача такая: на вход поступает аналоговый сигнал , нужно оцифровать его и сравнить с эталоном(это что-то вроде оптимального сигнала). Если оцифрованный сигнал меньше по значению чем эталон, то результат этого сравнения будет 0, если больше то 1.
Если "эталон" тоже у Вас в виде напряжения в схеме, то, на мой взгляд, лучше использовать встроенный компаратор.
Если "эталон" - цифровое значение, то простое использование АЦП.

О работе АЦП на русском языке описано в книге Фольфган Трамперт "Измерение, регулирование и управление с помощью AVR микроконтроллеров" -- это теория. Ну а практика ... предлагайте свои алгоритмы, наброски схемы, а форум подскажет.

Ссылка на книгу: http://rapidshare.com/files/58527702/V.Trampert_AVR_RISC_mikrocontroller.rar (кажется рабочая)
И еще здесь 100%, но несколько дней http://andryg.ho.com.ua/temp/avr_trampert.djvu

 

Михаил_:в момент нажатия запускаешь таймер

Так у меня все таймеры задействованы в Atmega16

Спасибо Николаю за "толчок мысли"

 

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

 

все таймеры задействованы
А, случаем, на одном из них не висит динамическая индикация ? Или еще чего-нить ... главное, чтобы таймер постоянно работал?

Тогда можно замутить так
Каждая сработка таймера.
Если счетчик нажатий > 0
счетчик нажатий +1 (это счетчик длительности нажатия кнопки "в сработках таймера")
Если предыдущее состояние кнопки == настоящему -> выход с обработки
если сейчас кнопка нажата (значит раньше была отпущена)
счетчик нажатия = 1 (запускаем счетчик длительности нажатия. счетчик увеличивается каждую сработку)
Если сейчас кнопка отпущена (
то смотрим счетчик
если меньше XX - значит было короткое нажатие
иначе - было длинное нажатие
счетчик нажатий = 0 (останавливаем счетчик)
)

Примерно по такому алгоритму у меня обрабатывается 4 кнопки. Различаются длительные и короткие нажатия и комбинации нажатий. (длительное удержания кнопок 2 и 3)