# ADC 0808 con PIC



## nana71co (Sep 3, 2012)

Hola soy nueva en esto, la intención es controlar la temperatura de 6 o mas termocuplas, se que la salida de estas termocuplas es análoga, debo pasarla a salidas digital, para ello tengo el ADC 0808 y debo usar un pic, pero no se cual podría usar, cual me recomiendan?; pues lo que debo hacer es controlar las señales por puerto usb si es posible, de no ser posible usaría el serie he visto varios proyectos donde usan el pic 16f84A y el adc 0804 pero el adc 0804 puede controlar solo 2 entradas análogas y yo necesito 6 o mas entradas, ademas ya tengo el adc 0808 y para la programacion no soy muy agil, gracias por la ayuda 
saludos
diana


----------



## Pino160789 (Sep 3, 2012)

Que tal te recomiendo el 16f877a que tiene 8 canales analógicos y con ello evitaras utlizar el adc.... Tengo un pequeño programa en asm que tiene dos canales y los manda por el puerto serie si gustas te lo paso!!!

Saludos


----------



## nana71co (Sep 3, 2012)

si estaria buenisimo me ayudaria mucho, pero ya tengo el adc en manos y debo adquirir entre 6 y 10 señales analogas, pero adicional a eso me piden la comunicacion con puerto usb 
saludos
diana


----------



## Pino160789 (Sep 3, 2012)

Mira para eso tienes dos opciones yo actualmente manejo estos dos http://www.ingenieriaenserie.com/index.php/entrenador-pyc este es un entrenador de microcontroladores que trae el pic18f4520 con todas sus conexiones listas y tiene 13 entradas analógicas y para la comunicación con la computadora utilizo este: http://www.ingenieriaenserie.com/index.php/pyc-ftdi y con esto no hay problema si gustas con este pic tengo un ejemplo de 8 canales analógicos, las opciones son esas o comprar un cable usb-serial con su max232 logras la comunicación con la computadora.


----------



## Scooter (Sep 3, 2012)

También puedes usar un conversor y un multiplexor analógico de N entradas.
De hecho es lo que suele haber dentro de los microcontroladores, no conozco uno que tenga N conversores, sin embargo circuitos externos de conversión simultanea de 8 entradas a 8 conversores si que conozco.


----------



## Pino160789 (Sep 3, 2012)

list p=18F4520
	#include <p18f4520.inc>
	CONFIG	OSC 	= INTIO67
	CONFIG	BOREN	= OFF
;	CONFIG	BORV	= 3
	CONFIG	WDT		= OFF
;	CONFIG	WDTPS	= 1
	CONFIG	MCLRE 	= ON
	CONFIG	LPT1OSC	=OFF
	CONFIG	PBADEN	=OFF
    CONFIG	CCP2MX 	=PORTC
	CONFIG	STVREN	=OFF
	CONFIG	LVP 	= OFF
	CONFIG	XINST	=OFF
	CONFIG	DEBUG	=OFF 
	CONFIG 	CP0 	= OFF
	CONFIG 	CP1 	= OFF
	CONFIG 	CPB 	= OFF
	CONFIG 	CPD 	= OFF 
	CONFIG 	WRT0 	= OFF
	CONFIG 	WRT1 	= OFF 
	CONFIG 	WRTB 	= OFF
	CONFIG 	WRTD 	= OFF
	CONFIG 	EBTR0 	= OFF 
	CONFIG 	EBTR1 	= OFF
	CONFIG 	EBTRB 	= OFF
;
	CBLOCK 0x000
	BAUDIOS
	AUX1
	AUX2
	AUX3
	DIVISOR
	I0
	I1
	I2
	D0
	D1
	D2
	KD
	_ERROR
	TOTAL_ERROR
	MOTOR_DER;1
	MOTOR_IZQ;2
	FRECUENCIA
	NO_SENSORES;PARA SABER NUMERO DE SENSORES
	ENDC
;
	ORG		0x00
	GOTO	INICIO
	ORG		0x008
	GOTO	ALTA_PRIORIDAD
	ORG		0x018
BAJA_PRIORIDAD
	BTFSC	PIR1,RCIF
	GOTO	INTER_COMUNICACION
	RETFIE
ALTA_PRIORIDAD
;
INICIO

	BSF		OSCCON,IRCF2 	;CONFIGURO EL OSCILADOR INTERNO
	BSF		OSCCON,IRCF1 	;A 8MHZ
	BSF		OSCCON,IRCF0
	BSF		OSCTUNE,PLLEN
	MOVLW	B'00000111'
	MOVWF	CMCON
