|
|
  |
eZ430-F2013, впечатления |
|
|
|
Feb 1 2010, 07:49
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 1 2010, 08:41
|
Группа: Участник
Сообщений: 4
Регистрация: 29-01-10
Из: Новомосковск, Тульской
Пользователь №: 55 135

|
Приветствую всех, относительно процессора не компетентен, а вот про осциллятор могу посоветовать. В часах кварц частотой около 32 кГц можно проверить осциллографом - надо выбрать шкалу 50 мВ, интервал 10 мсек, подсоединить щупы к выводам кварца и подать один из проводов от элемента питания 1.5 Вольта - второй оставить неподключенным. При исправном осцилляторе на экране осциллографа будет два-три периода колебаний.
|
|
|
|
|
Feb 1 2010, 20:30
|
Гуру
     
Группа: Свой
Сообщений: 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;
|
|
|
|
|
Feb 3 2010, 05:01
|
Частый гость
 
Группа: Свой
Сообщений: 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", у меня он за правым ухом  и внимательно почитать эти документы. Лучше в обратной последовательности. 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
|
|
|
|
|
Feb 3 2010, 05:53
|
Участник

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

|
Слава благодарности Резиденту! После Ваших обяснений увидел осциллографом сигнал ACLK с P1.0 - ступенька 5 мкс длиной, потом скважность 55 мкс, то есть период 60 мкс. Частота 16.7 кГц. Странный глюк - после первого импульса второго почти не видно - он то есть, то нет, но начиная с третьего все чёткие, яркие, такие же, как первый. Подозреваю, что это неполадки с осциллографом. Буду разбираться. Искренний респектище для O.L. - книги на русском и восхитительно подробные. Приступаю к изучению. Удаляюсь и углубляюсь.
|
|
|
|
|
Feb 3 2010, 10:10
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(VVlad @ Feb 3 2010, 10:53)  книги на русском и восхитительно подробные. Приступаю к изучению. Удаляюсь и углубляюсь. Так вы даже в FAQ не заглядывали?  Там я давал ссылку на библиотеку фирмы Компэл, где лежат все эти книги.
|
|
|
|
|
Feb 24 2010, 11:04
|
Участник

Группа: Участник
Сообщений: 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, как описано в мануале. Прежде гадал, не в усреднении ли причина, но дебагом ошибок не нашёл. Подскажите, пожалуйста, где порыться ещё?
|
|
|
|
|
Feb 25 2010, 06:04
|
Участник

Группа: Участник
Сообщений: 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 Ура, заработало!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|