Демонстрационная программа F149VoiceDemo.s43
;*****************************************************************************
; ЭТА ПРОГРАММА ПОСТАВЛЯЕТСЯ В ВИДЕ "КАК ЕСТЬ". КОМНАИЯ TI НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ
; И НЕ НЕСЕТ НИКАКОЙ ОТВЕТСТВЕННОСТИ ЗА ВОЗМОЖНЫЕ НЕТОЧНОСТИ
; РАБОТЫ ИЛИ НЕПРАВИЛЬНОСТЬ РАБОТЫ ПРОГРАММЫ.
; ПРИ КОММЕРЧЕСКОМ ИСПОЛЬЗОВАНИИ ДАННОЙ ПРОГРАММЫ
; КОМПАНИЯ TI ОТКАЗЫВАЕТСЯ ОТ АВТОРСТВА И СНИМАЕТ
; С СЕБЯ ВСЯКУЮ ОТВЕТСТВЕННОСТЬ.
;
; КОМПАНИЯ TI ОТКАЗЫВАЕТСЯ ОТ ЛЮБЫХ ГАРАНТИЙ В ОТНОШЕНИ ТОГО,
; ЧТО ПРОГРАММА НЕ МОЖЕТ ПРИНИСТИ ПРЯМЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ ИЛИ
; ПОТЕРЮ ДОВЕРИЯ ИЛИ ПРИБЫЛИ
; ПРИ ИСПОЛЬЗОВАНИИ ЕЕ ТЕОРИИ ИЛИ АЛГОРИТМОВ.
; ОТВЕТСТВЕННОСТЬ ПРИ КОММЕРЧЕСКОМ ИСПОЛЬЗОВАНИИ
; ДАННОЙ ПРОГРАММЫ ПОЛНОСТЬЮ ЛЕЖИТ НА ЛИЦЕ, ИСПОЛЬЗОВАВШЕМ
; ДАННУЮ ПРОГРАММУ
;
; Если не указано иное, программа, созданная компанией
; Texas Instruments поставляется на условиях "свободно распространяемого
; программного обеспечения".
; Вы можете свободно изменять программу без всяких ограничений
; Передавать программу третьим лицам можно только при
; доведении до их сведений этих условий и при
; его согласии с этими условиями.
; Вы должны приводить лицензию в каждой копии или частичной копии.
;
; Вы признаете и соглашаетесь, что Программа содержит
; защищенный авторским правом материал, коммерческую тайну и другую частную информацию
; компании TI и защищена в соответствии с законами об авторском праве,
; международным соглашением об авторском праве и законом о коммерческой тайне, а так же
; законом об охране интеллектуальной собственности. Для защиты авторских прав компании TI
; Вы соглашаетесь не де компилировать, перерабатывать,
; или преобразовывать программу
; к удобочитаемому виду. Вы соглашаетесь
; ни в коем случае не изменять и не удалять внесенную в программу информацию
; об авторском праве. Компания TI оставляет за собой все права,
; не оговоренные в данной лицензии. Кроме
; того, что оговорено в данной лицензии, не может рассматриваться
; при возможном судебном разбирательстве.
;
; Вы не можете использовать программу для микроконтроллеров, которые не производит компания TI
NAME F149VoiceDemo ; Цифровой диктофон на микроконтроллере MSP430F149 с FLASH памятью
;Автор: Murugavel Raju
; Компания Texas Instruments, Inc
;******************************************************************************
#include "msp430x14x.h"
;******************************************************************************
; Микроконтроллер работает на частоте 3.58 МГц
;
; Определение констант
FS equ 001h
Memstart equ 1401h
Memend equ 0fe01h
;******************************************************************************
RSEG CSTACK
DS 0
;******************************************************************************
RSEG CODE
;******************************************************************************
RESET
mov.w #SFE(CSTACK),SP ; определение указателя стека
call #Init_Sys ; Инициализация системы
mov.b &P1IN,R5 ; проверка состояния вывода P1.1 для определения режима
and.b #BIT4,R5 ; Маскирование Bit4 для проверки состояния кнопки 'Record'
jnz Play ; Переход по метке Play если кнопка не нажата
call #Erase ; Вызов подпрограммы очистки Flash памяти
xor.w #FXKEY+WRT,&FCTL1 ; Активизация FLASH памяти для записи
bis.b #BIT0,&P1OUT ; Включение светодиода
Play
eint ; Разрешение прерываний
mov.w #Memstart,R14 ; Пересылка начального адреса памяти в регистр R14
Mainloop
jmp $ ; Зацикливание, выход только по прерыванию
;******************************************************************************
TB7_ISR; Подпрограмма обработки прерывания таймера Timer B7, сохранение длительности
; записи и пересылка этих данных для проигрывания
;******************************************************************************
bit.b #BIT4,R5 ; Проверка нажатия кнопки выбора режима
jnz Play1 ; Если не нажата, то переходим к метке Play1
bic.w #ADC12SC,&ADC12CTL0 ; Начало преобразования
Conv_tst
bit.w #ADC12BUSY,&ADC12CTL1 ; Ожидание окончания преобразования
jc Conv_tst ; Зацикливание до окончания преобразования
bis.w #ADC12SC,&ADC12CTL0 ; возврат в режим выборки
mov.w &ADC12MEM0,0(R14) ; Запись слова во FLASH память
incd.w R14 ; Увеличение счетчика
cmp.w #Memend,R14 ; Проверяем, заполнена ли память
jnz Proceed ; Если память не заполнена, то переходим к обработке
bic.b #BIT0,&P1OUT ; Если память заполнена, то выключаем светодиод
xor.w #FXKEY+WRT,&FCTL1 ; Запрещаем запись во FLASH память
xor.w #FXKEY+LOCK,&FCTL3 ; Блокировка FLASH памяти
jmp RESET ; Начинаем сначала (если кнопка отжата, то начнем
; воспроизведение)
Play1
mov.w @R14,R15 ; Считывание данных из указателя памяти
Incd.w
R14 ; Дублирование увеличение указателя для перехода
; к следующему слову данных
cmp.w #Memend,R14 ; Проверка достижения конца массива памяти
jnz Go_on ; Переход к метке Go_on если конец не достигнут
jmp RESET ; переходим к началу если достигнут конец массива памяти
Go_on
L1 bit.b #UTXIFG0,&IE1 ; Зацикливание до тех пор, пока предыдущая передача
jc L1 ;не закончится и буфер не очистится
bis.b #FS,&P3OUT ; Кадровый импульс синхронизации
bic.b #FS,&P3OUT ; для начала загрузки в TLV5516
; следующего слова данных
swpb R15 ; меняем местами байты в регистре R15
mov.b R15,&TXBUF0 ; пересылка старшего байта в TXBUF модуля SPI
swpb R15 ; Меняем местами байты в регистре R15
mov.b R15,&TXBUF0 ; Пересылка младшего байта в TXBUF модуля SPI
Proceed
reti ; Выход из подпрограммы обработки прерывания
;******************************************************************************
Init_Sys; Настройка периферийных модулей
;******************************************************************************
StopWDT
mov.w #WDTPW+WDTHOLD,&WDTCTL ; Остановка сторожевого таймера
SetupBC
bic.b #XTOFF,&BCSCTL1 ; Активизация автогенератора на XT2
call #Delay ; Задержка для обеспечения выхода автогенератора
; в стабильный режим
mov.b #SELM1+SELS,&BCSCTL2 ; MCLK=SMCLK=XT2CLK
bic.b #OFIFG,&IFG1 ; Очистка OFIFG
SetupP1
mov.b #0h,&P1OUT ; Очистка выходного регистра порта P1
bis.b #0ffh,&P1DIR ; Настройка всех линий порта P1 для работы в режиме выхода
; Вывод P1.0 используется для управления светодиодом
bic.b #BIT4,&P1DIR ; Для переключения выходов
SetupP2
mov.b #0h,&P2OUT ; очистка выходного регистра порта P2
bis.b #0ffh,&P2DIR ; Неиспользуемые выводы переводятся в режим выходов
SetupP3
bis.b #00ah,&P3SEL ; Линии порта P3.1 & P3.3 используются для SPI модуля
bis.b #FS,&P3OUT ; Установка FS
bis.b #0feh+FS,&P3DIR ; P3.0,3.1,3.3 и неиспользуемые выводы переводятся в режим выходов
SetupP4
mov.b #0h,&P4OUT ; Очистка выходного регистра порта P4
bis.b #0ffh,&P4DIR ; Неиспользуемые выводы переводятся в режим выходов
SetupP5
mov.b #0h,&P5OUT ; Очистка выходного регистра порта P5
bis.b #0ffh,&P5DIR ; Неиспользуемые выводы переводятся в режим выходов
SetupP6
bis.b #BIT0,&P6SEL ; P6.0 = A0 вход модуля ADC12
mov.b #0h,&P6OUT ; Выходные линии P6 используются для сброса
bis.b #0feh,&P6DIR ; P6.1 - 6.7 выходы (неиспользуются)
SetupADC
Call #ADCset ; Инициализация модуля ADC12
SetupUSART
bis.b #040h,&ME1 ; Активизация модуля USART
mov.b #CHAR+SYNC+MM,&U0CTL ; 8- битный модуль SPI в режиме ведущего
mov.b #CKPL+SSEL1+SSEL0+STC,&U0TCTL
; SMCLK для передачи, 3- проводный интерфейс
mov.b #02h,&U0BR0 ; SMCLK/2 для задания скорости обмена данными
clr.b &U0BR1 ;
clr.b &U0MCTL ; Очистка модуляции
SetupCCR0
bis.w #CCIE,&TBCCTL0
Mov.w #649,&TBCCR0 ; Инициализация таймера TBCCR0 для выборки
; с частотой 5.5 кГц
SetupTB7
bis.w #TBSSEL1+MC0,&TBCTL ; Перевод ьаймера TimerB в режим UP
SetupFlash
xor.w #FXKEY+FN2+FN1+FN0,&FCTL2
; Установка частоты генератора FLASH памяти 447.5 кГц
ret ; Выход из подпрограммы
;******************************************************************************
ADCset; Инициализация модуля ADC12, VCC используется в качестве опорного напряжения
; Одноканальный (A0) режим однократного преобразования
;******************************************************************************
bis.w #ADC12ON+ADC12SC+ENC,&ADC12CTL0
; Включение АЦП и выборка входного сигнала
call #Delay ; Задержка для стабилизации
bis.w #ADC12SSEL_1+ADC12SSEL_2,&ADC12CTL1
; ADC12 синхронизируется от SMCLK
ret ; Выход из подпрограммы
;******************************************************************************
Erase; Инициализация FCTL и стирание FLASH памяти для новой записи
;******************************************************************************
dint ; Запрещение прерываний
xor.w #FXKEY+LOCK,&FCTL3 ; Разблокирование FLASH памяти для записи
Test_Busy1
bit.w #BUSY,&FCTL3 ; Проверка флага BUSY
jnz Test_Busy1 ; Зацикливание
mov.w #1400h,R13 ; Адрес начала массива памяти пересылается в регистр R13
NextSeg
mov.w #(FWKEY+ERASE),&FCTL1 ; Установки
Clr.b 0(R13) ; Выполнение макет записи для активизации
; стирания сегмента
Test_Busy2
bit.w #BUSY,&FCTL3 ; Проверка флага BUSY
jnz Test_Busy2 ; Зацикливание
add.w #200h,R13 ; Установка указателя на следующий сегмент
cmp.w #0fe00h,R13 ; Все сегменты очищены?
jnz NextSeg ; Если нет, то переходим к очистке следующего сегмента
ret ; Выход из подпрограммы
;******************************************************************************
Delay; Подпрограмма формирования задержки
;******************************************************************************
push.w #0FFFFh ; Задержка до TOS
DL1
dec.w 0(SP) ; Уменьшение TOS
jnz DL1 ; Задержка окончена?
Incd.w
SP ; Очистка TOS
ret ; Выход из подпрограммы
;******************************************************************************
COMMON INTVEC ; Векторы прерываний MSP430F14x
;******************************************************************************
ORG TIMERB0_VECTOR
WDT_VEC DW TB7_ISR ; Обработка прерывания таймера Timer B7
ORG RESET_VECTOR
RESET_VEC DW RESET ; Обработка POR, внешнего сброса и сброса сторожевого таймера
END
|