Ir ao conteúdo
  • Cadastre-se

variavel matriz com PIC18f4550


Posts recomendados

@ViniciusKruz n tem biblioteca.

 

codigo


      for(;;){
            
if(f_Boot == 0){
    if(TemPacote == 1){
        TemPacote = 0;
       for(k=0;k<500;k++){
        ValorL = RxBuf[k];
        if(ValorL == '$'){
            ValorL = RxBuf[k+5];
            if(ValorL == 'L'){
                lcd_gotoxy(1,1);
                lcd_putc("Lat ");
                for(j=0;j<10;j++){
                    Lat = RxBuf[k+7+j];
                   lcd_putc(Lat);
                   latCompleto[j]=Lat; 
                }   
                lcd_gotoxy(1,2);
                lcd_putc("Lon ");
                for(j=0;j<10;j++){
                    Lat = RxBuf[k+21+j];
                    lcd_putc(Lat);
                          longCompleto[j]=Lat; 
                          latReal= atof(latCompleto);
    if (latitude< latReal){
    output_low(PIN_B0);
    }
    else
    {
    output_high(PIN_B0);
    }
   
 if (latitude >latReal){
    output_low(PIN_B2);
    
 }
 else
 {
 output_high(PIN_B2);
 }
     
                }
                
                break;
            }
        }
    }
    LimpRxBuf();
    VetorPos=0;
    TpS = 0;
    }
}
    if(m_Boot>0){m_Boot--;if(m_Boot == 0){
        f_Boot = 0;enable_interrupts(INT_RDA);
        delay_ms(100);ValorL=RCREG;CREN=0;CREN=1;
    }
    }
    delay_ms(1);

    if (input(PIN_B5)==0){
   latitude= atof(latCompleto);
  printf(LCD_PUTC,"\f%1.5f ",latitude);
    delay_ms(1000);
    }
    
      }

    }

    
    
     
    

Link para o comentário
Compartilhar em outros sites

@alexandro umbert Tem que ter alguma biblioteca de comunicação, ou no mínimo alguma função que inicializa o GPS e também funções de escrita e leitura nele, por exemplo esta variável: RxBuf[], tem alguma função que povoa ela para que você possa filtrar os dados desejados, onde estão estas funções?

 

De qualquer maneira já consegui alguns materiais referentes ao seu GPS e pelo que pude verificar, o retorno dele é bem simples, algo tipo assim:

 

$GPGLL,4717.11634,N,00833.91297,E,124923.00,A,A*6E

 

Ou seja, 50 caracteres, só aí já daria uma enoooorme enxugada no seu código.

 

Verifica aí e me passa a função que recebe esses dados para que eu possa te ajudar a melhorar a recepção.

 

Link para o comentário
Compartilhar em outros sites

@ViniciusKruz @ViniciusKruz tem essa parte do codigo que fica acima do for.

 

#define     Buffer_Size   1000 
int16        VetorPos;
char        TpS;
short int   TemPacote;
char RxBuf[Buffer_Size];
char ValorL;
int16 k;
char  j;
char divT;
char Lat;
int16 m_Boot;
int1  f_Boot;
float variavel;
float matrix[3][3];
float latitude,latReal;
char latCompleto[10];
char longCompleto[10];

#INT_RDA
void Serial_isr(void)
{
    char temp;
    temp = RCREG;
    TpS = 5;
    RxBuf[VetorPos] = temp;
    VetorPos++;
    if(VetorPos>1000){
        TpS = 0;
        TemPacote = 1;        
        return;
    }
}

#INT_TIMER1
void int_timer_1 () {
    set_timer1(50535);
    if(TpS>0){TpS--;if(TpS==0){TemPacote=1;}}
    if(divT-- == 0){
        divT =20;
        Life = !Life;
    }
}

void    LimpRxBuf (void){
    int16 i;
    for(i=0;i<1000;i++){
        RxBuf = 0;
    }
}

