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

 
 
 
Reply to this topicStart new topic
> Вложенные прерывания LPC21xx
Limp
сообщение Mar 18 2012, 10:28
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 6-02-08
Пользователь №: 34 796



Всем доброго дня!
Прошу помощи.
Начал осваивать LPC2129 с нуля. Платка OLIMEX, Keil и больше ничего.

Скомпилировал код обработки прерываний Timer0 и Uart0.
Таймер управляет бдинком диодов, порт принимает и отправляет байт.

При запуске диоды мигают и Uart0 принимает и отправляет байт.
Но таймер после первого байта затыкается, хотя Uart0 продолжает принимать и отправлять байты.
Почему??? Вот мой код.


CODE
void init_uart0 (int boudrate) {

U0LCR = 0x00000083;
U0DLL=14745600/(16*boudrate);
U0DLM=((14745600/(16*boudrate))>>8);
U0LCR = 0x00000003;

VICVectAddr1 = (unsigned long)uart0;
VICVectCntl1 = 0x20 | 6;
VICIntEnable |= 0x00000040;
U0IER = 0x01;
}


void uart0 (void) __irq {

putchar(getchar());
}



void init_timer (void) {
T0MR0 = 149999; // 10mSec = 150.000-1 counts
T0MCR = 3; // Interrupt and Reset on MR0
T0TCR = 1; // Timer0 Enable
VICVectAddr0 = (unsigned long)tc0; // set interrupt vector in 0
VICVectCntl0 = 0x20 | 4; // use it for Timer 0 Interrupt
VICIntEnable |= 0x00000010; // Enable Timer0 Interrupt
}


void tc0 (void) __irq {
++timeval;
T0IR = 1; // Clear
VICVectAddr = 0; // Acknowledge Interrupt
}


Сообщение отредактировал IgorKossak - Mar 19 2012, 10:21
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 18 2012, 10:48
Сообщение #2


Гуру
******

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



А где обработчик UART?
Go to the top of the page
 
+Quote Post
Limp
сообщение Mar 18 2012, 11:06
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 6-02-08
Пользователь №: 34 796



Цитата(aaarrr @ Mar 18 2012, 13:48) *
А где обработчик UART?



Здравствуте aaarrr!!!
Вы в свое время мне здорово помогли с АТ91SAM. Помните меня, про АСУЗ?
Задачи те решил и вот нрвая напасть.

Код
void uart0 (void) __irq  {

putchar(getchar());
VICVectAddr = 0;
}


Сообщение отредактировал IgorKossak - Mar 19 2012, 10:21
Причина редактирования: [code]
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 18 2012, 12:33
Сообщение #4


Гуру
******

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



Цитата(Limp @ Mar 18 2012, 15:06) *
Здравствуте aaarrr!!!
Вы в свое время мне здорово помогли с АТ91SAM. Помните меня, про АСУЗ?

Здравствуйте. Да, давненько это было sm.gif

Цитата(Limp @ Mar 18 2012, 15:06) *
void uart0 (void) __irq {

putchar(getchar());
VICVectAddr = 0;
}

В процедуре не хватает чтения U0IIR, поэтому процессор и "зависает" в прерывании.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 19 2012, 01:45
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Limp @ Mar 18 2012, 17:06) *
void uart0 (void) __irq {

putchar(getchar());
VICVectAddr = 0;
}

Чего это вы в обработчике прерывания пользуете функции файлового В/В?
Go to the top of the page
 
+Quote Post
Limp
сообщение Mar 19 2012, 06:29
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 6-02-08
Пользователь №: 34 796



Цитата(jcxz @ Mar 19 2012, 04:45) *
Чего это вы в обработчике прерывания пользуете функции файлового В/В?


Я обозвал пока их так

CODE
void putchar(char byte) {

while (!(U0LSR & 0x20));
U0THR = byte;

}

char getchar(void) {

while (!(U0LSR & 0x01));

return (U0RBR);

}





Сделал так:

void uart0 (void) __irq {

putchar(getchar());
p =U0IIR;
VICVectAddr = 0;
}

Теперь получается:

Байт послал и принял, но блинки остановились, т.е. таймер не работает.
Байт послал и принял, блинки мгают, т.е. таймер работает.
.
.
Круто!!! С чего это оно так?

Сообщение отредактировал IgorKossak - Mar 19 2012, 10:22
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post
SanvaldYV
сообщение Mar 19 2012, 07:47
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371



Как то странно Вы работаете с прерываниями от УАРТа... While-ы в функциях "putchar/getchar" потенциально могут привести к зависанию в прерывании - ведь Вы не смотрите, чем оно было вызвано. По идее, логика работы должна быть такая:
1. Попали в прерывание - читаем U0IIR.
2. В нем смотрим поле "Interrupt Identification" (IID), определяем причину прерывания.
3. Выполняем обработчик для того события, которое вызвало прерывание.

Сообщение отредактировал IgorKossak - Mar 19 2012, 10:22
Причина редактирования: избыточное цитирование
Go to the top of the page
 
+Quote Post
Limp
сообщение Mar 19 2012, 08:50
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 6-02-08
Пользователь №: 34 796



Юрий Санвальд

Благадарю Вас! Все OK!

Сообщение отредактировал IgorKossak - Mar 19 2012, 10:23
Причина редактирования: избыточное цитирование
Go to the top of the page
 
+Quote Post
Limp
сообщение Apr 4 2012, 12:38
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 6-02-08
Пользователь №: 34 796



Вновь прошу помощи. Проблема с ШИМом.
Вот код.

CODE
int main(void)
{
unsigned int delay;

PINSEL0 |= 0x00020000;

PWMPCR = 0x001000;
PWMMCR = 0x00002000;
PWMMR0 = 60000/2;
PWMMR4 = 60000;
PWMEMR = 0x000000010;
PWMTCR = 0x00000002;
PWMTCR = 0x00000009;



while(1) // main loop
{
for (delay=0;delay < 0x100;delay++)
{
;
}

}
}


Хочу получить постоянную частоту с PWM4. В симуляторе работает.
А на плате нет. Сам по себе порт Р0.8 исправен.
Процессор LPC2249.

Сообщение отредактировал IgorKossak - Apr 4 2012, 13:45
Причина редактирования: [codebox], последнее предупреждение!!!
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Apr 4 2012, 13:46
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Я не знаю, что такое LPC2249, но...
У него PCLK (PCLK0-1-2-3) и PCONP есть? Там битики нужные стоят?


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Limp
сообщение Apr 5 2012, 04:27
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 6-02-08
Пользователь №: 34 796



Цитата(esaulenka @ Apr 4 2012, 17:46) *
Я не знаю, что такое LPC2249, но...
У него PCLK (PCLK0-1-2-3) и PCONP есть? Там битики нужные стоят?


Есть. И уверяю Вас биты стоят как положено.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th July 2025 - 16:57
Рейтинг@Mail.ru


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