Перейти к содержанию

Atmega16 - Прерывания Int0 (Проблема С Иницализ-Й)


Рекомендуемые сообщения

;Техническое Задание:

;работа с прерываниями - реакция нжатие кнопки

;- - - - - -

;-----дополнительные сведенья----------------

; используем порт D

; -бит 2 уставлены кнопки с выходом на массу (минус)

; используем порт B

; -биты 0->7 установленны светодиоды с ограничивающим резистором на массу (минус)

;===============================================================================

;--базовые настройки-----------------------

.device ATmega16

.include "D:\Projects_ATmega16\Appnotes\m16def.inc"

;--задаем имена регистрам------------------

.def temp = r16 ;рабочая переменная

;----------стек-----------

ldi temp, low(RAMend) ;загрузка укозателя стека

out SPL,temp

ldi temp, high(RAMend) ;загрузка укозателя стека

out SPH,temp

;--прерывания------------------------------

rjmp RESET ;Reset Handle

jmp EXT_INT0 ; IRQ0 Handler

reti; jmp EXT_INT1 ; IRQ1 Handler

reti; jmp TIM2_COMP ; Timer2 Compare Handler

reti; jmp TIM2_OVF ; Timer2 Overflow Handler

reti; jmp TIM1_CAPT ; Timer1 Capture Handler

reti; jmp TIM1_COMPA ; Timer1 CompareA Handler

reti; jmp TIM1_COMPB ; Timer1 CompareB Handler

reti; jmp TIM1_OVF ; Timer1 Overflow Handler

reti; jmp TIM0_OVF ; Timer0 Overflow Handler

reti; jmp SPI_STC ; SPI Transfer Complete Handler

reti; jmp USART_RXC ; USART RX Complete Handler

reti; jmp USART_UDRE ; UDR Empty Handler

reti; jmp USART_TXC ; USART TX Complete Handler

reti; jmp ADC ; ADC Conversion Complete Handler

reti; jmp EE_RDY ; EEPROM Ready Handler

reti; jmp ANA_COMP ; Analog Comparator Handler

reti; jmp TWSI ; Two-wire Serial Interface Handler

reti; jmp EXT_INT2 ; IRQ2 Handler

reti; jmp TIM0_COMP ; Timer0 Compare Handler

reti; jmp SPM_RDY ; Store Program Memory Ready Handler

;===============================

RESET: ;начальная инициализация

;--Настройка портов ввода/вывода------------------------------------------

;порт D считываем нажатия на кнопкпи для этого:

ldi temp,0b00000000 ;

out DDRD,temp ;все ножки порта D на Вход

ldi temp,0b00000000 ; (16я ножка)

out PortD,temp ;подтягивающие резистор на 3ю ножку - это бит 2!

;в порт B записываем сигналы на диоды для этого:

ldi temp,0b11111111 ;порт В все контакты на ВЫход

out DDRB,temp ;(1-8 ножки МК)

;--//Настройка портов ввода/вывода------------------------------------------

;--настройка прерываний------------------------------------

; инициализация внешнего прерывания INT0

LDI temp, (1<<ISC01)|(1<<ISC00)

OUT MCUCR, temp ; по положительному фронту

LDI temp, (1<<INTF1)|(1<<INTF0)

OUT GIFR, temp ; очистка флагов внешних прерываний

LDI temp, 1<<INT0

OUT GICR, temp ; разрешение внешнего прерывания INT0

sei ;разрешаем прерывания

;--//настройка прерываний------------------------------------

;===========================;| MAIN >>> |===========================================

ldi temp,0b00000000 ;очищаем регистр

Metka: ;основной цикл-----------------------------------------------

out PortB,temp ;выводим в порт В

jmp Metka ;--конец основного цикла------------------------------

;==обработка прерываний=================================

EXT_INT0:

ldi temp,0b11111111;

reti

;==//обработка прерываний=================================

;//END.____________________________________________________________/

вот рисунок монтажа в протиус: post-117693-1275241104,6_thumb.jpg

в общем хотел что бы при нажатии на кнопку загарались светодиоды и горели до рестарта МК (ну так что бы уж сильно упростить задачу)

а чаво то не выходить

плиз помогите разобратся с блоком настройка прерываний

