|
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 | |
|
 |
|
|
|
Iniciando com RTOS MQX (1 visualizando) (1) Visitante
Favorito por: 0
|
|
|
TÓPICO: Iniciando com RTOS MQX
|
|
|
|
Iniciando com RTOS MQX 6 Mês, 4 Semanas atrás
|
Popularidade: 0
|
|
|
|
|
|
Logado
|
|
|
O administrador desabilitou acesso publico para escrita.
|
|
|
|
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
|
|
|
O administrador desabilitou acesso publico para escrita.
|
dfranca (Usuário)
Fresh Boarder
Mensagens: 6
|
|
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
|
|
|
O administrador desabilitou acesso publico para escrita.
|
|
|
|
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
|
|
|
O administrador desabilitou acesso publico para escrita.
|
|
|
|
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
|
|
|
O administrador desabilitou acesso publico para escrita.
|
dfranca (Usuário)
Fresh Boarder
Mensagens: 6
|
|
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
|
|
|
O administrador desabilitou acesso publico para escrita.
|
dfranca (Usuário)
Fresh Boarder
Mensagens: 6
|
|
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
|
|
|
O administrador desabilitou acesso publico para escrita.
|
|
|
|
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
|
|
|
O administrador desabilitou acesso publico para escrita.
|
|
|
|
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
|
|
|
O administrador desabilitou acesso publico para escrita.
|
dfranca (Usuário)
Fresh Boarder
Mensagens: 6
|
|
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
|
|
|
O administrador desabilitou acesso publico para escrita.
|
|
|
|
|
|
|
|
 |
|