Main Menu
Home
Cadastre-se
Como colaborar
Contato
Sugerir Conteúdo
Reportar Problema
Conteúdo
Fórum
Notícias
Artigos
Projetos
Inovação
Downloads
Eventos
Links
Blogs
Conteúdo Parceiro
Wiki da CBE
Wiki iMXdev
Blogesfera
Login
Usuários online
Nenhum usuário online
Nós temos 14 visitantes online
Usuários Registrados
4432 registrados
2 hoje
8 esta semana
22 no mês
Último: randrade offline
Próximos Eventos
Nenhum evento
« < Setembro 2010 > »
D S Q Q Q S D
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 1 2
Tradutor
Escolha o idioma:
PageRank
Fórum Embarcados
Seja bem-vindo, Visitante
Por Favor Entrar ou Registrar.    Esqueceu a senha?
Iniciando com RTOS MQX (1 visualizando) (1) Visitante
Freescale (HCxx, Coldfire, etc)
Ir para baixo Favorito por: 0
TÓPICO: Iniciando com RTOS MQX
#431
Ricardo_Franco (Usuário)
Fresh Boarder
Mensagens: 11
graphgraph
Usuários Offline Clique aqui para ver o perfil deste usuário
Iniciando com RTOS MQX 6 Mês, 4 Semanas atrás Popularidade: 0  
Caros.
Apenas para orgranizar o tópico, para quem precisa iniciar com o RTOS da freescale:
Escrevendo sua primeira aplicação para MQX.
www.freescale.com/files/32bit/doc/app_no..._ASSET=Documentation

Como Desenvolver Driver de IO para o MQX.
www.freescale.com/files/32bit/doc/app_no..._ASSET=Documentation

Usando Bibliotecas do MQX
www.freescale.com/files/32bit/doc/app_no..._ASSET=Documentation

Além disso alguns documentos importantes:

Guia de usuario MQX.
www.freescale.com/files/32bit/doc/user_g...MQXRTCSUG.pdf?fpsp=1

MQX - Reference Manual
www.freescale.com/files/32bit/doc/ref_ma..._ASSET=Documentation

MQX - IO Driver
www.freescale.com/files/32bit/doc/user_g..._ASSET=Documentation
 
Logado Logado  
  O administrador desabilitou acesso publico para escrita.
#432
Ricardo_Franco (Usuário)
Fresh Boarder
Mensagens: 11
graphgraph
Usuários Offline Clique aqui para ver o perfil deste usuário
Re:Iniciando com RTOS MQX 6 Mês, 4 Semanas atrás Popularidade: 0  
Ola Senhores
Tenho mais algumas dúvidas, segue trecho do código:

Código:


// -- Função Inicializa IO
boolean InitializeIO(void)
{
  const uint_32 output_set[] =
  {
  LED_1 | GPIO_PIN_STATUS_0,// Pino Inicializa em "0" após reset
  LED_2 | GPIO_PIN_STATUS_0,// Pino Inicializa em "0" após reset
  LED_3 | GPIO_PIN_STATUS_0,// Pino Inicializa em "0" após reset
  LED_4 | GPIO_PIN_STATUS_0,// Pino Inicializa em "0" após reset
  GPIO_LIST_END
  };
/* Open and set port TC as output to drive LEDs */
output_port = fopen("gpio:write", (char_ptr) &output_set);

  if (output_port)
  {
  ResetOutputs();
  }

return (output_port!=NULL);
}



Senhores estou analisando a função acima usada para controlar os GPIO.
Algumas dúvidas:

Código:


const uint_32 output_set[] =
  {
  LED_1 | GPIO_PIN_STATUS_0,// Pino Inicializa em "0" após reset
  LED_2 | GPIO_PIN_STATUS_0,// Pino Inicializa em "0" após reset
  LED_3 | GPIO_PIN_STATUS_0,// Pino Inicializa em "0" após reset
  LED_4 | GPIO_PIN_STATUS_0,// Pino Inicializa em "0" após reset
  GPIO_LIST_END
  };



Pelo que pude entender ele cria um vetor de constante de 32 bits para controlar 4 UNICOS bits? é isso ?

Na primeira linha temos o código "output_set", para definir estes mesmos IO's como entrada eu uso "input_set" ?

É possivel definir isso dinamicamente? Assim eu poderia multiplexar as IO's.

Qual seria o procedimento para escrever uma rotina de Input?
 
Logado Logado  
  O administrador desabilitou acesso publico para escrita.
#433
dfranca (Usuário)
Fresh Boarder
Mensagens: 6
graphgraph
Usuários Offline Clique aqui para ver o perfil deste usuário
Re:Iniciando com RTOS MQX 6 Mês, 3 Semanas atrás Popularidade: 0  
"Pelo que pude entender ele cria um vetor de constante de 32 bits para controlar 4 UNICOS bits? é isso ?"

