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

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Аватара пользователя
frenele
Родился
Сообщения: 16
Зарегистрирован: Вт дек 04, 2012 23:02:59

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

Сообщение 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
Реклама
Аватара пользователя
frenele
Родился
Сообщения: 16
Зарегистрирован: Вт дек 04, 2012 23:02:59

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

Сообщение frenele »

Есть такая хорошая книга которая поможет организовать ПО на компьютере, что у вас будет целая лаборатория. Книга называется: "Измерение, управление и регулирование с помощью макросов VBA и Word и Excel. В ней описывается как сделать дизассемблер в Excel, как прочитать память EEPROM и т.д.
Реклама
Аватара пользователя
Goldsmith
Опытный кот
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону
Контактная информация:

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

Сообщение Goldsmith »

Не понял, это был вопрос или бесплатная выездная лекция общества "Знание"?
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Goldsmith писал(а):Не понял, это был вопрос или бесплатная выездная лекция общества "Знание"?
:) +! Кстати, если он уж такой гуру, не может не знать, что МК меж собой по RS232 вязаться не могут - уровни не те - а по UART, SPI, TWI etc.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

нига называется: "Измерение, управление и регулирование с помощью макросов VBA и Word и Excel
Самое то для розжига мангала для новогоднего шашлыка! :)
Реклама
Аватара пользователя
Goldsmith
Опытный кот
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону
Контактная информация:

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

Сообщение Goldsmith »

ploop писал(а):Самое то для розжига мангала для новогоднего шашлыка! :)
А если выгравировать эти макросы на кольце всевластия, можно не только сделить дизассемблер в Excel, но и поработить Средиземье.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Реклама
Аватара пользователя
DrGandalf
Встал на лапы
Сообщения: 110
Зарегистрирован: Пн дек 03, 2012 19:31:53
Откуда: Санкт-Петербург

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

Сообщение DrGandalf »

Ничего не понял, но ассемблер он на то и ассемблер, что позволяет не думать о типах данных. Что шлете - то и получаете.
Если вам нужно на стороне МК переводить строки в числа и наоборот, так и говорите :))
Аватара пользователя
frenele
Родился
Сообщения: 16
Зарегистрирован: Вт дек 04, 2012 23:02:59

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

Сообщение frenele »

Jack_A писал(а):
Goldsmith писал(а):Не понял, это был вопрос или бесплатная выездная лекция общества "Знание"?
:) +! Кстати, если он уж такой гуру, не может не знать, что МК меж собой по RS232 вязаться не могут - уровни не те - а по UART, SPI, TWI etc.
USART - это блок который можно cконкурировать как UART (RS232 с ТТЛ уровнями) или ISP и друдие... всё зависть от возможностей.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Ну хоть тут почитайте: http://en.wikipedia.org/wiki/USART
Аватара пользователя
frenele
Родился
Сообщения: 16
Зарегистрирован: Вт дек 04, 2012 23:02:59

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

Сообщение frenele »

ploop писал(а):Ну хоть тут почитайте: http://en.wikipedia.org/wiki/USART
Я написал USART ,а не UART. А в этой статье описывается UART.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Many modern ICs now come with a UART that can also communicate synchronously; these devices are called USARTs (universal synchronous/asynchronous receiver/transmitter).
...
и далее по тексту.
Вы правда тролль?
Аватара пользователя
frenele
Родился
Сообщения: 16
Зарегистрирован: Вт дек 04, 2012 23:02:59

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

Сообщение 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
Вложения
monitor.txt
Пример подпрограммы обработки принятого сообщения по RS232
(13.65 КБ) 248 скачиваний
Ответить

Вернуться в «Интеграция с ПК»