Ir ao conteúdo
  • Cadastre-se

variavel matriz com PIC18f4550


Posts recomendados

Ola amigos!

Tenho esse codigo:

float latmin=3456.6785;

float latitude;

char Lat;

lcd_gotoxy(1,2);
lcd_putc("Lon ");
for(j=0;j<12;j++){
Lat = RxBuf[k+21+j];
lcd_putc(Lat);

 

latitude=lat;

if (latitude>latmin){

 output_high(PIN_B3);
    }

if (latitude<latmin){

 output_high(PIN_B3);
    }

Esse codigo é parte do comunicação de GPS,e preciso gravar valor recebido da variavel char LAT e grave este valor na matriz,alguem poderia me ajudar?

 

Link para o comentário
Compartilhar em outros sites

@ViniciusKruz ola,obrigado.

 

O codigo do gps fica enviando coordenadas pela variavel tipo char lat e

float latmin=3456.6785;

float latitude;

char Lat;

lcd_gotoxy(1,2);
lcd_putc("Lon ");
for(j=0;j<12;j++){
Lat = RxBuf[k+21+j];
lcd_putc(Lat);  variavel Lat que envia coordenadas no display


  

latitude=lat;

if (latitude>latmin){

 output_high(PIN_B3);
    }

if (latitude<latmin){

 output_high(PIN_B3);
    }recebida pela variavel Lat

 

Eu preciso que as coordenadas recebida pela variavel Lat sejam colocada na variavel latitude e assim jogar esse valor na matriz:

latitude=lat;

matrix[2][2]=latitude;

Link para o comentário
Compartilhar em outros sites

@alexandro umbert  Veja se entendi. Você recebe toda a cadeia de caracteres do gps, composta por 10 caracteres (somente a latitude) mais um separador um por um através da variável lat? Se for isso, antes de armazenar, vai ter que se preocupar é com o recebimento desses 11 caracteres. Por exemplo, supondo que o gps envie a latitude 40.7127837, você terá que receber um número de cada vez e armazenar em um buffer, nisso estou supondo que seu gps envie esses dados serialmente. Da forma como seu código está , não faz o menor sentido porque sua variável LAT é do tipo char e isso significa que ela só pode receber um valor de 8 bits (0 a254) ou ainda um caractere qualquer. Analise o datasheet do seu gps e se possível me passe o protocolo de comunicação dele,quem sabe assim eu possa te ajudar melhor.

Link para o comentário
Compartilhar em outros sites

Em 18/04/2017 às 19:32, alexandro umbert disse:

for(j=0;j<12;j++){
Lat = RxBuf[k+21+j];

Agora estou entendendo melhor sei código, na  verdade você não postou ele completo e seu buffer de recepção dos dados do gps é o RxBuf, citado acima. Então, aí fica bem mais fácil, o que acontece é que esse buffer já é uma cadeia de caracteres, é como se fosse uma matriz só que unidimensional enquanto que a matriz mesmo, seria bidimensional, inclusive esse laço for que você usou, esta percorrendo todo esse buffer. Para percorrer uma variável bidimensional, precisa de dois laços for, um dentro do outro, por exemplo, para percorrer a matriz char buffer [2][20] você faz assim:

int x=0;

int y=0;

for (y=0;y <2;y++){//lê as linhas

       for (x=0;x <20;x++){//le as colunas

       }

}

 

Desta forma você pode ler ou gravar em qualquer posição da matriz.

Link para o comentário
Compartilhar em outros sites

@alexandro umbert Eu não  ompreendi muito bem essa parte do seu código que faz a recepção, esse RxBuff, mas de uma qualquer maneira, ela deve estar armazenanado a recepção e o que você deve fazer é converter ela para float e só depois disso tratar realmente como tal. Em C existe uma função chamada atof se não me engano, da uma verificada se ela vai reolver esta  conversão.

Link para o comentário
Compartilhar em outros sites

@ViniciusKruz@ViniciusKruz  eu já tentei esse comando que me falaram atof,realmente ,mas o compilador ccs dizem que não aceita.

não teria uma outra opção para fazer isso?

olha isso:

for(;;){
float variavel;
float matrix[3][3];
float latitude;

if(f_Boot == 0){
    if(TemPacote == 1){
        TemPacote = 0;
       for(k=0;k<1000;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);
                }
                lcd_gotoxy(1,2);
                lcd_putc("Lon ");
                for(j=0;j<10;j++){
                    Lat = RxBuf[k+21+j];
                    lcd_putc(Lat);
                    

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@alexandro umbert Aqui vai um exemplo de uso do atof e mostra no display:

 


float x; 
char s[] = "2309.12e15"; 
x = atof(s); 
printf("x = %e\n",x);

 

Veja se resolve.

adicionado 7 minutos depois
6 minutos atrás, alexandro umbert disse:

for(k=0;k<1000;k++){

Esse seu codigo de recepção esta realmente muito estranho rsrs, veja o trecho acima, ele está dizendo que vai receber 1kb do gps. Isso está certo?

adicionado 8 minutos depois
8 minutos atrás, ViniciusKruz disse:

Esse seu codigo de recepção esta realmente muito estranho rsrs, veja o trecho acima, ele está dizendo que vai receber 1kb do gps. Isso está certo?

 

Link para o comentário
Compartilhar em outros sites

@alexandro umbert  

 

Se puder, poste esse trecho completo:

 

for(k=0;k<1000;k++){

 

Para eu poder compreender a lógica usada, preciso ver esse laço completamente, o que você postou está faltando um pedaço.

 

Só para constar, o laço completo começa com uma chave e termina com outra "{}".

 

Link para o comentário
Compartilhar em outros sites

@ViniciusKruz valeu amigo,consegui com comando atof.

 

Mas tem momento que a variavel aparece só zeros,veja como ficou agora em negrito que alterei:

}
                lcd_gotoxy(1,2);
                lcd_putc("Lon ");
                for(j=0;j<10;j++){
                    Lat = RxBuf[k+21+j];
                    lcd_putc(Lat);
                    latitude= atof(Lat);
                }
              
                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){
    printf(LCD_PUTC,"\f%1.5f ",latitude);
    delay_ms(1000);

    }
}
     dá pra fazer alguma alteração?

Link para o comentário
Compartilhar em outros sites

@alexandro umbert Olha só, sua variável Lat só armazena um caractere por vez e esta variável está sendo convertida para o tipo float. Pra que funcione, você tem que pegar a cadeia inteira e só depois fazer a conversão, algo tipo assim:
 

char latCompleto[10];

for(j=0;j<10;j++){
   Lat = RxBuf[k+21+j];
   latCompleto[j]=Lat;
}

latitude= atof(latCompleto);

printf(LCD_PUTC,"\f%1.5f ",latitude);

Explicando: 

a variável latCompleto é um array que vai armazenar todos os caracteres e só depois desse armazenamento será feita a conversão com o atof e também mostrado no lcd.

 

Tenta aí pra ver.

 

Link para o comentário
Compartilhar em outros sites

opa, agora tá gravando ok

 

Mas exemplo as coordenadas mostradas no LCD tá 2226.34678....está gravando valores pouco acima ou abaixo...exemplo 

2226.34599.

 

segue a modificação que fiz:

              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);
                }
                
                
              
                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);
   matrix[0][1]= latitude;
    printf(LCD_PUTC,"\f%1.5f ",matrix[0][1]);

    delay_ms(1000);
    }
}
     
    }

Link para o comentário
Compartilhar em outros sites

@alexandro umbert

 

Não precisa desse trecho abaixo:

matrix[0][1]= latitude;
printf(LCD_PUTC,"\f%1.5f ",matrix[0][1]);

No caso basta fazer assim:

printf(LCD_PUTC,"\f%1.5f ",latitude);

 

Outra coisa, porque que você ta mostrando no lcd duas vezes, a primeira quando filtra os caracteres recebidos:

 lcd_putc(Lat);

E a segunda vez com o printf:

printf(LCD_PUTC,"\f%1.5f ",latitude);

 

O primeiro, é desnecessário.

 

Aqui neste trecho abaixo também tem um problema, veja:

for(j=0;j<10;j++){
	Lat = RxBuf[k+7+j];
    lcd_putc(Lat);////////////desnecessário
    latCompleto[j]=Lat; 
}   
lcd_gotoxy(1,2);
lcd_putc("Lon ");
for(j=0;j<10;j++){
	Lat = RxBuf[k+21+j];
	lcd_putc(Lat);////////////desnecessário
}

break;////havalie se ele também não está atrapalhando porque aqui será encerrada toda a rotina

Além desses possíveis problemas que comentei no código acima, estou com dúvida sobre esses laços "for()":

 

No primeiro, a variável latCompleto está pegando 10 caracteres do buffer de recepção(RxBuf) e seguindo pela lógica tem o segundo laço "for()" que vai pegar mais 10 caracteres do RxBuf, esse segundo laço está apenas mostrando no lcd, ele não deveria estar armazenando também na variável latCompleto?

 

