ante todo un cordial saludo.
Les escribo en esta oportunidad para perdirles de su valiosa colaboracion, en meses atras estaba tratando de elaborar un codigo que hiciera lo siguiente:
El PIC de trabajo es el 16f628A y el asm consiste en recibir un codigo proveniente de un codificador DTMF por el puerto A de 4bit una y de acuerdo a este codigo habilitar o deshabilitar los rele ubicados en el puerto B, el programa cuando lo compilo no me da errores, pero cuando lo quiero grabar en el pic me da un error que desconozco, lo he intentado probar en el proteus pero no lo se usar y no encuentro los componentes en la libreria del mismo.
Les estoy pasando el codigo para ver si me pueden hacer el favor de probarlo en sus pic o simuladores porque yo realmente no lo he podido hacer.
LIST P=16F628A
#INCLUDE<P16F628A.INC>
ERRORLEVEL -302
TMP equ 0x20
Digit1y2code equ 0x22 ;estos 4 registros DEBEN ubicarse de manera
Digit3y4code equ 0x23 ;consecutiva en la memoria GPR del PIC.
Digit5y6code equ 0x24
Digit7y8code equ 0x25
DIGITOSREST equ 0x26
AUX equ 0x27
METHOD equ 0x28
IGUALES equ 0x29
CONTA equ 0x2A
NumRele equ 0x2B
DATEEPROM equ 0x2C
DIREEPROM equ 0x2D
ORG 0x2100 ;inicio DATA EEPROM.
DE 0x00 ;iniciar por unica vez todos los reles apagados
;*********************************************************
ORG 00H
GOTO INICIO
ORG 04H
;*********************************************************
;* RUTINA DE SERVICIO PARA EL TIMER0 *
;*********************************************************
BTFSS INTCON,2
GOTO SALE
INCF CONTA
MOVF CONTA,W
XORLW 1EH
BTFSS STATUS,Z
GOTO SALE
CLRF CONTA
CALL RESETALL
Sale BCF INTCON,2
RETFIE
;*********************************************************
ORG 10H
INICIO MOVLW .7
MOVWF CMCON
BSF STATUS,5
CLRF TRISB
MOVLW b'00011111'
MOVWF TRISA
MOVLW B'11010111'
MOVWF OPTION_REG
BCF STATUS,5
CLRF DIREEPROM ;Pedir Leer direccion 0x00 EEPROM
CALL LEER ;LEER
MOVWF PORTB ;Recuperar valor leido en puertoB
CLRF PORTA
CLRF CONTA
MOVlW b'10100000'
MOVWF INTCON
CALL GETCODE
CALL RESETALL
WAITNEXT BTFSS PORTA,4
GOTO $-1
CLRF CONTA ;limpiar contador auxiliar Timer0
CLRF TMR0 ;limpiar prescaler
MOVF PORTA,W
ANDLW 0X0F
DECFSZ DIGITOSREST,F
GOTO FALTAN
INCF METHOD,F
FALTAN CALL COMPARA
BTFSC PORTA,4
GOTO $-1
GOTO WAITNEXT
COMPARA MOVWF AUX
MOVF METHOD,W
ADDWF PCL,F
GOTO NIBBLEALTO
GOTO NIBBLEBAJO
RELE MOVF IGUALES,F
BTFSS STATUS,Z
GOTO SALIDA
MOVF NumRele,W ;leer numero de rele
CALL TABLA ;y obtener tabla
BTFSS AUX,0 ;encender?
goto Apagar ;no. entonces apagar
Encender IORWF PORTB,F ;Incluir numero de Rele en PUERTOB(encender Rele)
CLRF DIREEPROM ;grabar en posicion EEPROM 0x00
MOVF PORTB,W
MOVWF DATEEPROM ;ALMACENAR VALOR DEL PUERTOB EN DATOEEPROM
CALL ESCRIBIR
goto SALIDA ;salir
Apagar MOVWF TMP ;mover valor de tabla a variable temporal
COMF TMP,W ;invertir el valor de los bits(Complementar)(Seria la funcion NOT)
ANDWF PORTB,F ;al hacer una AND, se pone a cero el rele seleccionado.
CLRF DIREEPROM ;grabar en posicion EEPROM 0x00
MOVF PORTB,W
MOVWF DATEEPROM ;ALMACENAR VALOR DEL PUERTOB EN DATOEEPROM
CALL ESCRIBIR
SALIDA CALL RESETALL
RETURN
NIBBLEBAJO MOVLW 0X0F
ANDWF INDF,W
XORWF AUX,W
IORWF IGUALES,F
INCF FSR,F
CLRF METHOD
RETURN
NIBBLEALTO decf DIGITOSREST,W
btfsc STATUS,Z
goto PenultimoDetectado
SWAPF INDF,W ;DAR VUELTA LOS NIBBLES( NIBBLE = GRUPO DE 4 BITS = MEDIO BYTE)
ANDLW 0X0F
XORWF AUX,W
IORWF IGUALES,F
INCF METHOD,F
RETURN
PenultimoDetectado
movf AUX,W
movwf NumRele
return
GETCODE MOVLW 0X12
MOVWF Digit1y2code
MOVLW 0X34
MOVWF Digit3y4code
MOVLW 0X56
MOVWF Digit5y6code
MOVLW 0X78
MOVWF Digit7y8code
RETURN
RESETALL CLRF IGUALES
CLRF METHOD
MOVLW 0X22 ;debe ser siempre igual a la posicion de memoria de
;Digit1y2code
MOVWF FSR
MOVLW 0X0A
MOVWF DIGITOSREST
RETURN
TABLA ADDWF PCL,1
RETLW .0
RETLW .1
RETLW .2
RETLW .4
RETLW .8
RETLW .16
RETLW .32
RETLW .64
RETLW .128
; RETLW .X
; RETLW .X
; RETLW .X
; RETLW .X
; RETLW .X
; RETLW .X
; RETLW .X
LEER MOVF DIREEPROM,W ;no entiendo esto
BSF STATUS, RP0
MOVWF EEADR
BSF EECON1, RD
MOVF EEDATA, W
BCF STATUS, RP0
RETURN
ESCRIBIR MOVF DIREEPROM,W
BSF STATUS,RP0
MOVWF EEADR
BCF STATUS,RP0
MOVF DATEEPROM,W ;no entiendo esto
BSF STATUS,RP0
MOVWF EEDATA
BSF EECON1, WREN
BCF INTCON, GIE
BTFSC INTCON,GIE
GOTO $-2
MOVLW 0x55
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1,WR
BCF STATUS,RP0
BSF INTCON, GIE
RETURN
END
Mucho les agradezco su colaboracion.
Atte. nelson rincon