Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: eZ430-F2013
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Страницы: 1, 2
VVlad
Слава благодарности Резиденту! После Ваших обяснений увидел осциллографом сигнал ACLK с P1.0 - ступенька 5 мкс длиной, потом скважность 55 мкс, то есть период 60 мкс. Частота 16.7 кГц. Странный глюк - после первого импульса второго почти не видно - он то есть, то нет, но начиная с третьего все чёткие, яркие, такие же, как первый. Подозреваю, что это неполадки с осциллографом. Буду разбираться.
Искренний респектище для O.L. - книги на русском и восхитительно подробные. Приступаю к изучению. Удаляюсь и углубляюсь.
rezident
Цитата(VVlad @ Feb 3 2010, 10:53) *
книги на русском и восхитительно подробные. Приступаю к изучению. Удаляюсь и углубляюсь.
Так вы даже в FAQ не заглядывали? 07.gif Там я давал ссылку на библиотеку фирмы Компэл, где лежат все эти книги.
VVlad
Файлы с русским переводом 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, как описано в мануале. Прежде гадал, не в усреднении ли причина, но дебагом ошибок не нашёл.
Подскажите, пожалуйста, где порыться ещё?
VVlad
Код
            bis.w   #CCIE,&CCTL0          ; влючим таймер А на времЯ TX_Byte
            call    #TX_Byte              ; передача средних значений
            bic.b   #001h,&P1OUT          ; сигнал об окончании P1.0 = 0

Спасибо, уже разобрался. Оказалось достаточно в приведённый фрагмент добавить одну строку вызова TX_Byte:
Код
                                       bis.w   #CCIE,&CCTL0          ; влючим таймер А на времЯ TX_Byte
            call    #TX_Byte              ; передача младшего байта
                                                call    #TX_Byte              ; передача старшего байта
            bic.b   #001h,&P1OUT          ; сигнал об окончании P1.0 = 0

Ура, заработало!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.