Отговори на тема  [ 43 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща
АРМ7 въпроси 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение 
Никола флаговете на заявките към VIC са във VICRawIntr, VICIRQStatus и VICFIQStatus.
В първия от тези регистри можеш да следиш какво се подава към VIC като заявки.
Във вторите два съответно само конфигурираните във VIC които чакат ред или се обработват в момента.

При VIC и ARM има една особеност, че сигналите FIQ и IRQ от VIC към ядрото се подават асинхронно и може да получат едни конфузни ситуации. Описани са на сайта на ARM както и в документацията на LPC2000 ги има препечатани. Това обаче може да запълни спокойно една отделна тема понататък.


Пет Ное 11, 2005 11:41 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Някои има ли едно примерче за LPC за инициализация на прекъсване от UART-a и на самото прекъсване. От вчера се боря с това направо не знам отде ми идва проблема. Като ми доиде баит по UART-a и задеисва прекъсването програмата забива. Нямам и JTAG да видя къде отива и кво става.
Ебати и лаиняните процесори,плод на болни мозъци,на гранницата съм вече да метна платката през прозореца. :evil:


Съб Дек 10, 2005 5:11 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Пет Окт 21, 2005 9:35 pm
Мнения: 152
Местоположение: Варна
Мнение 
Кой UART ползваш UART0 или UART1.


Съб Дек 10, 2005 7:19 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Zdrav ми даде един негов сорс но се оказа че и аз така уж го правя. Но не работи. Всичко ред по ред направих под IAR-a но резултата е само загубено време.

Uart0 ползвам.


Съб Дек 10, 2005 7:47 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Заради такива шашкънии избягвам да правя развой на контролери без поддръжка на хардуерен DEBUG. Просто не си представям как на времето съм писал за 8051 и други такива от бандата. Иначе в девелопъския екип трябва да назначиш и циганка - гледачка.

Никита, опитай се да си изясниш откъде ти е проблемът. Възможните варианти са няколко:
1. При прекъсване отива на друг вектор / адрес;
2. В прекъсването променяш нещо, което после не възстанояваваш : регистър, статус, п*чка му м*йна;
3. От прекъсването не излизаш правилно : напр. RЕТ вм. RETI или подобно ( не му знам асемблера на туй чудо ). Ако пишеш на C, може да не си задал нужната прагма на компайлера;
4. В прекъсването трябва да се нулира някакъв флаг, а ти не го правиш и се прекъсваш до умопомрачение.

Долу-горе за това се сещам. Пиша ти го просто от общи съображения, ARM ми е като китайския : хем на го знам, хем го мразя.


Съб Дек 10, 2005 7:53 pm
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Пет Окт 21, 2005 9:35 pm
Мнения: 152
Местоположение: Варна
Мнение 
Ами това успях да намеря, доколкото си спомням работеше. Изтрих тялото на ISR оставих само частта която се занимава с USART-a.
#/*------------------------------------------------------------------------------------*/
U0_ISR:

LDR R0, =U0IIR
LDR R2, =U0THR
LDRB R0, [R0] /*Read Int ID*/
LDRB R7, [R2] /*Read data and clear interrupt flag*/
/*Read FIRST U0IIR then U0RBR!!! */

/*ISR BODY*/

RAI: LDR R0, =VICVectAddr /*Acknowledge interrupt*/
EOR R1,R1,R1 /*Clear R1*/
STR R1, [R0]
SUBS PC,LR,#0x00000004 /*Return from interrupt*/
#/*------------------------------------------------------------------------------------*/


Съб Дек 10, 2005 8:39 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Пет Окт 21, 2005 9:35 pm
Мнения: 152
Местоположение: Варна
Мнение 
ето и инициализацията на U0
/*------------------------------------------------------------------------*/
# Init Uart0

LDR R0, =U0RBR
MOV R1, #0x80 /*DLAB = 1*/
STR R1, [R0, #U0LCR_OFS]
MOV R1, #0x60
STR R1, [R0]
MOV R1, #0x03 /*DLAB = 0*/
STR R1, [R0, #U0LCR_OFS]
MOV R1, #0x01
STR R1, [R0, #U0IER_OFS]
STR R1, [R0, #U0FCR_OFS]
/*------------------------------------------------------------------------*/


Съб Дек 10, 2005 8:43 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Проблема явно е пак в шибания Vector Interrupt Controler. Отива неиде на маината си при прекъсване.
Изобщо без JTag работата в такива ситуации много зле.


Съб Дек 10, 2005 8:47 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение 
Знам че всичко изглежда както трябва, но щом при теб не работи значи нещо не е наред.
Ето ти един "чек-лист"
1. Убеди се че на адрес 0x18 имаш следната инструкция:
ldr pc, [pc, #-0xFF0]
Или нещо което върши същата работа.
(Ако дебъгваш от RAM тази инструкция трябва да е на адрес 0x40000018)
2. Убеди се че в началото на програмата преди да започнат да пристигат заявките за прекъсвания имаш коректно установен регистъра за ремапване на таблицата с ексепшъните.
ако таблицата ти е във FLASH трябва да имаш MEMMAP = 1;
ако таблицата ти е във RAM - MEMMAP = 2;
Внимавай при RESET стойността на MEMAP е 0, което насочва ексепшъните към BootLoader-a!!!
Така че трябва задължително да установиш коректна стойност в този регистър.
3. Убеди се че конфигурираш правилно VIC;
4. Увери се че компилатора ти генерира код, който при влизане в ISR запомня контекста;
5. Специално за UART на LPC внимавай четене на U0IIR нулира флага в периферията до пристигане на следващия байт. Трябва след последния прочетен от ISR байт да си сигурен че този флаг е нулиран иначе зацикляш.
6. Задължително преди излизане от ISR запис във VICVectAddr за да ъпдейтнеш приоритетите в него.
7. При работа с ISR не забравяй да заделиш памет и инициализираш указател към стека за IRQ режим.
Разбира се предполага се че работиш с VIC и използваш IRQ при FIQ нещата стоят по-различно.


Успех.

Edit: Добавих точка 7 която също често се пропуска.


Последна промяна Zdrav на Съб Апр 29, 2006 12:38 pm, променена общо 1 път



Съб Дек 10, 2005 9:04 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Мерси. Доста подробно ми обясни започвам да копая точка по точка. Може би не съм се разбрал с някаква особенност на IAR-a. Ще гледам кво генерира.


Съб Дек 10, 2005 9:11 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
С това се оправих най накрая.

Следващото дето бутнах пак проблем и пак нещо дето не е документирано.

Искам да си пусна таимер

би трябвало да е наи простото нещо на света. чета документацията пиша

T1TCR = 1;
T1PR = 0;
T1MR0 = 9999;
T1MCR = 3;

да ама не тръгва. Пускам симулация в IAR-a не мърда брояча.
PCONP по пдф-а не трябва да е 0 след ресет и трябва да са разрешени перифериите ама си е нула.
Разрешавам от него захранването на таимерите но все е тая не мърда брояча.

Какво още иска още това чудо? Едно примерче за Kiel намерих точно така е направено всичко.


Нед Дек 11, 2005 4:25 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение 
В IAR симулатора симулира ли периферията?


Нед Дек 11, 2005 10:55 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
И вярно бе,прегледах документацията му и никъде не е е споменато че прави симулация и на периферията. Трябваше да се сетя като си играх да симулирам прекъсването че се симулира само IRQ на ядрото и не се занимава с периферията.

Тоя път проблема си е бил при мен :)
Като не тръгна от първия път тръгнах да симулирам и се замотах. А просто е трябвало да увелича интервала за да мога да виждам че светодиодчето ми мига.


Нед Дек 11, 2005 12:11 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Портвам една библиотека дето е писана за 8 битов процесор и се зароди следния въпрос.
Програмата има променлива която се променя в границите 0-255. На няколко места вече срещам че е по оптимално да я обявя като int a ne kato char. Има ли истина в това?
Още не съм стигнал до асемблера на ARM че сам да проверя за какво става дума :) Ама като са го направили толкова късо денонощието и не стига време за всичко :) .....


Чет Яну 05, 2006 8:08 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Абе това и мен ме заинтересува но в малко по друг аспект.

То хубаво пише че арма може да работи с 32,16 и 8 битови данни. Ама като шината му за данни е 32 битова как променя например само първата четвъртинка. Това още повече ме озадачава ако се ползва външен РАМ, например 16 битов. Едва ли е чрез read/modify/write щото ще е тъпо.

Я някой по в час да каже как става тая работа.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Чет Яну 05, 2006 8:36 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 43 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни