SAVC 0 16 сентября, 2020 Опубликовано 16 сентября, 2020 (изменено) · Жалоба Попробовав 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 скриншот Изменено 16 сентября, 2020 пользователем SAVC Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 16 сентября, 2020 Опубликовано 16 сентября, 2020 · Жалоба 1 hour ago, SAVC said: упорно вызывает прерывание по адресу 7, хотя, по документации на ATmega809, такого прерывания нет. А это тогда что? листинг после компилятора есть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SAVC 0 16 сентября, 2020 Опубликовано 16 сентября, 2020 · Жалоба Это номер в таблице прерываний, а не адрес. Адрес 0x0E Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 16 сентября, 2020 Опубликовано 16 сентября, 2020 · Жалоба Листинг? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SAVC 0 16 сентября, 2020 Опубликовано 16 сентября, 2020 · Жалоба А, ну всё ясно. Спасибо, zombi. Это ошибка в include файле. Адрес вектора прерывания указан как если бы он был в dseg. Хотя он находится в cseg и должен быть равен 7, а в инклуде он равен 14 - 0x0E Что интересно, в инклуде к Atmel Studio всё правильно. Он равен 7. А проект я перенёс оттуда. Там всё работало, а здесь перестало. Ну, инклуд мы переписывать не будем, просто придётся это учесть и поделить на 2 Да, и в догонку, ещё вопрос. Есть здесь окно с регистрами процессора и временем исполнения программы или нет? В Atmel Studio было. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 16 сентября, 2020 Опубликовано 16 сентября, 2020 (изменено) · Жалоба Если мне не изменяет 20-летней выдержки склероз, директива ".org" задаёт адрес памяти, а учитывая 16-битный размер команд, ".org 7" - мимо любой кассы (-; Изменено 16 сентября, 2020 пользователем Obam Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 17 сентября, 2020 Опубликовано 17 сентября, 2020 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SAVC 0 17 сентября, 2020 Опубликовано 17 сентября, 2020 · Жалоба 15 hours ago, Obam said: Если мне не изменяет 20-летней выдержки склероз, директива ".org" задаёт адрес памяти, а учитывая 16-битный размер команд, ".org 7" - мимо любой кассы (-; Вовсе нет. .org 7 прекрасно работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 17 сентября, 2020 Опубликовано 17 сентября, 2020 · Жалоба 16 часов назад, Obam сказал: ".org 7" - мимо любой кассы (-; Как раз наоборот: в ассемблере считаются адреса команд, т.е. org 7 -это адрес седьмой команды, или 14 в байтах. А компилятор Сей считает адреса в байтах, поэтому если заголовочный файл - сишный, то адрес 14 там с точки зрения Сей указан правильно, а при использовании его в ассемблере нужно переводить адрес байтов в адрес слов, т.е. делить на два. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 17 сентября, 2020 Опубликовано 17 сентября, 2020 (изменено) · Жалоба Точно так... склероз ;-) 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-го адреса. Изменено 17 сентября, 2020 пользователем Obam Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SAVC 0 18 сентября, 2020 Опубликовано 18 сентября, 2020 · Жалоба 15 hours ago, Сергей Борщ said: Как раз наоборот: в ассемблере считаются адреса команд, т.е. org 7 -это адрес седьмой команды, или 14 в байтах. А компилятор Сей считает адреса в байтах, поэтому если заголовочный файл - сишный, то адрес 14 там с точки зрения Сей указан правильно, а при использовании его в ассемблере нужно переводить адрес байтов в адрес слов, т.е. делить на два. Ну вот так как раз и сделал, поделил на 2. .org TCA0_OVF_vect / 2 rjmp tca0_int Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться