Problema en la escritura de la memoria FLASH con el PIC16f876

Buenas tardes, he realizado un programa en asm con el MPLAB IDE, con el PIC16F873-04/SP lo grabo y no tengo ningún problema, pero el mismo programa con el PIC16F876-04/SP no me funciona bien. Quiero cambiar al 16f876-04/SP para ampliar la memoria FLASH.

Es raro porque son compatibles, ¿no?, ¿tengo que cambiar algo a la hora de grabar el 16f876 o modificar la palabra de configuración?

El programa consiste en escribir diferentes tiempos en formato mm:ss en la memoria FLASH del pic16f873, el pic16f84A se encarga de dar un pulso por segundo (con los botones START/STOP) a la entrada RC0 del 16f873 configurada como TMR1

Una vez memorizados estos puntos en la FLASH del PIC pulsamos el botón de START del 16f84A, de esta manera iniciamos el cronometro.

Al pulsar el botón COPI se realiza la resta (valor actual del TMR1 en formato mm:ss - valor escrito en la flash del pic).
El resultado de la resta se visualiza en formato segundos en la pantalla LCD 2x16 con signo + o -.

El programa me funciona bien con el PIC16f873-04/SP, pero al grabarlo con el PIC16f876-04/SP ya que quiero ampliar la memoria FLASH, no me va bien, creo que puedo tener el fallo en el proceso de escritura de la memoria FLASH o en la palabra de configuración.

Utilizo el MPLAB IDE , WINPIC800 y el grabador GTP-USB (PLUS).

Os adjunto el esquema , el programa y la subrutina de escritura de la FLASH:

Muchas gracias.

Saludos.

Subrutina de escritura FLASH, INCLUDE :

Código:
MEM_PUNTO    incf    PUNTO,F

        movf    TMR1L,W
        movwf    DATO_L
        movf    TMR1H,W
        movwf    DATO_H

        bsf     STATUS,RP1
        bcf     STATUS,RP0     ;Selección de Banco 2 de memoria
        movf     ADDRL,W     ;Se escribe en EEADRH la parte alta de la
        movwf     EEADR         ;dirección a escribir
        movf     ADDRH,W     ;Se escribe en EEADR la parte baja de la
        movwf     EEADRH         ;dirección a escribir
        movf     DATO_L,W     ;Se mete en EEI:)ATH la parte alta
        movwf     EEDATA         ;del dato a escribir
        movf     DATO_H,W     ;Se mete en EEDAL la parte baja
        movwf     EEDATH         ;del dato a escribir
        bsf     STATUS,RP0     ;Selección del banco 3 de memoria
        bsf     EECON1,EEPGD     ;Selección de acceso a la memoria FLASH
        bsf     EECON1,WREN     ;Se habilita la escritura en la memoria FLASH
        bcf     INTCON,GIE     ;Se prohíben las interrupciones
        movlw     0x55        ;Se escriben los datos 55h y AAh en el registro
        movwf     EECON2         ;EECON2 tal y como recomienda el fabricante
        movlw     0xAA
        movwf     EECON2
        bsf     EECON1,WR     ;Se da la orden de escritura
        nop             ;El microcontrolador ignora estas dos instrucciones
        nop
ESPERA_2    btfsc    EECON1,WR
        goto    ESPERA_2
        ;bsf     INTCON,GIE     ;Se habilitan las interrupciones
        bcf     EECON1,WREN     ;Se prohíbe la escritura de nuevos datos

        bcf    STATUS,RP1    ;Banco 0
        bcf    STATUS,RP0 

        incf    ADDRL,F
        ;incf    ADDRL,F
        return



Aquí esta el programa:

