Добрый день. Решил написать какой-нить простенький код на асме под хмегу - и сходу попал на грабли: Программа из основного цикла все время вываливается на ресет. + вызов функции (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]