Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: eZ430-F2013
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Страницы: 1, 2
VVlad
Просьба откликнуться тем, кто пользовался конроллером-конструктором eZ430-F2013.
1) На плате установлен МК MSP430x20x1. Правда ли, что его ток потребления всего лишь 220 мкА?
2) По какой технологии выполнен этот чип (мои версии - ABT, BTL, CMOS, TTL)?
В даташите на него указано " 16-Bit RISC Architecture, 62.5 ", но архитектура и технология - различные понятия или я не прав?

Думаем покупать этот набор, прошу знатоков посоветуйте, пожалуйста, на что обратить внимание?
jorikdima
"конроллер-конструктор" - интересный термин smile.gif
Ток потребления сильно зависит от режимов. Сморите даташит с сайта производителя на msp430f2013.
Технология производства и архитектура это разные понятия. Архитектура RISC 16 бит, а технология то вам зачем?
Покупать с какой целью?
zhevak
Цитата(VVlad @ Dec 14 2009, 18:08) *
Просьба откликнуться тем, кто пользовался конроллером-конструктором eZ430-F2013.
1) На плате установлен МК MSP430x20x1. Правда ли, что его ток потребления всего лишь 220 мкА?
2) По какой технологии выполнен этот чип (мои версии - ABT, BTL, CMOS, TTL)?
В даташите на него указано " 16-Bit RISC Architecture, 62.5 ", но архитектура и технология - различные понятия или я не прав?

Думаем покупать этот набор, прошу знатоков посоветуйте, пожалуйста, на что обратить внимание?

1. Вопрос задан не совсем корректно. Например, я использую в своих изделиях (пожарные извещатели) именно F2001. У меня микроконтроллер просыпается примерно 1000-1300 раз в секунду, делает свою работу и вновь засыпает. При этом он хавает примерно 30-40 мкА. Кроме того, следует заметить, что напряжение питания тоже очень сильно влияет на энергопотребление.

2. sad.gif методом исключения -- остается только CMOS. Сдается мне, что Вас интересует не этот вопрос, а какой-то другой. Уровни входных сигналов, входные токи? Задавайте вопрос прямо, а технология... -- Вам ехать надо, а Вы шашечками интересуетесь?

3. Я не понял, что Вы собираетесь покупать -- eZ430-F2013 или MSP430x20x1?

Если первое ("свисток"), то для радиолюбительства сойдет, но не для промышленных применений. Не надежен, прошивка слетает, бит защиты жечь не может... в общем букет. Я убил несколько штук, потом купил MSP430-UIF и все заморочки закончились.
Если второе -- MSP430F20x1, то это нормальный МК. Правда, памяти у него -- кот наплакал, но ведь и задачи разные: смотря что МК должен, может под Вашу задачу он будет вокурат. Как знать!
VVlad
Цитата(zhevak @ Dec 14 2009, 17:03) *
Если первое ("свисток"), то для радиолюбительства сойдет, но не для промышленных применений. Не надежен, прошивка слетает, бит защиты жечь не может... в общем букет. Я убил несколько штук, потом купил MSP430-UIF и все заморочки закончились.
Если второе -- MSP430F20x1, то это нормальный МК. Правда, памяти у него -- кот наплакал, но ведь и задачи разные: смотря что МК должен, может под Вашу задачу он будет вокурат. Как знать!

Jorikdime - ну просто интересно.
to Zhevak-
1) если он так часто у вас просыпается, то сколько же времени он работает от проспался до заснул (один цикл)? Если 220 мкА при непрерывной работе, в 5 раз меньше за счёт скважности , неужто 07.gif за 166 мксек можно успеть 2500 команд?
2) ну просто интересно, пусть будет CMOS. Первым делом мы испортим самолёты, ну а девушек... и шашечки - потом.
3) Покупать собираемся комплект, вот поэтому и обращаюсь к добрым профессионалам за консультацией. Если так легко сломать "свисток", то на что обращать внимание в первую очередь? Статика? Или питание? Спасибо за сочувствие, но MSP430-UIF дороговат пока.

Задача - измерение напряжения от электродных датчиков - они крайне чувствительны к входному сопротивлению схемы (например, для измерения рН входной импеданс должен быть порядка 10^15 Ом).
АЦП хотели сначала MAX1301, но цена 2700 руб за штуку отпугнула.
Не посоветуете ли недорогой АЦП 16-разрядный, с униполярным питанием 5 Вольт и приёмом сигналов +-12 (15 Вольт)?
mdmitry
Цитата(VVlad @ Dec 14 2009, 17:32) *
Не посоветуете ли недорогой АЦП 16-разрядный, с униполярным питанием 5 Вольт и приёмом сигналов +-12 (15 Вольт)?

Это как??? У Вас опорный источник должен быть не менее чем размах сигнала. Обычно диапазон существенно меньше +-12 (15) В. Так как Вам требуется ОЧЕНЬ большое входное сопротивление, то напрашивается нормирующий усилитель с необходимым входным сопротивлением и скорректированным под возможности АЦП диапазоном выходного сигнала.
jorikdima
у АЦП подозреваю нет таких конских входных сопротивлений.
VVlad
Цитата(mdmitry @ Dec 14 2009, 18:57) *
Это как??? У Вас опорный источник должен быть не менее чем размах сигнала. Обычно диапазон существенно меньше +-12 (15) В. Так как Вам требуется ОЧЕНЬ большое входное сопротивление, то напрашивается нормирующий усилитель с необходимым входным сопротивлением и скорректированным под возможности АЦП диапазоном выходного сигнала.

Верно, в MSP430F2012 есть встроенный АЦП. Можно ли его использовать при размахе от -2 до +2 Вольт?
Относительно MAX1301 - вот поэтому его цена и зашкаливает 2700-3100 руб. за корпус.
В качестве нормирующего усилителя решили ставить AD797 ( с входным шумом в 1.2 nV/sqrt(Hz)) или 795-й с входным импедансом 10^14 Ом.
Если нормирующий будет работать с коэффициентом усиления меньше 1 , то из размаха в 4 Вольта можно ужать до 3 Вольт. Но как быть с отрицательными напряжениями?
jorikdima
Цитата(VVlad @ Dec 28 2009, 11:20) *
Верно, в MSP430F2012 есть встроенный АЦП. Можно ли его использовать при размахе от -2 до +2 Вольт?

В даташите на контроллер абсолютно четко указан диапазон допустимых входных напряжений. Он от GND до AVCC.
VVlad
Да, на плате исходно стоял МК MSP430F2013 c 16-разрядным АЦП, и его ценность навела на мысль заменить более дешевым MK MSP430F2012 c 10-разрядным АЦП. Встал вопрос, как его проверить. Поиск на форуме привёл к монографии Chrisa Nagy http://upload.caxapa.ru/mcu/msp430/Using%20MSP430.rar , где на странице 90 приведён пример программного кода для работы с АЦП от встроенного температурящего диода. Попытка компиляции его в IAR Embedded Workbench IDE ощенилась 5 ошибками и тремя предупреждениями. Ниже приведён так и недокомпилированный исправленный вариант.

CODE
#include "io430.h"

int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
cout << Determine_Temp(0);
cout << Determine_Temp(1);
return 0;
}
signed long Determine_Temp (unsigned char BooleanFlag)
// This function returns device temperature, based on an ADC conversion
// The passed parameter acts as a flag. If it is zero, the temperature is
// returned in degrees Fahrenheit. If it is non-zero, it is returned in
// degrees Celsius.
{
signed long Temperature=25; //Define and initialize working variable
ADC12CTL0 = SHT0_6 + SHT1_6 + REFON + ADC12ON;
// Initialize control register 0. Sets up conversion clock, internal reference
ADC12CTL1 = SHP; //Conversion sample timer signal is
//sourced from the sampling timer
ADC12MCTL0 = INCH_10 + SREF_1; //Use internal reference with
//respect to ground, Temp sensor
//is on input channel 10.
ADC12CTL0 |= ADC12SC + ENC; //Enable and start conversion
while (ADC12CTL1 & 0x01); //Hang in loop until conversion
//completes.
Temperature = ADC12MEM0 & 0x00000FFF;
Temperature *= 845; //These steps convert the ADC reading
//to degrees Celsius
Temperature = Temperature >> 13;
Temperature -= 278;
if (BooleanFlag) return Temperature; //Return temperature in degrees
//Celsius, if required
Temperature *=461;
Temperature = Temperature >> 8; //Otherwise, convert to Fahrenheit and
//return
Temperature +=32;
return Temperature;
}//End Determine Temperature Function

1) Верна ли догадка о том, что в пакете IAR нет функции вывода текстовой строки по формату (cout не работает)?
2) Как правильно сформулировать вопрос, что следует изменить в тексте, чтобы он откомпилировался?
jorikdima
не используйте cout и все. Все что вам надо в этой программе это ф-ция Determine_Temp, она возвращает результат измерения, видимо (не вчитывался в код, но судя по названию). Можете хоть в дебаггере смотреть на результат ф-ции или выводить в порт, как вам угодно. cout пользуется такими ф-циями как put_char если не ошибаюсь и именно вы должны их реализовать, чтобы оно работало.
VVlad
Спасибо за подробный и ясный ответ, Jorikdima.

Первое сомнение. В приведённом со страницы коде исходно была строка " Temperature >> = 13;" Смысл её - путем сдвига вправо на 13 бит отсечь неинформативные значащие цифры и шумы, уменьшив также результат в 2^13 раз.
Компилятор не принял такой орфографии и строка была заменена на "Temperature = Temperature >> 13";

Извините заранее за неумный вопрос, но зачем присваивается начальное значение 25? (Среднея комнатная температура в градусах Цельсия?).

