|
ASM + Xmega128A3 |
|
|
|
Oct 5 2011, 13:11
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660

|
Добрый день. Решил написать какой-нить простенький код на асме под хмегу - и сходу попал на грабли: Программа из основного цикла все время вываливается на ресет. + вызов функции (rcall letterd) после сравнения битов. CODE .include "ATxmega128A3def.inc"
.equ fmin=5 .equ grflag2=GPIO_GPIOR2
.cseg ;**************************** INTERRUPT VECTORS***************************************** .org 0 jmp reset .org 0x0100;+++++++++++++++++++++++++++++++++++++++++++++++++++++ main: wdr ldi rtmp,0xD8 out CPU_ccp,rtmp clr rtmp sts WDT_CTRL,rtmp ; WDT OFF cli // думал причина в прерываниях..отключил.. не в них
m1: in r18,grflag2 // r18 все время равен 0, следовательно флаг grflag2.5 = 0 sbic grflag2,fmin // пропускаю и попадаю на nop-> rjmp
rjmp letterd // даже при пустом m1: nop nop rjmp m1 вываливаюсь на ресет rjmp m1;******************************* nop ret
letterd: // как ни странно но в эту функцию я тоже попадаю nop // хотя из условия выше я долже ее обходить ret
;************** RESET ******* // стандартный набор для инициализации
RESET: cli ldi r16,low(RAMEND) out CPU_SPL,r16 ldi r16,high(RAMEND) out CPU_sph,r16 clr r16 clr xh ldi xl,0xff
res1: st x+,r16 cpi xh,high(ramend) brmi res1 ldi rtmp,0b01000111 sts OSC_XOSCCTRL,rtmp ldi rtmp,0b00001001 sts OSC_CTRL,rtmp ser rtmp sts kzad,rtmp call gzad16
lds rtmp,OSC_STATUS sbrs rtmp,3;XOSCRDY rjmp res2
ldi rtmp,0xD8 out CPU_ccp,rtmp
res2: ldi rtmp,0b011 sts clk_ctrl,rtmp ;extern. CLK jmp main
Сообщение отредактировал IgorKossak - Oct 6 2011, 14:04
Причина редактирования: [codebox]
|
|
|
|
|
Oct 5 2011, 13:45
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Pavel_Bor @ Oct 5 2011, 17:11)  ...основного цикла все время вываливается на ресет. + вызов функции (rcall letterd) после сравнения битов.... 1) не совсем понятно где вызываемый код ( call gzad16) - вызов подпрограммы 2) не видно где вы зовёте "letterd" как подпрограмму. есть только (rjmp letterd) - без условный переход удачи вам (круглый)
|
|
|
|
|
Oct 5 2011, 13:53
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660

|
Цитата(kolobok0 @ Oct 5 2011, 16:45)  1) не совсем понятно где вызываемый код ( call gzad16) - вызов подпрограммы это пропустил сорри gzad16: lds rzad,kzad gzad160: lds r16,kzad gzad161: dec r16 brne gzad161 dec rzad brne gzad160 ret ;***************************************************************** Цитата 2) не видно где вы зовёте "letterd" как подпрограмму. есть только (rjmp letterd) - без условный переход это есть в коде letterd: // как ни странно но в эту функцию я тоже попадаю nop // хотя из условия выше я долже ее обходить ret
Сообщение отредактировал Pavel_Bor - Oct 5 2011, 13:54
|
|
|
|
|
Oct 5 2011, 22:44
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(Pavel_Bor @ Oct 5 2011, 16:11)  Добрый день. Решил написать какой-нить простенький код на асме под хмегу - и сходу попал на грабли: Не асилил весь код, дошел то до EXTRNclock. Что должен делать этот код Вашей программы? Код ldi rtmp,0b00001001 sts OSC_CTRL,rtmp ser rtmp sts kzad,rtmp call gzad16
lds rtmp,OSC_STATUS sbrs rtmp,3;XOSCRDY rjmp res2
ldi rtmp,0xD8 out CPU_ccp,rtmp
res2: ldi rtmp,0b011 sts clk_ctrl,rtmp;extern. CLK
|
|
|
|
|
Oct 6 2011, 05:37
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660

|
Цитата(ILYAUL @ Oct 5 2011, 17:27)  Вам пытались объяснить, что переход по Rjmp не сохраняет адрес возврата , поэтому ret - это в никуда - и возврат на RESET Похоже что именно это и просходит. Цитата Не асилил весь код, дошел то до EXTRNclock. Что должен делать этот код Вашей программы? Здесь происходит инициализация кварца. установка задержек. Цитата замените Rjmp на Rcall я на этот rjmp(rcall) letterd сейчас попадать не должен так как gpio.gpior2=0;
Сообщение отредактировал Pavel_Bor - Oct 6 2011, 05:42
|
|
|
|
|
Oct 6 2011, 05:52
|
Частый гость
 
Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080