можно ли как то иначе его записать без операторов "<<" а то никак вникнуть неможу что да и как там происходит

и как настроить что бы по фронту и спаду были разные прерывания

за ранее спасибо :)

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

>>; инициализация внешнего прерывания INT0

>>LDI temp, (1<<ISC01)|(1<<ISC00)

>>OUT MCUCR, temp ; по положительному фронту

Прежде чем использовать тупо из книжки, инета примеры с операций "<<" определитесь, что и как она делает и вопросы сами отпадут.

ОШИБКА с ней и temp

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

операций "<<" определитесь, что и как она делает

именно за этим я сюда и зашел

http://ico.aha.ru/h/avrasm-rus.htm#Shift%20left

Сдвиг влево

Символ: <<

Описание: Возвращает левое выражение сдвинутое влево на число бит указанное справа

Приоритет: 11

Пример: ldi r17, 1<<bitmask ; В r17 загрузить 1 сдвинутую влево bitmask раз

если это настолько принципиально для вас...

я недоконца понял какое именно значение находится в регистре ISC00 и ISC01

и какое после

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Пример: ldi r17, 1<<bitmask ; В r17 загрузить 1 сдвинутую влево bitmask раз

если это настолько принципиально для вас...

Правильно. Только ключевой вопрос, а что уже находиться в r17, другими словами остальные биты в r17 будут произвольны, а Вы точно определите бит bitmask. И когда Вы после этого перешлете в порт или регистр содержимое r17 у Вас будет не известно что там.

Отсюда вывод:

первая инициализация регистров должна быть

ldi r17, данные

out регистр,r17

что бы удобно менять данные в регистрах пишем

in r17,регистр

ldi r17, наши любимые << :D

out регистр,r17

Изменено пользователем rtfcnf

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно.

Ссылка на комментарий
Поделиться на другие сайты

Правописание правильное, такой вариант установки битов вполне работоспособен. Что находится в r17 "решает" компилятор.

А вот где обещанный подтягивающий резистор к коде ниже? Вопрос!

ldi temp,0b00000000 ; (16я ножка)

out PortD,temp ;подтягивающие резистор на 3ю ножку - это бит 2!

Надо бы так.

ldi temp,0b00000100 ; (16я ножка)

out PortD,temp ;подтягивающие резистор на 3ю ножку - это бит 2!

Такой код работает.

Ссылка на комментарий
Поделиться на другие сайты

с подтягивающим резистором тоже не работает та и потом, я на схеме его килоомным продублировал :umnik2:

регистры вроде устанавливаются на прерывание

вроде потому что:

1)когда считываю регистры SREG, GICR, MCUCR, GIFR

вот таким образом ldi temp,SREG...

что с "настройка прерываний" что без, значения в регистрах не меняются (причем не те шо надо)

2)когда считываю вот таким способом in r16,MCUCR ...

то значения поподают в регистр имено какие ожидались по настройки прерывания

но прерывание не работает :blink:

пожалуйста напишите какой должен быть правильный код? :ph34r:

Ссылка на комментарий
Поделиться на другие сайты

:dance2: я таки нашел ошибку

rjmp RESET ;Reset Handle

jmp EXT_INT0 ; IRQ0 Handler

просто про прерывания изночально читал из книги где используют AT90S2313

а у меня ATmega16 вот и случайно прописал rjmp вместо jmp, а оно и отправляло на $006 а не на $004

ну и еще стек надо ставить после вектора прерываний а у меня до

и все работаеть

всем большое спасибо! :drinks: )

вот исходник

;===============================================================================

;--базовые настройки-----------------------

.device ATmega16

.include "D:\Projects_ATmega16\Appnotes\m16def.inc"

;--//базовые настройки-----------------------

;--задаем имена регистрам------------------

.def temp = r16 ;рабочая переменная

;--//задаем имена регистрам------------------

;--прерывания------------------------------

jmp RESET ;Reset Handle {Сброс Ручки}

jmp EXT_INT0 ; IRQ0 Handler

reti; jmp EXT_INT1 ; IRQ1 Handler

reti; jmp TIM2_COMP ; Timer2 Compare Handler

reti; jmp TIM2_OVF ; Timer2 Overflow Handler