Código:
    __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC & _LVP_OFF
    LIST P=16F876
    INCLUDE   <P16F876.INC>

    CBLOCK 0x20 
    Lcd_Temp_1        ;Rutina lcd_cxx1.inc 
    Lcd_Temp_2        ;Rutina lcd_cxx1.inc
    BCD_Centenas
    BCD_Decenas
    BCD_Unidades
    BCD_Centenas_Min    ;BIN_BCD_MIN.INC    
    BCD_Decenas_Min    ;BIN_BCD_MIN.INC            
    BCD_Unidades_Min    ;BIN_BCD_MIN.INC
    BCD_Centenas_Seg    ;BIN_BCD_SEG.INC
    BCD_Decenas_Seg    ;BIN_BCD_SEG.INC    
    BCD_Unidades_Seg    ;BIN_BCD_SEG.INC
    BCD_Centenas_Seg_    ;BIN_BCD_SEG.INC
    BCD_Decenas_Seg_    ;BIN_BCD_SEG.INC    
    BCD_Unidades_Seg_    ;BIN_BCD_SEG.INC    
    Segundos    
    Minutos            
    MinutosSegundos_TiempoH    
    MinutosSegundos_TiempoL
    ACCaHI            ;SUSTRAENDO HI                                     
    ACCaLO        ;SUSTRAENDO LO
         ACCbHI            ;MINUENDO HI
          ACCbLO        ;MINUENDO LO    
    CONTADOR            
    TEMPORAL            
    AUX
    PUNTO
    ADDRH
    ADDRL
    DATO_H
    DATO_L
    ;Dato
    ENDC
    

    
    #DEFINE    SETT        PORTC,1
    #DEFINE    MEM        PORTC,2
    #DEFINE    COPI        PORTC,5
    #DEFINE    VISUAL        PORTC,6
    #DEFINE    PROGRUN    PORTC,7
    
                    
                    
    ORG     0X00 
    goto    INICIO
    ORG    0x05
    

INICIO        
            clrf    PORTB        ; Limpiar salidas B
            clrf    PORTA
            clrf    PORTC        ; Limpiar salidas C
            bsf    STATUS,RP0    ; Acceso al banco 1
            bcf    STATUS,RP1
            movlw    b'00000110'    ; Puerta A E/S Digitales
            movwf    ADCON1    
            clrf    TRISA    
            clrf    TRISB        ; Puerta B como salida
            movlw    0XFF
            movwf    TRISC        ; Puerta C como entrada    
            ;movlw    b'10000000'    ; Velocidad estandar con niveles I2C
            ;movwf    SSPSTAT
            ;movlw    .9        ; Velocidad de BUS I2C 100KHz
            ;movwf    SSPADD        
            bcf    STATUS,RP0    ; Banco 0
            
            ;movlw    b'00101000'    ; Módulo MSSP en On
            ;movwf    SSPCON
            call    UP_LCD    ; Configuración lineas para LCD
            call    LCD_INI        ; Inicialización LCD
            movlw    b'00001110'    ;
            call    LCD_REG    ;
            movlw    b'00000011'    ; Activa el TMR1 y selecciona entrada 
            movwf    T1CON        ; de pulsos externos en la entrada RC0   
            clrf    TMR1L
            clrf    TMR1H
            
                
            btfss    VISUAL        ;  VISUAL=1 salta y va a M1R
            goto    T1_M1R_V_INIC
            btfsc    PROGRUN    ; PROGRUN=0 salta
            goto    T1_M1R_R_INIC
            goto    T1_M1R_P_INIC
            
T1_M1R_V_INIC        movlw    b'00000100'
            movwf    ADDRH
            movlw    b'00000000'
            movwf    ADDRL
            
            movlw    .0        ; Al pulsar MEM por primera vez saldra P01
            movwf    PUNTO    
            movf    PUNTO,W
            call     BIN_a_BCD
            clrf    BCD_Decenas_Seg_
            clrf    BCD_Unidades_Seg_        
            
T1_M1R_V        call    VISUALIZAR_POS
            call    T1_
            call    M1R_
            ;btfss    SETT
            ;goto    T1_M1L_V_INIC            
            btfsc    MEM        ; Si pulsamos MEM=0 salta
            goto    T1_M1R_V
            