É isso mesmo Ricardo, o vetor output_set carrega informações de acesso para cada pino.

Cada elemento desse vetor é do tipo GPIO_PIN_STRUCT e carrega as informações da seguinte forma:

<port_name> | <pin_number> | <additional_flags>

Sugiro que você leia o capítulo 7 do arquivo MQXIOUG.pdf. Neste capítulo é explicado por exemplo o que são as "additional flags".

Lá também você verá quais são as constantes usadas para setar os níveis lógicos em cada pino.

"Na primeira linha temos o código "output_set", para definir estes mesmos IO's como entrada eu uso "input_set" ?"

Não. Para você acessar um conjunto de pinos como entrada você deve 'pedir' ao driver de GPIO do MQX que lhe forneça um 'file-descriptor' de leitura.

Pegando carona no seu exemplo, seria algo assim:

input_port = fopen("gpio:read", (char_ptr) &input_set);

Onde input_port é uma variável do tipo FILE_PTR.

Ricardo, uma dica que me ajudou bastante:

Normalmente qdo estamos programando para microcontroladores nós acessamos os pinos diretamente lendo ou escrevendo os registros que mapeiam os ports.

Quando usamos um SO, temos que usar uma abstração diferente. Nós não vamos mais diretamente até os pinos, mas pedimos para que o SO faça isso pra nós.

No MQX quem faz isso é o driver de GPIO.

Quando você "abre" o driver para leitura ou escrita (note que você pode abrir o driver várias vezes, por exemplo uma vez para leitura e outra vez para escrita) o MQX lhe retorna um número que é chamado de "file-descriptor". É através desse file descriptor que você pedirá ao MQX para ler ou escrever nos pinos.

Tem um exemplo muito bom, onde é mostrado como abrir o driver para leitura, para escrita, e para ambos os modos aqui:

...FreescaleFreescale MQX 3.5mqxexamplesgpio

Sugiro que você estude o exemplo acima !

Lá você verá inclusive como responder às suas duas últimas perguntas abaixo:

"É possivel definir isso dinamicamente? Assim eu poderia multiplexar as IO's."
"Qual seria o procedimento para escrever uma rotina de Input?"

Veja o exemplo em:

...FreescaleFreescale MQX 3.5mqxexamplesgpio

Douglas
 
Logado Logado  
  O administrador desabilitou acesso publico para escrita.
#434
Ricardo_Franco (Usuário)
Fresh Boarder
Mensagens: 11
graphgraph
Usuários Offline Clique aqui para ver o perfil deste usuário
Re:Iniciando com RTOS MQX 6 Mês, 3 Semanas atrás Popularidade: 0  
Ola Senhores.
Douglas obrigado pela ajuda, a coisa está começando a ficar claras para mim.
Uma dúvida. Eu posso definir o mesmo pino de duas formas diferentes em tarefas distintas?
Por exemplo: Em uma dada tarefa o pino de input Analógico, em outra tarefa Output Digital. Pude perceber no exemplo sugerido "GPIO.c",que o mesmo pino aparece em lists diferentes (mas no exemplo com a mesma função, sempre como saída). Dai me surgiu a idéia. Isso procede?

Att.

Ricardo Franco
 
Logado Logado  
  O administrador desabilitou acesso publico para escrita.
#438
Ricardo_Franco (Usuário)
Fresh Boarder
Mensagens: 11
graphgraph
Usuários Offline Clique aqui para ver o perfil deste usuário
Re:Iniciando com RTOS MQX 6 Mês, 3 Semanas atrás Popularidade: 0  
Ola Senhores.
Estou caminhando com o aprendizado, usando os exemplos da pasta MQX (sugestão do Douglas). No exemplo GPIO tem algumas rotinas interessantes e fiz algumas modificações para funcionar com minha rotina.
Código:

// -- Função para Ler no Port
int ReadInput(unsigned char Pino) 
{
int DummyA = 0;
// -- Vetores para leitura de IO
static const uint_32 swt2[] = {
                              SWT_2,
                              GPIO_LIST_END
                              };
                              
                               
  switch(Pino) 
  {
    case 1: ioctl(input_port, GPIO_IOCTL_READ, (char_ptr) &swt2);
              if (swt2[0] & GPIO_PIN_STATUS)
              {
              DummyA = 1;
              }
            break;
  }
  
return DummyA;
}


Mas a rotina não funciona me retornando sempre "0". Alguém arrisca algum pitaco?

Att.

Ricardo Franco
 
Logado Logado  
  O administrador desabilitou acesso publico para escrita.
