Таймер для водяного насоса на ATMEGA8

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 4
Зарегистрирован: Ср дек 19, 2012 14:22:24
Откуда: Барнаул

Сообщение Andrey 100 »

Добрый день! Для водяного насоса пытаюсь разработать таймер,на Atmega8, нужны 2 режима-циклический(нажали кнопку- 2минуты включен, 5минут выключен и так в цикле,выход из цикла-кнопкой или reset), ручной( нажали кнопку-мотор включился ,отключение-кнопкой или reset) , в баллоне хотел бы поставить датчик,если контакты замкнулись,чтобы отключался в циклическом режиме.Включаем питание, пока кнопки не нажаты ,ничего не происходит. Есть исходник под Codevision, там микроконтроллёр работает в циклическом режиме, нужно добавить управление кнопками и датчик.
Вложения
main__.c
(2.87 КБ) 442 скачивания
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

нужно добавить управление кнопками и датчик
А в чём, собснно, проблема ? Пример обработки кнопок. Датчик можно так-же обрабатывать, как и кнопку.
Обработчик от таймера сделайте не 1 сек, а меньше, туда и запихнёте обработку кнопок.

PS:Небольшое замечание по программе. С переменными счётчиков нельзя так манипулировать, доступ к ним должен быть атомарным, иначе - глюк обеспечен.
Реклама
Родился
Сообщения: 4
Зарегистрирован: Ср дек 19, 2012 14:22:24
Откуда: Барнаул

Сообщение Andrey 100 »

Аlex писал(а): С переменными счётчиков нельзя так манипулировать, доступ к ним должен быть атомарным, иначе - глюк обеспечен.
Что нужно изменить в программе для атомарного доступа?
Аlex писал(а):Обработчик от таймера сделайте не 1 сек, а меньше, туда и запихнёте обработку кнопок.
Как можно так сделать?
Друг Кота
Аватара пользователя
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

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

Andrey 100 писал(а):Что нужно изменить в программе для атомарного доступа?
Перед изменением переменной, которая участвует в прерывании, глобально запрещать прерывания.

Код: Выделить всё

#asm("cli") // запрещаем все прерывания прежде чем менять переменную...
load1_on_time = LOAD1_ON_TIME; // задаём время включения
#asm("sei") // разрешаем прерывания
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 4
Зарегистрирован: Ср дек 19, 2012 14:22:24
Откуда: Барнаул

Сообщение Andrey 100 »

Спасибо, Барсик, как мне совместить 2 режима, циклический и ручной режим( ручной в смысле просто включить нагрузку) , изменять статус, вначале статус выключено- нажали кнопку статус включен или статус авто. Можно ли использовать ещё 1 таймер для опроса кнопок?
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Можно ли использовать ещё 1 таймер для опроса кнопок?
Зачем ? У Вас уже есть периодичные прерывания. Настройте их, например, на 1 мс. , подобрав частоту тактирования и значение компаратора, и добавьте в обработчик пару счётчиков - для формирования 1 секунды и периода для кнопок.
Вы по моей ссылке проходили ? Там в примере реализован период в 1 мс. Только принцип другой - по переполнению таймера, а у Вас - по совпадению компаратора.
Реклама
Родился
Сообщения: 4
Зарегистрирован: Ср дек 19, 2012 14:22:24
Откуда: Барнаул

Сообщение Andrey 100 »

Аlex писал(а):Вы по моей ссылке проходили ? Там в примере реализован период в 1 мс. Только принцип другой - по переполнению таймера, а у Вас - по совпадению компаратора.
Да проходил, спасибо, Alex!
Ответить

Вернуться в «AVR»