Здравствуйте , я тут впервой , так что если что-то не там написал- не сердитесь, пожалуйста.......
И так , проблема состоит в следующем, на ASM пишу под Atmega 128 (не знаю важно это или нет) все работает , по памяти проверяю , все работает, но если я "зажигаю" светодиод несколько раз , то происходит непонятный переход по Rjmp вообще не по метке
В общем, вот мой код, (в таком виде все работает) , но если я после последнего вызова подпрограммы пишу
ldi r16, 0b11111110
out PortD,r16
то происходит что-то невероятное со стеком , ПОМОГИТЕ РАЗОБРАТЬСЯ,ПОЖАЛУЙСТА
Код:
.include "m128def.inc"
.device ATmega128
.dseg
.equ number = 8
.equ divisor = 3
.equ element= $FA
.equ EEPROM = $0
.equ XRAM = $1100
.org $195
RAM: .byte 256
.cseg
// initialization of STACK
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,low(RAMEND)
out SPL,r16
ldi r16,0b10000000
out MCUCR,r16
ldi r16, 0b11111111 ;ïîðò Ä íà âûõîä
out DDRD,R16
ldi r16, 0b11111110 ;ãîðèò äèîä 0
out PortD,r16
RCALL Mass
Rcall Write_RAM
Rcall DIVandEPROM
loop:
rjmp loop
Flash:
//clear the page of Flash, if address of word in page=0
cpi R30, $00
brne clear
ldi r16,0b00000011
STS spmcsr, r16
spm
clear:
// write R0 and R1 in buffer
ldi r16, 0b00000001
sts SPMCSR, r16
spm
//rewrite Buffer to FLASH
mov r16, ZL
andi r16, 0x0F
cpi r16, 0x0F
brne SkipWrite
ldi r16, 0b00000101
sts SPMCSR, r16
spm
SkipWrite:
adiw R30,2
ret
mass:
ldi r16,number
mov R0,r16
mov r17,r0
ldi r16,element
mov R1,r16
ldi R31,High(EndOfCode)+1;//ñòàðòîâûé àäðåñ â flash
ldi R30,$00; //ñòàðòîâûé àäðåñ â flash
start:
Rjmp not
done:
ldi R16,$FF
mov R1,R16
not:
RCall Flash
inc R0
dec R1
subi r17,2
cpi r17,0 ;n?aaieou
breq done
cpi r17,-1 ;n?aaieou
breq done1
cpi r17,-2 ;n?aaieou
breq done1
rjmp start
done1:
ldi r16, 0b00000101
sts SPMCSR, r16
spm
ret
Write_RAM:
ldi R31,High(EndOfCode)+1; no?aieoa aey caiene
ldi R30,$00
ldi r16,$01
ldi r17,number
add r17,r16
ldi r16,$00
ldi R28,Low(RAM)
ldi R29, High(RAM)
start2:
STS SPMEN,R16
LPM
st Y+,r0
adiw r30,1
dec r17
cpi r17,0 ;n?aaieou
breq RETERN
rjmp start2
RETERN:
RET
EPROMM:
out EEARL, YL ;caa?oceou aa?an EEPROM
out EEARH, YH ;caa?oceou aa?an EEPROM
out EEDR, R16 ;caa?oceou aaiiua EEPROM
sbi EECR, EEMWE
sbi EECR, EEWE ;ia?eiaai ienaou EEPROM
wait11: sbic EECR, EEWE ;iieiue ainooi e EEPROM? ; ii?in oeaaa ieii?aiey i?a?aaiie caiene
rjmp wait11
Ret
DIVandEPROM:
ldi R20,number
ldi R26,Low(RAM)
ldi R27, High(RAM)
ldi R28,Low(EEPROM)
ldi R29, High(EEPROM)
ldi R30,Low(XRAM)
ldi R31, High(XRAM)
ldi R18,divisor
adiw r26,1 //ïðîïóñòèëè ðàçìåð ìàññèâà
start3:
ld r16,X+
Rcall DIVV
st Z,R16
Rcall EPROMM
adiw R30,1
adiw R30,number
adiw R28,1
adiw R28,number
mov R16,r17
st Z,R16
Rcall EPROMM
sbiw R28,number
sbiw R30,number
dec r20
cpi r20,0 ;n?aaieou
breq RETERN1
rjmp start3
RETERN1:
ret
DIVV:
div8u: sub r17,r17
ldi R19,9
d8u_1: rol r16
dec R19
brne d8u_2
RET
d8u_2: rol r17
sub r17,R18
brcc d8u_3
add r17,R18
clc
rjmp d8u_1
d8u_3: sec
rjmp d8u_1
EndOfCode: