Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

АРМ - библиотеки за закъснения?
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=1949
Страница 1 от 2

Автор:  Цецо [ Пон Мар 06, 2006 1:02 pm ]
Заглавие:  АРМ - библиотеки за закъснения?

Става въпрос за кратки закъснения - до около 1 мс, но да кажем с резолюция под 1мкс.

Нещо от сорта на - 10,100,1000,10000 тактови цикъла. Говорим за закъснения които си ангажират процесора, без таймери, многозадачност и прочие. Просто да му кажеш - изчакай 100 цикъла.

Знам че някой ще каже да ги напиша сам на асемблер, ама още ми е малко мътен асемблера за това говедо. Аз съм разглезен в това отношение от пиковете, къде нещата с тактовите цикли бяха доста по ясни.

Автор:  Реконструктор [ Пон Мар 06, 2006 1:43 pm ]
Заглавие: 

Добре, нямаш ли свободно таймерче? :roll:

Автор:  Цецо [ Пон Мар 06, 2006 2:03 pm ]
Заглавие: 

Ами нали се сещаш. Управляваш например екрана. И трябва да закъснееш два от сигналите на 1us. Е сега за една проста входно изходна операция да пускам таймери? Е че само инициализацията и обработката на таймера ще отнеме повече време.

Автор:  ДедоБоре [ Пон Мар 06, 2006 2:12 pm ]
Заглавие: 

няма да се раминеш без асемблер.
най-малкото нещо е NOP в цикъл. дали ще инлайн или макрос си преценяваш ти
по-трудното е да го направиш универсално, т.е. да работи на всякакви честоти на CPU-то.
ще трябва да се калибрираш в началото. нещо от рода:
пускаш таймера на 1мс и броиш колко nop-а се изпъляват за този период

Автор:  Реконструктор [ Пон Мар 06, 2006 2:14 pm ]
Заглавие: 

Е извинявай, ама ако викаш ф-я, докато инициализираш преди да влезеш в цикъла за изчакване, пак ще мине повече от 1 uS. Зависи от тактовата честота де, ама пак.

Автор:  Реконструктор [ Пон Мар 06, 2006 2:16 pm ]
Заглавие: 

ДедоБоре написа:
няма да се раминеш без асемблер.
най-малкото нещо е NOP в цикъл. дали ще инлайн или макрос си преценяваш ти
по-трудното е да го направиш универсално, т.е. да работи на всякакви честоти на CPU-то.
ще трябва да се калибрираш в началото. нещо от рода:
пускаш таймера на 1мс и броиш колко nop-а се изпъляват за този период


Няма нужда от NOP. Просто инкрементиране с последващо сравняване. Калибриращият коефициент е достатъчно да бъде инициализиран еднократно при ресета.

Автор:  Цецо [ Пон Мар 06, 2006 2:18 pm ]
Заглавие: 

Ами обикновенно практиката е такава. Правят се различни функции например за 10,100*n, 1000*n тактови цикъла.

10 цикъла се прави макрос с нопове, 100 се прави като макрос на асемблер с някъв луп n-пъти, от там на горе обикновенно са по висши функции. Идеята е да не се специфицира време, а просто брой цикли n пъти. После като си знаеш тактовата честота - сам си определяш коя да включиш. Не е много универсално, но е достатъчно просто.

Само дето някой трябва да чете асемблер за АРМ.

Автор:  3aek [ Пон Мар 06, 2006 2:25 pm ]
Заглавие: 

закъсненията при арм най-добре прави през таймер да ти е мирна главата
иначе ще си зависим от PLL-и, кеш, код и прочее

Автор:  Реконструктор [ Пон Мар 06, 2006 2:28 pm ]
Заглавие: 

Странна практика. Един loop от сорта на:

Код:
@1: dec  R1
       jnz @1


е напълно достатъчен за всичко. Ако горното се изпълнява за n такта, то калибриращия коефициент се смята просто като mhz/точност/n.

