реклама на сайте
подробности

 
 
4 страниц V  « < 2 3 4  
Reply to this topicStart new topic
> eZ430-F2013, впечатления
VVlad
сообщение Feb 1 2010, 07:49
Сообщение #46


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 7-12-09
Пользователь №: 54 109



Спасибо за ответ, O.L.
GIE - это команда, разрешающая сигналы прерываний в спящем режиме процессора.
Вы хотите сказать, что после задания счётчика битов и содержимого RXTXdata для передачи нужно включить прерывания и спящий режим? Но я хочу выводить данные не по приходу внешнего сигнала, а по мере их подготовки внутри программы. Моя ошибка состоит в том, что я сделал недоступным вот этот код внутри обработчика прерывания
Код
TX_Next     bic.w   #OUTMOD2,&CCTL0      ; TX Mark
            rra.w   RXTXData             ; LSB is shifted to carry
            jc      TX_Test              ; Jump --> bit = 1
TX_Space    bis.w   #OUTMOD2,&CCTL0      ; TX Space
TX_Test     dec.w   BitCnt            ; All bits sent (or received)?
            reti                         ;

первая строка - очистка регистра CCTL0 (CCI0B-P.1.5?) от режима вывода данных
вторая - сдвиг слова, содержащегося в RXTXData, в носитель Carry (бит статусного регистра). Как слово поместится в бите - другой вопрос.
третья строка - выполняется только если бит, хранящийся в носителе Carry = 0, установка регистра CCTL0 (CCI0B-P.1.5?) в режим вывода данных
четвёртая строка - переход на уменьшение счётчика битов на единицу и возврат из прерывания, причём вывод всех битов не гарантирован, счётчик битов может и не быть нулевым.
Кто и что же в таком случае вызовет прерывание для завершения передачи данных?
Кстати, не посоветуете ли способ безопасно проверить внешний часовой кварц, осциллографом лезть напрямую нежелательно, можно ли программно передать сигнал с часового кварца на один из физических выходов корпуса для его наблюдения осциллографом?
Как для этого связать частоту тактирования ACLK c "дрыганием ножки"? На форумах мне встечался "метод мокрого пальца" и "метод морковки", но они показались достаточно экзотичными, есть ли более консервативные методы?

Сообщение отредактировал VVlad - Feb 1 2010, 08:03
Go to the top of the page
 
+Quote Post
SGPYVt
сообщение Feb 1 2010, 08:41
Сообщение #47





Группа: Участник
Сообщений: 4
Регистрация: 29-01-10
Из: Новомосковск, Тульской
Пользователь №: 55 135



Приветствую всех,
относительно процессора не компетентен, а вот про осциллятор могу посоветовать. В часах кварц частотой около 32 кГц можно проверить осциллографом - надо выбрать шкалу 50 мВ, интервал 10 мсек, подсоединить щупы к выводам кварца и подать один из проводов от элемента питания 1.5 Вольта - второй оставить неподключенным. При исправном осцилляторе на экране осциллографа будет два-три периода колебаний.
Go to the top of the page
 
+Quote Post
VVlad
сообщение Feb 1 2010, 13:26
Сообщение #48


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 7-12-09
Пользователь №: 54 109



Не совсем в тему (другой процессор) , но похожие явления обнаружены по адресу http://electronix.ru/forum/index.php?showt...натор&st=15.
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 1 2010, 20:30
Сообщение #49


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



VVlad, а для вас так принципиально использовать именно софтовый UART? Может стоит взять другой кристалл, с аппаратным UART? В противном случае следует вначале более тщательно изучить функционал и работу периферийный модулей, системы тактирования и прерываний, описанных в User;s Guide. И почитать Application Notes на тему использования Timer_A в качестве программного UART. Например, Implementing a UART Function with Timer_A3. В библиотеке фирмы Компэл есть переводные User's Manual (модули таймеров унифицированы и про Timer_A можно почитать в руководстве для семейства MSP430x1xx) и сборник переводов Application Notes. Рекомендую почитать вначале это, чтобы не гадать, изучая демонстрационные примеры исходников.
Насчет
Цитата
не посоветуете ли способ безопасно проверить внешний часовой кварц
совет простой - выведите сигнал ACLK на пин контроллера (P1.0), запрограммировав соответствующим образом регистры GPIO.
Код
P1SEL|=0x01;
P1DIR|=0x01;
Go to the top of the page
 
+Quote Post
O.L.
сообщение Feb 3 2010, 05:01
Сообщение #50


Частый гость
**

Группа: Свой
Сообщений: 96
Регистрация: 10-06-05
Из: Новосибирск
Пользователь №: 5 890



Цитата(VVlad @ Feb 1 2010, 13:49) *
GIE - это команда, разрешающая сигналы прерываний в спящем режиме процессора.
Вы хотите сказать, что после задания счётчика битов и содержимого RXTXdata для передачи нужно включить прерывания и спящий режим?

вторая - сдвиг слова, содержащегося в RXTXData, в носитель Carry (бит статусного регистра). Как слово поместится в бите - другой вопрос.
третья строка - выполняется только если бит, хранящийся в носителе Carry = 0, установка регистра CCTL0 (CCI0B-P.1.5?) в режим вывода данных
четвёртая строка - переход на уменьшение счётчика битов на единицу и возврат из прерывания, причём вывод всех битов не гарантирован, счётчик битов может и не быть нулевым.
Кто и что же в таком случае вызовет прерывание для завершения передачи данных?

Как для этого связать частоту тактирования ACLK c "дрыганием ножки"? На форумах мне встечался "метод мокрого пальца" и "метод морковки", но они показались достаточно экзотичными, есть ли более консервативные методы?


Доброго времени суток.

Самое трудное с неофитами, это понять, что именно с они не понимают.
Поэтому, дабы не черпать этот океан ложками, предлагаю отыскать тумблер "Brain for full speed", у меня он за правым ухом smile.gif и внимательно почитать эти документы. Лучше в обратной последовательности.
http://www.compel.ru/images/books/book_1.pdf и http://www.compel.ru/images/books/book_2.pdf
Из book_2 можно узнать, что GIE это не команда разрешения прерывания в спящем режиме, а бит который разрешает или запрещает процессору выполнять программы обработчики прерываний в случае если они разрешены, раньше говорили не замаскированны. То есть ожидаемые прерывания возникли и мы их либо обрабатываем GIE == 1 либо нет GIE == 0. Просто у данного типа контроллера биты установки режимом малого потребления и бит GIE расположены в одном и том же регистре статуса SR и их удобно устанавливать и сбрасывать, при необходимости, сразу все одной командой. Подробнее об этом написано в book_2 стр. 33-34.
В вашем случае, когда стоит задача просто передать байт данных, нужно разрешить только прерывание, причем где нибудь в самом начале.
Если все будет сделано правильно, то для начала передачи нужно только загрузить байт данных и иметь разрешенное прерывание для таймера и установленный бит GIE.
Далее, сдвиг слова, а рано как и байта, это команда которая выдвигает или копирует один крайний бит в Carry, в зависимости от направления сдвига, остальные биты остаются в своем регистре но то же сдвинутые на один бит. Работа этой команды исчерпывающе описана в book_2 на стр. 60.

По поводу сохранности счетчика битов предлагаю просто проверить в симуляторе.
Частота "тактирования ACLK c "дрыганием ножки"" связана в самом начале программы. Я думаю, что аббревиатура "2400 baud" о чем то вам говорит
<code>
; Conditions for 2400 Baud SW UART, ACLK = 32768
Bitime_5 EQU 06 ; 2025 ; ~0.5 bit length + small adjustment
Bitime EQU 014 ; 4725 ; 427us bit length ~ 2341 baud
</code>

По поводу вывода генератора на ножку порта, коллега rezident уже дал исчерпывающий ответ.

Сообщение отредактировал O.L. - Feb 3 2010, 05:03
Go to the top of the page
 
+Quote Post
VVlad
сообщение Feb 3 2010, 05:53
Сообщение #51


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 7-12-09
Пользователь №: 54 109



Слава благодарности Резиденту! После Ваших обяснений увидел осциллографом сигнал ACLK с P1.0 - ступенька 5 мкс длиной, потом скважность 55 мкс, то есть период 60 мкс. Частота 16.7 кГц. Странный глюк - после первого импульса второго почти не видно - он то есть, то нет, но начиная с третьего все чёткие, яркие, такие же, как первый. Подозреваю, что это неполадки с осциллографом. Буду разбираться.
Искренний респектище для O.L. - книги на русском и восхитительно подробные. Приступаю к изучению. Удаляюсь и углубляюсь.
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 3 2010, 10:10
Сообщение #52


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(VVlad @ Feb 3 2010, 10:53) *
книги на русском и восхитительно подробные. Приступаю к изучению. Удаляюсь и углубляюсь.
Так вы даже в FAQ не заглядывали? 07.gif Там я давал ссылку на библиотеку фирмы Компэл, где лежат все эти книги.
Go to the top of the page
 
+Quote Post
VVlad
сообщение Feb 24 2010, 11:04
Сообщение #53


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 7-12-09
Пользователь №: 54 109



Файлы с русским переводом 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, как описано в мануале. Прежде гадал, не в усреднении ли причина, но дебагом ошибок не нашёл.
Подскажите, пожалуйста, где порыться ещё?
Go to the top of the page
 
+Quote Post
VVlad
сообщение Feb 25 2010, 06:04
Сообщение #54


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 7-12-09
Пользователь №: 54 109



Код
            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

Ура, заработало!
Go to the top of the page
 
+Quote Post

4 страниц V  « < 2 3 4
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 09:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01453 секунд с 7
ELECTRONIX ©2004-2016