реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> ASM + Xmega128A3
Pavel_Bor
сообщение Oct 5 2011, 13:11
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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]
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Oct 5 2011, 13:45
Сообщение #2


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Pavel_Bor @ Oct 5 2011, 17:11) *
...основного цикла все время вываливается на ресет. + вызов функции (rcall letterd) после сравнения битов....



1) не совсем понятно где вызываемый код ( call gzad16) - вызов подпрограммы
2) не видно где вы зовёте "letterd" как подпрограмму. есть только (rjmp letterd) - без условный переход

удачи вам
(круглый)
Go to the top of the page
 
+Quote Post
Pavel_Bor
сообщение Oct 5 2011, 13:53
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Oct 5 2011, 14:27
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Вам пытались объяснить, что переход по Rjmp не сохраняет адрес возврата , поэтому ret - это в никуда - и возврат на RESET


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
zombi
сообщение Oct 5 2011, 22:44
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Navovvol
сообщение Oct 6 2011, 05:36
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080



замените Rjmp на Rcall
Go to the top of the page
 
+Quote Post
Pavel_Bor
сообщение Oct 6 2011, 05:37
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Navovvol
сообщение Oct 6 2011, 05:52
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 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]
Go to the top of the page
 
+Quote Post
Pavel_Bor
сообщение Oct 6 2011, 10:01
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Navovvol
сообщение Oct 6 2011, 10:38
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 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 не очищается
Go to the top of the page
 
+Quote Post
zombi
сообщение Oct 6 2011, 10:54
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 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 записывать нули?
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Oct 6 2011, 12:41
Сообщение #12


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Navovvol @ Oct 6 2011, 14:38) *
значит grflag2 не равен 0 ..


да какие нафик флаги то, господа?
В маин как Вы попадаете? так же через джамп? и если всё пучком (флаг там или не флаг - рояли не играет) что вызываете то? ретурн!!! офигительная логика... возврат куда????

уже два или три раза ткнули носом что делать...

или по другому.
ВЫКИНЬТЕ ВСЁ нафик, кроме коллов, ретурнов, джампов. в том числе и команды образующие повторы выполнения. Только путь выполнения МК. и всё станет понятно...


(круглый)
ЗЫ
ваш код так же бажный...помимо вызова то, что вы подправили - надо вызвать main как подпрограмму либо убрать ретурн после метки main
ЗЫ ЗЫ
ТС рекомендую поставить студию AVR и под отладчиком ОДИН РАЗ понять что он видит. Делоф то на 10 минут...всё по умолчанию же, без бубноффф.
Go to the top of the page
 
+Quote Post
Navovvol
сообщение Oct 6 2011, 12:53
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Pavel_Bor
сообщение Oct 6 2011, 13:30
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Pavel_Bor
сообщение Oct 6 2011, 13:30
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 19:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01484 секунд с 7
ELECTRONIX ©2004-2016