E_T1_M1R_V        btfss    MEM        ; Espera a dejar de pulsar MEM para saltar
            goto    E_T1_M1R_V
            call    LEE_FLASH_V
            
            movf    PUNTO,W
            call     BIN_a_BCD
            
            btfsc    DATO_L,7    ; Si el 7=1 (negativo) del DATO_L sigue 
            goto    SN_T1_M1R_V
            movf    DATO_L,W
            call    BIN_a_BCD_SEG_
            call    VISUALIZAR_POS
            call    T1_
            call    M1R_
            call    SIGNO_MA
            goto    T1_M1R_V
            
SN_T1_M1R_V        bcf    DATO_L,7
            movf    DATO_L,W
            call     BIN_a_BCD_SEG_
            call    VISUALIZAR_POS
            call    T1_
            call    M1R_
            call    SIGNO_MENO
            goto    T1_M1R_V                
                    
            
T1_M1R_P_INIC        movlw    .1
            movwf    PUNTO
            movlw    b'00000100'
            movwf    ADDRH
            movlw    b'00000000'
            movwf    ADDRL
T1_M1R_P        btfss    MEM        ; Si pulsamos MEM (RC2=0) sigue
            call    MEM_PUNTO    ; Memoriza el punto en la primera dirección
                        ; FLASH de M1R y pasa al siguiente punto 
E_T1_M1R_P        btfss    MEM        ; Si MEM=0 sigue pulsado : sigue
            goto    E_T1_M1R_P
            
            movf    PUNTO,W
            call    BIN_a_BCD
            
            movf    TMR1L,W
            movwf    MinutosSegundos_TiempoL
            movf    TMR1H,W
            movwf    MinutosSegundos_TiempoH
            call    MINUTOSSEGUNDOS_16BITS ;Convierte los 16 bits en Segundos y Minutos
            movf    Segundos,W
            call     BIN_a_BCD_SEG
            ;call    VISUALIZAR
            ;call    T1_
            ;call    M1R_
            movf    Minutos,W
            call    BIN_a_BCD_MIN
            call    VISUALIZAR
            call    T1_
            call    M1R_
            
            ;btfsc    SETT
            goto    T1_M1R_P
            ;goto    T1_M1L_P_INIC
            
            
T1_M1R_R_INIC        movlw    b'00000100'
            movwf    ADDRH
            movlw    b'00000000'
            movwf    ADDRL
            
            movlw    .0        ; Al pulsar COPI por primera vez saldra P01
            movwf    PUNTO    
            movf    PUNTO,W
            call     BIN_a_BCD
            clrf    BCD_Decenas_Seg_
            clrf    BCD_Unidades_Seg_
            
T1_M1R_R        call    TIEMP
            ;btfss    SETT
            ;goto    T1_M1L_R_INIC
            btfsc    COPI        ; Si pulsamos COPI=0 salta
            goto    T1_M1R_R

            call    LEE_FLASH
    
            ;call    VISUALIZAR_POS
            ;call    T1_
            ;call    M1R_            
            
            
E_T1_M1R_R        btfss    COPI        ; Espera a dejar de pulsar COPI para saltar
            goto    E_T1_M1R_R
            
            
            movf    PUNTO,W
            call     BIN_a_BCD
            
            movf    TMR1L,W    ; Minuendo
            movwf    ACCbLO
            movf    TMR1H,W
            movwf    ACCbHI
            movf    DATO_H,W    ; Sustraendo
            movwf    ACCaHI
            movf    DATO_L,W
            movwf    ACCaLO
            
            call    RESTA
            
            btfss    STATUS,C    ; Si el C=0 (negativo) del ACCbHI sigue 
            goto    signo_negativo
            movf    ACCbLO,W
            call    BIN_a_BCD_SEG_
            call    VISUALIZAR_POS
            ;call    T1_
            ;call    M1R_
            call    SIGNO_MA
            ;call    MEM_PUNTO_MAS
            ;movf    ACCbLO,W
            ;call    I2C_DISPLAY_7
            goto    T1_M1R_R
            
