Добрый день! И с большими праздниками!!!
Попробовал написать маааленькую программу, которая бы принимала строку по прерыванию по USART и записывала ее в RAM. Проверку записи выполняю в основном теле программы. Кристалл ATtiny2313. Симулирую в Протеусе.
1) Что такое непонятные символы по приему, чередующиеся с отправленными?
Строгое появление символов не зависит от скорости набора на клавиатуре.
https://yadi.sk/i/iqytb96G3Hs9muПорт отражает не те данные, что записаны. Или не то записывает. Или не туда смотрю...
Сам, собственно, урезанный Код:
.DSEG
RX_Count: .byte 1
.CSEG
; ***** INTERRUPT VECTORS ************************************************
rjmp reset
rjmp RX_OK ;URXCaddr = 0x0007 ; USART, Rx Complete
Main:
sei
NOP ; Любой произвольный код главной программы
rcall long_delay
;После чего спокойно выполняем любой другой код.
;??????? Проверка факта записи в RAM????????????????????????????????
clr ZH
ldi ZL,RamStart
ldi temp3,8 ;Проверка 8 символов
v:
ld temp5,Z+
out PortB,temp5 ;вывод в порт
rcall long_delay
dec temp3 ;Is temp3 zero?
brne v ;if not, read next byte.
rjmp Main
RX_OK: ;ISR по приему
clr XH
ldi XL,RamStart ;Адрес RAM куда складываем строку
lds temp,RX_Count ;Скопируем смещение
add XL,temp ;Прибавляем смещение к адресу RAM
;clr temp2
;adc XH,temp2
cbi UCSRB, RXCIE ;Clear Interrupts
in temp2,UDR
st X,temp2
inc temp
sts RX_Count,temp
sbi UCSRB, RXCIE
reti
Где ошибка порылась?
Возможно ли на 2313 реализовать буфер для приема по USART?
Благодарен за ответы.