Страница 1 из 1

Вопросик по микроконтроллерам

Добавлено: Пн янв 11, 2010 18:26:35
Starp
Изучаю сейчас потихонечку AVR ) Конкретно ковыряюсь с tiny2313. Но это в общем то не важно...
Вопрос значит в следующем, стоит например задача, сделать термометр. Берем 4 штуки семисегментных индикатора, датчик допустим 18b20.

Вопрос, как сделать индикацию? :) Динамическая индикация это все понятно, по очереди выводишь на каждый индикатор. Основной вопрос как это все по времени согласовать, что бы не тратить много ресурсов на индикацию (что бы не мигало слишком часто), и что бы индикация не задерживалась, если МК сильно загружен. Отсюда еще возникает вопрос как сделать часы? Как соблюсти точность хода? Читал про таймеры :) Как ими управлять, как предделители юзать, и т.д.

Единственное что придумал, это в случае с часами, надо сделать прерывание по таймеру, ну и там посчитать сколько он насчитает (в зависимости от делителя и частоты кварца), ну и прибавлять значение какой-нибудь переменной, допустим подобрать такой кварц, что б его частота / 1024 была равна 1 секунде, тогда можно завести переменную "секунда" и к ней прибавлять каждый раз по 1, если у нас 59 секунд, проверяем сколько минут, прибавляем, ну и т.д.

Извиняюсь за каламбур, но не могу я правильно сформулировать мысль, ибо бардак в голове :)

Если не сложно, опишите в двух словах алгоритмы часов, термометров, часов с термометром :)

Добавлено: Пн янв 11, 2010 18:34:32
Arlleex
вам надо индикацию? да уже при 20Гц нормальная индикация получится.
А вообще сделать чуть больше и мерцать не будет.
Точность хода зависит от времязадающих цепочек генератора)))

Добавлено: Пн янв 11, 2010 18:57:04
Starp
20 Гц или больше тут я сам смогу опытным путем подобрать :) Меня интересует какими средствами индикацию сделать. И что делать допустим если у меня какое-нибудь событие по прерыванию обрабатывается, и обработка занимает скажем секунду, две, три? А в это время на индикаторе скажем секундомер должен бежать :) Во время прерывания функция индикации в программе обрабатываться не будет же? тоесть там зависнет та информация, которая выводилась на момент вызова прерывания. При чем насколько я понимаю на одном сегменте ) остальные вообще потухнут )
Во, понял как сформулировать вопрос ))
Как заставить МК выполнять задачи параллельно? :) или это впринципе не возможно?

Добавлено: Пн янв 11, 2010 19:34:09
Arlleex
можно) прерываниями.

Добавлено: Пн янв 11, 2010 19:51:37
Starp
Ну а попродробнее можно? )
Вот скажем хочу сделать климат-контроль ) в будущем с часами, щас без часов )

Имеется:
форточка с электроприводом :)
DS18B20
2 кнопки управления термостатом
2 датчика крайних положений

Нужно:
Что бы при включении оно показывало текущую температуру.
Возможность установки целевой температуры, алгоритм пока простой, выставил скажем 20 градусов, если температура больше 20 - открыть, меньше закрыть, 20 - ниче не делать. Потом можно модернизировать будет, сделать что бы не на полную открывалась, а на 1/4, если температура не меняется в течении 20 секунд, то еще открыть или закрыть, тогда будет плавнее работать, но не суть. Это уже детали.

В общем так, включили, показывает температуру.
Включение выключение режима термостата - нажать 2 кнопки.
Ну а по отдельности - больше/меньше температура.

В данном случае как поступить? Вот опрос кнопок, надо сделать что бы можно было нажать 2 кнопки одновреммено, но т.к. не получится их нажать одновременно, разница в миллисекунды все равно будет, надо сделать задержку(допустим 0.5сек), вот что бы во время этой задержки индикация не пропадала, надо делать её через прерываение по таймеру? А как быть если я еще часы захочу сделать? Нужно 2 таймера будет? ) Один будет считать секунды, второй заниматься индикацией? Или как? :)

Re: Вопросик по микроконтроллерам

Добавлено: Пн янв 11, 2010 20:18:49
Барсик
Starp писал(а):Изучаю сейчас потихонечку AVR ) Конкретно ковыряюсь с tiny2313.

Там целых 2 таймера. Я бы сделал на 8 разрядном таймере быстрые системные часы - организовал бы на нём прерывание 1 раз в миллисекунду. И использовал бы это прерывание для динамической индикации и сканирования кнопок. Каждую миллисекунду выводил бы сегменты очередного индикатора.
А чтобы второй 16 разрядный таймер не пропадал зря, сделал бы на нём медленные системные часы. Организовал бы прерывание 1 раз в секунду. И прибавлял бы единичку к счётчику секунд.
Хотя можно обойтись и одним таймером.
А всё остальное делал бы в основном цикле программы.

