Приложение А: программа 11x1_SIRC.s43.txt
;*****************************************************************************
; ЭТА ПРОГРАММА ПОСТАВЛЯЕТСЯ В ВИДЕ "КАК ЕСТЬ". КОМНАИЯ TI НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ
; И НЕ НЕСЕТ НИКАКОЙ ОТВЕТСТВЕННОСТИ ЗА ВОЗМОЖНЫЕ НЕТОЧНОСТИ
; РАБОТЫ ИЛИ НЕПРАВИЛЬНОСТЬ РАБОТЫ ПРОГРАММЫ.
; ПРИ КОММЕРЧЕСКОМ ИСПОЛЬЗОВАНИИ ДАННОЙ ПРОГРАММЫ
; КОМПАНИЯ TI ОТКАЗЫВАЕТСЯ ОТ АВТОРСТВА И СНИМАЕТ
; С СЕБЯ ВСЯКУЮ ОТВЕТСТВЕННОСТЬ.
;
; КОМПАНИЯ TI ОТКАЗЫВАЕТСЯ ОТ ЛЮБЫХ ГАРАНТИЙ В ОТНОШЕНИ ТОГО,
; ЧТО ПРОГРАММА НЕ МОЖЕТ ПРИНИСТИ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ИЛИ
; ПОТЕРЮ ДОВЕРИЯ ИЛИ ПРИБЫЛИ
; ПРИ ИСПОЛЬЗОВАНИИ ЕЕ ТЕОРИИ ИЛИ АЛГОРИТМОВ.
; ОТВЕТСТВЕННОСТЬ ПРИ КОММЕРЧЕСКОМ ИСПОЛЬЗОВАНИИ
; ДАННОЙ ПРОГРАММЫ ПОЛНОСТЬЮ ЛЕЖИТ НА ЛИЦЕ, ИСПОЛЬЗОВАВШЕМ
; ДАННУЮ ПРОГРАММУ
;
; Если не указано иное, программа, созданная компанией
; Texas Instruments поставляется на условиях "свободно распространяемого программного обеспечения".
; Вы можете свободно изменять программу без всяких ограничений
; Передавать программу третьим лицам можно только при
; доведении до их сведений этих условий и при
; его согласии с этими условиями.
; Вы должны приводить лицензию в каждой копии или частичной копии.
;
; Вы признаете и соглашаетесь, что Программа содержит
; защищенный авторским правом материал, коммерческую тайну и другую частную информацию
; компании TI и защищена в соответствии с законами об авторском праве,
; международным соглашением об авторском праве и законом о коммерческой тайне, а так же
; законом об охране интеллектуальной собственности. Для защиты авторских прав компании TI
; Вы соглашаетесь не де компилировать, перерабатывать,
; или преобразовывать программу
; к удобочитаемому виду. Вы соглашаетесь
; ни в коем случае не изменять и не удалять внесенную в программу информацию
; об авторском праве. Компания TI оставляет за собой все права,
; не оговоренные в данной лицензии. Кроме
; того, что оговорено в данной лицензии, не может рассматриваться
; при возможном судебном разбирательстве.
;
; Вы не можете использовать программу для микроконтроллеров, которые не производит компания TI.
;
#include ”msp430x11x1.h”
;*****************************************************************************
; MSP–FET430X110 Demo –SIRC декодер, передающий принятые команды ИК систем ДУ в ПК на скорости 2400 бод
;
; Описание: Декодирование 12– битных SIRC команд ИК систем ДУ при помощи таймера Timer_A.
; CCR1 таймера Timer_A используется для декодирования ИК пакетов, режим захвата используется для измерения длительности ИК бита.
; Принятые пакеты передаются в ПК при помощи модуля CCR0 таймера Timer_A, работающего в качестве UART.
; Пакеты передаются в виде 4 ACII байтов, содержащих символы CR и LF.
; Если принята команда "channel+", то на выводе P1.0 устанавливается высокий уровень, а если любая другая – то низкий.
; ИК данные принимаются младшим значащим битом вперед. Сначала передается старт-бит, а потом – 12 бит данных:
; D4–D3–D2–D1–D0–C6–C5–C4–C3–C2–C1–C0–Start
;
; Демонстрация с помощью ИК монитора – переданные ИК данные содержат символы CR, LF и 4 ASCII байта
;
; MSP430F1121
; –––––––––––––––––
; /|\ | XIN|–
; | | | 32 кГц
; ––|RST XOUT|–
; | |
; IR Receiver –> |P1.2/CCR1 P1.0|––> LED0
; | P1.1 |––> 2400 8N1
;
; Длительности битов
; Start = 2.4 мс ~ 79 при ACLK = 32 кГц
; 1 = 1.2 мс низкий
; 2 = 0.6 мс низкий
; sync = 0.6 мс высокий
;
; sync snyc snyc snyc
; –––+ +––– +––– +––– +––+ +–––––
; | | | | | | | | | |
; +––––\\––––+ –––+ ––––––+ –––+ +–––––––––+
; ^ 0 ^ 1 ^ 0 ^ Start ^
;
; Используемые регистры
#define RXTXData R4
#define BitCnt R5
#define IRData R6
#define IRBit R7
#define IRlength R8
;
; Для того, чтобы скорость обмена данными по UART была 2400 бод необходимо, чтобы ACLK = 32768
Bitime_5 equ 06 ; .длина 5 бит + небольшая подстройка.
Bitime equ 014 ; при длине бита 427 мкс скорость ~ 2341 бод
;
IR_Mid equ 49 ; 1500 мкс при ACLK=32768 Гц
IR_Start equ 75 ; 2300 мкс при ACLK=32768 Гц
IR_Start2 equ 82 ; 2500 мкс при ACLK=32768 Гц
;
LED0 equ 001h ; LED0 на выводе P1.0
TXD equ 002h ; TXD подключается к выводу P1.1
IRIN equ 004h ; Вход ИК данных - P1.2
Ch_up equ 16 ;
Ch_dwn equ 17 ;
LF equ 0ah ; Символ LF (перевод строки) в ASCII коде
CR equ 0dh ; Символ CR (возврат каретки) в ASCII коде
;
; Автор: M. Buccini
; Компания Texas Instruments, Inc
; Июль 2001
;*****************************************************************************
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
ORG 0F000h ; Начало программы
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
RESET
mov.w #0300h,SP ; Инициализация указателя стека микроконтроллеров серии ’x112x
call #Init_Sys ; Инициализация системных периферийных устройств
;
Mainloop
call #IR_Ready ; Подготовка ИК декодера
bis.w #LPM0,SR ; Вход в режим LPMx, остановка, снижение потребления
call #TXIR_2_PC ; Передача принятой команды
call #LED_Disp ; Приняли команду "Channel +/–"
jmp Mainloop ;
;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Init_Sys; Инициализация системных периферийных устройств
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
StopWDT
mov.w #WDTPW+WDTHOLD,&WDTCTL ; Остановка сторожевого таймера
SetupTA
mov.w #TASSEL0+MC1,&TACTL ; ACLK, продолжение
SetupC0
mov.w #OUT,&CCTL0 ;
SetupP1
bis.b #IRIN+TXD,&P1SEL ; P1.2 CCR1, P1.1 CCR0
bis.b #LED0+TXD,&P1DIR ; P1.0, TXD выходы
bic.b #LED0,&P1OUT ; P1.0, низкий, светодиод выключен
eint ;
ret ; Выход из подпрограммы
;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
IR_Ready; Подпрограмма подготовки к принятию 12- битных SIRC (последовательных ИК команд) в буфер IRData
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
clr.w IRData ;
clr.w IRlength ;
mov.b #14,IRBit ; Два начальных фронта и 12 информационных бит
SetupC1
mov.w #CM1+SCS+CAP+CCIE,&CCTL1 ; CAP CCI1A, спадающий фронт, прерывание
ret ; Выход из подпрограммы
;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
TXIR_2_PC; Подпрограмма передачи в ПК символов CR, LF и данных IRData в виде четырех ASCII байтов
; R15 используется в качестве рабочего регистра, но его состояние не сохраняется
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
mov #CR,RXTXData ; пересылка символа CR в буфер UART
call #TX_Byte ; символ CR ––> ПК/пользователю
mov #LF,RXTXData ; пересылка символа LF в буфер UART
call #TX_Byte ; символ ––> ПК/пользователю
;
TX_Word_ASCII ; Передача слова из регистра IRData в виде четырех ASCII байт
swpb IRData ; IRData = 3412
call #TX_Byte_ASCII ;
swpb IRData ; IRData = 1234
;
TX_Byte_ASCII ; Передача байта из регистра IRData в виде двух ASCII байт
mov.b IRData,R15 ; передача значения ..x.
call #NUM_ASCIR ;
mov.b IRData,R15 ; передача значения ...x
jmp NUM_ASCIA ;
;
NUM_ASCIR
rrc.b R15 ; путь 1. и 3.
rrc.b R15 ;
rrc.b R15 ;
rrc.b R15 ;
;
NUM_ASCIA
and.b #0fh,R15 ; путь 2. и 4.
add.b #030h,R15 ;
cmp.b #03ah,R15 ;
jlo NUM_End ;
add.b #039,R15 ;
NUM_End
mov.b R15,RXTXData ; загрузка буфера передачи
;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
TX_Byte; Подпрограмма передачи байта из буфера RXTXData при помощи CCR0 UART
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
mov.w &TAR,&CCR0 ; Текущее состояние счетчика TA
add.w #Bitime,&CCR0 ; Временной интервал до первого бита
bis.w #0100h, RXTXData ; Добавление единичного стопового бита в регистр RXTXData
rla.w RXTXData ; Добавление нулевого стартового бита
mov.w #10,BitCnt ; Загрузка счетчика битов, 8 бит данных + SP
mov.w #OUTMOD0+CCIE,&CCTL0 ; TXD = 1 = idle
TX_Wait
tst.w BitCnt ; Ожидание окончания передачи
jnz TX_Wait ;
ret ;
;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
TA0_ISR ; Буфер RXTXData содержит данные UART
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
add.w #Bitime,&CCR0 ; Время до следующего бита
UART_TX
bic.w #OUTMOD2,&CCTL0 ; Принятие единицы
rra.w RXTXData ; LSB сдвигается в бит переноса
jc TX_Test ; Переход ––> бит = 1
TX_Space
bis.w #OUTMOD2,&CCTL0 ; Прием нуля
TX_Test
dec.w BitCnt ; Все биты переданы (приняты)?
jnz TX_Next ; Следующий бит?
bic.w #CCIE,&CCTL0 ; Все биты переданы/приняты, блокировка прерываний.
TX_Next
reti ;
;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
TAX_ISR; Подпрограмма обработки прерываний от CCR1–4 и по переполнению
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
add.w &TAIV,PC ; Добавление к регистру таймера Timer_A вектора смещения
reti ; CCR0 не является источником
jmp TA1_ISR ; CCR1
jmp TA2_ISR ; CCR2
; reti ; CCR3 не используется
; reti ; CCR4 не используется
;TA_over
reti ; Переполнение TA – не используется
;
TA1_ISR
mov.w #CM0+SCS+CAP+CCIE,&CCTL1 ; CAP CCI1A, спадающий фронт, прерывание
IR_ST_Test
push.w &CCR1 ; Временно сохраняем в стеке содержимое CCR1
sub.w IRlength,0(SP) ; Время от последнего захвата
cmp.b #14,IRBit ; Первый спадающий фронт?
jeq IR_Next ; Переход ––> первый спадающий фронт
cmp.b #13,IRBit ; Стартовый бит?
jne IR_Bit ; Переход ––> не стартовый бит
; cmp.w #IR_Start2,0(SP) ; Стартовый бит > 2.5 мс
; jge IR_error ; Переход ––> IRlength > 2.5 мс
cmp.w #IR_Start,0(SP) ; Минимальный стартовый бит ~ 2.3 мс
jge IR_Next ; Переход ––> IRlength > 2.3 мс
IR_error incd.w SP ; Очистка верхушки стека
call #IR_Ready ; Ошибка – перезапуск принятой последовательности
reti ; Выход из прерывания
;
IR_Bit
cmp.w #IR_Mid,0(SP) ; C=1 если принятый бит ИК данных = 1
IR_Shift
rrc.w IRData ; Бит переноса –> регистр IRData
IR_Next
mov.w &CCR1,IRlength ; Сохранение захваченного фронта
incd.w SP ; Очистка верхушки стека
dec.b IRBit ;
jnz IR_Cont ; Переход ––> не последний бит
IR_Comp
clr.w &CCTL1 ; Отключение CCR1
rrc.w IRData ; 12– битные IRData выровнены по правому краю
rrc.w IRData ;
rrc.w IRData ;
rrc.w IRData ;
and.w #0FFFh,IRData ; Изолирование 12– битного пакет
mov.w #GIE,0(SP) ; Декодированный байт = активному в основной программе
IR_Cont
reti ;
;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
LED_Disp; Включение светодиода (P1.0) если принятые ИК данные соответствуют коду команды "Channel+" (16)
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
and.w #07Fh,IRData ; Изолирование 7– битного кода команды
LED_off
bic.b #01h,&P1OUT ; Выключение светодиода
LED0_tst
cmp.w #Ch_up,IRData ; Проверка на соответствие кобу команды "Channel+" (32)
jne LED_exit ;
bis.b #01h,&P1OUT ; Включение светодиода
LED_exit
ret ; Выход из подпрограммы
;
;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
; Используемые вектора прерываний
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
ORG 0FFFEh ; Вектор сброса MSP430
DW RESET ;
ORG 0FFF2h ; Вектор прерывания от таймера Timer_A0
DW TA0_ISR ;
ORG 0FFF0h ; Вектор прерываний от таймеров Timer_AX
DW TAX_ISR ;
END
Приложение В: программа 11x1_RC5.s43.txt
;*****************************************************************************
; ЭТА ПРОГРАММА ПОСТАВЛЯЕТСЯ В ВИДЕ "КАК ЕСТЬ". КОМНАИЯ TI НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ
; И НЕ НЕСЕТ НИКАКОЙ ОТВЕТСТВЕННОСТИ ЗА ВОЗМОЖНЫЕ НЕТОЧНОСТИ
; РАБОТЫ ИЛИ НЕПРАВИЛЬНОСТЬ РАБОТЫ ПРОГРАММЫ.
; ПРИ КОММЕРЧЕСКОМ ИСПОЛЬЗОВАНИИ ДАННОЙ ПРОГРАММЫ
; КОМПАНИЯ TI ОТКАЗЫВАЕТСЯ ОТ АВТОРСТВА И СНИМАЕТ
; С СЕБЯ ВСЯКУЮ ОТВЕТСТВЕННОСТЬ.
;
; КОМПАНИЯ TI ОТКАЗЫВАЕТСЯ ОТ ЛЮБЫХ ГАРАНТИЙ В ОТНОШЕНИ ТОГО,
; ЧТО ПРОГРАММА НЕ МОЖЕТ ПРИНИСТИ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ИЛИ
; ПОТЕРЮ ДОВЕРИЯ ИЛИ ПРИБЫЛИ
; ПРИ ИСПОЛЬЗОВАНИИ ЕЕ ТЕОРИИ ИЛИ АЛГОРИТМОВ.
; ОТВЕТСТВЕННОСТЬ ПРИ КОММЕРЧЕСКОМ ИСПОЛЬЗОВАНИИ
; ДАННОЙ ПРОГРАММЫ ПОЛНОСТЬЮ ЛЕЖИТ НА ЛИЦЕ, ИСПОЛЬЗОВАВШЕМ
; ДАННУЮ ПРОГРАММУ
;
; Если не указано иное, программа, созданная компанией
; Texas Instruments поставляется на условиях "свободно распространяемого программного обеспечения".
; Вы можете свободно изменять программу без всяких ограничений
; Передавать программу третьим лицам можно только при
; доведении до их сведений этих условий и при
; его согласии с этими условиями.
; Вы должны приводить лицензию в каждой копии или частичной копии.
;
; Вы признаете и соглашаетесь, что Программа содержит
; защищенный авторским правом материал, коммерческую тайну и другую частную информацию
; компании TI и защищена в соответствии с законами об авторском праве,
; международным соглашением об авторском праве и законом о коммерческой тайне, а так же
; законом об охране интеллектуальной собственности. Для защиты авторских прав компании TI
; Вы соглашаетесь не де компилировать, перерабатывать,
; или преобразовывать программу
; к удобочитаемому виду. Вы соглашаетесь
; ни в коем случае не изменять и не удалять внесенную в программу информацию
; об авторском праве. Компания TI оставляет за собой все права,
; не оговоренные в данной лицензии. Кроме
; того, что оговорено в данной лицензии, не может рассматриваться
; при возможном судебном разбирательстве.
;
; Вы не можете использовать программу для микроконтроллеров, которые не производит компания TI.
;
#include ”msp430x14x.h”
;*****************************************************************************
; MSP–FET430X110 Demo – Декодер команд ИК системы ДУ RC5, передающий их в ПК на скорости 2400 бод
;
; Описание: Декодирование 12- битных ИК пакетов бифазного формата RC5 при помощи модуля таймера Timer_A.
; CCR1 модуля таймера Timer_A используется для декодирования ИК пакетов, режим захвата – для детектирования межбитного фронта,
; а режим сравнения – для защелкивания бита данных. CCR2 используется для декодирования
; перезапуска. Принятый пакет пердается в ПК при помощи CCR0 модуля Timer_A, выполняющего
; функцию UART. Пакет передается в виде четырех ACII байтов, содержащих символы CR и LF.
;.Если принята команда "Chanel+", то на выходе P1.0 устанавливается высокий уровень, а если любая другая – то низкий.
; ИК данные передаются начиная со старшего значащего байта. Пакет состоит из 2- ух стартовых бит, бита C и 11 бит данных:
; S1–S2–C–A4–A3–A2–A1–A0–C5–C4–C3–C2–C1–C0
;
; Демонстрируется работа при помощи ИК монитора, в который передаются данные символы CR, LF и 4 ASCII байта
;
; MSP430F1121
; –––––––––––––––
; /|\ | XIN|–
; | | | 32 кГц
; ––|RST XOUT|–
; | |
; IR Receiver–>|P1.2/CCR1 P1.0|––> Светодиод
; | P1.1|––> 2400 8N1
;
; Длительности битов
;
; 1.78 мс
;+––– +––– +––– –––– –––+ +–––
; | | | | | | | | | | |
; –––+ –––+ +––+––– +––+ +–––––+ +––
; ^Старт ^Старт ^ 1 ^ 0 ^ 0 ^
;
; Используемые регистры вычислительного ядра
#define RXTXData R4
#define BitCnt R5
#define IRData R6
#define IRBit R7
;
; Для того, чтобы скорость обмена данными по UART равнялась 2400 бод необходимо, чтобы ACLK = 32768 Гц
Bitime_5 equ 06 ; .Длительность 5 бит + небольшая подстройка
Bitime equ 014 ; длительность бита 427 мк ~ 2341 бод
;
LED0 equ 001h ; Нулевой светодиод подключен к порту P1.0
TXD equ 002h ; Выход передатчика UART подключен к порту P1.1
IRIN equ 004h ; ИК данные поступают на порт P1.2
Bit_50 equ 29 ; 890 мкс при ACLK = 32768 Гц
Bit_75 equ 44 ; 1348 мкс при ACLK = 32768 Гц
Ch_up equ 32 ;
Ch_dwn equ 33 ;
LF equ 0ah ; ASCII код символа перевода строки (LF)
CR equ 0dh ; ASCII код символа возврата каретки (CR)
;
; Автор: M. Buccini
; Компания Texas Instruments, Inc
; июль 2001
;*****************************************************************************
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
ORG 0F000h ; Начало программы
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
RESET
mov.w #0300h,SP ; Инициализация указателя стека микроконтроллера семейства’x112x
call #Init_Sys ; Инициализация системных периферийных модулей
;
Mainloop
call #IR_Ready ; Подготовка ИК декодера
bis.w #LPM3,SR ; Переход в режим LPMx, остановка, снижение потребления
call #TXIR_2_PC ; Передача принятой команды
call #LED_Disp ; Проверка, являются ли принятые данные командой "Channel +" или нет
jmp Mainloop ;
;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Init_Sys ; Инициализация системных периферийных устройств
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
StopWDT
mov.w #WDTPW+WDTHOLD,&WDTCTL ; Остановка сторожевого таймера
SetupTA
mov.w #TASSEL0+MC1,&TACTL ; ACLK непрерывны
SetupC0
mov.w #OUT,&CCTL0 ; Установка на выходе передатчика единицы
SetupP1
bis.b #IRIN+TXD,&P1SEL ; P1.2 - CCR1, P1.1 - CCR0
bis.b #LED0+TXD,&P1DIR ; P1.0 – выход передатчика
bic.b #LED0,&P1OUT ; на P1.0 низкий уровень – светодиод выключен
eint ;
ret ; Выход из подпрограммы
;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
IR_Ready; Подпрограмма подготовки к принятию 12- битных данных в формате RC5 в регистр IRData
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
clr.w IRData ;
mov.w #014,IRBit ; 12 бит данных + 1 стартовый бит + 1 окончательный
SetupC1
mov.w #CM1+SCS+CAP+CCIE,&CCTL1 ; CAP CCI1A, спадающий фронт, прерывание
ret ;
;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
TXIR_2_PC; Подпрограмма передачи символов CR, LF и содержимого регистра IRData в виде четырех ASCII байт в ПК
; R15 используется в качестве рабочего регистра и не сохраняет своего состояния
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
mov #CR,RXTXData ; символ CR пересылается в буфер UART
call #TX_Byte ; CR ––> ПК/пользователю
mov #LF,RXTXData ; символ LF пересылается в буфер UART
call #TX_Byte ; LF ––> ПК/пользователю
;
TX_Word_ASCII ; передача слова из IRData в виде четырех ASCII байт
swpb IRData ; IRData = 3412
call #TX_Byte_ASCII ;
swpb IRData ; IRData = 1234
;
TX_Byte_ASCII ; Передача байта из IRData в виде двух ASCII байт
mov.b IRData,R15 ; передача значения ..x
call #NUM_ASCIR ;
mov.b IRData,R15 ; передача значения ..x
jmp NUM_ASCIA ;
;
NUM_ASCIR
rrc.b R15 ; 1. и 3. пропускаются
rrc.b R15 ;
rrc.b R15 ;
rrc.b R15 ;
;
NUM_ASCIA
and.b #0fh,R15 ; 2. и 4. пропускаются
add.b #030h,R15 ;
cmp.b #03ah,R15 ;
jlo NUM_End ;
add.b #039,R15 ;
NUM_End
mov.b R15,RXTXData ; загрузка буфера передатчика
;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
TX_Byte; Подпрограмма передачи байта из буфера RXTXData при помощи CCR0 UART
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
mov.w &TAR,&CCR0 ; Текущее состояние счетчика TA
add.w #Bitime,&CCR0 ; Некоторая пауза перед первым битом
bis.w #0100h, RXTXData ; Добавление единичного стопового бита в RXTXData
rla.w RXTXData ; Добавление нулевого стартового бита
mov.w #10,BitCnt ; Загрузка счетчика битов, 8 бит данных + SP
mov.w #OUTMOD0+CCIE,&CCTL0 ; TXD = 1 = idle
TX_Wait
tst.w BitCnt ; Ожидание окончания передачи
jnz TX_Wait ;
ret ;
;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
TA0_ISR ; Буфер RXTXData содержит данные для UART.
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
add.w #Bitime,&CCR0 ; Интервал до следующего бита
UART_TX
bic.w #OUTMOD2,&CCTL0 ; Передача единицы
rra.w RXTXData ; МЗБ (LSB) сдвигается в бит переноса
jc TX_Test ; Переход ––> бит = 1
TX_Space
bis.w #OUTMOD2,&CCTL0 ; Передача нуля
TX_Test
dec.w BitCnt ; Все биты переданы (или приняты)?
jnz TX_Next ; Следующий бит?
bic.w #CCIE,&CCTL0 ; Все биты переданы/приняты, блокировка прерываний
TX_Next
reti ;
;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
TAX_ISR; Общая подпрограмма обработки прерываний CCR1–4 и переполнения
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
add.w &TAIV,PC ; Добавление смещения в вектор прерывания от Timer_A
reti ; CCR0 – не является источником
jmp TA1_ISR ; CCR1
jmp TA2_ISR ; CCR2
; reti ; CCR3
; reti ; CCR4
;TA_over
reti ; Выход по переполнению
;
TA1_ISR
bit.w #CAP,&CCTL1 ;
jc RX_edge ; Переход –> захвачен фронт
;
RX_Bit
dec.w IRBit ;
jz RX_Comp ; Проверка окончания пакета
RX_Cont
bit.w #SCCI,&CCTL1 ; Бит переноса = бит данных в SCCI
rlc.w IRData ; Бит переноса –> IRData
mov.w #CM1+CM0+CAP+CCIE+SCS,&CCTL1 ; CAP CCI1A, оба фронта, прерывание
push.w &CCR1 ; Максимальное время до следующего фронта
add.w #Bit_50,0(SP) ;
pop.w &CCR2 ;
mov.w #CCIE,&CCTL2 ; Разрешение прерывания по таймауту
reti ;
;
RX_Comp
clr.w &CCTL1 ; Отключение CCR1
and.w #0FFFh,IRData ; Изолирование 12- битного пакета
mov.w #GIE,0(SP) ;
reti ;
;
RX_edge
clr.w &CCTL2 ; Отключение таймаута CCR2
mov.w #CCIE,&CCTL1 ; режим сравнения
add.w #Bit_75,&CCR1 ; Время до сеердины бита данных
reti ;
;
TA2_ISR
clr.w &CCTL2 ; Блокировка таймаута CCR2
call #IR_Ready ; Ошибка – перезапуск приемника
reti ; Выход из подпрограммы
;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
LED_Disp; Включение светодиода (установка P1.0) при принятии команды "Channel+" (код 32)
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
and.w #03Fh,IRData ; Изолирование 6- битного кода команды
LED_off
bic.b #01h,&P1OUT ; Выключение светодиода
LED0_tst
cmp.w #Ch_up,IRData ; Принята команда "Channel+" (код 32)
jne LED_exit ;
bis.b #01h,&P1OUT ; Включение светодиода
LED_exit
ret ; Выход из подпрограммы
;
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
; Используемые вектора прерываний
;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
ORG 0FFFEh ; Вектор сброса MSP430
DW RESET ;
ORG 0FFF2h ; Вектор таймера Timer_A0
DW TA0_ISR ;
ORG 0FFF0h ; Вектор таймеров Timer_AX
DW TAX_ISR ;
END
|