Страница 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
Ну хоть тут почитайте: http://en.wikipedia.org/wiki/USART

Re: Как организовать связь по RS232 между микроконтроллёром

Добавлено: Сб дек 08, 2012 01:05:58
frenele
ploop писал(а):Ну хоть тут почитайте: http://en.wikipedia.org/wiki/USART
Я написал 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