Caso sim, tome cuidado porque os dados já gravados pelo primeiro laço irão sobrepor os dados gravados pelo primeiro laço.

 

Outra coisa, quando te passei o exemplo da variável laço completo(char latCompleto[10];), como pode ser observado, ela comporta apenas 10 posições de memória, logo, se você for colocar mais dados tem que mudar esta quantidade de posições como por exemplo: char latCompleto[20]; ou char latCompleto[30]; ou quantas posições forem necessárias.

 

 

adicionado 9 minutos depois

Outra coisa que eu ia me esquecendo, para o LCD mostrar um float, tem que configurar corretamente a opção

printf(LCD_PUTC,"\f%1.5f ",latitude);

 

Esta configuração: \f%1.5f se não me engano, está incorreta, não me recordo direito agora como utilizá-la, mas acho que no seu caso seria algo assim: printf(LCD_PUTC,"\f%10.5f ",latitude); onde o "10" seria a quantidade de caracteres e o "5" seria a quantidade de casas depois do ponto ".", verifica isso aí.

Link para o comentário
Compartilhar em outros sites

@ViniciusKruz Obrigado,agora estou clareando as ideias!

 

No primeiro for mostra Latitude e segundo for mostra a Longitude.

 

E por isso q tem dois for.

 

if (input(PIN_B5)==0){
   // latitude=0;
   latitude= atof(latCompleto);
   matrix[0][1]= latitude;
    printf(LCD_PUTC,"\f%1.5f ",latitude);

   delay_ms(1000);
    }


    if (lat<latitude){
    output_high(PIN_B0);
    }
  
    if (lat>latitude){
    output_high(PIN_B2);
    }

 

Agora uma duvida,quando aperto botão a variavel latitude estão sendo gravada a variavel.

 

agora preciso comparar a variavel latitude e variavel Lat,a variavel Lat por ser tipo char,posso comparar com a tipo float?
 

Link para o comentário
Compartilhar em outros sites

@alexandro umbert Para comparar duas variáveis na linguagem C, elas devem ser do mosmo tipo, antes é preciso fazer a conversão e depois a comparação.

 

 

Quanto aos dois laços você já fez a captura da latitude agora faça o mesmo com o segundo laço pegando a longitude, tipo assim:

 

 


char longCompleto[20];   lcd_gotoxy(1,2); lcd_putc("Lon ");    for(j=0;j<10;j++){ longCompleto[j]= RxBuf[k+21+j]; }

 

Note que criei uma nova variavel para conter a longitude daí é só fazer a conversão  e a comparação:

 


