|
Сколько тактов выполнится код |
|
|
|
Mar 20 2009, 08:48
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 27-01-09
Пользователь №: 43 990

|
Всем привет. Использую задержку ввиде CODE delay_ms(unsigned int a) { volatile unsigned int b; b=a; do b--; while (b != 0); }
Несмог понять в руководстве пользователя сколько тактов займет выполнение цикла. Помогите люди добрые. Заранее спасибо.
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 24)
|
Mar 21 2009, 14:25
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Вот так код будет прозрачнее, а результат работы -- тот же. Код void delay_ms(unsigned int a) { while (0 != --a) ; }
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Mar 23 2009, 04:15
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 27-01-09
Пользователь №: 43 990

|
Цитата(SSerge @ Mar 21 2009, 20:24)  У IAR есть встроенные функции, они определены в intrinsics.h в том числе и __intrinsic void __delay_cycles(unsigned long __cycles); присутствует в версиях по крайней мере начиная с 3.42, возможно и чуть раньше.
Если же писать самому, то это как раз тот случай когда есть смысл использовать ассемблер, тогда можно быть уверенным в результате независимо от оптимизации компилятора. Вот это то что надо. Спасибо всем.
|
|
|
|
|
May 20 2009, 15:47
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата Если используете IAR, то запустите его симулятор и посмотрите счетчик циклов. А вооб Подскажите, плиз, где оно там? Только начал (причем сегодня  ) работать с IAR и вообще 430-м (до того было много других). Ничал как обычно - "помигать светодиодом", т.е. "подергать ножкой. Вот такой код: Код while(1){ _NOP(); LEDS_OFF; _NOP(); LEDS_ON; в асме выглядит так: Код _NOP(); 0040AC 0343 nop LEDS_OFF; 0040AE F2D01F003100 bis.b #0x1F,&P5OUT _NOP(); 0040B4 0343 nop LEDS_ON; 0040B6 F2F0E0003100 and.b #0xE0,&P5OUT 0040BC F73F jmp 0x40AC Смотрю осциллографом на ножке - 1.88/2.48 мкс., Это что получается, проц, работающий на 8мгц столько времени это выполняет?! Кварц 8мгц подлючен к XT2, настройки такие: Код // Clock init BCSCTL1 = 7; // Turn on XTL2 BCSCTL2 = 0x88; // SMCLK = XTL2 __bic_SR_register(SCG1); // Turn on SMCLK
|
|
|
|
|
May 20 2009, 19:15
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Allregia @ May 20 2009, 21:47)  Подскажите, плиз, где оно там? См. скриншот. Цитата(Allregia @ May 20 2009, 21:47)  Кварц 8мгц подлючен к XT2, настройки такие: У вас типовая ошибка для начинающих работать с MSP430. Читайте внимательно в User's Guide раздел Basic Clock Module Operation подраздел Sourcing MCLK from a Crystal. Вот тут даже по-русски. http://www.gaw.ru/html.cgi/txt/doc/micros/msp430/arh/4_2.htm
Эскизы прикрепленных изображений
|
|
|
|
|
May 20 2009, 20:08
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(rezident @ May 20 2009, 22:15)  См. скриншот. Спасибо. Я уже нашел в принципе, что NOP это 5 циклов. Цитата У вас типовая ошибка для начинающих работать с MSP430. Читайте внимательно в User's Guide раздел Basic Clock Module Operation подраздел Sourcing MCLK from a Crystal. Вот тут даже по-русски. http://www.gaw.ru/html.cgi/txt/doc/micros/msp430/arh/4_2.htmОшибка в том, что я не жду в цикле сброса OFIFG перед тем как идти дальше ? Но судя по всему, работает оно у меня нормально. Если это на что-то влияет - питание подано все время, работаю с JTAG отладчиком.
|
|
|
|
|
May 20 2009, 21:10
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Allregia @ May 21 2009, 02:08)  Я уже нашел в принципе, что NOP это 5 циклов. С дуба рухнули?  Пардон за эмоции. NOP это один цикл/такт! Цитата(Allregia @ May 21 2009, 02:08)  Ошибка в том, что я не жду в цикле сброса OFIFG перед тем как идти дальше ? Да. Пока OFIFG не сбросится (генерация кварца не будет устойчивой) MCLK на тактирование от XT2 (XT1) не переключится, несмотря на любое принудительное изменение состояния битов SELMx в регистре BCSCTL2. По умолчанию (после сброса или подаче питания) MCLK от внутреннего DCO работает. А DCO на частоте около 900кГц запускается. Цитата(Allregia @ May 21 2009, 02:08)  Но судя по всему, работает оно у меня нормально. Угу, работает. Только не от 8МГц кварца. Если бы MCLK тактировался от 8МГц, то вы бы наблюдали импульсы 0,75мкс (6 тактов) и 1мкс (8 тактов). А так вы записью в BCSCTL1 битов RSELx увеличили частоту DCO до (примерно) 3.1МГц и работаете на DCO. См. фрагмент из даташита в аттаче. Цитата(Allregia @ May 21 2009, 02:08)  Если это на что-то влияет - питание подано все время, работаю с JTAG отладчиком. Вообще-то, если внимательно читать мой ответ в сообщении #3, который вы процитировали в своем вопросе, то я там писал про симулятор, а не про эмулятор (JTAG отладчик). И скриншот в сообщении #10 соответственно тоже в режиме симулятора снят.
Эскизы прикрепленных изображений
|
|
|
|
|
May 21 2009, 04:33
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(rezident @ May 21 2009, 00:10)  С дуба рухнули?  Пардон за эмоции. NOP это один цикл/такт! Да понял я, понял. Сейчас проверю. Цитата Вообще-то, если внимательно читать мой ответ в сообщении #3, который вы процитировали в своем вопросе, то я там писал про симулятор, а не про эмулятор (JTAG отладчик). И скриншот в сообщении #10 соответственно тоже в режиме симулятора снят. Не горячитесь  Этот момент я тоже понял. Вчера специально переключался из эмулятора в симулятор, но не нашел де циклы считаются - потому и спросил.
|
|
|
|
|
May 21 2009, 07:51
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(SSerge @ May 21 2009, 07:42)  Кстати, желание обязательно переключиться на тактирование от кварца - это тоже типичное для начинающих работу с MSP. Далеко не всегда это необходимо. Если для UART-а или таймеров нужен точный клок - в Вашем распоряжении SMCLK или ACLK, а проц может и от DCO тактироваться. Хорошо, тогда посоветуйте как быть (я начинающий с 430). Проц работает в 2-х режимах - в рабочем и в дежурном. Дежурный - тут надо только чтобы часы шли и проверялось нажатие кнопки "Вкл". Т.е. минимальное потребление, работа от часового кварца. Рабочий - тут нужна максимальная скорость процессора, точное тактирование АЦП и УАРТА. Я полагаю, кварц 32кгц на XT1 , 8мгц - на XT2 и переключаться между ними: дежурный режим - MCLK=XT1, SMCLK=OFF, ACLK=XT1 (от него Timer B на прерывание часов). рабочий режим - MCLK=XT2, SMCLK=XT2 (от него UART и Timer A, по которому АЦП), ACLK=XT1 (от него Timer B на прерывание часов). А прав ли я ?
|
|
|
|
|
May 21 2009, 15:49
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Allregia @ May 21 2009, 13:51)  Дежурный - тут надо только чтобы часы шли и проверялось нажатие кнопки "Вкл". Т.е. минимальное потребление, работа от часового кварца. Кнопку повесьте на любой пин порта P1 или P2, у которых имеется возможность получить прерывание по изменению уровня на входе. Хотя раз у вас часы будут имитироваться, то в этом же "часовом" прерывании опросить состояние пина много времени не займет. В таком случае кнопка на любом пине может быть. Цитата(Allregia @ May 21 2009, 13:51)  Я полагаю, кварц 32кгц на XT1 , 8мгц - на XT2 и переключаться между ними: дежурный режим - MCLK=XT1, SMCLK=OFF, ACLK=XT1 (от него Timer B на прерывание часов). рабочий режим - MCLK=XT2, SMCLK=XT2 (от него UART и Timer A, по которому АЦП), ACLK=XT1 (от него Timer B на прерывание часов). Неразумное решение.  Зачем переключаться между кварцевыми генераторами? Разработчики MSP430 не зря ведь три внутренних CLK придумали. LFXT у вас будет работать всегда, потому как часы. От LFXT будет генерироваться ACLK. Кстати, часы лучше на WDT повесить, а TimerB использовать для более полезных дел. XT2 нужно включать только тогда, когда он требуется для генерации SMCLK и работы UART. MCLK у вас всегда должен тактироваться от DCO, настроенного на высокую частоту. В таком случае гарантирован быстрый старт (единицы мкс) при переключении в рабочий режим и более надежная работа кристалла вообще (генератор-то внутренний!). К тому же уже неоднократно проверено, что "проснуться", быстро выполнить требуемые операции и снова "уснуть", менее энергозатратно, чем работать на низкой частоте тактирования, но выполнять операции более длительное время. Исключение могут составлять редкие случаи, в которых необходимо работу ядра синхронизировать с какими-то внешними событиями по опросу (без использования прерываний).
|
|
|
|
|
May 21 2009, 18:56
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(rezident @ May 21 2009, 18:49)  Кнопку повесьте на любой пин порта P1 или P2, у которых имеется возможность получить прерывание по изменению уровня на входе. Хотя раз у вас часы будут имитироваться, то в этом же "часовом" прерывании опросить состояние пина много времени не займет. В таком случае кнопка на любом пине может быть. Я об этом думал, но поскольку как Вы сказали - прерывание от часов все равно работает. Цитата Неразумное решение.  Зачем переключаться между кварцевыми генераторами? Разработчики MSP430 не зря ведь три внутренних CLK придумали. LFXT у вас будет работать всегда, потому как часы. От LFXT будет генерироваться ACLK. Кстати, часы лучше на WDT повесить, а TimerB использовать для более полезных дел. Но тогда в системе не будет вообще вотчдога! Заодно вопрос по нему, тут я немного не понял логику тексасовцев. Вотчдог это "охранное устройство", его назначение - выводить процессор (сбросом, прерыванием) их тупика в программе или аппаратного соя (например от помех - в AVR и Моторолах наблюдал не раз). Задача программы - его вовремя сбрасывать, и при этом этот сброс надо размещать так чтобы сна него попадало только закономерным образом, например не стоит рахмещать в перрывании, поскольку основная программа може зациклиться где-то, при работающем прерывании. При этом, в идеале у программы больше не должно быть доступа к управлению им. Например у Микрочипа WDT включается при прожигании, во фьюзах, и из программы его выключить нельзя. И считаю что это правильно. Тексасовцы же сделали "доступ с паролем", но что это за "пароль", если он просто константа, и одной командой пуляется в регистр и пароль и код выключения/включения. Цитата XT2 нужно включать только тогда, когда он требуется для генерации SMCLK и работы UART. MCLK у вас всегда должен тактироваться от DCO, настроенного на высокую частоту. Поправьте меня, если не прав - с DCO макс. частота MCLK около 4мгц, а с ХТ2 я могу запустить на 8мгц? Дело в том, что мне это критично - АЦП надо читать и передавать довольно часто, а попутно обслуживать часы, кнопки и ЖКИ, поэтому чем быстрее - тем лучше, потому я и озадачивался вчера временем выполнения операций. Цитата В таком случае гарантирован быстрый старт (единицы мкс) при переключении в рабочий режим и более надежная работа кристалла вообще (генератор-то внутренний!). К тому же уже неоднократно проверено, что "проснуться", быстро выполнить требуемые операции и снова "уснуть", менее энергозатратно, чем работать на низкой частоте тактирования, но выполнять операции более длительное время. Это я все понимаю, но все устройство в рабочем режиме жрет от аккумуятора пол ампера, и экономить ток MSP в это время излишне. А когда устройство выключено, работают только проц, от часового кварца. Быстрый старт при переключении в рабочий режим не нужен, это происходит по нажатию кнопки, так что, реакция человека-оператора не единицы мкс. Для других случаев, Вы безусловно правы.
|
|
|
|
|
May 21 2009, 22:24
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Allregia @ May 22 2009, 00:56)  Но тогда в системе не будет вообще вотчдога! Ну и что в этом криминального? Цитата(Allregia @ May 22 2009, 00:56)  не стоит рахмещать в перрывании, поскольку основная программа може зациклиться где-то, при работающем прерывании. По моим наблюдениям должно что-то совсем "страшное" для устройства произойти, чтобы MSP430 зациклился. Он может зависнуть от статики и/или защелкивания пинов, или Flash стереться (если супервизора питания нет), это да, изредка встречается. Но вот чтобы зациклилась корректно написанная программа ... я такого не припомню. Скорее MSP430 просто перезапустится по POR условию и программа начнет работу с вектора сброса. Тут особенности архитектуры играют роль. У MSP430 фон-Немановская архитектура с общим адресным пространством, а программа обычно исполняется из Flash. И при каком-либо сбое на 99,9% программа попадет на что-либо, формирующее POR-условие. А POR просто сбрасывает MSP430. POR может формироваться, например, при несанкционированной попытке записи во Flash. Допустим испортилось значение указателя, а новое его значение будет на Flash указывать и программа перезапустится при попытке записи по этому указателю "не туда". Или, например, если испортился PC в результате сбоя и программа начала "шарахаться" по адресному пространству, опять же очень велика вероятность, что попадется команда записи во флашь или в один из регистров требующих пароля. Тот же WDT, например. И опять не зацикливание будет, а перезапуск. Правда следует отметить, что я никогда не писал программы, выполняющие куски кода из ОЗУ MSP430. Может поэтому с зацикливаниями программы и не встречался. Цитата(Allregia @ May 22 2009, 00:56)  При этом, в идеале у программы больше не должно быть доступа к управлению им. Например у Микрочипа WDT включается при прожигании, во фьюзах, и из программы его выключить нельзя. И считаю что это правильно. Тексасовцы же сделали "доступ с паролем", но что это за "пароль", если он просто константа, и одной командой пуляется в регистр и пароль и код выключения/включения. Исходя из моего опыта, а) правильная трассировка платы, б) защита входных сигналов, выходящих за ее пределы и в) наличие хорошего супервизора питания гораздо эффективнее в плане устойчивости, чем использование WDT в MSP430. Поэтому я обычно без зазрения совести использую WDT как таймер системных "тиков"  Тем более, что прерывание от WDT, используемого в режиме интервального таймера, имеет весьма высокий приоритет среди всей периферии (выше него только NMI, TimerB и ComparatorA). Цитата(Allregia @ May 22 2009, 00:56)  Поправьте меня, если не прав - с DCO макс. частота MCLK около 4мгц, а с ХТ2 я могу запустить на 8мгц? Не прав. Поправляю. DCO можно легко до сотни МГц раскочегарить. Я как-то раз случайно у MSP430F1132 на 50МГц его запустил DCO это генератор RC-типа. Причем R у него может быть внешним (подключается ко входу Rosc). Но даже не используя внешний резистор, а только лишь перебирая значения внутренних R (биты RSELx в регистре BCSCTL1) в зависимости от типа MSP430 можно получить частоту DCO до 6МГц в случае MSP430x1xxx, до 25Мгц в случае MSP430x2xx, до 50МГц у MSP430x4xx и до 95МГц у MSP430x5xx (значения примерные, точнее см. в datasheet конкретного кристалла). При всем при этом значение частоты DCO можно откалибровать по часовому кварцу, подключенному к LFXT1. Да и стабильность DCO у современных серий MSP430 довольно высокая (единицы процента во всем рабочем температурном диапазоне).
|
|
|
|
|
May 24 2009, 16:03
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(rezident @ May 22 2009, 01:24)  Ну и что в этом криминального? По моим наблюдениям должно что-то совсем "страшное" для устройства произойти, чтобы MSP430 зациклился. Он может зависнуть от статики и/или защелкивания пинов, или Flash стереться (если супервизора питания нет), это да, изредка встречается. Но вот чтобы зациклилась корректно написанная программа ... я такого не припомню. А в природе бывают полностью корректные программы?  В любой программе, есть кк минимукм один баг    Цитата Скорее MSP430 просто перезапустится по POR условию и программа начнет работу с вектора сброса. Тут особенности архитектуры играют роль. У MSP430 фон-Немановская архитектура с общим адресным пространством, а программа обычно исполняется из Flash. И при каком-либо сбое на 99,9% программа попадет на что-либо, формирующее POR-условие. Попадет. Вопрос - "когда" ? Если проц. управляет чем-то реалтаймово, и в результате какого-то сбоя "улетел" и потом "вернулся", по пока он летал - в управляемом обьекте может успеть что-то сломаться или сгореть (например - если проц управляет источником питания). Цитата DCO это генератор RC-типа. Причем R у него может быть внешним (подключается ко входу Rosc). Но даже не используя внешний резистор, а только лишь перебирая значения внутренних R (биты RSELx в регистре BCSCTL1) в зависимости от типа MSP430 можно получить частоту DCO до 6МГц в случае MSP430x1xxx, Об этом я и говорил - с DCO только 6 а с кварцем - 8. Хотя с резистором, можно дойти и до 8. Цитата до 25Мгц в случае MSP430x2xx, до 50МГц у MSP430x4xx и до 95МГц у MSP430x5xx (значения примерные, точнее см. в datasheet конкретного кристалла). При всем при этом значение частоты DCO можно откалибровать по часовому кварцу, подключенному к LFXT1. Да и стабильность DCO у современных серий MSP430 довольно высокая (единицы процента во всем рабочем температурном диапазоне). Тогда во многих применеиях кварц не нужен - для UARTа < 5% хватает.
|
|
|
|
|
May 24 2009, 22:23
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Allregia @ May 24 2009, 22:03)  Попадет. Вопрос - "когда" ? Если проц. управляет чем-то реалтаймово, и в результате какого-то сбоя "улетел" и потом "вернулся", по пока он летал - в управляемом обьекте может успеть что-то сломаться или сгореть (например - если проц управляет источником питания). Вы сейчас о применении МК "вообще" рассуждаете или о конкретном применении какого-либо MSP430? Цитата(Allregia @ May 24 2009, 22:03)  Об этом я и говорил - с DCO только 6 а с кварцем - 8. Хотя с резистором, можно дойти и до 8. Вы в этой теме нигде конкретно не указали, с каким именно кристаллом вы работаете? Поэтому, чтобы не заниматься телепатией, я и дал описание возможностей всех серий MSP430. Цитата(Allregia @ May 24 2009, 22:03)  Тогда во многих применеиях кварц не нужен - для UARTа < 5% хватает. Чтобы UART работал всегда, везде и со любыми другими UART нужно стремиться baudrate не хуже ±0,5% устанавливать. ±5% годится только для настольно-наколенного применения.
|
|
|
|
|
May 25 2009, 04:43
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(rezident @ May 25 2009, 01:23)  Вы сейчас о применении МК "вообще" рассуждаете или о конкретном применении какого-либо MSP430?  Вообще  Цитата Вы в этой теме нигде конкретно не указали, с каким именно кристаллом вы работаете? Поэтому, чтобы не заниматься телепатией, я и дал описание возможностей всех серий MSP430. Помоему указывал - 1611. Но пока его плата не готова, развлекаюсь с другой платой, на коорой стоит 148. Цитата Чтобы UART работал всегда, везде и со любыми другими UART нужно стремиться baudrate не хуже ±0,5% устанавливать. ±5% годится только для настольно-наколенного применения.  Нет, это не так. УАРТу нужно чтобы с стоповому биту разбег был не более половины (лучше трети) длительности бита, отсюда и появляется граница в 5-6 % разницы в скорости приемника и передатчика. Поскольку они в хушем случае могут быть противоположны по знаку, то для каждого берется половина - 2.5-3%. (и конечно, это выполняется во всем диапазоне температур и других условий). 0.5% - для УАРТа совешенно избыточно. P.S. Доли %% стабильности при работе с внутреннего RC-генератора выполняются далеко не во всех контроллерах. Например у Микрочипа до определенных серий - изменение частоты по температуре от -20 до +100 доходило до +-15%, что для УАРТа неприемлимо. Более новые - в 2% укладывались и прекрасно работали с УАРТом без кварца.
|
|
|
|
|
May 25 2009, 10:26
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Allregia @ May 25 2009, 10:43)  Нет, это не так. УАРТу нужно чтобы с стоповому биту разбег был не более половины (лучше трети) длительности бита, отсюда и появляется граница в 5-6 % разницы в скорости приемника и передатчика. 5% это при условии 8-ми битного символа без бита четности и считывании значения строго в центре битового интервала. Но вовсе не все UART считывают значение именно в центре битового интервала. Цитата(Allregia @ May 25 2009, 10:43)  Поскольку они в хушем случае могут быть противоположны по знаку, то для каждого берется половина - 2.5-3%. (и конечно, это выполняется во всем диапазоне температур и других условий). Вы почему-то исключаете из рассмотрения длину (крутизну) фронтов сигнала и искажения их в тракте передачи. Цитата(Allregia @ May 25 2009, 10:43)  0.5% - для УАРТа совешенно избыточно. Когда стыкуется два своих изделия - да, избыточно. Когда же заранее не известно с каким именно оборудованием будет стыковаться, то 0,5% дают уверенность, что проблем по вине вашего устройства не будет.
|
|
|
|
|
May 25 2009, 12:34
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(rezident @ May 25 2009, 13:26)  5% это при условии 8-ми битного символа без бита четности и считывании значения строго в центре битового интервала. Но вовсе не все UART считывают значение именно в центре битового интервала. Конечно, другие считывают несколько раз с мажроитированием. Им еще проще будет  Цитата Вы почему-то исключаете из рассмотрения длину (крутизну) фронтов сигнала и искажения их в тракте передачи. Длительность импульсов при этом не искажается, до определенного предела, конечно. Цитата Когда стыкуется два своих изделия - да, избыточно. Когда же заранее не известно с каким именно оборудованием будет стыковаться, то 0,5% дают уверенность, что проблем по вине вашего устройства не будет. С любым стандартным.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|