Техника
как можно "создать" прерывание для микроконтроллера..
Хочу спаять часы. Всё уже спланировал. Думал что всё просто. Уже и код в голове был. Но тут вдруг вспомнил что часы ещё нужно настраивать. Что нужно создать кнопку (точнее 2). При нажатии на первую должно увеличиваться время на 1 час при нажатии на вторую-на 1 минуту. Для правильной реакции на нажатие кнопки без прерывания не обойтись. Ведб для работы часов в основном цикле будет задержка на 1 минуту потом будет прибавляться счётчик минут и т.д. до бесконечности. Не получится просто написать в цикле "если нажата клавиша то...." . Нужно как-то организовать прерывание. Прочитал что есть прерывание которое вызывается при сигнале на любом порте ввода. (кажется PIN_CANGLE). Но мне нужно чтоб при появлении сигнала на порте ввода 1 вызывалось прерывание 1 а при появлении сигнала на порте 2 вызывалось прерывание 2. Вообщем разъясните мне пожалуйста всё поподробнее. Заранее благодарен.Новичок.если это важно то микроконтроллер AVR ATMega 16. Пишу только на С поэтому если будите приводить примеры то лучше на С. Спасибо.
Степан, ваш алгоритм часов несколько неверен.
Действительно, для опроса кнопок можно обойтись без прерываний.
А вот для отсчета времени прерывания необходимы, правда, внутренние.
А точнее прерывания от таймеров. При этом никаких задержек быть не должно.
Старайтесь не использовать задержки, особенно в прерываниях.
Реализовать алгоритм можно различными способами с использованием
любого таймера, но с 16-и разрядными (Т1,Т3) будет несколько проще.
Для примера- один из вариантов:
Допустим, имеется внешний резонатор 4 МГц
Инициализируем таймер Т1 с предделителем, например 256 в режиме СТС (сброс при совпадении)
При этом частота счета таймера окажется равной 15625Гц (4Мгц/256)
Если теперь в регистры совпадения записать число 15625, то каждую секунду будет происходить прерывание по совпадению таймера.
Вектор этого прерывания должен указывать на процедуру прерывания в котором и происходит приращение времени. В основном же цикле можно опрашивать кнопки, надо же чем-то его занять, в свободное от прерываний время: )
Это несколько упрощенный пример.
На практике часто, на одно прерывание «вешают» несколько задач, создавая таким образом некую многозадачность.
Например, применительно к выше примеру инициализируем таймер с предделителем 64 (значения для примера)
При этом частота тактирования таймера окажется 62500Гц. Запишем в регистры совпадения число 1250. При этом частота прерывания по совпадению составит 50Гц. Теперь процедуру опроса кнопок можно записать в прерывании по совпадению, при этом автоматически решится вопрос с дребезгом кнопок (~20mc).
А как же приращение времени? Оно некуда не делось. После опроса кнопок сразу переходим на процедуру приращения времени. Но здесь два пути, либо производить приращение времени по 20mc, либо завести переменную с приращением на каждом прерывании на 1 и ее сравнении. При равенстве переменной 50, увеличить счетчик времени на 1 секунду.
Аналогично, можно добавить динамическую индикацию, соответствующим образом распределив кванты времени.
Действительно, для опроса кнопок можно обойтись без прерываний.
А вот для отсчета времени прерывания необходимы, правда, внутренние.
А точнее прерывания от таймеров. При этом никаких задержек быть не должно.
Старайтесь не использовать задержки, особенно в прерываниях.
Реализовать алгоритм можно различными способами с использованием
любого таймера, но с 16-и разрядными (Т1,Т3) будет несколько проще.
Для примера- один из вариантов:
Допустим, имеется внешний резонатор 4 МГц
Инициализируем таймер Т1 с предделителем, например 256 в режиме СТС (сброс при совпадении)
При этом частота счета таймера окажется равной 15625Гц (4Мгц/256)
Если теперь в регистры совпадения записать число 15625, то каждую секунду будет происходить прерывание по совпадению таймера.
Вектор этого прерывания должен указывать на процедуру прерывания в котором и происходит приращение времени. В основном же цикле можно опрашивать кнопки, надо же чем-то его занять, в свободное от прерываний время: )
Это несколько упрощенный пример.
На практике часто, на одно прерывание «вешают» несколько задач, создавая таким образом некую многозадачность.
Например, применительно к выше примеру инициализируем таймер с предделителем 64 (значения для примера)
При этом частота тактирования таймера окажется 62500Гц. Запишем в регистры совпадения число 1250. При этом частота прерывания по совпадению составит 50Гц. Теперь процедуру опроса кнопок можно записать в прерывании по совпадению, при этом автоматически решится вопрос с дребезгом кнопок (~20mc).
А как же приращение времени? Оно некуда не делось. После опроса кнопок сразу переходим на процедуру приращения времени. Но здесь два пути, либо производить приращение времени по 20mc, либо завести переменную с приращением на каждом прерывании на 1 и ее сравнении. При равенстве переменной 50, увеличить счетчик времени на 1 секунду.
Аналогично, можно добавить динамическую индикацию, соответствующим образом распределив кванты времени.
"Для правильной реакции на нажатие кнопки без прерывания не обойтись"
Обойтись.
Вполне можно сделать опросом. Хотя с прерываниями можно конечно энергию сэкономить.
Прерываний "pin change" о которых Вы упоминаете в атмеге16 нет, это в более новых есть. А в атмеге16 есть 2 штуки - INT0, INT1, чего для двух кнопок вполне хватит.
Обойтись.
Вполне можно сделать опросом. Хотя с прерываниями можно конечно энергию сэкономить.
Прерываний "pin change" о которых Вы упоминаете в атмеге16 нет, это в более новых есть. А в атмеге16 есть 2 штуки - INT0, INT1, чего для двух кнопок вполне хватит.
In Datasheete все написано даж на русском яз.
А прерывание можно сделать и програмным с опросом порта....
А прерывание можно сделать и програмным с опросом порта....
вообще достаточно 1й ножки внешнего прерывания, для обработки по прогреванию хоть клавиатурной матрицы, другой вопрос, что кроме этого пина другие понадобятся, но во времени выполнения выигрываем. А вообще тут уже достаточно рассказали, учитесь батенька: ) там всё не атк уж и страшно, и не стесняемся читать даташит, и ничего что на английском, гугл переводчик вам в помощь, если так не понятно: ) Кстати переводчиком тока 1ю неделю изучения пользоваться будете, потом вс понятно станет:)
Похожие вопросы
- Что такое прерывание ( применительно для процессора, микроконтроллера) популярным языком? Как его применять?
- Как работают микроконтроллеры?
- Микроконтроллер и Микропроцессор это практически одно и тоже? Можноли Микроконтроллер назвать миниаютным процессором?
- Как делаются схемы на микроконтроллерах?
- Выберите, при каком типе прерываний число различных прерываний может быть больше?
- Помогите с выбором микроконтроллера!
- Можно ли запрограммировать микроконтроллер ATtiny2313A-PU(DIP), программой, разработанной для ATtiny2313-20PU(DIP)?
- Отличие микропроцессоров от микроконтроллеров.
- Микроконтроллеры
- Программирование микроконтроллеров.