TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: spidermayen en 18 de Junio de 2005, 04:56:00

Título: Como convertir un programa del 16f84a al 16f628
Publicado por: spidermayen en 18 de Junio de 2005, 04:56:00
Tengo un programa que funciona en el pic 16f84 pero quiero utilizarlo en un 16f628 ojala alguien pueda ayudarme. gracias

INCLUDE   "P16F84.INC"
PC   EQU   2H
STATUS   EQU   3H
PORT_A   EQU   5H
PORT_B   EQU   6H

SENSOR   EQU   1DH
PUERTO   EQU   1CH   ;GUARDO EL VALOR VIEJO DEL PUERTO
LAP   EQU   1BH   ;SI LAP=1 MANTIENE EL VISOR SIN ACTUALIZAR
UNIDAD   EQU   14H  ;CONTADORES UNIDADES
DECENA   EQU   15H   ;
CENTENA   EQU   16H   ;
UNIMIL   EQU   17H   ;
DECMIL   EQU   18H   ;
CENMIL   EQU   19H   ;
MILLON   EQU   1AH   ;

DELAY2   EQU   1EH
DELAY1   EQU   0CH
REFRESH   EQU   0DH
TEMPO   EQU   13H
Z   EQU   2H
C   EQU   0H
W   EQU   0H
R   EQU   1H
E   EQU   1H  ;PATA18 MICRO     A LA PATA 6 (E) HABILITACION DEL MODULO
RS   EQU   0H  ;PATA17 MICRO     A LA PATA 4 DEL MODULO (RS - INSTRUCCION O CARACTER)
;          PATA 2 DEL MODULO A +VCC
;         3 REGULA CONTRASTE, AL PUNTO MEDIO DE UN POTE 5K ENTRE VCC Y MASA
;         5 Y 1 A MASA - YO EMPLEO 2 R FIJAS,  DE 1K
;PATA 6 DEL PIC----->A LA 7 DEL MODULO
;   7----------> 8
;   8----------->9
;   9---------->10
;   10--------->11
;   11--------->12
;   12--------->13
;   13--------->14
;            PARA LA ILUMINACION POSTERIOR, UNA RESISTENCIA DE 220 OHMS A +5V
;   PATA 1 DEL MICRO, RESISTENCIA 1K A VCC, Y PULSADOR A MASA
;   PATA 2 DEL MICRO, RESISTENCIA 1K A VCC, Y SENSOR (YO EMPLEO INDUCTIVO)

;  17/09/2000, FUNCIONA OK

   __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC   ;CONFIGURO
;PARA LA GRABACION, CODE PROTECT OFF, RESET DE ENCENDIDO ,ETC


;*****************PROGRAMA PRINCIPAL********************************

   ORG   00   ;   VECTOR DE RESET DEL 16F84
   GOTO   INICIO
   ORG   05H

RETARDO   MOVLW   .200
   MOVWF   TEMPO
DECRE   DECFSZ   TEMPO,R
   GOTO   DECRE
   RETLW   0
;-----------------------LCD----------------------------------------
CONTROL   BCF   PORT_A,RS   ;ESTA RUTINA GENERA LAS
   GOTO   DATO2      ;SEÑALES DE CONTROL Y ENVIA
DATO   BSF   PORT_A,RS   ;EL DATO Al MODULO
DATO2   BSF   PORT_A,E   ;CON INTERFACE DE 8 BITS
   MOVWF   PORT_B
   CALL   RETARDO
   BCF   PORT_A,E
   CALL   RETARDO
   RETLW   0

TABLA2   ADDWF   PC,R      ;TABLA DE ASCII
   DT "0123456789"
;******************************************************************
;--------------------------CONTADOR DE PULSOS-------------
SUMA1
   BSF   REFRESH,0 ;MARCO UN BIT PARA PRESENTAR EN PANTALLA
            ;SI ES 1, LO MUESTRA SOLO UNA VEZ
SUME   INCF   UNIDAD,1
   MOVLW   .10   ;   VERIFICA SI ES IGUAL A 10
   XORWF   UNIDAD,W   ;PREGUNTA SI=10
   BTFSS   STATUS,Z   ;
   RETLW   0
   CLRF   UNIDAD   ;   SI LLEGO A 10 LA COLOCO EN CERO
;DECENAS
   INCF   DECENA,1   ;LE SUMO 1 A LA DECENA   
   MOVLW   .10   ;   VERIFICA SI ES IGUAL A 10
   XORWF   DECENA,W   ;PREGUNTA SI=10
   BTFSS   STATUS,Z   ;
   RETLW   0
   CLRF   DECENA   
