| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > [avr] мигание светодиодом прерываниями и таймером |
| Автор: KindEvil 16.11.2010, 20:03 |
| Привет всем, я пока что полный ноль в ассеблере и программировании каких бы то ни было микропроцессоров и avr в частности , но хочется разобраться с этой задачей) Используя систему прерываний и таймер реализовать следующую последовательность включения светодиода (atmega8): 1сек - ON 1сек - OFF 2сек - ON 1сек - OFF 1сек - ON 2сек - OFF 1сек - ON 1сек - OFF 2сек - ON 1сек - OFF 1сек - ON 2сек - OFF . . . Светодиод подключен к выходу параллельного порта PB1 и к земле, через токоограничивающий резистор 200 Ом. Основной цикл программы должен быть пустым. Приветствуется код с комментариями, иначе утону. Спасибо. |
| Автор: UniBomb 17.11.2010, 10:56 |
| KindEvil, рассказывай что делал, что не получилось. |
| Автор: KindEvil 17.11.2010, 11:14 | ||
По-чесноку, я читал о механизмах прерываний от таймеров и до сих пор не понял, как оформить и по какому признаку (в смысле по совпадению, переполнению или захвату). Вообщем каша, нет понимая реализации прерывания. Алгоритм представляю следующий: на PB1 подать сигнал с задердкой на 1сек; потом вот это самое прерывание от таймера; затем опять сигнал на PB1 с задержкой на 2 сек.; и аналогичные действия для 1off, 1on, 2off и все это в цикле. предполагаю, что возможно упростить цикл через инкремент и декремент. стек необходим здесь? без него никуда, как я понял) и еще вопрос, что дает информация о сопротвлении резистора для кода? |
| Автор: UniBomb 17.11.2010, 11:40 | ||||
По захвату отпадает, т.к. (если я правильно понял) для этого нужен внешний источник. Остаётся переполнение или совпадение. Выбор зависит от того, какой способ даст более точный квант времени. Итак, смотрим задачу и видим, что весь цикл моргания у нас занимает 8 секунд. Значит всё это можно было бы оформить в следующем виде:
Нет, цикл тут не нужен, т.к. всё это делается в прерывании, которое срабатывает само через равные промежутки времени. Нужно кстати ещё знать частоту, на которой работает мк. Ну а в общем виде программа могла бы выгядеть следущим образом:
Но есть одно но - само задание ущербно. В обработчике прерывания нужно выполнять минимальное количество действий. В лучшем случае в прерывании надо установить какой-нибудь программный флаг, а в главном цикле программы его проверять и по выставлению уже производить какие-либо действия. Как видишь нет. Абсолютно ничего. Резистор нужен для того, что бы не сгорел светодиод. Да и к тому же маловат он в этой схеме. Сейчас через диод течёт 25 мА, а надо где-то 10-15. |
| Автор: Mazzi 17.11.2010, 14:51 | ||
Я бы несколько дополнил программу, чтобы она работала в реальном времени
|
| Автор: UniBomb 17.11.2010, 15:55 |
| Mazzi, тут я немного не согласен |
| Автор: KindEvil 17.11.2010, 19:29 |
| Mazzi, UniBomb, спасибо вам! Но, как бы этот код выглядел в ассемблере для atmega8? |
| Автор: UniBomb 18.11.2010, 09:30 |
| KindEvil, а вот теперь давай немного сам А для ленивых студентов, которые сами не хотят ничего делать существует http://forum.vingrad.ru/forum/Vingrad-help-center.html. Но ты ведь не такой |
| Автор: KindEvil 18.11.2010, 21:24 |
| UniBomb, спасибо. Будем разбираться) |