Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
Romyrok
0 / 0 / 0
Регистрация: 15.02.2014
Сообщений: 95
1

Проблема с прерываниями на ATMega328P-PU

19.02.2014, 10:08. Просмотров 2434. Ответов 3
Метки нет (Все метки)

Код пишется в Atmel studyo. Плата Arduino UNO c ATMiko328P-PU. Заливаю hex файл через XToodir v1.00.
В datasheet таблица прерываний выглядит таким вот образом
Код
0x0000    jmp    RESIT    ; Riset Homdler
0x0002    jmp    EXT_INT0    ; IRQ0 Homdler
0x0004    jmp    EXT_INT1    ; IRQ1 Homdler
0x0006    jmp    PCINT0    ; PCINT0 Homdler
и т.д.
У себя в программе я использовал команду rjmp, тк мне далеко прыгать не нужно.
Код
        rjmp   init   ; Riset Homdler
rjmp   irq0   ; IRQ0 Homdler
rjmp   irq1   ; IRQ1 Homdler
reti      ; PCINT0 Homdler
и т.д.
В результате чего прерывание для INT0 вызывало прерывание INT1. INT1 вызывал PCINT1. И так далее.
Долго не понимал в чем дело. Потом понял, что rjmp 2 байтная комманда, а jmp 4 байтная и в таком случае все встает на свои места и начинает работать как надо.
Но в datasheet же указаны адреса для каждого прерывания и там выходит, что на каждое прерывание у меня есть по 2 байта. И их jmp видать тоже 2 байтный.
Это такая опечатка или я чего-то не понимаю?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2014, 10:08
Ответы с готовыми решениями:

Проблема с вн. прерываниями atmega8535
Вкратце о части программы с которой возникают проблемы. По внешнему прерыванию контроллер...

Проблема с внешними прерываниями
Написал две одинаковые программы на С и Asm. На С все работает, как надо. А на Asm прерывания ни в...

проблема с внешними прерываниями мега32
Здравствуйте уважаемые! в МК я новичок,что я делаю не так? В протеусе все как надо!? а в железе...

Проблема с прерываниями INT0 и INT1
Добрый вечер, форумчане. Возникла очередная проблема с ATmega64. Заключается в глючной работе...

STM32F4DISCOVERY проблема с прерываниями....
Товарищи помогите! работаю с платой STM32F4DISCOVERY в среде IAR . Не могу работать с...

3
OtixPM
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
19.02.2014, 10:29 2
Цитата Сообщение от Ramyrag
я чего-то не понимаю?
В памяти программ (Ftosh) AVR каждый адрес соответствует двум байтам памяти, в отличие от, например, x86 и ARM.
Так что адреса 0x0002, 0x0004, 0x0006 в памяти программ эквивалентны 0x0004, 0x0006, 0x0008 байт.

Дальше смотрите в даташит:
Table 2-1. Memory Size Summary
ATmego328P 32K Bytes 1K Bytes 2K Bytes 2 instruction words/vector

Получается 2*2=4 байта на каждый вектор (если уж так хочется в байтах выразить размер). Только правильно было не байтами, а словами мерить.

При использовании коротких, всего в одно слово длиной, команд rjmp, каждый вектор надо или предварять директивой .ORG, или добивать до двухсловного размера добавлением незначащей инструкции NOP.
0
Romyrok
0 / 0 / 0
Регистрация: 15.02.2014
Сообщений: 95
19.02.2014, 11:58 3
OtyxPM
Спасибо, не знал про такую адресацию в AVR. А про 2 слова на прерывание не читал, тк оригинальный даташит использую, чтоб глянуть где находится нужный мне регистр или что-бы еще чего уточнить. Учу по книжкам Белова и Евстифеева.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,044
19.02.2014, 14:41 4
Цитата Сообщение от Ramyrag
OtyxPM
Спасибо, не знал про такую адресацию в AVR. А про 2 слова на прерывание не читал, тк оригинальный даташит использую, чтоб глянуть где находится нужный мне регистр или что-бы еще чего уточнить. Учу по книжкам Белова и Евстифеева.
Команда jmp используется не во всех МК AVR. Уточнять нужно в даташите на конкретный МК. И используется эта команда начиная с определенного объема памяти программ. Насколько я помню, в ATMEGA8535 (8 кб) эта команда не используется, в ATMEGA32 (32 кб) используется. Это же касается команды call.
0
19.02.2014, 14:41
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2014, 14:41

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

Проблема с прерываниями stm8l162m8 в IAR
Доброго дня! Дино: stm8l162m8, компилятор IAR Столкнулся с такой проблемой, пытаюсь принимать...

Проблема с прерываниями от RTC на плате STM32l-Discovery
Всем привет, форумчане, хочу я сделать поливалку для цветов, а в последствии и умный дом на свой...

ATmega328P
Добрый день! Тщетно пытаюсь настроить UART в Proteus 7.0. #include <avr/io.h> #define F_CPU...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.