# programas para pic18f452



## Sergio Ureña (Nov 22, 2006)

Hola , espero que me puedan ayudar , si es posible que me faciliten programitas pequeños con ese pic , para aprender a manejarlo mejor, codigos en assembler, gracias de antemano.


----------



## sagueso (Nov 23, 2006)

Hola.
Tengo algunos programas para ese PIC, pero exactamente qué módulos quiere utilizar?


----------



## Sergio Ureña (Nov 25, 2006)

quisiera usar modulo de comunicacion , rs232, rs485, I2C, usart y el modulo conversor AD.


----------



## sagueso (Nov 26, 2006)

Tengo un programa que lee una de las entrada analogas del PIC y transmite su valor al computador por el modulo USART asincronico (para emplear el max232). A que correo le envio el archvio.


----------



## Turkito (Nov 26, 2006)

hermanito puedes subir el archivo al foro! para que sea de utilidad para todos..


----------



## sagueso (Nov 29, 2006)

Hola.
Este programa es uno de los ultimos en que estoy trabajando, Permite el manejo del ISD25120. Yo empleo el USART para unas opciones de configuración desde el computador.

Está configurada la interrupción del Rx, con lo cual se genera una interrupción cada vez que el PIC recibe un dato. El modulo usart esta configurado a 9600 baudios, datos de 8 bits sin paridad y 1 bit stop, con un XT de 4MHz

Todas las tareas estan en funciones independientes con lo cual se pueden utilizar las funciones individualmente. Por ejemplo si no quiere trabajar con interrupciones no se necesita configurar INTCON, y en la parte del programa donde se quiera recibir un dato se coloca :
call URX
De esta manera el PIC queda en modo espera hasta que le llegue un dato por el USART.

Si lo que quiere es trasnmitir un dato, se llama la función UTX, por ejemplo si quiero trasnmitir el caracter 'G' se debe escribir:
 movlw  'G'
 call  UTX

Y ya se transmite el dato.

Ahora si se quiere utilizar el CAD solo se debe colocar en W el valor de configuración de ADCON0 y se llama la función CAD. 

Del código puede tomar las funciones que vaya a necesitar, pero recuerde agregar las lineas
referentes a la configuración de cada módulo del PIC, donde se mencionan los TRISC,TRSISA,TRISE, ADCON1, TXSTA,SPBRG,etc.  El significado de cada valor para estos registros los puede consultar en el datasheet del PIC, aunque si tiene alguna duda, le puedo colaborar con gusto, pero no se preocupe si no respondo rápidamente.

Aquí está el código:

;OSCILADOR DE 4MHZ

;**********************************************************************************
;La señal de sonido debe permanecer un tiempo pequeño en el rango de valores y luego
;durar otro tiempo en un rango inferiro al minimo de la señal del aplauso configurada




;Programa para la operación del ISD251200.

;Se comunica con el computador, el cual, le da las ordenes de grabar y reproducir.

;El PIC está siempre en modo recepción por interrupciones.
;Se tiene que cada ranura del ISD es de 0.5 seg, luego se tiene un temporizador de
;ese valor para las acciones grabar y reproducir slots

;Si el computador envia la orden de grabar:
;El computador envia 'G',luego el byte de la dirección donde se va agrabar y el byte
;Con el tiempo de grabacion.
;Después comienza la reproducción del sonido.
;El PIC debe recibir la 'G', reconocer el modo grabar y recibir el byte de la 
;dirección a grabar, seguido de la activación del ISD en modo grabar.
;La grabación sólo se mantiene durante el tiempo de grabación configurado en el PIC,

;Si el computador envía la orden de reproducir:
;El computador envía 'R',luego el byte con la dirección a reproducir.
;El PIC debe recibir 'R', luego la dirección y el byte para el tiempo. enviarla al
; ISD, para después activar
; el modo reproducción.
;Se activa el temporizador y después de terminado vuelve a reproducir esa misma
;dirección de forma automática quedando en un ciclo.