Строка "Temperature = ADC12MEM0 & 0x00000FFF;" обнуляет старшие пятьполубайт, сохраняя три младших (12 бит).
Умножение на 845 (1101001101) для конверсии в градусы Цельсия добавляет 10 бит, а после сдвига на 13 имеем 9 значащих двоичных цифр, соответствующих трёхзначному десятичному числу в градусах Кельвина.
Прав ли я, что строку "Temperature -= 278;" следует исправить на "Temperature -= 273;"?

Относительно загадошной фразы на стр. 89 "This code is written assuming 3.35 mV/°C, as is the case with the
’149 device. If you are using a different device, check your datasheet for the correct value."
думаю, что 149 - это номер серии термочувствительных диодов, встроенных в МК, а значение 3.35 должно влиять на коэффициент 845. Но смысл формулы мне найти пока не удалось (845\3.35 = 252). Поделитесь идеями, пожалуйста.

По существу, на странице 28 "IAR C LIBRARY FUNCTIONS Reference Guide" есть описание функции printf (stdio.h),
так что COUT не понадобилось.

И на стр. 25 "MSP430 IAR Embedded Workbench® IDE User Guide" показано как создать рабочее место (workspace window), потом файл проэкта и в нем файл с кодом программы.
rezident
Цитата(VVlad @ Dec 29 2009, 12:41) *
Компилятор не принял такой орфографии и строка была заменена на "Temperature = Temperature >> 13";
А какую ошибку выдал? Вполне возможно, что достаточно было привести константу к типу переменной
Код
Temperature >>= 13L;

Цитата(VVlad @ Dec 29 2009, 12:41) *
Строка "Temperature = ADC12MEM0 & 0x00000FFF;" обнуляет старшие пятьполубайт, сохраняя три младших (12 бит).
Умножение на 845 (1101001101) для конверсии в градусы Цельсия добавляет 10 бит, а после сдвига на 13 имеем 9 значащих двоичных цифр, соответствующих трёхзначному десятичному числу в градусах Кельвина.
Прав ли я, что строку "Temperature -= 278;" следует исправить на "Temperature -= 273;"?
В данном примере используются "магические числа" для того, чтобы делать вычисления с дробными величинами, не используя арифметику "плавающих" чисел, для которой потребуется соответствующая библиотека. Библиотека обычной "плавучки" порядка 600 байт кода добавит. Умножение на 845 и затем арифметический сдвиг на 13 бит вправо эквивалентно умножению на дробь 845/8192=0,103149.
Цитата(VVlad @ Dec 29 2009, 12:41) *
Относительно загадошной фразы на стр. 89 "This code is written assuming 3.35 mV/°C, as is the case with the
’149 device. If you are using a different device, check your datasheet for the correct value."
думаю, что 149 - это номер серии термочувствительных диодов, встроенных в МК,
Под " ’149 device" имеется в виду тип микроконтроллера - MSP430F149.
Цитата(VVlad @ Dec 29 2009, 12:41) *
а значение 3.35 должно влиять на коэффициент 845. Но смысл формулы мне найти пока не удалось (845\3.35 = 252). Поделитесь идеями, пожалуйста.
3,35мВ/°C это наклон линейной части характеристики встроенного диода, который является термочувствительным элементом в MSP430F149. Формула для расчета по этой характеристике имеется в User's Guide в разделе ADC12 operation -> Using the Integrated Temperature Sensor.
VTEMP=0.00355В/°C*(TEMPC)+0.986В
Из нее выводится формула для температуры
T[°C]=VTEMP / 0.00355В/°C - 0.986В / 0.00355В/°C
С учетом, что АЦП 12-битный, а величина опорного напряжения VREF=1,5В получается VTEMP=VREF/4096*ADC12code откуда
T[°C]=ADC12code * 1,5В / 4096 / 0,00355В/°C - 0,986В / 0,00355В/°C или
T[°C]=ADC12code*0,103158°C-277,7°C
Здесь мы получаем те самые коэффициенты, фигурирующие в программе 845 / 2^13=0,103149 и -278.
Умножение на дробный коэффициент в программе заменено на умножение на "магическое" число 845 с последующим делением путем арифметического сдвига. Дробь 845/8192 дает весьма хорошее приближение к искомому коэффициенту, достаточное для вычисления температуры с точностью до целых градусов. Для перевода в градусы Фаренгейта в программе соответственно используются другие коэффициенты.
VVlad
ошибка в ответ на строку "Temperature >> = 13L;" была такой

Error[Pe029]: expected an expression C:\Documents and Settings\vlad\Мои документы\IAR Embedded Workbench\temper-prj\main.c 22 ( В компиляторе Си)

Error[Pe029]: expected an expression C:\Documents and Settings\vlad\Мои документы\IAR Embedded Workbench\temper-prj\main.cpp 23 ( В компиляторе Си++)