signo_negativo        comf    ACCbLO,F    ; Como la resta es negativa, complem. a 1
            incf    ACCbLO,F    ; Sumar 1
            movf    ACCbLO,W
            call     BIN_a_BCD_SEG_
            call    VISUALIZAR_POS
        ;    call    T1_
        ;    call    M1R_
            call    SIGNO_MENO
        ;    call    MEM_PUNTO_MENOS
            ;movf    ACCbLO,W
            ;call    I2C_DISPLAY_7
            goto    T1_M1R_R
        
                
                
               INCLUDE 
               ;INCLUDE 
               INCLUDE 
               ;INCLUDE 
               INCLUDE 
               INCLUDE 
               INCLUDE 
               INCLUDE 
               INCLUDE 
               INCLUDE 
               INCLUDE 
               INCLUDE 
               INCLUDE 
               INCLUDE 
               INCLUDE 
               INCLUDE 
               INCLUDE 
               INCLUDE 
               INCLUDE 
               INCLUDE 
               INCLUDE 
               ;INCLUDE 
               ;INCLUDE 
               ;INCLUDE 
        
               
            END
 

Adjuntos

  • ESQUEMA RALLY PIC.pdf
    39 KB · Visitas: 12
Última edición:
que tal javialvar, viendo tu codigo el problemas esta en el cambio de bancos
ADDRL,W se encuentra en banco 0 y EEADR se encuentra en banco2 y lo que tu haces es pasarte al banco2 y mover el contenido de ADDRL a w(banco 0) y despues pasarlo a EEADR(banco2) revisa los cambios de banco y checate el tuto pdf de pic16f877 de raul peralta
 
Última edición:
Muchas gracias Proteus7, he modificado los bancos que me has dicho y sigo con el mismo problema.
Este cambio lo he probado con el PIC16F873-04/SP y me funciona bien el programa, pero el mismo programa con el PIC16F876-04/SP, me va mal.

¿El proceso de grabación del Pic16f873 es igual al del pic16f876?

Adjunto la modificación que me has dicho en la subrutina para escribir en la FLASH:

Código:
MEM_PUNTO    incf    PUNTO,F

        movf    TMR1L,W
        movwf    DATO_L
        movf    TMR1H,W
        movwf    DATO_H

        movf    ADDRL,W

        bsf     STATUS,RP1
        bcf     STATUS,RP0     ;Selección de Banco 2 de memoria
        movwf     EEADR         ;dirección a escribir
        bcf    STATUS,RP1    ;Banco 0
        bcf    STATUS,RP0 
        movf     ADDRH,W     ;Se escribe en EEADR la parte baja de la
        bsf     STATUS,RP1    ;Banco 2
        bcf     STATUS,RP0
        movwf     EEADRH         ;dirección a escribir
        bcf    STATUS,RP1    ;Banco 0
        bcf    STATUS,RP0 
        movf     DATO_L,W     ;Se mete en EEI:)ATH la parte alta
        bsf     STATUS,RP1    ;Banco 2
        bcf     STATUS,RP0
        movwf     EEDATA         ;del dato a escribir
        bcf    STATUS,RP1    ;Banco 0
        bcf    STATUS,RP0
        movf     DATO_H,W     ;Se mete en EEDAL la parte baja
        bsf     STATUS,RP1    ;Banco 2
        bcf     STATUS,RP0
        movwf     EEDATH         ;del dato a escribir
        bsf     STATUS,RP0     ;Selección del banco 3 de memoria
        bsf    STATUS,RP1
        bsf     EECON1,EEPGD     ;Selección de acceso a la memoria FLASH
        bsf     EECON1,WREN     ;Se habilita la escritura en la memoria FLASH
        bcf     INTCON,GIE     ;Se prohíben las interrupciones
        movlw     0x55        ;Se escriben los datos 55h y AAh en el registro
        movwf     EECON2         ;EECON2 tal y como recomienda el fabricante
        movlw     0xAA
        movwf     EECON2
        bsf     EECON1,WR     ;Se da la orden de escritura
        nop             ;El microcontrolador ignora estas dos instrucciones
        nop
ESPERA_2    btfsc    EECON1,WR
        goto    ESPERA_2
        ;bsf     INTCON,GIE     ;Se habilitan las interrupciones
        bcf     EECON1,WREN     ;Se prohíbe la escritura de nuevos datos

        bcf    STATUS,RP1    ;Banco 0
        bcf    STATUS,RP0 

        incf    ADDRL,F
        ;incf    ADDRL,F
        return
 
Última edición:
Te adjunto un ejemplo que hice en proteus y asm
compara la rutina escribir _eeprom con la tuya, veo que agrgaste cosas de mas como ADDRH y EEADRH talvez por eso no fuciona , checa la simulacion , por el puerto c escribes el dat a escribir y al presionar el boton que esta conectado al puerta A comienza a escribir en la eepron y despues lee la eeprom y muestra el dato escrito anteriormente y los muestra en port b
 

Adjuntos

  • SCRIBE EEPROM PIC16F876A.rar
    34.3 KB · Visitas: 10
Última edición:
Te adjunto un ejemplo que hice en proteus y asm
compara la rutina escribir _eeprom con la tuya, veo que agrgaste cosas de mas como ADDRH y EEADRH talvez por eso no fuciona , checa la simulacion , por el puerto c escribes el dat a escribir y al presionar el boton que esta conectado al puerta A comienza a escribir en la eepron y despues lee la eeprom y muestra el dato escrito anteriormente y los muestra en port b

Gracias, voy a repasar las rutinas q me has enviado, pero al escribir en la memoria Flash del pic necesito 16 bits, por eso utilizo ADDRH Y ADDRL.

Saludos.
 
Buenas tardes, estoy realizando un proyecto para visualizar a la vez dos dígitos en una pantalla LCD y en 2 displays de 7 segmentos al accionar el pulsador COPI (cada vez que pulso COPI se incrementa en una unidad).

Para visualizar los 2 displays de 7 segmentos utilizo el integrado SAA1064 con comunicación I2C.

El programa me va bien, pero cuando intento añadirle más subrutinas, concretamente esta: INCLUDE <VISUALIZAR2X16_RALLY_TIEMPO.INC> para ampliar el programa no veo nada en la pantalla LCD ni en los 2 displays de 7 segmentos o aparecen cosas raras en los displays de 7 segmentos.

Gracias.

Saludos.

Os adjunto el programa (funciona bien):

