| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
Помогите бестолковому с "С"
10.05.2008, 18:03
|
|
|
Частый гость
Регистрация: 21.08.2006
Сообщений: 47
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
|
Сообщение от 7Fantomas7
|
На трехразрядный семисегментник с порта выводится цифра, зажигается разряд (например единицы), пауза 20 мс. тушится разряд. Далее с порта выводится цифра, зажигается разряд десятков, пауза 20 мс. тушится разряд. И т.д сотни, а потом опять по кругу.
Кнопка (условно кнопка) может быть нажата 9999 раз в секунду т.е длительность импульса 50 мкс. период 50 мкс.
|
Автор, ты (условно говоря) фигню пишешь. Если это кнопка - нажми ее 9999 раз, ну хотя бы 9998 раз в секунду и я тебе весь код с коментами напишу. Если это не кнопка - так и пиши что это, может и нет там никакого дребезга. Хотя ты сам написал что кнопка, которая работает на землю. Миллисекунды отличаются от микросекунд в 1000 раз и их тоже путать не надо.
Кнопку чаще 5-ти раз в секунду ты не нажмешь. Исходя из этого и опрос её делать чаще 10 раз в секунду (через 100 мсек) смысла нет (ну максимум 20 раз в секунду для особо шустрых). И прерывания там не нужны. Запускаешь таймер на 100 мсек (ну или на 50 мсек), по срабатыванию перезапускаешь таймер и опрашиваешь кнопки. Автоматом и антидребезг получается. Если кнопок несколько - записываешь их состояние в переменную, если кнопка одна - достаточно одного бита. Переменных (или бита) два - на текущее и предыдущее состояние. Ещё один бит (bitKeyOK) взводится что-бы сообщить в основной цикл что был опрос клавиатуры. Так ты не будешь мешать индикации и не пропустишь нажатия.
|
Код:
|
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0x??;
bitKeyOK = 1;
bitKeyNew = PINA.3;
} |
Второй таймер запускаешь для динамической индикации на семисегментники. С ним и сам разберешься?
В основном цикле пишешь так
|
Код:
|
while (1)
{
if (bitKeyOK) // был опрос клавиатуры
{
тут сравниваешь предыдущее значение клавиатуры
с новым, делаешь что надо согласно генеральному
плану развития программы и ...
// присваиваешь новое значение клавиатуры предыдущему
bitKeyOld = bitKeyNew;
// сбрасываешь флаг, опрос обработан, ждем следующего
bitKeyOK = 0;
}
а тут выполняешь другую полезную работу и так
пока питание не выключат
}; |
Вопросы есть?
|
|
|
|
10.05.2008, 19:05
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
|
Цитата:
|
|
Если это кнопка - нажми ее 9999 раз, ну хотя бы 9998 раз в секунду и я тебе весь код с коментами напишу. Если это не кнопка - так и пиши что это, может и нет там никакого дребезга.
|
Я же писал условно кнопка.
На больших частотах конечно же какой нибудь бесконтактный выключатель с транзисторным ключем на выходе. На малых например геркон, согласитесь может работать чаще чем 5 раз в секунду.
Поэтому есть интерес чтоб как бы кнопка, покрайней мере и то и другое подключить можно и поэксперементировать в живую.
А еще частота менятся может от min до max и разряд единиц мы не отображаем толькоко десятки, сотни, тысячи.
За текст с коментами буду конечно благодарен но мне важно принцип понять, а не готовую програму слизать.
|
|
|
|
10.05.2008, 19:32
|
|
|
Частый гость
Регистрация: 21.08.2006
Сообщений: 47
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
текст будет если кнопку нажмешь
Есть конкретная задача - описывай её, а придумывать "что-то эдакое, как бы на все случаи жизни" напрасная трата времени. Универсальное всегда хуже специализированного, никто не делает экскаватор для гонок на формуле-1. Принцип для кнопки я тебе привел, для скоростных опросов он не подходит, там нужны прерывания от источника сигнала. Но основной принцип тот-же. Нет смысла выводить результат быстрее восприятия его глазом, в прерывании инкрементируется счетчик (по фронту например), а по таймеру счетчик считывается и обнуляется. Дребезга там нет и защищатся не надо. Если у тебя частота импульсов сравнима с дребезгом кнопки то совместить их и кнопку на один вход можно конечно, но для этого надо использовать аппаратный подавитель дребезга кнопки на тригере и кнопку с перекидывающимся контактом. Только зачем? Проще завести разные сигналы на разные входы МК.
|
|
|
|
10.05.2008, 21:22
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Конкретная задача
Считать от 0 до 9999 импульсов в секунду с помощью контактного датчика для малых частот или бесконтактного датчика для частот побольше. Данные вывести на трех разрядный семисегментный индикатор с динамической индикацией десятичных разрядов. Использовать контролер ATMega8535 или ATMega16
PC0-PC7 выхода на сегменты
PB2,PB3,PB4 выхода динамического переключения разрядов
PA3 вход с подтяжкой к +5
Аналогичный дэвайс я держал в руках и эксплуатировал кстати датчик использовался как контактный, так и бесконтактный индуктивный. Очень неплохо штукенция работает, там еще конечно настроек других было вдоволь но это сейчас не интересно так как я не собираюсь делать комерческий обраец, просто изучаю эту тему.
|
|
|
|
11.05.2008, 07:44
|
|
|
Частый гость
Регистрация: 21.08.2006
Сообщений: 47
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Задача понятна, но твоих предложений по её решению нет, и соответственно обсуждать пока нечего. Ты сказал что готовый код тебе не нужен, так предлагай свой, обсудим. Вариантов уже дали много
При динамической индикации на три индикатора ток через сегмент в три раза больше обычного. Буферные элементы установлены? Мега-16 избыточна, хватит и Меги-8.
10000 имп/сек это 0,0001 сек или 0,1 миллисекунды на один импульс. Это в 200 раз больше примерного времени дребезга. На один вход датчик и кнопку повесить можно, но, или кнопка без дребезга или подавление дребезга отключается настройками (джамперами), которых было "вдоволь" в девайсе, которым ты пользовался. Или, как я уже предлагал, разные датчики на разные входы с разным способом подсчета импульсов.
|
|
|
|
11.05.2008, 10:36
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
|
Цитата:
|
|
При динамической индикации на три индикатора ток через сегмент в три раза больше обычного.
|
Позвольте узнать это еще вдруг почему.
|
Цитата:
|
|
Буферные элементы установлены? Мега-16 избыточна, хватит и Меги-8.
|
ATMega8535 или ATMega16 это не обсуждается, собрано в железе просто есть готовый рабочий дэвайс который делал для других решений, я больше по электронике програмы пишут другие.
|
Цитата:
|
|
Задача понятна, но твоих предложений по её решению нет
|
Если бы были решения глупых вопросов не задавалбы.
У меня есть еще один глупый вопрос что делает "void" я нигде не нашел описания предназначения этого слова кроме как то что это ключевое слово.
|
|
|
|
11.05.2008, 11:13
|
|
|
Гражданин KAZUS.RUN
Регистрация: 24.06.2005
Сообщений: 530
Сказал спасибо: 262
Сказали Спасибо 216 раз(а) в 118 сообщении(ях)
|
Когда-то я делал устройство, пока учился работать с МК, там была у меня динамическая индикация на 4 индикатора. Прикрепляю схему и фрагмент программы обработки динамической индикации. Тогда я не видел чьих либо решений, сделал как пришло в голову. Программу писал в ICC.
функция code() кодирует индицируемое число в код для сегментов.
Транзисторные ключи управляют 4-мя цифрами, буфер ULN2003AN - сегментами цыфр.
Прикрепленный файл: 6158542.rar
|
|
|
|
11.05.2008, 11:17
|
|
|
Временная регистрация
Регистрация: 11.12.2007
Сообщений: 79
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
1. Почему - потому что скважность импульса на индикацию равна 3, светодиоды тусклее светятся. Ну, может не в 3 раза - токоограничивающие резисторы на сегменты - ом 470, не больше.
2. По задаче - как я бы сделал - прерывание инт - на регистрацию входных импульсов, таймер 16 разрядный - формирование секундного интервала, таймер 8 разрядный - для регенерации дисплея. Герц 70-100 хватит. Ножки выбора знакомест - через диоды - на кнопки, сразу после регенерации осмотр клавиатуры.
3. Воид - это фунция, не возвращающая параметров, т.е. она что-то делает, но результат ее действий не используется в программе. Скажем, функция регенерации содержимого дисплея может быть воид.
|
|
|
|
11.05.2008, 12:03
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
urry1
|
Цитата:
|
|
1. Почему - потому что скважность импульса на индикацию равна 3, светодиоды тусклее светятся. Ну, может не в 3 раза - токоограничивающие резисторы на сегменты - ом 470, не больше.
|
Вы просто ясновидящий. Именно 470 Ом, именно скважность 3. В железе все светится очень замечательно на градуснике.
|
Цитата:
|
|
Герц 70-100 хватит.
|
Я пришел к мнению что 100-150 хвытит наверняка.
|
Цитата:
|
|
Ножки выбора знакомест - через диоды - на кнопки
|
Простите не совсем понял.
За woid спасибо, а то что то я тупанул с этой штукенцией
delay
За ответ спасибо я тоже нечто подобное навоял
|
|
|
|
11.05.2008, 12:26
|
|
|
Временная регистрация
Регистрация: 11.12.2007
Сообщений: 79
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Я имел в виду - с целью экономия ножек - не использовать отдельные выводы мк под клавиатуру, а использовать уже выделенные еще и под другое назначение. Например, я использовал выбор знакоместа еще и под клавиатуру и разряды для сегментов - для регистров-защелок.
-- Прилагается рисунок: --
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:46.
|
|