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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Прерывания в Keil, научите как правильно
smk
сообщение Mar 5 2009, 09:51
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Пытаюсь разобраться с этими прерываниями, но ни одно не работает. В качастве примера использую прерывания по совпадению MR3 TIMER0 LPC2103. Книга по LPC2000 чет не очень помогает. Собственно вопрос - что нужно чтоб выполнился обработчик прерываний IRQ? FIQ? Спасибо.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
smk
сообщение Mar 5 2009, 13:47
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Читал UM10161, AN10414, книгу Мартина по LPC2000, Help Keil-а, поиск на этом форуме... Ну не получается сделать так чтоб выполнился обработчик прерывания. Суть проста - при совпадении с MR3 происходит обнуление T0TC и прерывание. Выполняется обработчик в котором переменная value увеличивается на 1. Остальное дрыгание ногами просто поленился выкинуть, надеюсь не помешает. Научите правильно описывать прерывания так чтоб работало. Исходные тексты прикрепляю. Спасибо.
Прикрепленные файлы
Прикрепленный файл  uVision.rar ( 4.5 килобайт ) Кол-во скачиваний: 26
 


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 5 2009, 14:18
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(smk @ Mar 5 2009, 16:47) *
Ну не получается сделать так чтоб выполнился обработчик прерывания.

Не говоря много: http://www.keil.com/support/docs/3229.htm
Go to the top of the page
 
+Quote Post
smk
сообщение Mar 5 2009, 14:36
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Код
// function prototypes:
void __swi(0xFE) disable_isr (void);
void __swi(0xFF) enable_isr (void);

/*
* Sample 'main' Function
*/

void main (void) {

  func_a();       // func_a executes with standard interrupt setting
  disable_isr (); // disable interrupts for the following function
  func_b();       // func_b executes with disable interrupts
  enable_isr ();  // interrupts are now enabled again

}

в этом дело?
Причина редактирования: Оформление цитаты исодника.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 5 2009, 14:39
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(smk @ Mar 5 2009, 17:36) *
в этом дело?

Да. Не разрешили прерывания
Go to the top of the page
 
+Quote Post
smk
сообщение Mar 5 2009, 14:57
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Спасибо. Теперь разрешил. Обработчик как прежде не выполняется и остальная программа тоже. Если закомментровать enable_isr (); начинает выполняться программа, но без прерываний. Что не так?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 5 2009, 15:01
Сообщение #7


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(smk @ Mar 5 2009, 17:57) *
Обработчик как прежде не выполняется и остальная программа тоже.

Выложите кусок с последними изменениями.
Go to the top of the page
 
+Quote Post
smk
сообщение Mar 5 2009, 15:06
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Не совсем кусок... а полностью. Извините, если много.
CODE

#include <LPC21xx.H> /* LPC21xx definitions */
//#include <stdio.h> /* standard I/O .h-file */
void PLL_Initialization (void);
void Peripherals_Initialization (void);
void Interupt_Init (void);
void TIMER0_Init (void);
void T0isr(void) __irq;
void __swi(0xFF) enable_isr (void);

volatile unsigned int a;
volatile unsigned int value;

void PLL_Initialization (void)
{
//Настройка тактирования
PLLCFG = 0x23; //Fosc=14.7456; M=4; P=2
PLLCON = 0x1; //включить ФАПЧ
PLLFEED= 0xAA;
PLLFEED= 0x55;
while(!(PLLSTAT & 0x400)){} //Ждем стабилизации ФАПЧ
PLLCON=0x3; //Разрешаем тактирование ЦПУ после стабилизации ФАПЧ
PLLFEED=0xAA;
PLLFEED=0x55;
}
void Peripherals_Initialization (void)
{
//Настройка тактирования периферии
VPBDIV = 0x2;
//Настройка блока ускорения обращения к памяти
MAMTIM = 0x3;
MAMCR = 0x2;
//Конфигурация I/O выводов
PINSEL0 = 0x0;
PINSEL1 = 0x0;
IODIR0 = 0xFFFFFFFF; //все выводы - выходы
//Часы реального времени
CCR=0x11; //Включить, тактировать от часового кварца
}

void Interupt_Init (void)
{
//VICIntSelect = 0; //все прерывания IRQ
//VICIntEnable |= 0x10;//разрешить в VIC прерывание от TIMER0
//VICIntEnable = 0x10;
//VICVectCntl0= 0x24; /* Address of the ISR */
//VICVectAddr0=(unsigned long)T0isr;
VICVectAddr4=(unsigned)T0isr;
VICVectCntl0= 0x00000024;
VICIntEnable = 0x00000010;
//VICIntSelect |= 0x10;//подключить канал VIC (TIMER0) к линии FIQ
}


void TIMER0_Init (void)
{
//T0IR = 0; //Interrupt flag for match channel 3.
T0TCR = 1;//Включить (2 - сбросить TIMER0)
//T0CTCR = 0;//таймер, переключает таймер или счетчик, вход счетчика и тип перепада для счета
//T0TC
T0PR = 100000;//значение, которое достигается предделителем для сброса и проходит импульс на таймер
T0PC = 5000;
T0MCR = 0x03;//прерывание при совпадении MR0 (и сброс)
//T0CCR
//T0EMR
//T0MR3=100;
//T0MR2=100;
//T0MR1=100;
T0MR0=2;
}


void T0isr(void) __irq
{
value++;
//T0IR |= 0x00001000;
T0IR |= 0x00000001;
VICVectAddr = 0x00000000;
//VICSoftIntClear = 0x10;
}



int main (void)
{
PLL_Initialization();
Peripherals_Initialization ();
Interupt_Init();
TIMER0_Init();
enable_isr ();

while(1)
{
if(a<50){a++;}
else {a=0;}
if(a<25)
{IOSET0=0xFF00FF00;}
if(a>=25)
{IOCLR0=0xFF00FF00;}
if(value>1000) {value=0;}
// VICSoftInt = 0x10;
}//while
}//main


Сообщение отредактировал zltigo - Mar 5 2009, 15:20
Причина редактирования: Надо пользоватся тэгами для оформления кода


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 5 2009, 15:08
Сообщение #9


Гуру
******

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



Код
VICVectAddr4=(unsigned)T0isr;
VICVectCntl0= 0x00000024;

Адрес один, а контрол - другой.
Go to the top of the page
 
+Quote Post
smk
сообщение Mar 5 2009, 15:16
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



А как правильно записать строчку VICVectCntl0= 0x00000024; ? Я не уверен, что правильно понима что должно быть в Bit 4:0.
Я пробовал 0х00000020 но не помогает.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 5 2009, 15:19
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(smk @ Mar 5 2009, 18:06) *
Не совсем кусок... а полностью. Извините, если много.

Moderator:
Пожалуйста, пользуйтесь тэгами для оформления кода.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 5 2009, 15:21
Сообщение #12


Гуру
******

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



Правильно так:
Код
VICVectAddr0=(unsigned)T0isr;
VICVectCntl0= 0x00000024;
Go to the top of the page
 
+Quote Post
smk
сообщение Mar 5 2009, 15:34
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Попробовал. Опять зацикливается.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 5 2009, 15:49
Сообщение #14


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



А что у Вас с Vectors in RAM/ROM и Remap? ничего там не накосячили?
Go to the top of the page
 
+Quote Post
smk
сообщение Mar 5 2009, 15:58
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Я их не трогал. Даже не уверен, что точно знаю что это.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 26th June 2025 - 23:01
Рейтинг@Mail.ru


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