reti; jmp TIM1_CAPT ; Timer1 Capture Handler

reti; jmp TIM1_COMPA ; Timer1 CompareA Handler

reti; jmp TIM1_COMPB ; Timer1 CompareB Handler

reti; jmp TIM1_OVF ; Timer1 Overflow Handler

reti; jmp TIM0_OVF ; Timer0 Overflow Handler

reti; jmp SPI_STC ; SPI Transfer Complete Handler

reti; jmp USART_RXC ; USART RX Complete Handler

reti; jmp USART_UDRE ; UDR Empty Handler

reti; jmp USART_TXC ; USART TX Complete Handler

reti; jmp ADC ; ADC Conversion Complete Handler

reti; jmp EE_RDY ; EEPROM Ready Handler

reti; jmp ANA_COMP ; Analog Comparator Handler

reti; jmp TWSI ; Two-wire Serial Interface Handler

reti; jmp EXT_INT2 ; IRQ2 Handler

reti; jmp TIM0_COMP ; Timer0 Compare Handler

reti; jmp SPM_RDY ; Store Program Memory Ready Handler

;----------стек-----------

ldi temp, low(RAMend) ;загрузка укозателя стека

out SPL,temp

ldi temp, high(RAMend) ;загрузка укозателя стека

out SPH,temp

;---------/стек-----------

RESET:;начальная инициализация

;--Настройка портов ввода/вывода------------------------------------------

;порт D считываем нажатия на кнопкпи для этого:

ldi temp,0b00000000 ;

out DDRD,temp ;все ножки порта D на Вход

ldi temp,0b00000100 ; (16я ножка)

out PortD,temp ;подтягивающие резистор на 3ю ножку - это бит 2!

;в порт B записываем сигналы на диоды для этого:

ldi temp,0b11111111 ;порт В все контакты на ВЫход

out DDRB,temp ;(1-8 ножки МК)

;--//Настройка портов ввода/вывода------------------------------------------

;--настройка прерываний------------------------------------

; инициализация внешнего прерывания INT0

LDI temp, (1<<ISC01)|(1<<ISC00) ;работает и через in тоже

OUT MCUCR, temp ; по положительному фронту (на схеме включает когда на ножке сигнал проходит 0->1)

;

LDI r17, (1<<INTF1)|(1<<INTF0)

OUT GIFR, temp ; очистка флагов внешних прерываний

;

LDI temp, 1<<INT0

OUT GICR, temp ; разрешение внешнего прерывания INT0

;

sei ;разрешаем прерывания;CLI ;запретить

;--//настройка прерываний------------------------------------

;===========================;+--------------+

;===========================;| MAIN >>> |===========================================

;===========================;+--------------+

ldi temp,0b00000000 ;очищаем регистр

Metka: ;основной цикл-----------------------------------------------

out PortB,temp ;выводим в порт В

jmp Metka ;--конец основного цикла------------------------------

;==обработка прерываний=================================

EXT_INT0:

ldi temp,0b01010101;

reti

;==//обработка прерываний=================================

;//END.__________________________________________________________/

вот скрины протеуса: post-117693-1275286457,1_thumb.jpg post-117693-1275286481,04_thumb.jpg post-117693-1275286502,76_thumb.jpg

Ссылка на комментарий
Поделиться на другие сайты

На самом деле дело не в JMP и RJMP (они отличаются способом получения адреса перехода для счетчика команд). Дело в том, что для МЕГ 8 и 8515 адрес табицы векторов прерываний начинается с $0001, а для остальных (в том числе и для Меги16) c $0002. Это надо (лучше) учитывать самому при написании программы.

Ссылка на комментарий
Поделиться на другие сайты

  • 3 месяца спустя...

А ведь проблема была не в этом:

:dance2: я таки нашел ошибку

rjmp RESET ;Reset Handle

jmp EXT_INT0 ; IRQ0 Handler

А в таблице прерываний!!!

Сначала нужно писать таблицу прерываний, а уж потом - инициализировать стек!

УПС! Ссори, не досмотрел - ты это уже понял(

Изменено пользователем mxmedia
Ссылка на комментарий
Поделиться на другие сайты

  • 4 месяца спустя...

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...