if (atof(latCompleto) < atof (longCompleto)){

///executar a função 

}

 

Link para o comentário
Compartilhar em outros sites

@ViniciusKruz ok entendi.

 

Veja que 1 eu to querendo gravar a latitude real na variavel latitude:

 

if (input(PIN_B5)==0){/////////////////////////grava coordenada real na variavel latitude.
   latitude= atof(latCompleto);
  printf(LCD_PUTC,"\f%1.5f ",latitude);
    delay_ms(1000);
    }

 

e depois preciso comparar entre a latitude gravada e latitude real :


    if (latitude<latReal){
    output_low(PIN_B0);
    delay_ms(20);
    }
   
  if (latitude>latReal){
    output_low(PIN_B2);
     delay_ms(20);
    }

assim caso eu esteva com o modulo e coordenada for maior ou menor com latitude gravada na variavel latitude e executar a função.

 

 

 

 


 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@ViniciusKruz

adicionado 1 minuto depois

@ViniciusKruz tá certo fazer isso?

 

 lcd_gotoxy(1,2);
                lcd_putc("Lon ");
                for(j=0;j<10;j++){
                    Lat = RxBuf[k+21+j];
                    lcd_putc(Lat);
                          longCompleto[j]=Lat; 
                }
                
                
              
                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);
    latReal= atof(latCompleto);
    if (input(PIN_B5)==0){
   latitude= atof(latCompleto);
  printf(LCD_PUTC,"\f%1.5f ",latitude);
    delay_ms(1000);
    }
    
    if (atof(latCompleto) < latReal){
    output_low(PIN_B0);
    delay_ms(20);
    }
    else
    {
    output_high(PIN_B0);
    }
   
 if (atof(latCompleto) >latReal){
    output_low(PIN_B2);
    delay_ms(20);
 }
 else
 {
 output_high(PIN_B2);
 }
    }
    }
 

Link para o comentário
Compartilhar em outros sites

@alexandro umbert Cara, se tá certo não sei, tem que testar. Olhando somente um trecho do código assim fica meio difícil de dizer. Uma coisa é certa, já observei que se você quiser ler a latitude usa assim:

 

latCompleto [j]=RxBuf [k+7+j] 

 

e se você quiser pegar a longitude faça assim:

 

longCompleto [j]=RxBuf [k+21+j] 

 

Observe esses detalhes q vai dar certo.

 

Link para o comentário
Compartilhar em outros sites

@ViniciusKruz

or(;;){
float variavel;
float matrix[3][3];
float latitude,latReal;
char latCompleto[10];
char longCompleto[10];

if(f_Boot == 0){
    if(TemPacote == 1){
        TemPacote = 0;
       for(k=0;k<1000;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);
    delay_ms(20);
    }
    else
    {
    output_high(PIN_B0);
    }
   
 if (latitude >latReal){
    output_low(PIN_B2);
    delay_ms(20);
 }
 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);
    }
    
}
    }
 

Em negrito tem parte que faz a comparação,Porque será que não faz a comparação em negrito na mesma velocidade que atualiza as coordenadas do gps? gps a cada 1 segundo atualiza.

 

devo colocar algum comando while(true)?

Link para o comentário
Compartilhar em outros sites

18 horas atrás, alexandro umbert disse:

devo colocar algum comando while(true)?

 

Na verdade seu problema de lentidão, acredito com quase 100% de certeza que está nesse trecho(já te alertei antes sobre esse problema): 

 

 for(k=0;k<1000;k++){

 

Este laço está gigantesco, seu processador vai perder muito tempo percorrendo este trecho, pra resolver isso, tenta mudar esse tamanho, verifica se realmente seu GPS retorna uma variável de 1KB porque é isso o que você está processando, toda vez que seu GPS retorna os valores, seu processador vai precorrer 1KB para localizar as informações.

 

 

 

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...