Автор:  Цецо [ Пон Мар 06, 2006 3:54 pm ]
Заглавие: 

Заек - как да направя следното с таймер -

1.Някакъв пин се вдига.
2. Пауза около 500нс.
3. Друг пин се вдига.

Прощавай ама това да го правиш с таймер си е чист мазохизъм.

Сега естествено че ако ми трябва нещо около милисекунда, ще навия таймер.

Аз по принцип във почти всеки проект си имам прекъсване тиктакащо на милисекунда, даже си го пействам като стандартен код, все нещо се налага да се мери в милисекунди.

Ама тук става въпрос за стандартен запис в стандартен LCD дисплей (текстов) - Пуснеш му данните и трябва да изклокаш енейбъла, ама да има поне 500нс пулс, че дисплея бавно хваща. Сега за всяка подобна глупост да навивам таймери и да ги дебна за такива времена е гадно.

Да не говорим че специално при АРМ-а (LPC2138), таймерите също са зависими от PLL, VPB divider и пр.

Реконструктор - и аз това точно имах предвид (прости лупове), ама писането на асемблер за АРМ не ми е силна страна. Не мога да го направя с inline асемблера, понеже незнам дали няма да прецакам някой регистър дето го ползва компилатора. Трябва да си направя отделен асемблерски фаил, който да линквам към проекта. А това не ми е ясно как става - трябва да го чета. Също и самия асемблер - тия ядра имат една камара инструкции и видове адресации, всяка със собствено мнение по отношение на брой цикли.

Не може някой да не е правил нещо подобно. Направо съм учуден че ИАР-а няма подобни библиотеки или поне аз не ги откривам.

Автор:  nickich [ Пон Мар 06, 2006 4:12 pm ]
Заглавие: 

аз го правя така:
Код:
#define DELAY_NOPS      5
/* The number of NOPs, taken for 1 iteration of the delay() loop. (compiler   */
/* dependent)   */

/* -------------------------------------------------------------------------- */
/* Time delay defines                                                         */
/* -------------------------------------------------------------------------- */

#define DELAY_1ms   (PLL_CLK_ARM / (DELAY_NOPS*1000)) //17550

void delay (int t)
{
    register uint32 i;

    for (i = 0 ; i < t ; i++) {
        NOP();
    }

}



може да си дефинираш и закъснения по-малки от 1мс...

Автор:  Цецо [ Пон Мар 06, 2006 4:41 pm ]
Заглавие: 

nickich написа:
аз го правя така:
Код:
#define DELAY_NOPS      5
/* The number of NOPs, taken for 1 iteration of the delay() loop. (compiler   */
/* dependent)   */

/* -------------------------------------------------------------------------- */
/* Time delay defines                                                         */
/* -------------------------------------------------------------------------- */

#define DELAY_1ms   (PLL_CLK_ARM / (DELAY_NOPS*1000)) //17550

void delay (int t)
{
    register uint32 i;

    for (i = 0 ; i < t ; i++) {
        NOP();
    }

}



може да си дефинираш и закъснения по-малки от 1мс...


Пробвах и така, става, ама за големи закъснения около 1ms.
А на мен ми трябва около и под 1us.

Автор:  nickich [ Пон Мар 06, 2006 4:49 pm ]
Заглавие: 

ами в моя случай DELAY_1ms се получава 17550, т.е. за 1 us => около 17 и за 500 нс => около 8-9..., и inline. Трябва да стане... :roll:

Автор:  nickich [ Пон Мар 06, 2006 4:51 pm ]
Заглавие: 

... за горния пример съм си дефинирал:

Код:

#define DELAY_1us   ((DELAY_1ms +500)/1000)


Автор:  Цецо [ Пон Мар 06, 2006 6:39 pm ]
Заглавие: 

мда нещо подобно правя и аз. Засега е решение. Малко неугледно, ама... толкоз

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/