Свежие обсуждения
Микроконтроллеры

Разработка таймера на основе PIC16F628(A) с программой на языке С

1 9 21

Zandy: Может быть ошибка в один такт?
AHTOXA: Всенепременно
Ну-ну... Смотрим даташит!

нм.ру починили!

 

picmaniac: Ну-ну... Смотрим даташит!

Ну соврал маленько, мне простительно Зато какую я идею подбросил!

 

Жду дальнейших замечаний и предложений по техзаданию, схеме и предложенному варианту графа. Если ничего в ближайшее время не появится - предлагаю утвердить техзадание и схему. Тогда вплотную займёмся графом, алгоритмом и написанием кода.
Улучшайзинг с добавлением новых функций будет потом, когда базовый вариант (см. техзадание) нормально заработает.

 

Состояние, когда одна из кнопок установки времени отсчета удерживается нажатой, как будет определяться и сколько надо времени чтобы распознать удержание?

 

По поводу экономии батареии. Предлагаю сделать не "мигание", а понижать яркость (например до 20...40%). Каждую минуту включать на 1...3 секунды на полную яркость. Переход можно сделать и плавным (задавая время отображения каждой цифры), как в предложеном мной функции ShowValue().

 

Сергей К: Предлагаю сделать не "мигание", а понижать яркость
Кто за, кто против? обсудим предложение...

ПАШИК, в моём варианте программы для опроса кнопок была предусмотрена специальная функция. При вызове её текущее состояние TRISB и защёлок портов (PORTA, PORTB) сохранялось, а по окончании работы функции - восстанавливалось. При работе функции 8 раз подряд опрашивалось положение кнопок. Если их положение за все 8 опросов было неизменным - это и являлось результатом. Если же были изменения - то выдавался результат "все кнопки отпущены". На время работы этой функции все прерывания запрещались.
Это, конечно, не единственно возможный вариант. Работало в железе нормально.
А для выявления нажатий на кнопки в режиме счёта - проверялся уровень на ноге RB0 в обработчике прерываний, но только при погашенных индикаторах и выставленном лог.0 на RB1-RB7. И если за несколько прерываний подряд на RB0 оказывался лог.0 - то флаг GO сбрасывался и устанавливался флаг USERSTOP. Для того, чтоб не было ложного останова, когда пользователь нажал кнопку старт-стоп для запуска и держит её нажатой - у меня был предусмотрен специальный флаг START. При запуске счёта этот флаг устанавливался, а сбрасывался в обработчике прерываний, при условии, что на RB0 появилась лог.1 (т.е. кнопки отпущены). А останов по команде пользователя допускался только при сброшенном флаге START. Но эту часть программы я толком отладить не успел, праздники кончились...
Ладно, наверно будет лучше это на графе изобразить, нагляднее получится. Но это немного позже.

 

Так, всё касаемо ликбеза по С буду выкладывать сюда: http://www.pic16.nm.ru/likbezc/

Схема: http://www.pic16.nm.ru/likbezc/hometimer_schema.gif
Граф в самом общем виде: http://www.pic16.nm.ru/likbezc/hometimer_graf01.gif
Граф для основной программы (main): http://www.pic16.nm.ru/likbezc/hometimer_graf02.gif
Пояснения к нему (лучше смотреть в Word или подобном): http://www.pic16.nm.ru/likbezc/hometimer_graf02_about.rtf
Граф для обработчика прерываний: http://www.pic16.nm.ru/likbezc/hometimer_graf03.gif
Пояснения к нему (лучше смотреть в Word или подобном): http://www.pic16.nm.ru/likbezc/hometimer_graf03_about.rtf

Это всё лишь предлагаемые возможные варианты. Я ни в коей мере не настаиваю на том, что делать следует именно так. Напротив, жду конструктивной критики. Обсудим, посоветуемся...

Могу ещё выложить работающую модель для Протеуса, с бета-версией прошивки. Но выложить могу только без исходника, с hex-прошивкой в демо-варианте, с неточным счётом времени. Исключительно в ознакомительных целях , чтоб все желающие смогли ощутить работу нашего таймера "живьём". Стоит ли это делать? Есть желание попробовать девайс в работе? Или не будем спешить?
А уж нормальную программу на С будем писать вместе, не торопясь, с разъяснениями.

 

picmaniac(30 января, 09:51):
30 января, 11:42 Хочу предложить свой вариант обработки прерывания
В функции вывода значения времени на экран стоит пауза 5мс, а прерывание от таймера генерируется каждые 4мс – это будет работать корректно? Я думал, что общее время обработки прерывания должно быть меньше времени, через которое оно вызывается, или эта цифра взята просто так, с неба - для примера?

 

Сергей К: Предлагаю сделать не "мигание", а понижать яркость.

Еще можно моргать с пониженной яркостью.

 

ПАШИК: picmaniac(30 января, 09:51):
30 января, 11:42 Хочу предложить свой вариант обработки прерывания
В функции вывода значения времени на экран стоит пауза 5мс, а прерывание от таймера генерируется каждые 4мс – это будет работать корректно?

Это не я предлагал. Кому вопрос адресован?