хотелось бы выразить благодарность Kotjara за подробное описание мигалки незаменимый материал для новичков хотелось бы увидеть подобные вещи про АЦП ПРЕРВАНИЯ ЖК дисплеи
Группа: Cоучастник
Сообщений: 905
Пользователь №: 8980
Регистрация: 11-June 06
Место жительства: Москва
pauk > хотелось бы увидеть подобные вещи про АЦП ПРЕРВАНИЯ ЖК дисплеи
Смотрите, а лучше делайте:
Прерывания подробно с примерами. avr123.nm.ru/03.htm
АЦП - упражнение 11 avr123.nm.ru/z11.htm
ЖК дисплеи http://avr123.nm.ru/01.htm внизу - в обзоре сагазинов: Sparkfun далее "Color LCD 128x128 Nokia Knock-Off" там исходники и примеры применения.
Пару слов, что такое прерывание. Прерывание - это событие, которое приостанавливает выполнение основной программы, вызывая необходимую подпрограмму. После обработки подпрограммы происходит возврат к выполнению основной программы.
1). Файл -> Новый. 2). Reset -> начало программы. SP - инициализируем стек. EXT_INT - настройка внешнего прерывания(при каких условиях оно будет происходить). У нас оно будет происходить при низком уровне на ноге PD2 (для ATMega8 - 4 вывод). 1->DDRC настраиваем порт на выход. 1->I глобальное разрешение прерываний. 3). Элементы -> Прерывания -> Extern_0 Это мы создали метку с которой программа начнёт работать при осуществлении внешнего прерывания. В нашей подпрограмме просто будет меняться уровень на ноге(при нажатии на кнопку).
Думаю все было понятно. Подобным образом можно настроить обработку любого прерывания.
Далі буде...
Это сообщение отредактировал avr123 - Mar 9 2009, 12:18 PM
Присоединённое изображение (Нажмите для увеличения)
в сторчке(PORTC=0)ошибка? наверно надо так (PORTD=0)или я чё не так понял? и почему порт D на вход не прогромирован?
1->DDRC это настроили порт РС.0 на выход(наверное понятнее было бы так: #00000001->DDRC). Если 0->DDRC то все порты С входы. Если так #00000110->PORTC , то PORTC.1 и PORTC.2 выходы, а остальные входы.
PORTC.0=0 это мы проверяем какой уровень мы поставили на порт, т.е. при каждой обработке прерывания будем инвертировать уровень на ноге.
1->PORTC.0 так на выходе устанавливаем логическую единицу, 0->PORTC.0 а так логический ноль.
PIND.2=0 проверяем какое состояние на ноге(это сравнение я поставил для лучей наглядности в Протеусе, иначе при удержании кнопки светодиод постоянно мигает). Регистр PIN показывет какой в даный момент уровень на ноге, 1 или 0. И доступен только для чтения.
Подобные операции можно проводить с каждым портом.
а что вообще означает метка Extern_0 почему допустим не Extern_1 ???
где можно скачать и сколько мегабайт весит протеус ?
Extern_0 это метка с которой будет выполняться программа при внешнем прерывании, у Mega8 это нога 4(PD2). Если Extern_1 то отсюда будет обрабатываться внешнее прерывание с ноги 5(PD3). А с такой Timer_0_Overflow обрабатывается прерывание от переполнения таймера Т0. Предварительно каждое прерывание необходимо настроить. Что означают остальные метки нетрудно догадаться посмотря Даташит.
ВСЕМ ПРИВЕТ просимулировал программу (прерывание) которую написал Kotjara в симуляторе АВ и возник вопрос : почему подпрограмма прерывания вызывается 2 раза , первый раз подпрограмма прерывания вызывается когда порт д2 =0 , а второй раз когда порт д2=1 она снова вызывается проходит всю подпрограмму прерывания толька ( ведь такого не должно быть вроде?) после этого начинает работать оснавная программа до следующего нажатия кнопки.
собрал плату проверил у меня прога работает совсем не так как показывает симулято в чём дело? если верить симулятору светодиод должен гореть когда кнопа нажата , а когда отпущена тухнуть однако практика показала что при нажатии на кнопу св-диод загорается , а тухнет от следующего нажатия кнопы и вообще прога работает очень не стабильно то вкл то не выключится то мигнёт 2 раза ( наверное не учтён дребезг контактов?) ПОДСКАЖИТЕ В ЧЁМ ТУТ КОСЯК???
ВСЕМ ПРИВЕТ просимулировал программу (прерывание) которую написал Kotjara в симуляторе АВ и возник вопрос : почему подпрограмма прерывания вызывается 2 раза , первый раз подпрограмма прерывания вызывается когда порт д2 =0 , а второй раз когда порт д2=1 она снова вызывается проходит всю подпрограмму прерывания толька ( ведь такого не должно быть вроде?) после этого начинает работать оснавная программа до следующего нажатия кнопки.
собрал плату проверил у меня прога работает совсем не так как показывает симулято в чём дело? если верить симулятору светодиод должен гореть когда кнопа нажата , а когда отпущена тухнуть однако практика показала что при нажатии на кнопу св-диод загорается , а тухнет от следующего нажатия кнопы и вообще прога работает очень не стабильно то вкл то не выключится то мигнёт 2 раза ( наверное не учтён дребезг контактов?) ПОДСКАЖИТЕ В ЧЁМ ТУТ КОСЯК???
В моем примере прерывание происходит при низком уровне на PD2. Если симулируешь в AB то предварительно нужно выставить на PD2 единицу, а при сбросе в ноль будет происходить прерывание. Настроить прерывание можно: - на низкий уровень - на высокий уровень - на переход с низкого уровня на высокий - на переход с высокого уровня на низкий Кликаешь два раза на блок EXT INT и настраиваешь прерывание.
То что светодиод загорается при первом нажатии, а при следующем тухнет, то так и задумывалось Дребезг контактов и вправду не учитывался, не думал что будешь повторять схему, но это очень даже правильно - быстрее освоишь Можешь в качестве Д.З. зделать учет дребезга
P.S. Насчет макроса. Не знаю как обьяснить по научному. Но простыми словами это своего рода небольшая подпрограммка, например какой-то простой операции.
Да, на высокий уровень прерывания нет - опечатался , нужно было сразу даташит глянуть. Но если очень нужно, то можно поставить инвертор на какой-нибудь логике
всем привет я опять про программу которую написал КОТЯРА (прерывания) вы так толком мне и не ответили почему же симулятор вызывает подпрограмму прерывания два раза? посидев есчо пару часов за компом пришёл к выводу что виноват флаг INTF0 хотя он выключен и неиспользуется , снимал галку даже с регистра GIFR который вроде отвечает за эти самые флаги но всеровно флаг в симуляторе включается , И ТАК ВОЗНИК ТАКОЙ ВОПРОС
что это такое ? специально задуманая вещь Громовым тоесь его надо снимать каждый раз самостоятельно когда симулируешь? или это всего лишь глюк программы? я использую 81 версию проги(АВ)
переделал прогу которую написал КОТЯРА о прерываниях теперь работает всё отлично в проге устранил дребезг контактов и сделал необходимые операции со стеком
переделал прогу которую написал КОТЯРА о прерываниях теперь работает всё отлично в проге устранил дребезг контактов и сделал необходимые операции со стеком
забыл файл
Присоединённое изображение (Нажмите для увеличения)