Страница 1 из 1
Как организовать связь по RS232 между микроконтроллёром и ПК
Добавлено: Чт дек 06, 2012 22:59:37
frenele
здравствуйте! Итак для того чтобы передать любой массив данных необходимо создать протокол обмена.
Что это такое. Это взаимодействие двух приложений по определённым правилам. Первая программа это терминальное окно на компьютере. В которое пишут сообщения в виде пакета данных. Пример: #kmr01%. Это сообщение(пакет) состоит из 7 символов в ASCII. Суть заключается в следующем. Этот пакет имеет формат. Это первый символ '#' и последний '%'.(Символы можно брать произвольные кроме тех, что внутри пакета). Итак внутри пакета находится тело сообщения. Его размер желательно брать не большим. В этом примере второй символ 'k' указывает, что это команда. Третий 'm'- работа с памятью. И четвертый 'r' - чтение из памяти. А два последний символа '01' - это собственно адрес той ячейки памяти которую мы хотим прочитать. Так вот когда такое сообщение приходит в микроконтроллер. Оно (тело сообщения без символов '#' и '%') помещается в буфер приёма сообщения. После чего выставляется признак(флаг), что сообщение пришло. И другая подпрограмма начинает обрабатывать это сообщение.
Есть один момент при обработке тела сообщения это адрес '01' он передан в ASCII. Железяка ASCII не понимает. Нужен переводчик из ASCII в BIN(бинарный код).
Пример процедуры преобразования для PIC контроллёров.
Спойлер
Код: Выделить всё
;Подпрограмма преобразования ASCII в BIN.
ASCII_BIN:
movfw R5 ;Считываем старшый байт для обработки
movwf R7
movfw R6 ;Считываем младший байт для обработки
movwf R8
movlw 0x41 ;Это >= A?
subwf R5,f
btfsc STATUS,C
goto $+4
movlw 0x30 ;НЕТ - вычтем 30
subwf R7,f
goto $+3
movlw 0x37 ;ДА - вычтем 37
subwf R7,f
swapf R7 ;Переносим в старшую тетраду
movlw 0x41 ;Это >= A?
subwf R6,f
btfsc STATUS,C
goto $+4
movlw 0x30 ;НЕТ - вычтем 30
subwf R8,w
goto $+3
movlw 0x37 ;ДА - вычтем 37
subwf R8,w
iorwf R7,w ;Результат преобразования в аккумуляторе
return
пример кода для AVR микроконтроллёров.
Спойлер
Код: Выделить всё
;Подпрограмма преобразования ASCII в BIN.
ASCII_BIN:
cpi temp0,'A' ;Это >='A'?
brsh PC+3
subi temp0,0x30 ;НЕТ - вычтем 0x30
rjmp PC+2
subi temp0,0x37 ;ДА - вычтем 0x37
swap temp0
cpi temp1,'A' ;Это >='A'?
brsh PC+3
subi temp1,0x30 ;НЕТ - вычтем 0x30
rjmp PC+2
subi temp1,0x37 ;ДА - вычтем 0x37
or temp0,temp1 ;Результат в temp0
ret
Суть преобразования из ASCII и BIN такова. Допустим нам надо перевести '01' ASCII в '01' BIN. '01' в HEXe это '3031'. Это занимает два байта. А нам нужен один байт но с той же по смыслу информацией '01'. Нам надо получить так, что в HEXe эта информация была представлена не как '3031', а '01'. Для этого необходимо вычесть из каждого байта 30 или 37 в зависимости от информации которую несёт один байт данных. А полученные результаты сгруппировать в один байт.
Дело в том что персональный компьютер не понимает другой формат данных. И для использования терминальных окон или других программ осуществляющих обмен данными по интерфейсам необходимо преобразование одного формата в другой. Тобиш из терминальной программы ми отправляем в формате ASCII. Но эти данные не понятны микроконтроллеру. Поэтому в микроконтроллере легче всего осуществить такое преобразование. А при отправка из микроконтроллера в компьютер необходимо обратное преобразование из бинарного в ASCI.
Спойлер
Код: Выделить всё
;Подпрограмма преобразования BIN в ASCII. для PIC микроконтроллеров.
BIN_ASCII:
movwf R5 ;Дублируем отправляемый байт
movwf R6
movlw 0x0F ;Разделим тетрады для подготовки
andwf R5,f ;преобразования в ASCII
swapf R6
andwf R6,f
movlw 0x0A ;Это >= A?
subwf R5,w
btfsc STATUS,C
goto $+4
movlw 0x30 ;НЕТ - прибавим 30
addwf R5,f
goto $+3
movlw 0x37 ;ДА - прибавим 37
addwf R5,f
movfw R6 ;Берём следующюю тетраду
movlw 0x0A ;Это >= A?
subwf R6,w
btfsc STATUS,C
goto $+4
movlw 0x30 ;НЕТ - прибавим 30
addwf R6,f
goto $+3
movlw 0x37 ;ДА - прибавим 37
addwf R6,f ;Результат преобразования в R5 и R6
return
;Подпрограмма преобразования BIN в ASCII для AVR микроконтроллеров
BIN_ASCII:
mov temp1,temp0 ;Дублируем байт
swap temp1
andi temp0,0x0F ;Выделяем младшие тетрады
andi temp1,0x0F
push temp1 ;Прячем в стек
cpi temp0,0x0A ;Это >='A'?
brsh PC+4
ldi temp1,0x30
add temp0,temp1 ;НЕТ - прибавим 0x30
rjmp PC+3
ldi temp1,0x37
add temp0,temp1 ;ДА - прибавим 0x37
pop temp1 ;Востанавливаем из стека
push temp0 ;Прячем в стек
cpi temp1,0x0A ;Это >='A'?
brsh PC+4
ldi temp0,0x30
add temp1,temp0 ;НЕТ - прибавим 0x30
rjmp PC+3
ldi temp0,0x37
add temp1,temp0 ;ДА - прибавим 0x37
pop temp0 ;Востанавливаем из стека
ret
Re: Как организовать связь по RS232 между микроконтроллёром
Добавлено: Чт дек 06, 2012 23:11:05
frenele
Есть такая хорошая книга которая поможет организовать ПО на компьютере, что у вас будет целая лаборатория. Книга называется: "Измерение, управление и регулирование с помощью макросов VBA и Word и Excel. В ней описывается как сделать дизассемблер в Excel, как прочитать память EEPROM и т.д.
Re: Как организовать связь по RS232 между микроконтроллёром
Добавлено: Чт дек 06, 2012 23:13:56
Goldsmith
Не понял, это был вопрос или бесплатная выездная лекция общества "Знание"?
Re: Как организовать связь по RS232 между микроконтроллёром
Добавлено: Пт дек 07, 2012 11:31:18
Jack_A
Goldsmith писал(а):Не понял, это был вопрос или бесплатная выездная лекция общества "Знание"?

