Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Задержки на LPC... Без использования таймера и прочего.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Velund
Вопрос в общем туповат... Но не хочется изобретением велосипеда заниматься, тем более что я уже видел готовое решение где то в инете. Вот только вспомнить где не могу. smile.gif

Нужна подпрограмма задержки для LPC21xx (миллисекунды, точность сугубая не критична, но чтобы не плясало в разы от переключения оптимизации в компиляторе и прочего)... Использовать таймеры и прочее нельзя, все прерывания должны быть запрещены.

Видел готовую реализацию "классического" варианта на асме, по моему даже в каком то проекте под филипс, с автоматическим учетом учетом тактовой частоты (из дефайна) и множителей PLL. Но вот ГДЕ видел - не могу вспомнить. Гугл тоже как то не помощник оказался - не помню никаких ключевых слов, а так он вываливает море ненужного, в котором можно потонуть.

Может у кого нибудь память лучше моей? biggrin.gif
sensor_ua
http://www.siwawi.arubi.uni-kl.de/avr_proj...cf77/index.html
http://www.siwawi.arubi.uni-kl.de/avr_proj...k_20041129b.zip

Там таймер включается навсегда, а для формирования задержек используется сравнение текущего значения показаний таймера с запомненным ранее. Используется беззнаковая математика. Соответственно, максимальная задержка ограничена 32 бит на клок таймера. Использую то же, но несколько поправленное, а то тот код несолько неоптимален, но оно рабочее.
Velund
Цитата(sensor_ua @ Mar 10 2007, 13:50) *
Там таймер включается навсегда, а для формирования задержек используется сравнение текущего значения показаний таймера с запомненным ранее. Используется беззнаковая математика. Соответственно, максимальная задержка ограничена 32 бит на клок таймера.


В том то и загвоздка, что использовать таймеры вообще нельзя. Это некий "аварийный" код, который будет выполняться при обнаружении какого то серьезного сбоя. Может быть порушена оперативка, все что угодно твориться с таймерами - но трогать в этот момент что то кроме маленького кусочка оперативки которая специально под это дело выделена крайне нежелательно. Именно поэтому и ищу "классический" вариант на циклах... Максимум что можно себе позволить из "вмешательства в личную жизнь" процессора - отключить PLL (что и делается, и, вроде бы, несколько упрощает задачу).

"По тупому" задача решается очень просто, но включение-отключение оптимизации заставляет получающиеся задержки "плясать" в достаточно больших пределах. А вот от этого то и хочется уйти.

Как я уже писал - попадалось на глаза готовое такое решение, передаешь число миллисекунд, и оно все само делает, с учетом частоты кварца. ;-) Но вот потратил часа два копаясь в гугле - и найти не могу тот проект (или апноту - сейчас уже и не вспомню). Наверное сам бы уже наваял за это время ;-)
sensor_ua
Имелось в виду что-то типа того?

volatile long delayvalue;

void delay(long d){
delayvalue = d;
while (delayvalue--);
return;
}
VAI
Цитата
"По тупому" задача решается очень просто, но включение-отключение оптимизации заставляет получающиеся задержки "плясать" в достаточно больших пределах. А вот от этого то и хочется уйти.

объявите функцию задержки в отдельном файле и поставьте там прагму, отвечающую за оптимизацию, чтоб оптимизация не менялась от настроек проекта. Можно это сделать и из ИДЕ.
Про прагмы в ИАРе не знаюно там, по моему, можно в свойствах проекта на конкретный файл выставить нужную оптимизацию.
А количество циклов подберите.
Velund
Цитата(VAI @ Mar 10 2007, 15:13) *
объявите функцию задержки в отдельном файле и поставьте там прагму, отвечающую за оптимизацию, чтоб оптимизация не менялась от настроек проекта.


Ну это то я уже сделал. Когда наконец меня хватило на то, чтобы дочитать доки. wink.gif

Просто своими глазами видел очень тщательно проработанное готовое решение на асме, надеялся что кто то вспомнит где это было... smile.gif
Alechek
припоминаю лишь
Код
********************************************
    Задержка на (t+1)*10  тактов
********************************************
*/
#pragma arm
void us_Delay(int t)
{
  long r1;
  __asm
  {
       MOV      r1,#0
       B        label1

  label2:
       NOP
       NOP
       NOP
       NOP
       NOP
       ADD      r1,r1,#1
  label1:
       CMP      r1,t
       BLT      label2
       NOP
  }

из bsp.c демо-проетка с сахары.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.