Страница 1 из 1

ATTiny2313 и регистры

Добавлено: Вт дек 08, 2009 14:48:29
digit32
Добрый день!

Пишу программу на asm, под AtTiny2313. Устройство общается с ПК по com порту. Обработку получения данных от ПК и собственно обработку данных реализовал на прерывании Rx Complete.

Главный цикл программы выглядит таким образом:
main:
nop
ret
т.е. в неи ничего не делается.

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

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

Вопрос 1. я правильно понимаю, что в регистрах данные сохраняются? Естествено до тех пор пока есть питаник МК.

Вопрос 2. возможно ктото сталкивался с аналогичными проблемами. напишите, плз.

PS. проверил несколько раз по коду push/pop для этого регистра не использую. И вообще, изменяю значение этого регистра только в обработчике прерывания.

Добавлено: Вт дек 08, 2009 14:56:02
GP1
код в студию!

Добавлено: Вт дек 08, 2009 22:51:02
Meteor
И про принимаемые данные поподробнее. Сколько обработка идет и сколько принимаете...

Добавлено: Чт дек 10, 2009 15:52:16
digit32
Нашел причину. Первоначально планировал использовать и прерывание TxComplete. Потом отказался от этого, но код отредактировал не полностью. В итоге в коде было такое

TxComplete:
reti

В результате чего получалось следующее. обрабатываем RxComplete, отсылаем проверочные данные назад ПК, соответственно срабатывает TxComplete. В итоге вызывается reti. И выполнение программы возвращается на адрес 0, т.е. reset. И снова инициализация.

Добавлено: Чт дек 10, 2009 15:58:13
GP1
если вместо обработчика стоит заглушка, это ни в каком случае не приведет к перезапуску системы, т.о. ошибка еще не найдена.

Добавлено: Чт дек 10, 2009 17:58:23
digit32
последовательность такая.
1. инициализирую МК, в том числе и стек.
2. МК работает.
3. Указатель стека указывает на конец SRAM.
3. передаю данные с компа. срабатывает прерывание на RX.
В стек записывается адрес где прервалась программа,
соответственно указатель стека (SP) смещается.
4. выхожу из обработчика RX, указатель стека уменьшается.
5. Обрабатывается прерывание TX, но в обработчике только reti.
SP уменьшается еще раз.

Т.е. увеличился SP один раз, а уменьшился 2.
Я понимаю ситуацию таким образом. И получается, что программа должна вернуться по адресу $00 т.е. на reset.

Во всяком случае, после этого прошивка заработала.

Re: ATTiny2313 и регистры

Добавлено: Чт дек 10, 2009 19:47:08
DrWatson
digit32 писал(а):
Главный цикл программы выглядит таким образом:
main:
nop
ret
т.е. в неи ничего не делается.
Проблема скорее всего еще и здесь. главный цикл должен выглядеть так:

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

main: rjmp main