;CONFIGURACION PUERTOS
	CLRF	PORTA
	CLRF	PORTB
	CLRF	PORTC
	CLRF	PORTD
	CLRF	PORTE
;
	SETF	TRISA
	CLRF	TRISB
	CLRF	TRISC
	CLRF	TRISD
	CLRF	TRISE
	BSF 	TRISE,0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;CONFIGURANDO REGISTROS
	MOVLW '4'
	MOVWF FRECUENCIA
	MOVLW .25
	MOVWF MOTOR_DER
	MOVLW .25
	MOVWF MOTOR_IZQ
	MOVLW .5
	MOVWF KD
	MOVLW .51
	MOVWF BAUDIOS
	CLRF NO_SENSORES
	CLRF I0
	CLRF I1
	CLRF I2
	CLRF D0
	CLRF D1
	CLRF D2
	CLRF AUX1
	CLRF AUX2
	CLRF AUX3
	CLRF DIVISOR
	CLRF _ERROR
	CLRF TOTAL_ERROR
	CALL INI_RS232
	CALL CONF_FQ
	CALL CONF_FULL_SPEED
;	CALL PRUEBA_MOTORES
;	CALL CONF_BAUD_FAST
;	CALL INI_RS232
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PRINCIPAL
	CALL CONVERSION_SENSORES
	CALL ENTREGA_ERROR
	CALL PRUEBA_MOTORES
	GOTO PRINCIPAL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ENTREGA ERROR
ENTREGA_ERROR
	MOVFF D0,AUX1
	MOVF D1,W
	ADDWF AUX1,1
	MOVF D2,0
	ADDWF AUX1,1

	MOVFF I0,AUX2
	MOVF I1,W
	ADDWF AUX2,1
	MOVF I2,0
	ADDWF AUX2,1

	MOVF AUX2,0
	SUBWF AUX1,0
	MOVWF _ERROR
	BTFSS STATUS,C; PRENDE SI ES POSITITVO ó = 0
	GOTO NEGATIVE
	BCF PORTD,0
	MOVF _ERROR,0
	BTFSS STATUS,Z
	GOTO DIFERENTE_CERO
	BSF PORTB,7
	CLRF TOTAL_ERROR
	MOVFF TOTAL_ERROR,PORTC
	RETURN
DIFERENTE_CERO
	BCF PORTB,7
	MOVLW .48
	MOVWF MOTOR_IZQ
	MOVLW .0
	MOVWF MOTOR_DER
	CLRF TOTAL_ERROR
MAKE_DIV3
	MOVF DIVISOR,W
	SUBLW .3
	BTFSS STATUS,Z
	GOTO MAKE_DIV2
MENOS_TRES
	INCF TOTAL_ERROR,1
	MOVF DIVISOR,W
	SUBWF _ERROR,1
	BTFSS STATUS,Z
	GOTO MENOS_TRES
	MOVFF TOTAL_ERROR,PORTC
	RETURN
MAKE_DIV2
	MOVF DIVISOR,W
	SUBLW .2
	BTFSS STATUS,Z
	GOTO MAKE_DIV1
MENOS_DOS
	INCF TOTAL_ERROR,1
	MOVF DIVISOR,W
	SUBWF _ERROR,1
	BTFSS STATUS,Z
	GOTO MENOS_DOS
	MOVFF TOTAL_ERROR,PORTC
	RETURN
MAKE_DIV1
	MOVF DIVISOR,W
	SUBLW .1
	BTFSS STATUS,Z
	RETURN
MENOS_UNO
	INCF TOTAL_ERROR,1
	MOVF DIVISOR,W
	SUBWF _ERROR,1
	BTFSS STATUS,Z
	GOTO MENOS_UNO
	MOVFF TOTAL_ERROR,PORTC
	RETURN
NEGATIVE
	BCF PORTB,7
	MOVLW .48
	MOVWF MOTOR_DER
	MOVLW .0
	MOVWF MOTOR_IZQ
	BSF PORTD,0
	COMF _ERROR,1
	INCF _ERROR,1
	MOVFF NO_SENSORES,DIVISOR
	CLRF TOTAL_ERROR
MAKE_DIV_3
	MOVF DIVISOR,W
	SUBLW .3
	BTFSS STATUS,Z
	GOTO MAKE_DIV_2
MENOS_TRES_1
	INCF TOTAL_ERROR,1
	MOVF DIVISOR,W
	SUBWF _ERROR,1
	BTFSS STATUS,Z
	GOTO MENOS_TRES_1
	MOVFF TOTAL_ERROR,PORTC
	RETURN
