Файлы с русским переводом book1 book2 видел давно, но они онтносятся к серии MSP430F1x, сомневался, подойдут ли для MSP430F2x. В частности, затруднения с управлением встроенным ADC10 в MSP430F2012 могут быть вызваны как моим недомыслием, так и несовместимостью серий MSP430F1x и MSP430F2x.
Привожу текст программы
Код
;*******************************************************************************
; MSP430F2012 макет измерение анал сигнала, АЦП, залповое 32x сохранение (DTC)
; данных с входа A1 32x, повторное измерение одного канала с усреднением и
; передачей UART 2400,
;
; MSP430F2012
; -----------------
; /|\| XIN|-
; | | | 32 кГц (часовой кварцевый резонатор)
; --|RST XOUT|-
; | |
; >---|P1.1/A1 P1.0|--> LED (светодиод - индикатор АЦП)
; | |
; >---| P1.5|--> TX (UART 2400 передача данных)
;
; February 2010 Built with IAR EW Ver: 4.28
#define RXTXData R10 ; присвоим рабочему регистру псевдоним
#define BitCnt R5 ; счетчику битов - отдельное название
;*******************************************************************************
#include "msp430x20x2.h"
ORG 0F800h
;-------------------------------------------------------------------------------
RESET mov.w #0280h,SP ; Установим указатель стека заподлицо с ОЗУ
StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ;Забаним сторожевую собачкума
SetupTA mov.w #TASSEL_1+MC_2,&TACTL ;Загоним в непреррежим ВспомогатЧасы
SetupC0 mov.w #OUT,&CCTL0 ; Засандалим нулевой уров фона TXD
SetupADC10 mov.w #CONSEQ_2+INCH_1,&ADC10CTL1; A1, реж. повтора одного канала
mov.w #3CF8h,&ADC10CTL0; настройка АЦП на 0-2.5 V
bis.b #02h,&ADC10AE0 ; выбор реж P1.1 как анал вход в АЦП
mov.b #020h,&ADC10DTC1 ; залп из 32 преобразований в моск
SetupP1 bis.b #020h,&P1SEL ; терминал P1.5 буд защелкой таймерА
bis.b #021h,&P1DIR ; объЯвим P1.0 и P1.5 навыпуск
SetupBCS mov.b #096h,&BCSCTL1 ; DIVAx=01 (делим на 2) чтобы 16 кГц
;-------------------------------------------------------------------------------
Mainloop bic.w #ENC,&ADC10CTL0 ; запрет преобраз-Я АЦП 2-м битом
busy_test bit #BUSY,&ADC10CTL1 ; Активно ли Ядро АЦП10?
jnz busy_test ; Если активно, ждём остановки
mov.w #0200h,&ADC10SA ; Установ нач.адрес буфера данных
bis.b #001h,&P1OUT ; сигнал о запуске АЦП P1.0 = 1
bis.w #ENC+ADC10SC,&ADC10CTL0; пуск на приём и преобразовать
bic.w #TAIE,&TACTL ; приостановим прерываньица ТА
bic.w #CCIE,&CCTL0 ; отключим таймер А на времЯ АЦП
bis.w #CPUOFF+GIE,SR ; LPM0, ADC10_ISR will force exit
bis.w #TAIE,&TACTL ; теперь прерываньица ТА нужны
bis.w #CCIE,&CCTL0 ; влючим таймер А на времЯ TX_Byte
call #TX_Byte ; передача средних значений
bic.b #001h,&P1OUT ; сигнал об окончании P1.0 = 0
jmp Mainloop ; И вновь продолжаема ...
;-------------------------------------------------------------------------------
ADC10_ISR bic.w #CPUOFF,0(SP) ; Выход из снулого реж LPM0 возврат
AVER_32 clr.w R10 ; процедуры усредненьица, очисткама
mov.w #020h,R8 ; установим счетчик на 8 повторов
mov.w #0200h,R9 ; адрес начала массива данных
Sumat add.w @R9+,R10 ; добавим очередное слово в регистр
dec.w R8 ; уменьшение единицей
jnz Sumat ; счетчик не обнулен? повтор 32 раз
mov.w #05,R8 ; 5-кратный сдвиг - деление на 32
Aga CLRC ; очистка несущего бита с статусного регистра
RRC R10 ; сдвиг на один бит вправо
dec.w R8 ; счётчик обнулён?
jnz Aga ; если нет, повтор до 5 раз
mov.w &0200h,R10;
reti
;-------------------------------------------------------------------------------
TA0_ISR add.w #07,&CCR0 ; ВремЯ до следующего бита
UART_TX cmp.w #00h,BitCnt ;
jne TX_Next ; Неужели ещё бит?
bic.w #CCIE,&CCTL0 ; биты ТХ-нуты, хватит прерываний!
reti ;
TX_Next bic.w #OUTMOD2,&CCTL0 ; Фронт импульса - сигналама ТХ
rra.w RXTXData ; LSB столкнут в носитель
jc TX_Test ; Перескок --> бит = 1
TX_Space bis.w #OUTMOD2,&CCTL0 ; Пропуск интервала нормального TX
TX_Test dec.w BitCnt ; Все ли биты ТХ-нуты (засланы)?
reti ;
;-------------------------------------------------------------------------------
TX_Byte; Подпрограмма процедуры передачи символа из буфера
TX_1 mov.w &TAR,&CCR0 ; Текушее показание счётчикА снимать
cmp.w &TAR,&CCR0 ; !!Заклинанье-Оберег несинхроХап!!
jne TX_1 ;
add.w #07,&CCR0 ; Запас времени первому биту
bis.w #0100h, RXTXData ; Добавима в RXTXData стоповый бит
rla.w RXTXData ; Место стартовому биту
mov.w #10,BitCnt ; Засадим 8+ст+стп в битовый счётчик
mov.w #CCIS0+OUTMOD0+CCIE,&CCTL0 ; пометка TXD по нараст фронту
TX_Wait bit.w #CCIE,&CCTL0 ; Поскучам до успешного финала TX
jnz TX_Wait ;
ret ;
;-------------------------------------------------------------------------------
ORG 0FFEAh ; Вектор прерываваниЯ АЦП ADC10
DW ADC10_ISR
ORG 0FFF2h ; Вектор прерыван таймерА Timer_A0
DW TA0_ISR ;
ORG 0FFFEh ; Вектор MSP430 RESET
DW RESET ;
END
Поведение следущее - в отладчике видно, что АЦП работает верно, заселяет память результатами правильно, но когда приём байтов происходит потеря старших двух битов и вместо 10-битного АЦП получаем даже не 8-битный, а хуже - рабочий диапазон делится на четыре куска, где сигнал пилообразно меняется между 00 и FF, вместо того, чтобы 0000 - 03ff, как описано в мануале. Прежде гадал, не в усреднении ли причина, но дебагом ошибок не нашёл.
Подскажите, пожалуйста, где порыться ещё?