;Orden reset
;El computador envía 'S'.
;El PIC debe recibir 'S' y hacer un reset por instrucción, con esto se puede salir
;de cualquier modo en el que se encuentre como el de reproducción.

;Si se da la orden de reproduccion multiple:
;El computador envia 'F', luego envia las posiciones que va a reproducir, y el
; byte FF para anunciar que ahe termiando de cargar los datos. Luego debe enviar
;el byte con el tiempo de cada slot
;El PIC debe recibir el comando 'F', entrar en modo recepción y cada vez que reciba
;un dato lo compara con FFh para saber si termina de guardar, cuando termina, recibe
;el tiempo de cada slot y comienza el cilo para reproducir las direcciones grabadas


;**********************************************************************************

;**********************************************************************************
;***** Definicion de pines *****

;1   	MCLR   	ENTRADA ejecutar un reset en el circuito
;2	RA0     	ENTRADA Señal del micrófono
;3	RA1     	
;4	RA2     	
;5	RA3     	
;6	RA4    	
;7	RA5    
;8	RE0      
;9	RE1    
;10	RE2     
;11	VDD    	Voltaje de polarización +5V
;12	VSS    	Referencia a tierra
;13	OSC1	XT
;14	OSC2	XT
;15	RC0  	SALIDA CE
;16	RC1    	SALIDA PD
;17	RC2    	SALIDA P/R
;18	RC3     	ENTRADA EOM
;19	RD0      	SALIDA LED testigo
;20	RD1
;21	RD2    
;22	RD3   
;23	RC4       	SALIDA A8
;24	RC5    	SALIDA A9
;25	RC6      	SALIDA Tx
;26	RC7      	ENTRADA Rx
;27	RD4     
;28	RD5     
;29	RD6     
;30	RD7  	
;31	VSS    	Referencia a tierra
;32	VDD    	Voltaje de polarización +5V
;33	RB0    	SALIDA A0 
;34	RB1    	SALIDA A1 
;35	RB2     	SALIDA A2 
;36	RB3     	SALIDA A3 
;37	RB4    	SALIDA A4 
;38	RB5   	SALIDA A5 
;39	RB6     	SALIDA A6 
;40	RB7     	SALIDA A7 
;*************************************************************************************

;*************************************************************************************
;Mapeo de RAM
;0x20-0x3F = Variables matematias de usuario
;0x40-0x50 = Regsitros varios.
;0x6D-0x7F = Almacenar variables matematicas


;0xA0-0XAF = Registros para los datos del LCD primer renglon
;0xB0-0XBF = Registros para los datos del LCD segundo renglon

;*************************************************************************************

	list p=18f452
	#include <p18f452.inc>


;*************************************************************************************
;***** Definición de registros especiales *****
;Banco 0

indf0	equ	0xFEF	;Dato 1
indf1	equ	0xFE7	;Dato 2
indf2	equ	0xFDF	;ans

status	equ	0xFD8	;Registro de banderas.
bsr	equ	0xFE0

fsr0l	equ	0xFE9
fsr0h	equ	0xFEA
fsr1l	equ	0xFE1
fsr1h	equ	0xFE2
fsr2l	equ	0xFD9
fsr2h	equ	0xFDA
postinc0	equ	0xFEE

trisA	equ	0xF92	;Configuracion de los puertos
trisB	equ	0xF93
trisC	equ	0xF94
trisD	equ	0xF95
trisE	equ	0xF96

portA	equ	0xF80	;Datos de los puertos
portB	equ	0xF81
portC	equ	0xF82
portD	equ	0xF83
portE	equ	0xF84

adcon1	equ	0xFC1	;Conversor analogo-digital
adcon0	equ	0xFC2
adresl	equ	0xFC3
adresh	equ	0xFC4

intcon	equ	0xFF2
pie1	equ	0xF9D
pir1	equ	0xF9E

pcl	equ	0xFF9
pclath	equ	0xFFA

wreg	equ	0xFE8

