Iniciando com RTOS MQX

Software e Hardware para uC da Qualcomm, NXP, FreeScale e Motorola

Moderadores: 51, guest2003

Mensagempor Ricardo_Franco » 03 Mar 2010 10:40

Ola Senhores.
o proximo passo é a implementação de um canal AD. Este eu consegui fazer sem qualquer tipo de ajuda externa. apenas lendo os User guides e exemplos da Freescale.
Realmente o jeitão dele se repete.
Isso não garante que as rotinas estejam perfeitas e otimizadas. Mas ja é a ponta do Iceberg.

Arquivo IO.C
Código: Selecionar todos
// -- Variaveis Globais
static FILE_PTR adc = NULL;
static FILE_PTR adc_channel = NULL;

// -- definições Globais
const ADC_INIT_STRUCT adc_init =
  {
  ADC_RESOLUTION_8BIT,     /* resolution */
  };
 
/* Logical channel #1 init struct */
const ADC_INIT_CHANNEL_STRUCT adc_channel_parameters =
  {
  POT_1, /* physical ADC channel */
  ADC_CHANNEL_MEASURE_LOOP | ADC_CHANNEL_START_NOW,
  10,             /* number of samples in one run sequence */
  0,              /* time offset from trigger point in us */
  50000,         /* period in us (= 0.6 sec) */
  0x10000,        /* scale range of result (not used now) */
  1,             /* circular buffer size (sample count) */
  ADC_TRIGGER_1,  /* logical trigger ID that starts this ADC channel */
}; 

// -- Função para inicializar ADC
boolean InicializaIO(void)
{
// -- Configuração do ADC
 ADC_INIT_CHANNEL_STRUCT adc_chl = adc_channel_parameters;
   
    adc = fopen("adc:", (const char*)&adc_init);
    if (NULL == adc) {   
        printf("ADC device open failed\n");
        _task_block();
    }
   
    adc_channel = fopen("adc:3",(const char*)&adc_chl);
    if (NULL == adc_channel) {   
            printf("adc:POT channel open failed\n");
            _task_block();
       
    }
}
 

// -- Função para retornar Valor do ADC
/*
 *  Read in ADC value on the channel given
 */
int_32 ReadADC(void) {
    ADC_RESULT_STRUCT data;
    int_32 val;
   
    read(adc_channel, &data, sizeof(data) ) ;
    val = data.result;
   
    return val;

}


Arquivo TASK.C
Código: Selecionar todos
void Adc_task(uint_32 initial_data)
{
int_32 ValorADC = 0;

printf("\n Adc task \n");

  while (TRUE)
  {
  ValorADC = ReadADC();
 
  if(ValorADC > 240)
    {
    SetOutput(3,1);
    }
    else
    {
    SetOutput(3,0);     
    }
   
  _time_delay(100);
  }
}   


Tudo funciona Direitinho.
Ricardo Franco
____________________________________________________________________________________________
web: www.engricardofranco.kit.net
Skype: engricardofranco
Fone Skype: (19) 3119-8162
Ricardo_Franco
Byte
 
Mensagens: 305
Registrado em: 11 Out 2006 20:53
Localização: Campinas - SP

Mensagempor Ricardo_Franco » 03 Mar 2010 14:14

Senhores.
Estou com uma pequena dificuldade em relação a comunicação serial.

ja vi que posso escrever na serial usando "printf" e provavelmente possa ler da serial usando "scanf".Mas onde eu configuro os parametros de hardware da serial. Baud Rate, quantidade de bits, etc?
Não achei isso em lugar algum. No entanto sei que sem fazer nada eu consigo transmitir pela serial a 115.200 bps.

Alguém te alguma idéia?

Ricardo Franco
Ricardo Franco
____________________________________________________________________________________________
web: www.engricardofranco.kit.net
Skype: engricardofranco
Fone Skype: (19) 3119-8162
Ricardo_Franco
Byte
 
Mensagens: 305
Registrado em: 11 Out 2006 20:53
Localização: Campinas - SP

Mensagempor Ricardo_Franco » 06 Mar 2010 09:29

Ola Senhores.
Bom problema da Serial resolvido gostaria de colocar a solução e transcrever trechos de uma conversa com o "Douglas França", que tem me fornecido um exelente suporte.

Primeiro a solução para comunicação serial:
No arquivo DRIVER_IO.C
Código: Selecionar todos
static FILE_PTR serial = NULL;

// -- Função para inicializar IO
boolean InicializaIO(void)
{
uint_32 Dummy=0;   

serial =  fopen(BSP_DEFAULT_IO_CHANNEL, 0);

Dummy = 9600;
ioctl(serial, IO_IOCTL_SERIAL_SET_BAUD, &Dummy);

Dummy = 0;
ioctl(serial, IO_IOCTL_SERIAL_SET_FLAGS, &Dummy);
}

