Hola aquí te dejo un código que tengo funcionando correctamente en el cual se comunica un pic16f628A con un modulo A7 (GSM/GPS):
;uso del modulo usart a 20 MHz con el pic 16f628A, y comunicacion con el modulo A7, funcionando correctamente tanto enviando como recibiendo
#include "p16f628a.inc"
__CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _CP_OFF
varA EQU 020
varB EQU 021
varC EQU 022
varD EQU 023
varE EQU 024
varF EQU 025
ORG 0
configuro_pic:
CLRF PORTA
CLRF PORTB
MOVLW B'00000111' ;modulo comparador apagado
MOVWF CMCON
BCF STATUS, RP1 ;accedo al banco 1
BSF STATUS, RP0
MOVLW B'00000010' ;portb.1 y portb.2 es entrada los demas salida
MOVWF TRISB
MOVLW B'00100100' ;configuro el registro TXSTA
MOVWF TXSTA
MOVLW D'10' ;cargo el registro SPBRG con la variable correpondiete segun la formula para 115200 baudios
MOVWF SPBRG
BCF STATUS, RP1 ;accedo al banco 0
BCF STATUS, RP0
MOVLW B'10010000'
MOVWF RCSTA
arranque:
BSF PORTB,0
CALL retardo1s
BCF PORTB,0
CALL retardo1s
datos_a_enviar:
MOVLW 'A' ; envia caracter A
CALL RS232_EnviaDato
MOVLW 'T' ; envia caracter T
CALL RS232_EnviaDato
MOVLW '+' ; envia caracter +
CALL RS232_EnviaDato
MOVLW 'C' ; envia caracter C
CALL RS232_EnviaDato
MOVLW 'M' ; envia caracter M
CALL RS232_EnviaDato
MOVLW 'G' ; envia caracter G
CALL RS232_EnviaDato
MOVLW 'F' ; envia caracter F
CALL RS232_EnviaDato
MOVLW '=' ; envia caracter =
CALL RS232_EnviaDato
MOVLW '1' ; envia caracter 1
CALL RS232_EnviaDato
MOVLW H'0D' ; nueva linea
CALL RS232_EnviaDato
MOVLW H'0A' ; nueva linea
CALL RS232_EnviaDato
CALL retardo1s
CALL retardo1s
MOVLW 'A' ; envia caracter A
CALL RS232_EnviaDato
MOVLW 'T' ; envia caracter T
CALL RS232_EnviaDato
MOVLW '+' ; envia caracter +
CALL RS232_EnviaDato
MOVLW 'C' ; envia caracter C
CALL RS232_EnviaDato
MOVLW 'M' ; envia caracter M
CALL RS232_EnviaDato
MOVLW 'G' ; envia caracter G
CALL RS232_EnviaDato
MOVLW 'S' ; envia caracter S
CALL RS232_EnviaDato
MOVLW '=' ; envia caracter =
CALL RS232_EnviaDato
MOVLW '"' ; envia caracter "
CALL RS232_EnviaDato
MOVLW '2'
CALL RS232_EnviaDato
MOVLW '3'
CALL RS232_EnviaDato
MOVLW '6'
CALL RS232_EnviaDato
MOVLW '4'
CALL RS232_EnviaDato
MOVLW '6'
CALL RS232_EnviaDato
MOVLW '2'
CALL RS232_EnviaDato
MOVLW '4'
CALL RS232_EnviaDato
MOVLW '5'
CALL RS232_EnviaDato
MOVLW '6'
CALL RS232_EnviaDato
MOVLW '4'
CALL RS232_EnviaDato
MOVLW '"' ; envia caracter "
CALL RS232_EnviaDato
MOVLW H'0D' ; nueva linea
CALL RS232_EnviaDato
MOVLW H'0A' ; nueva linea
CALL RS232_EnviaDato
CALL retardo1s
CALL retardo1s
MOVLW 'H' ; envia caracter H
CALL RS232_EnviaDato
MOVLW 'O' ; envia caracter O
CALL RS232_EnviaDato
MOVLW 'L' ; envia caracter L
CALL RS232_EnviaDato
MOVLW 'A' ; envia caracter A
CALL RS232_EnviaDato
MOVLW D'26' ; envia caracter ESC
CALL RS232_EnviaDato
MOVLW H'0D' ; nueva linea
CALL RS232_EnviaDato
MOVLW H'0A' ; nueva linea
CALL RS232_EnviaDato
BSF PORTB,0
CALL retardo1s
CALL retardo1s
BCF PORTB,0
verifico_datos:
CALL espera_dato
SUBLW 'A'
BTFSS STATUS,Z
GOTO verifico_datos
CALL espera_dato
SUBLW 'B'
BTFSS STATUS,Z
GOTO verifico_datos
CALL espera_dato
SUBLW 'C'
BTFSS STATUS,Z
GOTO verifico_datos
GOTO ledverde
;---------------envio y recepcion de datos por puerto serial------------
RS232_EnviaDato:
MOVWF TXREG
BCF STATUS, RP1 ;accedo al banco 1
BSF STATUS, RP0
espero:
BTFSS TXSTA,TRMT ;verifico que ya se envio
GOTO espero
BCF STATUS, RP1 ;accedo al banco 1
BCF STATUS, RP0
RETURN
espera_dato:
BTFSS PIR1,RCIF
GOTO espera_dato
si_hay_error:
BTFSC RCSTA,OERR
CALL error1
BTFSC RCSTA,FERR
CALL error2
MOVF RCREG,W
RETURN
error1:
BCF RCSTA,CREN
BSF RCSTA,CREN
RETURN
error2:
MOVF RCREG,W
RETURN
;----------------------------------------------------
ledverde:
BSF PORTB,0
CALL retardo1s
BCF PORTB,0
CALL retardo1s
GOTO ledverde
;-------------zona de retardos-------------
retardo1s:
MOVLW D'1'
MOVWF varD
bucleext4:
MOVLW D'19'
MOVWF varC
bucleext3:
MOVLW D'255'
MOVWF varB
bucleext2:
MOVLW D'255'
MOVWF varA
bucleint1:
NOP
DECFSZ varA,F
GOTO bucleint1
DECFSZ varB,F
GOTO bucleext2
DECFSZ varC,F
GOTO bucleext3
DECFSZ varD,F
GOTO bucleext4
regfina:
MOVLW D'200'
MOVWF varF
bucleext22:
MOVLW D'55'
MOVWF varE
bucleint11:
NOP
DECFSZ varE,F
GOTO bucleint11
DECFSZ varF,F
GOTO bucleext22
RETURN
END
Este codigo envia instrucciones al modulo A7, para que haga llamas o envie sms y tambien puede identificar sms o llamadas para que el pic realice alguna tarea, asi que bueno tienes que estudiarlo para entenderlo... un Saludo