rcsta	equ	0xFAB	;Configuracion del RX
txsta	equ	0xFAC	;Configuracion del TX
txreg	equ	0xFAD	;DAto a transmitir
rcreg	equ	0xFAE	;Dato  recibido
spbrg	equ	0xFAF	;Velocidad de comunicacion



;*************************************************************************************


;*************************************************************************************
;Banco 0
;Variables ayuda para CAD
resA1	equ	0x080	;Contador de caracteres

;Variables ayuda para ESPERA
resB1	equ	0x082	;Contadores
resB2	equ	0x083
resB3	equ	0x084

;Variables ayuda para INTER,RETINTER
wtemp	equ		0x086	;Temporal para WREG
bsrtemp	equ	0x087	;temporal para BSR
statemp 	equ	0x088	;TEmporal para status

;Variables para la interrupcion de recepcion
dato	equ	0x0A0	;Valor que se recibio
contador	equ	0x0A1	;Coantador de datos recibidos
tiempo	equ	0x0A2	;Tiempo de cada slot

;Variables para el manejo de la señla análoga
minimo	equ	0x0B0	;Valor minimo para la señal
maximo 	equ	0x0B1	;Valor maximo para la señal
señal	equ	0x0B2	;Señal de entrada
limite1	equ	0x0B4	;Contador para la señal en rango
limite2	equ	0x0B5	;Contador para señal en silencio
conta	equ	0x0B6	;Contador para cada duty cicle

;Posiciones donde se guardaran los datos
dir1	equ	0x0C0	;Posicion inicial

;*************************************************************************************


;*************************************************************************************
;Definicion de bits especiales
#define	rp0	status,5

#define	go	adcon0,2	;Inicia la conversión AD
#define	c	status,0
#define	z	status,2
#define	gie	intcon,7	;Habiltador de interrupciones

#define	rcif	pir1,5	;Bandera de interrupcion del RX
#define	trmt	txsta,1	;Indica si se esta transmitiendo

#define	ce	portC,0	;SAlida habilitar el ISD
#define	pd	portC,1	;SAlida activa operación del ISD
#define	pr	portC,2	;Salida reproducir o grabar del ISD
#define	eom	portC,3	;Entrada para indicar el fin de mensaje

#define	led	portD,0	;LED testigo

;*************************************************************************************
;Rutinas 
	org	0x00
	goto	INICIO
	org	0x08
	goto	INTER

;**********************************************************************************

;*************************************************************************************
;Atiende las interrupciones
INTER	movff	wreg,wtemp	;wtemp = wreg
	movff	bsr,bsrtemp	;bsrtemp = bsr
	movff	status,statemp	;statemp = status

	btfsc	rcif	;rcif =? 1
	goto	INTRX	;Interrupcion por recepcion	

	goto	RETINT	;Retorno de interrupcion
;*************************************************************************************

;**********************************************************************************
;Funcion que atiende la interrupcion de recibir comandos
INTRX	bcf	rcif	;Borra la bandera de interrupcion
	bcf	led	;Apaga el LED
	movff	rcreg,dato	;dato = rcreg; Valor recibido

	movlw	'G'	;W = 'G'
	cpfseq	dato	;dato =? W.
	goto	INTRX_1	;No recibio 'G'

	goto	GRABAR	;Recibió orden de grabar

INTRX_1	movlw	'R'	;W = 'R'
	cpfseq	dato	;dato =? W.
	goto	INTRX_2	;No recibio 'R'

	goto	REPRO	;Recibió orden de reproducir

INTRX_2	movlw	'F'	;W = 'F'
	cpfseq	dato	;dato =? W.
	goto	INTRX_3	;Continua comparando

	goto	FRASE	;Recibió la orden de frase

INTRX_3	movlw	'm'	;W = 'm'
	cpfseq	dato	;dato =? W.
	goto	INTRX_4	;No recibio 'm'

	goto	MINIMO	;Recibió orden de minimo

INTRX_4	movlw	'M'	;W = 'M'
	cpfseq	dato	;dato =? W.
	goto	INTRX_5	;No recibio 'M'

	goto	MAXIMO	;Recibió orden de maximo