+! Кстати, если он уж такой гуру, не может не знать, что МК меж собой по RS232 вязаться не могут - уровни не те - а по UART, SPI, TWI etc.
Re: Как организовать связь по RS232 между микроконтроллёром
Добавлено: Пт дек 07, 2012 11:41:26
ploop
нига называется: "Измерение, управление и регулирование с помощью макросов VBA и Word и Excel
Самое то для розжига мангала для новогоднего шашлыка!

Re: Как организовать связь по RS232 между микроконтроллёром
Добавлено: Пт дек 07, 2012 23:41:17
Goldsmith
ploop писал(а):Самое то для розжига мангала для новогоднего шашлыка!

А если выгравировать эти макросы на кольце всевластия, можно не только сделить дизассемблер в Excel, но и поработить Средиземье.
Re: Как организовать связь по RS232 между микроконтроллёром
Добавлено: Пт дек 07, 2012 23:48:54
DrGandalf
Ничего не понял, но ассемблер он на то и ассемблер, что позволяет не думать о типах данных. Что шлете - то и получаете.
Если вам нужно на стороне МК переводить строки в числа и наоборот, так и говорите

Re: Как организовать связь по RS232 между микроконтроллёром
Добавлено: Сб дек 08, 2012 00:49:16
frenele
Jack_A писал(а):Goldsmith писал(а):Не понял, это был вопрос или бесплатная выездная лекция общества "Знание"?