;CENTENAS
   INCF   CENTENA,1   ;LE SUMO 1 A LA DECENA   
   MOVLW   .10      ;VERIFICA SI ES IGUAL A 10
   XORWF   CENTENA,W   ;PREGUNTA SI=10
   BTFSS   STATUS,Z   ;
   RETLW   0
   CLRF   CENTENA   
;UNIDAD DE MIL
   INCF   UNIMIL,1   ;LE SUMO 1 A LA DECENA   
   MOVLW   .10      ;VERIFICA SI ES IGUAL A 10
   XORWF   UNIMIL,W   ;PREGUNTA SI=10
   BTFSS   STATUS,Z   ;
   RETLW   0
   CLRF   UNIMIL
;DECENA DE MIL    
   INCF   DECMIL,1   ;LE SUMO 1 A LA DECENA   
   MOVLW   .10      ;VERIFICA SI ES IGUAL A 10
   XORWF   DECMIL,W   ;PREGUNTA SI=10
   BTFSS   STATUS,Z   ;
   RETLW   0
   CLRF   DECMIL   
;CENTENA DE MIL
   INCF   CENMIL,1   ;LE SUMO 1 A LA DECENA   
   MOVLW   .10      ;VERIFICA SI ES IGUAL A 10
   XORWF   CENMIL,W   ;PREGUNTA SI=10
   BTFSS   STATUS,Z   ;
   RETLW   0
   CLRF   CENMIL
;MILLON
   INCF   MILLON,1   ;LE SUMO 1 A LA DECENA   
   MOVLW   .10      ;VERIFICA SI ES IGUAL A 10
   XORWF   MILLON,W   ;PREGUNTA SI=10
   BTFSS   STATUS,Z   ;
   RETLW   0
   CLRF   MILLON
   RETLW   0
;**************************SENSAR*************************
;DETECTA LOS FLANCOS del SENSOR Y PULSADO DE TECLA
;EL SENSOR ESTA SOBRE UN ENGRANAJE, Y CUENTA LOS "BORDES"
;EN EL MOMENTO DE "SOLTAR" EL PULSADOR QUEDA "FIJO" EL CONTADOR
;Y APARECE LA PALABRA "MEMORIA" EN EL LCD
;---------------------------------------------------------
LEER
   COMF   PUERTO,F   ;TRANSFORMO LOS CEROS EN UNOS
   MOVF   PORT_A,W   ;LEO PORT_A Y GUARDO EN W
   ANDWF   PUERTO,F

SENSAR           ;SENSOR MAGNETICO
   BTFSC   PUERTO,3
   GOTO   FLANCO      ;SI HAY FLANCO IR A SUMAR
   GOTO   PULSADOR
SALIDA
   MOVF   PORT_A,W
   MOVWF   PUERTO      ;GUARDO EL ACTUAL PARA LA PROXIMA VEZ
   RETLW   0

FLANCO
   CALL   SUMA1   ;SI HAY FLANCO, LO SUMO
         ;Y AHORA PRUEBO EL ESTADO DEL PULSADOR
;--------------------------------------------------------------
PULSADOR   ;LEER ESTADO DEL PULSADOR
   BTFSS   PORT_A,2    ;ESTA SIN PRESIONAR (1) SALTO
   GOTO   MARCAR
   BTFSS   REFRESH,2   ;LEO SI YA INDICO QUE PULSARON
   GOTO   SALIDA
   BCF   REFRESH,2   ;BORRO LA MARCA,SOLTARON EL PULSADOR      
   INCF   LAP,1      ;SUMA POR CADA FLANCO ASCEND O DESCEND
   BCF   REFRESH,1    ;BORRO PARA QUE ESCRIBA "MEMORIA"
   GOTO   SALIDA
MARCAR   
   BSF   REFRESH,2
   GOTO   SALIDA

;========================================================
INICIO   NOP
   ;CLRF   UNIDAD
   MOVLW   .255   ;PORQUE APARECE EL CONTADOR EN UNO
   MOVWF   UNIDAD   ; Y ASI AL SUMAR EMPIEZA EN CERO   (???)
   CLRF   DECENA
   CLRF   CENTENA
   CLRF   UNIMIL
   CLRF   DECMIL
   CLRF   CENMIL
   CLRF   MILLON
   CLRF   LAP
   CLRF   REFRESH
   CLRF   PUERTO

   MOVLW   0FCH   ;FCH="11111100"  PROGRAMACION DE PUERTOS
   TRIS   PORT_A   ;SEGUN CIRCUITO, 2 ENTRADAS (SENSOR Y PULSADOR)
   MOVLW   00H
   TRIS   PORT_B   ;TODAS SALIDAS
