Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.93/27: Рейтинг темы: голосов - 27, средняя оценка - 4.93
worizzzok
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 138
1

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

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

Доброго вам времени суток.
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
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2013, 04:25
Ответы с готовыми решениями:

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

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

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

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

14
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
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
mobtoko
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 455
13.06.2013, 08:45 5
А зачем сохранять регистры , если он их нигде больше не использует? Ну и выход ветвлением тоже можно делать, только вместо строчки brne main (четвертая строка снизу) , я бы просто влупил команду reti.
0
OtixPM
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
13.06.2013, 10:55 6
Цитата Сообщение от mobtoko
выход ветвлением тоже можно делать, только вместо строчки brne main (четвертая строка снизу) , я бы просто влупил команду reti.
Вот и надо было "влупить команду reti".
Выход из ISR по reti делает две необходимые вещи:
- восстанавливает положение стека;
- восстанавливает бит глобального разрешения прерываний в SREG.

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

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

HolyShit!
А Вы родились сразу с умением виртуозно кодить? ;)
0
OtixPM
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
13.06.2013, 13:32 8
Без "brne main" заработало как надо?
0
worizzzok
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 138
13.06.2013, 14:12 9
Пока не проверил - на работе щас. В обед проверю.
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
13.06.2013, 14:14 10
Цитата Сообщение от worizzzok
Пока не проверил - на работе щас. В обед проверю.
Если не поможет - меняй студию на 6-ю..... :)
0
itsydoy
0 / 0 / 0
Регистрация: 01.02.2013
Сообщений: 49
13.06.2013, 17:53 11
А в отладке прогнать не пробовали? Задача у Вас легко моделируется, там бы и обнаружили, где что не выставляется.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 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
worizzzok
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
OtixPM
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
15.06.2013, 00:58 15
Цитата Сообщение от Гарнист
Цитата Сообщение от mobtoko
А зачем сохранять регистры , если он их нигде больше не использует? Ну и выход ветвлением тоже можно делать, только вместо строчки brne main (четвертая строка снизу) , я бы просто влупил команду reti.
А флаги???В данном случае флаги тоже пофигу, т.к. main() - пустая функция.
0
15.06.2013, 00:58
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.06.2013, 00:58

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

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

Atmel Studio 7 не видит SREG
Почему Atmel Studyo 7 не видит SREG? Вернее, надстройка Visual Asses (Tomato).

... В четных байтах числа в двоичной системе переместить нулевые биты в старшие биты, а в нечетных байтах – в младшие ...
Доброго времени суток всем, столкнулся с проблемой по С++,требуется написать программу: которая...

Регистр сведений «Списанные материалы из эксплуатации». Почему регистр сведений, а не регистр накопления?
Существует Регистр сведений «Списанные материалы из эксплуатации». Регистр сведений предназначен...


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

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

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