void main(void) 
{
    setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
    set_timer1(50535);
    divT = 100;
    enable_interrupts(INT_TIMER1);

set_tris_A(TRIS_A_INIT);
 set_tris_B(TRIS_B_INIT);
 set_tris_C(TRIS_C_INIT);
 set_tris_D(TRIS_D_INIT);
set_tris_E(TRIS_E_INIT);
 lcd_init();
    delay_ms(1);
    lcd_putc("\fROBO GUIADO GPS");
    lcd_putc("\n FABIO BETIOL");
delay_ms(5000);
    LimpRxBuf();
    VetorPos=0;
    TemPacote = 0;
    TpS = 0;
    m_Boot = 60000;
    f_Boot = 1;
    enable_interrupts(GLOBAL);
    ValorL = RCREG;
    CREN = 0; CREN = 1;
 

Link para o comentário
Compartilhar em outros sites

@alexandro umbert O trecho do seu código que recebe os dados é este:

 

#INT_RDA
void Serial_isr(void)
{
    char temp;
    temp = RCREG;
    TpS = 5;
    RxBuf[VetorPos] = temp;
    VetorPos++;
    if(VetorPos>1000){
        TpS = 0;
        TemPacote = 1;        
        return;
    }
}

Como pode-se observar, ele fica aguardando 1000 caracteres para fechar o pacote, como eu te disse, se eu entendi corretamente, o seu gps manda em torno de  60 caracteres, não entendi esse buffer gigantesco desse jeito.

 

Proponho alterar esse buffer para 100 bytes:

 

 

#define     Buffer_Size   100
char RxBuf[Buffer_Size];  

float latitude,longitude,latReal; 
char latCompleto[11];//memória para receber a latitude
char longCompleto[12];//memória para receber a longitude

void    LimpRxBuf (void){
    int16 i;
    for(i=0;i<100;i++){
        RxBuf[i] = 0;
    }
}

int recebendoPacote=0;
int pacoteCompleto=0;

#INT_RDA
void Serial_isr(void)
{
    char temp;
    temp = RCREG;
  	if(temp=="$"){//se for início de pacote...
      	LimpRxBuf();//limpa o buffer
     	recebendoPacote=1;//sinaliza que tem pacote sendo recebido  
    }
  	RxBuf[VetorPos] = temp;//guarda no buffer o caractere recebido
  	VetorPos++;
  	if(temp==0x0D){//Final de pacote <LF>
      VetorPos=0;
      pacoteCompleto=1;//recebeu um pacote completo
    }
  	
    if(VetorPos>=100){//se for mais de 100 caracterees considera erro e zera o buffer de recepção
      LimpRxBuf();//limpa o buffer de recepção	
      recebendoPacote=0;//reseta as flags de recepção
      pacoteCompleto=0;
    }
}

 

Esse código acima seria para a sua recepção do pacote, agora nesse seu laço for() ficaria assim:

 

//formato dos dados recebidos:
//$GPGLL,4717.11634,N,00833.91297,E,124923.00,A,A*6E

//antes de pegar um novo valor, salva o valor antigo
latReal= atof(latCompleto);

if(pacoteCompleto == 1){
  	int virgula=0;
	for(k=0;k<100;k++){//filtra o pacote recebido pegando a latitude e longitude
      //como os dados são separados por vírgula, filtramos com base nela
      if(RxBuf[k]=="," && virgula==0){//pega a latitude
        int L;
        for(L=0;L<=11;L++){
      		latCompleto[L]=RxBuf[k+L+1];   
        }
        virgula++;
      }
      if(RxBuf[k]=="," && virgula==2){//pega a longitude
        int L;
        for(L=0;L<=12;L++){
      		longCompleto[L]=RxBuf[k+L+1];   
        }
        virgula++;
      }
}

//agora faz as conversões:  
latitude = atof(latCompleto);
longitude = atof(longCompleto);
  
lcd_gotoxy(1,1);
lcd_putc("Lat ");
printf(LCD_PUTC,"\f%1.5f ",latitude);
  
lcd_gotoxy(1,2);
lcd_putc("Lon ");  
printf(LCD_PUTC,"\f%1.5f ",longitude);
  
if (latitude < latReal){
    output_low(PIN_B0);
}
else{
   output_high(PIN_B0);
}

 

 

O que estou sugerindo aqui é uma mudança significativa no seu código que pode fazer toda a diferença na velocidade do processamento.

 

Na parte acima em que os valores são filtrados, é possível que seja necessário fazer alguns ajustes, até que seja pêgo o campo correto, pela lógica expressa no documento desse seu GPS, as informações chegam da seguinte forma: $GPGLL,4717.11634,N,00833.91297,E,124923.00,A,A*6E

e o que eu fiz foi pegar 11 campos após a primeira virgula(latitude) e depois pegar mais 12 campos após a terceira vírgula(longitude), desta forma você pode fazer o mesmo para pegar qualquer informação baseada no separador(virgula).

 

Testa aí e me fala o que deu. Seria interessante se você utilizasse um terminal serial para capturar o pacote enviado pelo gps, dar um print na tela e me mostrar para trabalhar melhor a filtragem.

 

adicionado 6 minutos depois

Material muito bom sobre seu GPS:

https://www.u-blox.com/sites/default/files/products/documents/u-blox6_ReceiverDescrProtSpec_(GPS.G6-SW-10018)_Public.pdf?utm_source=en%2Fimages%2Fdownloads%2FProduct_Docs%2Fu-blox6_ReceiverDescriptionProtocolSpec_(GPS.G6-SW-10018).pdf

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!