Código:
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC& _LVP_OFF
    LIST P=16F876
    INCLUDE <p16F876.INC>

    CBLOCK    0X20
    Lcd_Temp_1        ;Rutina lcd_cxx1.inc 
    Lcd_Temp_2        ;Rutina lcd_cxx1.inc
    BCD_Centenas        ;BIN_BCD.INC
    BCD_Decenas        ;BIN_BCD.INC
    BCD_Unidades        ;BIN_BCD.INC
    BCD_Centenas_Min    ;BIN_BCD_MIN.INC    
    BCD_Decenas_Min                  ;BIN_BCD_MIN.INC            
    BCD_Unidades_Min                  ;BIN_BCD_MIN.INC
    BCD_Centenas_Seg    ;BIN_BCD_SEG.INC
    BCD_Decenas_Seg                  ;BIN_BCD_SEG.INC    
    BCD_Unidades_Seg    ;BIN_BCD_SEG.INC
    BCD_Centenas_Seg_    ;BIN_BCD_SEG.INC
    BCD_Decenas_Seg_    ;BIN_BCD_SEG.INC    
    BCD_Unidades_Seg_    ;BIN_BCD_SEG.INC    
    BCD_Centenas_I2C     ;BIN_BCD_SEG.INC 
    BCD_Decenas_I2C                   ;BIN_BCD_SEG.INC
    BCD_Unidades_I2C                  ;BIN_BCD_SEG.INC    
    Segundos    
    Minutos            
    MinutosSegundos_TiempoH    
    MinutosSegundos_TiempoL
    ACCaHI        ;SUSTRAENDO HI                                     
    ACCaLO                  ;SUSTRAENDO LO
         ACCbHI        ;MINUENDO HI
          ACCbLO                  ;MINUENDO LO    
    CONTADOR            
    TEMPORAL            
    AUX
    PUNTO
    ADDRH
    ADDRL
    DATO_H
    DATO_L
    Dato
    Dato1
    ENDC

    ;#DEFINE    SETT        PORTC,1
    ;#DEFINE    MEM        PORTC,2
    #DEFINE    COPI        PORTC,5
    ;#DEFINE    VISUAL        PORTC,6
    ;#DEFINE    PROGRUN    PORTC,7
    #define         ENABLE           bsf PORTA,2        ;Activa señal E
    #define         DISABLE          bcf PORTA,2        ;Desactiva señal E
    #define         LEER             bsf PORTA,1        ;Pone LCD en Modo RD
    #define         ESCRIBIR         bcf PORTA,1        ;Pone LCD en Modo WR
    #define         OFF_COMANDO  bcf PORTA,0        ;Desactiva RS (modo comando)
    #define         ON_COMANDO   bsf PORTA,0        ;Activa RS (modo dato

    ORG     0X00 
    
    

INICIO        
            clrf    PORTB        ; Limpiar salidas B
            clrf    PORTA
            clrf    PORTC        ; Limpiar salidas C
            bsf    STATUS,RP0    ; Acceso al banco 1
            bcf    STATUS,RP1
            movlw    b'00000110'    ; Puerta A E/S Digitales
            movwf    ADCON1    
            clrf    TRISA    
            clrf    TRISB        ; Puerta B como salida
            movlw    0XFF
            movwf    TRISC        ; Puerta C como entrada    
            movlw    b'10000000'    ; Velocidad estandar con niveles I2C
            movwf    SSPSTAT
            movlw    .9        ; Velocidad de BUS I2C 100KHz
            movwf    SSPADD        
            bcf    STATUS,RP0    ; Banco 0

            call    UP_LCD    ; Configuración lineas para LCD
            call    LCD_INI        ; Inicialización LCD
            movlw    b'00001110'    ;
            call    LCD_REG    ;
        
    
bucle    movlw    .0        ; Al pulsar COPI por primera vez saldrá P01
    movwf    Dato
espera    btfsc    COPI
    goto     espera
    incf    Dato,F    
    movf    Dato,W
    ;movlw    b'00010001'        ; Número decimal  a W
    call    BIN_a_BCD        ; Se pasa el número  a BCD
    movwf    Dato1            ; Se guarda  en la RAM

    movlw    b'00101000'        ; Módulo MSSP en On
    movwf    SSPCON
    call    S_START                       ; Envia condicion de inicio
    movlw    b'01110000'        ; Byte de Direccion del SAA1064
    call    SEND_B                      ; Enviar byte (lectura)
    movlw    b'00000000'        ; Byte de INSTRUCCION
    call    SEND_B
              movlw    b'00110110'        ; Byte de CONTROL(modo estático,digito 1 y 2 activos, 9mA corriente)
    call    SEND_B
    movf    Dato1,W            ; Recupera el Dato (BCD) de la RAM
    andlw    b'00001111'
    call    BINARIO_A_7S
    call    SEND_B
    swapf    Dato1,W
    andlw    b'00001111'
    call    BINARIO_A_7S
    call    SEND_B
    call    S_STOP
    call    VISUALIZAR_1
    