// -- Leiutura da UART.
char ReadUART(void)
{
char Char = 0;
  if (fstatus( serial )) {
         Char = fgetc( serial );
      } 
return Char;   
}


Arquivo TKS_Tasks
Código: Selecionar todos
void Serial_task(uint_32 initial_data)
{
unsigned char Char = 0;
printf("\n Serial task \n"); 

  while(TRUE)
  {
  Char = ReadUART();
    if(Char)
    {
    //printf("\n Dentro Recebe Char \n");  // Apenas DEBUG
    printf("%c",Char); 
    }
   
  _time_delay(100);
  }

}


Bom agora um pequeno trecho da conversa com o Douglas.

Ricardo Franco: Senhores.
Estou com uma pequena dificuldade em relação a comunicação serial.

ja vi que posso escrever na serial usando "printf" e provavelmente possa ler da serial usando "scanf".Mas onde eu configuro os parametros de hardware da serial. Baud Rate, quantidade de bits, etc?
Não achei isso em lugar algum. No entanto sei que sem fazer nada eu consigo transmitir pela serial a 115.200 bps.

Alguém te alguma idéia?

Ricardo Franco


Resposta: Douglas França
Você altera todo a configuração da serial (após você ter aberto a porta, e obtido o file descriptor) através dos comandos de IOCTL.

Naquele mesmo .pdf (MQXIOUG.pdf), vá na página 27.
Lá vc encontra todos os códigos de IOCTL para controlar tudo na sua serial.

abraços,

Douglas


Pergunta: Ricardo Franco

Mas uma duvida ... depois que eu abri a serial e modifiquei os parametros das mesma ... como eu uso a serial ? pelo "printf" mesmo? E no caso de ter mais de uma serial ? como eu iria direcionar as mensagens ?

Ricardo Franco


Resposta: Douglas França
A palavra mágica é "file-descriptor".

Se você abriu N seriais, você terá recebido N file-descriptors, certo ?

A facilidade de você escrever na serial usando o printf é algo que o MQX faz com a serial que ele chama de "default".
E aliás, você pode alterar isso, fazendo por exemplo o printf escrever na serial2, ou serial3, ou serialN, ao invés da serial1 (serial default).

O método genérico de escrita e leitura em qualquer serial são os comandos:

read();
write();

Veja na API deste comandos, que um dos parâmetros que eles recebem é justamente o file-descriptor, para saberem "onde" atuar.
Os outros parâmetros são os buffers, e o tamanho de caracteres à enviar e receber.

Boa sorte !

Dougals


Apenas completando a resposta do Douglas, eu também usei o exemplo Telnet<->Serial para nortear minha aplicação, disponivel em:
C:\Arquivos de programas\Freescale\Freescale MQX 3.5\demo\telnet_to_serial

Att.
Ricardo Franco
____________________________________________________________________________________________
web: www.engricardofranco.kit.net
Skype: engricardofranco
Fone Skype: (19) 3119-8162
Ricardo_Franco
Byte
 
Mensagens: 305
Registrado em: 11 Out 2006 20:53
Localização: Campinas - SP

Mensagempor die6o » 27 Abr 2010 19:28

Galera Web seminario dia 29/04 Introdução ao MQX: Sistema Operacional de Tempo Real (RTOS) so fazer o cadastro

https://www2.gotomeeting.com/register/407174707
die6o
Nibble
 
Mensagens: 71
Registrado em: 07 Mar 2007 13:26

Mensagempor Ricardo_Franco » 08 Mai 2010 08:15

Galera Web seminario dia 29/04 Introdução ao MQX: Sistema Operacional de Tempo Real (RTOS) so fazer o cadastro

https://www2.gotomeeting.com/register/407174707


Puxa consegui ganhar o KIT da Freescale, um sistem tower com uma maquina V2. Até então estava usando um emprestado ....
Agora é esperar 2 MESES para chegar e correr para o abraço.

Ricardo Franco
Ricardo Franco
____________________________________________________________________________________________
web: www.engricardofranco.kit.net
Skype: engricardofranco
Fone Skype: (19) 3119-8162
Ricardo_Franco
Byte
 
Mensagens: 305
Registrado em: 11 Out 2006 20:53
Localização: Campinas - SP

Mensagempor msamsoniuk » 08 Mai 2010 11:08

posta as fotos quando chegar! :D

Ricardo_Franco escreveu:
Galera Web seminario dia 29/04 Introdução ao MQX: Sistema Operacional de Tempo Real (RTOS) so fazer o cadastro

https://www2.gotomeeting.com/register/407174707


Puxa consegui ganhar o KIT da Freescale, um sistem tower com uma maquina V2. Até então estava usando um emprestado ....
Agora é esperar 2 MESES para chegar e correr para o abraço.

Ricardo Franco
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Anterior

Voltar para NXP (ex-FreeScale (ex-Motorola))

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x