INTRX_5	movlw	'N'	;W = 'N'
	cpfseq	dato	;dato =? W.
	goto	INTRX_6	;No recibio 'N'

	goto	ALTO	;Recibió orden de ciclo alto

INTRX_6	movlw	'n'	;W = 'N'
	cpfseq	dato	;dato =? W.
	goto	INTRX_S	;No recibio 'n'

	goto	BAJO	;Recibió orden de ciclo bajo

INTRX_S	goto	RETINT	;Retorna de la interrupción
;**********************************************************************************

;**********************************************************************************
;Funcion para cambiar el valor del ciclo alto del aplauso
ALTO	call	URX	;Recibe el nuevo mínimo
	movff	rcreg,limite1	;limite1 = rcreg.
	goto	RETINT	;Retorna de la interrupcion
;**********************************************************************************

;**********************************************************************************
;Funcion para cambiar el valor del ciclo bajo del aplauso
BAJO	call	URX	;Recibe el nuevo mínimo
	movff	rcreg,limite2	;limite2 = rcreg.
	goto	RETINT	;Retorna de la interrupcion
;**********************************************************************************


;**********************************************************************************
;Funcion para cambiar el valor mínimo
MINIMO	call	URX	;Recibe el nuevo mínimo
	movff	rcreg,minimo	;minimo = rcreg.
	goto	RETINT	;Retorna de la interrupcion
;**********************************************************************************

;**********************************************************************************
;Funcion para cambiar el valor máximo
MAXIMO	call	URX	;Recibe el nuevo máximo
	movff	rcreg,maximo	;maximo = rcreg.
	goto	RETINT	;Retorna de la interrupcion
;**********************************************************************************

;**********************************************************************************
;Funcion para cuando se recibe el comando de grabar
GRABAR	call	URX	;Recibe la dirección donde se grabara
	movff	rcreg,dato	;dato = rcreg.
	movff	dato,portB	;portB = dato. Coloca la dirección

	call	URX	;Recibe el tiempo de reproducción

	bsf	ce	;Desactiva el ISD
	bcf	pd	;Activa PD
	bcf	pr	;activa la grabación
	movlw	.5	;W = 5
	call	ESPERA2	;Tiempo de Tpud
	bcf	ce	;Inicia la grabación

	movf	rcreg,0	;W = rcreg
	call	ESPERA	;Espera el tiempo de un slot

	bsf	ce	;Desactiva el integrado
	bsf	pd	;Desactiva el integrado	
	movlw	.5	;W = 5
	call	ESPERA2	;Tiempo TPDR

	goto	RETINT	;Retorna de la interrupción
;**********************************************************************************

;**********************************************************************************
;Funcion para cuando se recibe el comando de reproducir
;Recibiendo la dirección a reproducir y quedando en un ciclo reproduciendo sólo ese
;slot.
REPRO	call	URX	;Recibe la dirección a reproducir
	movff	rcreg,dato	;dato = rcreg.
	movff	dato,portB	;portB = dato. Coloca la dirección

	call	URX	;Recibe el tiempo de grabación

	bsf	ce	;Deshabilta el ISD
	bcf	pd	;Activa PD
	bsf	pr	;activa la reproducción
	movlw	.5	;W = 5
	call	ESPERA2	;Tiempo Tpud
	bcf	ce	;Inicia la reproducción

;	call	ESPERA	;Espera el tiempo de un slot
;	movf	rcreg,0	;W = rcreg

REPRO_1	btfsc	eom	;eom =? 0
	goto	REPRO_1	;Continua reproducinedo 

	bsf	ce	;Desactiva el integrado
	bsf	pd	;Desactiva el integrado
	movlw	.5	;W = 5
	call	ESPERA2	;Tiempo Tpud

	goto	RETINT	;Retorna de la interrupcion
;**********************************************************************************

