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