Buenos dias este es el programa que uso con un 16F84A............la idea es probar con el y luego adaptarlo con otros pic, este programa lo consegui del un manual de MicroChip, el AN512, esta escrito originalmente para el 16C54, lo adapte al 16F84A facilmente pero tengo un problema cuando va a ejecutar la rutina de multiplicacion..........se detiene...........en el MPLAB corre bien pero en proteus da error al comenzar la rutina de division y en el Pic Simulator Ide se detiene en la misma linea es al ir a la sub rutina Setup al carga el valor Hexadecimal 10 en TEMP
list P=16f84a
#include "p16f84a.inc"
errorlevel -302
__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC
ACCA EQU 8
ACCB EQU 0A
ACCC EQU 0C
ACCD EQU 0E
ACCE EQU 10
TCAL EQU 12
TEMP EQU 14
RCALMS EQU 2F ;RCAL MSB VALUE IN HEX
RCALLS EQU 3C ;RCAL LSB VALUE IN HEX
goto Inicio
; ============= Rutinas ====================
Descarga:
bsf STATUS, RP0
MOVLW B'00001011' ;ACTIVATE RA2
movwf TRISA
bcf STATUS, RP0
MOVLW B'00000000' ;ACTIVATE RA2
movwf PORTA
MOVLW 0FF
MOVWF TEMP
LOOP
DECFSZ TEMP,F ;WAIT
GOTO LOOP
bsf STATUS, RP0
MOVLW B'00001111' ;ALL OUTPUTS OFF
movwf TRISA
bcf STATUS, RP0
Return
; =========================================
M_TIME:
;CLRF 1 ;CLEAR RTCC
CLRF ACCA+1
CLRF ACCA
TLOOP
INCFSZ ACCA+1,F
GOTO ENDCHK
INCFSZ ACCA,F
GOTO ENDCHK
GOTO END_M
ENDCHK
BTFSS PORTA,3 ;CHECK FOR RTCC TRIP
GOTO TLOOP
END_M
MOVF 1,W
Return
; ===== Rutina Para Multiplicar ====
MPY: CALL SETUP ;RESULTS IN B(16 MSB'S) AND C(16 LSB'S
MLOOP:
RRF ACCD,F ;ROTATE D RIGHT
RRF ACCD+1,F
SKPNC ;NEED TO ADD?
CALL MADD
RRF ACCB,F
RRF ACCB+1,F
RRF ACCC,F
RRF ACCC+1,F
DECFSZ TEMP,F ;LOOP UNTIL ALL BITS CHECKED
GOTO MLOOP
Return
; ===========================================
SETUP:
nop
MOVLW 10 <.........................................EL PROGRAMA FALLA O SE DETIENE AL LLEGAR
MOVWF TEMP AQUI
MOVF ACCB,W ;MOVE B TO D
MOVWF ACCD
MOVF ACCB+1,W
MOVWF ACCD+1
MOVF ACCC,W
MOVWF ACCE
MOVF ACCC+1,W
MOVWF ACCE+1
CLRF ACCB
CLRF ACCB+1
Return
; ===== Rutina Para Dividir ==================
DIV:
CALL SETUP
MOVLW 20
MOVWF TEMP
CLRF ACCC
CLRF ACCC+1
DLOOP
CLRC
RLF ACCE+1,F
RLF ACCE,F
RLF ACCD+1,F
RLF ACCD,F
RLF ACCC+1,F
RLF ACCC,F
MOVF ACCA,W
SUBWF ACCC,W ;CHECK IF A>C
SKPZ
GOTO NOCHK
MOVF ACCA+1,W
SUBWF ACCC+1,W ;IF MSB EQUAL THEN CHECK LSB
NOCHK
SKPC ;CARRY SET IF C>A
GOTO NOGO
MOVF ACCA+1,W ;C-A INTO C
SUBWF ACCC+1,F
BTFSS 3,0
DECF ACCC,F
MOVF ACCA,W
SUBWF ACCC,F
SETC ;SHIFT A 1 INTO B (RESULT)
NOGO
RLF ACCB+1,F
RLF ACCB,F
DECFSZ TEMP,F ;LOOP UNTILL ALL BITS CHECKED
GOTO DLOOP
Return
; ==============================
MADD:
MOVF ACCA+1,W
ADDWF ACCB+1,F ;ADD LSB
BTFSC 3,0 ;ADD IN CARRY
INCF ACCB,F
MOVF ACCA,W
ADDWF ACCB,F ;ADD MSB
Return
; =============================
Inicio:
bsf STATUS, RP0
MOVLW B'00001111' ;SET RA0 AND RA1 HIGH (ON WHEN ACTIVATED)
MOVWF TRISA
bcf STATUS, RP0
Calibracion:
CALL Descarga ;DISCHARGE CAPACITOR
bsf STATUS, RP0
MOVLW B'00001110' ;ACTIVATE RA0
movwf TRISA
bcf STATUS, RP0
MOVLW B'00000001' ;ACTIVATE RA0
movwf PORTA
CALL M_TIME ;MEASURE TIME
MOVF ACCA+1,W
MOVWF TCAL+1 ;STORE LSB
MOVF ACCA,W
MOVWF TCAL ;STORE MSB
Medicion:
CALL Descarga ;DISCHARGE CAPACITOR
bsf STATUS, RP0
MOVLW B'00001101' ;ACTIVATE RA1
movwf TRISA
bcf STATUS, RP0
MOVLW B'00000010' ;ACTIVATE RA0
movwf PORTA
CALL M_TIME ;MEASURE TIME
MOVLW RCALLS ;CALIBRATION LSB VALUE
MOVWF ACCB+1
MOVLW RCALMS ;CALIBRATION MSB VALUE
MOVWF ACCB
CALL MPY ;MULTIPLY ACCA(MEAS) * ACCB(RCAL)
MOVF TCAL+1,W
MOVWF ACCA+1
MOVF TCAL,W
MOVWF ACCA
CALL DIV ;DIVIDE ACCB(MEAS * R) BY ACCA(TCAL)
GOTO Inicio
END
gracias de antemano a todos............y su valioso aporte