Есть n-ое значение в регистре, а в двух других верхний и нижний предел.
Нужно проверить, находится ли значение байта между нижним и верхним пределом. Если находится, то ничего не делать а если нет, то узнать по какому из них не проходит.
ИМХО и так и так не правильноFreshMan писал(а): я встречал две формы оформления
когда следует применять первую, когда вторую, а когда только вторую ?
Код: Выделить всё
.include "m8def.inc"
.cseg
.org 0
RJMP RESET
.org OC2addr
RJMP DO_PWM
.org OC1Aaddr
RJMP FIFTY_MS
.org URXCaddr
RJMP UART_RX
.org UTXCaddr
RJMP UART_TX
.org INT_VECTORS_SIZE
RESET:
CLI
CLR ZERO
OUTI SPL,Low(RAMEND)
OUTI SPH,High(RAMEND)
[...]
Нет, конечноFreshMan писал(а):вектор прерывания занимает 2 байта ?
припустим я юхаем атмегу16 и обработчик лежит в пределах 4ксловEngineer_Keen писал(а):у жирных мег (от 16к флеша) переходы на обработчики делаются по JMP, соответственно сами вектора 4 байтные.
Конечно.FreshMan писал(а):могу я в этом случае применить rjmp ?
Код: Выделить всё
LDI r16,high(ramend)
OUT SPH,r16
LDI r16,low(ramend)
OUT SPL,r16
clr temp ; USART: 115200, 8-N-1
STS UBRR0H,temp
ldi temp,NB
STS UBRR0L,temp
ldi temp,(1<<RXEN0)|(1<<TXEN0)
STS UCSR0B,temp
ldi temp,(1<<UCSZ00)|(1<<UCSZ01)
STS UCSR0C,temp
LDs R16, UCSR0A
; ===========
; delay loop generator
; 88472000 cycles:
; -----------------------------
; delaying 49939965 cycles:
ldi R22, $FF
WGLOOP0: ldi R23, $FF
WGLOOP1: ldi R24, $FF
WGLOOP2: dec R24
brne WGLOOP2
dec R23
brne WGLOOP1
dec R22
brne WGLOOP0
; -----------------------------
; delaying 38531763 cycles:
ldi R22, $FB
WGLOOP3: ldi R23, $D7
WGLOOP4: ldi R24, $ED
WGLOOP5: dec R24
brne WGLOOP5
dec R23
brne WGLOOP4
dec R22
brne WGLOOP3
; -----------------------------
; delaying 270 cycles:
ldi R22, $5A
WGLOOP6: dec R22
brne WGLOOP6
; -----------------------------
; delaying 2 cycles:
nop
nop
; ===========
sbrs R16, RXC0
LDS R16,UDR0
cpi r16,'?'
jmp $0
rjmp $1f10
Код: Выделить всё
LDs R16, UCSR0A ;ок, нормально
sbrs R16, RXC0 ;тоже верно
LDS R16,UDR0 ;а вот задержку ожидания приема делают не так, есть же пример в даташите! перед этой строкой должен быть переход на повторное чтение флага
cpi r16,'?' ;ок, приняли, сравнили,
jmp $0 ;почему безусловный переход в 0? сравнивали мы для чего? тут либо BRNE либо BREQ, либо любая другая подходящая BRxx
rjmp $1f10 ;эта строка никогда не выполнится из-за предидущей
Код: Выделить всё
WAIT_RX:
LDS R16, UCSR0A
SBRS R16, RXC0
RJMP WAIT_RX
LDS R16,UDR0
CPI r16,'?'
BRNE WAIT_RX ;ну или где вам там ждать надо...
RJMP $1f10
Спасибо! Извините, что не в ту тему влез!Engineer_Keen писал(а):Код: Выделить всё
WAIT_RX: LDS R16, UCSR0A SBRS R16, RXC0 RJMP WAIT_RX LDS R16,UDR0 CPI r16,'?' BRNE WAIT_RX ;ну или где вам там ждать надо... RJMP $1f10