Starp писал(а):...подобрать такой кварц, что б его частота / 1024 была равна 1 секунде..

Не обязательно такой. Кварц, вообще говоря, может быть любым. Следует использовать для таймеров режим CTC. Тогда можно задать желаемую величину пересчёта таймеров без их перезагрузки. И точность счёта будет обеспечена, поскольку счёт таймеров будет происходить чисто аппаратно.

Сделайте поиск по этому сайту "режим CTC" "Искать все слова" Узнаете много интересного.

Добавлено: Пн янв 11, 2010 20:28:30
Starp
Я бы сделал на 8 разрядном таймере быстрые системные часы - организовал бы на нём прерывание 1 раз в миллисекунду. И использовал бы это прерывание для динамической индикации и сканирования кнопок. Каждую миллисекунду выводил бы сегменты очередного индикатора.


На счет сканирования кнопок можно поподробнее? Обрабатывать эти кнопки где? Если в функции прерывания, то индикация тормозить будет из-за задержки при опросе кнопки (в том случае если кнопку нажал, зачем - писал выше)
Или проверять 1 раз в миллисекунду, потом присваивать какой-нибудь глобальной переменной-флагу значение и обрабатывать кнопку в основном цикле и в нем же сделать задержку, что бы она не влияла на индикацию?

Добавлено: Пн янв 11, 2010 20:56:34
Meteor
Starp писал(а):Меня интересует какими средствами индикацию сделать.

Как уже сказали одним из таймеров. Как вариант. Заводим переменную - указатель адреса ячейки памяти, считываем ее. Выводим данные в порт параллельно или последовательно. После этого указатель на новую ячейку памяти.
Starp писал(а): И что делать допустим если у меня какое-нибудь событие по прерыванию обрабатывается, и обработка занимает скажем секунду, две, три?

Не делайте обработку такой долгой - это ресурсы МК и они не безграничны.
Если угодно то обработка прерывания долна быть коротка как рукопашная схватка: раз-два и ... :wink:

Добавлено: Пн янв 11, 2010 22:11:50
ARV
я писал статью про динамическую индикацию - на моем сайте она есть. надеюсь, там найдете ответы на все вопросы...

Добавлено: Вт янв 12, 2010 11:40:21
Starp
Всем ответившим огромное спасибо :))
Барсик, спасибо за объяснение на счет использования двух таймеров. Как раз то, что я хотел узнать (как сделать что бы задержки основного цикла не влияли на индикацию и на ход часов одновременно)

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

ARV, спасибо, изучу ваш сайт :)

А вот еще вопросик можно? )
Допустим вешаю несколько кнопок на общие катоды/аноды индикатора, и опрашиваю кнопки вместе с индикацией. Как программно избавиться от дребезга, и как сделать что бы какая-нибудь функция выполнялась при одновременном нажатии двух кнопок?
Избавление от дребезга программно - насколько я понимаю это надо задержку делать. Что плохо для индикации, ибо нажатие на кнопки будет на неё влиять. И на счет двух кнопок одновременно, невозможно же физически их нажать одновременно, опять же надо допустить задержку, на 0.1-0.3 секунды между нажатием первой и второй кнопки, что опять же нехорошо скажется на индикации. Расскажите пожалуйста как быть? :)

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

Добавлено: Вт янв 12, 2010 12:14:12
ARV
вы сначала изучите, а потом спрашивайте :) давал ответ я на ваш "еще один вопросик".

что-то вы притормаживаете: 0,3с на промежуток между "одновременным" нажатием кнопок - это даже по латышским меркам долго... :)))

Добавлено: Вт янв 12, 2010 12:23:13
Starp
Гы :))
Ладно, сегодня вечером почитаю, если что непонятно будет - спрошу. А то что 0.3с - "одновременное" нажатие, это я так, примерно написал :)

З.Ы. Я не тормоз :))

Добавлено: Вт янв 12, 2010 14:12:47
md5sum
Вы очень сильно переживаете за индикацию :))

Для примера: установим внутренний генератор на 8мГц, настроим таймер в режим CTC - делитель на 64 и сброс при достижении 125
(8000000/(64*125)=1 кГц) получим прерывания с периодом 1 милисек

В начале прерывания обновляем индикацию и проверяем кнопку на текущем сегменте (заносим ее состояние куда-нить для последующей обработки), потом спокойно (не спеша :) ) в основном цикле проверяем состояния кнопок и выполняем все остальное помня, что до следующего прерывания осталось чуть меньше 8000 тиков! Вполне достаточно времени на чашечку кофе (по меркам МК) :))

Добавлено: Вт янв 12, 2010 14:55:56
Starp
md5sum, пасиба, теперь во всем разобрался :)

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