реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Помогите начать работать с Assembler, Assembler для LPC2148
Max-sceince
сообщение Mar 21 2009, 15:18
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 1-01-09
Пользователь №: 42 870



Ребята, помогите пожалуйста начать работать с ассемблером. У меня МК LPC2148 c ядром ARM 7. В чем заключается проблема: Не могу добится от МК высокой производительности если пишу код программы на С, поэтому решил написать код на assembler. Использую программу keil. Посоветовали скачать arm7tdmidatasheet.pdf. Скачал почитал. Примеры есть, но как и с чего начать писать, как связать и подключить нужные модули и т.д. Вообщем просто необходи какой-нибудь простой примерчик (например поморгать светодиодами только чтобы код программы был написан на assemble) или дайте ссылочку на какой нибудь проект где люди пишут на ассемблере. Буду вам весьма признателен!!! :-)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 21 2009, 15:30
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Боюсь, что Вы не стой стороны пытаетесь решить проблему. Может, сначала попробовать оптимизировать те участки, производительность которых не устраивает?
Go to the top of the page
 
+Quote Post
Max-sceince
сообщение Mar 21 2009, 15:49
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 1-01-09
Пользователь №: 42 870



aaarrr, оптимизировать то нечего все очень просто. МК использую для управления двигателем. Перед тем как написать полностью проект отлаживаю его составные части. Вот дошел до датчика скорости. На один оборот датчика скорости приходит 250 импульсов.
Написал программу
CODE
#include <lpc214x.h>
int i;
void T1isr(void) __irq;
void _PLL (void);
void _MAM (void);
int main(void)
{
int j;
i=0;
_PLL();
_MAM();
PINSEL1 =0x00000C00; //p0.21 vibran kak zahvat//
T1PR = 0x00000001; //Load prescaler for 1 Msec tick
T1TCR = 0x00000002; //Reset counter and prescaler
T1CCR = 0x00000A00; //Capture on rising edge of channe0.0
T1TCR = 0x00000001; //enable timer
VICVectAddr5 = (unsigned)T1isr; //Set the timer ISR vector address
VICVectCntl5 = 0x00000025; //Set channel
VICIntEnable = 0x00000020; //Enable the interrupt
IODIR0 =0x00000C00; //set p.10 and p.11 outputs
IO0SET =0x0C00;
j=0;
while(1)
{
if (i==250)
{
IO0CLR = 0x0400;
}
VICIntEnable = 0x00000020; //Enable the interrupt
for (j = 0; j < 500000; j++ ); // wait 500 msec
IO0CLR =0x0800;
for (j = 0; j < 500000; j++ ); // wait 500 msec
IO0SET =0x0800;
}

}

void _PLL (void)
{
PLL0CFG = 0x00000024; // ystanavliv koef ymnojenia i delenia for poluchenia chastoti 60MHz
PLL0CON = 0x00000001; // vkluchaem PLL
PLL0FEED = 0x000000AA; // obnovliaem registri
PLL0FEED = 0x00000055;
while (!(PLL0STAT& 0x00000400));// proveraiem flag lock
PLL0CON = 0x00000003; // podkluchaem PLL
PLL0FEED = 0x000000AA; // obnovliaem registri Pll
PLL0FEED = 0x00000055;
VPBDIV = 0x00000002; // Yctanablivaem chastotu chini VPB=30MHz
}
void _MAM (void)
{
MAMCR = 0x00000000;
MAMTIM = 0x00000004;
MAMCR = 0x00000002;
}
void T1isr (void) __irq
{
VICIntEnClr = 0x00000020;
i++;
T1IR = 0x00000080;
VICVectAddr = 0x00000024; //Dummy write to signal end of interrupt

}

Импульсы от датчика скорости подаю на ногу МК (p0.21) программирую её как capture 1.3 ()для TIMER1. Настраиваю TIMER1 таким образом чтобы при переходе c 0 на 1, МК входила в прерывание. В приревании инкременирую i(счетчик импульсов). в основном теле программы провиряю этот счетчик если он равен 250 то я включаю светодиод. На отладочной плате их у меня два. Один светодиод просто мигает, а второй показывает когда счетчик импульсов i насчитал 250 импульсов. Всё просто!!!!!
Заливаю программу в МК. Датчик делает кучу оборотов, только после этого загорается светодиод. Т.е. обработка тормозит. Импульсы МК пропускает! Думаю что программа написанная на С, тормозит МК. Какие пути оптимизации? Пожалуйста предложите, буду очень рад услышать конструктивную критику и не только!!! smile.gif
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 21 2009, 16:02
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Max-sceince @ Mar 21 2009, 18:49) *
Думаю что программа написанная на С, тормозит МК. Какие пути оптимизации? Пожалуйста предложите, буду очень рад услышать конструктивную критику и не только!!! smile.gif

Asm тут никак не поможет. Влетать на каждом импульсе в прерывание - это уже не самая лучшая идея, подойдет только для относительно низких частот. И зачем запрещать прерывание в обработчике и при этом периодически разрешать его в основном цикле???
Так что дело не в быстродействии, а в программе.
Go to the top of the page
 
