tvilsa 0 20 марта, 2009 Опубликовано 20 марта, 2009 · Жалоба Всем привет. Использую задержку ввиде delay_ms(unsigned int a) { volatile unsigned int b; b=a; do b--; while (b != 0); } Несмог понять в руководстве пользователя сколько тактов займет выполнение цикла. Помогите люди добрые. Заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 27 20 марта, 2009 Опубликовано 20 марта, 2009 · Жалоба Выкладывайте листинг, т.к. он зависит от уровня оптимизации Тогда можно сказать конкретно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 20 марта, 2009 Опубликовано 20 марта, 2009 · Жалоба Если используете IAR, то запустите его симулятор и посмотрите счетчик циклов. А вообще для таких случаев следует приводить ассемблерный листинг, а не Си-шный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zhevak 0 21 марта, 2009 Опубликовано 21 марта, 2009 · Жалоба Вот так код будет прозрачнее, а результат работы -- тот же. void delay_ms(unsigned int a) { while (0 != --a) ; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 21 марта, 2009 Опубликовано 21 марта, 2009 · Жалоба У IAR есть встроенные функции, они определены в intrinsics.h в том числе и __intrinsic void __delay_cycles(unsigned long __cycles); присутствует в версиях по крайней мере начиная с 3.42, возможно и чуть раньше. Если же писать самому, то это как раз тот случай когда есть смысл использовать ассемблер, тогда можно быть уверенным в результате независимо от оптимизации компилятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 23 марта, 2009 Опубликовано 23 марта, 2009 · Жалоба Вот так код будет прозрачнее, а результат работы -- тот же. Ой не факт. Обратите внимание на volatile b в исходном примере. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tvilsa 0 23 марта, 2009 Опубликовано 23 марта, 2009 · Жалоба У IAR есть встроенные функции, они определены в intrinsics.h в том числе и __intrinsic void __delay_cycles(unsigned long __cycles); присутствует в версиях по крайней мере начиная с 3.42, возможно и чуть раньше. Если же писать самому, то это как раз тот случай когда есть смысл использовать ассемблер, тогда можно быть уверенным в результате независимо от оптимизации компилятора. Вот это то что надо. Спасибо всем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 20 мая, 2009 Опубликовано 20 мая, 2009 · Жалоба Если используете 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 20 мая, 2009 Опубликовано 20 мая, 2009 · Жалоба У Вас генератор XT2 не успел запуститься, поэтому не произошло переключение MCLC на него. Процессор по-прежнему тактируется от DCO. Нужно дождаться запуска генератора (бит OFIFG), только потом переключаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 20 мая, 2009 Опубликовано 20 мая, 2009 · Жалоба Подскажите, плиз, где оно там?См. скриншот. Кварц 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 20 мая, 2009 Опубликовано 20 мая, 2009 · Жалоба См. скриншот. Спасибо. Я уже нашел в принципе, что 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 отладчиком. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 20 мая, 2009 Опубликовано 20 мая, 2009 · Жалоба Я уже нашел в принципе, что NOP это 5 циклов.С дуба рухнули? :07: Пардон за эмоции. NOP это один цикл/такт! Ошибка в том, что я не жду в цикле сброса OFIFG перед тем как идти дальше ?Да. Пока OFIFG не сбросится (генерация кварца не будет устойчивой) MCLK на тактирование от XT2 (XT1) не переключится, несмотря на любое принудительное изменение состояния битов SELMx в регистре BCSCTL2. По умолчанию (после сброса или подаче питания) MCLK от внутреннего DCO работает. А DCO на частоте около 900кГц запускается. Но судя по всему, работает оно у меня нормально.Угу, работает. Только не от 8МГц кварца. Если бы MCLK тактировался от 8МГц, то вы бы наблюдали импульсы 0,75мкс (6 тактов) и 1мкс (8 тактов). А так вы записью в BCSCTL1 битов RSELx увеличили частоту DCO до (примерно) 3.1МГц и работаете на DCO. См. фрагмент из даташита в аттаче. Если это на что-то влияет - питание подано все время, работаю с JTAG отладчиком.Вообще-то, если внимательно читать мой ответ в сообщении #3, который вы процитировали в своем вопросе, то я там писал про симулятор, а не про эмулятор (JTAG отладчик). И скриншот в сообщении #10 соответственно тоже в режиме симулятора снят. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 21 мая, 2009 Опубликовано 21 мая, 2009 · Жалоба С дуба рухнули? :07: Пардон за эмоции. NOP это один цикл/такт! Да понял я, понял. Сейчас проверю. Вообще-то, если внимательно читать мой ответ в сообщении #3, который вы процитировали в своем вопросе, то я там писал про симулятор, а не про эмулятор (JTAG отладчик). И скриншот в сообщении #10 соответственно тоже в режиме симулятора снят. Не горячитесь :) Этот момент я тоже понял. Вчера специально переключался из эмулятора в симулятор, но не нашел де циклы считаются - потому и спросил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 21 мая, 2009 Опубликовано 21 мая, 2009 · Жалоба Кстати, желание обязательно переключиться на тактирование от кварца - это тоже типичное для начинающих работу с MSP. Далеко не всегда это необходимо. Если для UART-а или таймеров нужен точный клок - в Вашем распоряжении SMCLK или ACLK, а проц может и от DCO тактироваться. Я и сам в первый раз тоже потратил на это пару дней, пока не сообразил что это лишнее и только мешает уходить в спячку и потом просыпаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 21 мая, 2009 Опубликовано 21 мая, 2009 · Жалоба Кстати, желание обязательно переключиться на тактирование от кварца - это тоже типичное для начинающих работу с 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 на прерывание часов). А прав ли я ? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться