Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

24/12/2013 #41

Avatar de Meta

Buenas y Feliz Navidad 2013 a todo el foro:

He comprobado con este código que no se pone a ORG 0x00 automáticamente, y si lo haces tu da problemas.

Código:
; ZONA DE DATOS *******************************************************

    LIST        P=16F887
    INCLUDE        <P16F887.INC>
    __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
    __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V
    __IDLOCS    0x1234
    ERRORLEVEL    -302    

    CBLOCK   0x20        
    TeclaPulsada                    ; Va a guardar el contenido de la tecla pulsada.
    MensajeApuntado                    ; Va a guarda la dirección del mensaje apuntado.
    Relays                            ; Estado de los relays
    Estado                            ; Estado general
    ENDC            

#DEFINE        PEntradasB    PORTB        ; Define puerto de salidas.
#DEFINE        EntradaR1B    0            ; Define dónde se sitúa cada salidas.
#DEFINE        EntradaR2B    1            
#DEFINE        EntradaR3B    2            
#DEFINE        EntradaR4B    3
#DEFINE        EntradaR5B    4            
#DEFINE        EntradaR6B    5            
#DEFINE        EntradaR7B    6
#DEFINE        EntradaR8B    7
#DEFINE        PSalidasD    PORTD    
#DEFINE        SalidaR1D    0            
#DEFINE        SalidaR2D    1            
#DEFINE        SalidaR3D    2            
#DEFINE        SalidaR4D    3
#DEFINE        SalidaR5D    4            
#DEFINE        SalidaR6D    5            
#DEFINE        SalidaR7D    6
#DEFINE        SalidaR8D    7
#DEFINE        Seleccion    PORTE,2        ; Selección manual/serie con un pulsador.


TECLA_RELE_1_ON        EQU    'q'            ; Código de las teclas utilizadas.
TECLA_RELE_1_OFF    EQU    'a'
TECLA_RELE_2_ON        EQU    'w'
TECLA_RELE_2_OFF    EQU    's'
TECLA_RELE_3_ON        EQU    'e'
TECLA_RELE_3_OFF    EQU    'd'
TECLA_RELE_4_ON        EQU    'r'
TECLA_RELE_4_OFF    EQU    'f'
TECLA_RELE_5_ON        EQU 't'
TECLA_RELE_5_OFF    EQU 'g'
TECLA_RELE_6_ON        EQU 'y'
TECLA_RELE_6_OFF    EQU 'h'
TECLA_RELE_7_ON        EQU 'u'
TECLA_RELE_7_OFF    EQU 'j'
TECLA_RELE_8_ON        EQU 'i'
TECLA_RELE_8_OFF    EQU 'k'
TECLA_INICIO        EQU 'z'
TECLA_PARADA        EQU    ' '            ; Código de la tecla espaciadora, (hay un espacio,
                                    ; tened cuidado al teclear el programa).
TECLA_INFO            EQU 'n'            
                                    
ENTER                EQU    0x0A        ; Código de tecla "Enter" o "Retorno de Carro".
CAMBIO_LINEA        EQU    0x0D        ; Código para el cambio de línea.

    ORG    0x2100                        ; Corresponde a la dirección 0 de la zona EEPROM
                                    ; de datos.
    DE    0x00,2,3

;****************************************************************************
;*                                ZONA DE CODIGOS                                *
;****************************************************************************

;****************************************************************************
;*                                Rutina Principal                            *
;****************************************************************************

    ORG    0x00
    goto    Inicio

;    ORG    4                            ; Aquí se sitúa el vector de interrupción para 
;    goto    LeeEntradasVisualiza    ; atender las subrutinas de interrupción.


Inicio
    call    LCD_Inicializa            ; Inicializa el display LCD
    call    RS232_Inicializa        ; Inicializa RS232.                                                 
    bsf        PEntradasB,EntradaR1B    
    bsf        PEntradasB,EntradaR2B    
    bsf        PEntradasB,EntradaR3B    
    bsf        PEntradasB,EntradaR4B    
    bsf        PEntradasB,EntradaR5B    
    bsf        PEntradasB,EntradaR6B    
    bsf        PEntradasB,EntradaR7B    
    bsf        PEntradasB,EntradaR8B                    
    bcf        PSalidasD,SalidaR1D
    bcf        PSalidasD,SalidaR2D
    bcf        PSalidasD,SalidaR3D
    bcf        PSalidasD,SalidaR4D
    bcf        PSalidasD,SalidaR5D
    bcf        PSalidasD,SalidaR6D
    bcf        PSalidasD,SalidaR7D
    bcf        PSalidasD,SalidaR8D
    BANKSEL    CM1CON0
    movlw    b'00000111'
    movwf    CM1CON0
    movwf    CM2CON0
    movwf    CM2CON1                   
    BANKSEL    ANSEL
    clrf    ANSEL
    clrf    ANSELH
    BANKSEL    TRISB
    movlw    b'11111111'
    movwf    TRISB
    clrw
    clrf    TRISD
    BANKSEL    PORTD

    call    Parado                    ; En principio todas las salidas deben estar 
    movlw    0x02
    call    EEPROM_LeeDato
    movwf    Relays    
    call    Ejecutar                ; Enciende o apaga reles seleccionados
    call    Mensaje_Reles
    call     Visualiza                ; Muestra mensaje en el display

    call    RS232_LineasBlanco        ; Visualiza unas cuantas líneas en blanco
    call    RS232_LineasBlanco        ; para limpiar la pantalla.
;    movlw    b'10001000'                ; Habilita la interrupción RBI y la general.
;    movwf    INTCON

;    btfss    PEntradasC,EntradaR1C                ; ¿Bit 0 del PORTA es "1"?
;    goto    D1_OFF
;    bsf        PSalidasD,SalidaR1D
;    goto    Principal
;D1_OFF
;    bcf        PSalidasD,SalidaR1D


;Aqui
;    btfss    Seleccion
;    goto    Principal
;    goto    LeeEntradasVisualiza
;    sleep
;    goto    Aqui

Principal                            ; apagadas.
    call    RS232_LeeDato            ; Espera a recibir un carácter.
    call    TesteaTeclado            ; Verifica caracter recibido y ejecuta accion
    call    Ejecutar                ; Enciende o apaga reles seleccionados
    call     Visualiza                ; Muestra mensaje en el display

    call    Guardar_EEPROM

;    btfsc    Seleccion
;    goto    Aqui
    goto    Principal                ; Loop Infinito

;****************************************************************************
;*                                Mensajes                                    *
;****************************************************************************
Mensajes
    addwf    PCL,F
MensajeParado
    DT "Sistema DESACTIVADO ", 0x00
Mensaje_Reles
    DT " 1 2 3 4 5 6 7 8 RL ", 0x00
Mensaje_ON
    DT " 1", 0x00
Mensaje_OFF
    DT " O", 0x00
Mensaje_Cambiolinea
    DT ENTER, CAMBIO_LINEA, 0x00
Mensaje_Mostrarlinea
    DT "----------------", 0x00
Mensaje_Activar
    DT "   Todos ACTIVOS    ", 0x00
Mensaje_IN
    DT " IN", 0x00
Mensaje_OUT
    DT " OUT", 0x00
Mensaje_Avisos
    DT "***    ALARMA    ***", 0x00
MensajeEntradas
    DT ENTER, CAMBIO_LINEA
    DT " 1 2 3 4 5 6 7 8 IN"
    DT ENTER, CAMBIO_LINEA
    DT "-------------------"
    DT ENTER, CAMBIO_LINEA, 0x00

Mensaje_Info    ORG    0x0400

    DT "FirmWare v2.15  ", 0x00
    DT ENTER, CAMBIO_LINEA
    call    LCD_Linea2
    DT " PIC16F887      "
    DT ENTER, CAMBIO_LINEA
    call    Retardo_2s
    call    LCD_Linea1
    DT " metaconta      "
    DT ENTER, CAMBIO_LINEA
    call    LCD_Linea2
    DT " @gmail.com     ", 0x00
    call    Retardo_2s
    ORG    0x00D9
FinTablaASCII

;****************************************************************************
;*                                Testea Teclado y sensores                    *
;*                                                                            *
;*    Verifica caracer recibido y decide que accion ejecutar                    *
;****************************************************************************

TesteaTeclado    
    movwf    TeclaPulsada            ; Guarda el contenido de la tecla pulsada.
    xorlw    TECLA_RELE_1_ON            ; ¿Es la tecla del movimiento hacia adelante?
    btfsc    STATUS,Z                ;
    goto    R1_ON                    ; Sí, se desea movimiento hacia adelante.

    movf    TeclaPulsada,W            ; Recupera el contenido de la tecla pulsada.
    xorlw    TECLA_RELE_1_OFF        ; ¿Es la tecla del movimiento hacia atrás?
    btfsc    STATUS,Z                ;
    goto    R1_OFF                    ; Sí, se desea movimiento hacia atrás.

    movf    TeclaPulsada,W            ; Recupera el contenido de la tecla pulsada.
    xorlw    TECLA_RELE_2_ON            ; ¿Es la tecla del movimiento hacia la izquierda?
    btfsc    STATUS,Z                ;
    goto    R2_ON                    ; Sí, se desea movimiento hacia la izquierda.

    movf    TeclaPulsada,W            ; Recupera el contenido de la tecla pulsada.
    xorlw    TECLA_RELE_2_OFF        ; ¿Es tecla del movimiento hacia la derecha?
    btfsc    STATUS,Z                ;
    goto    R2_OFF                    ; Sí, se desea movimiento hacia la derecha.

    movf    TeclaPulsada,W            ;
    xorlw    TECLA_RELE_3_ON            ;
    btfsc    STATUS,Z                ;
    goto    R3_ON                    ;

    movf    TeclaPulsada,W            ;
    xorlw    TECLA_RELE_3_OFF        ;
    btfsc    STATUS,Z                ;
    goto    R3_OFF                    ;

    movf    TeclaPulsada,W            ;
    xorlw    TECLA_RELE_4_ON            ;
    btfsc    STATUS,Z                ;
    goto    R4_ON                    ;

    movf    TeclaPulsada,W            ;
    xorlw    TECLA_RELE_4_OFF        ;
    btfsc    STATUS,Z                ;
    goto    R4_OFF                    ;

    movf    TeclaPulsada,W            ;
    xorlw    TECLA_RELE_5_ON            ;
    btfsc    STATUS,Z                ;
    goto    R5_ON                    ;

    movf    TeclaPulsada,W            ;
    xorlw    TECLA_RELE_5_OFF        ;
    btfsc    STATUS,Z                ;
    goto    R5_OFF                    ;

    movf    TeclaPulsada,W            ;
    xorlw    TECLA_RELE_6_ON            ;
    btfsc    STATUS,Z                ;
    goto    R6_ON                    ;

    movf    TeclaPulsada,W            ;
    xorlw    TECLA_RELE_6_OFF        ;
    btfsc    STATUS,Z                ;
    goto    R6_OFF                    ;

    movf    TeclaPulsada,W            ;
    xorlw    TECLA_RELE_7_ON            ;
    btfsc    STATUS,Z                ;
    goto    R7_ON                    ;

    movf    TeclaPulsada,W            ;
    xorlw    TECLA_RELE_7_OFF        ;
    btfsc    STATUS,Z                ;
    goto    R7_OFF                    ;

    movf    TeclaPulsada,W            ;
    xorlw    TECLA_RELE_8_ON            ;
    btfsc    STATUS,Z                ;
    goto    R8_ON                    ;

    movf    TeclaPulsada,W            ;
    xorlw    TECLA_RELE_8_OFF        ;
    btfsc    STATUS,Z                ;
    goto    R8_OFF                    ;

    movf    TeclaPulsada,W            ;
    xorlw    TECLA_INICIO            ;
    btfsc    STATUS,Z                ;
    goto    Activar                    ;

    movf    TeclaPulsada,W            ;
    xorlw    TECLA_INFO                ;
    btfsc    STATUS,Z                ;
    goto    Info                    ;

    movf    TeclaPulsada,W            ; Recupera el contenido de la tecla pulsada.
    xorlw    TECLA_PARADA            ; ¿Es la tecla de parada?.
    btfss    STATUS,Z
    return                            ; No es ninguna tecla de movimiento. Sale.

