Ir ao conteúdo
  • Cadastre-se

Módulo de GPS e PIC


Posts recomendados

Olá pessoal a alguns meses resolvi montar um projeto que consiste em um módulo GPS recebendo informações e enviar para um PIC18f4520 trabalhar e apresentar em um display 16x2.

Estou usando a linguagem C com o compilador Micro C Pro5.3

Tenho o hardware que é uma placa de desenvolvimento da microgenios, uma outra com um max232, um múdulo gps e alguns led para mostrar a transferência.

Usando o Micro C fiz um código para esse projeto e não funcionou então abandonei ele e comprei uma apostila da CERNETEC que ensina no CCS e da um código que funcionando direitinho, mas eu não sei trabalhar no CCS e eu tinha em mente outras formas de fazer esse código, como: Usar a interrupção, colocar a função de um botão para poder alterar as informações mostradas no display(como mudar de latitude para hora, altitude, velocidade...).

Tentei adaptar esse código no Micro c inicialmente usando só a interrupção.

O Código tem que funcionar assim:

Quero usar a interrupção da recepção serial e caso seja recebido a sequência "$GPRMC" começa a armazenar os proximos 60 caracteres em Buffer. Quando o buffer tiver cheio começa mostrar no display.

obs.: Uma das sequencias que é recebida pelo pgs:

$GPRMC,135220.000,A,2250.3411,S,04303.9833,W,1.07,56.62,220712,,,A*54

SEGUE ABAIXO O CÓDIGO QUE EU TENTEI ADAPTAR NO MICROC, MAS ELE TEM ALGUM ERRO.

OBS.: eu usei a biblioteca do micro c de USART e LCD

Desde já agradeço o tempo de todos




/*******************************************************************************
************* inicialização das funções ************
*******************************************************************************/

/*******************************************************************************
************* declaração LCD ************
*******************************************************************************/

sbit LCD_RS at RE2_bit;
sbit LCD_EN at RE1_bit;
sbit LCD_D0 at RD0_bit;
sbit LCD_D1 at RD1_bit;
sbit LCD_D2 at RD2_bit;
sbit LCD_D3 at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISE2_bit;
sbit LCD_EN_Direction at TRISE1_bit;
sbit LCD_D0_Direction at TRISD0_bit;
sbit LCD_D1_Direction at TRISD1_bit;
sbit LCD_D2_Direction at TRISD2_bit;
sbit LCD_D3_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;

/*******************************************************************************
************* Declaração variáveis ************
*******************************************************************************/
char dado;
int controle=0;
int controle1=0;
int controle2=0;
char vetor[70];
char indice=0;
char buffer[70];
int nada;

/*******************************************************************************
************* inicialização das funções ************/

void interrupt()
{
dado = RCREG; // recebe o dado

if (controle1==1)
{
buffer[indice]=dado;
indice++;

if (indice==50)
{
controle1=0;
controle2=1;
}
}



if (controle==1)
{
buffer[indice]=dado;
indice++;
if (indice==5)
{
controle=0;
if ((buffer[0]=='G') && (buffer[1]=='P') && (buffer[2]=='R') && (buffer[3]=='M') && (buffer[4]=='C'))
{
indice=0;
controle1=1;
}
}
}


if (dado=='$')
{
controle=1;
}
PIR1.RCIF = 0;

}


/*******************************************************************************
************* Rotina de baixa prioridade de interrução ************
*******************************************************************************/


/*******************************************************************************
************* inicio do programa ************
*******************************************************************************/
void main() {
/*******************************************************************************
************* INICIALIZAÇÂO DOS PORTES E INTERRUPÇÕES ************
*******************************************************************************/
INTCON.GIEH = 1; /*habilita a chave geral das interrupções e habilita o vetor de alta prioridade de interrupção*/
INTCON.GIEL = 1;//habilita o vetor de baixa prioridade de interrupção
RCON.IPEN = 1; //define característica da família PIC18F com 2 level de prioridade de interrupção

PIR1.RCIF = 0; // nome do byte.periferico(bit)+if=0; flag de sinalização do xxxx
IPR1.RCIP = 1; // nome do byte.periferico(bit)+ip=1; configura auta prioridade(1) ou baixa(0)
PIE1.RCIE = 1; // habilita Interrupção da recepção serial


ADCON1 = 0x0f; // Configura todos os pinos A/D como I/O
TRISB.RB3=1; // Define o pino RB0 do PORTB como entrada.
TRISB.RB4=1; // Define o pino RB1 Do PORTB como entrada.
TRISB.RB5=1;
TRISE.RE1=0; // Define o pino RE1 do PORTE como saida.
TRISE.RE2=0; // Define o pino RE2 Do PORTE como saida.
TRISD = 0; // Define todos os pinos Do PORTD como saida.
TRISC.RC7=1;
TRISC.RC6=0;

Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off

UART1_Init(4800); // Initialize UART module at 9600 bps
Delay_ms(100); // Wait for UART module to stabilize

while(1)
{
if (controle2)
{
Lcd_Out(1, 1, vetor[1]);
Lcd_Out(1, 2, vetor[2]);
Lcd_Out(1, 3, ':');
Lcd_Out(1, 4, vetor[3]);
Lcd_Out(1, 5, vetor[4]);
Lcd_Out(1, 6, ':');
Lcd_Out(1, 7, vetor[5]);
Lcd_Out(1, 8, vetor[6]);
controle2=0;

}


}
}

post-1034296-13884965229767_thumb.jpg

Link para o comentário
Compartilhar em outros sites

  • 3 anos depois...
  • Membro VIP

@Djavan isto deve ser seu "meu bem querer.." kk. Penso que a tecnologia atual e dispositivos que já tem gps meio que sufocaram este tipo de projeto. celulares, tablets, o próprio aparelho gps e seus baixo custos inviabilizam projetos como este. A não ser é claro pro campo pedagógico. Mas em + de 3 anos ninguém se manifestou, então já viu né.

Mas sinta-se a vontade em dar alguma utilidade prática, viável, diferenciada e interessante pra isso. Ou vamos esperar mais 3 anos e meio...

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