Перейти к содержанию
    

Вложенные прерывания LPC21xx

Всем доброго дня!

Прошу помощи.

Начал осваивать LPC2129 с нуля. Платка OLIMEX, Keil и больше ничего.

 

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

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

 

При запуске диоды мигают и Uart0 принимает и отправляет байт.

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

Почему??? Вот мой код.

 

 

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
[codebox]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А где обработчик UART?

 

 

Здравствуте aaarrr!!!

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

Задачи те решил и вот нрвая напасть.

 

void uart0 (void) __irq  {

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

Изменено пользователем IgorKossak
[code]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуте aaarrr!!!

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

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

 

void uart0 (void) __irq {

 

putchar(getchar());

VICVectAddr = 0;

}

В процедуре не хватает чтения U0IIR, поэтому процессор и "зависает" в прерывании.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

void uart0 (void) __irq {

 

putchar(getchar());

VICVectAddr = 0;

}

Чего это вы в обработчике прерывания пользуете функции файлового В/В?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чего это вы в обработчике прерывания пользуете функции файлового В/В?

 

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

 

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
[codebox]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

1. Попали в прерывание - читаем U0IIR.

2. В нем смотрим поле "Interrupt Identification" (IID), определяем причину прерывания.

3. Выполняем обработчик для того события, которое вызвало прерывание.

Изменено пользователем IgorKossak
избыточное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Изменено пользователем IgorKossak
избыточное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Вот код.

 

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
[codebox], последнее предупреждение!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не знаю, что такое LPC2249, но...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не знаю, что такое LPC2249, но...

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

 

Есть. И уверяю Вас биты стоят как положено.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...