#439
dfranca (Usuário)
Fresh Boarder
Mensagens: 6
graphgraph
Usuários Offline Clique aqui para ver o perfil deste usuário
Re:Iniciando com RTOS MQX 6 Mês, 2 Semanas atrás Popularidade: 0  
Oi Ricardo,

Você pode ter duas tasks distintas atuando no mesmo pino, com certeza isso é possível.
Mas eu acredito que o que vc quer fazer não seja possível !

E não por uma limitação do SO, mas sim pela maneira muito distinta de configuração do pino: em uma task ele é entrada para um ADC e em outra task ele seria uma saída.

Quando o pino é configurado para entrada de um ADC estamos instruindo o hardware do microcontrolador a trablahar de uma forma bem específica.

Naquele pdf que lhe sugeri no outro email, o capítulo 8 é dedicado a como usar o driver de ADC do MQX.

Abraços !

Douglas
 
Logado Logado  
  O administrador desabilitou acesso publico para escrita.
#440
dfranca (Usuário)
Fresh Boarder
Mensagens: 6
graphgraph
Usuários Offline Clique aqui para ver o perfil deste usuário
Re:Iniciando com RTOS MQX 6 Mês, 2 Semanas atrás Popularidade: 0  
Oi Ricardo,

Meus pitacos abaixo !

Eu acredito que a variável input_port deva ser inicializada da seguinte maneira:

input_port = fopen("gpio:read", (char_ptr) & swt2);

Ou seja, no momento em que a linha acima for executada, o seu vetor swt2 já deveria ser declarado e definido.

No código que vc passou eu nao estou vendo isso ! Dá uma confirmada, como o input_port está sendo atribuído e sempre compare os valores de retorno das API´s do MQX (para ter certeza que não falhou a aberta do FILE_PTR).

Outro pitaco:

Veja que o if abaixo pode ou não ser executado: Se o "and" lógico não for TRUE, DummyA nunca será 1. Ou seja, depende de como está a entrada do seu pino, para que o if seja executado ou não.

if (swt2[0] & GPIO_PIN_STATUS)
{
DummyA = 1;
}


Mas eu ainda suspeito da variável input_port...dá uma conferida nela.

boa sorte,

Douglas
 
Logado Logado  
  O administrador desabilitou acesso publico para escrita.
#441
Ricardo_Franco (Usuário)
Fresh Boarder
Mensagens: 11
graphgraph
Usuários Offline Clique aqui para ver o perfil deste usuário
Re:Iniciando com RTOS MQX 6 Mês, 2 Semanas atrás Popularidade: 0  
Ola Senhores.
Caro Doulgas, na verdade faltaram alguns detalhes:

MAIN.H
Código:

#define INIT_TASK   5
#define LEDS_TASK   6
#define CHAVES_TASK 7



MAIN.C
Código:

TASK_TEMPLATE_STRUCT MQX_template_list[] = 

/*  Task number, Entry point, Stack, Pri, String,   Auto? */
   {INIT_TASK,   Init_task,   1500,  9,   "init",   MQX_AUTO_START_TASK,  0,  0}, 
   {LEDS_TASK,   Leds_task,   1500,  10,  "leds",   0,                    0,  0}, 
   {CHAVES_TASK, Chaves_task, 1500,  10,  "chaves", 0,                    0,  0},
   {0,           0,           0,     0,   0,        0,                         }
};



DRV_IO.C
Código:

// -- Variaveis Globais
static FILE_PTR output_port = NULL;
static FILE_PTR input_port  = NULL;

// -- Função para inicializar IO
boolean InicializaIO(void) 
{
  const uint_32 output_set[] =
  {
  LED_1 | GPIO_PIN_STATUS_0,
  LED_2 | GPIO_PIN_STATUS_0,
  LED_3,
  GPIO_LIST_END
  };
  
  const uint_32 input_read[] = 
  {
  SWT_2,
  GPIO_LIST_END
  };
    
  
output_port = fopen("gpio:write", (char_ptr) &output_set);
input_port = fopen("gpio:read", (char_ptr) &input_read);
}



// -- Função para Ler no Port
int ReadInput(unsigned char Pino) 
{
int DummyA = 0;
// -- Vetores para leitura de IO
static const uint_32 swt2[] = {
                              SWT_2,
                              GPIO_LIST_END
                              };
                              
                               
  switch(Pino) 
  {
    case 1: ioctl(input_port, GPIO_IOCTL_READ, (char_ptr) &swt2);
              if (swt2[0] & GPIO_PIN_STATUS)
              {
              DummyA = 1;
              }
            break;
  }
  
return DummyA;
}



DRV_IO.H
Código:

