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

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить
Аватара пользователя
Starp
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн окт 19, 2009 09:48:40
Откуда: Питер
Контактная информация:

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

Сообщение Starp »

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

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

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

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

Если не сложно, опишите в двух словах алгоритмы часов, термометров, часов с термометром :)
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

вам надо индикацию? да уже при 20Гц нормальная индикация получится.
А вообще сделать чуть больше и мерцать не будет.
Точность хода зависит от времязадающих цепочек генератора)))
Не умеешь - не берись, но не взявшись не научишься...
Аватара пользователя
Starp
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн окт 19, 2009 09:48:40
Откуда: Питер
Контактная информация:

Сообщение Starp »

20 Гц или больше тут я сам смогу опытным путем подобрать :) Меня интересует какими средствами индикацию сделать. И что делать допустим если у меня какое-нибудь событие по прерыванию обрабатывается, и обработка занимает скажем секунду, две, три? А в это время на индикаторе скажем секундомер должен бежать :) Во время прерывания функция индикации в программе обрабатываться не будет же? тоесть там зависнет та информация, которая выводилась на момент вызова прерывания. При чем насколько я понимаю на одном сегменте ) остальные вообще потухнут )
Во, понял как сформулировать вопрос ))
Как заставить МК выполнять задачи параллельно? :) или это впринципе не возможно?
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

можно) прерываниями.
Не умеешь - не берись, но не взявшись не научишься...
Аватара пользователя
Starp
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн окт 19, 2009 09:48:40
Откуда: Питер
Контактная информация:

Сообщение Starp »

Ну а попродробнее можно? )
Вот скажем хочу сделать климат-контроль ) в будущем с часами, щас без часов )

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

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

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

В данном случае как поступить? Вот опрос кнопок, надо сделать что бы можно было нажать 2 кнопки одновреммено, но т.к. не получится их нажать одновременно, разница в миллисекунды все равно будет, надо сделать задержку(допустим 0.5сек), вот что бы во время этой задержки индикация не пропадала, надо делать её через прерываение по таймеру? А как быть если я еще часы захочу сделать? Нужно 2 таймера будет? ) Один будет считать секунды, второй заниматься индикацией? Или как? :)
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

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

Сообщение Барсик »

Starp писал(а):Изучаю сейчас потихонечку AVR ) Конкретно ковыряюсь с tiny2313.

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

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

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

Сделайте поиск по этому сайту "режим CTC" "Искать все слова" Узнаете много интересного.
Аватара пользователя
Starp
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн окт 19, 2009 09:48:40
Откуда: Питер
Контактная информация:

Сообщение Starp »

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


На счет сканирования кнопок можно поподробнее? Обрабатывать эти кнопки где? Если в функции прерывания, то индикация тормозить будет из-за задержки при опросе кнопки (в том случае если кнопку нажал, зачем - писал выше)
Или проверять 1 раз в миллисекунду, потом присваивать какой-нибудь глобальной переменной-флагу значение и обрабатывать кнопку в основном цикле и в нем же сделать задержку, что бы она не влияла на индикацию?
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Сообщение Meteor »

Starp писал(а):Меня интересует какими средствами индикацию сделать.

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

Не делайте обработку такой долгой - это ресурсы МК и они не безграничны.
Если угодно то обработка прерывания долна быть коротка как рукопашная схватка: раз-два и ... :wink:
Последний раз редактировалось Meteor Пн янв 11, 2010 22:36:12, всего редактировалось 1 раз.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
Starp
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн окт 19, 2009 09:48:40
Откуда: Питер
Контактная информация:

Сообщение Starp »

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

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

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

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

На счет дребезга то ладно, можно взять, да RS-триггер собрать, а вот на счет двух кнопок одновременно - вопрос открыт :)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

вы сначала изучите, а потом спрашивайте :) давал ответ я на ваш "еще один вопросик".

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

Мой уютный бложик... заходите!
Аватара пользователя
Starp
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн окт 19, 2009 09:48:40
Откуда: Питер
Контактная информация:

Сообщение Starp »

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

З.Ы. Я не тормоз :))
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Сообщение md5sum »

Вы очень сильно переживаете за индикацию :))

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

В начале прерывания обновляем индикацию и проверяем кнопку на текущем сегменте (заносим ее состояние куда-нить для последующей обработки), потом спокойно (не спеша :) ) в основном цикле проверяем состояния кнопок и выполняем все остальное помня, что до следующего прерывания осталось чуть меньше 8000 тиков! Вполне достаточно времени на чашечку кофе (по меркам МК) :))
Аватара пользователя
Starp
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн окт 19, 2009 09:48:40
Откуда: Питер
Контактная информация:

Сообщение Starp »

md5sum, пасиба, теперь во всем разобрался :)

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

Вернуться в «Теория»