;------------------------------------------------------------------------------------------------

Parado
    movlw    0x02                    ; Muestra mensaje 02
    movwf    Estado                    ;
    movlw    0x00                    ; Como se ha pulsado la tecla de parada se
    movwf    Relays                    ; desactivan todas las salidas.
    return

R1_ON
    movlw    0x00                    ; Muestra estado relays
    movwf    Estado                    ;
    bsf        Relays,SalidaR1D            ; Activa Relay 1
    return                            ;

R1_OFF
    movlw    0x00                    ; Muestra estado relays
    movwf    Estado                    ;
    bcf        Relays,SalidaR1D            ; Desctiva Relay 1
    return                            ;

R2_ON
    movlw    0x00                    ; Muestra estado relays
    movwf    Estado                    ;
    bsf        Relays,SalidaR2D            ; Activa Relay 2
    return                            ;

R2_OFF
    movlw    0x00                    ; Muestra estado relays
    movwf    Estado                    ;
    bcf        Relays,SalidaR2D            ; Desctiva Relay 2
    return                            ;

R3_ON
    movlw    0x00                    ; Muestra estado relays
    movwf    Estado                    ;
    bsf        Relays,SalidaR3D            ; Activa Relay 3
    return                            ;

R3_OFF
    movlw    0x00                    ; Muestra estado relays
    movwf    Estado                    ;
    bcf        Relays,SalidaR3D            ; Desctiva Relay 3
    return                            ;

R4_ON
    movlw    0x00                    ; Muestra estado relays
    movwf    Estado                    ;
    bsf        Relays,SalidaR4D            ; Activa Relay 4
    return                            ;

R4_OFF
    movlw    0x00                    ; Muestra estado relays
    movwf    Estado                    ;
    bcf        Relays,SalidaR4D        ; Desctiva Relay 4
    return                            ;

R5_ON
    movlw    0x00                    ; Muestra estado relays
    movwf    Estado                    ;
    bsf        Relays,SalidaR5D        ; Desctiva Relay 5
    return

R5_OFF
    movlw    0x00                    ; Muestra estado relays
    movwf    Estado                    ;
    bcf        Relays,SalidaR5D        ; Desctiva Relay 5
    return

R6_ON
    movlw    0x00                    ; Muestra estado relays
    movwf    Estado                    ;
    bsf        Relays,SalidaR6D        ; Desctiva Relay 6
    return

R6_OFF
    movlw    0x00                    ; Muestra estado relays
    movwf    Estado                    ;
    bcf        Relays,SalidaR6D        ; Desctiva Relay 6
    return

R7_ON
    movlw    0x00                    ; Muestra estado relays
    movwf    Estado                    ;
    bsf        Relays,SalidaR7D        ; Desctiva Relay 7
    return

R7_OFF
    movlw    0x00                    ; Muestra estado relays
    movwf    Estado                    ;
    bcf        Relays,SalidaR7D        ; Desctiva Relay 7
    return

R8_ON
    movlw    0x00                    ; Muestra estado relays
    movwf    Estado                    ;
    bsf        Relays,SalidaR8D        ; Desctiva Relay 8
    return

R8_OFF
    movlw    0x00                    ; Muestra estado relays
    movwf    Estado                    ;
    bcf        Relays,SalidaR8D        ; Desctiva Relay 8
    return

Activar
    movlw    0x03                    ; Muestra mensaje 03
    movwf    Estado                    ;
    bsf        Relays,SalidaR1D            ; Activa Relay 1
    bsf        Relays,SalidaR2D            ; Activa Relay 2
    bsf        Relays,SalidaR3D            ; Activa Relay 3
    bsf        Relays,SalidaR4D            ; Activa Relay 4
    bsf        Relays,SalidaR5D            ; Activa Relay 6
    bsf        Relays,SalidaR6D            ; Activa Relay 7
    bsf        Relays,SalidaR7D            ; Activa Relay 8
    bsf        Relays,SalidaR8D            ; Activa Relay 9
    return

Info
    movlw    0x01                    ; Muestra mensaje 01
    movwf    Estado                    ;
    return

;****************************************************************************
;*                                Ejecutar                                    *
;*    Obtiene estado de los relays y los activa en el puerto adecuado            *
;****************************************************************************
Ejecutar
    movf    Relays,W                ; Carga estado de relays
    movwf    PSalidasD                ; en el puerto asignado
    Return

;****************************************************************************
;*                                Visualiza                                    *
;* Según el estado de las salidas visualiza el estado del sistema en el        *
;* visualizador LCD y en el monitor del ordenador.                            *
;****************************************************************************
Visualiza
    movf    Estado,W                ; Mensaje 00?
    xorlw    0x00                    ;
    btfsc    STATUS,Z                ;
    goto    MostrarRelays            ; Si, muestra estado de relays

    movf    Estado,W                ; Mensaje 01?
    xorlw    0x01                    ;
    btfsc    STATUS,Z                ;
    goto    MostrarVersion            ; Si, muestra version

    movf    Estado,W                ; Mensaje 02?
    xorlw    0x02                    ;
    btfsc    STATUS,Z                ;
    goto    MostrarParado            ; Si, muestra parado

    movf    Estado,W                ; Mensaje 03?
    xorlw    0x03                    ;
    btfsc    STATUS,Z                ;
    goto    MostrarActivado            ; Si, muestra activado

    clrf    Estado                    ; ERROR!!!!, Reinicia variable de estado

MostrarRelays
    call    LCD_Borra                ; Borra la pantalla del modulo LCD.
    movlw    Mensaje_Reles            ; Muestra primera linea de mensaje
    call    LCD_Mensaje                ; " R1 R2 R3 R4"
    call    LCD_Linea3                ; Selecciona 3a linea de display

    call    RS232_LineasBlanco        ; Borra la pantalla del ordenador.
    movlw    Mensaje_Mostrarlinea    ;
    call    RS232_Mensaje
    movlw    Mensaje_Cambiolinea
    call    RS232_Mensaje
    movlw    Mensaje_Reles            ; Lo visualiza en el HyperTerminal.
    call    RS232_Mensaje
    call    RS232_LineasBlanco
    movlw    Mensaje_Cambiolinea
    call    RS232_Mensaje

    btfss    Relays,SalidaR1D            ; Rele 1 encendido?
    goto    Mnsj_R1_OFF                ; No, Escribe OFF

    movlw    Mensaje_ON                ;
    call    LCD_Mensaje                ;
    movlw    Mensaje_ON                ;
    call    RS232_Mensaje
    goto    Mnsj_R2                    ; 

Mnsj_R1_OFF
    movlw    Mensaje_OFF                ;
    call    LCD_Mensaje                ;
    movlw    Mensaje_OFF                ;
    call    RS232_Mensaje

Mnsj_R2
    btfss    Relays,SalidaR2D            ; Rele 2 encendido?
    goto    Mnsj_R2_OFF                ; No, Escribe OFF

    movlw    Mensaje_ON                ;
    call    LCD_Mensaje                ;
    movlw    Mensaje_ON                ;
    call    RS232_Mensaje
    goto    Mnsj_R3                    ; 

Mnsj_R2_OFF
    movlw    Mensaje_OFF                ;
    call    LCD_Mensaje                ;
    movlw    Mensaje_OFF                ;
    call    RS232_Mensaje

Mnsj_R3
    btfss    Relays,SalidaR3D            ; Rele 2 encendido?
    goto    Mnsj_R3_OFF                ; No, Escribe OFF

    movlw    Mensaje_ON                ;
    call    LCD_Mensaje                ;
    movlw    Mensaje_ON                ;
    call    RS232_Mensaje
    goto    Mnsj_R4                    ; 

Mnsj_R3_OFF
    movlw    Mensaje_OFF                ;
    call    LCD_Mensaje                ;
    movlw    Mensaje_OFF                ;
    call    RS232_Mensaje

Mnsj_R4
    btfss    Relays,SalidaR4D            ; Rele 3 encendido?
    goto    Mnsj_R4_OFF                ; No, Escribe OFF

    movlw    Mensaje_ON                ;
    call    LCD_Mensaje                ;
    movlw    Mensaje_ON                ;
    call    RS232_Mensaje
    goto    Mnsj_R5                    ; 

Mnsj_R4_OFF
    movlw    Mensaje_OFF                ;
    call    LCD_Mensaje                ;
    movlw    Mensaje_OFF                ;
    call    RS232_Mensaje

Mnsj_R5
    btfss    Relays,SalidaR5D            ; Rele 2 encendido?
    goto    Mnsj_R5_OFF                ; No, Escribe OFF

    movlw    Mensaje_ON                ;
    call    LCD_Mensaje                ;
    movlw    Mensaje_ON                ;
    call    RS232_Mensaje
    goto    Mnsj_R6                    ; 

Mnsj_R5_OFF
    movlw    Mensaje_OFF                ;
    call    LCD_Mensaje                ;
    movlw    Mensaje_OFF                ;
    call    RS232_Mensaje

Mnsj_R6
    btfss    Relays,SalidaR6D            ; Rele 2 encendido?
    goto    Mnsj_R6_OFF                ; No, Escribe OFF

    movlw    Mensaje_ON                ;
    call    LCD_Mensaje                ;
    movlw    Mensaje_ON                ;
    call    RS232_Mensaje
    goto    Mnsj_R7                    ; 

Mnsj_R6_OFF
    movlw    Mensaje_OFF                ;
    call    LCD_Mensaje                ;
    movlw    Mensaje_OFF                ;
    call    RS232_Mensaje

Mnsj_R7
    btfss    Relays,SalidaR7D            ; Rele 2 encendido?
    goto    Mnsj_R7_OFF                ; No, Escribe OFF

    movlw    Mensaje_ON                ;
    call    LCD_Mensaje                ;
    movlw    Mensaje_ON                ;
    call    RS232_Mensaje
    goto    Mnsj_R8                    ; 

Mnsj_R7_OFF
    movlw    Mensaje_OFF                ;
    call    LCD_Mensaje                ;
    movlw    Mensaje_OFF                ;
    call    RS232_Mensaje

Mnsj_R8
    btfss    Relays,SalidaR8D            ; Rele 4 encendido?
    goto    Mnsj_R8_OFF                ; No, Escribe OFF

    movlw    Mensaje_ON                ;
    call    LCD_Mensaje                ;
    movlw    Mensaje_ON                ;
    call    RS232_Mensaje
    movlw    Mensaje_Cambiolinea
    call    RS232_Mensaje
    return                            ; Vuelve al programa principal.

Mnsj_R8_OFF
    movlw    Mensaje_OFF                ;
    call    LCD_Mensaje                ;
    movlw    Mensaje_OFF                ;
    call    RS232_Mensaje
    movlw    Mensaje_Cambiolinea
    call    RS232_Mensaje
    return                            ; Vuelve al programa principal.

MostrarVersion    
    movlw    Mensaje_Info
    movwf    MensajeApuntado            ; Guarda la posición del mensaje.
    call    LCD_Borra                ; Borra la pantalla del modulo LCD.
    movf    MensajeApuntado,W        ; Visualiza el mensaje en la pantalla
    call    LCD_Mensaje                ; del visualizador LCD.
    call    RS232_LineasBlanco        ; Borra la pantalla del ordenador.
    movf    MensajeApuntado,W
    call    RS232_Mensaje            ; Lo visualiza en el HyperTerminal.
    call    RS232_LineasBlanco
    return

MostrarParado
    call    Parado
    call    MostrarRelays
    movlw    MensajeParado
    movwf    MensajeApuntado            ; Guarda la posición del mensaje.
;    call    LCD_Borra                ; Borra la pantalla del modulo LCD.
    call    LCD_Linea4                ; Seleccionar la línea 4.
    movf    MensajeApuntado,W        ; Visualiza el mensaje en la pantalla
    call    LCD_Mensaje                ; del visualizador LCD.
    call    RS232_LineasBlanco        ; Borra la pantalla del ordenador.
    movf    MensajeApuntado,W
    call    RS232_Mensaje            ; Lo visualiza en el HyperTerminal.
    call    RS232_LineasBlanco
    return

MostrarActivado
    call    Activar
    call    MostrarRelays
    movlw    Mensaje_Activar
    movwf    MensajeApuntado            ; Guarda la posición del mensaje.
;    call    LCD_Borra                ; Borra la pantalla del modulo LCD.
    call    LCD_Linea4                ; Seleccionar la línea 4.
    movf    MensajeApuntado,W        ; Visualiza el mensaje en la pantalla
    call    LCD_Mensaje                ; del visualizador LCD.
    call    RS232_LineasBlanco        ; Borra la pantalla del ordenador.
    movf    MensajeApuntado,W
    call    RS232_Mensaje            ; Lo visualiza en el HyperTerminal.
    call    RS232_LineasBlanco
    return

;****************************************************************************
; Interrupción
;****************************************************************************

;****************************************************************************
; Subrutina
;****************************************************************************
Guardar_EEPROM
    movlw    .02
       movwf    EEADR
       movf    Relays,W
       call    EEPROM_EscribeDato
    return

;    btfss    PEntradasC,EntradaR1C                ; ¿Bit 0 del PORTA es "1"?
;    goto    D1_OFF
;    bsf        PSalidasD,SalidaR1D
;    goto    Principal
;D1_OFF
;    bcf        PSalidasD,SalidaR1D



; ---------------------------------------------------------------------------

;    IF    (FinTablaASCII>0xFF)
;        ERROR    "¡CUIDADO!: La tabla ha superado el tamaño de los"
;        MESSG    "primeros 256 bytes de memoria ROM. No funcionará correctamente."
;    ENDIF

    INCLUDE  <RS232.INC>
    INCLUDE  <RS232MEN.INC>
    INCLUDE  <LCD_4BIT.INC>
    INCLUDE  <LCD_MENS.INC>
    INCLUDE  <RETARDOS.INC>
    INCLUDE  <EEPROM.INC>
    END
¿Hay algún ejemplo que funcione bien?

Por ejemmplo, 256 caracteres en el org 0x00, luego otros 256 en ORG 0x0100, luego en el ORG 0x200.

Recordar que las instrucciones generales están en el ORG 0x00 así que ha de volver, en los otros ORG son sólo mensajes de ejemplo.

Saludo.
02/02/2014 #42

Avatar de Meta

Daniel Meza dijo: Ver Mensaje
Allí ahí algo raro, se ve que hay una sobreescritura del registro W, cuando se entra a la rutina, W contiene el 5 previamente cargado; luego la instrucción inmediata "movl HIGH salto" (que igual interpreto como movlw) ignora este 5 y en su lugar escribe el byte alto dirección etiquetada como "Salto" así que no creo que esa sea una solución convincente



Así es, eso se hace preferentemente para evitar conflictos con PCLATH

Saludos
Si es así, he estado traquiniando y no me sale. ¿Puedes hacer un ejemplo?
03/02/2014 #43

Avatar de Daniel Meza

Se supone que el PIC al momento de ejecutar el "retlw" saca de la pila TODO el contador de programa para volver a donde se salió del programa por lo que modificar el PCLATH no es necesario (esto se debe de hacer si después del regreso se llama a una subrutina fuera de la paginación del programa). Estaba confundiendo con que te referías al momento de llamar la rutina
03/02/2014 #44

Avatar de Meta

Hola:

Voy a intentar hacr un ejemplo de lo que intento expresar. Este ejemplo se trata de usar los ORG que en ella tiene los 256 byte y mostrarlo en una LCD.

Para que se entienda.

Si dejo activo o desactivo un interruptor, que salga un mensaje metido en el ORG 00x00, luego en otro botón en otro ORG 01x00 y así sucesivamente.

Luego aparesco otra vez. Al menos intentar que funcione. Por eso no me gusta el asm en ese sentido. Si funciona de maravilla con muchos mensajes largos usando EEPROM 24LC2556 por poner un ejemplo.

Saludo.
03/02/2014 #45

Avatar de ByAxel

Hola Meta.
Aparte del detalle de los 256 bytes, estaba viendo un poco el código que pusiste anteriormente y tengo una duda...
¿Cuantos kilobytes utilizables ocupa el programa después de compilar? (No he compilado).
Sucede que si esas librerias hacen que el código sobrepase los 2k, ya es necesario también manipular el PCLATH antes de cualquier salto y justamente es el PCLATH el que no veo en ninguna parte de tu código.

Por ejemplo: en ORG 0x00 usas call LCD_Inicializa, pregunto... en que dirección se a compilado INCLUDE <LCD_4BIT.INC>?. Si está por sobre los 2k o parte de la libreria está por sobre los 2k ya hay problemas con los saltos si no se usa el PCLATH. Igual para el resto de goto o call que uses... o que usen las librerias.

Por eso se sugiere porner bloques de código cada 2k de memoria, es decir que en mi opinión es aconsejable poner la libreria dentro de un bloque de 2k, como en ORG 0x00 o en ORG 0x800, etc. y así manipular adecuadamente los saltos.

Algo así trabajan los compiladores C ya que para cada salto siempre anteponen una carga al PCLATH, claro otros son más inteligentes y saben en que momento poner o no el PCLATH
Saludos
03/02/2014 #46

Avatar de Meta

Hola:

Si te refieres a este ejemplo.
Manejo de tablas mas allá de 256 bytes

Sus librerías son estas que puedes descargar abajo.

Saludo.
Archivos Adjuntos
Tipo de Archivo: zip Librerías PIC.zip (11,9 KB (Kilobytes), 17 visitas)
03/02/2014 #47

Avatar de Daniel Meza

¿Un mensaje en la dirección 0x000? habrá problemas tan sólo iniciar el programa, ahora, ando viendo éste código que funciona para una tabla colocada en cualquier parte de memoria, en "offset" está presente el byte bajo de la dirección de acceso y tiene ajuste automático para el desborde de PCL


example.png
03/02/2014 #48

Avatar de Meta

Mejor poner mensajes largos a partir de ORG 04x00 porque si no, no cabe las instrucciones principales. Es una majadería el asm por cosas como estas, pegarte media vida en entender y hacer algo.
03/02/2014 #49

Avatar de Daniel Meza

Es que a mi parecer ese tipo de acceso de datos no estaba previsto en las primeras series de los PIC's, la memoria era pensada para almacenar instrucciones y listo, conforme fueron actualizándose los micros se optimizó esa parte como por ejemplo las instrucciones TBLRD* en la serie 18F que simplifica bastante el acceso a tablas de datos. Como comenté anteriormente, desistí de esa técnica para acceder tablas largas y usé mejor el método antes posteado

Mejor poner mensajes largos a partir de ORG 04x00 porque si no, no cabe las instrucciones principales. Es una majadería el asm por cosas como estas, pegarte media vida en entender y hacer algo.
Eso es lo recomendable, si el PIC tiene 2 o más grupos de memoria, utilizar el primero para instrucciones y cualquiera de los demás para datos de mensajes, es decir 2K para puros caracteres
03/02/2014 #50

Avatar de Meta

Cierto, porqu esi no usaré la EEPROM externa para mensajes.
03/02/2014 #51

Avatar de Meta

Hola:

Un ejemplo tonto y sin LCD por ahora.

Código:
;************TABLA************
            LIST P=16F887
            #INCLUDE <P16F887.INC>

        __CONFIG        _CONFIG1,       _HS_OSC & _WDT_OFF &  _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_OFF  & _IESO_OFF & _FCMEN_ON & _LVP_OFF 
        
        __CONFIG        _CONFIG2,       _BOR40V & _WRT_OFF

        ERRORLEVEL    -302

            ORG                0x0000
            GOTO            INICIO

            CBLOCK            0x0020
            CONT
            LIM
            ENDC

            ORG                0x0005
INICIO
            BANKSEL            TRISB
            CLRF            TRISB            ;PUERTO A USAR COMO SALIDA 8 BITS
            BANKSEL            PORTB
            CLRF            PORTB
            BANKSEL            ANSEL
            CLRF            ANSEL
            CLRF            ANSELH
            CLRF            INTCON
            BANKSEL            OSCCON
            MOVLW            B'01110101'
            MOVWF            OSCCON            
            CLRF            CONT
SUM
            INCF            CONT,F
            CALL            TABLA
            MOVWF            PORTB
            MOVF            CONT,W
            SUBLW            0XB4
            BTFSS            STATUS,2
            GOTO            SUM
            CLRF            CONT
            GOTO            SUM

TABLA
            MOVF            CONT,W
            ADDWF            PCL,F
            DT    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08
            DT    0x09,0x0A,0x0B,0x0B,0x0C,0x0D,0x0E,0x10,0x11,0x12,0x13,0x14,0x15,0x17,0x18,0x19,0x1B,0x1C,0x1D,0x1F,0x20,0x22
            DT    0x23,0x25,0x27,0x28,0x2A,0x2B,0x2D,0x2F,0x31,0x32,0x34,0x36,0x38,0x3A,0x3C,0x3D,0x3F,0x41,0x43,0x45,0x47,0x49
            DT    0x4B,0x4D,0x4F,0x51,0x54,0x56,0x58,0x5A,0x5C,0x5E,0x60,0x63,0x65,0x67,0x69,0x6B,0x6D,0x70,0x72,0x74,0x76,0x79
            DT    0x7B,0x7D,0x7F,0x81,0x84,0x86,0x88,0x8A,0x8D,0x8F,0x91,0x93,0x95,0x98,0x9A,0x9C,0x9E,0xA0,0xA2,0xA5,0xA7,0xA9
            DT    0xAB,0xAD,0xAF,0xB1,0xB3,0xB5,0xB7,0xB9,0xBB,0xBD,0xBF,0xC1,0xC3,0xC5,0xC7,0xC9,0xCA,0xCC,0xCE,0xD0,0xD1,0xD3
            DT    0xD5,0xD6,0xD8,0xDA,0xDB,0xDD,0xDE,0xE0,0xE1,0xE3,0xE4,0xE5,0xE7,0xE8,0xE9,0xEA,0xEC,0xED,0xEE,0xEF,0xF0,0xF1
            DT    0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF7,0xF8,0xF9,0xF9,0xFA,0xFB,0xFB,0xFC,0xFC,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFF
            DT    0xFF,0xFF,0xFF,0xFF

    
TABLA_02            ORG        0x0110        ; Dirección de la memoria 0x0110.

            MOVF            CONT,W
            ADDWF            PCL,F
            DT    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08
            DT    0x09,0x0A,0x0B,0x0B,0x0C,0x0D,0x0E,0x10,0x11,0x12,0x13,0x14,0x15,0x17,0x18,0x19,0x1B,0x1C,0x1D,0x1F,0x20,0x22
            DT    0x23,0x25,0x27,0x28,0x2A,0x2B,0x2D,0x2F,0x31,0x32,0x34,0x36,0x38,0x3A,0x3C,0x3D,0x3F,0x41,0x43,0x45,0x47,0x49
            DT    0x4B,0x4D,0x4F,0x51,0x54,0x56,0x58,0x5A,0x5C,0x5E,0x60,0x63,0x65,0x67,0x69,0x6B,0x6D,0x70,0x72,0x74,0x76,0x79
            DT    0x7B,0x7D,0x7F,0x81,0x84,0x86,0x88,0x8A,0x8D,0x8F,0x91,0x93,0x95,0x98,0x9A,0x9C,0x9E,0xA0,0xA2,0xA5,0xA7,0xA9
            DT    0xAB,0xAD,0xAF,0xB1,0xB3,0xB5,0xB7,0xB9,0xBB,0xBD,0xBF,0xC1,0xC3,0xC5,0xC7,0xC9,0xCA,0xCC,0xCE,0xD0,0xD1,0xD3
            DT    0xD5,0xD6,0xD8,0xDA,0xDB,0xDD,0xDE,0xE0,0xE1,0xE3,0xE4,0xE5,0xE7,0xE8,0xE9,0xEA,0xEC,0xED,0xEE,0xEF,0xF0,0xF1
            DT    0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF7,0xF8,0xF9,0xF9,0xFA,0xFB,0xFB,0xFC,0xFC,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFF
            DT    0xFF,0xFF,0xFF,0xFF

TABLA_03            ORG        0x0200        ; Dirección de la memoria 0x0200.

            MOVF            CONT,W
            ADDWF            PCL,F
            DT    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08
            DT    0x09,0x0A,0x0B,0x0B,0x0C,0x0D,0x0E,0x10,0x11,0x12,0x13,0x14,0x15,0x17,0x18,0x19,0x1B,0x1C,0x1D,0x1F,0x20,0x22
            DT    0x23,0x25,0x27,0x28,0x2A,0x2B,0x2D,0x2F,0x31,0x32,0x34,0x36,0x38,0x3A,0x3C,0x3D,0x3F,0x41,0x43,0x45,0x47,0x49
            DT    0x4B,0x4D,0x4F,0x51,0x54,0x56,0x58,0x5A,0x5C,0x5E,0x60,0x63,0x65,0x67,0x69,0x6B,0x6D,0x70,0x72,0x74,0x76,0x79
            DT    0x7B,0x7D,0x7F,0x81,0x84,0x86,0x88,0x8A,0x8D,0x8F,0x91,0x93,0x95,0x98,0x9A,0x9C,0x9E,0xA0,0xA2,0xA5,0xA7,0xA9
            DT    0xAB,0xAD,0xAF,0xB1,0xB3,0xB5,0xB7,0xB9,0xBB,0xBD,0xBF,0xC1,0xC3,0xC5,0xC7,0xC9,0xCA,0xCC,0xCE,0xD0,0xD1,0xD3
            DT    0xD5,0xD6,0xD8,0xDA,0xDB,0xDD,0xDE,0xE0,0xE1,0xE3,0xE4,0xE5,0xE7,0xE8,0xE9,0xEA,0xEC,0xED,0xEE,0xEF,0xF0,0xF1
            DT    0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF7,0xF8,0xF9,0xF9,0xFA,0xFB,0xFB,0xFC,0xFC,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFF
            DT    0xFF,0xFF,0xFF,0xFF

TABLA_04            ORG        0x0300        ; Dirección de la memoria 0x0300.

            MOVF            CONT,W
            ADDWF            PCL,F
            DT    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08
            DT    0x09,0x0A,0x0B,0x0B,0x0C,0x0D,0x0E,0x10,0x11,0x12,0x13,0x14,0x15,0x17,0x18,0x19,0x1B,0x1C,0x1D,0x1F,0x20,0x22
            DT    0x23,0x25,0x27,0x28,0x2A,0x2B,0x2D,0x2F,0x31,0x32,0x34,0x36,0x38,0x3A,0x3C,0x3D,0x3F,0x41,0x43,0x45,0x47,0x49
            DT    0x4B,0x4D,0x4F,0x51,0x54,0x56,0x58,0x5A,0x5C,0x5E,0x60,0x63,0x65,0x67,0x69,0x6B,0x6D,0x70,0x72,0x74,0x76,0x79
            DT    0x7B,0x7D,0x7F,0x81,0x84,0x86,0x88,0x8A,0x8D,0x8F,0x91,0x93,0x95,0x98,0x9A,0x9C,0x9E,0xA0,0xA2,0xA5,0xA7,0xA9
            DT    0xAB,0xAD,0xAF,0xB1,0xB3,0xB5,0xB7,0xB9,0xBB,0xBD,0xBF,0xC1,0xC3,0xC5,0xC7,0xC9,0xCA,0xCC,0xCE,0xD0,0xD1,0xD3
            DT    0xD5,0xD6,0xD8,0xDA,0xDB,0xDD,0xDE,0xE0,0xE1,0xE3,0xE4,0xE5,0xE7,0xE8,0xE9,0xEA,0xEC,0xED,0xEE,0xEF,0xF0,0xF1
            DT    0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF7,0xF8,0xF9,0xF9,0xFA,0xFB,0xFB,0xFC,0xFC,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFF
            DT    0xFF,0xFF,0xFF,0xFF

