Прием смс по USART и сохранение

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 107
Зарегистрирован: Ср авг 05, 2015 19:34:20

Сообщение siimao »

Добрый день! И с большими праздниками!!!

Попробовал написать маааленькую программу, которая бы принимала строку по прерыванию по 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?

Благодарен за ответы.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Поглядите в ДШ размещение таблицы векторов прерываний.
Нет инициализации указателя стека.
В обработчике прерываний нет сохранения и восстановления используемых регистров.

Это так, на вскидку.

Протеус наверняка кучу сообщений выдал о ненормальной работы программы МК.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 107
Зарегистрирован: Ср авг 05, 2015 19:34:20

Сообщение siimao »

Протеус ошибки не выдавал, т.к. все объявлено и инициализировано.
Ошибку, наконец-то, могу описать.
В первую ячейку RamStart всегда вписывается порядковый номер принятого символа. Например:
1. передаю символ d, порт отражает 1 в младшем разряде 0000 0001
2. следом передаю символ a, порт отражает 2 в младшем разряде 0000 0010 потом d и потом a
3. следом передаю символ f, порт отражает 3 в младшем разряде 0000 0011 потом d и потом a и потом f ...
Понимаю, что решение - чтение по адресу RamStart+1, но интересно где в алгоритме ошибка.
Алгоритм прилагаю.
Спасибо за ответы.

Добавлено after 1 hour 29 minutes 24 seconds:
Уточняю.
Идет не перебор принятых символов, а теряется первый символ, вместо которого записывается количество принятых байт (значение переменной RX_Count). Т.е. теряется первый принятый символ - байт.

Решено. Работает, как написал :). Введу определение адреса перед выделением памяти.
Всем спасибо.
Ответить

Вернуться в «AVR»