// -- Definições de uso Geral
#define LED_1 (GPIO_PORT_TE | GPIO_PIN3)
#define LED_2 (GPIO_PORT_TG | GPIO_PIN5)
#define LED_3 (GPIO_PORT_TE | GPIO_PIN5)
#define SWT_2 (GPIO_PORT_TG | GPIO_PIN6)


// -- Protótipos de uso Geral
extern boolean InicializaIO(void);
extern void SetOutput(unsigned char Pino, boolean Estado);
extern int ReadInput(unsigned char Pino);



A rotina de Escrita no LED (que não aparece acima), funciona perfeitamente (foi totalmente baseada no AN da Freescale).

Alguém tem alguma sugestão?
 
Logado Logado  
  O administrador desabilitou acesso publico para escrita.
#442
Ricardo_Franco (Usuário)
Fresh Boarder
Mensagens: 11
graphgraph
Usuários Offline Clique aqui para ver o perfil deste usuário
Re:Iniciando com RTOS MQX 6 Mês, 2 Semanas atrás Popularidade: 0  
Ola Senhores
Oi Ricardo,

Você pode ter duas tasks distintas atuando no mesmo pino, com certeza isso é possível.
Mas eu acredito que o que vc quer fazer não seja possível !

E não por uma limitação do SO, mas sim pela maneira muito distinta de configuração do pino: em uma task ele é entrada para um ADC e em outra task ele seria uma saída.

Quando o pino é configurado para entrada de um ADC estamos instruindo o hardware do microcontrolador a trablahar de uma forma bem específica.

Naquele pdf que lhe sugeri no outro email, o capítulo 8 é dedicado a como usar o driver de ADC do MQX.

Abraços !

Douglas


Ola Douglas, atualmente eu faço isso nos microcontroladores sem um sistema operacional. Supomos que eu tenha um pino compartilhado em Leitura de uma grandeza Analógica qualquer (pino configurado como Hi-Z), e uma saída à relé. O pino fica sempre configurado como saída para comandar o relé. No momento que preciso realizar uma leitura, eu mudo temporariamente a configuração do pino para Entrada analógica, realizo a leitura e volto a comandar o relé (que possui suas correntes devidamente isoladas por um transistor). Como a leitura analógica é muito rápida (cerca de 2,5uS para os uC que tenho usado da freescale), o relé nem percebe que ficou esse curto tempo sem energização (todas as reatâncias demoram muito mais tempo para se amortizarem) portanto o relé não chega sequer a vibrar.
Agora eu só consigo fazer isso, pois tenho controle sobre cada registrador da CPU, coisa que não sei como fica no caso de um RTOS.
Meu próximo passo (assim que resolver o problema do input digital) é utilizar o ADC. Assim vou ver se consigo multiplexar os pinos e posto os resultados.
 
Logado Logado  
  O administrador desabilitou acesso publico para escrita.
#443
dfranca (Usuário)
Fresh Boarder
Mensagens: 6
graphgraph
Usuários Offline Clique aqui para ver o perfil deste usuário
Re:Iniciando com RTOS MQX 6 Mês, 2 Semanas atrás Popularidade: 0  
Olá Ricardo,

Minhas sugestões:

a) No módulo DRV_IO.c

Declare o buffer input_read como global ao módulo da seguinte forma:

static FILE_PTR output_port = NULL;
static FILE_PTR input_port = NULL;

static uint_32 input_read[] =
{
SWT_2,
GPIO_LIST_END
};

b) Na função: int ReadInput(unsigned char Pino)

Apague o seguinte buffer:

static const uint_32 swt2[] = {
SWT_2,
GPIO_LIST_END
};

Modifique o código dentro do case(1) para:

ioctl(input_port, GPIO_IOCTL_READ, (char_ptr) & input_read);
if (input_read[0] & GPIO_PIN_STATUS)
{
DummyA = 1;
}

Grato,

Douglas

PS.: Dica: sempre verifique o valor de retorno das chamadas da API do MQX. Ela pode te poupar tempo.
 
Logado Logado  
  O administrador desabilitou acesso publico para escrita.
Ir para cima
Links do Dia
5vcc 
Curso de Desenvolvimento de Sistemas Embarcados 
EETimes Online  
Handhelds.org 
VxWorks Cookbook 
Pesquisar no Portal
Newsletter
Assinar a newsletter do
Portal Embarcados
Nome:
Email:


Enquete
Qual é a sua formação?
 
Oportunidades
Últimas do Fórum

Mais...
Blogs
PROPELLER CHIP Autor: Josilton Rocha
Procuramos consultoria - GSOAP Autor: Claudio Boechat
IDE Free para SDCC Autor: Alexandre Andrade Souza
Parceiros
Comunidade C&C++ Brasil
Comunidade Brasileira de Eletronica
Eletromaniacos
Tempo Real
Psoc-Chile