|
CODE .include "ATxmega128A3def.inc"
.equ fmin=5 .equ grflag2=GPIO_GPIOR2
.cseg ;**************************** INTERRUPT VECTORS***************************************** .org 0 jmp reset .org 0x0100;+++++++++++++++++++++++++++++++++++++++++++++++++++++
main: wdr ldi rtmp,0xD8 out CPU_ccp,rtmp clr rtmp sts WDT_CTRL,rtmp; WDT OFF cli // думал причина в прерываниях..отключил.. не в них
m1: in r18,grflag2 // r18 все время равен 0, следовательно флаг grflag2.5 = 0 //////// вот тут не понятно чего вы добивались. sbic grflag2,fmin // пропускаю и попадаю на nop-> rjmp
RCALL letterd ////////////////////////////ОШИБКА исправлена // даже при пустом m1: nop nop rjmp m1 вываливаюсь на ресет rjmp m1;******************************* nop ret /////////////////////////////////////// ОШИБКА ???
letterd: // как ни странно но в эту функцию я тоже попадаю nop // хотя из условия выше я долже ее обходить ret
;************** RESET ******* // стандартный набор для инициализации
RESET: cli ldi r16,low(RAMEND) out CPU_SPL,r16 ldi r16,high(RAMEND) out CPU_sph,r16 clr r16 clr xh ldi xl,0xff
res1: st x+,r16 cpi xh,high(ramend) brmi res1 ldi rtmp,0b01000111 sts OSC_XOSCCTRL,rtmp ldi rtmp,0b00001001 sts OSC_CTRL,rtmp ser rtmp sts kzad,rtmp call gzad16
lds rtmp,OSC_STATUS sbrs rtmp,3;XOSCRDY rjmp res2
ldi rtmp,0xD8 out CPU_ccp,rtmp
res2: ldi rtmp,0b011 sts clk_ctrl,rtmp;extern. CLK
rjmp main И если честно, то переходы мутные, код не читабелен. Все вызываемые CALL'ом подпрограммы в отдельный файл .asm и в конце главного файла инклуд. И структуру надо переделать: сначала RESET потом main, а в конце jmp main. никаких ret посреди кода не надо. И проверьте сторожевой таймер: Код clr rtmp sts WDT_CTRL,rtmp; WDT OFF Из даташита: Бит 1 - ENABLE: разрешение работы сторожевого таймера С помощью данного бита можно активизировать работу сторожевого таймера WDT. Попытка изменения данного бита будет эффективной только при условии одновременной записи лог. 1 в бит CEN этого же регистра. Бит ENABLE защищен механизмом защиты от изменения конфигурации (см. 3.12 "Защита от изменения конфигурации").
Сообщение отредактировал IgorKossak - Oct 6 2011, 14:03
Причина редактирования: [codebox]
|
|
|
|
|
Oct 6 2011, 10:01
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660

|
Цитата(Navovvol @ Oct 6 2011, 08:52)  Код clr rtmp sts WDT_CTRL,rtmp; WDT OFF Из даташита: Бит 1 - ENABLE: разрешение работы сторожевого таймера С помощью данного бита можно активизировать работу сторожевого таймера WDT. Попытка изменения данного бита будет эффективной только при условии одновременной записи лог. 1 в бит CEN этого же регистра. Бит ENABLE защищен механизмом защиты от изменения конфигурации (см. 3.12 "Защита от изменения конфигурации"). Строки ниже дают доступ на несколько секунд к изменению конфигурации. ldi rtmp,0xD8 out CPU_ccp,rtmp К тому же собака мне не нужна(должна быть выкл.), и в даташите написано, что она выдаст ресет только один раз или этот ресет надо дать вручную. Меня интересует как отладчик подхватывает строку rcall letterd, при gpior=0.
Сообщение отредактировал Pavel_Bor - Oct 6 2011, 10:02
|
|
|
|
|
Oct 6 2011, 10:38
|
Частый гость
 
Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080

|
Цитата(Pavel_Bor @ Oct 6 2011, 14:01)  Строки ниже дают доступ на несколько секунд к изменению конфигурации. ldi rtmp,0xD8 out CPU_ccp,rtmp
К тому же собака мне не нужна(должна быть выкл.), и в даташите написано, что она выдаст ресет только один раз или этот ресет надо дать вручную.
Меня интересует как отладчик подхватывает строку rcall letterd, при gpior=0. значит grflag2 не равен 0 . Командой IN записывается значение grflag2 в R18 // при этом grflag2 не очищается
|
|
|
|
|
Oct 6 2011, 10:54
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(Pavel_Bor @ Oct 6 2011, 13:01)  Меня интересует как отладчик подхватывает строку rcall letterd, при gpior=0. Строки rcall letterd в Вашем тексте нетууууу! Цитата(Pavel_Bor @ Oct 6 2011, 13:01)  Меня интересует как отладчик подхватывает строку Так мы отладчик обсуждаем или чип??? Цитата(Pavel_Bor @ Oct 6 2011, 08:37)  Здесь происходит инициализация кварца. установка задержек. Оченно похоже на тестирование отладчика. Какой кстати отладчик? Чему равен RAMEND? и зачем c 0х00ff до RAMEND записывать нули?
|
|
|
|
|
Oct 6 2011, 12:41
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Navovvol @ Oct 6 2011, 14:38)  значит grflag2 не равен 0 .. да какие нафик флаги то, господа? В маин как Вы попадаете? так же через джамп? и если всё пучком (флаг там или не флаг - рояли не играет) что вызываете то? ретурн!!! офигительная логика... возврат куда???? уже два или три раза ткнули носом что делать... или по другому. ВЫКИНЬТЕ ВСЁ нафик, кроме коллов, ретурнов, джампов. в том числе и команды образующие повторы выполнения. Только путь выполнения МК. и всё станет понятно... (круглый) ЗЫ ваш код так же бажный...помимо вызова то, что вы подправили - надо вызвать main как подпрограмму либо убрать ретурн после метки main ЗЫ ЗЫ ТС рекомендую поставить студию AVR и под отладчиком ОДИН РАЗ понять что он видит. Делоф то на 10 минут...всё по умолчанию же, без бубноффф.
|
|
|
|
|
Oct 6 2011, 12:53
|
Частый гость
 
Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080

|
Цитата(kolobok0 @ Oct 6 2011, 16:41)  да какие нафик флаги то, господа? В маин как Вы попадаете? так же через джамп? и если всё пучком (флаг там или не флаг - рояли не играет) что вызываете то? ретурн!!! офигительная логика... возврат куда???? в маин попадаем через джамп, в маине / в m1 зацикливание rjmp m1 /// nop и ret после него (rjmp m1)- похоже на мусор, который остался при редактировании кода, похоже, что код выложен не полностью. И я с вами согласен, надо всё переделать. (вызовы и переходы) ЗЫ вообще это не мой код, я просто указал на ошибки в коде
Сообщение отредактировал Navovvol - Oct 6 2011, 13:00
|
|
|
|
|
Oct 6 2011, 13:30
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660

|
Цитата значит grflag2 не равен 0 . Командой IN записывается значение grflag2 в R18 // при этом grflag2 не очищается Думаете? почему же тогда после in r18, grflag2 r18 = 0 ??? Цитата Строки rcall letterd в Вашем тексте нетууууу! уже есть после замечаний Код m1: in r18,grflag2 // r18 все время равен 0, следовательно флаг grflag2.5 = 0 /////////////////// вот тут не понятно чего вы добивались. sbic grflag2,fmin // пропускаю и попадаю на nop-> rjmp
RCALL letterd /////////////////////////////////////////////////////////////////ОШИБКА исправлена // даже при пустом m1: nop nop rjmp m1 вываливаюсь на ресет rjmp m1;******************************* nop ret ////////////////// ОШИБКА ??? Теоретически да. Но программа никогда не должна сюда попасть. Так что эти строки не важны Цитата Оченно похоже на тестирование отладчика. Какой кстати отладчик?
Чему равен RAMEND? и зачем c 0х00ff до RAMEND записывать нули? 1. jtagiceII. 2. очистка памяти Цитата В маин как Вы попадаете? так же через джамп? и если всё пучком (флаг там или не флаг - рояли не играет) что вызываете то? ретурн!!! офигительная логика... возврат куда???? Еще раз говорю что этот ретурн не должен никогда происходить. он после мэйна никому не мешает, а без него программа вываливается на след строки.
Сообщение отредактировал IgorKossak - Oct 6 2011, 14:01
|
|
|
|
|
Oct 6 2011, 13:30
|
Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660

|
Цитата значит grflag2 не равен 0 . Командой IN записывается значение grflag2 в R18 // при этом grflag2 не очищается Думаете? почему же тогда после in r18, grflag2 r18 = 0 ??? Цитата Строки rcall letterd в Вашем тексте нетууууу! уже есть после замечаний Код m1: in r18,grflag2 // r18 все время равен 0, следовательно флаг grflag2.5 = 0 /////////////////// вот тут не понятно чего вы добивались. sbic grflag2,fmin // пропускаю и попадаю на nop-> rjmp
RCALL letterd //////////////////////////////////////////////////////////////////////ОШИБКА исправлена // даже при пустом m1: nop nop rjmp m1 вываливаюсь на ресет rjmp m1;******************************* nop ret ///////////////////// ОШИБКА ??? Теоретически да. Но программа никогда не должна сюда попасть. Так что эти строки не важны Цитата Оченно похоже на тестирование отладчика. Какой кстати отладчик?
Чему равен RAMEND? и зачем c 0х00ff до RAMEND записывать нули? 1. jtagiceII. 2. очистка памяти Цитата В маин как Вы попадаете? так же через джамп? и если всё пучком (флаг там или не флаг - рояли не играет) что вызываете то? ретурн!!! офигительная логика... возврат куда???? Еще раз говорю что этот ретурн не должен никогда происходить. он после мэйна никому не мешает, а без него программа вываливается из основного цикла main.
Сообщение отредактировал IgorKossak - Oct 6 2011, 14:00
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|