Autor Tema: cambio de codigo de 16f84a a 16f877a  (Leído 1396 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado sergioneri

  • PIC10
  • *
  • Mensajes: 31
cambio de codigo de 16f84a a 16f877a
« en: 14 de Julio de 2009, 13:42:36 »
hola saludos preguntando una duda, es que queria hacer pequenos ejercisios y me encontre este que ess un dado que Básicamente es un registro que cuenta del 1 al 6 ,se borra y vuelve a empezar a contar hasta que detecte una pulsación, dicho numero queda almacenado y hago que parpadee 3 veces, se apaga y continua rodando con el siguiente numero. mi problema es que esta hecho para el pic16f84a y yo lo queria para el pic16f87a , pero cambie las plantillas ya para el que quiero y me paraece que en el 16f877a tiene todas las entradas y salidas que salen del 16f84a, pero no se que mas cambiarle , y al hacerlo no me jala no seque otra cosa me falte , aqui esta el codigo:
;DIRECTIVAS DEL PROGRAMA
                           
             LIST          p=16F84A
             RADIX         HEX   


;ETIQUETAS DEL PROGRAMA
             W             EQU       0x00                       
             F             EQU       0x01
             TMRO_OPT      EQU       0x01
             PC            EQU       0x02
             Z             EQU       0X02
             ESTADO        EQU       0x03
             PUERTAA       EQU       0x05
             PUERTAB       EQU       0x06
             INTCON        EQU       0x0B
             NUMERO        EQU       0x10  ;REGISTRO AUXILIAR
             VER           EQU       0x11  ;REGISTRO AUXILIAR
             ACTIVAR       EQU       0x13  ;REGISTRO AUXILIAR

;PROGRAMA PRINCIPAL

                                       
             ORG           0               ;COMENZAREMOS EN LA DIRECCION 0                                   
             goto          INICIO          ;SALTAREMOS A LA DIRECCION 5
                                           ;PARA SOBREPASAR EL VECTOR
             ORG           5               ;DE INTERRUPCION.

INICIO       bsf           ESTADO, 5       ;NOS SITUAMOS EN EL BANCO 1.
             movlw         b'00000111'     ;CARGA EL VALOR MAXIMO EN EL
             movwf         TMRO_OPT        ;PREDIVISOR TMR0 ( 256 ).             
                       
             movlw         b'00000001'     ;CARGO RA0 COMO ENTRADA.
             movwf         PUERTAA
             clrf          PUERTAB         ;PUERTAB ACTUA COMO SALIDA.
             bcf           ESTADO, 5       ;NOS SITUAMOS EN EL BANCO 0.

             clrf          PUERTAA         ;BORRAMOS PUERTAA.
             clrf          PUERTAB         ;BORRAMOS PUERTAB.
             


;******************* RUTINA DE ACTIVACION DEL ZUMBADOR ************************

ACTIVA       btfss         PUERTAA,0       ;ESPERA A QUE EL PULSADOR
             goto          ACTIVA          ;SEA ACTIVADO. 

             movlw         0x01            ;DETECTA LA PULSACION Y PONE UN 1
             call          DIS7SEG         ;EN EL DISPLAY Y EL ZUMBADOR
             movwf         PUERTAB         ;FUNCIONARA.

             bsf           PUERTAA, 1      ;PONE A 1 LA SALIDA RA1, DEL ZUMBADOR
             bsf           PUERTAA, 2      ;PONE A 1 LA SALIDA RA2, DEL LED
             call          ZUMBADOR        ;LLAMA A LA RUTINA, PIERDE 0'1 SEG.
             bcf           PUERTAA, 1      ;TERMINA DE SONAR EL ZUMBADOR.
             bcf           PUERTAA, 2      ;SE APAGA EL LED.

             call          DISPLAY         ;RUTINA QUE PIERDE 0'5 SEGUNDO
             clrf          PUERTAB         ;BORRA EL DISPLAY
             
         
;******************** RUTINA DE DESACTIVACION DEL ZUMBADOR ********************

             btfss         PUERTAA,0       ;COMPRUEBA SI EL PULSADOR SIGUE
                                           ;APRETADO.
             goto          DA_DO           ;SI NO ESTA PULSADO VA A DA_DO.
             
             movlw         0x00            ;PONE UN 0 EN W
             call          DIS7SEG         ;LLAMA A LA RUTINA QUE TRANSFORMA
                                           ;EL NUMERO PARA SER VISUALIZADO ,
             movwf         PUERTAB         ;ES VISUALIZADO EN LA PUERTAB Y POR
                                           ;TANTO EN EL DISPLAY.
             call          DISPLAY         ;PERDIDA DE TIEMPO 0'5 SEGUNDO.
             clrf          PUERTAB         ;BORRA EL DISPLAY.
             call          DISPLAY
             bsf           ACTIVAR, 1      ;PONE UN 1 EN EL BITE DEL REGISTRO.
             goto          DADO            ;VA A DADO.

;******************** RUTINA  PARA VISUALIZAR EL NUMERO ***********************         
                                 
DA_DO        call           DISPLAY        ;RUTINA QUE PIERDE 0'5 SEGUNDO.
DADO         movlw          0x01           ;EMPEZAMOS CON EL NUMERO 1.
             movwf          NUMERO         ;DEPOSITA EL 1 EN EL REGISTRO NUMERO.
OTRA_VEZ     call           ESCOGE         ;LLAMA A LA RUTINA QUE ESCOGE NUMERO.
             call           DIS7SEG        ;LLAMA A LA RUTINA QUE TRANSFORMA
             movwf          PUERTAB        ;Y VISUALIZA EL NUMERO EN EL DISPLAY.
             goto           OTRA_VEZ       ;VA A,  OTRA VEZ.

;******************* RUTINA PARA ESCOGER UN NUMERO ****************************

ESCOGE       btfsc          PUERTAA, 0     ;ESPERA A QUE SEA ACTIVADO EL
             goto           VOLVER         ;PULSADOR.
SEGUIR       movlw          b'00000110'    ;AQUI COMPARA EL NUMERO , CON EL 6
             subwf          NUMERO, W      ;SI ES UN 6 EMPEZARA A CONTAR DE
             btfsc          ESTADO, Z      ;NUEVO.

             clrf           NUMERO         ;BORRA EL REGISTRO NUMERO.
             incf           NUMERO, F      ;INCREMENTA EL REGISTRO NUMERO Y LO
             movfw          NUMERO         ;DEPOSITA EN EL PROPIO REGISTRO.
             call           DIS7SEG        ;LLAMADA PARA QUE EL NUMERO SE
             movwf          PUERTAB        ;VEA EN EL DISPLAY.
             call           TIEMPO         ;PIERDE 0'05 SEGUNDO.
             goto           ESCOGE         ;VA A ESCOGE.

;******************* RUTINA DE PARPADEO DEL DISPLAY ***************************

VOLVER       btfss          ACTIVAR, 1     ;TESTEA EL REGISTRO Y SI VALE 1
             bsf            PUERTAA, 1     ;SALTARA Y EL ZUMBADOR NO SUENA.
             bsf            PUERTAA, 2     ;ENCIENDE EL LED AL PRESIONAR.
                                           
             call           ZUMBADOR       ;PERDIDA DE TIEMPO DE 0'1 SEG.
             btfss          ACTIVAR, 1     ;SALTA SI EL BITE VALE 1.
             bcf            PUERTAA, 1     ;APAGA EL ZUMBADOR.
             bcf            PUERTAA, 2     ;APAGA EL LED.

             movfw          NUMERO         ;W SE CARGA CON EL ULTIMO NUMERO.
             call           DIS7SEG        ;RUTINA PARA VISUALIZAR EL NUNERO
             movwf          PUERTAB        ;EN EL DISPLAY.
             call           DISPLAY        ;PERDIDA DE TIEMPO DE 0'5 SEGUNDO.
             clrf           PUERTAB        ;BORRA EL DISPLAY.
             call           DISPLAY        ;PERDIDA DE TIEMPO DE 0'5 SEGUNDO.

             movfw          NUMERO         ;SE REPITE OTRA VEZ LO MISMO.
             call           DIS7SEG
             movwf          PUERTAB
             call           DISPLAY
             clrf           PUERTAB
             call           DISPLAY

             movfw          NUMERO
             call           DIS7SEG
             movwf          PUERTAB
             call           DISPLAY
             clrf           PUERTAB
             call           DISPLAY

             movfw          NUMERO
             call           DIS7SEG
             movwf          PUERTAB
             call           DISPLAY
             clrf           PUERTAB
             call           DISPLAY
             
             goto           SEGUIR         ;VA A SEGUIR
   
;******************** RUTINA PARA PERDER TIEMPO ********************************

TIEMPO1      bcf            INTCON,2       ;BORRA EL TESTIGO DE DESBORDAMIENTO
             movlw          0xD9           ;CARGO EL NUMERO 217 EN TMRO, CON LO
                                           ;CUAL CONTARA 39 VECES, (256-217=39).

             movwf          TMRO_OPT       
TIEMPO2      btfss          INTCON, 2      ;MIRA EL TESTIGO DE DESBORDAMIENTO
             goto           TIEMPO2        ;Y SALTARA CUANDO TERMINE DE CONTAR.
           
             decfsz         VER,F          ;RESTA EL REGISTRO VER Y LO DEPOSITA
             goto           TIEMPO1        ;EN EL MISMO, HASTA VALER 0.
         
             return

;******************* RUTINA DE 0'1 SEGUNDO *************************************

ZUMBADOR     movlw          0x0A           ;CARGO EL NUMERO 10 EN W.
             goto           MAS            ;VA A MAS.

;******************* RUTINA DE 0'5 SEGUNDO *************************************
DISPLAY      movlw          032            ;CARGO EL NUMERO 50 EN W.
             goto           MAS            ;VA A MAS.

;******************* RUTINA DE 0'05 SEGUNDO ************************************

TIEMPO       movlw          0x05           ;CARGO EL NUMERO 5 EN W.
MAS          movwf          VER            ;SE DEPOSITA EN EL REGISTRO VER.
             call           TIEMPO1        ;VA A TIEMPO1.

             return
;****************** RUTINA DE VISUALIZACION ************************************

DIS7SEG     addwf           PC,F           ;COGE EL VALOR HEX Y LO CONVIERTE.
                                           ;EN EL NUMERO PARA QUE SE VEA EN
            retlw           3F             ;DISPLAY.
            retlw           06
            retlw           5B
            retlw           4F
            retlw           66
            retlw           6D
            retlw           7D

            END           

ojala me puedan ayudar saludos

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: cambio de codigo de 16f84a a 16f877a
« Respuesta #1 en: 14 de Julio de 2009, 14:21:09 »
Los registros de uso general en el 877 son a partir de 0x20, y si vas a utilizar el Puerto A debes deshabilitar el módulo A/D, cargando con 0x06 a ADCON1. Creo que teniendo en cuenta eso, este código funcionaria correctamente.

Saludos!
No contesto mensajes privados, las consultas en el foro


 

anything