кстати, команда lmp работает только с регистрами Z и R0 ?
по другому никак ?
LMP?FreshMan писал(а):lmp работает только с регистрами Z и R0 ?
о....., да сориGudd-Head писал(а):LMP? Может, LPM?
Код: Выделить всё
;****************************************************
; ОБРАБОТЧИК ПРЕРЫВАНИЯ КОМПАРАТОРА
;****************************************************
Timer1_comp1:
ldi Temp,0 ;обнуление таймера
out TCNT1H,Temp
out TCNT1L,Temp
cpi Temp1,30 ;сравнить с крайним знач.
breq Init ;если равно - загрузка нач. знач.
ReadArray:
ldi ZH,High(Array*2) ;загрузка начального адреса массива
ldi ZL,Low(Array*2)
ldi Temp,0 ;прибавление внутр. адреса
add ZL,Temp1
adc ZH,Temp
lpm ;загрузка из ПЗУ
mov Temp,R0 ;копирование в РОН
inc Temp1 ;увеличение внутр. адреса
rjmp Output ;перейти на вывод в порт
Init: ldi Temp1,0 ;загрузить нач. значение
rjmp ReadArray
Output: out PortB,Temp ;вывод в порт
reti ;выход из обработчика
Array:
.db 0b10000001,0b01000010
.db 0b00100100,0b00011000
.db 0b00011000,0b00111100
.db 0b01111110,0b11111111
.db 0b11100111,0b11000011
.db 0b10000001,0b11000001
.db 0b11100001,0b11110001
.db 0b11111001,0b11111101
.db 0b11111111,0b01111111
.db 0b00111111,0b00011111
.db 0b00001111,0b00000111
.db 0b00000011,0b00000001
.db 0b00000011,0b00000101
.db 0b00001001,0b00010001
.db 0b00100001,0b01000001Код: Выделить всё
ldi Temp,0 ;прибавление внутр. адреса
add ZL,Temp1
adc ZH,TempКод: Выделить всё
ldi Temp,0 ;прибавление внутр. адреса
adс ZL,Temp1
add ZH,Tempкоманда ADC прибавляет флаг переноса, т.е. "1", если с младшими случается переполнение, поэтому к старшему нужно прибавить "0" именно командой ADC, а если прибавим командой ADD, то в случае переполнения младших старшему ничего не перепадет.FreshMan писал(а): для меня непонятны следующие строкипочему делается именно так , а не скажем вот так ?Код: Выделить всё
ldi Temp,0 ;прибавление внутр. адреса add ZL,Temp1 adc ZH,TempКод: Выделить всё
ldi Temp,0 ;прибавление внутр. адреса adс ZL,Temp1 add ZH,Temp
После такого мальца спутники мимо Венеры пролетают.FreshMan писал(а):мальца ошибся
а что будет когда со старшим случится переполнение ?zero648 писал(а):команда ADC прибавляет флаг переноса, т.е. "1", если с младшими случается переполнение
неа....., счас я занимаюсь голым ремонтомpyzhman писал(а): А то такое ощущение, что голой теорией занимаетесь.
Так правильнее.FreshMan писал(а):команда ADC прибавляет флаг переноса, т.е. "1", если с предыдущим случается переполнение
Ничего, просто флаг С опять установится.а что будет когда со старшим случится переполнение ?
Это в скобках, а что будет после применения модификатора или как его там LOW() и HIGH()?Alexeyslav писал(а): Причем, <метка>*2 адресует один байт, а <метка>*2+1 адресует следующий байт. Поэтому у вас в примере ошибка - старшая и младшая часть слова у вас будут равны одному и тому же байту из памяти.
с того самого, откуда ушла в обработчик прерывания. Например:с какого места
называть можно как угодно, главное - соблюдать адреса.обозвать прерывания
Даже и смотреть не станем, пока не научитесь называть константы осмысленно.В чем может быть причина?


Код: Выделить всё
ldi r16, 0b10100010
ldi r16, (1<<ISC01)|(1<<SM1)|(1<<SE)