espera1    btfss    COPI
    goto    espera1
    goto     espera

        INCLUDE <lcd_cxx1.inc>
               
               INCLUDE <VISUALIZAR2x16_RALLY_1.INC>
               
               INCLUDE <VISUALIZAR2x16_RALLY_POS.INC>
               ;INCLUDE <VISUALIZAR2x16_RALLY_TIEMPO.INC>
               INCLUDE <BIN_BCD.INC>
               INCLUDE <BINARIO_A_7SEGMENTOS.INC>
               INCLUDE <I2C_PIC16F873.INC>

    END
Al añadir esta subrutina empieza a fallar:

Código:
INCLUDE <VISUALIZAR2x16_RALLY_TIEMPO.INC> :

VISUALIZA_TIEMPO    call    UP_LCD
            movlw    0x86            ; Posiciona el cursor 7ª 
            call    LCD_REG
            movf    BCD_Decenas_Min,W    ; Decenas de minuto
            andlw    0x0f
            iorlw    0x30
            call     LCD_DATO
            movf    BCD_Unidades_Min,W    ; Unidades de minuto
            andlw    0x0f
            iorlw    0x30
            call    LCD_DATO
            movlw    b'00111010'        ; :
            call    LCD_DATO
            movf    BCD_Decenas_Seg,W    ; Decenas de segundo
            andlw    0x0f
            iorlw    0x30
            call    LCD_DATO
            movf    BCD_Unidades_Seg,W    ; Unidades de segundo        
            andlw    0x0f
            iorlw    0x30
            call    LCD_DATO
            return
---------------------------------------------------------------------------------------------

Las demás subrutinas son estas:

Código:
INCLUDE <VISUALIZAR2x16_RALLY_1.INC>:

VISUALIZAR_1        ;bsf    STATUS,RP0
            ;bcf    STATUS,RP1
            ;movlw    b'00000110'    ; Configura todas las salidas A como DIGITALES
            ;movwf    ADCON1
            ;bcf    STATUS,RP0
            
            call    UP_LCD
            movlw    0x80        ; Posiciona el cursor 1ª POSICIÓN ARRIBA IZQUIERDA
            call    LCD_REG
            movlw    b'00100000'    ; Espacio en blanco
            call    LCD_DATO
            movlw    b'00100000'    ; Espacio en blanco
            call    LCD_DATO
            movlw    b'01010000'    ; P
            call    LCD_DATO
            movlw    b'01010010'    ; R
            call    LCD_DATO
            movlw    b'01001111'    ; O
            call    LCD_DATO        
            movlw    b'01000111'    ; G
            call    LCD_DATO        
            movlw    b'01010010'    ; R
            call    LCD_DATO
            movlw    b'01000001'    ; A
            call    LCD_DATO
            movlw    b'01001101'    ; M
            call    LCD_DATO
            movlw    b'01000001'    ; A
            call    LCD_DATO    
            movlw    b'01000011'    ; C
            call    LCD_DATO
            movlw    b'01001001'    ; I
            call    LCD_DATO    
            movlw    b'01001111'    ; O
            call    LCD_DATO
            movlw    b'01001110'    ; N
            call    LCD_DATO
            movlw    b'00100000'    ; Espacio en blanco
            call    LCD_DATO        
            movlw    b'00100000'    ; Espacio en blanco
            call    LCD_DATO
            movlw    0xC0        ; Inicio de la segunda fila , posiciona el cursor 2ª fila abajo-izquierda
            call    LCD_REG
            movlw    b'01010100'    ; T
            call    LCD_DATO                
            movlw    b'00100000'    ; BLANCO
            call    LCD_DATO
            movlw    b'00100000'    ; Espacio en blanco
            call    LCD_DATO    
            movlw    b'01001101'    ; M
            call    LCD_DATO
            movlw    b'00100000'    ; BLANCO
            call    LCD_DATO
            movlw    b'00100000'    ; BLANCO
            call    LCD_DATO
            movlw    b'00100000'     ; BLANCO
            call    LCD_DATO
            movlw    b'01010000'    ; P 
            call    LCD_DATO
            movf    BCD_Decenas,W    ; Decenas
            andlw    0x0f
            iorlw    0x30
            call     LCD_DATO
            movf    BCD_Unidades,W    ; Unidades
            andlw    0x0f
            iorlw    0x30
            call     LCD_DATO
            movlw    b'00100000'    ; Espacio en blanco        
            call    LCD_DATO
            ;movf    BCD_Decenas_Min,W    ; Decenas de minuto
            ;andlw    0x0f
            ;iorlw    0x30
            ;call     LCD_DATO
            ;movf    BCD_Unidades_Min,W    ; Unidades de minuto
            ;andlw    0x0f
            ;iorlw    0x30
            ;call    LCD_DATO
            ;movlw    b'00111010'    ; :
            ;call    LCD_DATO
            ;movf    BCD_Decenas_Seg,W    ; Decenas de segundo
            ;andlw    0x0f
            ;iorlw    0x30
            ;call    LCD_DATO
            ;movf    BCD_Unidades_Seg,W    ; Unidades de segundo        
            ;andlw    0x0f
            ;iorlw    0x30
            ;call    LCD_DATO
            
            return
