| Автор |
Съобщение |
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 2:01 pm Мнения: 1952 Местоположение: Варна
|
Никола флаговете на заявките към VIC са във VICRawIntr, VICIRQStatus и VICFIQStatus.
В първия от тези регистри можеш да следиш какво се подава към VIC като заявки.
Във вторите два съответно само конфигурираните във VIC които чакат ред или се обработват в момента.
При VIC и ARM има една особеност, че сигналите FIQ и IRQ от VIC към ядрото се подават асинхронно и може да получат едни конфузни ситуации. Описани са на сайта на ARM както и в документацията на LPC2000 ги има препечатани. Това обаче може да запълни спокойно една отделна тема понататък.
|
| Пет Ное 11, 2005 11:41 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Някои има ли едно примерче за LPC за инициализация на прекъсване от UART-a и на самото прекъсване. От вчера се боря с това направо не знам отде ми идва проблема. Като ми доиде баит по UART-a и задеисва прекъсването програмата забива. Нямам и JTAG да видя къде отива и кво става.
Ебати и лаиняните процесори,плод на болни мозъци,на гранницата съм вече да метна платката през прозореца. 
|
| Съб Дек 10, 2005 5:11 pm |
|
 |
|
CM600
Ранг: Новодошъл
Регистриран на: Пет Окт 21, 2005 9:35 pm Мнения: 152 Местоположение: Варна
|
Кой UART ползваш UART0 или UART1.
|
| Съб Дек 10, 2005 7:19 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Zdrav ми даде един негов сорс но се оказа че и аз така уж го правя. Но не работи. Всичко ред по ред направих под IAR-a но резултата е само загубено време.
Uart0 ползвам.
|
| Съб Дек 10, 2005 7:47 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
Заради такива шашкънии избягвам да правя развой на контролери без поддръжка на хардуерен DEBUG. Просто не си представям как на времето съм писал за 8051 и други такива от бандата. Иначе в девелопъския екип трябва да назначиш и циганка - гледачка.
Никита, опитай се да си изясниш откъде ти е проблемът. Възможните варианти са няколко:
1. При прекъсване отива на друг вектор / адрес;
2. В прекъсването променяш нещо, което после не възстанояваваш : регистър, статус, п*чка му м*йна;
3. От прекъсването не излизаш правилно : напр. RЕТ вм. RETI или подобно ( не му знам асемблера на туй чудо ). Ако пишеш на C, може да не си задал нужната прагма на компайлера;
4. В прекъсването трябва да се нулира някакъв флаг, а ти не го правиш и се прекъсваш до умопомрачение.
Долу-горе за това се сещам. Пиша ти го просто от общи съображения, ARM ми е като китайския : хем на го знам, хем го мразя.
|
| Съб Дек 10, 2005 7:53 pm |
|
 |
|
CM600
Ранг: Новодошъл
Регистриран на: Пет Окт 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 |
|
 |
|
CM600
Ранг: Новодошъл
Регистриран на: Пет Окт 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 |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Проблема явно е пак в шибания Vector Interrupt Controler. Отива неиде на маината си при прекъсване.
Изобщо без JTag работата в такива ситуации много зле.
|
| Съб Дек 10, 2005 8:47 pm |
|
 |
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 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 |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Мерси. Доста подробно ми обясни започвам да копая точка по точка. Може би не съм се разбрал с някаква особенност на IAR-a. Ще гледам кво генерира.
|
| Съб Дек 10, 2005 9:11 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 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 |
|
 |
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 2:01 pm Мнения: 1952 Местоположение: Варна
|
В IAR симулатора симулира ли периферията?
|
| Нед Дек 11, 2005 10:55 am |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
И вярно бе,прегледах документацията му и никъде не е е споменато че прави симулация и на периферията. Трябваше да се сетя като си играх да симулирам прекъсването че се симулира само IRQ на ядрото и не се занимава с периферията.
Тоя път проблема си е бил при мен
Като не тръгна от първия път тръгнах да симулирам и се замотах. А просто е трябвало да увелича интервала за да мога да виждам че светодиодчето ми мига.
|
| Нед Дек 11, 2005 12:11 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 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 |
|
|