[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
;************************************************************************
;Подпрограмма проверки принятого байта
;************************************************************************
;Принятый байт отправляем обратно в комп, ждем его ответа.
;Когда приходит ответ сравниваем его с ранее полученным значением
;(вычитаем их- если получился 0 то все нормально), если получилось
;правильно то копируем полученный сигнал в регистр RX, если не сошлось
;отправляем NAK и выходим без сохранения информации
;************************************************************************
RX:
in tempRX,UDR
mov tempA,tempRX
subi tempRX,0b10000000 ;проверка допустимости принятого из
breq RX_test1
mov tempRX,tempA ;порта числа
subi tempRX,0b01000000
breq RX_test1
mov tempRX,tempA
subi tempRX,0b00100000
breq RX_test1
mov tempRX,tempA
subi tempRX,0b00010000
breq RX_test1
mov tempRX,tempA
subi tempRX,0b00001000
breq RX_test1
mov tempRX,tempA
subi tempRX,0b00000100
breq RX_test1
mov tempRX,tempA
subi tempRX,0b00000010
breq RX_test1
mov tempRX,tempA
subi tempRX,0b00000001
breq RX_test1
ldi temp,NAK ;если число недопустимо, отправили NAK
out UDR,temp ;и выходим из прерывания без сохранения
reti ;результатов
RX_test1:
out UDR,tempA ;проверочное запуливание в порт
ldi temp,0 ;очищаем таймер 1
out TCNT1H,temp
out TCNT1L,temp
ldi temp,0b00000101 ;включаем таймер 1, тактируем от СК/1024
out TCCR1B,temp
RX_test: ;LOOP
sbic USR,7 ;LOOP Ждем ответа компа или окончания TIME OUT
rjmp RX_test2 ;бит пришел
in tempRX,TIFR
sbrc tempRX,4
rjmp Fal_RX ;кончился Time Out
rjmp RX_test
;End LOOP
Fal_RX: ;Выход по окончанию времени ожидания
ldi temp,0b00000000 ;выключаем таймер 1
out TCCR1B,temp
in temp,TIFR ;сброс
sbr temp,4 ;флага
out TIFR,temp ;совпадения
ldi temp,0xF1
out UDR,temp
reti
RX_test2:
;Проверка пришедшего ответного байта
ldi temp,0b00000000 ;выключаем таймер 1
out TCCR1B,temp
in tempRX,UDR
sub tempA,tempRX
brne RXnoCOMPL
ldi temp,0xF2 ;подтверждение записи в RX
out UDR,temp
mov RX,tempRX ;и выход с заполненным RX
reti
RXnoCOMPL: ;Выход по несовпадению первого и
ldi temp,0b00000000 ;второго принятого битов
out TCCR1B,temp ;выключаем таймер 1
ldi temp,0xF3 ;send NAK
out UDR,temp
reti
Проблема в том что иногда (почти всегда) УАРТ неправильно принимает и передает числа, похоже что он начинает передавать (или принимать?) числа как девятибитные. Кварц подходит четко (1,843 МГц), инициализирую в начале программы так:
init_uart:
ldi temp,0b10011000 ;8 bit, RX TX enable, RX complit int enable
out UCR,temp
ldi temp,11 ;9600 bps Fclk=1.8432 Mhz
out UBRR,temp
Если еще раз инициализирую УАРТ перед отправкой в каждом конкретном место то все равно не помогает.
Принимаю ТЕЛЕМАКСОМ (8 бит данных, четности нет, 1 стоп бит)
E-mail: info@telesys.ru