В HTML      В PDF
микроэлектроника, микросхема, транзистор, диод, микроконтроллер, память, msp430, Atmel, Maxim, LCD, hd44780, t6963, sed1335, avr, mega128
Предприятия Компоненты Документация Применения Статьи Новости

 
Пересюхтюмя


13-я Международная выставка электронных компонентов и комплектующих для электронной промышленности





Выставка Передовые Технологии Автоматизации





Главная страница > Применение > Микроконтроллеров > MSP430
Пересюхтюмя


13-я Международная выставка электронных компонентов и комплектующих для электронной промышленности





Выставка Передовые Технологии Автоматизации


Приложение А: программа 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