|
|
  |
Помогите начать работать с Assembler, Assembler для LPC2148 |
|
|
|
Mar 21 2009, 15:18
|
Участник

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

|
Ребята, помогите пожалуйста начать работать с ассемблером. У меня МК LPC2148 c ядром ARM 7. В чем заключается проблема: Не могу добится от МК высокой производительности если пишу код программы на С, поэтому решил написать код на assembler. Использую программу keil. Посоветовали скачать arm7tdmidatasheet.pdf. Скачал почитал. Примеры есть, но как и с чего начать писать, как связать и подключить нужные модули и т.д. Вообщем просто необходи какой-нибудь простой примерчик (например поморгать светодиодами только чтобы код программы был написан на assemble) или дайте ссылочку на какой нибудь проект где люди пишут на ассемблере. Буду вам весьма признателен!!! :-)
|
|
|
|
|
Mar 21 2009, 15:49
|
Участник

Группа: Новичок
Сообщений: 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 импульсов. Всё просто!!!!! Заливаю программу в МК. Датчик делает кучу оборотов, только после этого загорается светодиод. Т.е. обработка тормозит. Импульсы МК пропускает! Думаю что программа написанная на С, тормозит МК. Какие пути оптимизации? Пожалуйста предложите, буду очень рад услышать конструктивную критику и не только!!!
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
|
Mar 21 2009, 16:13
|
Участник

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

|
Запрещаю прерывание в превании для того чтобы если МК находится в прерывании и на ногу пришел импульс то может возникнуть ошибка!!! МК необходимо будет зайти в прерывание, а он уже в нем! Вот поэтому я и запрещаю прерывание. aaarrr подскажите как можно другим способом подчитать импульсы от датчика скорости?
|
|
|
|
|
Mar 21 2009, 16:40
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

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

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

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

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

|
Цитата(Max-sceince @ Mar 21 2009, 20:31)  На 1 оборот диска приходится 250 импульсов. Номинальная частота вращения двигателя 3000 об/мин. Т.е. за секунду на ногу МК будет приходить 125 000 импульсов, это приблизительно 125 кГц. Уже с арифметикой проблемы  - ошибка на порядок. Всего 12,5 kHz - целая вечность. Цитата А на отладке программы я просто рукой вращаю датчик и приходится... Тогда точно ассемблер никак не поможет - явно нешуточные проблемы с подходом к делу. Прежде всего думайте, что нагородили, дабы заcтавить несчастный контроллер неуспевать считать.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 21 2009, 18:08
|
Участник

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

|
zltigo, так вот именно что, вроде ничего не нагорожено. Все самое необжодимое прописано. А результат получается нехороший.
|
|
|
|
|
Mar 21 2009, 18:35
|
Участник

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

|
zltigo, а вы можете подсказать где неверно, либо дать направление в котором следует подумать?  Буду очень презнателен!!!
|
|
|
|
|
Mar 22 2009, 04:19
|
Участник

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

|
Спасибо, SysRq понял свою ошибку!!! Заработало!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|