Провел еще один эксперимент. Результаты. Начальные условия.
Оригинальный JTAG MSP-FETP430IF 1.3 с оригинальной платкой MSP-TS430PM64 rev.0.1.
Контроллер MSP430F149 Lot 18C448T
К выводу VREF+ в позицию C6 установлен танталовый конденсатор 4.7uFx16V.
Установлены оба кварца 32,738 кГц и 8МГц, но в тесте не используются.
Питание от MSP FET с внешним БП (+5V стабилизированное, гальванически развязанное, подается на разъем J3 (Ext_PWR) MSP430 FET). Т.е. питание TARGET заведомо стабильное 3,0V.
Как рекомендует нам MSP430x1xx User's Guide(Rev.D), все неиспользуемые пины запрограммированы как дискретные выводы на вывод с низким потенциалом.
Компилятор и дебаггер IAR EW 3.10A.
Листинг программы.
;******************************************************************************
#include "msp430x14x.h"
#define REM BIT4
#define H_On BIT5
#define H_Out BIT2
;------------------------------------------------------------------------------
ORG 01100h ; Progam Start
;------------------------------------------------------------------------------
RESET mov.w #0A00h,SP ; Initialize 'x1x9 stackpointer
StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT
;
mov.b #XT2OFF+RSEL2+RSEL1+RSEL0,&BCSCTL1
mov.b #DCO2+DCO1+DCO0,&DCOCTL
mov.b #SELM_0,&BCSCTL2 ; SMCLK=DCOCLK
;
mov.w #TASSEL_2+TACLR,&TACTL ; TACLK=SMCLK
mov.w #0FFFh,TACCR0
mov.w #0800h,TACCR1
mov.w #OUTMOD_3,TACCTL1 ; TA1OUT set/reset mode
;
mov.b #BIT6,P1SEL ; P1.6 as TA1OUT
mov.b #0FFh,P1DIR ; P1.x as output
mov.b #00h,P1OUT ; P1.x as output
;
mov.b #00h,P2SEL ; P2.x as DI/O
mov.b #0FFh,P2DIR ; P2.x as output
mov.b #00h,P2OUT ; P2.x resets
;
mov.b #00h,P3SEL ; P3.x as DI/O
mov.b #0FFh,P3DIR ; P3.x as output
mov.b #00h,P3OUT ; P3.x resets
;
mov.b #00h,P4SEL ; P4.x as DI/O
mov.b #0FFh,P4DIR ; P4.x as output
mov.b #00h,P4OUT ; P4.x resets
;
mov.b #00h,P5SEL ; P5.x as DI/O
mov.b #0FFh,P5DIR ; P5.x as output
mov.b #00h,P5OUT ; P5.x resets
;
mov.b #00h,P6SEL ; P6.x as DI/O
mov.b #0FFh,P6DIR ; P6.x as output
mov.b #00h,P6OUT ; P6.x resets
;
mov.w #REFON+ADC12ON+SHT0_15+SHT1_15,&ADC12CTL0
mov.w #SHP,&ADC12CTL1
mov.b #SREF_1+INCH_10,&ADC12MCTL0
bis.w #MC_1,&TACTL ; Start Timer_A in Count_UP mode
bis.w #0001h,&ADC12IE ; Enable interrupt
eint ; Enable interrupt
cont bis.w #ENC+ADC12SC,&ADC12CTL0 ; Enable conversions
bis.b #LPM0,SR ; LPM0 mode
; Start conversions
/*testIFG bit #ADC12BUSY,&ADC12CTL1
jnz testIFG
mov &ADC12MEM0,R12
call #delay*/
nop
bp1 jmp cont ; Again
delay mov #0ffffh,R5
cont_del dec R5
jnz cont_del
ret ;
;-----------------------------------------------------------------------------
ADC12_ISR ; ADC12MEM0 -> R12, exit any LPMx mode
; Output: R12 0000 - 0FFFh
;-----------------------------------------------------------------------------
mov.w &ADC12MEM0,R12 ; Clear IFG flag
mov.w #GIE,0(SP) ; Enable Int. exit LPMx on reti
bp2 reti ;
;
;------------------------------------------------------------------------------
COMMON INTVEC
;------------------------------------------------------------------------------
ORG RESET_VECTOR ; MSP430 RESET Vector
DW RESET ;
ORG ADC_VECTOR ; ADC12 Vector
DW ADC12_ISR ;
END
Breakpoints установлены на метки bp1 и bp2. Результат преобразования наблюдаю в окне Memory, ячейка памяти по адресу 0x0140.
Тест первый с использованием LPM0. Используется прерывание от ADC12. Среднее значение результата преобразования 0x0BC7. Максимальные отклонения от 0x0BC6 до 0x0BC9.
Тест второй без LPM0, но используется то же самое прерывание от ADC12. Фрагмент листинга с изменениями.
bis.w #0001h,&ADC12IE ; Enable interrupt
eint ; Enable interrupt
cont bis.w #ENC+ADC12SC,&ADC12CTL0 ; Enable conversions
; bis.b #LPM0,SR ; LPM0 mode
; Start conversions
/*testIFG bit #ADC12BUSY,&ADC12CTL1
jnz testIFG
mov &ADC12MEM0,R12
call #delay*/
nop
bp1 jmp cont ; Again
delay mov #0ffffh,R5
cont_del dec R5
jnz cont_del
ret ;
;-----------------------------------------------------------------------------
ADC12_ISR ; ADC12MEM0 -> R12, exit any LPMx mode
; Output: R12 0000 - 0FFFh
;-----------------------------------------------------------------------------
mov.w &ADC12MEM0,R12 ; Clear IFG flag
; mov.w #GIE,0(SP) ; Enable Int. exit LPMx on reti
bp2 reti ;
Среднее значение определить сложно, но что-то около 0x0BC9. Максимальне отклонения от 0x0BBF до 0x0BD0.
Тест третий. Без использования прерывания ADC12, с опросом флага ADC12BUSY и с той самой бооольшой задержкой от Shura :)
; bis.w #0001h,&ADC12IE ; Enable interrupt
; eint ; Enable interrupt
cont bis.w #ENC+ADC12SC,&ADC12CTL0 ; Enable conversions
; bis.b #LPM0,SR ; LPM0 mode
; Start conversions
testIFG bit #ADC12BUSY,&ADC12CTL1
jnz testIFG
mov &ADC12MEM0,R12
call #delay
nop
bp1 jmp cont ; Again
delay mov #0ffffh,R5
cont_del dec R5
jnz cont_del
ret ;
;-----------------------------------------------------------------------------
ADC12_ISR ; ADC12MEM0 -> R12, exit any LPMx mode
; Output: R12 0000 - 0FFFh
;-----------------------------------------------------------------------------
mov.w &ADC12MEM0,R12 ; Clear IFG flag
; mov.w #GIE,0(SP) ; Enable Int. exit LPMx on reti
bp2 reti ;
Среднее значение определить затрудняюсь, т.к. они каждый раз разные. Максимальные значения от 0x0BBB до 0x0BD8.
По результатам тестов считаю, что насчет +-100МЗР Shura ИМХО немного "загибает", но "болтанка" при измерении напряжения на встроенном датчике температуры весьма приличная. +-10 легко и при любых неблагоприятных условиях.