FET_intADC MSP430F11x1 Demo
#include "msp430x11x1.h"
;***************************************************************************
NAME ;FET_intADC MSP430F11x1 Demo
;
; Описание: Эта программа демонстрирует как реализовать на микроконтроллере MSP430F11x1
; милливольтметр, использующий компаратор comparator_A. Напряжение считывается и
; передается в ПК со скоростью 9600 бод по протоколу 8N1.
;
; Используемые регистры вычислительного ядра
#define ADCData R11
#define BitCnt R6
#define RXTXData R5
;
; Условия для обеспечения скорости HW/SW UART 9600 бод при MCLK = 3.579545MHz
Bitime_5 equ 0186 ; длительность половины бита
Bitime equ 0373 ; 104 мкс
TXD equ 002h ; TXD подключен к порту P1.1
DAC_Out equ 001h ; к порту P2.0 подключен выход ЦАП
CR equ 0dh ; ASCII символ перевода каретки
;
; MSP430F1121
; __________
; 3.3В| XIN|-
; | | | 3.58 МГц
; ---|RST XOUT|-
; | |
; AIN--->|P2.4 |
; | |
; + -470 к- |P2.0 |
; | | | 9600 8N1
; +----- |P2.3 P1.1|-------->
; | | |
; ===.047 | |
; | | |
; ------ |VSS |
;
; Автор M.Buccini
; Компания Texas Instruments, Inc
; Сентябрь 2000 г.
;***************************************************************************
;
;-----------------------------------------------------------------------------
ORG 010FEh ; Информационная память
;-----------------------------------------------------------------------------
VCC_Cal DW 03300 ; Актуальное напряжение питания (VCC)
;
;-----------------------------------------------------------------------------
ORG 0F000h
;-----------------------------------------------------------------------------
RESET
mov #300h,SP ; Инициализация указателя стека
call #Init_Sys ; Инициализация системных периферийных модулей
;
Mainloop
call #Meas_ADC ; Преобразование АЦП,
call #TX_2_PC ; Пересылка результата измерения АЦП в ПК или пользователю
Delay
push #0FFFFh ; Программная задержка до TOS
L1
dec 0(SP) ; Уменьшение TOS
jnz L1 ; Задержка окончилась?
incd SP ; Очистка TOS
jmp Mainloop ; Повтор
;
;---------------------------------------------------------------------------
Init_Sys; Инициализация системных периферийных модулей
;---------------------------------------------------------------------------
mov #WDTPW+WDTHOLD,&WDTCTL ; Остановка сторожевого таймера
SetupC0
mov #OUT,&CCTL0 ; TXD освобожден для маркировки
SetupP1_2
bis.b #TXD,&P1SEL ; P1.1/TA0 для функции TXD
bis.b #TXD,&P1DIR ; P1.1 = выход TXD
bis.b #DAC_Out,&P2DIR ; P2.0 = выход ЦАП
SetupCA
mov.b #P2CA0+P2CA1,&CACTL2 ; P2.3+ P2.4-
SetupBC
bis.b #XTS,&BCSCTL1 ; ACLK = LFXT1 HF XTAL резонатор
SetupOsc
bic.b #OFIFG,&IFG1 ; Очистка флага повреждения автогенератора
mov #0FFh,R15
SetupOsc1
bit.b #OFIFG,&IFG1 ; Флаг повреждения автогенератора установлен?
jnz SetupOsc ;
dec R15 ; дополнительная задержка для убеждения в запуске
jnz SetupOsc1
bic.b #OFIFG,&IFG1 ; Очистка флага повреждения автогенератора
bis.b #SELM1+SELM0,&BCSCTL2 ; MCLK = LFXT1
;
mov #TASSEL0+TACLR,&TACTL ; Очистка Timer_A, ACLK, TAR
bis #MC1,&TACTL ; Запуск TA в непрерывном режиме
eint ; Глобальное разрешение прерываний
ret ; Выход из подпрограммы
;
;---------------------------------------------------------------------------
Meas_ADC; Подпрограмма: измерения при помощи АЦП, результат преобразования АЦП
; в двоично-дополнительном коде --> ADCData
; R15 используется в качестве рабочего регистра и не сохраняет свое состояние
;---------------------------------------------------------------------------
mov.b #CAON,&CACTL1 ; Включение компаратора
clr ADCData ; Очистка регистра ADCData
call #Sample_ADC ; результат выборки --> ADCData
call #Sample_ADC ; результат выборки --> ADCData + предыдущие данные
Meas_Over
clr.b &CACTL1 ; Выключение компаратора
ret ; Выход из подпрограммы
;
Sample_ADC
mov &VCC_Cal,R15 ; ~3300
rra R15 ; VCC/2
; предварительный заряд конденсатора;
Pre_ADC
bis.b #DAC_Out,&P2OUT ; заряд конденсатора
C1 bit.b #CAOUT,&CACTL2 ; На выходе компаратора сигнал высокий или низкий?
jz C1 ;
; Настройка и накопление импульсов ЦАП;
Test_DAC
bit.b #CAOUT,&CACTL2 ; На выходе компаратора сигнал высокий или низкий?
jnc Low1 ;
High
bic.b #DAC_Out,&P2OUT ; Разряд конденсатора
jmp Meas_ ;
Low1
bis.b #DAC_Out,&P2OUT ; Заряд конденсатора
setc ;
dadc ADCData ; увеличение ADCData в двоично-десятичном коде
Meas_
dec R15 ; Уменьшение счетчика цикла слежения
jnz Test_DAC ; цикл слежения закончен?
bic.b #DAC_Out,&P2OUT ; разряд конденсатора
xor.b #CAEX,&CACTL1 ; инвертирование выводов компаратора
ret ; Выход из подпрограммы
;
;---------------------------------------------------------------------------
TX_2_PC; Поресылка CR и 16- битного слова ADCData (регистр R11) в ПК/пользователю
;---------------------------------------------------------------------------
mov #CR,RXTXData ; пересылка CR в буфер UART
call #TX_Byte ; CR --> ПК/пользователю
;
; Переход к нижеследующей подпрограмме
;
;---------------------------------------------------------------------------
TX_Word_ASCII; Передача слова из ADCData в виде четырех ASCII байт
;---------------------------------------------------------------------------
swpb ADCData ; ADCData = 3412
call #TX_Byte_ASCII ;
swpb ADCData ; ADCData = 1234
;
;---------------------------------------------------------------------------
TX_Byte_ASCII; Передача байта из ADCData в виде двух ASCII байт
;---------------------------------------------------------------------------
push ADCData ; передача значения ..x
call #NUM_ASCIR ;
push ADCData ; передача значения ...x
call #NUM_ASCIA ;
ret ; Выход из подпрограммы
;
NUM_ASCIR ; Преобразование числа от 0 до F в ASCII символ с левым выравниванием 2(SP)
rrc 2(SP) ; 1. и 3. пропускаются
rrc 2(SP) ;
rrc 2(SP) ;
rrc 2(SP) ;
;
NUM_ASCIA
and #0fh,2(SP) ; 2. и 4. пропускаются
add #030h,2(SP) ;
cmp #03ah,2(SP) ;
jlo NUM_End ;
add #039,2(SP) ;
NUM_End
mov 2(SP),RXTXData ; загрузка буфера передатчика, FALL
mov @SP+,0(SP) ; Очистка w\ возврат адреса TOS
;
;---------------------------------------------------------------------------
TX_Byte; Подпрограмма, которая передает байт, находящийся в буфере RXTXData.
;---------------------------------------------------------------------------
mov #TX_Count,BitCnt ; TX_Count --> Указатель перехода
push &TAR ; Текущее значение TA
add #Bitime,0(SP) ; Сдвиг к следующему биту
pop &CCR0 ; Время для следующего бита в CCR0
mov #OUTMOD2+OUTMOD0+CCIE,&CCTL0 ; TXD = пустой старт бит
TX_Wait
bit #CCIE,&CCTL0 ; Ожидание окончания передачи
jnz TX_Wait ;
ret ; Выход из подпрограммы
;
;-----------------------------------------------------------------------------
TA0_ISR ; Подпрограмма обработки прерывания CCR0/UART ISR: буфер RXTXData содержит данные для UART.
;-----------------------------------------------------------------------------
add #Bitime,&CCR0 ; Bitime до следующего бита
mov @BitCnt+,PC ; Ветвление программы
;
TX_Bit
rra.b RXTXData ; LSB сдвигается в бит переноса
jc TX_Mark ; Переход если бит = 1
TX_Space
bis #OUTMOD2,&CCTL0 ; Передача нуля
reti
TX_Comp
bic #CCIE,&CCTL0 ; Все биты приняты, запрет прерывания
TX_Mark
bic #OUTMOD2,&CCTL0 ; передача 1
reti ;
;
even ;
TX_Count DW TX_Bit ; Передача первого бита
DW TX_Bit ;
DW TX_Bit ;
DW TX_Bit ;
DW TX_Bit ;
DW TX_Bit ;
DW TX_Bit ;
DW TX_Bit ;
DW TX_Mark ; передача стоп бита = 1
TX_End DW TX_Comp ; Передача завершена
;
;---------------------------------------------------------------------------
RSEG INTVEC ; вектора прерываний MSP430x11x1
;---------------------------------------------------------------------------
DW RESET ; нет источника
DW RESET ; нет источника
DW RESET ; P1.x
DW RESET ; P2.x
DW RESET ; нет источника
DW RESET ; нет источника
DW RESET ; нет источника
DW RESET ; нет источника
DW RESET ; Timer_AX
DW TA0_ISR ; Timer_A0
DW RESET ; Сторожевой таймер / Таймер
DW RESET ; Компаратор Comparator_A
DW RESET ; нет источника
DW RESET ; нет источника
DW RESET ; NMI, повреждение автогенератора
DW RESET ; POR, внешний сброс, сторожевой таймер
END
индивидуальный гороскоп совместимости, магия
|