Все зависит от конкретной программы, принятых приоритетов и имеющихся в распоряжении ресурсов.
У каждого метода свои особенности и ресурсные требования. Выбор за автором конкретной прожки.
Код: Выделить всё
.include "m8def.inc"
.def temp = r16
.equ kdel = 64 // Ввели константу и обозвали ее - kdel
.cseg
.org 0
ldi Temp, High(RAMEND) // Причесали стек как в даташите
out SPH, Temp
ldi Temp, Low(RAMEND)
out SPL, Temp
Код: Выделить всё
.cseg
.org 0x000
irq_res:
rjmp init ; переход к началу программы инициализации системы
; - - - - - - - - - - - - - - - - - - - - - - - - - - -
; блок размещения векторов активных прерываний
; .org OC0Aaddr
; irq_t0:
; rjmp timers_bum ; steps
; - - - - - - - - - - - - - - - - - - - - - - - - - - -
;________________________
.org (irq_res+int_vectors_size) ; обход блока векторов прерываний
init: ;блок начальной инициализации кристаллаВИНОВАТ, действительно не увидел сразу, спасибо Вам.Z_h_e писал(а): Я же поправил код.
Я не так делаю. Копирую таблицу векторов из ДШ, вставляю в проект, заменяю все переходы на reti, по мере написания проекта, восстанавливаю нужный переход на обработчик прерывания. Вот например вектора atmega8 из кой-какого проекта.BOB51 писал(а):Как вариант альтернативы (дабы не заморачиваться...
Код: Выделить всё
.org 0
rjmp RESET ; Reset Handler
reti//rjmp EXT_INT0 ; IRQ0 Handler
reti//rjmp EXT_INT1 ; IRQ1 Handler
reti//rjmp TIM2_COMP ; Timer2 Compare Handler
rjmp TIM2_OVF ; Timer2 Overflow Handler
reti//rjmp TIM1_CAPT ; Timer1 Capture Handler
reti//rjmp TIM1_COMPA ; Timer1 CompareA Handler
reti//rjmp TIM1_COMPB ; Timer1 CompareB Handler
reti//rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
reti//rjmp SPI_STC ; SPI Transfer Complete Handler
rjmp USART_RXC ; USART RX Complete Handler
reti//rjmp USART_UDRE ; UDR Empty Handler
rjmp USART_TXC ; USART TX Complete Handler
reti//rjmp ADC ; ADC Conversion Complete Handler
reti//rjmp EE_RDY ; EEPROM Ready Handler
reti//rjmp ANA_COMP ; Analog Comparator Handler
reti//rjmp TWSI ; Two-wire Serial Interface Handler
reti//rjmp SPM_RDY ; Store Program Memory Ready Handler
;
всегда возражаю против этого подхода, возражу и сейчас.Z_h_e писал(а):Я не так делаю. Копирую таблицу векторов из ДШ, вставляю в проект, заменяю все переходы на reti, по мере написания проекта, восстанавливаю нужный переход на обработчик прерывания.
Код: Выделить всё
.ORG 0 ; старт
rjmp begin_program
.ORG OVF0addr ; обработчик переполнения 0-го таймер
rjmp vector_ovf0
begin_program:
ldi r16, 0
...+100500..при помощи директивы ORG задавать адрес вектора...
Если не смог скопировать таблицу из ДШ правильно, то и в другом случае легко допустишь ошибку с таким же успехом, тем более тут уже надо набивать ручками.ARV писал(а):ошибка, когда из-за copy-paste таблицы векторов обработчик оказывался не в той ячейке - одна из самых распространенных.
Что это дает?ARV писал(а):во-первых, векторы можно описывать в любом порядке - компилятор сам расставит их в нужные ячейки.
Это какая-то крайняя необходимость и ее надо избегать.ARV писал(а):во-вторых, мы имеем возможность напихать в неиспользуемые области таблицы векторов какие-то полезные данные или коды - это, раз уж мы говорим об ассемблере, позволит нам выжать максимум из имеющегося минимума.
В данном случае нет ни одного магического числа. На счет переносимости соглашусь, хотя и абсолютно не трудно поменять таблицу векторов как и инклудники.ARV писал(а):в-третьих, в программе минимум "магических чисел", т.е. она становится более переносима,
Текста то явно больше будет, на одно прерывание.ARV писал(а):наконец, в программе нет ничего лишнего,
Код: Выделить всё
.CSEG
.ORG $0000
RESET:
LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,HIGH(RAMEND)
OUT SPH,R16
CLR ZH ; в этой программе всегда 0
OUT SPCR,ZH; очистить ячейку признака клавиатуры
RJMP START ; On Reset
;************************************************
.ORG $000E ;Timer/Counter0 Compare Match
COMP_50mks:
RETI
;************************************************
;************************************************
;************************************************
;************************************************
;************************************************
START:
т.к. в настоящее время ассемблер не является для меня основным средством программирования, о вышеупомянутой альтернативе я не могу рассказать многое... но кое-что могу.dimmer писал(а):можно подробнее об альтернативе атмелевскому ассм
Код: Выделить всё
my_vector:
ENTER r0,r1,r17,r16
; тут делаем все, что надо с перечисленными регистрами
LEAVE
reti