;**********************************************************************************
;Funcion para reproducir ciertas posiciones de memoria
;Recibiendo las direcciónes a reproducir y luego el timepo de rerproducción de cada
;slot.
FRASE	clrf	contador	;contador = 0
	clrf	fsr0h	;fsr0h = 0. Banco 0
	movlw	dir1	;W = &dir1
	movwf	fsr0l	;fsr0l 0 W. Direccion de incio

FRASE_1	call	URX	;Recibe la dirección a reproducir
	movff	rcreg,dato	;dato = rcreg.

	incf	contador,1	;contador += 1.
	movff	dato,postinc0	;indf0 = dato. fsr0 +1

	movlw	h'FF'	;W = FFh
	cpfseq	dato	;dato =? W.
	goto	FRASE_1	;Continua recibiendo los datos

	call	URX	;Recibe el tiempo de cada slot
	movff	rcreg,tiempo	;tiempo = rcreg

	clrf	fsr0h	;fsr0h = 0. Banco 0
	movlw	dir1	;W = &dir1
	movwf	fsr0l	;fsr0l 0 W. Direccion de incio

	decf	contador,1	;contador -= 1

FRASE_2	movff	postinc0,portB	;portB = indf0. frs0 +1

	bsf	ce	;Desactiva el ISD	
	bcf	pd	;Activa PD
	bsf	pr	;activa la reproducción
	movlw	.5	;W = 5
	call	ESPERA2	;Tiempo Tpud
	bcf	ce	;Inicia la reproducción

;	movf	tiempo,0	;W = tiempo.
;	call	ESPERA	;Espera el tiempo de un slot

FRASE_3	btfsc	eom	;eom =? 0
	goto	FRASE_3	;Continua reproducinedo 

	bsf	ce	;Desactiva el integrado
;	bsf	pd	;Desactiva el integrado	
;	movlw	.5	;W = 5
;	call	ESPERA2	;Tiempo Tpud

	decfsz	contador,1	;contador -= 1 =? 0
	goto	FRASE_2	;Termina de reprducir las posiciones


	goto	RETINT	;Retorna de la interrupcion
;**********************************************************************************

;****************************************************************************************
;Rutina para transmitir el dato que este en W.
UTX	movwf	txreg	;txreg = W. Carga el dato a transmitir
UTX2	btfss	trmt	;Para saber cuando termino la transmision
	goto	UTX2	;Sigue esperando
	return		;Retorna al lugar del salto
;****************************************************************************************

;****************************************************************************************
;Rutina para recibir un dato y dejarlo en W.
URX	btfss	rcif	;Para saber cuando recibe
	goto	URX	;Sigue esperando
	movff	rcreg,wreg	;wreg = rcreg.
	bcf	rcif	;Borra el estado de la bandera
	return		;Retorna al lugar del salto
;****************************************************************************************

;*************************************************************************************
;Función para restaurar los valores de seguridad y retornar de la interrupcion
RETINT	movff	statemp,status	;status = statemp
	movff	wtemp,wreg	;wreg = wtemp
	movff	bsrtemp,bsr	;bsr = bsrtemp
	retfie		;Retorno de interrupción
;*************************************************************************************

;**********************************************************************************
;Rutina para el conversor que toma el valor de W para configurar adcon0
CAD	movff	wreg,wtemp	;wtemp = wreg
	movff	bsr,bsrtemp	;bsrtemp = bsr
	movff	status,statemp	;statemp = status

	movlb	.0	;Banco 0
	movwf	adcon0	;adcon0 = W.
	movlw	.15	;W = 
	movwf	resA1	;resA1 = W. Tiempo de espera
CAD_1	decfsz	resA1,1	;resA1 -= 1 =? 0
	goto	CAD_1	;Espera el tiempo necesario
	bsf	go	;Empieza la conversion
CAD_2	btfsc	go	;go =? 0.
	goto	CAD_2	;Sigue digitalizando

	movff	statemp,status	;status = statemp
	movff	wtemp,wreg	;W = wtemp
	movff	bsrtemp,bsr	;bsr = bsrtemp
	return		;Retorna
;****************************************************************************************		

;**********************************************************************************
;Rutina que toma el valor de W y realiza una espera de un tiempo T = W * 10mS
ESPERA2	movff	wreg,wtemp	;wtemp = wreg
	movff	bsr,bsrtemp	;bsrtemp = bsr
	movff	status,statemp	;statemp = status

	movwf	resB1	;resB1 = W.
ESPERA2_1	movlw	.156	;W = 
	movwf	resB2	;resB2 = W
ESPERA2_2	movlw	.20	;W = 
	movwf	resB3	;resB3 = W.
ESPERA2_3	decfsz	resB3,1	;resB3 = resB3 - 1 =?0.
	goto	ESPERA2_3	;Si aun 'resB3' no es cero vuelve a decrementarlo.
	decfsz	resB2,1	;resB2 = rsB2 - 1 =?0
	goto	ESPERA2_2	;Si aun 'resB2' no es cero realizo otra vez el cont1.
	decfsz	resB1,1	;resB1 = resB1 - 1 =?0
	goto	ESPERA2_1	;Si aun 'resB1' no es cero realizo otra vez el cont2.

	movff	statemp,status	;status = statemp
	movff	wtemp,wreg	;W = wtemp
	movff	bsrtemp,bsr	;bsr = bsrtemp
	return		;Vuelvo a la rutina que llamo la funcion 
;**********************************************************************************

;**********************************************************************************
;Rutina que toma el valor de W y realiza una espera de un tiempo T = W * 100mS
ESPERA	movff	wreg,wtemp	;wtemp = wreg
	movff	bsr,bsrtemp	;bsrtemp = bsr
	movff	status,statemp	;statemp = status

	movwf	resB1	;resB1 = W.
ESPERA_1	movlw	.165	;W = 
	movwf	resB2	;resB2 = W
ESPERA_2	movlw	.200	;W = 
	movwf	resB3	;resB3 = W.
ESPERA_3	decfsz	resB3,1	;resB3 = resB3 - 1 =?0.
	goto	ESPERA_3	;Si aun 'resB3' no es cero vuelve a decrementarlo.
	decfsz	resB2,1	;resB2 = rsB2 - 1 =?0
	goto	ESPERA_2	;Si aun 'resB2' no es cero realizo otra vez el cont1.
	decfsz	resB1,1	;resB1 = resB1 - 1 =?0
	goto	ESPERA_1	;Si aun 'resB1' no es cero realizo otra vez el cont2.

	movff	statemp,status	;status = statemp
	movff	wtemp,wreg	;W = wtemp
	movff	bsrtemp,bsr	;bsr = bsrtemp
	return		;Vuelvo a la rutina que llamo la funcion 
;**********************************************************************************

;**********************************************************************************
;Función para generar las señales para reproducir, en W debe estar la dirección


;**********************************************************************************
;*************************************************************************************
;Rutina principal
INICIO	movlb	.0	;Banco 0

	;Configuración de los puertos
	movlw	b'00000001'	;W = 01h.
	movwf	trisA	;trisA = W.Configura el puerto B.
	movlw	b'00000000'	;W = 00h.
	movwf	trisB	;trisB = W.Configura el puerto B.
	movlw	b'10001000'	;W = 88h.
	movwf	trisC	;trisC = W.Configura el puerto C.
	movlw	b'11111110'	;W = FEh
	movwf	trisD	;trisD = W.

	;Inicialización de puertos
	clrf	portB	;Borra el estado del puerto B
	clrf	portC	;Borra el estado del puerto C
	clrf	portD	;Borra el estado del puerto D

	;Configuración del USART

	movlw	b'00100110'	;W = 26h
	movwf	txsta	;txsta = W.Configura el TX
	movlw	b'10010000'	;W = 90h
	movwf	rcsta	;rcsta = W. Configura el RX
	movlw	.25	;W = 25d
	movwf	spbrg	;spbrg = W.Configura velocidad

	;Configura interrucpiones
	movlw	b'11000000'	;W = E0h. 
	movwf	intcon	;intcon = W. Configura las interrupciones
	movlw	b'00100000'	;w = 20h
	movwf	pie1	;pie = W.	

	bsf	led	;Activa led testigo

	bsf	ce	;Desactiva el Integrado
	bsf	pd	;Inhabilta operaciones
	bsf	pr	;Evita grabar por accidente

	movlw	b'00000100'	;W = 04h.
	movwf	adcon1	;adcon1 = W. Configura CAD.