За терпение и редкое в наше время серьёзное вспомоществование сердечно благодарю уважаемого rezident -а.
Особое мерси за пояснение смысла формулы. У меня есть два USER Guides ( EW430_UserGuide.pdf и MSP430x2xx_Family_User's_Guide_(Rev._D)_slau144d.pdf). В обоих искал, в последнем видел передаточную функцию, идентичную приведённому графику, а подробное объяснение нашёл только здесь. Вероятно, есть ещё третий ЮзерГайд, мне пока незнакомый. Спасибо за помощь.

Искренне поздравляю с Наступающим Новым Годом. Всего наилучшего. Пусть Ваши микроконтроллеры работают без ошибок и долго.
SSerge
А на строку "Temperature >> = 13L;" ругается потому что там лишний пробел затесался, между >> и =
rezident
Цитата(SSerge @ Dec 31 2009, 01:56) *
А на строку "Temperature >> = 13L;" ругается потому что там лишний пробел затесался, между >> и =
Точно! Пробел лишний. А я и не обратил внимания, скопипастив строку у VVlad. Исправил в своем сообщении.
Цитата(VVlad @ Dec 30 2009, 20:26) *
Вероятно, есть ещё третий ЮзерГайд, мне пока незнакомый.
Ну вообще-то этих User's Guide как минимум пять, по одному на каждое семейство MSP430. rolleyes.gif А выведенная мной формула основана всего лишь на внимательном чтении одного из них и минимальных знаниях физики и математики в объеме, преподаваемом при обучении в средней школе. Не вижу в этом какой-то доблести. laughing.gif
Цитата(VVlad @ Dec 30 2009, 20:26) *
Искренне поздравляю с Наступающим Новым Годом. Всего наилучшего.
И вас с Наступающим! santa2.gif
VVlad
В Документе MSP430x2xx_Family_User's_Guide_(Rev._D)_slau144d.pdf на странице 6-2 в главе про работу с DMA (Direct Memory Access) - (подозреваю, что перевод "пропускная память директора" не совсем точен). Указано ясно - использование DMA контролёра, передающего данные из одного адреса в другой (типа почтальон), без вмешательства ЦПУ может передавать данные конверсии АЦП в оперативную память.
(The direct memory access (DMA) controller transfers data from one address
to another, without CPU intervention, across the entire address range. For
example, the DMA controller can move data from the ADC12 conversion
memory to RAM.)
Отсюда вопрос - значит ли это, что если использовать DMA, то это позволить ужать код на ассемблере до заветных 1 кб, чтобы поместилось на флеш? Другими словами, при удобствах DMA не сильно ли он усложняет-расширяет код?
rezident
А где вы увидели модуль DMA в MSP430F2013? В User's Guide описана вся имеющаяся в кристаллах данного семейства периферия. Но какая именно периферия имеется в данном конкретном кристалле нужно смотреть в его datasheet.
VVlad
С прошедшими (наконец с облегчением-спасибо Господи, пережили!) праздниками поздравляю всех дорогих форумчан. Пользуясь знаменательной датой (11 января - день "спасибо") благодарю за помощь.
Подозреваю, мои проблемы были с тем, что тип микроконтроллера, используемый мною - MSP430F2012. Взятый же из книга пример - "Под " ’149 device" имеется в виду тип микроконтроллера - MSP430F149."
Переписал на ассемблере, вот что получилось:
Код
MOV "00110", ADC12CTL1



Цитата(rezident @ Dec 31 2009, 21:51) *
А где вы увидели модуль DMA в MSP430F2013? В User's Guide описана вся имеющаяся в кристаллах данного семейства периферия. Но какая именно периферия имеется в данном конкретном кристалле нужно смотреть в его datasheet.


Уважаемый Резидент, спасибо за участие, на странице 18 документа "SLAS491A -- August 2005 - Revised October 2005"
приведено следующее -


ADC10 (MSP430x20x2 only)
The ADC10 module supports fast, 10-bit analog-to-digital conversions. The module implements a 10-bit SAR
core, sample select control, reference generator and data transfer controller, or DTC, for automatic conversion
result handling allowing ADC samples to be converted and stored without any CPU intervention.

Implements - я понял как "выполнять, осуществлять, обеспечивать выполнение".

That's why I hope to use DTC as trivial form of DMA.
VVlad
Извините за ошибочные дубликаты - глючила связь.

Подскажите, пожалуйста, почему на следующие простые команды компилятор ругается
вот так
Error[446]: Number out of range. Valid range is -32768 (-0x8000) to 65535 (0xFFFF). C:\Documents and Settings\vlad\Мои документы\IAR Embedded Workbench\temper-prj\asm.s43 17

Ведь если перевести из двоичного вида в десятичный, получим 3338, что укладывается не только в диапазон -32768 до 65535, но и в диапазон (-8000 до FFFF в шестнадцатеричном представлении).
Код
#include "msp430x20x2.h"                    ; #define controlled include file

EDE     ORG     01B0h
        MOV.W   #WDTPW+WDTHOLD,&WDTCTL ; Stop watchdog timer
        MOV.W   #011001100111000,EDE   ; Настройка первого управляющего АЦП
        MOV.W   #101000100000010,EDE+1 ; Настройка второго управляющего АЦП
        MOV.W   #011001100111000,EDE   ; Разрешить и запустить преобразование
                                       ; (endless loop)
        END
rezident
Цитата(VVlad @ Jan 11 2010, 12:24) *
That's why I hope to use DTC as trivial form of DMA.
Эта оговорка совершенно справедливая, DTC это не полноценный DMA.
Цитата(VVlad @ Jan 11 2010, 22:20) *
Подскажите, пожалуйста, почему на следующие простые команды компилятор ругается
вот так
Error[446]: Number out of range. Valid range is -32768 (-0x8000) to 65535 (0xFFFF). C:\Documents and Settings\vlad\Мои документы\IAR Embedded Workbench\temper-prj\asm.s43 17
Потому, что #011001100111000 это десятичное число, а не двоичная запись числа. Символ # в записи указывает на способ адресации аргумента - непосредственная адресация, а вовсе не на двоичную форму записи этого числа. Двоичные числа в ассемблере IAR начинаются с префикса b или заканчиваются суффиксом b. Смотрите EW430_AssemlerReference.pdf из комплекта документации IAR.
VVlad
Цитата(rezident @ Jan 11 2010, 23:13) *
Эта оговорка совершенно справедливая, DTC это не полноценный DMA.
Потому, что #011001100111000 это десятичное число, а не двоичная запись числа. Символ # в записи указывает на способ адресации аргумента - непосредственная адресация, а вовсе не на двоичную форму записи этого числа. Двоичные числа в ассемблере IAR начинаются с префикса b или заканчиваются суффиксом b. Смотрите EW430_AssemlerReference.pdf из комплекта документации IAR.

Благодарю за снисходительность к моему дремучему невежеству и особое спасибо за точный исчерпывающий ответ.
Обнаружил только что, есть файл msp430.h в папке X:\430\inc\, со ссылкой на файл msp430x20x2.h, где
абсолютным адресам управляющих регистров присвоены псевдонимы

Код
#define ADC10DTC0_          (0x0048)    /* ADC10 Data Transfer Control 0 */
DEFC(   ADC10DTC0         , ADC10DTC0_)
#define ADC10DTC1_          (0x0049)    /* ADC10 Data Transfer Control 1 */
DEFC(   ADC10DTC1         , ADC10DTC1_)


Можно ли использовать их вместо абсолютных адресов, например, так

Код
  
        MOV.W   #WDTPW+WDTHOLD,&WDTCTL; Stop watchdog timer
        MOV.W   #011001100111000b,ADC10DTC0_  ; Настройка первого управляющего АЦП
        MOV.W   #101000100000010b,ADC10DTC1_; Настройка второго управляющего АЦП
        MOV.W   #011001100111011b,ADC10DTC0_  ; Разрешить и запустить преобразование


Простите за ещё один глупый вопрос, но что означает символ подчёркивания, обязателен ли он (в функции DEFC два аргумента - первый без подчеркивания, второй - с ним)?
rezident
Цитата(VVlad @ Jan 12 2010, 17:07) *
Можно ли использовать их вместо абсолютных адресов
При подключении соответствующего хедера использовать можно, но не рекомендуется. TI настойчиво рекомендует везде использовать стандартные символьные обозначения битов и регистров. Именно те, которые во всей документации TI упоминаются. Эти стандартные обозначения как раз в хедерах msp430xXXX.h прописаны. Хедеры с именами io430xXXX.h это аналогичное изделие, но от IAR. В заголовках хедеров обычно указано, кто их автор. Откройте в любом текстовом редакторе и посмотрите.
Цитата(VVlad @ Jan 12 2010, 17:07) *
Простите за ещё один глупый вопрос, но что означает символ подчёркивания, обязателен ли он (в функции DEFC два аргумента - первый без подчеркивания, второй - с ним)?
Подчеркивание введено для того, чтобы различать стандартные символьные обозначение регистров и их "подстановочные" имена, используемые в макросах IAR. Как я уже написал выше, использовать следует именно стандартные символьные имена, которые без подчеркиваний в конце или начале.
Кстати, ваша запись некорректная. Вы использовали символьный способ адресации, вместо абсолютного. В результате константы в трех последних командах будут загружены совсем не по тому адресу, которому вы предполагаете. Читайте внимательно описание способов адресации операндов и их символьного обозначения в User's Guide. Вот тут на русском есть.
VVlad
Цитата(rezident @ Jan 12 2010, 22:57) *
При подключении соответствующего хедера использовать можно, но не рекомендуется. TI настойчиво рекомендует везде использовать стандартные символьные обозначения битов и регистров. Именно те, которые во всей документации TI упоминаются. Эти стандартные обозначения как раз в хедерах msp430xXXX.h прописаны. Хедеры с именами io430xXXX.h это аналогичное изделие, но от IAR. В заголовках хедеров обычно указано, кто их автор. Откройте в любом текстовом редакторе и посмотрите.
Подчеркивание введено для того, чтобы различать стандартные символьные обозначение регистров и их "подстановочные" имена, используемые в макросах IAR. Как я уже написал выше, использовать следует именно стандартные символьные имена, которые без подчеркиваний в конце или начале.
Кстати, ваша запись некорректная. Вы использовали символьный способ адресации, вместо абсолютного. В результате константы в трех последних командах будут загружены совсем не по тому адресу, которому вы предполагаете. Читайте внимательно описание способов адресации операндов и их символьного обозначения в User's Guide. Вот тут на русском есть.

В результате искренних и страстных попыток понять управление встроенным в MSP430F2012 АЦП (ADC10) сложилось впечатление, что не стоит выключать сторожевой таймер, настроить его на 100 мсек, загрузить контрольные регистры (250 мксек), запустить 16-кратную выборку (0.8 мсек), преобразование (100 мкс), посредством DTC заполнить память, выполнить усреднение (0.9 мсек), передать результат в порт вывода и уйти в спящий режим (на 97 мсек) до перезапуска от сторожевого таймера.

Относительно хедер-файлов разобрался, символ подчёркивания как признак "макросной подстановочности" осознал,
в любезно предоставленном Вами "ЮГ"-е есть фраза "В большинстве примеров показаны схожие режимы адресации для источника и получателя, но в команде возможны любые правильные комбинации способов адресации источника и получателя." после таблицы 3.3 перед замечанием о EDE и TONI.
Значит ли это, что допустимо совместить в одной команде кода ассемблера прямой режим для первого операнда (вместо #011001100111000b возможно эквивалентное #3338h)-источника с абсолютным режимом (&01B0h) для второго операнда - получателя?
Код
EDE     ORG     01B0h
        MOV.W   #WDTPW+WDTHOLD,&WDTCTL; Stop watchdog timer
        MOV.W   #3338h,&EDE  ; Настройка первого управляющего АЦП

Кстати по адресу http://focus.ti.com/mcu/docs/mcuprodcodeex...&tabId=1468
мне посчастливилось скачать файловый архив из http://www.ti.com/lit/zip/slac080,
где в файле msp430x20x2_adc10_01.asm
загрузка контрольных регистров в АЦП выглядит просто сказочно:
Код
.cdecls C,LIST,  "msp430x20x2.h"

;------------------------------------------------------------------------------
            .text                          ; Progam Start
;------------------------------------------------------------------------------
RESET       mov.w   #0280h,SP              ; Initialize stackpointer
StopWDT     mov.w   #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT
SetupADC10  mov.w   #ADC10SHT_2+ADC10ON+ADC10IE,&ADC10CTL0; 16x, enable int.

Если концепция верна, то здесь первый операнд адресуется то ли прямым режимом (признак - есть символ решётки #),
то ли символьным (есть псевдонимы типа ADC10SHT_2). Или от нас скрывают какоё-то восьмое чудо света-режим комбинированный прямо-символьный? Стыдно признаться, но не могу понять. Помогите пожалуйста разобраться.
rezident
Цитата(VVlad @ Jan 13 2010, 13:22) *
уйти в спящий режим (на 97 мсек) до перезапуска от сторожевого таймера.
Зачем перезапуск-то нужен? Используйте WDT в режиме интервального таймера, который вызывает установку флага WDTIFG и прерывание с тем же периодом, а не полный рестарт программы. Прерывание "разбудит" ядро. А все ваши программные действия можно выполнить внутри обработчика прерывания, либо выполнить команду, выводящую ядро из спячки. Программа при этом должна быть зациклена в бесконечный цикл.
Цитата(VVlad @ Jan 13 2010, 13:22) *
Значит ли это, что допустимо совместить в одной команде кода ассемблера прямой режим для первого операнда (вместо #011001100111000b возможно эквивалентное #3338h)-источника с абсолютным режимом (&01B0h) для второго операнда - получателя?
Да, допустимо.
Цитата(VVlad @ Jan 13 2010, 13:22) *
Если концепция верна, то здесь первый операнд адресуется то ли прямым режимом (признак - есть символ решётки #),
то ли символьным (есть псевдонимы типа ADC10SHT_2). Или от нас скрывают какоё-то восьмое чудо света-режим комбинированный прямо-символьный?
В вашем примере символьные обозначения битов, которые суммируются (+) в константу препроцессором. А константа в свою очередь адресуется непосредственным (#) образом, то бишь располагается в памяти непосредственно сразу вслед за кодом операнда.
VVlad
Резидент, Ваши ответы поразительным образом сочетают в себе глубокий профессионализм с доступностью изложения. Не устаю радоваться счастью общения с Вами.
VVlad
Если пишу не в тему, простите и не бейте больно, пожалуйста. Из файла slac080g взял за основу код msp430x20x2_adc10_08.s43
Код
#include "msp430x20x2.h"
;-------------------------------------------------------------------------------
            RSEG    CSTACK                 ; Определяем сегмент стека
;-------------------------------------------------------------------------------
            RSEG    CODE                   ; Сборка во флеш-памяти
;-------------------------------------------------------------------------------
RESET       mov.w   #SFE(CSTACK),SP        ; Инициировать указатель стека
StopWDT     mov.w   #WDTPW+WDTHOLD,&WDTCTL ; Остановить сторожевой таймер
SetupADC10  mov.w   #CONSEQ_2+INCH_1,&ADC10CTL1; Режим разового повтора
            mov.w   #SREF_1+ADC10SHT_2+MSC+REFON+ADC10ON+ADC10IE,&ADC10CTL0;
            mov.w   #30,&TACCR0            ; Задержка для установления  Ref
            bis.w   #CCIE,&TACCTL0         ; Прерывание режима сравнения.
            mov.w   #TACLR+MC_1+TASSEL_2,&TACTL; верхний режим, SMCLK
            bis.w   #LPM0+GIE,SR           ; Вход в LPM0 с прерываниями
            bic.w   #CCIE,&TACCTL0         ; Отключить прерывание таймера
            dint                           ; Отключить прерывания
            mov.b   #020h,&ADC10DTC1       ; 32 преобразования
            bis.b   #02h,&ADC10AE0         ; опция выбора P1.1 для АЦП
SetupP1     bis.b   #001h,&P1DIR           ; выход P1.0 в режим выводы
                                           ;
Mainloop    bic.w   #ENC,&ADC10CTL0        ; Начало ОПЦ
busy_test   bit     #BUSY,&ADC10CTL1       ; ядро ADC10 неактивно?
            jnz     busy_test              ;
            mov.w   #0200h,&ADC10SA        ; Запуск буфера данных
            bis.b   #001h,&P1OUT           ; P1.0 = 1
            bis.w   #ENC+ADC10SC,&ADC10CTL0; Запуск захвата
            bis.w   #CPUOFF+GIE,SR         ; LPM0, режим запуска по ADC10_ISR
            bic.b   #001h,&P1OUT           ; P1.0 = 0
            jmp     Mainloop               ; Повтор ОПЦ
                                           ;
;-------------------------------------------------------------------------------
TA0_ISR;    ISR for TACCR0
;-------------------------------------------------------------------------------
            clr.w   &TACTL                 ; Очистка управ. регистров Timer_A
            bic.w   #LPM0,0(SP)            ; Выход из LPM0 по reti
            reti                           ;
;-------------------------------------------------------------------------------
ADC10_ISR;  Exit LPM0 on reti
;-------------------------------------------------------------------------------
            bic.w   #CPUOFF,0(SP)          ; Выход из LPM0 по reti
            reti                           ;
                                           ;
;-------------------------------------------------------------------------------
            COMMON  INTVEC                 ; Векторы прерывания
;-------------------------------------------------------------------------------
            ORG     ADC10_VECTOR           ; Вектор ADC10
            DW      ADC10_ISR
            ORG     TIMERA0_VECTOR         ; Вектор Timer_A0
            DW      TA0_ISR
            ORG     RESET_VECTOR           ; POR, ext. Reset
            DW      RESET
            END

В ответ на попытку откомпилировать получил ошибку
Код
Error[e16]: Segment RESET (size: 0x2 align: 0x1) is too long for segment definition. At least 0x2 more bytes needed. The  
problem occurred while processing the segment placement command "-Z(CONST)RESET=FFFE-FFFF", where at the  
moment of placement the available memory ranges were "-none-"
   Reserved ranges relevant to this placement:
   ffe0-ffff            INTVEC

Пытаясь найти смысл в сегменте RESET, выяснил, что переменная CSTACK отсутствует как в хедерфайле "msp430x20x2.h", так и в хедерфайле "io430x20x2.h". Допустим, в этой строке она определяется и инициализируется, сколько же тогда под неё памяти отводится. В сообщении об ошибке (е16) говорится, что сегмент слишком велик. Может быть его уменьшить? Если да, то как это сделать? Подскажите, пожалуйста, где взять описание ошибок, чтобы не беспокоить по поводу каждой ошибки. Заранее спасибо.
rezident
Сообщение модератора ON.
Выделил сообщение из ветки FAQ.
Не нужно извиняться. Следует сразу писать в свою или в отдельную ветку.
Сообщение модератора OFF.

Цитата(VVlad @ Jan 14 2010, 20:43) *
Допустим, в этой строке она определяется и инициализируется, сколько же тогда под неё памяти отводится.
Да хоть все ОЗУ под стек можете отвести. Стек растет сверху вниз (имеются ввиду адреса), а данные в ОЗУ принято располагать снизу и наращивать вверх. Если расход стека большой или данных много, то стек с данными могут где-то пересечься. Этого нужно избегать, просчитав заранее расход стека для самого неблагоприятного стечения обстоятельств (вложенные прерывания + переменные на стеке). Хотя надо отметить, что "наползание" стека на область данных это один из самых гнусных багов (сложных для диагностики и вылавливания его).
Цитата(VVlad @ Jan 14 2010, 20:43) *
В сообщении об ошибке (е16) говорится, что сегмент слишком велик. Может быть его уменьшить? Если да, то как это сделать?
Сегментацию программы измените. Определите явно ее начало в памяти. Например, так
Код
;-------------------------------------------------------------------------------
            ORG     0FC00h        ; Progam Start (1K Flash device)
;-------------------------------------------------------------------------------

вместо
Код
;-------------------------------------------------------------------------------
            RSEG    CODE            ; Сборка во флеш-памяти
;-------------------------------------------------------------------------------
Цитата(VVlad @ Jan 14 2010, 20:43) *
Подскажите, пожалуйста, где взять описание ошибок, чтобы не беспокоить по поводу каждой ошибки.
В документации/руководстве вашего компилятора. Кроме того, в IAR диагностические сообщения и без этого довольно понятны сами по себе.
VVlad
В ответ на

Код
#include "msp430x20x2.h"
;-------------------------------------------------------------------------------
            RSEG    CSTACK                 ; Определяем сегмент стека
;-------------------------------------------------------------------------------
            ORG     0FC00h       ; Начало программного кода (1K Flash device)
;-------------------------------------------------------------------------------
RESET       mov.w   #SFE(CSTACK),SP        ; Инициировать указатель стека
StopWDT     mov.w   #WDTPW+WDTHOLD,&WDTCTL ; Остановить сторожевой таймер


нечто другое получено -

Код
Linking
Error[e16]: Segment CSTACK (size: 0xfcac align: 0x1) is too long for segment definition.  
At least 0xfc2c more bytes needed. The problem occurred while processing the  
segment placement command "-Z(DATA)CSTACK+_STACK_SIZE#", where at the  
moment of placement the available memory ranges were "CODE:200-27f"
   Reserved ranges relevant to this placement:
   200-27f              CSTACK
Error while running Linker


То есть ошибка та же, но вместо размера сегмента под CSTACK в 0х2 теперь 0хfc2c, требовать тоже стал больше - 0х8еса. Доступная память под стек стала 7f? (200-27f)

После прочтения http://electronix.ru/forum/index.php?showt...st&p=591968
захотел проверить, что написано в файле lnk4302012.lnx, и там то же самое -
Код
// ---------------------------------------------------------
// Read-write memory.
// ---------------------------------------------------------

-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=0200-027F
-Z(DATA)CSTACK+_STACK_SIZE#


// --------------------------------------------------------

А также ниже
Код
// ---------------------------------------------------------
// Code
// ---------------------------------------------------------

-Z(CODE)CSTART,ISR_CODE=F800-FFDF
-P(CODE)CODE=F800-FFDF

Правильно ли я понял, что когда линкер доходит до строки -Z(DATA)CSTACK+_STACK_SIZE#,
ему неоткуда взять значение STACK_SIZE#, и поэтому fcac-fc2c=80 байтов перекрываются с сегментом CODE?

В руководстве по Компилятору "MSP430 IAR C/C++ Compiler Referense Guide" на странице 31 (Placing code and Data) в главе "Segments and Memory" про стек не сказано ничего вплоть до стр.37-38. Там ясно сказано, что CSTACK - служебное зарезервированное слово для названия сегмента данных для поддержания стека. И системный код инициализирует указатель стека в конец сегмента стека. Как сказано ниже, выбрав Project>Options>General>
Options>Stack/Heap/Overrhide Defaults/Stack 50 заменил на 20, результат не вдохновил -
Код
Linking
Error[e16]: Segment CSTACK (size: 0xfc8e align: 0x1) is too long for segment definition.  
At least 0xfc0e more bytes needed. The problem occurred while processing the  
segment placement command "-Z(DATA)CSTACK+_STACK_SIZE#", where at the  
moment of placement the available memory ranges were "CODE:200-27f"
   Reserved ranges relevant to this placement:
   200-27f              CSTACK
Error while running Linker

Единственное отличие - fc8e-fc0e=снова 80.
Первый недоуменный вопрос - почему разность не изменилась с 50 до 20, а осталась 80, как и раньше?
Второй загадочный артефакт - указанная для командной строки строка -D_CSTACK_SIZE=size отсутствует в файле lnk4302012.lnx (закоментарена), как же линкер опять узнаёт размер стека как 80? Откуда?
rezident
Понимаете ли, VVlad, языки нас объединяют и разъединяют одновременно. Большинство недоразумений возникают от недопонимания или незнания языка собеседника. Языки программирования не лишены этих человеческих недостатков. Оно и понятно, т.к. они придуманы людьми же для того, чтобы люди могли "объяснить" на понятном им языке, что же они хотят от программы? В свою очередь программа-компилятор переводит человеческие "хотелки" в вид, понятный уже исполняющему инструкции ядру МК. Если вы не можете толком объяснить компилятору чего же вы хотите, то может стоит его язык получше изучить? Вот вы пишете
Цитата(VVlad @ Jan 15 2010, 14:21) *
В руководстве по Компилятору "MSP430 IAR C/C++ Compiler Referense Guide" на странице 31 (Placing code and Data) в главе "Segments and Memory" про стек не сказано ничего вплоть до стр.37-38.
но пардоньте! причем тут руководство по языку Си, если вы пишете на языке Ассемблера? laughing.gif Вы уж либо читайте руководство MSP430 IAR Assembler Reference Guide, либо пишите программу на (как я понял) более знакомом вам языке Си.
Ваш код программы из сообщения #28 будет нормально компилироваться (о нормальной работе потом поговорим wink.gif ), если в нее внести небольшие изменения, указав явно адреса, с которыми у вас возникают вопросы.
#include "msp430x20x2.h"
Код
#include "msp430x20x2.h"
;-------------------------------------------------------------------------------
            ORG     0FC00h        ; Укажем явно начало сегмента
;-------------------------------------------------------------------------------
RESET       mov.w   #0280h,SP        ; Инициировать указатель стека явным значением
VVlad
Спасибо за дружескую поддержку, Резидент!
По Вашему совету указал адреса ЯВНО, ошибка [e16] не пропала. То же ругань на сегмент RESET,
от безысходности отметил на вкладке General Options галочку напротив Assembler Project Only. И о чудо - вместо ошибки - только предупреждение -
Код
Building configuration: interrupt0 - Debug
Updating build tree...

1  file(s) deleted.
Updating build tree...
msp430F2012_adc10.s43
Linking
Warning[w29]: Parts of segment CSTACK are initialized (as in module  
msp430F2012_adc10), even though it is of type DATA (and thus not promable)

Total number of errors: 0
Total number of warnings: 1
Поэтому удалось запустить процесс отладки и посмотреть содержимое регистров.

Верно ли, что сегмент CSTACK должен быть целиком в области данных типа DATA?
Смущает немного, что после выполнения команды
RESET mov.w #0280h,SP ; Инициировать указатель стека явным значением
в регистре SP лежит число 0x0000 (View->Register)
Режим отладки Options>Debugger>Setup>Driver>Simulator (Симулятор).
rezident
Какой версией IAR пользуетесь и какой именно кристалл симулируете? Вот этот проект (см. вложение), скопированный из вашего исходника с минимальными изменениями, у меня в IAR EW430 4.20.1 компилируется без ошибок и симуляция его идет адекватно. Симуляцию прерываний (TimerA0 и ADC10) делаю с помощью опции Forced Interrupt.
VVlad
Цитата(rezident @ Jan 17 2010, 23:10) *
Какой версией IAR пользуетесь и какой именно кристалл симулируете? Вот этот проект (см. вложение), скопированный из вашего исходника с минимальными изменениями, у меня в IAR EW430 4.20.1 компилируется без ошибок и симуляция его идет адекватно. Симуляцию прерываний (TimerA0 и ADC10) делаю с помощью опции Forced Interrupt.

Rezident, Спасибо за помощь, Ваш вариант даёт ту же ошибку, видимо дело в IAR EW430. Вот версии -
CODE
IAR Assembler for MSP430
V4.09A/W32 (4.9.1.9)
D:\430\bin\a430.exe
26.09.2007 9:38:38, 688128 bytes

IAR C/C++ Compiler for MSP430
V4.09A/W32 [Kickstart] (4.9.1.3)
D:\430\bin\icc430.exe
26.09.2007 9:27:24, 9121792 bytes

Uninstall Program for FTDI Drivers
3.0.0.33 (3.0.0.33)
D:\430\drivers\Olimex\FTDIUNIN.exe
26.09.2007 13:27:04, 420864 bytes

D:\430\drivers\Olimex\omjtunin.exe
26.09.2007 13:27:04, 28672 bytes

Windows Setup API
5.1.2600.0 built by: WinDDK (5.1.2600.0)
D:\430\drivers\Olimex\omjtunin2k.exe
26.09.2007 13:27:04, 47616 bytes

PreInstaller MFC Application
1, 0, 0, 1 (1.0.0.1)
D:\430\drivers\Olimex\PreInstaller.exe
26.09.2007 13:27:04, 32768 bytes

Uninstall Program for FTDI D2XX Drivers
2.2.0.2 (2.2.0.2)
D:\430\drivers\SoftBaugh\FTD2XXUN.EXE
26.09.2007 13:26:58, 406528 bytes

D:\430\src\examples\Segger\embOS\embOSView.exe
26.09.2007 13:28:34, 53760 bytes

IAR CSpyBat
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\CSpyBat.exe
25.09.2007 13:53:50, 270336 bytes

IAR Build Utility
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\iarbuild.exe
25.09.2007 13:53:50, 69632 bytes

IAR Embedded Workbench IDE
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\IarIdePm.exe
25.09.2007 13:53:50, 364544 bytes

IAR Library Builder
1.03L (1.3.12.0)
D:\common\bin\xar.exe
31.08.2007 14:02:14, 98304 bytes

IAR XLIB
3.29P/386 (3.29.0.16)
D:\common\bin\xlib.exe
31.08.2007 14:03:18, 425984 bytes

IAR XLINK
4.60K (4.60.11.0)
D:\common\bin\xlink.exe
31.08.2007 15:03:52, 1388544 bytes

D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd381\InstallWiseCalculator.exe
17.02.2005 17:32:14, 846819 bytes

D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd382\ttc2ttf.exe
07.10.1998 15:15:34, 8192 bytes

D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd383\Кулинарная Книга v.4.0-keygen.exe
06.04.2005 11:00:06, 6656 bytes

D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd383\Кулинарная Книга v.4.0.exe
05.04.2005 2:36:36, 4623779 bytes

D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd384\mosmap21.exe
17.02.2005 17:33:28, 7631205 bytes

Flash Player 5.0 r30
5,0,30,0 (5.0.30.0)
D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd387\bed.exe
17.08.2000 18:00:30, 545456 bytes

Flash Player 5.0 r30
5,0,30,0 (5.0.30.0)
D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd387\horse.exe
17.08.2000 18:03:56, 662399 bytes

Flash Player 5.0 r30
5,0,30,0 (5.0.30.0)
D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd387\radio.exe
17.08.2000 18:00:30, 678592 bytes

Flash Player 5.0 r30
5,0,30,0 (5.0.30.0)
D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd387\roll.exe
16.04.2002 6:58:28, 1008476 bytes

Flash Player 5.0 r30
5,0,30,0 (5.0.30.0)
D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd387\ruspunk.exe
07.06.2002 9:50:48, 1225712 bytes

Flash Player 5.0 r30
5,0,30,0 (5.0.30.0)
D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd387\secret.exe
07.04.2002 16:53:28, 1057368 bytes

Flash Player 5.0 r30
5,0,30,0 (5.0.30.0)
D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd387\showtime.exe
17.08.2000 18:00:30, 804909 bytes

Flash Player 5.0 r30
5,0,30,0 (5.0.30.0)
D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd387\spb.exe
04.03.2002 3:17:48, 1127819 bytes

Flash Player 5.0 r30
5,0,30,0 (5.0.30.0)
D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd387\zug.exe
10.10.2001 15:45:54, 414174 bytes

D:\SuperDOS\MBRutil.exe
25.02.2002 15:52:14, 78336 bytes

D:\SuperDOS\RESTRMBR.EXE
31.08.2001 12:47:58, 41038 bytes

Recover deleted files and lost data
3.9.8.6220 (3.9.8.6220)
D:\temp\RecoverMyFiles-Setup.exe
26.01.2009 2:17:04, 8280240 bytes

UndeletePlus™ Setup
3.0.0.602 (3.0.0.602)
D:\temp\UndeletePlus_setup.exe
20.11.2009 12:29:08, 174963 bytes

IAR C-SPY Batch Simulator Driver for MSP430
V4.09A/W32 (4.9.1.9)
D:\430\bin\430bat.dll
25.09.2007 15:16:50, 270336 bytes

IAR C-SPY Emulator Driver for MSP430
V4.09A/W32 [Kickstart] (4.9.1.3)
D:\430\bin\430fet.dll
25.09.2007 15:04:06, 892928 bytes

IAR C-SPY Library Support Plug-in for MSP430
V4.09A/W32 (4.9.1.9)
D:\430\bin\430libsupport.dll
25.09.2007 15:15:48, 376832 bytes

IAR C-SPY Processor Descriptor for MSP430
V4.09A/W32 (4.9.1.9)
D:\430\bin\430proc.dll
25.09.2007 15:15:36, 1179648 bytes

IAR C-SPY Simulator Driver for MSP430
V4.09A/W32 [Kickstart] (4.9.1.3)
D:\430\bin\430sim.dll
25.09.2007 14:59:20, 1228800 bytes

CP210x
1.2 (1.2.0.0)
D:\430\bin\CP210xManufacturing.dll
26.09.2007 13:30:04, 69632 bytes

IAR Project File Converter for MSP430
V3.21A/W32 (3.21.1.9)
D:\430\bin\cwtd430.dll
26.09.2007 13:27:06, 352256 bytes

FTD2XX library
3.01.06 (3.1.6.1)
D:\430\bin\FTD2XX.dll
26.09.2007 13:30:04, 81920 bytes

HIL
1, 2, 2, 0 (1.2.2.0)
D:\430\bin\hil.dll
26.09.2007 13:30:04, 32768 bytes

SEGGER J-Link MSP430 interface DLL
2.1.1.0 (2.1.1.0)
D:\430\bin\JLink430.dll
26.09.2007 13:30:04, 114688 bytes

MSP430.dll for the USB-MSP430-FPA v10.0
2, 1, 10, 0 (2.1.10.0)
D:\430\bin\MSP430-FPA.dll
26.09.2007 13:30:04, 348160 bytes

MSP430
Version (2.3.1.0)
D:\430\bin\msp430.dll
26.09.2007 13:30:04, 225280 bytes

MSP430
1, 0, 1, 1 (1.0.1.1)
D:\430\bin\olimex.dll
26.09.2007 13:30:06, 458752 bytes

SBMSP430_DLL DLL
2, 1, 8, 1 (2.1.8.1)
D:\430\bin\sbmsp430.dll
26.09.2007 13:30:06, 258048 bytes

SiUSBXp
2, 3, 0, 0 (2.3.0.0)
D:\430\bin\SiUSBXp.dll
26.09.2007 13:30:06, 90112 bytes

MSP430
Version (2.1.8.1)
D:\430\bin\SoftBaugh.dll
26.09.2007 13:30:06, 32768 bytes

IAR Workbench Target Descriptor for MSP430
V4.09A/W32 (4.9.1.9)
D:\430\bin\swtd430.dll
25.09.2007 15:16:40, 749568 bytes

IAR Workbench Target Descriptor, Emulator, for MSP430
V4.09A/W32 (4.9.1.9)
D:\430\bin\swtd430fet.dll
25.09.2007 14:45:40, 360448 bytes

IAR Workbench Target Descriptor, Simulator, for MSP430
V4.09A/W32 (4.9.1.9)
D:\430\bin\swtd430sim.dll
25.09.2007 14:59:54, 294912 bytes

FTD2XX library
3.00.05 (3.0.5.1)
D:\430\drivers\Olimex\FTD2XX.dll
26.09.2007 13:27:04, 81920 bytes

FTD2XX library
2.00.11 (2.0.11.1)
D:\430\drivers\SoftBaugh\FTD2XX.dll
26.09.2007 13:26:58, 69632 bytes

LCD Plugin for EW430
3.42A (3.42.1.9)
D:\430\plugins\Lcd\lcd.dll
26.09.2007 14:06:54, 266240 bytes

SEGGER embOS IAR-Plugin
2, 0, 5, 0 (2.0.5.0)
D:\430\plugins\rtos\embOS\embOSPlugin.dll
26.09.2007 13:28:34, 397312 bytes

µC/OS-II KA Plug-in for C-SPY DLL
2.50 2007-09-10 (2.5.0.0)
D:\430\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.dll
26.09.2007 13:28:34, 339968 bytes

IAR CSpyBat Language Specific Resources
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\CSpyBat.ENU.dll
25.09.2007 13:53:50, 4608 bytes

IAR C-SPY Debugger GUI
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\DebuggerGui.dll
25.09.2007 13:53:50, 1159168 bytes

IAR C-SPY Debugger GUI Language Specific Resources
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\DebuggerGui.ENU.dll
25.09.2007 13:53:50, 73728 bytes

IAR Find In Files
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\FindInFiles.dll
25.09.2007 13:53:50, 188416 bytes

IAR Find In Files Language Specific Resources
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\FindInFiles.ENU.dll
25.09.2007 13:53:50, 5632 bytes

IAR Build Utility Language Specific Resources
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\iarbuild.ENU.dll
25.09.2007 13:53:50, 4096 bytes

IAR Embedded Workbench IDE Language Specific Resources
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\IarIdePm.ENU.dll
25.09.2007 13:53:50, 479232 bytes

IAR IDE Framework
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\IdeFramework.dll
25.09.2007 13:53:50, 655360 bytes

IAR IDE Framework Language Specific Resources
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\IdeFramework.ENU.dll
25.09.2007 13:53:50, 5120 bytes

IAR C-SPY Debugger Kernel
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\Kernel.dll
25.09.2007 13:53:50, 1576960 bytes

IAR C-SPY Debugger Kernel Language Specific Resources
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\Kernel.ENU.dll
25.09.2007 13:53:50, 8192 bytes

IAR Log Window
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\LogWindow.dll
25.09.2007 13:53:50, 212992 bytes

IAR Log Window Language Specific Resources
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\LogWindow.ENU.dll
25.09.2007 13:53:50, 11264 bytes

IAR Project Manager Engine
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\ProjectManagerEngine.dll
25.09.2007 13:53:50, 1073152 bytes

IAR Project Manager Engine Language Specific Resources
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\ProjectManagerEngine.ENU.dll
25.09.2007 13:53:50, 13824 bytes

IAR Project Manager Gui
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\ProjectManagerGui.dll
25.09.2007 13:53:50, 708608 bytes

IAR Project Manager Gui Language Specific Resources
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\ProjectManagerGui.ENU.dll
25.09.2007 13:53:50, 106496 bytes

IAR Text Editor
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\TextEditor.dll
25.09.2007 13:53:50, 491520 bytes

IAR Text Editor Language Specific Resources
5.0.1.254.6782 (5.0.1.254)
D:\common\bin\TextEditor.ENU.dll
25.09.2007 13:53:50, 26112 bytes

Shared Library for Xerces-C Version 1.5.1
1, 5, 1 (1.5.1.0)
D:\common\bin\xerces-c_1_5_1.dll
25.09.2007 13:53:48, 1257472 bytes

D:\common\bin\XmlLib.dll
25.09.2007 13:53:48, 90112 bytes

IAR Code Coverage Plug-in
5.0.1.254.6782 (5.0.1.254)
D:\common\plugins\CodeCoverage\CodeCoverage.dll
25.09.2007 13:53:48, 303104 bytes

IAR Code Coverage Plug-in Language Specific Resources
5.0.1.254.6782 (5.0.1.254)
D:\common\plugins\CodeCoverage\CodeCoverage.ENU.dll
25.09.2007 13:53:48, 10752 bytes

IAR ORTI RTOS Plug-in
5.0.1.254.6782 (5.0.1.254)
D:\common\plugins\Orti\Orti.dll
25.09.2007 13:53:48, 413696 bytes

D:\common\plugins\Orti\Orti.ENU.dll
25.09.2007 13:53:48, 8704 bytes

IAR Profiling Plug-in
5.0.1.254.6782 (5.0.1.254)
D:\common\plugins\Profiling\Profiling.dll
25.09.2007 13:53:48, 299008 bytes

IAR Profiling Plug-in Language Specific Resources
5.0.1.254.6782 (5.0.1.254)
D:\common\plugins\Profiling\Profiling.ENU.dll
25.09.2007 13:53:48, 10752 bytes

IAR Stack Plug-in
5.0.1.254.6782 (5.0.1.254)
D:\common\plugins\Stack\Stack.dll
25.09.2007 13:53:48, 331776 bytes

IAR Stack Plug-in Language Specific Resources
5.0.1.254.6782 (5.0.1.254)
D:\common\plugins\Stack\Stack.ENU.dll
25.09.2007 13:53:48, 8192 bytes

Resources for AcEtUtil
2.00 (1.0.0.0)
D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd382\acetutil.dll
25.03.1999 9:06:22, 16384 bytes

ctw Module
1, 0, 0, 1 (1.0.0.1)
D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd382\axctextapp.dll
25.03.1999 9:09:40, 90112 bytes

RText COM Wrapper
1.00 (1.0.0.0)
D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd382\axrtext.dll
25.03.1999 9:07:16, 73728 bytes

Resources for ArcText
2.00 (2.0.0.0)
D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd382\ctextapp.dll
25.03.1999 9:09:14, 32768 bytes

Resources for DIMSIO
2.00 (2.0.0.0)
D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd382\dimsio.dll
25.03.1999 9:06:30, 24576 bytes

Resources for Leader Tools
1.00 (2.0.0.0)
D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd382\leaderex.dll
25.03.1999 9:09:54, 24576 bytes

Move Copy Rotate application for AutoCAD
1.00 (1.0.0.0)
D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd382\mocoro.dll
25.03.1999 9:07:22, 12288 bytes

Resources for RText
1.00 (1.0.0.0)
D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd382\rtext.dll
25.03.1999 9:06:54, 12288 bytes

Resources for Wipeout
2.00 (2.0.0.0)
D:\RECYCLER\S-1-5-21-343818398-287218729-682003330-1003\Dd382\wipeout.dll
25.03.1999 9:07:48, 20480 bytes

Ищу дистрибутив Вашей среды разработки.
rezident
На сайте производителя можно скачать IAR Kickstart 4.21.8. http://focus.ti.com/docs/toolsw/folders/pr...-kickstart.html
VVlad
Цитата(rezident @ Jan 18 2010, 13:50) *
На сайте производителя можно скачать IAR Kickstart 4.21.8. http://focus.ti.com/docs/toolsw/folders/pr...-kickstart.html

Нашёл, скачал, установил, первый тест (мигание светодиодом) прошёл на ура, в симуляторе нашёл генерирование прерываний. Поистине, блестящий инструмент отладки. Очень приятный и полезный.

Ваш тест выдал странную ошибку -
Код
Updating build tree...
test_asm.s43
Error[4]: Unexpected end of file encountered E:\distrib\MSP430\TEST\test_asm.s43 4
Error while running Assembler

Total number of errors: 1
Total number of warnings: 0

Ругань на 4-ю строку. там ORG 0FC00h. Ошибка вряд ли в коде, раз он у Вас нормально отрабатывал.
Может быть нужно как-то зарегистрировать программу? Лицензия на 30 дней бесплатная, однако номер и ключ лицензии следует вводить в программу? Если да, то будьте любезны, просветите, пожалуйста, каким образом это сделать?
rezident
Цитата(VVlad @ Jan 18 2010, 21:42) *
Ваш тест выдал странную ошибку
У вас удивительная способность находить глюки в программе там, где их не было. Глюки видимо любят вас! biggrin.gif У меня без ошибок в IAR EW4.20.1 (full) компилируется laughing.gif Попробую для интереса скачать и установить эту самую версию kickstart 4.21.8.
Цитата(VVlad @ Jan 18 2010, 21:42) *
Может быть нужно как-то зарегистрировать программу? Лицензия на 30 дней бесплатная, однако номер и ключ лицензии следует вводить в программу? Если да, то будьте любезны, просветите, пожалуйста, каким образом это сделать?
Нет, ничего регистрировать не нужно. Вы скачали и установили версию kickstart, которая не требует регистрации и оплаты, но имеет ограничение в 4кБ Си-шного (C/C++) кода для всех MSP430, кроме тех, что с ядром MSP430X. Для последних ограничение в 8кБ кода на С/С++. На ассемблерный код у версии kickstart нет никаких ограничений. Все это в разделе Description на страничке продукта описано. Или вы не читали?
Цитата
IAR Embedded Workbench Kickstart for MSP430 is an Integrated Development Environment (IDE) for building and debugging embedded applications for MSP430 microcontrollers. The IDE includes a code size limited C-Compiler/Unlimited Assembler/FET Debugger/Simulator. The code size limitation of C/C++ compiler is set to 4 Kbytes for traditional MSP430 devices and 8 Kbytes for MSP430X devices with >60KB Flash. The Debugger is a fully integrated debugger for source and disassembly level debugging with support for complex code and data breakpoints.


Update. Насчет вашей ошибки я понял. Поскольку обычно пишу на Си и с ней не встречаюсь, то сообразил не сразу. Это такой "родовой глюк" ассемблера IAR. Он не любит русской маленькой буквы "я" в комментариях. Замените ее, например, на большую букву "Я" и проект скомпилируется без ошибок. Кстати, в Си-шных исходниках к "я" отношение вполне лояльное.
VVlad
Rezident, Ваша проницательность меня потрясает. Последний вариант без единой ошибки прошёл все стадии (компиляцию и линкование). Благодарю за потраченное на меня время. Тот факт, что ассемблер нетерпим к эгоизму (яканию), но признаёт величие (Я большое), производит неизгладимое впечатление. Относительно ограничения в 4 кБ я читал, но в кристалле 430А2012 лишь 2 кБ, то есть некоторые программы на Си могут не поместиться, в то время, как их аналог на Ассемблере войдёт легко. Ещё раз спасибо и с Крещением Господним праздником. Будьте здоровы.
mdmitry
bb-offtopic.gif У старых версий MATLAB была такая же нелюбовь в комментариях. Видно "корни" одни (0xFF) laughing.gif
VVlad
Не слишком блестящие успехи с передачей байта в ПК заставили меня вновь побеспокоить уважаемых пользователей этого форума. Прошу просветить меня в отношении связи. Ядро с периферией в MSP430F2012 связано через шины адреса и данных. Протокол обмена данными для их выдачи наружу может быть выбран из трёх вариантов - I2C, USART в режиме UART и External RS232.
Отсюда вопрос - обязателен ли традиционный способ передачи данных от контроллера в ПК - преобразование в UART, потом в мосте USB-to-UART (CP2102) конвертация для передачи по USB? Ведь возможность выбора I2C предполагает упрощение. Если конвертация форматов (в UART, затем в USB, а на программном уровне данные снова из виртуального ком-порта считываются!) не обязательна, то можно ли вместо CP2102 использовать другой мост и упростить процесс передачи данных?

После попытки вывести данные через контакт P1.1 он перестал реагировать. Предположительно, 5 вольт могло на него замкнуть. Был бы рад узнать способ проверки сомнительного контакта, но главное - есть ли проверенная схема электрических соединений вывода UART с разъёмом COM- порта, пригодная для микроконвертора MSP430F2012?
rezident
Непонятна суть ваших затруднений. Передать данные можно любым доступным способом. Доступность способов определяется наличием и совместимостью интерфейсов связи. В обычном ПК нет интерфейса I2C, но есть COM-порт, USB-порт или Ethernet. Для подключения MSP430F2013 к COM-порту нужен трансивер RS232 с питанием 3...3,6В типа MAX3232. Для подключения к USB-порту нужен тоже какой-то конвертор. Обычно применяют конверторы (мосты) USB-COM известных производителей FTDIchip, SiLabs, Prolific, TI. Какой именно мост USB-COM использовать определяет каждый для себя сам. Подключение через Ethernet нецелесообразно по причине того, что стоимость моста для Ethernet будет сравнима или на порядок дороже самого MSP430.
VVlad
Спасибо, Резидент, за ясный ответ. Значит, трансиверов - посредников между MSP430 и USB в одном корпусе не существует. Единственный выход - ставить два корпуса последовательно - аналог MAX3232 и следом - мост.
msalov
Цитата(VVlad @ Jan 28 2010, 07:39) *
Спасибо, Резидент, за ясный ответ. Значит, трансиверов - посредников между MSP430 и USB в одном корпусе не существует. Единственный выход - ставить два корпуса последовательно - аналог MAX3232 и следом - мост.

Судя по всему Резидент допустил досадную печатку, введя Вас в заблуждение о необходимости двух микросхем для связи микроконтроллера по USB. Приведенные фирмы делают не USB-COM а USB-UART трансиверы/мосты, то есть требуется всего одна микросхема.
_3m
Цитата(VVlad @ Jan 28 2010, 08:39) *
Спасибо, Резидент, за ясный ответ. Значит, трансиверов - посредников между MSP430 и USB в одном корпусе не существует. Единственный выход - ставить два корпуса последовательно - аналог MAX3232 и следом - мост.

MAX не нужен.
Мосты FT232, PL2303 и им подобные имеют выходы 3,3V их нужно подключать к УАРТ MSP430 напрямую.
Таким образом вам нужно поставить MSP430+мост, например FT232R
rezident
Цитата(VVlad @ Jan 28 2010, 10:39) *
Значит, трансиверов - посредников между MSP430 и USB в одном корпусе не существует. Единственный выход - ставить два корпуса последовательно - аналог MAX3232 и следом - мост.
Нет! Вы меня поняли совершенно неправильно. С точностью до "наоборот". Я же указал "мост USB-COM", а не USB-RS232. Хотя признаю, что более употребительными названиями этих конверторов являются названия USB-to-UART или USB-to-Serial Port. И вообще я рассчитывал, что вы сами посмотрите даташиты подобных м/с. Именно такой должен быть подход нормального инженера: узнать общую информацию, а подробности уточнять самостоятельно.
USB-to-UART от Silabs
USB-to-UART от FTDIchip
USB-to-Serial Bridge Controller от Prolific
USB-to-Serial Port Controller от Texas Instruments
VVlad
Цитата(rezident @ Jan 28 2010, 15:51) *
Нет! Вы меня поняли совершенно неправильно. С точностью до "наоборот". Я же указал "мост USB-COM", а не USB-RS232. Хотя признаю, что более употребительными названиями этих конверторов являются названия USB-to-UART или USB-to-Serial Port. И вообще я рассчитывал, что вы сами посмотрите даташиты подобных м/с. Именно такой должен быть подход нормального инженера: узнать общую информацию, а подробности уточнять самостоятельно.
USB-to-UART от Silabs
USB-to-UART от FTDIchip
USB-to-Serial Bridge Controller от Prolific
USB-to-Serial Port Controller от Texas Instruments

Приятно было узнать, что достаточно одного корпуса. С радостью сообщаю, что раздобыл FT232BM, установил драйверы и соединил с MSP430F2012. Это замечательно, что Резидент догадался поделится со мной ссылками. Именно их мне так не хватало ( cranky.gif )! Мои подозрения относительно того, что я неосторожно сжёг вывод 7 (P1.5/TA0), не поддтвердились. "Подрыгав" этой ножкой, убедился с помощью осциллографа в прямоугольных импульсах амплитудой 3 Вольта и частотой от 1Гц до 1 МГц (изменяя задержку). В FT232BM есть режим "адаптации" амплитуды сигналов к 3-вольтовой логике (достаточно оказалось замкнуть перемычкой выводы 6 и 13 (3v3out c VccIO)).
Бьюсь сейчас над вопросом, как отладить демо-код для эхо USART.
Код
;*******************************************************************************
;   MSP430F20xx Demo - Timer_A, Ultra-Low Pwr UART 2400 Echo, 32kHz ACLK
;
;   Description: Use Timer_A CCR0 hardware output modes and SCCI data latch
;   to implement UART function @ 2400 baud. Software does not directly read and
;   write to RX and TX pins, instead proper use of output modes and SCCI data
;   latch are demonstrated. Use of these hardware features eliminates ISR
;   latency effects as hardware insures that output and input bit latching and
;   timing are perfectly synchronised with Timer_A regardless of other
;   software activity. In the Mainloop the UART function readies the UART to
;   receive one character and waits in LPM3 with all activity interrupt driven.
;   After a character has been received, the UART receive function forces exit
;   from LPM3 in the Mainloop which echo's back the received character.
;   ACLK = TACLK = LFXT1 = 32768Hz, MCLK = SMCLK = default DCO
;   //* An external watch crystal is required on XIN XOUT for ACLK *//    
;
;                MSP430F20xx
;             -----------------
;         /|\|              XIN|-
;          | |                 | 32kHz
;          --|RST          XOUT|-
;            |                 |
;            |   CCI0B/TXD/P1.5|-------->
;            |                 | 2400 8N1
;            |   CCI0A/RXD/P1.1|<--------
;
;
;   M. Buccini / L. Westlund
;   Texas Instruments Inc.
;   October 2005
;   Built with IAR Embedded Workbench Version: 3.40A
;*******************************************************************************
RXD         EQU     002h                   ; RXD on P1.1
TXD         EQU     020h                   ; TXD on P1.5
;
;   CPU Registers Used
#define     RXTXData R4
#define     BitCnt   R5
;
;   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
#include  "msp430x20x3.h"
;-------------------------------------------------------------------------------
            ORG     0F800h                 ; Program Reset
;-------------------------------------------------------------------------------
RESET       mov.w   #0280h,SP              ; Initialize stackpointer
StopWDT     mov.w   #WDTPW+WDTHOLD,&WDTCTL ; Stop Watchdog Timer
SetupTA     mov.w   #TASSEL_1+MC_2,&TACTL  ; ACLK, continuous mode
SetupC0     mov.w   #OUT,&CCTL0            ; TXD Idle as Mark
SetupP1     bis.b   #TXD+RXD,&P1SEL        ;
            bis.b   #TXD,&P1DIR            ;
                                           ;
Mainloop    call    #RX_Ready              ; UART ready to RX one Byte
            bis.w   #LPM3+GIE,SR           ; Enter LPM3 w/ int until Byte RXed
            call    #TX_Byte               ; TX Back RXed Byte Received
            jmp     Mainloop               ;
                                           ;
;-------------------------------------------------------------------------------
TX_Byte  ; Subroutine Transmits Character from RXTXData Buffer
;-------------------------------------------------------------------------------
TX_1        mov.w   &TAR,&CCR0             ; Current state of TA counter
            cmp.w   &TAR,&CCR0             ; !!Prevent async capature!!
            jne     TX_1                   ;
            add.w   #Bitime,&CCR0          ; Some time till first bit
            bis.w   #0100h, RXTXData       ; Add mark stop bit to RXTXData
            rla.w   RXTXData               ; Add space start bit
            mov.w   #10,BitCnt             ; Load Bit counter, 8data + ST/SP
            mov.w   #CCIS0+OUTMOD0+CCIE,&CCTL0   ; TXD = mark = idle
TX_Wait     bit.w   #CCIE,&CCTL0           ; Wait for TX completion
            jnz     TX_Wait                ;
            ret                            ;
                                           ;
;-------------------------------------------------------------------------------
RX_Ready ; Subroutine Readies UART to Receive Character into RXTXData Buffer
;-------------------------------------------------------------------------------
            mov.w   #08,BitCnt             ; Load Bit Counter, 8 data bits
SetupRX     mov.w   #CM1+SCS+OUTMOD0+CAP+CCIE,&CCTL0 ; Neg Edge,Sync,cap
            ret                            ;
                                           ;
;-------------------------------------------------------------------------------
TA0_ISR ;  RXTXData Buffer holds UART Data
;-------------------------------------------------------------------------------
            add.w   #Bitime,&CCR0          ; Time to next bit
            bit.w   #CCIS0,&CCTL0          ; RX on CCI0B?
            jnz     UART_TX                ; Jump --> TX
UART_RX     bit.w   #CAP,&CCTL0            ; Capture mode = start bit edge
            jz      RX_Bit                 ; Start bit edge?
RX_Edge     bic.w   #CAP,&CCTL0            ; Switch to compare mode
            add.w   #Bitime_5,&CCR0        ; First databit 1.5 bits from edge
            reti                           ;
RX_Bit      bit.w   #SCCI,&CCTL0           ; Get bit waiting in receive latch
            rrc.b   RXTXData               ; Store received bit
RX_Test     dec.w   BitCnt                 ; All bits RXed?
            jnz     RX_Next                ; Next bit?
;>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
RX_Comp     bic.w   #CCIE,&CCTL0           ; All bits RXed, disable interrupt
            mov.w   #GIE,0(SP)             ; Decode byte = active in Mainloop
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
RX_Next     reti                           ;
                                           ;
UART_TX     cmp.w   #00h,BitCnt            ;
            jne     TX_Next                ; Next bit?
            bic.w   #CCIE,&CCTL0           ; All Bits TX or RX, Disable Int.
            reti                           ;
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                           ;
                                           ;
;-------------------------------------------------------------------------------
;           Interrupt Vectors
;-------------------------------------------------------------------------------
            ORG     0FFFEh                 ; MSP430 RESET Vector
            DW      RESET                  ;
            ORG     0FFF2h                 ; Timer_A0 Vector
            DW      TA0_ISR                ;
            END

В главном цикле
Код
Mainloop    mov.w   #08,BitCnt             ; ЯвнаЯ загрузкЯ счётчика битов 8-ю шагами байта
mov.w   #0Fh,RXTXData             ; чтобы было что отослать через FT232, USB и далее - через VCP
;call    #RX_Ready              ; UART ready to RX one Byte
           ;bis.w   #LPM3+GIE,SR           ; Enter LPM3 w/ int until Byte RXed
            call    #TX_Byte               ; TX Back RXed Byte Received
            jmp     Mainloop               ;
Напрямую этот пример выполнить не удалось, поскольку , как заметил один из маляров,
в заголовке программы "MSP430F20xx Demo - Timer_A, Ultra-Low Pwr UART 2400 Echo, 32kHz ACLK "
намекается на то, что программа должна работать не только для MSP2013, но и для MSP2012.
Даже после замены строки #include "msp430x20x3.h" на #include "msp430x20x2.h" кристалл не откликнулся на наши просьбы.
Закомментарил вызов функции чтения и команду ("спать" до прерывания) и добавил над ними две строки с русскими комментариями, (откомпилировалась и скомпоновалась программа без единой ошибки),
подключил осциллограф, после запуска программы напряжение на выходе 7 (P1.5) вырастает до 3 вольт и не обнуляется. А я-то надеялся, что в цикле Mainloop будет постоянно выдаваться байт OF (четыре импульса одного уровня и четыре другого, не считая стартовых и стоповых битов).
O.L.
Доброго времени суток.

Давайте уберем весь лишний текст, что бы он нам не мешал увидеть проблему.

Цитата(VVlad @ Jan 29 2010, 13:13) *
Код
                                          ;
Mainloop    call    #RX_Ready             ; UART ready to RX one Byte
            bis.w   #LPM3+GIE,SR          ; Enter LPM3 w/ int until Byte RXed
            call    #TX_Byte              ; TX Back RXed Byte Received
            jmp     Mainloop              ;
                                          ;
;-------------------------------------------------------------------------------
TX_Byte ; Subroutine Transmits Character from RXTXData Buffer
;-------------------------------------------------------------------------------
TX_1        mov.w   &TAR,&CCR0            ; Current state of TA counter
            cmp.w   &TAR,&CCR0            ; !!Prevent async capature!!
            jne     TX_1                  ;
            add.w   #Bitime,&CCR0         ; Some time till first bit
            bis.w   #0100h, RXTXData      ; Add mark stop bit to RXTXData
            rla.w   RXTXData              ; Add space start bit
            mov.w   #10,BitCnt            ; Load Bit counter, 8data + ST/SP
            mov.w   #CCIS0+OUTMOD0+CCIE,&CCTL0  ; TXD = mark = idle
TX_Wait     bit.w   #CCIE,&CCTL0          ; Wait for TX completion
            jnz     TX_Wait            ;
            ret                        ;
                                          ;


Код
    Mainloop    mov.w   #08,BitCnt            ; ЯвнаЯ загрузкЯ счётчика битов 8-ю шагами байта
    mov.w   #0Fh,RXTXData            ; чтобы было что отослать через FT232, USB и далее - через VCP
   ;call    #RX_Ready             ; UART ready to RX one Byte
   ;bis.w   #LPM3+GIE,SR          ; Enter LPM3 w/ int until Byte RXed
    call    #TX_Byte              ; TX Back RXed Byte Received
    jmp     Mainloop              ;


Настоятельно рекомендую, сверившись с описанием на процессор, посмотреть внимательнее на опрометчиво закоментированную Вами
строчку
Код
;bis.w   #LPM3+GIE,SR          ; Enter LPM3 w/ int until Byte RXed

Особенно вот на это - "+GIE". Если вы внимательно посмотрите на код, то скорее всего увидите, что процедуры прием и передачи бита этой реализации последовательного порта выполняются только в прерывании.
VVlad
Спасибо за ответ, 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 "дрыганием ножки"? На форумах мне встечался "метод мокрого пальца" и "метод морковки", но они показались достаточно экзотичными, есть ли более консервативные методы?
SGPYVt
Приветствую всех,
относительно процессора не компетентен, а вот про осциллятор могу посоветовать. В часах кварц частотой около 32 кГц можно проверить осциллографом - надо выбрать шкалу 50 мВ, интервал 10 мсек, подсоединить щупы к выводам кварца и подать один из проводов от элемента питания 1.5 Вольта - второй оставить неподключенным. При исправном осцилляторе на экране осциллографа будет два-три периода колебаний.
VVlad
Не совсем в тему (другой процессор) , но похожие явления обнаружены по адресу http://electronix.ru/forum/index.php?showt...натор&st=15.
rezident
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;
O.L.
Цитата(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 уже дал исчерпывающий ответ.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.