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

 
 
> внешние прерывания. помогите плз
123kill12
сообщение Jul 10 2010, 18:19
Сообщение #1


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

Группа: Участник
Сообщений: 96
Регистрация: 12-05-10
Пользователь №: 57 217



CODE
#include <intrinsics.h>
#include <stdio.h>
#include <nxp/iolpc1766.h>

#include "board.h"

#pragma section=".intvec"
#define FCCO_FREQ (300UL MHZ)
#define CCKL_DIV (3UL)
#define FCCLK_FREQ (FCCO_FREQ/CCKL_DIV)
#define FPCLK_FREQ (FCCLK_FREQ/4)
#define PCLK FPCLK_FREQ

volatile Int8U LedsState;
Int32U Reg;

void InitClock(void)
{
// 1. Init OSC
SCS_bit.OSCRANGE = 0;
SCS_bit.OSCEN = 1;
// 2. Wait for OSC ready
while(!SCS_bit.OSCSTAT);
// 3. Disconnect PLL
PLL0CON_bit.PLLC = 0;
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
// 4. Disable PLL
PLL0CON_bit.PLLE = 0;
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
// 5. Select source clock for PLL
CLKSRCSEL_bit.CLKSRC = 1; // Selects the main oscillator as a PLL clock source.
PCLKSEL0 = PCLKSEL1 = 0; // other peripherals 100/4 = 25MHz
// 6. Set PLL settings 300 MHz
PLL0CFG_bit.MSEL = 25-1;
PLL0CFG_bit.NSEL = 2-1;
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
// 7. Enable PLL
PLL0CON_bit.PLLE = 1;
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
// 8. Wait for the PLL to achieve lock
while(!PLL0STAT_bit.PLOCK);
// 9. Set clk divider settings
CCLKCFG = 3-1; // 1/3 Fpll
// 10. Connect the PLL
PLL0CON_bit.PLLC = 1;
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
}

void GpioInit(void)
{
// Set to inputs
FIO0DIR = \
FIO1DIR = \
FIO2DIR = \
FIO3DIR = \
FIO4DIR = 0;

// clear mask registers
FIO0MASK =\
FIO1MASK =\
FIO2MASK =\
FIO3MASK =\
FIO4MASK = 0;

// Reset all GPIO pins to default primary function
PINSEL0 =\
PINSEL1 =\
PINSEL2 =\
PINSEL3 =\
PINSEL4 =\
PINSEL7 =\
PINSEL8 =\
PINSEL9 = 0;
}

Int32U cnt;
void TR0int(void)
{
cnt=0;
T0MR0=FCCLK_FREQ/200;
T0MCR=3;
SETENA0 |= (1<<1);
IP0=0;
T0TCR=1;
}

void ExInt(void)
{
IO2INTENF |= (1<<10);
SETENA0 |= (1<<18);
}

void TMR0_IRQHandler (void)
{
T0IR=1;
__enable_interrupt();
cnt++;
if ( cnt >= 0x20)
{
FIO2PIN = Reg;
Reg=Reg<<1;
if(Reg>128)
{
FIO2PIN=0;
Reg=4;
}
cnt = 0;
}
CLRPEND0 |= ~(1<<1);
}

void EINT0_IRQHandler (void)
{
IO2INTCLR |= (1<<10);
__enable_interrupt(); /* handles nested interrupt */
FIO1PIN=0x80000000;
CLRPEND0 |= ~(1<<18);
}


int main(void)
{
// Flash accelerator init
FLASHCFG = (0x5UL<<12) | 0x3AUL;
// Init clock
InitClock();
#if FCCLK_FREQ < 20000000
FLASHCFG = (0x0UL<<12) | 0x3AUL;
#elif FCCLK_FREQ < 40000000
FLASHCFG = (0x1UL<<12) | 0x3AUL;
#elif FCCLK_FREQ < 60000000
FLASHCFG = (0x2UL<<12) | 0x3AUL;
#elif FCCLK_FREQ < 80000000
FLASHCFG = (0x3UL<<12) | 0x3AUL;
#elif FCCLK_FREQ < 100000000
FLASHCFG = (0x4UL<<12) | 0x3AUL;
#endif
Reg=4;
// Init GPIO
GpioInit();
ExInt();
TR0int();


// Init LEDs
FIO2DIR = 0x000000ff;
FIO1DIR = 0xF0000000;


while (1)
{ /* Loop forever */

}
}