TABLA_05            ORG        0x0400        ; Dirección de la memoria 0x0400.

            MOVF            CONT,W
            ADDWF            PCL,F
            DT    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08
            DT    0x09,0x0A,0x0B,0x0B,0x0C,0x0D,0x0E,0x10,0x11,0x12,0x13,0x14,0x15,0x17,0x18,0x19,0x1B,0x1C,0x1D,0x1F,0x20,0x22
            DT    0x23,0x25,0x27,0x28,0x2A,0x2B,0x2D,0x2F,0x31,0x32,0x34,0x36,0x38,0x3A,0x3C,0x3D,0x3F,0x41,0x43,0x45,0x47,0x49
            DT    0x4B,0x4D,0x4F,0x51,0x54,0x56,0x58,0x5A,0x5C,0x5E,0x60,0x63,0x65,0x67,0x69,0x6B,0x6D,0x70,0x72,0x74,0x76,0x79
            DT    0x7B,0x7D,0x7F,0x81,0x84,0x86,0x88,0x8A,0x8D,0x8F,0x91,0x93,0x95,0x98,0x9A,0x9C,0x9E,0xA0,0xA2,0xA5,0xA7,0xA9
            DT    0xAB,0xAD,0xAF,0xB1,0xB3,0xB5,0xB7,0xB9,0xBB,0xBD,0xBF,0xC1,0xC3,0xC5,0xC7,0xC9,0xCA,0xCC,0xCE,0xD0,0xD1,0xD3
            DT    0xD5,0xD6,0xD8,0xDA,0xDB,0xDD,0xDE,0xE0,0xE1,0xE3,0xE4,0xE5,0xE7,0xE8,0xE9,0xEA,0xEC,0xED,0xEE,0xEF,0xF0,0xF1
            DT    0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF7,0xF8,0xF9,0xF9,0xFA,0xFB,0xFB,0xFC,0xFC,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFF
            DT    0xFF,0xFF,0xFF,0xFF

TABLA_06            ORG        0x1F00        ; Dirección de la memoria 0x1F00.

            MOVF            CONT,W
            ADDWF            PCL,F
            DT    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08
            DT    0x09,0x0A,0x0B,0x0B,0x0C,0x0D,0x0E,0x10,0x11,0x12,0x13,0x14,0x15,0x17,0x18,0x19,0x1B,0x1C,0x1D,0x1F,0x20,0x22
            DT    0x23,0x25,0x27,0x28,0x2A,0x2B,0x2D,0x2F,0x31,0x32,0x34,0x36,0x38,0x3A,0x3C,0x3D,0x3F,0x41,0x43,0x45,0x47,0x49
            DT    0x4B,0x4D,0x4F,0x51,0x54,0x56,0x58,0x5A,0x5C,0x5E,0x60,0x63,0x65,0x67,0x69,0x6B,0x6D,0x70,0x72,0x74,0x76,0x79
            DT    0x7B,0x7D,0x7F,0x81,0x84,0x86,0x88,0x8A,0x8D,0x8F,0x91,0x93,0x95,0x98,0x9A,0x9C,0x9E,0xA0,0xA2,0xA5,0xA7,0xA9
            DT    0xAB,0xAD,0xAF,0xB1,0xB3,0xB5,0xB7,0xB9,0xBB,0xBD,0xBF,0xC1,0xC3,0xC5,0xC7,0xC9,0xCA,0xCC,0xCE,0xD0,0xD1,0xD3
            DT    0xD5,0xD6,0xD8,0xDA,0xDB,0xDD,0xDE,0xE0,0xE1,0xE3,0xE4,0xE5,0xE7,0xE8,0xE9,0xEA,0xEC,0xED,0xEE,0xEF,0xF0,0xF1
            DT    0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF7,0xF8,0xF9,0xF9,0xFA,0xFB,0xFB,0xFC,0xFC,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFF
            DT    0xFF,0xFF,0xFF,0xFF

            END
----------------------------------------------------------------------
Release build of project `C:\16F887_Stack\PIC16F887_stack.disposable_mcp' started.
Language tool versions: MPASMWIN.exe v5.51, mplink.exe v4.49, mplib.exe v4.49
Tue Feb 04 03:21:05 2014
----------------------------------------------------------------------
Clean: Deleting intermediary and output files.
Clean: Deleted file "C:\16F887_Stack\PIC16F887_stack.mcs".
Clean: Done.
Executing: "C:\Program Files (x86)\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F887 "PIC16F887_stack.asm" /l"PIC16F887_stack.lst" /e"PIC16F887_stack.err"
Executing: "C:\Program Files (x86)\Microchip\MPASM Suite\mplink.exe" /p16F887 "PIC16F887_stack.o" /z__MPLAB_BUILD=1 /o"PIC16F887_stack.cof" /M"PIC16F887_stack.map" /W /x
MPLINK 4.49, Linker
Device Database Version 1.14
Copyright (c) 1998-2011 Microchip Technology Inc.
Errors : 0


Loaded C:\16F887_Stack\PIC16F887_stack.cof.
----------------------------------------------------------------------
Release build of project `C:\16F887_Stack\PIC16F887_stack.disposable_mcp' succeeded.
Language tool versions: MPASMWIN.exe v5.51, mplink.exe v4.49, mplib.exe v4.49
Tue Feb 04 03:21:08 2014
----------------------------------------------------------------------
BUILD SUCCEEDED
Saludo.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.