Перейти к содержанию
    

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

Попробовав 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 скриншот

Изменено пользователем SAVC

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, SAVC said:

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

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

5.thumb.jpg.b1452b6d414b954bb063d5755717a1b1.jpg

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем Obam

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 hours ago, Obam said:

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 часов назад, Obam сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Точно так... склероз ;-) 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-го адреса.

Изменено пользователем Obam

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 hours ago, Сергей Борщ said:

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

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


.org TCA0_OVF_vect / 2
	rjmp tca0_int

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...