Помогите со стеком 2313

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 3
Зарегистрирован: Пт мар 14, 2014 09:53:34

Сообщение Eugene_Artemyev »

Привет!
Начинаю делать устройства на АVR, не пойму, как правильно обращаться со стеком, после reti оно переходит на строчку, где сработало прерывания и потом идёт по очереди, а не возвращается к месту, в котором было вызвано.
Всё лишнее в программе обрезал, осталось только сама обработка, которая не работает. Я уже не понимаю просто ничего.

.device AT90s2313
.include "2313def.inc"
.def t0=r16
.def t1=r17
.def t2=r18

rjmp l0
rcall i1
nop
l0:

ldi r16,0xfd
out spl,r16

ldi t0,128
out sreg,t0
ldi t0,15
out mcucr,t0
ldi t0,255
out gimsk,t0
ldi t0,8
//////////////////////
c1:
nop
rjmp c1

i1:
reti
nop
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20104
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Eugene_Artemyev писал(а):

Код: Выделить всё

rjmp l0
rcall i1
В обработчике прерывания надо rjmp ставить, а не rcall. Блеать, для кого примеры вектора прерываний в ДШ пишут???
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Вы включаете Int1, а обработчик написали для Int0.

Посмотрите внимательно еще раз на таблицу векторов и на регистр GIMSK.

У Вас два варианта.
1. Либо Вы используете Int0. Тогда Вам надо в GIMSK загрузить 0b01000000 (64 ; 0x40)
2. Либо если Вы используете Int1. Тогда Вам надо добавить операцию reti между rjmp I0 и rcall i1. Кстати Вместо rcall также необходимо написать rjmp. Это еще одна ошибка.

P.S. Почитайте еще раз внимательно про таблицу векторов.
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Gudd-Head писал(а): Блеать, для кого примеры вектора прерываний в ДШ пишут???
:))) Именно так! БЛЕАТЬ! ))))
Реклама
Эиком - электронные компоненты и радиодетали
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

Gudd-Head писал(а):Блеать, для кого примеры вектора прерываний в ДШ пишут???
Такое впечатление, что сейчас новички вообще даташитов не читают.

Автор, посмотрите эту тему. Там я подробно пишу, как нужно оформлять программу.
Откройте даташит на контроллер, скопируйте оттуда в свою программу всю таблицу векторов прерываний, сделайте блок "заглушек" неиспользуемых обработчиков прерываний.
Пользуйтесь командами и Если нужно - и для размещения данных в нужных областях памяти с нужных адресов.
Изучайте инструмент, которым собираетесь работать.
Реклама
Родился
Сообщения: 3
Зарегистрирован: Пт мар 14, 2014 09:53:34

Сообщение Eugene_Artemyev »

Да, спасибо, буду.
Реклама
Ответить

Вернуться в «AVR»