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

 
 
 
Reply to this topicStart new topic
> управление ножками, keil+mcb1200(lpc1227)
Tsyganoks
сообщение Jul 30 2012, 10:15
Сообщение #1





Группа: Новичок
Сообщений: 7
Регистрация: 7-07-11
Пользователь №: 66 105



Есть контроллер nxp lpc1227. Нужно управлять группой пинов, расположенной на разных портах. Можно определить их так, что на ноге выставлялась 1 после присвоения единицы переменной, а не LPC_GPIO0->SET= PIN[n].
Ну или есть ли какие-нибудь другие способы отойти от этой записи?
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jul 30 2012, 18:58
Сообщение #2


Гуру
******

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



Читайте даташит. Если можно как-то иначе, чем записью в определенный порт в определенный разряд единицы - напишите в NXP, Вам вышлют лоток контроллеров и пропишут Ваши изыскания в еррату
Переопределениями - один паровоз, потянет он за собой несколько команд. Но не миллионы же раз это делать, правда?
Что касаемо самой записи - чем она Вам не нравится? Имея даташит в руках, все лаконично и понятно
Go to the top of the page
 
+Quote Post
Tsyganoks
сообщение Jul 31 2012, 04:38
Сообщение #3





Группа: Новичок
Сообщений: 7
Регистрация: 7-07-11
Пользователь №: 66 105



Цитата(toweroff @ Jul 30 2012, 21:58) *
Читайте даташит. Если можно как-то иначе, чем записью в определенный порт в определенный разряд единицы - напишите в NXP, Вам вышлют лоток контроллеров и пропишут Ваши изыскания в еррату
Переопределениями - один паровоз, потянет он за собой несколько команд. Но не миллионы же раз это делать, правда?
Что касаемо самой записи - чем она Вам не нравится? Имея даташит в руках, все лаконично и понятно

не нравится тем, что была процедура для 51 контроллера, управляющая мультиплексором, выглядела так
Код
void MUX(char kanal)
         {
            A0=0x01&kanal;
            A1=0x02&kanal;
            A2=0x04&kanal;
          }

а в версии для арм ножки сидят на разных портах и как написать продеруру не нагородив кучу if я что-то не понимаю
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Jul 31 2012, 05:27
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Нужно использовать силу C и библиотек от NXP.

Вот пример для LPC1114 (там ножки совсем перепутаны):

Код
//соответствие физических адресов порту 0
static uint32_t volatile * const lpc11xx_io_port0[] =
{
  &LPC_IOCON->RESET_PIO0_0,
  &LPC_IOCON->PIO0_1,
  &LPC_IOCON->PIO0_2,
  &LPC_IOCON->PIO0_3,
  &LPC_IOCON->PIO0_4,
  &LPC_IOCON->PIO0_5,
  &LPC_IOCON->PIO0_6,
  &LPC_IOCON->PIO0_7,
  &LPC_IOCON->PIO0_8,
  &LPC_IOCON->PIO0_9,
  &LPC_IOCON->JTAG_TCK_PIO0_10,
  &LPC_IOCON->JTAG_TDI_PIO0_11
};

//соответствие физических адресов порту 1
static uint32_t volatile * const lpc11xx_io_port1[] =
{
  &LPC_IOCON->JTAG_TMS_PIO1_0,
  &LPC_IOCON->JTAG_TDO_PIO1_1,
  &LPC_IOCON->JTAG_nTRST_PIO1_2,
  &LPC_IOCON->ARM_SWDIO_PIO1_3,
  &LPC_IOCON->PIO1_4,
  &LPC_IOCON->PIO1_5,
  &LPC_IOCON->PIO1_6,
  &LPC_IOCON->PIO1_7,
  &LPC_IOCON->PIO1_8,
  &LPC_IOCON->PIO1_9,
  &LPC_IOCON->PIO1_10,
  &LPC_IOCON->PIO1_11
};

//соответствие физических адресов порту 2
static uint32_t volatile * const lpc11xx_io_port2[] =
{
  &LPC_IOCON->PIO2_0,
  &LPC_IOCON->PIO2_1,
  &LPC_IOCON->PIO2_2,
  &LPC_IOCON->PIO2_3,
  &LPC_IOCON->PIO2_4,
  &LPC_IOCON->PIO2_5,
  &LPC_IOCON->PIO2_6,
  &LPC_IOCON->PIO2_7,
  &LPC_IOCON->PIO2_8,
  &LPC_IOCON->PIO2_9,
  &LPC_IOCON->PIO2_10,
  &LPC_IOCON->PIO2_11
};

//соответствие физических адресов порту 3
static uint32_t volatile * const lpc11xx_io_port3[] =
{
  &LPC_IOCON->PIO3_0,
  &LPC_IOCON->PIO3_1,
  &LPC_IOCON->PIO3_2,
  &LPC_IOCON->PIO3_3,
  &LPC_IOCON->PIO3_4,
  &LPC_IOCON->PIO3_5
};

