| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
Помогите бестолковому с "С"
10.05.2008, 09:11
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Помогите бестолковому с "С"
Я только начал осваивать эту тему поэтому прошу знаюших не сильно смеятся.
Есть задача
Непрерывно контролировать кнопку на одном из входов порта например PINA.3 програмно подавлять дребезг контактов.
И также непрерывно читать значение некоторой переменной и выводть на семисегментники с динамической индикацией.
Если по отдельности то все более менее понятно. Вместе никак. Чето туплю.
Судя по всему это две функции с бесконечными циклами. Возникает вопрос как из одной попадать в другую и наоборот.
|
|
|
|
10.05.2008, 09:15
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 19.01.2007
Сообщений: 1,745
Сказал спасибо: 2
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
|
Re: Помогите бестолковому с "С"
|
Сообщение от 7Fantomas7
|
|
....Возникает вопрос как из одной попадать в другую и наоборот.
|
Для таких задач существуют прерывания...
Идет в главном цикле процесс Х( индикация)
По прерыванию вызываеться процесс У, подпрограмма(нажатая кнопка)
Данные(параметры процесса Х) на время ухода в прерывание сохраняються в стеке.
Данные от выполненного прерывания(по завершению процесса У)передаються через регистры основному процесу.
Процесс Х, полностью восстанавливаеться из стека и теперь может пользовать данные, полученные от процесса У
примерно так.
Удачи!
__________________
Я, думаю, нужно подумать...
|
|
|
|
10.05.2008, 09:55
|
|
|
Гражданин KAZUS.RUN
Регистрация: 24.06.2005
Сообщений: 530
Сказал спасибо: 262
Сказали Спасибо 216 раз(а) в 118 сообщении(ях)
|
Re: Помогите бестолковому с "С"
|
Сообщение от 7Fantomas7
|
|
Непрерывно контролировать кнопку на одном из входов порта.
|
Для этого, как было описанно выше используйте внешнее прерывание, например INT0. Подключите к этому пину подтяжку для установки 1, установите прерывание по спадающему фронту или по нулю. Когда нажмется кнопка, произойдет прерывание и из основного цикла программы обработка перейдет в тело обработки прерывания, после выполнения которой продолжится выполнение основного цикла.
|
Цитата:
|
|
програмно подавлять дребезг контактов.
|
Для этого можно сделать задержку на 20 мил. сек. Например в CodeVision для этого можно использовать встроенную функцию delay_ms(20)
|
Цитата:
|
|
И также непрерывно читать значение некоторой переменной и выводть на семисегментники с динамической индикацией.
|
Это поместите в основной цикл программы.
|
|
|
|
10.05.2008, 11:23
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,552
Сказал спасибо: 75
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Пример с двумя кнопками на INT0 INT1 с наглядной симуляцией вы можете взять на страничке "Прерывания в AVR" - http://avr123.nm.ru/03.htm
Удачи !
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
10.05.2008, 12:23
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
За ответы спасибо о прерываниях честно говоря не подумал хотя и знаю о таковых. Подтяжку к +5 конечно же сделал и кнопка работает на землю.
Вопрос вот в чем
На трехразрядный семисегментник с порта выводится цифра, зажигается разряд (например единицы), пауза 20 мс. тушится разряд. Далее с порта выводится цифра, зажигается разряд десятков, пауза 20 мс. тушится разряд. И т.д сотни, а потом опять по кругу.
Кнопка (условно кнопка) может быть нажата 9999 раз в секунду т.е длительность импульса 50 мкс. период 50 мкс.
И выходит следующая ерунда, кнопку нажали, прирывание вызвали, подождали 50 мкс.(т.е. пропустили дребезг), если кнопка не отпущена ждем дальше пока отпустится, если отпущена или отпустилась увеличиваем значение переменной на 1, переходим в индикацию.
Но позвольте в индикации времена горения разрядов значительно больше и пока зажжем разряд десятков или сотен то значение переменной может изменится. При таком подходе контролер с ума не сойдет случайно.
|
|
|
|
10.05.2008, 12:57
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,578
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
|
Сообщение от 7Fantomas7
|
За ответы спасибо о прерываниях честно говоря не подумал хотя и знаю о таковых. Подтяжку к +5 конечно же сделал и кнопка работает на землю.
Вопрос вот в чем
На трехразрядный семисегментник с порта выводится цифра, зажигается разряд (например единицы), пауза 20 мс. тушится разряд. Далее с порта выводится цифра, зажигается разряд десятков, пауза 20 мс. тушится разряд. И т.д сотни, а потом опять по кругу.
Кнопка (условно кнопка) может быть нажата 9999 раз в секунду т.е длительность импульса 50 мкс. период 50 мкс.
И выходит следующая ерунда, кнопку нажали, прирывание вызвали, подождали 50 мкс.(т.е. пропустили дребезг), если кнопка не отпущена ждем дальше пока отпустится, если отпущена или отпустилась увеличиваем значение переменной на 1, переходим в индикацию.
Но позвольте в индикации времена горения разрядов значительно больше и пока зажжем разряд десятков или сотен то значение переменной может изменится. При таком подходе контролер с ума не сойдет случайно.
|
20 мс на разряд это слишком много,у тебя они перемигивать будут,с этой проблемой встретился когда делал термометр на DS18B20 и семигментиках,видать как подмигивают пока идет опрос датчика.Лучше всего жки.
Прерывания на то они и прерывания,то есть контролер занят своими делами(у тебя выводит на индикаторы),как только произойдет прерывание,он останавливает основную программу(запоминая) и обрабатывает прерывание и снова возращается в главную программу откуда ушел в прерывание.
|
|
|
|
10.05.2008, 12:59
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,552
Сказал спасибо: 75
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
|
Сообщение от 7Fantomas7
|
|
кнопку нажали, прирывание вызвали, подождали 50 мкс.(т.е. пропустили дребезг)
|
Обычно 20-70 мили сек - антидребезг.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
10.05.2008, 13:20
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Не возражаю но всеравно ждем пока будет отпущена. А аесли 1 нажатие в секунду.
|
|
|
|
10.05.2008, 15:42
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,552
Сказал спасибо: 75
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Не надо жадать. Просто проверяйте периодически.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
10.05.2008, 16:25
|
|
|
Частый гость
Регистрация: 14.09.2005
Сообщений: 34
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Не понял о 9999 нажатиях кнопки в секунду.
А по поводу
|
Сообщение от 7Fantomas7
|
|
Не возражаю но всеравно ждем пока будет отпущена. А аесли 1 нажатие в секунду.
|
Вы путаете два события
1- нажатие кнопки
2- удержание кнопки
а есть еще
3- отпускание кнопки
__
1- нажатие кнопки
Обнаруживаем изменение состояния с 1 на 0.
Например по прерыванию INT1, The falling edge of INT1 generates an interrupt request. Или периодически (5...20мсек), по таймеру, опрашивая кнопки и запоминая предыщее состояние и сравнивая его с текущим. Затем, для проверки не дребезг ли это, включаете задержку времени, по таймеру, (или с помощью delay()) и по окончании этой задержки снова проверяете состояние кнопки, можно повторить несколько раз для большей надежности. Убедившись, что не дребезг выполняете обработку события "нажатие кнопки".
__
2- удержание кнопки
После того, как нажатие кнопки обработано дальнейшее ее удержание может быть неважным и никак не обрабатываться. А может быть важным, тогда включаем другую задержку времени и по окончании ее снова проверяем состояние кнопки. Если нажата, то обрабатываем событие "удержание кнопки", и так далее.
Отпускание кнопки, тоже проверяем на дребезг.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:17.
|
|