saltov 0 18 марта, 2012 Опубликовано 18 марта, 2012 (изменено) · Жалоба Всем доброго дня! Прошу помощи. Начал осваивать 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 } Изменено 19 марта, 2012 пользователем IgorKossak [codebox] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 18 марта, 2012 Опубликовано 18 марта, 2012 · Жалоба А где обработчик UART? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
saltov 0 18 марта, 2012 Опубликовано 18 марта, 2012 (изменено) · Жалоба А где обработчик UART? Здравствуте aaarrr!!! Вы в свое время мне здорово помогли с АТ91SAM. Помните меня, про АСУЗ? Задачи те решил и вот нрвая напасть. void uart0 (void) __irq { putchar(getchar()); VICVectAddr = 0; } Изменено 19 марта, 2012 пользователем IgorKossak [code] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 18 марта, 2012 Опубликовано 18 марта, 2012 · Жалоба Здравствуте aaarrr!!! Вы в свое время мне здорово помогли с АТ91SAM. Помните меня, про АСУЗ? Здравствуйте. Да, давненько это было :) void uart0 (void) __irq { putchar(getchar()); VICVectAddr = 0; } В процедуре не хватает чтения U0IIR, поэтому процессор и "зависает" в прерывании. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 19 марта, 2012 Опубликовано 19 марта, 2012 · Жалоба void uart0 (void) __irq { putchar(getchar()); VICVectAddr = 0; } Чего это вы в обработчике прерывания пользуете функции файлового В/В? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
saltov 0 19 марта, 2012 Опубликовано 19 марта, 2012 (изменено) · Жалоба Чего это вы в обработчике прерывания пользуете функции файлового В/В? Я обозвал пока их так 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; } Теперь получается: Байт послал и принял, но блинки остановились, т.е. таймер не работает. Байт послал и принял, блинки мгают, т.е. таймер работает. . . Круто!!! С чего это оно так? Изменено 19 марта, 2012 пользователем IgorKossak [codebox] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
YuraFCZ 0 19 марта, 2012 Опубликовано 19 марта, 2012 (изменено) · Жалоба Как то странно Вы работаете с прерываниями от УАРТа... While-ы в функциях "putchar/getchar" потенциально могут привести к зависанию в прерывании - ведь Вы не смотрите, чем оно было вызвано. По идее, логика работы должна быть такая: 1. Попали в прерывание - читаем U0IIR. 2. В нем смотрим поле "Interrupt Identification" (IID), определяем причину прерывания. 3. Выполняем обработчик для того события, которое вызвало прерывание. Изменено 19 марта, 2012 пользователем IgorKossak избыточное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
saltov 0 19 марта, 2012 Опубликовано 19 марта, 2012 (изменено) · Жалоба Юрий Санвальд Благадарю Вас! Все OK! Изменено 19 марта, 2012 пользователем IgorKossak избыточное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
saltov 0 4 апреля, 2012 Опубликовано 4 апреля, 2012 (изменено) · Жалоба Вновь прошу помощи. Проблема с ШИМом. Вот код. 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. Изменено 4 апреля, 2012 пользователем IgorKossak [codebox], последнее предупреждение!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 4 апреля, 2012 Опубликовано 4 апреля, 2012 · Жалоба Я не знаю, что такое LPC2249, но... У него PCLK (PCLK0-1-2-3) и PCONP есть? Там битики нужные стоят? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
saltov 0 5 апреля, 2012 Опубликовано 5 апреля, 2012 · Жалоба Я не знаю, что такое LPC2249, но... У него PCLK (PCLK0-1-2-3) и PCONP есть? Там битики нужные стоят? Есть. И уверяю Вас биты стоят как положено. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться