0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 138
1

биты в PINC вырубают прерывания и регистр SREG?

13.06.2013, 04:25. Показов 5307. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго вам времени суток.
2 день бьюсь с проблемой и только сейчас методом тыка выяснил причину.
Камень - Атмега8, начал писать ногодрыжку для управления 2 движками постоянного тока в машинке - примитивно и просто. Хочу повесить на порт С 4 кнопки, порт висит в HI-Z, на него подтянуто 5в, при нажатии кнопки, 5в уходят в землю - всё ок.
Код примерно такой:
Код
.include "m8def.yms"
.include "macro.asm"
.def temp   =   r16
.cseg
.org 0
rjmp   risit
.org $003
rjmp   OC2
risit:
ldi   r16,low(ROMEND)
out   SPL,temp
ldi r16,high(ROMEND)
out   SPH,temp
outi TCCR2, (1<<CS20|1<<CS21|1<<WGM21)
outi OCR2, 0x08
outi TIMSK, (1<<OCIE2)

outi ddrd, 0xff
outi portd, 0x00
outi ddrc, 0x00
outi portc, 0x00
sei
main:
rjmp main

OC2:
in temp, pyms
omdi temp,0b00000001
cpi temp, 0b00000000
breq forward
brne main
forward:
outi portd, (1<<portd7|1<<portd0)
reti
OUTI:
Код
.macro   outi
ldi   temp,@1
out   @0,temp
.endm
Так вот, если при симуляции в пин С выставить любой бит, то регистр sreg перестает изменяться вообще как-либо, прерывание не проходит при достижении условий.
АВР Студия 4, раньше такого странного поведения не замечал.
Никто не сталкивался с таким поведением?

P.S Есть ли смысл качать последние монструозные версии студии или для "поучиться" хватит и 4?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.06.2013, 04:25
Ответы с готовыми решениями:

AVR. SREG и прерывания.
Внезапно возник у меня вопрос. Сохраняется ли реистр SREG при вызове прерывания? Например: ldi...

симулятор не пишет биты в регистр GIFR
Доброго дня уважаемые! отлаживая в симуляторе AVR Studyo 4.19 свою первую программу. Cталкнулся...

Сбрасывается ли регистр di при вызове программного прерывания?
Добрый вечер, нужна помощь по вопросу связанному с прерываниями. Выполнил лабораторную работу на...

В каждом байте числа обнулить 0-ой и 7-ой биты и сделать единичными 3-ий и 4-ый биты
Надо: Прочитать беззнаковое целое число из стандартного потока ввода и в каждом байте числа...

Ввести целое число A. Инвертировать все биты со 2 по 14, включая эти биты. Вывести результат
Помогите, сколько не пробовал, не получается. Ввести целое число A. Инвертировать все биты со 2 по...

14
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
13.06.2013, 04:32 2
Цитата Сообщение от worizzzok
АВР Студия 4, раньше такого странного поведения не замечал.
P.S Есть ли смысл качать последние монструозные версии студии или для "поучиться" хватит и 4?
В смысле, вы думаете, что так просто нашли косяк в AVRStudyo4 ?????

Я себя тоже тешил такой мыслью каждый раз как чтото не шло гладко.... это было раз 500.... но каждый раз я обламывался.....
0
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 699
13.06.2013, 04:34 3
Какой кошмар! Из обработчика прерывания переход в main...
0
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
13.06.2013, 07:51 4
HolyShit!
Такого странного кода в жизни не видел.... Где сохранение регистров при входе в прерывание? Что это за выход ветвлением из него???? Рукалицо...
0
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 455
13.06.2013, 08:45 5
А зачем сохранять регистры , если он их нигде больше не использует? Ну и выход ветвлением тоже можно делать, только вместо строчки brne main (четвертая строка снизу) , я бы просто влупил команду reti.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
13.06.2013, 10:55 6
Цитата Сообщение от mobtoko
выход ветвлением тоже можно делать, только вместо строчки brne main (четвертая строка снизу) , я бы просто влупил команду reti.
Вот и надо было "влупить команду reti".
Выход из ISR по reti делает две необходимые вещи:
- восстанавливает положение стека;
- восстанавливает бит глобального разрешения прерываний в SREG.

