• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

vitor_neves88

Receber RS232 no PIC18F458

7 mensagens neste tópico

Pessoal estou com um pequeno problema, preciso de receber dados de um receptor gps num pic 18f458 no protocolo rs232 e não sei como fazer!

O que o GPS esta a enviar (pelo menos para o hiperterminal do win) é o seguinte:

$GPRMC,092444,V,3800.1979,N,00900.1496,W,,,281105,004.0,W*6B

O que eu queria era receber estes dados todos no pic para um array de ram para depois seleccionar os dados que me intressam!!

P.S. Eu já consigo enviar dados do pic para PC por RS232 logo as ligações ao pic estão bem feitas!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens de usar o UART da pic, que é um dispositivo autonomo que as PICs tem para fazer a comunicação RS232. Se elas não tivessem terias de gerar/receber o start bit, control bit, CRC, dados etc

Assim só tens de configurar os registos e praticamente mais nada.

Se estiveres a escrever em C, depois de iniciares o uart, gerlamente podes usar o printf, scanf, getc, etc ...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso são poucos dados, vitor_neves88, estas a usar a USART? Posta o código que estas a utilizar, não precisa de ser o código todo só aquele que faz a configuração da USART(se a tiveres a usar) e o que controla a comunicação.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O codigo onde eu estou agora é o seguinte:

  setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED);
   setup_comparator(NC_NC_NC_NC);

void read_RS232();  // funcao leitura
int i = 0; // numero do caracter em que vai max 60
int j = 0;
char string[62];  //comprimento total da msg
char latitude[13];
char longitude[13];


void main(){

while(1){

   output_high(pin_a1); //teste para ver se funciona//
   read_RS232();        // funcao de leitura
   output_low(pin_d1);  //teste de saida da funcao

   for (i=0; i<12; i++){
      latitude[i] = string[j+16];//16 inicio da latitude
      j++;
   }
   latitude[12] = '\0';
   j=0;
   for (i=0; i<12; i++){
      longitude[i] = string[j+28]; //inicio da longitude
      j++;
   }
   longitude[12] = '\0';
   j=0;

//fim do programa
//
}
}

// codigo para ler
void read_RS232(){

   for(i=0; i<61; i++){
       string[i] = getc();
   }
   string[61] = '\0';
   }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o codigo já funciona, mas estou com problemas nos ciclos e não estou a detectar o erro alguem me pode ajudar??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já funciona, óptimo, de qualquer modo vou postar aqui 2 link's que podem dar algum jeito.

Em Hi-Tech C, source code para usar a USART:

http://www.microchipc.com/sourcecode/PIC_Hi-Tech_C_PIC18Fxxx_serial_comms_sample.zip

E o AN774 da Microchip com source code em asm:

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en012073

Já agora diz o que que te faltava? Configurar a USART?

Cyas :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

já resolvi o problema!! utilizei outra função "gets" (agora lê a string completa!!)

vou deixar o codigo para quem necessitar:

#include "d:\programas de teste\leitura gps.h"
#include <string.h>




   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED);
   setup_comparator(NC_NC_NC_NC);

void read_RS232();  // função leitura
int i = 0;
int j = 0;
char string[61];  //comprimento total da msg
char latitude[13];
char longitude[13];


void main(){
      printf("inicio \r\n");//para teste

while(1){
   delay_ms(100);
   read_RS232();        // fç de leitura
   printf("saiu\r\n");  //teste

   //criar string latitude
   for (i=0; i<11; i++){
      latitude[i] = string[j+17];//16 inicio da latitude
      j++;
   }
   latitude[12] = '\0';
   j=0;
   //criar string longitude
   for (i=0; i<12; i++){
      longitude[i] = string[j+29]; //inicio da longitude
      j++;
   }
   longitude[12] = '\0';
   j=0;



//fim do programa


////////////////////////////// IMPRESSAO PARA CONFIRMAÇÃO ///////////
//imprimir latitude                                               ///
   printf("latitude  ");                                          ///
   for(i=0; i<11; i++){                                           ///
      printf("%c",latitude[i]);                                   ///
   }                                                              ///
//imprimir longitude                                              ///
   printf("\t longitude  ");                                      ///
   for(i=0; i<12; i++){                                           ///
      printf("%c",longitude[i]);                                  ///
   }
                                                              ///
   printf("\n\r");
                                              ///
  
   j=0;                                                           ///
/////////////////////////////////////////////////////////////////////
}
}



// codigo para ler

void read_RS232(){
   printf("entrou \n\r");
   gets(string);
   printf("\n\r");
   }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora