Jump to content

    
SAVC

Это глюк симулятора или что это?

Recommended Posts

Попробовав Atmel Studio, пришёл к выводу, что нормально работать там невозможно, посему поставил себе MPLAB IDE

Но тоже не всё гладко. После ассемблирования следующей программы и запуска в симуляторе, упорно вызывает прерывание по адресу 7, хотя, по документации на ATmega809, такого прерывания нет.

 

.cseg

.org 0
	rjmp start

.org 7
	rjmp pusto_reti
	
.org TCA0_OVF_vect 
	rjmp tca0_int


start:
	ldi r16,LOW(INTERNAL_SRAM_END)
	ldi r17,HIGH(INTERNAL_SRAM_END)
	sts CPU_SPH,r17
	sts CPU_SPL,r16

	ldi r16,1
	sts TCA0_SINGLE_CTRLA,r16
	ldi r16,1
	sts TCA0_SINGLE_INTCTRL,r16
	ldi r16,LOW(256)
	ldi r17,HIGH(256)
	sts TCA0_SINGLE_TEMP,r16
	sts TCA0_SINGLE_PER+1,r17

	ldi xl,LOW(INTERNAL_SRAM_START)
	ldi xh,HIGH(INTERNAL_SRAM_START)
	ldi r17,LOW(INTERNAL_SRAM_SIZE)
	ldi r18,HIGH(INTERNAL_SRAM_SIZE)
	ldi r16,0
st01:
	st X+,r16
	dec r17
	brne st01
	dec r18
	brne st01

	sei

main_cycle:
mc0:
	rjmp mc0	

tca0_int:
	ldi r16,1
	sts TCA0_SINGLE_INTFLAGS,r16
	inc r18
pusto_reti:
	reti

.dseg
.org INTERNAL_SRAM_START
buff0:
	.byte 256
buff1:
	.byte 256
buff_flag:
	.byte 1

https://cloud.mail.ru/public/3mrt/5EGDKb3TW скриншот

Edited by SAVC

Share this post


Link to post
Share on other sites
1 hour ago, SAVC said:

упорно вызывает прерывание по адресу 7, хотя, по документации на ATmega809, такого прерывания нет.

А это тогда что?

5.thumb.jpg.b1452b6d414b954bb063d5755717a1b1.jpg

 

листинг после компилятора есть?

Share this post


Link to post
Share on other sites

А, ну всё ясно. Спасибо, zombi.

Это ошибка в include файле. Адрес вектора прерывания указан как если бы он был в dseg. Хотя он находится в cseg и должен быть равен 7, а в инклуде он равен 14 - 0x0E

Что интересно, в инклуде к Atmel Studio всё правильно. Он равен 7.

А проект я перенёс оттуда. Там всё работало, а здесь перестало.

Ну, инклуд мы переписывать не будем, просто придётся это учесть и поделить на 2

Да, и в догонку, ещё вопрос. Есть здесь окно с регистрами процессора и временем исполнения программы или нет? В Atmel Studio было.

Share this post


Link to post
Share on other sites

Если мне не изменяет 20-летней выдержки склероз, директива ".org" задаёт адрес памяти, а учитывая 16-битный размер команд, ".org 7" - мимо любой кассы (-;

Edited by Obam

Share this post


Link to post
Share on other sites
8 hours ago, Obam said:

Если мне не изменяет 20-летней выдержки склероз

Аналогично, но :

Quote

Note that the SRAM and EEPROM location counters count bytes whereas the Program memory location counter counts words

Цитата из AVR Assembler 5.24 ORG

Share this post


Link to post
Share on other sites
15 hours ago, Obam said:

Если мне не изменяет 20-летней выдержки склероз, директива ".org" задаёт адрес памяти, а учитывая 16-битный размер команд, ".org 7" - мимо любой кассы (-;

 

Вовсе нет. .org 7 прекрасно работает.

Share this post


Link to post
Share on other sites
16 часов назад, Obam сказал:

".org 7" - мимо любой кассы (-;

Как раз наоборот: в ассемблере считаются адреса команд, т.е. org 7 -это адрес седьмой команды, или 14 в байтах. А компилятор Сей считает адреса в байтах, поэтому если заголовочный файл - сишный, то адрес 14 там с точки зрения Сей указан правильно, а при использовании его в ассемблере нужно переводить адрес байтов в адрес слов, т.е. делить на два.

Share this post


Link to post
Share on other sites

Точно так... склероз ;-) tiny13a


AVRASM ver. 1.30  SHFTENCD.ASM Sat Aug 15 15:51:06 2009


         	.NOLIST

         	.EQU	UP=PINB3
         	.EQU	DWN=PINB4


         	.EQU	TBLS_SLCTR_TBL = RAMEND-$08+$01
         	.EQU	STACK_TOP = TBLS_SLCTR_TBL-$01
        ;	R0 - текущее состояние автомата




        ;==============================================================================
         	.CSEG
         	.ORG	$000
000000 c014      	RJMP	START

         	.ORG	$002
000002 c02e      	RJMP	UP_DOWN_FRONTS_HANDLER

         	.ORG	$00A
         	.DB	"OPTICAL SHAFT ENCODER"
00000a 504f
00000b 4954
00000c 4143
00000d 204c
00000e 4853
00000f 4641
000010 2054
000011 4e45
000012 4f43
000013 4544
000014 0052

000015 94f8      START:	CLI
000016 95a8      	WDR
000017 b704      	IN	R16,	MCUSR
000018 7f07      	ANDI	R16,	(~(1<000019 bf04      	OUT	MCUSR,	R16
00001a b501      	IN	R16,	WDTCR

поскипано

         _1_TBL:
         	.DW	(UP_RISE_TBL<<1), (UP_FALL_TBL<<1), (DWN_RISE_TBL<<1), (DWN_FALL_TBL<<1)
000047 006c
000048 0074
000049 007c
00004a 0084

         	.EXIT

Assembly complete with no errors.


вектор 3-й, а адрес 2, и код вполне себе с 0x15-го адреса.

Edited by Obam

Share this post


Link to post
Share on other sites
15 hours ago, Сергей Борщ said:

Как раз наоборот: в ассемблере считаются адреса команд, т.е. org 7 -это адрес седьмой команды, или 14 в байтах. А компилятор Сей считает адреса в байтах, поэтому если заголовочный файл - сишный, то адрес 14 там с точки зрения Сей указан правильно, а при использовании его в ассемблере нужно переводить адрес байтов в адрес слов, т.е. делить на два.

Ну вот так как раз и сделал, поделил на 2.


.org TCA0_OVF_vect / 2
	rjmp tca0_int

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.