+Quote Post
Max-sceince
сообщение Mar 21 2009, 16:13
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 1-01-09
Пользователь №: 42 870



Запрещаю прерывание в превании для того чтобы если МК находится в прерывании и на ногу пришел импульс то может возникнуть ошибка!!! МК необходимо будет зайти в прерывание, а он уже в нем! Вот поэтому я и запрещаю прерывание. aaarrr подскажите как можно другим способом подчитать импульсы от датчика скорости?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 21 2009, 16:40
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Max-sceince @ Mar 21 2009, 19:13) *
Запрещаю прерывание в превании для того чтобы если МК находится в прерывании и на ногу пришел импульс то может возникнуть ошибка!!!

Не может.

Цитата(Max-sceince @ Mar 21 2009, 19:13) *
подскажите как можно другим способом подчитать импульсы от датчика скорости?

На LPC, насколько я помню, никак. Но можно задействовать вход внешнего прерывания с FIQ.
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Mar 21 2009, 17:06
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(Max-sceince @ Mar 21 2009, 20:49) *
счетчик если он равен 250 то я включаю светодиод. На отладочной плате их у меня два. Один светодиод просто мигает, а второй показывает когда счетчик импульсов i насчитал 250 импульсов. Всё просто!!!!!
Заливаю программу в МК. Датчик делает кучу оборотов, только после этого загорается светодиод. Т.е. обработка тормозит.

Вы бы сначала озвучили, с какой частотой у вас импульсы подаются на вход.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
Max-sceince
сообщение Mar 21 2009, 17:31
Сообщение #8


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 1-01-09
Пользователь №: 42 870



Andy Mozzhevilov, На 1 оборот диска приходится 250 импульсов. Номинальная частота вращения двигателя 3000 об/мин. Т.е. за секунду на ногу МК будет приходить 125 000 импульсов, это приблизительно 125 кГц. Это максимальная частота. А на отладке программы я просто рукой вращаю датчик и приходится повернуть n-количество раз чтобы счетчик импульсов насчитал нужное количество импульсов. А это не правильно!!! Он за один оборот в программе должен уже подсчитать 250 импульсов и зажечь светодиод. А МК этого не делает.

aaarrr, спасибо за совет попробую, посмотрю что получется. Если вдруг у кого возникли какие-нибудь идеи подскажите, пожалуйста!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 21 2009, 17:56
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Max-sceince @ Mar 21 2009, 20:31) *
На 1 оборот диска приходится 250 импульсов. Номинальная частота вращения двигателя 3000 об/мин. Т.е. за секунду на ногу МК будет приходить 125 000 импульсов, это приблизительно 125 кГц.

Уже с арифметикой проблемы sad.gif - ошибка на порядок. Всего 12,5 kHz - целая вечность.
Цитата
А на отладке программы я просто рукой вращаю датчик и приходится...

Тогда точно ассемблер никак не поможет - явно нешуточные проблемы с подходом к делу. Прежде всего думайте, что нагородили, дабы заcтавить несчастный контроллер неуспевать считать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Mar 21 2009, 18:06
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



В общем за 80 мкс на импульс можно его на 60 МГц не то что в прерывании хватать, а в RTOS в задаче обрабатывать.
Разбирайтесь с работой периферии, контроллера прерываний и иже с ними... Си оставте в покое, он не причем.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
Max-sceince
сообщение Mar 21 2009, 18:08
Сообщение #11


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 1-01-09
Пользователь №: 42 870



zltigo, так вот именно что, вроде ничего не нагорожено. Все самое необжодимое прописано. А результат получается нехороший.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 21 2009, 18:14
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Max-sceince @ Mar 21 2009, 21:08) *
...ничего не нагорожено.

Смею Вас заверить со все определенностью, что это не так sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
SysRq
сообщение Mar 21 2009, 18:19
Сообщение #13


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(Max-sceince @ Mar 21 2009, 21:08) *
...вроде ничего не нагорожено.

С какой вероятностью в main() значение переменной i считается как ровно 250, если считывается (считывается ли? volatile нету...) новое значение переменной i раз в секунду, а инкременируется значение i с частотой (как правильно подсчитал уважаемый zltigo) примерно 12,5 kHz? smile.gif
Go to the top of the page
 
+Quote Post
Max-sceince
сообщение Mar 21 2009, 18:35
Сообщение #14


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 1-01-09
Пользователь №: 42 870



zltigo, а вы можете подсказать где неверно, либо дать направление в котором следует подумать? smile.gif Буду очень презнателен!!!
Go to the top of the page
 
+Quote Post
Max-sceince
сообщение Mar 22 2009, 04:19
Сообщение #15


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 1-01-09
Пользователь №: 42 870



Спасибо, SysRq понял свою ошибку!!! Заработало!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 17:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01485 секунд с 7
ELECTRONIX ©2004-2016