BEGIN   MOVLW   30H   ;INICIO DEL MODULO A 8 BITS
   CALL   CONTROL   ;Y UNA LINEA
   ;MOVLW   07H   ;SELECCIONA MODO ROTAR,EL MENSAJE SALE DE LA DERECHA Y PASA A IZQ.
   MOVLW   06H   ;modo fijo a la izq y se agregan a la derecha
   CALL   CONTROL   ;EL MENSAJE
   MOVLW   0CH   ;ACTIVA EL DISPLAY
   CALL   CONTROL
;************************MOSTRAR MARCA**************************
;         MICROPIC 2001                      *
;***************************************************************
   CALL   RETARDO
MP2001   ;ESCRIBE CONTADOR EN EL LCD,
   BTFSC   REFRESH,1   
   GOTO   PRINCIPAL   
   MOVLW   " "      
   CALL   DATO
   CALL   RETARDO      ;PODRIA EMPLEAR UNA TABLA
            ;Y DECREMENTAR UN CONTADOR
   MOVLW   " "      ;CON LA CANTIDAD DE CARACTERES
   CALL   DATO      ;PERO ESTO ES MUY FACIL!!!!
   CALL   RETARDO


   MOVLW   "C"
   CALL   DATO
   CALL   RETARDO

   MOVLW   "O"
   CALL   DATO
   CALL   RETARDO

   MOVLW   "N"
   CALL   DATO
   CALL   RETARDO

   MOVLW   "T"
   CALL   DATO
   CALL   RETARDO

   MOVLW   "A"
   CALL   DATO
   CALL   RETARDO

   MOVLW   "D"
   CALL   DATO
   CALL   RETARDO

   MOVLW   "O"
   CALL   DATO
   CALL   RETARDO


   MOVLW   "R"      
   CALL   DATO
   CALL   RETARDO


   MOVLW   " "      
   CALL   DATO
   CALL   RETARDO

   MOVLW   "2"      
   CALL   DATO
   CALL   RETARDO

   MOVLW   "0"      
   CALL   DATO
   CALL   RETARDO

   MOVLW   "0"      
   CALL   DATO
   CALL   RETARDO

   MOVLW   "1"      
   CALL   DATO
   CALL   RETARDO

   MOVLW   .25
   MOVWF   DELAY2
RETAR3   MOVLW   .255
   MOVWF   DELAY1      ;RETARDO DE VISUALIZACION DE MARCA
DECRE1   CALL   RETARDO      ;SOLO APARECE EN EL RESET DE INICIO
   DECFSZ   DELAY1,R    
   GOTO   DECRE1   
   DECFSZ   DELAY2,R
   GOTO   RETAR3

;====================================================================
PRINCIPAL
   CALL    LEER      ;SI ESTA PULSADO, QUEDA FIJO LA LECTURA
   BTFSC   LAP,0      ;PERO CONTINUA CONTANDO PULSOS
   GOTO   MEMORY      ;PRINCIPAL
   BTFSS   REFRESH,0   ;SI BIT=1 MOSTRAR, LUEGO LO PONGO EN 0
   GOTO   PRINCIPAL   ;PARA NO PERDER TIEMPO EN MOSTRAR LO MISMO
   GOTO   MOSTRAR

MEMORY   ;ESCRIBE "MEMORIA" EN EL LCD, MANTIENE FIJO EL VALOR DEL CONTADOR
   BTFSC   REFRESH,1   ;PARA UNA FACIL VISUALIZACION, PERO SIGUE
   GOTO   PRINCIPAL   ;INTERNAMENTE ACTUALIZANDO LA CUENTA DE
   MOVLW   " "      ;PULSOS
   CALL   DATO
   CALL   RETARDO

   MOVLW   "M"
   CALL   DATO
   CALL   RETARDO

   MOVLW   "E"
   CALL   DATO
   CALL   RETARDO

   MOVLW   "M"
   CALL   DATO
   CALL   RETARDO

   MOVLW   "O"
   CALL   DATO
   CALL   RETARDO

   MOVLW   "R"
   CALL   DATO
   CALL   RETARDO

   MOVLW   "I"
   CALL   DATO
   CALL   RETARDO

   MOVLW   "A"
   CALL   DATO
   CALL   RETARDO

   BSF   REFRESH,1   ;MEMORIZO QUE YA ESCRIBIO
   GOTO   PRINCIPAL