+! Кстати, если он уж такой гуру, не может не знать, что МК меж собой по RS232 вязаться не могут - уровни не те - а по UART, SPI, TWI etc.
USART - это блок который можно cконкурировать как UART (RS232 с ТТЛ уровнями) или ISP и друдие... всё зависть от возможностей.
Re: Как организовать связь по RS232 между микроконтроллёром
Добавлено: Сб дек 08, 2012 01:00:00
ploop
Re: Как организовать связь по RS232 между микроконтроллёром
Добавлено: Сб дек 08, 2012 01:05:58
frenele
Я написал USART ,а не UART. А в этой статье описывается UART.
Re: Как организовать связь по RS232 между микроконтроллёром
Добавлено: Сб дек 08, 2012 01:09:11
ploop
Many modern ICs now come with a UART that can also communicate synchronously; these devices are called USARTs (universal synchronous/asynchronous receiver/transmitter).
...
и далее по тексту.
Вы правда тролль?
Re: Как организовать связь по RS232 между микроконтроллёром
Добавлено: Сб дек 08, 2012 12:53:35
frenele
Выкладываю кусок программы для PIC контроллеров которая принимает сообщение по RS232 в буфер.
Это обработчик прерывания.
Спойлер
;**********************************************************************
;Приём сообщения от RS232.
RX_USART:
bsf PORTB,0
btfsc f_stat,0 ;Бакс был?
goto RX_1
movfw RCREG
movwf temp
movfw temp ;НЕТ - Это начало сообщения?
xorlw '$'
btfss STATUS,Z
goto RX_next
bsf f_stat,0 ;ДА - Установка признака принятого '$'
movlw 0xF0 ;буфера для приёма сообщения
movwf int_fsr
clrf rx_count ;Очистка счётчика принятых байт
goto RX_next
RX_1:
movfw rx_count ;Не превышен лимит принятых байтов?
xorlw .15
btfsc STATUS,Z
goto RX_error ;ДА-уходим
movfw RCREG ;НЕТ-Проверяем наличие конца сообщения
movwf temp
xorlw '*'
btfsc STATUS,Z ;Это конец сообщения?
goto RX_2 ;ДА
bsf STATUS,7 ;Установка адреса
movfw int_fsr
movwf FSR
movfw temp ;сохраняем сообщение в буфер.
movwf INDF
incf int_fsr,f ;Инкриментируем адрес в буфере приёма
incf rx_count,f ;Инкриментируем счётчик принятых байт
goto RX_next
RX_2:
bsf f_stat,1 ;Установка признака принятого сообщения
bcf RCSTA,4 ;приём запрещём
RX_4:
bcf PORTB,0
bcf f_stat,0 ;Очиска признака принятого '$'
RX_next:
bcf PIR1,5 ;Очиска флага прерывания
return
;----------------------Ощибка принятого сообщения.----------------------
RX_error
clrf rx_count ;Очистка счётчика принятых байт
bcf f_stat,0 ;Очиска признака принятого '$'
goto RX_next
;**********************************************************************
По мере возможности я буду выкладывать коды и для других микроконтроллеров.
Выкладываю подпрограмму которая обрабатывает сообщение для PIC контроллера.
программа разработана и проверена мною лично и не скопирована с какого либо источника.
Спойлер
;Подпрограмма анализа сообщения.
an_con:
bsf STATUS,7 ;Установка начального адреса
movlw 0x90 ;буфера для чтения сообщения
movwf FSR
clrf tx_count ;Очистка счётчика передоваемых байт
movfw INDF ;Это отправка сообщения обратно?
xorlw 'a'
btfsc STATUS,Z
goto init_tx ;ДА - отправляем сообщение обратно.
movfw INDF ;НЕТ - Это работа с памятью?
xorlw 'm'
btfss STATUS,Z
goto $+.10 ;НЕТ - идём дальше.
incf FSR,f ;ДА - Читаем следующий символ.
movfw INDF ;Это чтение из памяти?
xorlw 'r'
btfsc STATUS,Z
goto i_read_m ;ДА - читаем регистор.
movfw INDF ;НЕТ - Это запись в память?
xorlw 'w'
btfsc STATUS,Z
goto writ_bite ;ДА - записываем в регистор.
movfw INDF ;Это читаем ячеёку EEPROM?
xorlw 'e'
btfss STATUS,Z
goto $+.10 ;НЕТ - идём дальше.
incf FSR,f ;ДА - Читаем следующий символ.
movfw INDF ;Это чтение из EEPROM?
xorlw 'r'
btfsc STATUS,Z
goto read_eeprom ;ДА - читаем регистор.
movfw INDF ;НЕТ - Это запись в память?
xorlw 'w'
btfsc STATUS,Z
goto writ_eeprom ;ДА - записываем в регистор.
movfw INDF ;Это читаем ячеёку FLASH?
xorlw 'f'
btfss STATUS,Z
goto $+.10 ;НЕТ - идём дальше.
incf FSR,f ;ДА - Читаем следующий символ.
movfw INDF ;Это чтение из FLASH?
xorlw 'r'
btfsc STATUS,Z
goto read_flash ;ДА - читаем регистор.
movfw INDF ;НЕТ - Это запись в память?
xorlw 'w'
btfsc STATUS,Z
goto writ_flash ;ДА - записываем в регистор.
con_next:
bcf PORTB,0
bcf f_stat,1 ;ДА - Очищаем признак принятого сообщения
bsf RCSTA,4 ;приём разрешен
goto main
;**********************************************************************
;Подпрограмма иницилизации для передачи сообщения обратно в UART.
init_tx:
incf FSR,f ;ДА-Установливаем адрес считывания
decf rx_count,w ;yстановливаем кол-во передоваемых байт
movwf tx_count
goto tx_data ;Идём на передачу данных
;**********************************************************************
;Подпрограмма работы с FLASH.
;---------Чтение значения регистра из FLASH и отправка в UART----------
read_flash:
call read_buf ;Читаем старший символ адреса регистра.
movwf R0
call read_buf ;Читаем младший символ адреса регистра.
movwf R1
movfw R1 ;Установка младшего байта адреса
bsf STATUS, RP1 ;Входим в банк 2
bcf STATUS, RP0
movwf EEADR
bcf STATUS, RP1 ;Входим в банк 0
movfw R0 ;Установка старшего байта адреса
bsf STATUS, RP1 ;Входим в банк 2
movwf EEADRH
bsf STATUS, RP0 ;Входим в банк 3
bsf EECON1, EEPGD ;Разрешение доступа в FLASH
bsf EECON1, RD ;Иницилизировать чтение
nop
nop
bcf STATUS, RP0 ;Входим в банк 2
movfw EEDATA ;Читаем младший байт
bcf STATUS, RP1 ;Входим в банк 0
movwf R0
bsf STATUS, RP1 ;Входим в банк 2
movfw EEDATH ;Читаем старший байт
bcf STATUS, RP1 ;Входим в банк 0
movwf R1
bsf STATUS,7 ;Установка начального адреса
movlw 0x90 ;буфера для отправки сообщения
movwf FSR
clrf tx_count ;Очистка счётчика передоваемых байт
movfw R1 ;Преобразуем из BIN в ASCII
call BIN_ASCII
movfw R6 ;Помещаем 1 байт в буфер
movwf INDF
incf tx_count,f ;Инкрементируем cчётчик передоваемых байт
incf FSR,f ;Инкрементируем адрес в буфере
movfw R5 ;Помещаем 2 байт в буфер
movwf INDF
incf tx_count,f ;Инкрементируем cчётчик передоваемых байт
incf FSR,f ;Инкрементируем адрес в буфере
movfw R0 ;Преобразуем из BIN в ASCII
call BIN_ASCII
movfw R6 ;Помещаем 3 байт в буфер
movwf INDF
incf tx_count,f ;Инкрементируем cчётчик передоваемых байт
incf FSR,f ;Инкрементируем адрес в буфере
movfw R5 ;Помещаем 4 байт в буфер
movwf INDF
incf tx_count,f ;Инкрементируем cчётчик передоваемых байт
bsf STATUS,7 ;Установка начального адреса
movlw 0x90 ;буфера для отправки сообщения
movwf FSR
goto tx_data ;Идём на отправку данных.
;------------------Запись значения в регистр FLASH-----------------
writ_flash:
call read_buf ;Читаем старший символ адреса регистра.
movwf R0
call read_buf ;Читаем младший символ адреса регистра.
movwf R1
call read_buf ;Читаем старший байт для записи.
movwf R2
call read_buf ;Читаем младший байт для записи.
movwf R3
movfw R1 ;Установка младшего байта адреса
bsf STATUS, RP1 ;Входим в банк 2
bcf STATUS, RP0
movwf EEADR
bcf STATUS, RP1 ;Входим в банк 0
movfw R0 ;Установка старшего байта адреса
bsf STATUS, RP1 ;Входим в банк 2
movwf EEADRH
bcf STATUS, RP1 ;Входим в банк 0
movfw R3 ;Установка младшего байта данных
bsf STATUS, RP1 ;Входим в банк 2
movwf EEDATA
bcf STATUS, RP1 ;Входим в банк 0
movfw R2 ;Установка старшего байта данных
bsf STATUS, RP1 ;Входим в банк 2
movwf EEDATH
bsf STATUS, RP0 ;Входим в банк 3
bsf EECON1, EEPGD ;Разрешение доступа в FLASH
bsf EECON1, WREN ;Снимаем защиту от случайной записи
bcf INTCON, GIE ;Глобальные прерывания запрещены
movlw 0x55 ;Начинаем запись байта
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1, WR ;Старт процедуры записи
btfsc EECON1, WR ;Ждём пока запись будет закончина
goto $-1
nop
nop
bcf EECON1, WREN ;Ставим защиту от случайной записи
bsf INTCON, GIE ;Глобальные прерывания разрещены
;------------------------Верификация записи-------------------------
bcf STATUS, RP0 ;Входим в банк 0
bcf STATUS, RP1
movfw R1 ;Установка младшего байта адреса
bsf STATUS, RP1 ;Входим в банк 2
bcf STATUS, RP0
movwf EEADR
bcf STATUS, RP1 ;Входим в банк 0
movfw R0 ;Установка старшего байта адреса
bsf STATUS, RP1 ;Входим в банк 2
movwf EEADRH
bsf STATUS, RP0 ;Входим в банк 3
bsf EECON1, EEPGD ;Разрешение доступа в FLASH
bsf EECON1, RD ;Иницилизировать чтение
nop
nop
bcf STATUS, RP0 ;Входим в банк 2
movfw EEDATA ;Читаем младший байт
bcf STATUS, RP1 ;Входим в банк 0
xorwf R3, W ;Сравниваем
btfss STATUS,Z ;Правильно записан байт?
goto tr_ERR ;НЕТ - неправильно.
bsf STATUS, RP1 ;ДА - Входим в банк 2
movfw EEDATH ;Читаем старший байт
bcf STATUS, RP1 ;Входим в банк 0
xorwf R2, W ;Сравниваем
btfss STATUS,Z ;Правильно записан байт?
goto tr_ERR ;НЕТ - неправильно.
goto tr_OK ;ДА - правильно.
;**********************************************************************
;Подпрограмма работы с EEPROM
;---------Чтение значения регистра из EEPROM и отправка в UART---------
read_eeprom:
call read_buf ;Читаем адрес регистра.
bsf STATUS,6 ;Входим в банк 2
bcf STATUS,5
movwf EEADR
bsf STATUS,5 ;Входим в банк 3
bcf EECON1,7 ;Разрешение доступа в EEPROM
bsf EECON1,0 ;Иницилизировать чтение
bcf STATUS,5 ;Входим в банк 2
nop
movfw EEDATA ;Копируем значение регистра в аккумулятор
bcf STATUS,6 ;Входим в банк 0
call BIN_ASCII ;Преобразуем из BIN в ASCII
bsf STATUS,7 ;Установка начального адреса
movlw 0x90 ;буфера для отправки сообщения
movwf FSR
clrf tx_count ;Очистка счётчика передоваемых байт
movfw R6 ;Помещаем байт в буфер
movwf INDF
incf tx_count,f ;Инкрементируем cчётчик передоваемых байт
incf FSR,f ;Инкрементируем адрес в буфере
movfw R5 ;Помещаем байт в буфер
movwf INDF
incf tx_count,f ;Инкрементируем cчётчик передоваемых байт
bsf STATUS,7 ;Установка начального адреса
movlw 0x90 ;буфера для отправки сообщения
movwf FSR
goto tx_data ;Идём на отправку данных.
;------------------Запись значения в регистр EEPROM-----------------
writ_eeprom:
bsf PORTB,0
call read_buf ;Читаем адрес регистра в EEPROM.
movwf R0
bsf STATUS, RP1 ;Входим в банк 2
movwf EEADR ;Установка адреса регистра в EEPROM
bcf STATUS, RP1 ;Входим в банк 0
call read_buf ;Читаем байт для записи.
movwf R1
bsf STATUS, RP1 ;Входим в банк 2
movwf EEDATA ;Помещаем байт данных для записи
bsf STATUS, RP0 ;Входим в банк 3
bcf EECON1,7
bsf EECON1,2 ;Снимаем защиту от случайной записи
bcf INTCON,7 ;Глобальные прерывания запрещены
movlw 0x55 ;Начинаем запись байта
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,1 ;Старт процедуры записи
btfsc EECON1,1 ;Ждём пока запись будет закончина
goto $-1
bcf EECON1,2 ;Ставим защиту от случайной записи
bsf INTCON,7 ;Глобальные прерывания разрещены
;------------------------Верификация записи-------------------------
bsf EECON1,0 ;Иницилизировать чтения
bcf STATUS, RP0 ;Входим в банк 0
bcf STATUS, RP1
movfw R1
bsf STATUS, RP1 ;Входим в банк 2
xorwf EEDATA, W
bcf STATUS, RP1 ;Входим в банк 0
btfss STATUS,Z ;Правильно записан байт?
goto tr_ERR ;НЕТ - неправильно.
goto tr_OK ;ДА - правильно.
;**********************************************************************
;Подпрограмма работы с оперативной памятью
;и регистрами специального назначения.
;---------------Чтение значения регистра из памяти в UART-------------
i_read_m:
call read_buf ;Читаем старший символ адреса регистра.
movwf R0
call read_buf ;Читаем младший символ адреса регистра.
call adress ;Установка адреса регистра.
movfw INDF ;Берём отправляемый байт
call BIN_ASCII ;Преобразуем из BIN в ASCII
bsf STATUS,7 ;Установка начального адреса
movlw 0x90 ;буфера для отправки сообщения
movwf FSR
clrf tx_count ;Очистка счётчика передоваемых байт
movfw R6 ;Помещаем байт в буфер
movwf INDF
incf tx_count,f ;Инкрементируем cчётчик передоваемых байт
incf FSR,f ;Инкрементируем адрес в буфере
movfw R5 ;Помещаем байт в буфер
movwf INDF
incf tx_count,f ;Инкрементируем cчётчик передоваемых байт
movlw 0x90 ;Установка начального адреса
movwf FSR ;буфера для отправки сообщения
goto tx_data ;Идём на передачу данных
;------------------Запись значения в регистр памяти-------------------
writ_bite:
call read_buf ;Читаем старший символ адреса регистра.
movwf R0
call read_buf ;Читаем младший символ адреса регистра.
movwf R2
call read_buf ;Читаем байт для записи в регистр.
movwf R3
movfw R2 ;Установка адреса регистра.
call adress
movfw R3 ;Записываем байт в регистор.
movwf INDF
goto tr_OK
;**********************************************************************
;Подпрограмма отправки сообщения "OK!" в UART.
tr_OK:
bsf STATUS,7 ;Установка начального адреса
movlw 0x90 ;буфера для отправки сообщения
movwf FSR
clrf tx_count ;Очистка счётчика передоваемых байт
movlw 'O' ;Помещаем символ в буфер
movwf INDF
incf tx_count,f ;Инкрементируем cчётчик передоваемых байт
incf FSR,f ;Инкрементируем адрес в буфере
movlw 'K' ;Помещаем символ в буфер
movwf INDF
incf tx_count,f ;Инкрементируем cчётчик передоваемых байт
incf FSR,f ;Инкрементируем адрес в буфере
movlw '!' ;Помещаем символ в буфер
movwf INDF
incf tx_count,f ;Инкрементируем cчётчик передоваемых байт
movlw 0x90 ;Установка начального адреса
movwf FSR ;буфера для отправки сообщения
goto tx_data ;Идём на отправку данных.
;**********************************************************************
;Подпрограмма отправки сообщения "ERROR!" в UART.
tr_ERR:
bsf STATUS,7 ;Установка начального адреса
movlw 0x90 ;буфера для отправки сообщения
movwf FSR
clrf tx_count ;Очистка счётчика передоваемых байт
movlw 'E' ;Помещаем символ в буфер
movwf INDF
incf tx_count,f ;Инкрементируем cчётчик передоваемых байт
incf FSR,f ;Инкрементируем адрес в буфере
movlw 'R' ;Помещаем символ в буфер
movwf INDF
incf tx_count,f ;Инкрементируем cчётчик передоваемых байт
incf FSR,f ;Инкрементируем адрес в буфере
movlw 'R' ;Помещаем символ в буфер
movwf INDF
incf tx_count,f ;Инкрементируем cчётчик передоваемых байт
incf FSR,f ;Инкрементируем адрес в буфере
movlw 'O' ;Помещаем символ в буфер
movwf INDF
incf tx_count,f ;Инкрементируем cчётчик передоваемых байт
incf FSR,f ;Инкрементируем адрес в буфере
movlw 'R' ;Помещаем символ в буфер
movwf INDF
incf tx_count,f ;Инкрементируем cчётчик передоваемых байт
incf FSR,f ;Инкрементируем адрес в буфере
movlw '!' ;Помещаем символ в буфер
movwf INDF
incf tx_count,f ;Инкрементируем cчётчик передоваемых байт
movlw 0x90 ;Установка начального адреса
movwf FSR ;буфера для отправки сообщения
goto tx_data ;Идём на отправку данных.
;**********************************************************************
;Подпрограмма передачи данных.
tx_data:
movfw INDF ;Отправляем первый байт
tx_data2:
movwf TXREG ;Предаём байт в USART
bsf STATUS,5 ;Входим в банк 1
btfss TXSTA,1 ;Ждём пока передадим байт
goto $-1
bcf STATUS,5 ;Входим в банк 0
incf FSR,f ;Инкриментируем адрес считывания из буфера
decfsz tx_count,f ;Дикрементируем значение счётчика передоваемых байт
goto $+2 ;Всё передали?
goto con_next ;ДА - уходим
movfw INDF ;НЕТ - Берём отправляемый байт
goto tx_data2 ;Идём снова на передачу данных
;**********************************************************************
;Подпрограмма чтения из буфера слова и преобразования из ASCII в BIN.
read_buf:
incf FSR,f ;Читаем два байта из буфера.
movfw INDF
movwf R5
incf FSR,f
movfw INDF
movwf R6
call ASCII_BIN ;Результат преобразования в аккумуляторе
return
;**********************************************************************
;Подпрограмма установки адреса регистра в памяти.
adress:
movwf FSR
btfsc R0,0
bsf STATUS,7
btfss R0,0
bcf STATUS,7
return
;**********************************************************************
Пример подпрограммы обработки принятого сообщения по RS232
Вы либо издеваетесь, либо сознательно игнорируете правила форума .
Напомню:
2.2 Запрещается создание нескольких сообщений подряд в одной теме. Если вы хотите что-то добавить к своему, уже написанному сообщению, воспользуйтесь кнопкой "Правка".
Это последнее предупреждение. Еще такая выходка - получите бан.
ploop