Чудеса со стеком, помогите найти ошибку

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 11
Зарегистрирован: Пт янв 06, 2017 14:03:22

Сообщение kvadrats »

Здравствуйте , я тут впервой , так что если что-то не там написал- не сердитесь, пожалуйста.......
И так , проблема состоит в следующем, на 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:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

kvadrats писал(а):так что если что-то не там написал
Написать то Вы там написали, вот только не то. Кто же так вопросы задает?
Какой светодиод? Какой rjmp? Какая метка? Какие чудеса со стеком? После какого последнего вызова? В чем отлаживаете?

По шагам выполняли свою программу в симуляции вашей среды программирования или через отладочный порт в железе?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15672
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

А какого хвоста в коде
SPM
выполняют? Тем более, без всякой предварительной подготовки?
Запись в программную память весьма "тонкий" вопрос (и жестко привязан к конкретному МК).
Тем более,что этот процесс не мгновенный и также может сопровождаться соответствующими прерываниями.
:dont_know:
Ответить

Вернуться в «AVR»