;****************<PRESENTACION EN EL LCD>***********************************
MOSTRAR   
   BCF   REFRESH,0   ;BORRO BIT PORQUE YA LO MUESTRO
;   MOVLW   0      ;INICIA EL ENVIO DE DATOS
;   MOVWF   R0C      ;AL MODULO

BLANK   MOVLW   01H      ;BORRA DISPLAY
   CALL   CONTROL

CICLO   
   MOVWF   " "      ;PARA DESPLAZAR UN CARACTER (00H) QUE NO ES VISIBLE
   CALL   DATO      ;Y EMPIECE A ESCRIBIR EN 01H DEL DISPLAY
   CALL   RETARDO
   ;CALL   LEER

   MOVF   MILLON,W   ;IMPRIMO VALOR DE "MILLON"
   CALL   TABLA2      ;PASO DEL NUMERO AL ASCII
   CALL   DATO      ;INFORMO AL LCD QUE ENVIO UN "DATO"
   CALL   RETARDO      ;RETARDO POR EL LENTO LCD
   CALL   LEER      ;VOY A LEER POR SI HAY CAMBIOS EN SENSOR
            ;O PULSADOR DE "MEMORIA"
   MOVF   CENMIL,W   ;
   CALL    TABLA2      ;IMPRIMO VALOR DE CENTENA DE MILLON
   CALL   DATO
   CALL   RETARDO
   ;CALL   LEER

   MOVF   DECMIL,W   ;DECENA DE MILLON
   CALL    TABLA2
   CALL   DATO
   CALL   RETARDO
   CALL   LEER

   MOVF   UNIMIL,W   ;UNIDAD DE MILLON
   CALL    TABLA2
   CALL   DATO
   CALL   RETARDO
   ;CALL   LEER

   MOVF   CENTENA,W   ;CENTENA
   CALL    TABLA2
   CALL   DATO
   CALL   RETARDO
   CALL   LEER

   MOVF   DECENA,W   ;DECENA
   CALL    TABLA2
   CALL   DATO
   CALL   RETARDO
   ;CALL   LEER

   MOVF   UNIDAD,W   ;UNIDAD
   CALL    TABLA2
   CALL   DATO
   CALL   RETARDO
   CALL   LEER

   GOTO    PRINCIPAL
;************************************************************************
   END   
Título: RE: Como convertir un programa del 16f84a al 16f628
Publicado por: antoniof en 18 de Junio de 2005, 05:12:00
Lo único que diferencia a estos micros son los periféricos y, por lo tanto, el mapa de memoria. Tienes que definir los registros de tu programa a partir de la dirección 0x20:

Codigo:
SENSOR EQU 20H
PUERTO EQU 21H ;GUARDO EL VALOR VIEJO DEL PUERTO
LAP EQU 22H ;SI LAP=1 MANTIENE EL VISOR SIN ACTUALIZAR
UNIDAD EQU 23H ;CONTADORES UNIDADES
DECENA EQU 24H ;
CENTENA EQU 25H ;
UNIMIL EQU 26H ;
DECMIL EQU 27H ;
CENMIL EQU 28H ;
MILLON EQU 29H ;


Si con esto no te acaba de funcionar, debes comprobar en el data sheet que no tenga ningún periférico (Comparador, PWM, etc), activado por defecto, porque de ser asi, deberás desactivarlo antes de nada.
Título: RE: Como convertir un programa del 16f84a al 16f628
Publicado por: spidermayen en 19 de Junio de 2005, 03:39:00
Gracias amigo por responderme, ya cambie esos valores como me mencionas pero no funciona algo lei al respecto pero no entiendo algo que dice que hay que poner los pines del puerto a como digitales espero que alguien sepa decirme como lo podria hacer.  
Título: RE: Como convertir un programa del 16f84a al 16f628
Publicado por: RGL en 19 de Junio de 2005, 06:20:00
El puerto A por defecto se configura como entrada analogica a los comparadores que tiene.

Si vas a utilizar esta entradas como digitales debes poner el valor del registro CMCON=7 y ya está ajustado para entradas o salidas analógicas.

Saludos.
Ricky