пограмма написана на подобие примеров IAR. работает все кроме внешнего прерывания.
вроде бы все сделал правильно. EINT0 приходится на 10 ножку P2 и флаг разрешения внешнего прерывания 0 находиться на 18 бите регистра разрешений прерываний.
в обработчике прерыванию ставлю брейк поинт и нечего нет(((

(у меня MT-link)

Сообщение отредактировал aaarrr - Jul 10 2010, 18:24
Причина редактирования: Оформление цитаты исходника
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
zltigo
сообщение Jul 10 2010, 19:03
Сообщение #2


Гуру
******

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



Программы нужно начинать писать с пяти, максимум с 10 строчек. Причем писать самому, а не копипастить какие-то примеры. И все получится.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jul 10 2010, 21:39
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Причина неработы - невнимательный копипаст.(Пару-тройку нужных процедур не хватат).
И по моему имху - вообще ничего не должно работать. По крайней мере прерывания - не должны.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
123kill12
сообщение Jul 10 2010, 22:14
Сообщение #4


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

Группа: Участник
Сообщений: 96
Регистрация: 12-05-10
Пользователь №: 57 217



но они работают.
я раньше не работал с ARM вообще. поэтому и спрашиваю может что забыл какой нить флаг.
с прерываниями не сложно настроил и разрешил. таймер пашит, а int0 нет.



Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 10 2010, 22:30
Сообщение #5


Гуру
******

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



QUOTE (123kill12 @ Jul 11 2010, 01:14) *
но они работают.

Только в Ваших грезах sad.gif. DpInRock прав - не могут работать прерывания, поскольку они, как минимум, запрещены. Остальную белиберду вообще читать не имеет смысла.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
123kill12
сообщение Jul 10 2010, 23:23
Сообщение #6


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

Группа: Участник
Сообщений: 96
Регистрация: 12-05-10
Пользователь №: 57 217



да не наяву. я наблюдаю на плате как диодики моргают.

киньте примерный код как запустить внешнее прерывание.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jul 10 2010, 23:32
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(123kill12 @ Jul 11 2010, 03:23) *
киньте примерный код как запустить внешнее прерывание.

а как кинуть в мозг даташит и перевести в С, ASM или на чем там у Вас?
Go to the top of the page
 
+Quote Post
123kill12
сообщение Jul 10 2010, 23:38
Сообщение #8


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

Группа: Участник
Сообщений: 96
Регистрация: 12-05-10
Пользователь №: 57 217



я и делал по даташиту. брал пример через дебаг разбирал что куда и зачем пишется и потом свое писал. тока у меня на плате есть int0 кнопка, а пример у IAR для int2. а с таймерами все работало.

Сообщение отредактировал 123kill12 - Jul 10 2010, 23:38
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jul 11 2010, 00:01
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



бегло так по коду
а чего это прерывания разрешаются в самих прерываниях?
Код
void TMR0_IRQHandler (void)
{
  T0IR=1;
  __enable_interrupt();
  cnt++;
  if ( cnt >= 0x20)

Код
void EINT0_IRQHandler (void)
{
  IO2INTCLR |= (1<<10);
  __enable_interrupt();       /* handles nested interrupt */
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 11 2010, 00:12
Сообщение #10


Гуру
******

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



QUOTE (123kill12 @ Jul 11 2010, 02:23) *
да не наяву. я наблюдаю на плате как диодики моргают.

Тогда не постите исходники не имеющие отношения к реальности.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
123kill12
сообщение Jul 11 2010, 08:20
Сообщение #11


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

Группа: Участник
Сообщений: 96
Регистрация: 12-05-10
Пользователь №: 57 217



void TR0int(void)
{
cnt=0;
T0MR0=FCCLK_FREQ/200; установливаем MR0
T0MCR=3; разрешение прерывания если MR0 и TC совпадают и сброс TC
SETENA0 |= (1<<1); ISER0 записываем 1 в 1 разряд что соответствует разрешению прерывания от timer0
IP0=0; тут не стал нечего придумывать. поставил ноль для всех прерываний
T0TCR=1; TCR нулевой бить ставил м в 1 чтоб запустить таймер на счет
}


void TMR0_IRQHandler (void)
{
T0IR=1; регистр прерываний. сбрасываем наше самое прерывание по сравнению
__enable_interrupt(); это единственное что я не понял, но сча закоментил и без него работало
cnt++;

CLRPEND0 |= ~(1<<1); записываем в ICPR0 1 в первый разряд
}
таймер так работает( __enable_interrupt(); и без этой строчки)

void ExInt(void)
{
IO2INTENF |= (1<<10); устанавливаем прерывание IntEnF
SETENA0 |= (1<<18); ISER0 записываем 1 в 18 разряд что соответствует разрешению прерывания от int0
}


void EINT0_IRQHandler (void)
{
IO2INTCLR |= (1<<10); очищаем 10 пин intClr
__enable_interrupt(); это единственное что я не понял, но сча закоментил и без него работало
FIO1PIN=0x80000000;
CLRPEND0 |= ~(1<<18); записываем в ICPR0 1 в 18 разряд
}

нет.


но потом вспомнил что у lpc17xx есть прерывания на портах P0 и P2. которые настраиваются но обработка их в int3. может я как раз так настроил а обрабатывать пытаюсь в int0??
и переделал
void ExInt(void)
{
IO2INTENF |= (1<<10);
SETENA0 |= (1<<21);
}

void EINT3_IRQHandler (void)
{
IO2INTCLR |= (1<<10);
// __enable_interrupt(); /* handles nested interrupt */
FIO1PIN=0x80000000;
CLRPEND0 |= ~(1<<21);
}

и заработало. алилуя

но возвращаемся в простым int0-int2. как из настроить?


Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 11 2010, 10:24
Сообщение #12


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(123kill12 @ Jul 11 2010, 12:20) *
void EINT0_IRQHandler (void)
{
IO2INTCLR |= (1<<10); очищаем 10 пин intClr
__enable_interrupt(); это единственное что я не понял, но сча закоментил и без него работало
FIO1PIN=0x80000000;
CLRPEND0 |= ~(1<<18); записываем в ICPR0 1 в 18 разряд
}

Комментарии написаны там где не надо и их нет где надо.
Пока не привыкли стоит одуматься...
ПС оформляйте ваши посты в соответствии с общепринятыми здесь нормами -
выделяйте исходники в секции кода [ code ] ВАШИ ИСХОДНИКИ [ /code ] (пробелы внутри квадратных скобок не нужны)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jul 11 2010, 11:47
Сообщение #13


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Не поленился (хотя это и очень трудно - папка с иаром очень долго у меня открывается) посмотреть реальные исходники.
Общее и у ваших и оригинальных конечно есть. Но этого недостаточно.

Воин. Будь внимателен при контрол-с контрол-в.

Могу дать совет. берете первую строчку исходника и задаете себе вопрос - "а нафига она нужна". После ответа, переходите к следущей строчке. И так до конца файла. Гарантирую полный успех.
(Я лично языка Си не знаю и только такой подход помогает таки составлять работающие программы на этом языке).


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 12 2010, 06:29
Сообщение #14


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(DpInRock @ Jul 11 2010, 14:47) *
(Я лично языка Си не знаю и только такой подход помогает таки составлять работающие программы на этом языке).


Во, блин, до чего народ дошел!
Go to the top of the page
 
+Quote Post
Wano
сообщение Jul 12 2010, 07:45
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 272
Регистрация: 3-06-06
Пользователь №: 17 737



Скажите,а в каком месте заносится указатель функции прерывания? Или в LPC17 всё не так как в LPC2?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 07:18
Рейтинг@Mail.ru


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