MAKE_DIV_2
	MOVF DIVISOR,W
	SUBLW .2
	BTFSS STATUS,Z
	GOTO MAKE_DIV_1
MENOS_DOS_1
	INCF TOTAL_ERROR,1
	MOVF DIVISOR,W
	SUBWF _ERROR,1
	BTFSS STATUS,Z
	GOTO MENOS_DOS_1
	MOVFF TOTAL_ERROR,PORTC
	RETURN
MAKE_DIV_1
	MOVF DIVISOR,W
	SUBLW .1
	BTFSS STATUS,Z
	RETURN
MENOS_UNO_1
	INCF TOTAL_ERROR,1
	MOVF DIVISOR,W
	SUBWF _ERROR,1
	BTFSS STATUS,Z
	GOTO MENOS_UNO_1
	MOVFF TOTAL_ERROR,PORTC
	RETURN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PRUEBA DE MOTORES
PRUEBA_MOTORES
	MOVF NO_SENSORES,0
	BTFSS STATUS,Z
	GOTO CONTINUA_PRUEBA
	movlw .50
	movwf MOTOR_IZQ
	movlw .50
	movwf MOTOR_DER
CONTINUA_PRUEBA
	MOVLW 0X04;PLACA CERO DE MOTORES
	CALL TX_DATO
	MOVF MOTOR_IZQ,0     ;B'00110010';50 % BIT 7 IZQ
	CALL TX_DATO
	MOVF MOTOR_DER,0
	CALL TX_DATO
	RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CONVERSION DE SENSORES
CONVERSION_SENSORES
	CLRF NO_SENSORES
	CALL CONFIGURA_ADC
	CALL CONVERTIDOR_AD
	MOVLW B'00000101'
	MOVWF ADCON0
	MOVF  ADRESH,W
	SUBLW .108
	BTFSS STATUS,0
	GOTO ALTO_1
	CALL BAJO_1	
SEGUNDA_CONVERSION
	CALL CONVERTIDOR_AD
	MOVLW B'00001001'
	MOVWF ADCON0
	MOVF  ADRESH,W
	SUBLW .120
	BTFSS STATUS,0
	GOTO ALTO_2
	CALL BAJO_2
TERCERA_CONVERSION
	CALL CONVERTIDOR_AD
	MOVLW B'00001101'
	MOVWF ADCON0
	MOVF  ADRESH,W
	SUBLW .120
	BTFSS STATUS,0
	GOTO ALTO_3
	CALL BAJO_3
CUARTA_CONVERSION
	CALL CONVERTIDOR_AD
	MOVLW B'00010001'
	MOVWF ADCON0
	MOVF  ADRESH,W
	SUBLW .44
	BTFSS STATUS,0
	GOTO ALTO_4
	CALL BAJO_4
QUINTA_CONVERSION
	CALL CONVERTIDOR_AD
	MOVLW B'00010101'
	MOVWF ADCON0
	MOVF  ADRESH,W
	SUBLW .44
	BTFSS STATUS,0
	GOTO ALTO_5
	CALL BAJO_5
SEXTA_CONVERSION
	CALL CONVERTIDOR_AD
	MOVLW B'00000001'
	MOVWF ADCON0
	MOVF  ADRESH,W
	SUBLW .44
	BTFSS STATUS,0
	GOTO ALTO_6
	CALL BAJO_6
	RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BAJO_1
	BCF PORTD,2
	BCF PORTD,3
	CLRF I2
	RETURN
ALTO_1
	BSF PORTD,2
	BSF PORTD,3
	MOVLW .5
	MOVWF I2
	INCF NO_SENSORES,1
	GOTO SEGUNDA_CONVERSION
BAJO_2
	BCF PORTD,4
	BCF PORTD,5
	CLRF I1
	RETURN
ALTO_2
	BSF LATD,4
	BSF LATD,5
	MOVLW .3
	MOVWF I1
	INCF NO_SENSORES,1
	GOTO TERCERA_CONVERSION
BAJO_3
	BCF PORTD,6
	BCF PORTD,7
	CLRF I0
	RETURN
ALTO_3
	BSF PORTD,6
	BSF PORTD,7
	MOVLW .1
	MOVWF I0
	INCF NO_SENSORES,1
	GOTO CUARTA_CONVERSION
BAJO_4
	BCF PORTB,0
	BCF PORTB,1
	CLRF D0
	RETURN
ALTO_4
	BSF PORTB,0
	BSF PORTB,1
	MOVLW .1
	MOVWF D0
	INCF NO_SENSORES,1
	GOTO QUINTA_CONVERSION
BAJO_5
	BCF PORTB,2
	BCF PORTB,3
	CLRF D1
	RETURN
ALTO_5
	BSF PORTB,2
	BSF PORTB,3
	MOVLW .3
	MOVWF D1
	INCF NO_SENSORES,1
	GOTO SEXTA_CONVERSION
BAJO_6
	BCF PORTB,4
	BCF PORTB,5
	CLRF D2
	RETURN
ALTO_6
	BSF PORTB,4
	BSF PORTB,5
	MOVLW .5
	MOVWF D2
	INCF NO_SENSORES,1
	RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CONVERTIDOR_AD
	BCF		PIR1,ADIF		;LIMPIA EL BIT QUE INDICA LA CONVERSION
	NOP
	BSF		ADCON0,GO		;PUESTA EN MARCHA DE LA CONVERSION
ADC_ESPERA
	BTFSS	PIR1,ADIF		;CHECA SI LA CONVERSION FINALIZA
	GOTO	ADC_ESPERA		;REGRESA A LA ESPERA
	RETURN					;REGRESA AL PROGRAMA PRINCIPAL
CONFIGURA_ADC
	MOVLW B'00001001'
	MOVWF ADCON1
	MOVLW B'00101101'
	MOVWF ADCON2
	MOVLW B'00000001'
	MOVWF ADCON0
	BCF PIR1,ADIF
	RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CONF_BAUD_FAST
	MOVLW 'B'
	CALL TX_DATO
	MOVLW 'C'
	CALL TX_DATO
	MOVLW '2'
	CALL TX_DATO
	CALL FIN_MENSAJE
	MOVLW .47
	MOVWF BAUDIOS
	RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CONF_FQ
	MOVLW 'M'
	CALL TX_DATO
	MOVLW 'O'
	CALL TX_DATO
	MOVLW 'T'
	CALL TX_DATO
	MOVLW '0'
	CALL TX_DATO
	MOVLW 'C'
	CALL TX_DATO
	MOVLW 'F'
	CALL TX_DATO
	MOVLW 'Q'
	CALL TX_DATO
	MOVF FRECUENCIA,W
	CALL TX_DATO
	CALL FIN_MENSAJE
	RETURN

	#include <PINO.INC>	
	END

Y aca la libreria



	CBLOCK
	TMR0H_AUX
	TMR0L_AUX
	CONTADOR_RETARDO
	AUXILIAR_PyC_H
	AUXILIAR_PyC
	NUMERO_L_AUX
	NUMERO_H_AUX
	TEMPORAL1
	ENDC

CONF_FULL_SPEED
	MOVLW 'F'
	CALL TX_DATO
	MOVLW 'S'
	CALL TX_DATO
	CALL FIN_MENSAJE
	RETURN
FIN_MENSAJE
	MOVLW	0x0D
	CALL	TX_DATO
	MOVLW	0x0A
	CALL	TX_DATO
	RETURN
INI_RS232
;EN ESTA SECCION SE CONFIGURA LA COMUNICACION RS232 PARA EL
;MICRO 4520, SI SE OCUPA OTRO MICROCONTROLADOR ESTA LA PARTE
;QUE SE NECESITA MODIFICAR
	MOVLW	B'00000101'
	MOVWF	FSR2H
	CLRF	FSR2L
;CONFIGURACION DEL TIMER PARA RETARDOS EN ms
	MOVLW	B'00000000'
	MOVWF	T0CON
;CONFIGURACION DE LACOMUNICACION SERIE ASINCRONA
	BSF		TRISC,7
	BSF		TRISC,6
	CLRF	SPBRGH
	MOVLW	.51
	MOVWF	SPBRG
	MOVLW	B'00100000'			;BRGH=0
	MOVWF	TXSTA
	MOVLW	B'10010000'
	MOVWF	RCSTA
	MOVLW	B'00000000'
	MOVWF	BAUDCON			;VELOCIDAD DEL PUERTO	9600
;CONFIGURACION INTERRUPCION RECEPCION
	BSF		INTCON,7
	BSF		INTCON,6
	CLRF	PIR1
	BSF		PIE1,5
	BCF		IPR1,5			;SE ACTIVA COMO BAJA PRIORIDAD
	BSF		RCON,IPEN
	MOVLW	.1
	CALL	RET_Xms
	RETURN
;********************************************************
TX_DATO
	MOVWF	TXREG
TX_DAT
	BTFSS	TXSTA,TRMT
	GOTO	TX_DAT
	BCF		PIR1,TXIF
	RETURN
;*******************************************************
INTER_COMUNICACION
	BCF		PIR1,RCIF
	MOVF	RCREG,W
;	CALL	TX_DATO
	MOVWF 	TEMPORAL1
	RETFIE
RX_DATO
	BCF PIR1,RCIF
	BTFSC RCSTA,FERR
	GOTO RX_DATO
	MOVF RCREG,0
	RETURN
;*******************************************************
RET_X1s
	MOVWF	CONTADOR_RETARDO
	BSF		T0CON,T0PS2
	BSF		T0CON,T0PS1
	BCF		T0CON,T0PS0
	MOVLW	0xF4
	MOVWF	TMR0H_AUX
	MOVLW	0x24
	MOVWF	TMR0L_AUX
	GOTO	RETARDOS
RET_X100ms
	MOVWF	CONTADOR_RETARDO
	BCF		T0CON,T0PS2
	BSF		T0CON,T0PS1
	BSF		T0CON,T0PS0
	MOVLW	0xC3
	MOVWF	TMR0H_AUX
	MOVLW	0x50
	MOVWF	TMR0L_AUX
	GOTO	RETARDOS
RET_X10ms
	MOVWF	CONTADOR_RETARDO
	BCF		T0CON,T0PS2
	BCF		T0CON,T0PS1
	BCF		T0CON,T0PS0
	MOVLW	0x9C
	MOVWF	TMR0H_AUX
	MOVLW	0x40
	MOVWF	TMR0L_AUX
	GOTO	RETARDOS
RET_Xms
	MOVWF	CONTADOR_RETARDO
	BCF		T0CON,T0PS2
	BCF		T0CON,T0PS1
	BCF		T0CON,T0PS0
	MOVLW	0x0F
	MOVWF	TMR0H_AUX
	MOVLW	0xA0
	MOVWF	TMR0L_AUX
RETARDOS
	COMF	TMR0H_AUX,W
	MOVWF	TMR0H
	COMF	TMR0L_AUX,W
	MOVWF	TMR0L
	BSF		T0CON,TMR0ON
CICLO_RETARDO
	BTFSS	INTCON,TMR0IF
	GOTO	CICLO_RETARDO
	BCF		INTCON,TMR0IF
	DECFSZ	CONTADOR_RETARDO
	GOTO	RETARDOS
	RETURN

y para el 877::::


LIST P=16F877A, F=INHX32 
INCLUDE <P16F877A.INC> 
__CONFIG _BODEN_OFF & _CP_OFF & _WRT_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _DEBUG_OFF & _CPD_OFF & _LVP_OFF 

ERRORLEVEL 1;-302 ;Eliminate bank warning

  	CBLOCK 0X20
	ENDC
    ORG        0000H        ;Dirección inicial del Código de Programa 
	CALL CONFIGURA_RS232
    bsf        STATUS,5    ;NOS MOVEMOS AL BANCO 1 PARA LA CONFIGURACION DE LOS PUERTOS
    CLRF PORTB
	CLRF PORTC
	CLRF PORTD
	CLRF PORTE
	BSF PORTA,0
	BSF PORTA,1
	BSF PORTA,3
    bcf        STATUS,5    ;REGRESAMOS AL BANCO 0
	CLRF PORTD
	GOTO INICIO
CONVERTIDOR_AD
	BCF		PIR1,ADIF		;LIMPIA EL BIT QUE INDICA LA CONVERSION
	NOP
	BSF		ADCON0,GO		;PUESTA EN MARCHA DE LA CONVERSION
ADC_ESPERA
	BTFSS	PIR1,ADIF		;CHECA SI LA CONVERSION FINALIZA
	GOTO	ADC_ESPERA		;REGRESA A LA ESPERA
	RETURN					;REGRESA AL PROGRAMA PRINCIPAL

INICIO
	BSF STATUS,5
	MOVLW	B'00000100'
	MOVWF	ADCON1
	BCF STATUS,5
INIC
	MOVLW	B'00000001'
	MOVWF	ADCON0
	BCF		PIR1,ADIF		;LIMPIO LA BANDERA DEL A/D
	CLRF 	PORTB
PRINCIPAL
	CALL	CONVERTIDOR_AD
	MOVF	ADRESH,W
	MOVWF	PORTB
	MOVLW 'X'
	CALL TX_DATO
	CALL Retardo_2ms
	MOVF ADRESH,W
	CALL TX_DATO
	NOP
	CALL Retardo_1ms
INI
	BCF PIR1,ADIF
	MOVLW B'01001001'
	MOVWF ADCON0
	CLRF PORTD
CONV_2
	CALL CONVERTIDOR_AD
	MOVF ADRESH,W
	MOVWF PORTD
	MOVLW 'Y'
	CALL TX_DATO
	CALL Retardo_2ms
	MOVF ADRESH,W
	CALL TX_DATO
	CALL Retardo_2ms
	GOTO INIC



INCLUDE<RS232.INC>
INCLUDE<RETARDOS.INC>

	END

Libreria de retardos:



;**************************** Librería "RETARDOS.INC" *********************************
;
;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.		www.pic16f84a.com
; 	  Editorial Ra-Ma.  www.ra-ma.es
;	===================================================================
;
; Librería con múltiples subrutinas de retardos, desde 4 microsegundos hasta 20 segundos. 
; Además se pueden implementar otras subrutinas muy fácilmente.
;
; Se han calculado para un sistema microcontrolador con un PIC trabajando con un cristal
; de cuarzo a 4 MHz. Como cada ciclo máquina son 4 ciclos de reloj, resulta que cada
; ciclo máquina tarda 4 x 1/4MHz = 1 µs.
;
; En los comentarios, "cm" significa "ciclos máquina".
;
; ZONA DE DATOS *********************************************************************

	CBLOCK
	R_ContA						; Contadores para los retardos.
	R_ContB
	R_ContC
	ENDC
;
; RETARDOS de 4 hasta 10 microsegundos ---------------------------------------------------
;
; A continuación retardos pequeños teniendo en cuenta que para una frecuencia de 4 MHZ,
; la llamada a subrutina "call" tarda 2 ciclos máquina, el retorno de subrutina
; "return" toma otros 2 ciclos máquina y cada instrucción "nop" tarda 1 ciclo máquina.
;
Retardo_10micros				; La llamada "call" aporta 2 ciclos máquina.
	nop							; Aporta 1 ciclo máquina.
	nop							; Aporta 1 ciclo máquina.
	nop							; Aporta 1 ciclo máquina.
	nop							; Aporta 1 ciclo máquina.
	nop							; Aporta 1 ciclo máquina.
Retardo_5micros					; La llamada "call" aporta 2 ciclos máquina.
	nop							; Aporta 1 ciclo máquina.
Retardo_4micros					; La llamada "call" aporta 2 ciclos máquina.
	return						; El salto del retorno aporta 2 ciclos máquina.
;
; RETARDOS de 20 hasta 500 microsegundos ------------------------------------------------
;
Retardo_500micros				; La llamada "call" aporta 2 ciclos máquina.
	nop							; Aporta 1 ciclo máquina.
	movlw	d'164'				; Aporta 1 ciclo máquina. Este es el valor de "K".
	goto	RetardoMicros		; Aporta 2 ciclos máquina.
Retardo_200micros				; La llamada "call" aporta 2 ciclos máquina.
	nop							; Aporta 1 ciclo máquina.
	movlw	d'64'				; Aporta 1 ciclo máquina. Este es el valor de "K".
	goto	RetardoMicros		; Aporta 2 ciclos máquina.
Retardo_100micros				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'31'				; Aporta 1 ciclo máquina. Este es el valor de "K".
	goto	RetardoMicros		; Aporta 2 ciclos máquina.
Retardo_50micros				; La llamada "call" aporta 2 ciclos máquina.
	nop							; Aporta 1 ciclo máquina.
	movlw	d'14'				; Aporta 1 ciclo máquina. Este es el valor de "K".
	goto	RetardoMicros		; Aporta 2 ciclos máquina.
Retardo_20micros				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'5'				; Aporta 1 ciclo máquina. Este es el valor de "K".
;
; El próximo bloque "RetardoMicros" tarda:
; 1 + (K-1) + 2 + (K-1)x2 + 2 = (2 + 3K) ciclos máquina.
;
RetardoMicros
	movwf	R_ContA				; Aporta 1 ciclo máquina.
Rmicros_Bucle
	decfsz	R_ContA,F			; (K-1)x1 cm (cuando no salta) + 2 cm (al saltar).
	goto	Rmicros_Bucle		; Aporta (K-1)x2 ciclos máquina.
	return						; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_500micros:	2 + 1 + 1 + 2 + (2 + 3K) = 500 cm = 500 µs. (para K=164 y 4 MHz).
; - Retardo_200micros:	2 + 1 + 1 + 2 + (2 + 3K) = 200 cm = 200 µs. (para K= 64 y 4 MHz).
; - Retardo_100micros:	2     + 1 + 2 + (2 + 3K) = 100 cm = 100 µs. (para K= 31 y 4 MHz).
; - Retardo_50micros :	2 + 1 + 1 + 2 + (2 + 3K) =  50 cm =  50 µs. (para K= 14 y 4 MHz).
; - Retardo_20micros :	2     + 1     + (2 + 3K) =  20 cm =  20 µs. (para K=  5 y 4 MHz).
;
; RETARDOS de 1 ms hasta 200 ms. --------------------------------------------------------
;
Retardo_200ms					; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'200'				; Aporta 1 ciclo máquina. Este es el valor de "M".
	goto	Retardos_ms			; Aporta 2 ciclos máquina.
Retardo_100ms					; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'100'				; Aporta 1 ciclo máquina. Este es el valor de "M".
	goto	Retardos_ms			; Aporta 2 ciclos máquina.
Retardo_50ms					; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'50'				; Aporta 1 ciclo máquina. Este es el valor de "M".
	goto	Retardos_ms			; Aporta 2 ciclos máquina.
Retardo_20ms					; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'20'				; Aporta 1 ciclo máquina. Este es el valor de "M".
	goto	Retardos_ms			; Aporta 2 ciclos máquina.
Retardo_10ms					; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'10'				; Aporta 1 ciclo máquina. Este es el valor de "M".
	goto	Retardos_ms			; Aporta 2 ciclos máquina.
Retardo_5ms						; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'5'				; Aporta 1 ciclo máquina. Este es el valor de "M".
	goto	Retardos_ms			; Aporta 2 ciclos máquina.
Retardo_2ms						; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'2'				; Aporta 1 ciclo máquina. Este es el valor de "M".
	goto	Retardos_ms			; Aporta 2 ciclos máquina.
Retardo_1ms						; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'1'				; Aporta 1 ciclo máquina. Este es el valor de "M".
;
; El próximo bloque "Retardos_ms" tarda:
; 1 + M + M + KxM + (K-1)xM + Mx2 + (K-1)Mx2 + (M-1) + 2 + (M-1)x2 + 2 =
; = (2 + 4M + 4KM) ciclos máquina. Para K=249 y M=1 supone 1002 ciclos máquina
; que a 4 MHz son 1002 µs = 1 ms.
;
Retardos_ms
	movwf	R_ContB				; Aporta 1 ciclo máquina.
R1ms_BucleExterno
	movlw	d'249'				; Aporta Mx1 ciclos máquina. Este es el valor de "K".
	movwf	R_ContA				; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
	nop							; Aporta KxMx1 ciclos máquina.
	decfsz	R_ContA,F			; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
	goto	R1ms_BucleInterno	; Aporta (K-1)xMx2 ciclos máquina.
	decfsz	R_ContB,F			; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
	goto	R1ms_BucleExterno 	; Aporta (M-1)x2 ciclos máquina.
	return						; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_200ms:	2 + 1 + 2 + (2 + 4M + 4KM) = 200007 cm = 200 ms. (M=200 y K=249).
; - Retardo_100ms:	2 + 1 + 2 + (2 + 4M + 4KM) = 100007 cm = 100 ms. (M=100 y K=249).
; - Retardo_50ms :	2 + 1 + 2 + (2 + 4M + 4KM) =  50007 cm =  50 ms. (M= 50 y K=249).
; - Retardo_20ms :	2 + 1 + 2 + (2 + 4M + 4KM) =  20007 cm =  20 ms. (M= 20 y K=249).
; - Retardo_10ms :	2 + 1 + 2 + (2 + 4M + 4KM) =  10007 cm =  10 ms. (M= 10 y K=249).
; - Retardo_5ms  :	2 + 1 + 2 + (2 + 4M + 4KM) =   5007 cm =   5 ms. (M=  5 y K=249).
; - Retardo_2ms  :	2 + 1 + 2 + (2 + 4M + 4KM) =   2007 cm =   2 ms. (M=  2 y K=249).
; - Retardo_1ms  :	2 + 1     + (2 + 4M + 4KM) =   1005 cm =   1 ms. (M=  1 y K=249).
;
; RETARDOS de 0.5 hasta 20 segundos ---------------------------------------------------
;
Retardo_20s						; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'200'				; Aporta 1 ciclo máquina. Este es el valor de "N".
	goto	Retardo_1Decima		; Aporta 2 ciclos máquina.
Retardo_10s						; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'100'				; Aporta 1 ciclo máquina. Este es el valor de "N".
	goto	Retardo_1Decima		; Aporta 2 ciclos máquina.
Retardo_5s						; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'50'				; Aporta 1 ciclo máquina. Este es el valor de "N".
	goto	Retardo_1Decima		; Aporta 2 ciclos máquina.
Retardo_2s						; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'20'				; Aporta 1 ciclo máquina. Este es el valor de "N".
	goto	Retardo_1Decima		; Aporta 2 ciclos máquina.
Retardo_1s						; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'10'				; Aporta 1 ciclo máquina. Este es el valor de "N".
	goto	Retardo_1Decima		; Aporta 2 ciclos máquina.
Retardo_500ms					; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'5'				; Aporta 1 ciclo máquina. Este es el valor de "N".
;
; El próximo bloque "Retardo_1Decima" tarda:
; 1 + N + N + MxN + MxN + KxMxN + (K-1)xMxN + MxNx2 + (K-1)xMxNx2 +
;   + (M-1)xN + Nx2 + (M-1)xNx2 + (N-1) + 2 + (N-1)x2 + 2 =
; = (2 + 4M + 4MN + 4KM) ciclos máquina. Para K=249, M=100 y N=1 supone 100011
; ciclos máquina que a 4 MHz son 100011 µs = 100 ms = 0,1 s = 1 décima de segundo.
;
Retardo_1Decima
	movwf	R_ContC				; Aporta 1 ciclo máquina.
R1Decima_BucleExterno2
	movlw	d'100'				; Aporta Nx1 ciclos máquina. Este es el valor de "M".
	movwf	R_ContB				; Aporta Nx1 ciclos máquina.
R1Decima_BucleExterno
	movlw	d'249'				; Aporta MxNx1 ciclos máquina. Este es el valor de "K".
	movwf	R_ContA				; Aporta MxNx1 ciclos máquina.
R1Decima_BucleInterno          
	nop							; Aporta KxMxNx1 ciclos máquina.
	decfsz	R_ContA,F			; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar).
	goto	R1Decima_BucleInterno	; Aporta (K-1)xMxNx2 ciclos máquina.
	decfsz	R_ContB,F			; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar).
	goto	R1Decima_BucleExterno	; Aporta (M-1)xNx2 ciclos máquina.
	decfsz	R_ContC,F			; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar).
	goto	R1Decima_BucleExterno2	; Aporta (N-1)x2 ciclos máquina.
	return						; El salto del retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_20s:	2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 20000807 cm = 20 s.
;			(N=200, M=100 y K=249).
; - Retardo_10s:	2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 10000407 cm = 10 s.
;			(N=100, M=100 y K=249).
; - Retardo_5s:		2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) =  5000207 cm =  5 s.
;			(N= 50, M=100 y K=249).
; - Retardo_2s:		2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) =  2000087 cm =  2 s.
;			(N= 20, M=100 y K=249).
; - Retardo_1s:		2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) =  1000047 cm =  1 s.
;			(N= 10, M=100 y K=249).
; - Retardo_500ms:	2 + 1     + (2 + 4N + 4MN + 4KMN) =   500025 cm = 0,5 s.
;			(N=  5, M=100 y K=249).

;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.		www.pic16f84a.com
; 	  Editorial Ra-Ma.  www.ra-ma.es
;	===================================================================

Libreria de rs232:



;ESTA LIBRERIA ESTA DISEÑADA PARA TRABAJAR A 9600 BAUDIOS 
;CON UN CRISTAL DE 4MHZ
CONFIGURA_RS232	
	BSF STATUS,RP0
	BSF TRISC,7
	BCF TRISC,6
	MOVLW 0XFF
	MOVWF TRISB
	MOVLW .25
	MOVWF SPBRG
	MOVLW B'00100100'
	MOVWF TXSTA
	BCF STATUS,RP0
	MOVLW B'10010000'
	MOVWF RCSTA
	RETURN
TX_DATO
	BCF PIR1,TXIF
	MOVWF TXREG
	BSF STATUS,RP0
TX_DATO_ESP
	BTFSS TXSTA,TRMT
	GOTO TX_DATO_ESP
	BCF STATUS,RP0
	RETURN
RX_DATO
	BCF PIR1,RCIF
	BTFSC RCSTA,FERR
	GOTO RX_DATO
	MOVF RCREG,0
	RETURN



Espero te sirva de algo... Saludos


----------



## Melghost (Sep 6, 2012)

Hola, Diana.

      Te vendría de perlas el PIC que yo estoy utilizando para el proyecto que tengo entre manos: Es un PIC18F26J50, aunque hay varios modelos más con características buenas para tu proyecto.
      Conversor analógico/digital con 10 entradas, y puerto USB. Con esto te evitas mucha circuitería.
      Si de todas formas necesitas utilizar el ADC 0808, en cualquier caso tendrás que implementar en el PIC la comunicación con él.

Hasta luego


----------