//массив используемых портов.
//Осторожно! Порт 3 содержит только 6 регистров
static uint32_t volatile * const * const lpc11xx_io_matrix[] =
{
    lpc11xx_io_port0,
    lpc11xx_io_port1,
    lpc11xx_io_port2,
    lpc11xx_io_port3
};

/* Public Functions ----------------------------------------------------------- */
/** @addtogroup PINSEL_Public_Functions
* @{
*/

static uint32_t volatile *iocon_GetPinByName(uint8_t portnum, uint8_t pinnum)
{
  return lpc11xx_io_matrix[portnum][pinnum];
}
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jul 31 2012, 05:28
Сообщение #5


Гуру
******

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



Цитата(Tsyganoks @ Jul 31 2012, 08:38) *
а в версии для арм ножки сидят на разных портах и как написать продеруру не нагородив кучу if я что-то не понимаю

а вот о таких вещах нужно заботиться на этапе проектировки платы
с другой стороны, у ARM скорость работы уж всяко поболее, чем у 51-го, так что даже с кучей if он выставит в порт нужный сигнал может даже и раза эдак в 2-3 быстрее biggrin.gif
Go to the top of the page
 
+Quote Post
Tsyganoks
сообщение Jul 31 2012, 05:54
Сообщение #6





Группа: Новичок
Сообщений: 7
Регистрация: 7-07-11
Пользователь №: 66 105



Цитата(toweroff @ Jul 31 2012, 08:28) *
а вот о таких вещах нужно заботиться на этапе проектировки платы
с другой стороны, у ARM скорость работы уж всяко поболее, чем у 51-го, так что даже с кучей if он выставит в порт нужный сигнал может даже и раза эдак в 2-3 быстрее biggrin.gif

Даа, вот не подумали...тк с контроллерами дружу недавно, то думал что там так же можно выставить пины, ну и сказали при разводке, что пусть разводят, как удобнее) Вроде додумал, как поменьше процедуру написать, спасибоsm.gif

Вот, может пригодится кому.
Код
void MUX_OFF (void)
{
    LPC_GPIO0->CLR = PIN[6];
    LPC_GPIO0->CLR = PIN[7];
    LPC_GPIO2->CLR = PIN[0];    
}

void MUX (unsigned long kanal)
{
    MUX_OFF();
    LPC_GPIO0->SET = PIN[6]&(kanal<<6);
    LPC_GPIO0->SET = PIN[7]&(kanal<<6);
    LPC_GPIO2->SET = PIN[0]&(kanal>>2);    
}
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jul 31 2012, 06:12
Сообщение #7


Гуру
******

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



Я так понимаю, что PIN[x] определено как
Код
#define PIN[x]    (1UL<<x)


тогда MUX_OFF() можно переписать как
Код
LPC_GPIO0->CLR = PIN[6] | PIN[7];
LPC_GPIO2->CLR = PIN[0];


И что-то не совсем я понял вот это:
Код
LPC_GPIO0->SET = PIN[6]&(kanal<<6);
LPC_GPIO0->SET = PIN[7]&(kanal<<6);

Go to the top of the page
 
+Quote Post
Tsyganoks
сообщение Jul 31 2012, 06:54
Сообщение #8





Группа: Новичок
Сообщений: 7
Регистрация: 7-07-11
Пользователь №: 66 105



Цитата(toweroff @ Jul 31 2012, 09:12) *
Я так понимаю, что PIN[x] определено как
Код
#define PIN[x]    (1UL<<x)


тогда MUX_OFF() можно переписать как
Код
LPC_GPIO0->CLR = PIN[6] | PIN[7];
LPC_GPIO2->CLR = PIN[0];


И что-то не совсем я понял вот это:
Код
LPC_GPIO0->SET = PIN[6]&(kanal<<6);
LPC_GPIO0->SET = PIN[7]&(kanal<<6);


Да, можно)

GPIO0_6, GPIO0_7, GPIO2_0 соответствуют А0 А1 А2 на мультиплексоре. я смещаю полученное число на столько бит, на сколько смещен бит PIN[6]. что бы при сравнении, при наличии младшего бита, PIN[6] ставился в 1
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jul 31 2012, 07:13
Сообщение #9


Гуру
******

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



да, все верно
меня что-то смутило смещение и там, и там на 6 бит
Но, в любом случае, нужно маскировать 2-й бит в kanal и переписать вот так:
Код
LPC_GPIO0->SET = ((kanal&0x03)<<6);

одной строкой - два бита сразу
Go to the top of the page
 
+Quote Post
Tsyganoks
сообщение Jul 31 2012, 09:16
Сообщение #10





Группа: Новичок
Сообщений: 7
Регистрация: 7-07-11
Пользователь №: 66 105



Цитата(toweroff @ Jul 31 2012, 10:13) *
да, все верно
меня что-то смутило смещение и там, и там на 6 бит
Но, в любом случае, нужно маскировать 2-й бит в kanal и переписать вот так:
Код
LPC_GPIO0->SET = ((kanal&0x03)<<6);

одной строкой - два бита сразу

А, ну последовательно-это так повезло, я для общего случая писал
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 3rd July 2025 - 19:24
Рейтинг@Mail.ru


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