TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: groundman en 21 de Junio de 2007, 17:59:09
-
hola,estoy realizando un proyecto.para realizar una alarma que envia un sms,a uno o varios numeros de telefono prefijados,para alertar de un suceso,e incluso enviar en ese sms,las coordenadas gps donde esta situada la alarma,por si se utilizara para un veiculo.
pero este proyecto lo estoy desarollando por partes,para que si quereis experimentar con ellos,no se lien los menos expertos en la materia.
voy a postear lo mejor posible el codigo,aunque aviso de que nunca he hecho esto,y espero no liar a nadie.
saludos a todos.
-
esta parte que pongo aqui es el codigo asm del programa para visualizar los datos recividos del puerto serie de un gps.que se visualizaran en una pantalla lcd.
;*****************************************
; PROGRAMA : rs232.asm
; Funcion : visualizador coordenadas gps en display
; Serial port config: 38400 baudios,8 bits,paridad = none
;
; Revision : 1.0 7/2/2002 Programa para : PIC16F876
; CPU Clock : 3.6864 MHz Reloj instruccion :
; WDT : Deshabilitado Tipo de reloj : XT
; Code Prot : OFF
;******************************************
LIST P=16F876 ;Se indica el modo de procesador
RADIX HEX ;Sistema de numeracion hexadecimal
INCLUDE "P16f876.inc" ;se incluye la definicion de los
;registros internos
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_OFF &_LVP_OFF &_CPD_OFF &_WRT_ENABLE_OFF
ERRORLEVEL -302
PRINCIPAL_VAR EQU 20h ;direccion de las variables desde 20h
CBLOCK PRINCIPAL_VAR
CounterA
CounterB
CounterC
KEY_1
OFFSET
RESUL
TEMPO1
ENDC
BANK0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
;<<<<<<<<<<<<<SELECCION DE LOS SECTORES DE LA MEMORIA DE PROGRAMA>>>>
;--------IMPORTANTE:
;ANTES DE UBICAR UNA TABLA DEL TIPO (ADDWF PCL,F)TENEMOS QUE INDICAR EL SECTOR DONDE SE UBICA ESE SUBPROGRAMA
;EJM.SI PONEMOS EL SUBPROGRAMA EN EL SECTOR A PARTIR DE LA DIR:100 .PONDREMOS LA LINEA SECTOR_100 ANTES DE LA TABLA DE DATOS
;
SECTOR_000 MACRO
BCF PCLATH,0
BCF PCLATH,1
ENDM
SECTOR_100 MACRO
BSF PCLATH,0
BCF PCLATH,1
ENDM
SECTOR_200 MACRO
BCF PCLATH,0
BSF PCLATH,1
ENDM
SECTOR_300 MACRO
BSF PCLATH,0
BSF PCLATH,1
ENDM
;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
ORG 0x00 ;Inicio en el Vector de Reset
goto INICIO ;Va a la primera instruccion del
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
INICIO clrf PORTA ;borra las salidas de porta
clrf PORTB ;borra las salidas de portb
clrf PORTC ;borra las salidas de portc
clrf KEY_1
BANK1 ;selecciona banco 1
clrf TRISB ;Puerta B como salida
movlw b'11111111' ;configura PORTC para el uso de la USART
movwf TRISC
movlw b'00000110'
movwf ADCON1 ;porta entradas digitales
movlw 0xFF
movwf TRISA
movlw b'00100100' ;Configuracion USART modo alta velocidad 38400 baud
movwf TXSTA ;y activacion de transmision
clrf PIE1 ;prohive interrupciones perifericas
BANK0 ;selecciona banco 0 -------------
movlw b'10010000' ;Configuracion de la usart
movwf RCSTA ;para recepcion continua y habilitacion de la usart
clrf INTCON ;prohive todas las interrupciones
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<PROGRAMA PRINCIPAL DE RECEPCION DE DATOS DEL GPS>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
RECEPCION BANK0
clrf PORTB
call PROG_GPS ;buscar comando nmea
call MEM_DAT ;memorizar datos en registros
call LCD ;visualiza coordenadas
goto INICIO
;<<<<<<----------------------- RETARDO---------------- ------------------------->>>>>>>
RETARDO movlw D'6'
movwf CounterC
movlw D'24'
movwf CounterB
movlw D'168'
movwf CounterA
loop decfsz CounterA,1
goto loop
decfsz CounterB,1
goto loop
decfsz CounterC,1
goto loop
return
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<INICIALIZA LCD>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
LCD clrf INTCON
BANK0
clrf PORTA
BANK1
movlw 0x06
movwf ADCON1
clrf TRISA ; Puerta A como salidas digitales
call UP_LCD
call BORRA_Y_HOME
call DISPLAY_ON_CUR_OFF
call LCD_INI
BANK1
movlw b'00000111'
movwf OPTION_REG
BANK0
clrf OFFSET
call MENS
BUCLE goto INICIO
MENS clrf RESUL
MENS_1 movf OFFSET,W
addwf RESUL,W
call DATOS
iorlw 0
btfsc STATUS,2
return
call LCD_DATO
incf RESUL,F
incf RESUL,F
MOVLW d'28'
XORWF RESUL,W
btfss STATUS,Z
GOTO SALTO1
call LCD_LINEA2 ;para escribir en la segunda
;fila del lcd
SALTO1 movlw d'10'
movwf TEMPO1
goto MENS_1
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<DATOS PARA ORDENAR LAS COORDENADAS EN EL DISPLAY>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DATOS BANK0
SECTOR_000
addwf PCL,F
movf KEY_1_L,W
return
movf KEY_2_L,W
return
movlw 0xdf ;simbolo grados
return
movf KEY_3_L,W
return
movf KEY_4_L,W
return
movlw "'" ;simbolo minutos
return
;movf KEY_5_L,W
;return
movf KEY_6_L,W
return
movf KEY_7_L,W
return
movf KEY_8_L,W
return
movf KEY_9_L,W
return
movlw 0x22 ;simbolo segundos
return
;movf KEY_10_L,W
;return
movf KEY_11_L,W
return
movlw " ";movf KEY_12_L,W
return
movlw " ";movf KEY_13_L,W
return
movf KEY_14_L,W
return
movf KEY_15_L,W
return
movlw 0xdf ;simbolo grados
return
movf KEY_16_L,W
return
movf KEY_17_L,W
return
movlw "'" ;simbolo minutos
return
;movf KEY_18_L,W
;return
movf KEY_19_L,W
return
movf KEY_20_L,W
return
movf KEY_21_L,W
return
movf KEY_22_L,W
return
movlw 0x22 ;simbolo segundos
return
;movf KEY_23_L,W
;return
movf KEY_24_L,W
return
retlw 0x00
org 0x200
INCLUDE "recepcion_usart_r14.inc"
org 0x300
INCLUDE "lcd_cxx.inc"
END
AQUI PONGO EL CODIGO DEL ARCHIVO recepcion_usart_r14.inc QUE DEBEREIS INCLUIR EN EL PROYECTO
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<recepcion_usart_r14.inc>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
USART_VAR EQU 0x35 ;direccion de inicio del bloque para meter datos en variables
CBLOCK USART_VAR
GGA ;temporal offset trama $GPGGA
GPS ;temporal byte recivido del gps
KEY_1_L
KEY_2_L
KEY_3_L
KEY_4_L
KEY_5_L
KEY_6_L
KEY_7_L
KEY_8_L
KEY_9_L
KEY_10_L
KEY_11_L
KEY_12_L
KEY_13_L
KEY_14_L
KEY_15_L
KEY_16_L
KEY_17_L
KEY_18_L
KEY_19_L
KEY_20_L
KEY_21_L
KEY_22_L
KEY_23_L
KEY_24_L
ENDC
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<TABLA $GPGGA>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DAT_GGA SECTOR_200
movf GGA,W
addwf PCL,F
retlw "$"
retlw "G"
retlw "P"
retlw "G"
retlw "G"
retlw "A"
retlw ","
return
;<<<<<<<<<<<<<<<<<<<<<<<BUSCAR CABEZERA MENSAGE NMEA $GPGGA>>>>>>>>>>>>>>>>>>>
PROG_GPS BANK1
movlw .5 ;(.5 =38400 baudios crystal 3.6864 MHz)
movwf SPBRG
BANK0
COMAN_GPS clrf GGA
clrf GPS
COMAN_GPS2 call LEE_DATO ;MOVWF PORTB
movwf GPS ;carga en el acumulador el valor capturado por la usart
call DAT_GGA ;salta a tabla $GPGGA
incf GGA,F
xorwf GPS,F ;compara el valor recivido con el de la tabla
btfss STATUS,Z ;si es el mismo sigue comparando en la tabla
goto BORRA_RET ;si no empieza de nuevo
xorlw "A" ;cuando encuentres el caracter "A",salta a MEM_DAT.(ultimo caracter de $CPGGA)
btfss STATUS,Z
goto COMAN_GPS2
goto MEM_DAT
BORRA_RET clrf GGA
goto COMAN_GPS
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<METE EN LOS GPR LOS DATOS DE LAS COORDENADAS>>>>>>>>>>>>>>>
MEM_DAT
BANK0
call LEE_DATO
xorlw ","
btfss STATUS,Z ;comprueva primera coma encontrada
goto MEM_DAT
MEM_DAT2 call LEE_DATO
xorlw ","
btfss STATUS,Z ;comprueva segunda coma encontrada
goto MEM_DAT2
call LEE_DATO
movwf KEY_1_L
call LEE_DATO
movwf KEY_2_L
call LEE_DATO
movwf KEY_3_L
call LEE_DATO
movwf KEY_4_L
call LEE_DATO
movwf KEY_5_L
call LEE_DATO
movwf KEY_6_L
call LEE_DATO
movwf KEY_7_L
call LEE_DATO
movwf KEY_8_L
call LEE_DATO
movwf KEY_9_L
call LEE_DATO
movwf KEY_10_L
call LEE_DATO
movwf KEY_11_L
call LEE_DATO
movwf KEY_12_L
call LEE_DATO
movwf KEY_13_L
call LEE_DATO
movwf KEY_14_L
call LEE_DATO
movwf KEY_15_L
call LEE_DATO
movwf KEY_16_L
call LEE_DATO
movwf KEY_17_L
call LEE_DATO
movwf KEY_18_L
call LEE_DATO
movwf KEY_19_L
call LEE_DATO
movwf KEY_20_L
call LEE_DATO
movwf KEY_21_L
call LEE_DATO
movwf KEY_22_L
call LEE_DATO
movwf KEY_23_L
call LEE_DATO
movwf KEY_24_L
call LEE_DATO
call LCD
RETURN
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<LEE DATO USART>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
LEE_DATO BANK0
btfss PIR1,RCIF ;espera al proximo caracter
goto LEE_DATO
btfsc RCSTA,OERR
call BORR_US ;Error de Sobreescritura
btfsc RCSTA,FERR
call BORR_US ;Error de Trama
btfsc PIR1,TXIF
movf RCREG,W ;Lectura dato recibido
return
;<<<<<<<<<<<<<<<<<<<<<<<<BORRAR USART>>>>>>>>>>>>>>>>>>>>>>>>>>
BORR_US bcf RCSTA,CREN
movf RCREG,w
movf RCREG,w
movf RCREG,w
bsf RCSTA,CREN
return
Y AQUI PONGO EL ARCHIVO lcd_cxx.inc QUE ENCONTRE POR AHI PARA LA GESTION DE LA LCD,QUE TAMBIEN SE DEBERA INCLUIR EN EL PROYECTO.
;El conjunto de rutinas que se presentan a continuaci¢n permiten realizar
;las tareas b sicas de control del m¢dulo de visualizaci¢n LCD. Se emplean
;con los PIC 16c8xx. En el programa principal se deber reservar memoria
;para el bloque de variables que utiliza el LCD del modo:
LCD_VAR EQU 0x5A ;direccion de inicio del bloque para meter datos en variables
;BLOQUE DE ETIQUETAS
#define ENABLE bsf PORTA,2 ;Activa E
#define DISABLE bcf PORTA,2 ;Desactiva
#define LEER bsf PORTA,1 ;Pone LCD en Modo RD
#define ESCRIBIR bcf PORTA,1 ;Pone LCD en Modo WR
#define OFF_COMANDO bcf PORTA,0 ;Desactiva RS (modo comando)
#define ON_COMANDO bsf PORTA,0 ;Activa RS (modo datos)
CBLOCK LCD_VAR
LCD_TEMP_2 ;Inicio de las variables. Ser la primera direcci¢n libre
; disponible
LCD_TEMP_1
ENDC
LIST
;RUTINA UP_LCD: Con esta rutina se configura el PIC para que trabaje con el LCD.
UP_LCD
BANK1 ;Banco 1
clrf PORTB ;RB <0-7> salidas digitales
clrf PORTA ;RA <0-4> salidas digitales
BANK0 ;Banco 0
OFF_COMANDO ;RS=0
DISABLE ;E=0
return
;RUTINA LCD_BUSY: Con esta rutina se chequea el estado del
;flag BUSY del m¢dulo LCD, que indica, cuando est activado, que el
;m¢dulo a£n no ha terminado el comando anterior. La rutina espera a
;que se complete cualquier comando anterior antes de retornar al
;programa principal, para poder enviar un nuevo comando.
LCD_BUSY LEER ;Pone el LCD en Modo RD
BANK1
movlw H'FF'
movwf PORTB ;Puerta B como entrada
BANK0 ;Selecciona el banco 0
ENABLE ;Activa el LCD
nop
L_BUSY btfsc PORTB,7 ;Chequea bit de Busy
goto L_BUSY
DISABLE ;Desactiva LCD
BANK1
clrf PORTB ;Puerta B salida
BANK0
ESCRIBIR ;Pone LCD en modo WR
return
;RUTINA LCD_E: Se trata de una peque¤a rutina que se encarga de generar
;un impulso de 1æ s (para una frecuencia de funcionamiento de 4 Mhz)
;por la patita de salida de la Puerta A RA2, que se halla conectada
;a la se¤al E (Enable) del m¢dulo LCD. Con esta rutina se pretende activar
;al m¢dulo LCD.
LCD_E ENABLE ;Activa E
nop
DISABLE ;Desactiva E
return
;RUTINA LCD_DATO: Es una rutina que pasa el contenido cargado en el
;registro W, el cual contiene un car cter ASCII, a la PUERTA B, para
;visualizarlo por el LCD o escribirlo en la CGRAM.
LCD_DATO OFF_COMANDO ;Desactiva RS (modo comando)
movwf PORTB ;Valor ASCII a sacar por PORTB
call LCD_BUSY ;Espera a que se libere el LCD
ON_COMANDO ;Activa RS (modo dato)
call LCD_E ;Genera pulso de E
return
;RUTINA LCD_REG: Rutina parecida a la anterior, pero el contenido de W
;ahora es el c¢digo de un comando para el LCD, que es necesario pasar
;tambi‚n a la PUERTA B para su ejecuci¢n.
LCD_REG OFF_COMANDO ;Desactiva RS (modo comando)
BANK0
movwf PORTB ;C¢digo de comando
call LCD_BUSY ;LCD libre?.
call LCD_E ;S¡. Genera pulso de E.
return
;RUTINA LCD_INI: Esta rutina se encarga de realizar la secuencia de
;inicializaci¢n del m¢dulo LCD de acuerdo con los tiempos dados por
;el fabricante (15 ms). Se especifican los valores de DL, N y F,
;as¡ como la configuraci¢n de un interfaz de 8 l¡neas con el bus
;de datos del PIC, y 2 l¡neas de 16 caracteres de 5 x 7 pixels.
LCD_INI
movlw b'00111000'
call LCD_REG ;C¢digo de instrucci¢n
call LCD_DELAY ;Temporiza
movlw b'00111000'
call LCD_REG ;C¢digo de instrucci¢n
call LCD_DELAY ;Temporiza
movlw b'00111000'
call LCD_REG ;C¢digo de instrucci¢n
call LCD_DELAY ;Temporiza
return
;RUTINA BORRA_Y_HOME: Borra el display y retorna el cursor a la posici¢n 0.
BORRA_Y_HOME movlw b'00000001' ;Borra LCD y Home.
call LCD_REG
return
;RUTINA DISPLAY_ON_CUR_OFF: Control del display y cursor.
;Activa el display y desactiva es cursor
DISPLAY_ON_CUR_OFF movlw b'00001100' ;LCD on, cursor off.
call LCD_REG
return
;RUTINA LCD_LINEA2
LCD_LINEA2 movlw 0xC0
call LCD_REG
return
;RUTINA LCD_LINEA1
LCD_LINEA1 movlw 0x80
call LCD_REG
return
;RUTINA LCD_DELAY: Se trata de un rutina que implementa un retardo
;o temporizaci¢n de 5 ms. Utiliza dos variables llamadas LCD_TEMP_1
;y LCD_TEMP_2, que se van decrementando hasta alcanzar dicho tiempo.
LCD_DELAY clrwdt
movlw 10
movwf LCD_TEMP_1
clrf LCD_TEMP_2
LCD_DELAY_1 decfsz LCD_TEMP_2,F
goto LCD_DELAY_1
decfsz LCD_TEMP_1,F
goto LCD_DELAY_1
return
LIST
-
el circuito lo tengo montado en el micro pic'trainer ,he utilizado el 16F876 con un cristal de 3.6864Mhzy los unicos pin que se utilizan son:
RA0 para el pin RS de la lcd=pin4
RA1 para el pin R/W de la lcd=pin5
RA2 para el pin E de la lcd=pin6
RB0 para el pin D0 de la lcd=pin7
RB1 para el pin D1 de la lcd=pin8
RB2 para el pin D2 de la lcd=pin9
RB3 para el pin D3 de la lcd=pin10
RB4 para el pin D4 de la lcd=pin11
RB5 para el pin D5 de la lcd=pin12
RB6 para el pin D6 de la lcd=pin13
RB7 para el pin D7 de la lcd=pin14
y de la salida del GPS se conecta al pin26= RX del pic.pero no sin antes haber pasado por una puerta logica,para adaptar los 3V que entrega el GPS a los 5V que necesita el pic.
si hay alguna duda postearla aqui.
ahora boy a ir haciendo el codigo para la lectura de los comandos AT de un mobil que disponga de hscds,como es el ericson t28. :-)
-
esta seria la forma en que se visualizarian los datos,y se actualizarian cada segundo.a no ser que el gps entregue los datos mas rapido.
(http://img484.imageshack.us/img484/2768/coordenadas0px0.th.jpg) (http://img484.imageshack.us/my.php?image=coordenadas0px0.jpg)
-
podrias explicar un poco sobre el hardware y que circuitos usas aparte del PIC.
-
hola,pues no se exactamente que te hace falta.
el circuito es muy sencillo,aparte de colocarle el cristal y el circuito de reset y alimentaciones,lo unico que hay que hacer es conectar parte de los pin del PORTA y PORTB a una pantalla lcd.que los he descrito mas arriba.
yo he utilizado una pantalla de 2 lineas 16 caracteres.el WM-C1602M pero creo que sirve cualquier display lcd.compatible Hitachi HD44780
y despues hay que conectar un cable miniusb al gps que tendras que cortar para sacar los dos cables que hacen falta,el de masa y el txd.tendrias que mirar si tu gps tiene este conector para sacar las señales,yo tengo un holux gr-236-bt,es un gps bluetoot que dispone de salida serie.
este cable txd hay que conectarlo a una puerta logica,para adaptar los 3v que suministra el gps,al pic que le hacen falta 5v.
yo he utilizado el SN74LS32.es un circuito integrado que tiene 4 puertas or.se utiliza solo una con las dos entradas conectadas entre si,el txd del GPS se conectan a estas y la salida de la puerta or,se la conectamos al pin 18 (rx)del 16F876.
si te hace falta alguna aclaracion mas,dilo por aqui. :)
-
ah,se me olvidaba.en el proyecto tambien hay que incluir el archivo P16F876.INC que viene incluido en el MPLAB.
-
hola, la parte que no entiendo es la del GPS, podrias colgar una imagen o un link del modulo que estas usando?
-
¿No existe una librería que funcione en ccs?
Tengo un GPS que Tiene RS232, puedo usar-lo con este codigo?
Salu2
-
no es un modulo,solo es un receptor GPS bluetoot que dispone de salida serie en un conector tipo miniusb.
aqui pongo una imagen de cuando hize las pruevas con dos cables,uno de masa y el otro tx.
luego ya me compre un cable miniusb y lo corté,para no tenerlo tan chapucero.
si te compras un modulo GPS lo mas seguro es que te cueste mas caro,y no traeria la opcion de bluetoot.
para sacarle los cables te recomiendo mirar en el manual de usuario del gps que tengas.y si no disponnes de uno,te recomiendo que busques uno que la frecuencia de actualizacion sea de menos de 1 segundo.ya que cuando vas por autovia,y en una salida se bificulta en dos mas ,un segundo es poco.
yo he visto este:http://www.pcdemano.com/modules.php?name=News&file=article&sid=12101
y estoy pensando en comprarlo.
(http://img521.imageshack.us/img521/764/cablesenholuxhg1.th.jpg) (http://img521.imageshack.us/my.php?image=cablesenholuxhg1.jpg)
en cuanto a codigo,solo entiendo el ensamblador.
de momento no tengo tanto tiempo como para empezar a aprender C.
saludos.