;	movlw	b'11000000'	;W = C0h
;	movwf	t0con	;t0con = W	

CICLO	bcf	led	;Apaga el LED
	movlw	b'01000001'	;W =41h.
	call	CAD	;Digitaliza por el canal AN0

	movff	adresh,señal	;señal = adresh.
	movf	minimo,0	;W = minimo
	cpfsgt	señal	;señal >? W
	goto	CICLO	;señal es menor a minimo

	movf	maximo,0	;W = maximo
	cpfslt	señal	;señal <? W.
	goto	CICLO	;señal es mayor a maximo

	movff	limite1,conta	;conta = limite1	

LUZ_1	movlw	b'01000001'	;W =41h.
	call	CAD	;Digitaliza por el canal AN0
	movff	adresh,señal	;señal = adresh.
	movf	minimo,0	;W = minimo
	cpfsgt	señal	;señal >? W
	goto	CICLO	;señal es menor a minimo

	movf	maximo,0	;W = maximo
	cpfslt	señal	;señal <? W.
	goto	CICLO	;señal es mayor a maximo
	decfsz	conta,1	;conta -= 1 =? 0
	goto	LUZ_1	;Continua comparando la señal

	movff	limite2,conta	;conta = limite2	

LUZ_2	movlw	b'01000001'	;W =41h.
	call	CAD	;Digitaliza por el canal AN0
	movff	adresh,señal	;señal = adresh.
	movf	minimo,0	;W = minimo
	cpfslt	señal	;señal <? W
	goto	CICLO	;señal es menor a minimo

	decfsz	conta,1	;conta -= 1 =? 0
	goto	LUZ_2	;Continua comparando la señal


	bsf	led	;Activa el LED
	movlw	.10	;
	call	ESPERA	;Espera un momento		

	goto	CICLO	;Repite el ciclo
;*************************************************************************************


	end		;Fin de archivo


----------



## sagueso (Nov 29, 2006)

Hola.
Este programa es uno de los ultimos en que estoy trabajando, Permite el manejo del ISD25120. Yo empleo el USART para unas opciones de configuración desde el computador.

Está configurada la interrupción del Rx, con lo cual se genera una interrupción cada vez que el PIC recibe un dato. El modulo usart esta configurado a 9600 baudios, datos de 8 bits sin paridad y 1 bit stop, con un XT de 4MHz

Todas las tareas estan en funciones independientes con lo cual se pueden utilizar las funciones individualmente. Por ejemplo si no quiere trabajar con interrupciones no se necesita configurar INTCON, y en la parte del programa donde se quiera recibir un dato se coloca :
call URX
De esta manera el PIC queda en modo espera hasta que le llegue un dato por el USART.

Si lo que quiere es trasnmitir un dato, se llama la función UTX, por ejemplo si quiero trasnmitir el caracter 'G' se debe escribir:
 movlw  'G'
 call  UTX

Y ya se transmite el dato.

Ahora si se quiere utilizar el CAD solo se debe colocar en W el valor de configuración de ADCON0 y se llama la función CAD. 

Del código puede tomar las funciones que vaya a necesitar, pero recuerde agregar las lineas
referentes a la configuración de cada módulo del PIC, donde se mencionan los TRISC,TRSISA,TRISE, ADCON1, TXSTA,SPBRG,etc.  El significado de cada valor para estos registros los puede consultar en el datasheet del PIC, aunque si tiene alguna duda, le puedo colaborar con gusto, pero no se preocupe si no respondo rápidamente.

Aquí está el código:


----------



## Romulo Marquez (Feb 28, 2008)

Simple no! jaja

Saludos


----------

