Ir ao conteúdo
  • Cadastre-se

Pic 16f877a + gprs sim900


Posts recomendados

Boa noite pessoal, estou quebrando a cabeça para conseguir fazer funcionar a comunicação entre o  PIC 16F877A e um modulo GPRS SIM900. 

 

Inicialmente liguei o TX/RX do PIC no RX/TX do Shield GPRS SIM 900 e alimentei o GPRS com fonte externa de 5V. Estou utilizando um código USART, porém não consigo realizar a comunicação/configuração(comandos AT) para o GPRS, estou quebrando a cabeça e não sei qual o problema. A algum tempo atrás tive experiência com o Shield GPRS, porém com Arduino, ficando muito mais simples de realizar a atividade. 

 

Aqui vai o codigo que estou utilizando no meu microcontrolador para tentar fazer uma ligação com o GPRS.

 

#include <xc.h>
#include <stdlib.h>

// Configuração dos Fuses do Microcontrolador.
#define _XTAL_FREQ	   8000000 // Cristal de 8 Mhz.
#pragma config FOSC  = HS   	// Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN).
#pragma config WDTE  = OFF  	// Watchdog Timer Enable bit (WDT disabled).
#pragma config PWRTE = ON   	// Power-up Timer Enable bit (PWRT enabled).
#pragma config BOREN = OFF		// Brown-out Detect Enable bit (BOD disabled).
#pragma config LVP   = OFF  	// Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming).
#pragma config CPD   = OFF  	// Data EE Memory Code Protection bit (Data memory code protection off).
#pragma config CP    = OFF  	// Flash Program Memory Code Protection bit (Code protection off).

//-----------------------------------------------------------------------------
void USARTInit(long BaudRate, int Mode)
{
	unsigned char BR = 0;

	// Cálculo do valor para o registrador SPBRG para uma determinada velocidade em bps.	
	if (Mode == 0)			//Cálculo para baixa velocidade.
	{
		BR = (_XTAL_FREQ / (64 * BaudRate)) - 1;
		SPBRG = BR;
	}
	else					//Cálculo para alta velocidade.
	{
		BR = (_XTAL_FREQ / (16 * BaudRate)) - 1;
		SPBRG = BR;
	}

    // Configuração do Registrador TXSTA.
    TXSTAbits.CSRC	= 0;	// Seleção MASTER/SLAVE para o Modo Síncrono.
    TXSTAbits.TX9	= 0;	// Transmição de Dados em 8 Bits.
    TXSTAbits.TXEN	= 1; 	// Habilita a Transmição de Dados.
    TXSTAbits.SYNC	= 0; 	// Modo de Comunicação Assíncrono.
    TXSTAbits.BRGH	= Mode;	// Baud Rate em alta ou baixa velocidade.
    TXSTAbits.TRMT	= 1;	// Situação do Registrador Interno de Transmissão (TSR).
    TXSTAbits.TX9D	= 0;	// Valor a Ser Transmitido como 9º bit (Paridade/Endereçamento).

    // Configuração do Registrador RCSTA.
    RCSTAbits.SPEN	= 1;	// Habilita o Sistema USART.
    RCSTAbits.RX9	= 0;    // Recepção de Dados em 8 Bits.
    RCSTAbits.SREN	= 0;	// Desabilita Recepção Unitária (Somente Modo Síncrono em MASTER).
    RCSTAbits.CREN	= 1;   	// Habilita a Recepção Contínua de Dados.
    RCSTAbits.ADDEN	= 0;  	// Desabilita o Sistema de Endereçamento.
    RCSTAbits.FERR	= 0;	// Erro de Stop Bit.
    RCSTAbits.OERR	= 0;	// Erro de Muitos Bytes Recebidos sem Leitura.
    RCSTAbits.RX9D	= 0;	// Valor a Ser Recebido como 9º bit (Paridade/Endereçamento).

    // Configuração da Interrupção USART.
	PIE1bits.RCIE 	= 1;	// Habilita a Interrupção Serial.
	PIR1bits.RCIF 	= 0;	// Habilita a Interrupção Serial de Recepção.
}

//-----------------------------------------------------------------------------
void USARTWriteChar(unsigned char USARTData)
{
	while(!PIR1bits.TXIF);
	TXREG = USARTData;
}

//-----------------------------------------------------------------------------
void USARTWriteString(const char *str)
{
	// Efetua a transmissão da string para a USART.
	while(*str != '\0')
  	{
    	// Envio da string byte a byte.
		USARTWriteChar(*str);
      	str++;
  	}
}

//-----------------------------------------------------------------------------
unsigned char USARTReceiveChar(void)
{
	unsigned char USARTData;

	__delay_us(75);					// Tempo necessário para recepção do próximo byte.
	
	if (!OERR)						// Erro de Muitos Bytes Recebidos sem Nenhuma Leitura.
	{
		USARTData 		= RCREG;	// Recebe o byte da USART e atribui a variável USARTData.
    	PIR1bits.RCIF 	= 0;		// Limpa a Flag da Interrupção de Recepção.
	}
	else
	{
		USARTWriteString("\n\r ------- ESTOURO DE PILHA ------- \n\r ");

		RCSTAbits.CREN 	= 0;   		// Desabilita a Recepção Contínua de Dados Momentaneamente.
		USARTData 		= RCREG;	// Recebe o byte da USART e atribui a variável USARTData.
		RCSTAbits.CREN 	= 1;   		// Habilita a Recepção Contínua de Dados Novamente.
    	PIR1bits.RCIF 	= 0;		// Limpa a Flag da Interrupção de Recepção.				
	}
	
	return(USARTData);
}

//-----------------------------------------------------------------------------
void interrupt ISR(void)
{
	unsigned char byte;

	// Verifica se a interrupção foi causada pela recepção de bytes.
	if (PIR1bits.RCIF == 1)		
    {
		USARTWriteString("\n\r Entrou na funcao de Interrupcao da USART");
		USARTWriteString("\n\r Caracter Digitado : ");
		
		byte = USARTReceiveChar();
    	
		USARTWriteChar(byte);
    }		
}
//---------------------------+--------------------------------------------------
void main(void)
{
	TRISC = 0b10000000;		// Configura portC  RC7 (pino RX) como entrada.
    PORTC = 0b11000000; 	// Limpar as portas que estão configuradas como saidas.
	
	USARTInit(9600,1);	// Inicialização da USART passando a velocidade e o modo de transmissão.

	INTCONbits.PEIE	= 1;	// Habilita Interrupção de Periféricos do Microcontrolador.
	INTCONbits.GIE	= 1;	// Habilita Interrupção Global.
    
   	USARTWriteString("\n\r Inicializando o PIC...\n\r");

    USARTWriteString("ATD01449yyyyxxxx\n\r"); //yyyyxxxx é o telefone que estou colocando
    __delay_ms(1000);


}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

estranho... não vejo loop no seu main. Faça um e nele um led piscar pra ver se o mc "tá vivo". Procure cagadinhas no hw, falta de reset, circuito do cristal etc. Intercepte o sinal tx com um terminal e veja se os dados estão ativos.

Pode ser problema de BIOS ou ECET

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!