Показать сообщение отдельно
Старый 12.03.2014, 18:25   #1
RTFAMS
Junior Member
 
Регистрация: 12.03.2014
Адрес: Крым
Сообщений: 7
Вес репутации: 100/0
RTFAMS will become famous soon enoughRTFAMS will become famous soon enough
По умолчанию Многоканальный термометр c простым меню на PIC16F877 и АЛС

Доброго времени суток.

Решил сделать многоканальный термометр на PIC16F877 с индикацией на семисегментых индикаторах (3 разряда на АЛС) c простеньким меню и управлением на 4-х кнопках.

Основой для этого проекта послужила информация, опубликованная в источнике:

A Simple Digital Thermometer: http://www.radiolocman.com/shem/sche....html?di=52321

и ее продолжение на русском языке

Простой цифровой термометр Измерения Микроконтроллеры: www.rlocman.ru/shem/schematics.html?di=52321

Собственно мной добавлены в исходную схему еще несколько каналов измерения и пересмотрено управление режимом работы.

Основной канал измерения (1) закреплен за кнопкой [1] и не меняется. Дополнительный канал можно выбирать по необходимости (2..5) и фиксировать за кнопкой [2]. По умолчанию за кнопкой [2] пока закреплен канал (2), но впоследствии хочу предусмотреть восстановление настроек после сброса питания, поэтому использую память, а не переменные. При нажатии на кнопку [1] или [2] происходит вывод на индикатор номера канала (кратковременно), а затем в непрерывном режиме происходит индикация измеренной температуры.

Выбор дополнительного канала измерения (2..5) и запись его номера во встроенную память производится через нажатие кнопки [3]. При этом кнопка [1] служит для изменения номера дополнительного канала в сторону увеличения (+1), а кнопка [2] служит для изменения номера дополнительного канала в сторону уменьшения (-1).

Периодичность проведения измерений можно изменять в пределах (1..9) секунд и производится это через нажатие кнопки [4]. При этом смена значений производится кнопками [1] и [2] аналогично описанному выше.

Управление с клавиатуры состоит в следующем:

кнопка [1]:
-----------
- короткое нажатие: измерения и отображения результатов по заданному каналу, (режим №1) с заданной периодичностью.
= короткие нажатия (increment)[2..5][1..9]: задание номера канала измерения и периодичности измерения (увеличение).

кнопка [2]:
-----------
- короткое нажатие: режим измерения и отображения результатов по № канала из 1-й ячейки ПЗУ с периодичностью, задаваемой числом, занесенным в 2-ю ячейку памяти ПЗУ.
= короткие нажатия (decrement)[5..2][9..1]: задание номера канала измерения и периодичности измерения (уменьшение).

кнопка [3]:
-----------
- первое нажатие: переход в режим задания номера канала измерения + индикация ("ch_").
= второе нажатие: запись в 1-ю ячейку ПЗУ номера канала измерения и возврат в (режим №1).

кнопка [4]:
-----------
- первое нажатие: переход в режим задания периодичности измерения + индикация ("dt_").
= второе нажатие: запись во 2-ю ячейку ПЗУ периодичности измерения и возврат в (режим №1).

На данный момент не получается записывать в память введенный номер канала по второму нажатию кнопки [3]. Если использовать программный код приведенный в (code_1), то не получается выход из цикла и переход к записи в память. В чем ошибка пока не могу понять, может кто подскажет?

Если использовать программный код написанный по другому (code_2)(*), то получается сменить номер канала и записать его в память за один шаг, а после выйти из режима выбора канала.

Пробовал симулировать эту схему в Proteus, она работает с кодом помеченным выше (*). Отдельные светодиоды в схеме выполняют роль сегментов "h" в соответствующих разрядах индикаторов. Режимы работы индикатора EEPROM (сегмент "h" младшего разряда) следующие:
1) LED-ON - смена настроек, работа с EEPROM,
2) 1-Blink - записанные данные = OK,
3) LED-OFF(NO 1-Blink) - данные записаны некорректно.

Схема и фрагменты кода приведены ниже.
Миниатюры
measure_sys.pdf   code_1.PNG   code_2.PNG  
RTFAMS вне форума   Ответить с цитированием