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

 
 
> LPC2368 Прерывание по совпадению таймера, помогите
sasha968m
сообщение Jan 17 2017, 19:22
Сообщение #1





Группа: Участник
Сообщений: 10
Регистрация: 16-11-11
Из: Макеевка, Донецкая обл.
Пользователь №: 68 333



Всем здравствуйте!
Помогите, пожалуйста, разобраться с прерыванием от таймера0 по совпадению.
Только начал осваивать 32 разрядные микроконтроллеры. Есть отладочная плата SK-MLPC1768/2387/2368, с установленным LPC2368.
Для обучения пользуюсь IAR 7.50.2.10505
Прикрепленный файл  main.txt ( 2.9 килобайт ) Кол-во скачиваний: 75

Вставлял ловушку в бесконечном цикле и проверял 0 бит регистра T0IR. Видно что таймер входит в прерывание (бит устанавливается), но дальше действий программа никаких не выполняет, а должна быть бегущая единица.
Как должна работать эта программа ясно, но почему не работает не понятно.
Исходник взят из интернета, кроме настройки PLL. PLL настраивается. Проверялось.
Подскажите, направьте пожалуйста!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sasha968m
сообщение Jan 18 2017, 11:24
Сообщение #2





Группа: Участник
Сообщений: 10
Регистрация: 16-11-11
Из: Макеевка, Донецкая обл.
Пользователь №: 68 333



Цитата(jcxz @ Jan 18 2017, 11:03) *
1.Устанавливаете запрос синхронного сброса
Код
T0TCR = 0x00000002;
но не дожидаетесь его окончания. Значит сброс у Вас реально может происходить после последующих записей конфигурации.

jcxz, это значит что после операции T0TCR = 0x00000002; нужно проверить сбросился ли ТС и только потом продолжать конфигурацию?

Цитата(jcxz @ Jan 18 2017, 11:03) *
2.Не чистите регистр флагов запросов прерываний.

Его обязательно чистить в конфигурации таймера? Читал в юзер мануал что по сбросу он очищен.


Цитата(jcxz @ Jan 18 2017, 11:03) *
3.Неправильно рассчитываете период:
Код
//Регистр совпадения = 1000 (1 Гц)
T0MR0 = 100;


jcxz, так правильно будет?
Код
PCLKSEL0 |= 0x0000000E; //Timer0Clk=72Mhz/8= 9 MHz      
}

void Timer0_Init(void){
//Предделитель таймера = 8999
T0PR = 8999;
//Сбросить счетчик и делитель
T0TCR = 0x00000002;
//Режим таймера
Т0СТСR = 0;
//При совпадении сбрасываем таймер и вызываем прерывание
T0MCR = 0x00000003;
//Регистр совпадения = 1000 (1 Гц)
T0MR0 = 1000;



Цитата(jcxz @ Jan 18 2017, 11:03) *
Как можно было сделать столько ошибок в такой простейшей периферии???
Читайте внимательнее юзермануал!
Да и в CTCR неплохо бы соотв. значение записать.

До этого я программировал только AVR (mega) на Ассемблере. В С, можно сказать, я полный балбес, только учусь.

Цитата(jcxz @ Jan 18 2017, 11:03) *
После этого смотрите появляется ли флаг активного запроса прерывания в IR?
И если появляется, а входа в ISR нет - читайте про контроллер прерываний и всё что с ним связано.


В бесконечный цикл вставлял такой код
Код
//if (T0IR & (1 << 0)) {FIO2CLR = (1<<13);      //Зажгли светодиод              |    
                    // T0TCR = 0x00000000;     //Остановили таймер - счётчик   |    
                    // T0IR = 0x00000001;      //сбросили флаг прерывания      |Ловушка                
                    // T0TCR = 0x00000002;     //сбросили таймер - счётчик     |    
                     // T0TCR = 0x00000001;}    //запустили таймер - счётчик    |
// else {FIO2SET = (1<<13);}

и по светодиоду видел, что 0 бит T0IR с определённым периодом устанавливается (таймер входит в прерывание).

Цитата(jcxz @ Jan 18 2017, 11:03) *
По контроллеру прерываний:
1.А где у Вас глобальное разрешение прерываний IRQ? (Вы ведь вроде этому прерыванию от таймера назначаете линию IRQ?)

Это не оно VICIntEnable |= 0x00000010;?

Цитата(jcxz @ Jan 18 2017, 11:03) *
2.А где обработчик прерывания IRQ?

Вроде это обработчик прерывания
Код
__irq void Timer0_Int (void)
{

  
if (n!=0x2000000) {n<<=1;}
else {n = 0x04000000;}
T0IR = 0x00000001; /*Сбросить флаг прерывания в Timer0*/
//Бегущая единица
IOSET1 = 0x3C000000;
IOCLR1 = n; /* Установить состояние порта */
VICVectAddr = 0; /*Перевести VIC в исходное состояние*/
}


Пробовал я писать имена битов в регистрах, как в других примерах из интернета, но IAR выдаёт на них ошибки. Нужны, видимо какие-то библиотеки, ноя пока не пойму какие и где их брать.
Ребята выше привели много разных примеров кода, ноя их не понимаю. Буду пробовать разбираться.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 18 2017, 19:49
Сообщение #3


Гуру
******

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



Цитата(sasha968m @ Jan 18 2017, 14:24) *
jcxz, это значит что после операции T0TCR = 0x00000002; нужно проверить сбросился ли ТС и только потом продолжать конфигурацию?

Нет. Нужно проверить сбросился ли этот бит синхронного сброса в TCR. Прочитайте наконец описание TCR в юзермануале. У меня сейчас нет его под рукой, но насколько помню там описано поведение этого бита.
В общем случае частота тактирования таймера может быть ниже частоты процессора, а сброс этого бита - синхронный, т.е. - будет выполнен по ближайшему клоку. К этому времени процессор может успеть выполнить несколько команд.
Всё это описано в юзермануале.

Цитата(sasha968m @ Jan 18 2017, 14:24) *
Его обязательно чистить в конфигурации таймера? Читал в юзер мануал что по сбросу он очищен.

Сбросу чего? МК? Не вижу у Вас этого сброса и не уверен что он выполняется.
Да и в любом случае - лучше очистить.

Цитата(sasha968m @ Jan 18 2017, 14:24) *
jcxz, так правильно будет?
//Регистр совпадения = 1000 (1 Гц)
T0MR0 = 1000;[/code]

Вы на что хотите поделить? На 1000? Чтобы поделить на 1000 надо записать туда 999.
Опять же - RTFM.

Цитата(sasha968m @ Jan 18 2017, 14:24) *
Вроде это обработчик прерывания
__irq void Timer0_Int (void)

У Вас ядро ARM7. У этого ядра только два вектора прерывания - IRQ и FIQ, которые может генерить периферия.
Для каждой периферии можно выбрать - какое из этих 2х прерываний генерить. Вы насколько вижу выбираете IRQ для таймера.
Вот его обработчик Вам и необходим. И его нужно разрешить. А уже в нём будете вызывать эту функцию обслуживания прерывания от таймера.
В общем - прочитайте как устроена система прерываний ARM7.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- sasha968m   LPC2368 Прерывание по совпадению таймера, помогите   Jan 17 2017, 19:22
- - jcxz   1.Устанавливаете запрос синхронного сброса КодT0TC...   Jan 18 2017, 08:03
|- - zltigo   Цитата(jcxz @ Jan 18 2017, 10:03) Читайте...   Jan 18 2017, 08:09
|- - jcxz   Цитата(zltigo @ Jan 18 2017, 11:09) Ну Вы...   Jan 18 2017, 08:24
|- - zltigo   Цитата(jcxz @ Jan 18 2017, 10:24) Я прочи...   Jan 18 2017, 08:43
|- - jcxz   Цитата(zltigo @ Jan 18 2017, 11:43) #defi...   Jan 18 2017, 09:18
|- - zltigo   Цитата(jcxz @ Jan 18 2017, 11:18) Мой вар...   Jan 18 2017, 09:49
|- - jcxz   Цитата(zltigo @ Jan 18 2017, 12:49) А для...   Jan 20 2017, 11:40
|- - zltigo   Цитата(jcxz @ Jan 20 2017, 13:40) о чём В...   Jan 20 2017, 11:49
|- - zltigo   Цитата(sasha968m @ Jan 18 2017, 13:24) Пр...   Jan 18 2017, 11:31
||- - sasha968m   Цитата(zltigo @ Jan 18 2017, 14:31) Это н...   Jan 18 2017, 11:51
||- - zltigo   Цитата(sasha968m @ Jan 18 2017, 13:51) Да...   Jan 18 2017, 17:14
- - sasha968m   zltigo, спасибо! Уже скачал. Проект мой получи...   Jan 18 2017, 19:24
- - sasha968m   Я, кажется, понял. Выставил в первый бит 1, дожда...   Jan 18 2017, 20:38
|- - jcxz   Цитата(sasha968m @ Jan 18 2017, 23:38) Я,...   Jan 19 2017, 08:19
- - sasha968m   Понял, благодарю.   Jan 19 2017, 10:20


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

 


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


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