mazur (27.02.2011 13:11, просмотров: 210) ответил mazur на Ни хрена понять не могу. То ли лыжи не едут. Уже давно использую следующие куски кода -> А сегодня не могу понять, почему не работает тот же принцип.
Решил. Флаги I, T не трогаем. Вдруг задействованы. Флаг Z устанавливаем. Флаг C, в зависимости от надобности, сбрасываем или устанавливаем. Все остальное сбрасываем. Итог-регистр SREG подготовлен к любым манипуляциям.
in r16,SREG
andi r16,0b11000010
sbr r16,1<<SREG_Z | 1<<SREG_C
mov RSREG,r16
System_Timer_Cycle:
ld r16,X
out SREG,RSREG
adc r16,RCLR
in RSREG,SREG
st X+,r16
dec CNT
brne System_Timer_Cycle
Process_Inputs_Change:
Set_State _PROCESS_INPUTS,_PROCESS_INPUTS_NONE
cbr FLAGS,1<<INPUTS_CHANGE_FLG
ldix (INPUTS_CURRENT+INPUTS_BYTES_LENGHT)
ldiz (Table_Inputs*2)
Process_Inputs_Change_Cycle:
lpm r16,Z+
cp r16,RSER
lpm r16,Z
cpc r16,RSER
breq Process_Inputs_Change_End
sbiw ZL,1
ldi CNT,INPUTS_BYTES_LENGHT
in r16,SREG
andi r16,0b11000010
sbr r16,1<<SREG_Z
mov RSREG,r16
Process_Inputs_Change_Cycle_0:
lpm r16,Z+
ld r17,-X
out SREG,RSREG
cpc r16,r17
in RSREG,SREG
dec CNT
brne Process_Inputs_Change_Cycle_0
out SREG,RSREG
breq Process_Inputs_Equal
adiw ZL,2
adiw XL,INPUTS_BYTES_LENGHT
rjmp Process_Inputs_Change_Cycle
Process_Inputs_Equal:
lpm r17,Z+
lpm r16,Z
movw ZH:ZL,r17:r16
ijmp
Process_Inputs_Change_End:
ret