ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 июля
16958 Топик полностью
rezident (22.11.2004 00:30, просмотров: 1) ответил General на Перевод
Провел еще один эксперимент. Результаты. Начальные условия. Оригинальный 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 легко и при любых неблагоприятных условиях.