----------------------------------------------------------------------------------------------
Código:
INCLUDE <VISUALIZAR2x16_RALLY_POS.INC>:



VISUALIZAR_POS        ;bsf    STATUS,RP0
            ;bcf    STATUS,RP1
            ;movlw    b'00000110'    ; Configura todas las salidas A como DIGITALES
            ;movwf    ADCON1
            ;bcf    STATUS,RP0
            
            call    UP_LCD
            movlw    0xC0        ; Inicio de la segunda fila , posiciona el cursor 2ª fila abajo-izquierda
            call    LCD_REG
            movlw    b'01010100'    ; T
            call    LCD_DATO                
            movlw    b'00100000'    ; BLANCO
            call    LCD_DATO
            movlw    b'00100000'    ; BLANCO
            call    LCD_DATO
            movlw    b'01001101'    ; M
            call    LCD_DATO    
            movlw    b'00100000'    ; BLANCO
            call    LCD_DATO
            movlw    b'00100000'    ; BLANCO
            call    LCD_DATO
            movlw    b'00100000'    ; BLANCO
            call    LCD_DATO
            movlw    b'01010000'    ; P
            call    LCD_DATO    
            movf    BCD_Decenas,W    ; Decenas
            andlw    0x0f
            iorlw    0x30
            call     LCD_DATO
            movf    BCD_Unidades,W    ; Unidades
            andlw    0x0f
            iorlw    0x30
            call     LCD_DATO
            movlw    b'00100000'    ; Espacio en blanco
            call    LCD_DATO
            movlw    b'00100000'    ; Espacio en blanco
            call    LCD_DATO
            movlw    b'00100000'    ; Espacio en blanco
            call    LCD_DATO
            movlw    b'00100000'    ; BLANCO
            call    LCD_DATO
            movf    BCD_Decenas_Seg_,W    ; Decenas de segundo
            andlw    0x0f
            iorlw    0x30
            call    LCD_DATO
            movf    BCD_Unidades_Seg_,W    ; Unidades de segundo        
            andlw    0x0f
            iorlw    0x30
            call    LCD_DATO
            
            return
 

Adjuntos

  • RALLY PIC I2C.pdf
    36.7 KB · Visitas: 1
  • DSC_0002.jpg
    DSC_0002.jpg
    70.8 KB · Visitas: 4
Última edición por un moderador:
Tenes que fijarte si cuando incluis esa instrucción no tenes un problema de desborde del stack, recorda que se pueden hacer como máximo 8 llamados a subrutina en forma consecutiva, si superas ese valor, tu programa termina saliendose de control, y puede que se trave en alguna parte, haciendo que no corra ni haga nada.
 
Atrás
Arriba