[an error occurred while processing this directive] [an error occurred while processing this directive]
Не могу устойчиво связаться с компьютером по RS-232 ?(ATmega103) (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Altair 29 сентября 2001 г. 16:57

;************************************************************************
;Подпрограмма проверки принятого байта
;************************************************************************
;Принятый байт отправляем обратно в комп, ждем его ответа.
;Когда приходит ответ сравниваем его с ранее полученным значением
;(вычитаем их- если получился 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