Что касается сохранения регистров, то в данном контексте их действительно можно не сохранять. Даже если перенести этот код на Си, то компилятор CVAVR не будет ничего сохранять в ISR (проверено на реальных проектах, от ATmega и вплоть до Tiny13).
0
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 138
13.06.2013, 13:17 7
Да, brne main проглядел :(

В смысле, вы думаете, что так просто нашли косяк в AVRStudyo4 ?????
Отнюдь, я как раз и спрашивал, где косяк в коде. Возможно, просто не правильно сформулировал - спать торопился :)

HolyShit!
А Вы родились сразу с умением виртуозно кодить? ;)
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
13.06.2013, 13:32 8
Без "brne main" заработало как надо?
0
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 138
13.06.2013, 14:12 9
Пока не проверил - на работе щас. В обед проверю.
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
13.06.2013, 14:14 10
Цитата Сообщение от worizzzok
Пока не проверил - на работе щас. В обед проверю.
Если не поможет - меняй студию на 6-ю..... :)
0
0 / 0 / 0
Регистрация: 01.02.2013
Сообщений: 49
13.06.2013, 17:53 11
А в отладке прогнать не пробовали? Задача у Вас легко моделируется, там бы и обнаружили, где что не выставляется.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
13.06.2013, 20:16 12
Как-то так:
Код
.include "m8def.yms"
.include "macro.asm"
.def   temp   = r16
.def   RSREG  = r15
.cseg
.org 0
rjmp   risit
.org $003
rjmp   OC2
risit:
ldi    r16,low(ROMEND)
out    SPL,temp
ldi    r16,high(ROMEND)
out    SPH,temp
outi   TCCR2, (1<<CS20|1<<CS21|1<<WGM21)
outi   OCR2, 0x08
outi   TIMSK, (1<<OCIE2)

outi   ddrd, 0xff
outi   portd, 0x00
outi   ddrc, 0x00
outi   portc, 0x00
sei

main:
rjmp   main

OC2:
in     RSREG, SREG

in     temp, pyms
omdi   temp,0b00000001
cpi    temp, 0b00000000
brne   OC_End
outi   portd, (1<<portd7|1<<portd0)

OC_End:
out    SREG, RSREG
reti
0
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 138
14.06.2013, 21:38 13
Прошу прощения, что прослоупочил так долго.
В общем, проблема действительно была в brne main.
Сохранять регистры наверное правильно, но в данном случае, задача у контроллера только одна, так что, думаю не обязательно.
0
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
14.06.2013, 23:31 14
Цитата Сообщение от mobtoko
А зачем сохранять регистры , если он их нигде больше не использует? Ну и выход ветвлением тоже можно делать, только вместо строчки brne main (четвертая строка снизу) , я бы просто влупил команду reti.
А флаги???
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
15.06.2013, 00:58 15
Цитата Сообщение от Гарнист
Цитата Сообщение от mobtoko
А зачем сохранять регистры , если он их нигде больше не использует? Ну и выход ветвлением тоже можно делать, только вместо строчки brne main (четвертая строка снизу) , я бы просто влупил команду reti.
А флаги???В данном случае флаги тоже пофигу, т.к. main() - пустая функция.
0
15.06.2013, 00:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2013, 00:58
Помогаю со студенческими работами здесь

Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести результат
нужна помощь в битовых операциях.Ввести целое число A. Инвертировать все биты с 4 по 8, включая...

Используя битовые операции поменять местами в них четные биты второго числа на нечетные биты первого
Написать программу, которая позволит ввести два числа типа unsigned int с клавиатуры, напечатать...

Заменить биты одного числа на биты другого
Даны два целых знаковых числа и позиции битов i and j (i &lt; j). Реализовать функцию...

Инвертировать все биты с 2 по 14 включая эти биты
Ввести целое A. Инвертировать все биты с 2 по 14 включая эти биты. Вывести полученное число ...

Смысл флага V в SREG
Кто может подсказать по флагу V в SREG? Классически переполнение контролируется по не правильному...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru