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

Temas similares

25/08/2016 #1

Avatar de kapotik

Interrupción por recepción - RS-232 (Ensamblador)
Hola, nuevamente acudo a la sabiduría de ustedes, estoy implementando por primera vez la interrupción por RX serial, la idea es que mientras no reciba nada este chequeando el estado de ciertos registro y si están en 1 poner la salida que corresponda en alto, y cuando se activa la interrupción recibe una cadena y chequea que tiene que hacer, esos estados son 3 poner a 1 la correspondiente salida, a bajo o poner a 1 el registro que tiene asignada la salida para luego volver a donde estaba y seguir chequeando.
Bien el problema que tengo es que cuando se activa la interrupción hace correctamente todo pero borra lo anterior, es decir que si había recibido la orden de poner a alto la salida A0 y luego recibía la orden de poner a alto la A2, apaga la "0" y enciende la "2", y si le vuelvo a enviar la "0" apaga la "2" y enciende la "0", es como si una vez que sale de la interrupción borrara lo anterior para poner lo nuevo.
Les dejo los archivos para simularlo


Código:
;*******************************************************************
 
        LIST P=16F877, R=HEX    ; Usar el PIC16F877A y sistema decimal
 
        #include "P16F877A.INC"  ; Incluye datos de PIC16F877A
 
        __CONFIG   _CP_OFF & _WDT_OFF & _LVP_OFF & _PWRTE_ON & _XT_OSC 
 
 
;*******************************************************************
; CONFIGURACION
;*******************************************************************
 
 
;*******************************************************************
; VARIABLES
;*******************************************************************
W_Temp      EQU     0x30
STATUS_Temp EQU     0x40 
PDel0A      EQU     0x42
PDel1A      EQU     0x43
contador    EQU     0x52        ; variable
dato_serie  EQU     0x53        ; dato serie desde la PC
puerto_a    EQU     'A'         ;puerto A
digito_0    EQU     '0'         ;salida puerto 0
digito_1    EQU     '1'         ;salida puerto 1
digito_2    EQU     '2'         ;salida puerto 2
caracter_q  EQU     'Q'         ;encendido
caracter_w  EQU     'W'         ;apagado
caracter_p  EQU     'P'         ;parpadea
CONF_ADCON1 EQU     b'00000110'         ; Configuracion PORTA E/S digital
;*******************************************************************
        ORG    0x00            ; El programa empieza en 0x000
        goto   configuracion
        org    0x04            ;Vector de interrupción
        goto   interrup
 
;******************************************************************
 
configuracion
    bsf     STATUS,RP0            ; Ir banco 1
    bcf     STATUS,RP1      ;xxxxxx
    movlw   b'00000000'       ; valor inicial portA
    movwf   PORTA
    movlw   b'00000000'       ; valor inicial portB
    movwf   PORTB
    movlw   b'00000000'       ; valor inicial portC
    movwf   PORTC
    movlw   b'00000000'       ; valor inicial portD
    movwf   PORTD
    movlw   b'00000000'       ; valor inicial portE
    movwf   PORTE
    movlw   b'00000000'       ; valor  portA
    movwf   PORTA
    movlw   b'00000000'       ; valor  portB  0 SALIDA---1 ENTRADA
    movwf   PORTB
    movlw   b'10000000'       ; valor  portC
    movwf   PORTC
    movlw   b'00000000'       ; valor  portD
    movwf   PORTD
    movlw   b'00000000'       ; valor  portE
    movwf   PORTE
 
;*******************************************************************
; BAUD RATE para la comunicación RS232
; y otras definiciones para USART
;*******************************************************************
; Baud Rate = 9600, Sin Paridad, 1 Bit parada
    movlw   0x19              ; 0x19=9600 bps (0x0C=19200 bps)
    movwf   SPBRG
    movlw   b'00100100'       ;
    movwf   TXSTA             ; habilita la transmisión Async
    bsf     PIE1,RCIE           ;Habilita interrupción en la recepción
    bcf     STATUS,RP0            ; Ir banco 0
    movlw   b'10010000'       ; habilita de recepción Async
    movwf   RCSTA
    bsf     INTCON,PEIE       ;Activa interrupción de periféricos
    bsf     INTCON,GIE        ;Activa interrupciones
         
;*******************************************************************
; TIEMPO DE ESTABILIZACION
;*****************************************************************
            
        clrf    PDel0A
        clrf    PDel1A
        clrf    dato_serie
        clrf    PORTA
        clrf    PORTB
        clrf    PORTC
        clrf    PORTD
        clrf    PORTE
        clrf    contador
        clrf    0x31
        clrf    0x54
        clrf    0x55
        clrf    0x56
 
estab   decfsz  contador,F
        goto    estab
        movf    RCREG,W
        movf    RCREG,W
        movf    RCREG,W             ; vacía el buffer de recepcion
        
        bsf     0x56,6              ;LED_31     ; ESTA EN ALTO PARA PROBAR
        
;*******************************************************************
;INICIO 
;*******************************************************************
inicio
        btfsc   0x31,0      ;LED_1
        bsf     PORTA,0
        btfsc   0x31,1      ;LED_2
        bsf     PORTA,1
        btfsc   0x31,2      ;LED_3
        bsf     PORTA,2
        btfsc   0x31,3      ;LED_4
        bsf     PORTA,3
        btfsc   0x31,4      ;LED_5
        bsf     PORTA,4
        btfsc   0x31,5      ;LED_6
        bsf     PORTA,5
        btfsc   0x31,6      ;LED_7
        bsf     PORTE,0
        btfsc   0x31,7      ;LED_8
        bsf     PORTE,1
        btfsc   0x54,0      ;LED_9
        bsf     PORTE,2
        btfsc   0x54,1      ;LED_10
        bsf     PORTC,0
        btfsc   0x54,2      ;LED_11
        bsf     PORTC,1
        btfsc   0x54,3      ;LED_12
        bsf     PORTC,2
        btfsc   0x54,4      ;LED_13
        bsf     PORTC,3
        btfsc   0x54,5      ;LED_14
        bsf     PORTD,0
        btfsc   0x54,6      ;LED_15
        bsf     PORTD,1
        btfsc   0x54,7      ;LED_16
        bsf     PORTB,7
        btfsc   0x55,0      ;LED_17
        bsf     PORTB,6
        btfsc   0x55,1      ;LED_18
        bsf     PORTB,5
        btfsc   0x55,2      ;LED_19
        bsf     PORTB,4
        btfsc   0x55,3      ;LED_20
        bsf     PORTB,3
        btfsc   0x55,4      ;LED_21
        bsf     PORTB,2
        btfsc   0x55,5      ;LED_22
        bsf     PORTB,1
        btfsc   0x55,6      ;LED_23
        bsf     PORTB,0
        btfsc   0x55,7      ;LED_24
        bsf     PORTD,7
        btfsc   0x56,0      ;LED_25
        bsf     PORTD,6
        btfsc   0x56,1      ;LED_26
        bsf     PORTD,5
        btfsc   0x56,2      ;LED_27
        bsf     PORTD,4
        btfsc   0x56,3      ;LED_28
        bsf     PORTC,5
        btfsc   0x56,4      ;LED_29
        bsf     PORTC,4
        btfsc   0x56,5      ;LED_30
        bsf     PORTD,3
        btfsc   0x56,6      ;LED_31
        bsf     PORTD,2
        call    DEMORA1
        call    DEMORA1     ; 300 milisegundos
        call    DEMORA1
        btfsc   0x31,0      ;LED_1
        bcf     PORTA,0
        btfsc   0x31,1      ;LED_2
        bcf     PORTA,1
        btfsc   0x31,2      ;LED_3
        bcf     PORTA,2
        btfsc   0x31,3      ;LED_4
        bcf     PORTA,3
        btfsc   0x31,4      ;LED_5
        bcf     PORTA,4
        btfsc   0x31,5      ;LED_6
        bcf     PORTA,5
        btfsc   0x31,6      ;LED_7
        bcf     PORTE,0
        btfsc   0x31,7      ;LED_8
        bcf     PORTE,1
        btfsc   0x54,0      ;LED_9
        bcf     PORTE,2
        btfsc   0x54,1      ;LED_10
        bcf     PORTC,0
        btfsc   0x54,2      ;LED_11
        bcf     PORTC,1
        btfsc   0x54,3      ;LED_12
        bcf     PORTC,2
        btfsc   0x54,4      ;LED_13
        bcf     PORTC,3
        btfsc   0x54,5      ;LED_14
        bcf     PORTD,0
        btfsc   0x54,6      ;LED_15
        bcf     PORTD,1
        btfsc   0x54,7      ;LED_16
        bcf     PORTB,7
        btfsc   0x55,0      ;LED_17
        bcf     PORTB,6
        btfsc   0x55,1      ;LED_18
        bcf     PORTB,5
        btfsc   0x55,2      ;LED_19
        bcf     PORTB,4
        btfsc   0x55,3      ;LED_20
        bcf     PORTB,3
        btfsc   0x55,4      ;LED_21
        bcf     PORTB,2
        btfsc   0x55,5      ;LED_22
        bcf     PORTB,1
        btfsc   0x55,6      ;LED_23
        bcf     PORTB,0
        btfsc   0x55,7      ;LED_24
        bcf     PORTD,7
        btfsc   0x56,0      ;LED_25
        bcf     PORTD,6
        btfsc   0x56,1      ;LED_26
        bcf     PORTD,5
        btfsc   0x56,2      ;LED_27
        bcf     PORTD,4
        btfsc   0x56,3      ;LED_28
        bcf     PORTC,5
        btfsc   0x56,4      ;LED_29
        bcf     PORTC,4
        btfsc   0x56,5      ;LED_30
        bcf     PORTD,3
        btfsc   0x56,6      ;LED_31
        bcf     PORTD,2
        call    DEMORA1
        call    DEMORA1     ; 300 milisegundos
        call    DEMORA1
        goto    inicio
 
;******************************************************************************************
;Tratamiento de la interrupción
;******************************************************************************
interrup
       movwf    W_Temp              ;Copiamos W a un registro temporario
      swapf     STATUS,W            ;Invertimos los nibles del registro STATUS
      movwf     STATUS_Temp         ;Guardo STATUS en un registro temporario
 
      btfss   PIR1,RCIF           ;Ha sido interrupción en la recepción ??
      retfie                      ;No, falsa interrupción
      bcf     PIR1,RCIF           ;Si, restaurar el flag de interrupción
      call    recibeRS232         ; sí, hay
      movwf   dato_serie          ; guarda dato (para uso de cualquier rutina)
      goto    testeanumero        ; llama rutina para testear clave
 
      fin_isr
      swapf     STATUS_Temp,W
      movwf     STATUS
      swapf     W_Temp,f
      swapf     W_Temp,W
      retfie
;***********************************************************************************
; CHEQUEA QUE PIC ES
;***********************************************************************************
 
testeanumero
           
        movf    dato_serie,w         ; Guarda el contenido de la tecla pulsada.
        xorlw   digito_1            ; ¿Es el pic 1?
        btfsc   STATUS,Z
        goto    pic_1               ; Sí, se procede a chequear el puerto
        goto    fin_isr
;***********************************************************************************
; CHEQUEAR QUE PUERTO ES
;***********************************************************************************
        
pic_1
        movf     RCREG,W            ; Borra el buffer
loopi   btfss    PIR1,RCIF          ; (5) se fija si hay dato RS232
        goto     loopi              ; no, no llegó
        call     recibeRS232        ; sí, hay
        movwf    dato_serie         ; Guarda el contenido de la tecla pulsada.
        xorlw    puerto_a           ; ¿Es el puerto A?
        btfsc    STATUS,Z
        goto     port_a             ; Sí, se procede a chequear el bit
        goto        fin_isr
 
;***********************************************************************************
; CHEQUEAR QUE BIT ES DEL PUERTO A
;***********************************************************************************
port_a
        movf     RCREG,W            ; Borra el buffer
loopo   btfss    PIR1,RCIF          ; (5) se fija si hay dato RS232
        goto     loopo              ; no, no llegó
        call     recibeRS232        ; sí, hay
        movwf    dato_serie         ; Guarda el contenido de la tecla pulsada.
        xorlw    digito_0           ; ¿Es la salida 0?
        btfsc    STATUS,Z
        goto     a_0                ; Sí, se procede a chequear la accion
 
        movf     dato_serie,W       ; Recupera el contenido de la tecla pulsada.
        xorlw    digito_1           ; ¿Es la salida 1?
        btfsc    STATUS,Z
        goto     a_1                ; Sí, se procede a chequear la accion
 
        movf     dato_serie,W       ; Recupera el contenido de la tecla pulsada.
        xorlw    digito_2           ; ¿Es la salida 2?
        btfsc    STATUS,Z
        goto     a_2                ; Sí, se procede a chequear la accion
        goto         fin_isr
;***********************************************************************************
; CHEQUEAR LA ACCION DEL PUERTO A
;***********************************************************************************
a_0
        movf     RCREG,W            ; Borra el buffer
loopp   btfss    PIR1,RCIF          ; (5) se fija si hay dato RS232
        goto     loopp              ; no, no llegó
        call     recibeRS232        ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
        xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
        btfsc    STATUS,Z
        bsf      PORTA,0            ;LED_1
 
        movf     dato_serie,W       ; Recupera el contenido de la tecla pulsada.
        xorlw    caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc    STATUS,Z
        bcf      PORTA,0            ;LED_1   
        bcf      0x31,0
 
        movf     dato_serie,W       ; Recupera el contenido de la tecla pulsada.
        xorlw    caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc    STATUS,Z
        bsf      0x31,0             ; Sí,
        goto        fin_isr
 
a_1
        movf     RCREG,W            ; Borra el buffer
l_oopp  btfss    PIR1,RCIF          ; (5) se fija si hay dato RS232
        goto     l_oopp             ; no, no llegó
        call     recibeRS232        ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
        xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
        btfsc    STATUS,Z
        bsf      PORTA,1            ;LED_2              
                 
        movf     dato_serie,W       ; Recupera el contenido de la tecla pulsada.
        xorlw    caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc    STATUS,Z
        bcf      PORTA,1            ;LED_2
        bcf      0x31,1
 
        movf     dato_serie,W       ; Recupera el contenido de la tecla pulsada.
        xorlw    caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc    STATUS,Z
        bsf      0x31,1             ; Sí,
        goto       fin_isr
 
a_2
        movf     RCREG,W            ; Borra el buffer
lo_opp   btfss   PIR1,RCIF          ; (5) se fija si hay dato RS232
        goto     lo_opp             ; no, no llegó
        call     recibeRS232        ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
        xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
        btfsc    STATUS,Z
        bsf      PORTA,2            ;LED_3             
 
        movf     dato_serie,W       ; Recupera el contenido de la tecla pulsada.
        xorlw    caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc    STATUS,Z
        bcf      PORTA,2            ;LED_3              ; Sí,
        bcf      0x31,2
 
        movf     dato_serie,W       ; Recupera el contenido de la tecla pulsada.
        xorlw    caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc    STATUS,Z
        bsf      0x31,2             ; Sí,
        goto       fin_isr
 
;***********************************************************************************
; ENVIA CARACTER SERIE - RS232 - A LA Placa Y ESPERA A QUE HAYA SALIDO
;***********************************************************************************
enviaRS232
        movwf  TXREG            ; envío el dato en acunulador w
        bsf    STATUS,RP0       ; Pág 1 RAM
Espere  btfss  TXSTA,TRMT       ; transmision completa si es alto
        goto   Espere
        bcf    STATUS,RP0       ; Pág 0 RAM
        return
;***********************************************************************************
; RECIBE CARACTER SERIE - RS232 - DESDE LA PC
;***********************************************************************************
 
recibeRS232
        movf    RCREG,W            ; guarda dato recibido en acumulador
        return
 
;-------------------------------------------------------------
; TEMPORIZADOR 100 MS
;-------------------------------------------------------------
DEMORA1  movlw     .110       ; 1 set numero de repeticion  (B)
         movwf     PDel0A     ; 1 |
PLoop1A  movlw     .181       ; 1 set numero de repeticion  (A)
         movwf     PDel1A     ; 1 |
PLoop2A  clrwdt               ; 1 clear watchdog
         clrwdt               ; 1 ciclo delay
         decfsz    PDel1A,1   ; 1 + (1) es el tiempo 0  ? (A)
         goto      PLoop2A    ; 2 no, loop
         decfsz    PDel0A,1   ; 1 + (1) es el tiempo 0  ? (B)
         goto      PLoop1A    ; 2 no, loop
PDelL1A  goto      PDelL2A    ; 2 ciclos delay
PDelL2A  goto      PDelL3A    ; 2 ciclos delay
PDelL3A  clrwdt               ; 1 ciclo delay
         return               ; 2+2 Fin.
 
    END
25/08/2016 #2
Moderador

Avatar de D@rkbytes

No entiendo cómo puedes estar recibiendo, teniendo configurado el pin RC7 (Rx) como salida.
Código:
 movlw b'00000000' ; valor inicial portC
    movwf  PORTC
25/08/2016 #3

Avatar de kapotik

no, fijate que lo que estas poniendo es el valor inicial del puerto C, mas abajo si esta configurado como entrada

Código:
 movlw   b'10000000'       ; valor  portC
    movwf   PORTC
25/08/2016 #4
Moderador

Avatar de D@rkbytes

Si, pero mientras no cambies de banco esa configuración no tendrá efecto y RC7 será salida.
Tienes que definir los bits con TRISC en el banco 1 y darles un valor inicial en el banco 0.

Por ejemplo:
Código PHP:
    bsf     STATUS,RP0        Banco 1
    movlw   
b'10000000'        RC7 como entrada.
    
movwf   TRISC
    bcf     STATUS
,RP0        Banco 0
    movlw   0x00            
Bits de salida del puerto C en 0
    movwf   PORTC 
De hecho, mira lo que muestra el simulador sobre RC7:
Imágenes Adjuntas
Tipo de Archivo: jpg Logic Contention.jpg (8,4 KB (Kilobytes), 51 visitas)
26/08/2016 #5

Avatar de kapotik

si, tenes razon, averiguando en el datashet dice que cuando uno usa algun modulo en este caso la USART auto configura los pínes que utiliza, en este caso C7 lo pone como entrada sin importar como lo halla definido el usuario, por eso me funciona igual.
Pero claro lo correcto seria definirlo correctamente.
26/08/2016 #6

Avatar de Daniel Meza

Hola. Analizando el "síntoma" intuyo que podría ser que el micro se esté "reseteando" cada que recibe un dato, esto provoca que cada que reciba una instrucción reinicie el comando anterior pues al empezar de nuevo el programa apaga todos los LED's.

Una forma de saberlo es con una línea libre configurada como salida, conmutas su estado durante la rutina de inicio del PIC, un simple movlw 0x01 seguido de un xorwf PORTx,F (Para mi ejemplo supongo que la línea a conmutar está en la posición 0 del PORTx).

Otra cosa, el ensamblador permite tener Alias para las direcciónes de RAM, te recomiendo que hagas uso de la directiva EQU para definir tus variables. Por ejemplo ByteBajo EQU 0x31; así, en vez de preguntar por btfsc 0x31,0 preguntas por btfsc ByteBajo,0 dando mayor claridad a tu programa.

Referente a lo que comentan de las líneas del puerto serie, es verdad, al configurar la UART estas por predeterminado toman las direcciones necesarias para la operación. Y un detalle más, no es necesario borrar la bandera RCIF, por Hardware se hace automáticamente al leer el registro de recepción.

Flag bit RCIF is a read only bit, which is
cleared by the hardware. It is cleared when the RCREG
register has been read and is empty.

Saludos y comenta tus resultados.
26/08/2016 #7

Avatar de kapotik

daniel yo sospechaba lo mismo, que el pic se resetea, pero no sabia como comprobarlo, y ahora la duda donde coloco lo que decís luego de iniciar los puertos? antes de la etiqueta inicio?
seria asi?
Código:
movlw    0x01 
 xorwf    PORTA,F
la F del puerto a que hace referencia?, o tengo que cambiarla por una salida (0,1,2 ect)

saludos

PD: si, lo de los alias lo se, es mas lo habia hecho en un principio asi pero luego lo cambie para probar por lo que no me anda.
26/08/2016 #8

Avatar de Daniel Meza

Interrupción por recepción - RS-232 (Ensamblador)
Tienes que colocarla fuera del lazo principal del programa, en una sección que estés seguro que solo se ejecute una sola vez, después de inicializar los puertos es un buen lugar.

La F hace referencia a que el resultado de la operación (en este caso, la operación XOR entre W y PORTA) quede guardado en el mismo registro que se operó, es decir, se hace la operación XOR entre PORTA y W y el resultado es almacenado en PORTA. Si en lugar de F hubiésemos colocado W el resultado de la operación se almacenaría en W.

PD. Las instrucciones que te comente deben de colocarse en algún lugar donde previamente ya se hayan definido las direcciones de E\s de los puertos, de otra forma no se verá el efecto que se espera.


Enviado desde mi iPad utilizando Tapatalk
26/08/2016 #9

Avatar de kapotik

Daniel, pero solo tengo que agregar esas dos lineas de codigo? que va a salir por el puerto?
o sea como me voy a dar cuenta de que se resetea.

saludos
26/08/2016 #10
Moderador

Avatar de D@rkbytes

Algo que acabo de notar, es que en el programa tienes el fuse _XT_OSC, pero en el esquema viene que estás usando una frecuencia para el cristal de 20 MHz.
Así que habría que cambiar el fuse _XT_OSC por _HS_OSC

Ahora, si usas Fosc = 20 MHz, la rutina de retardo para 100 ms, no es correcta.

Algo que yo uso para determinar problemas de ejecución, es usar el ICD, de esa forma puedes ver lo que sucede paso a paso, de forma animada y poner puntos de ruptura sobre las partes del programa en donde creas que puede estar el problema.
Así le puedes dar un seguimiento a la ejecución física y encontrar el problema.
Pero como el modo de depuración ICD es lento para que uno pueda ir visualizando, si se usan retardos largos, es mejor poner temporalmente retardos muy cortos o comentar su llamada, ya que un retardo de 100 ms en modo ICD, puede tardar más de un minuto para retornar.

Intenta depurar con ICD y le vas a encontrar muchas ventajas.
26/08/2016 #11

Avatar de kapotik

podrias explicarme que es el ICD?, ya se que es una herramienta para depurar pero es un programa o viene dentro del MPLBX?
26/08/2016 #12
Moderador

Avatar de D@rkbytes

ICD = In-Circuit Debugger. Puede usarse una tarjeta especial, (ICD 3 o Real ICE, actualmente) pero también es una característica que tiene el programador para depurar físicamente.
Se puede usar el PICkit 2 o el PICkit 3 y posiblemente otros.
Se activa desde el IDE (Varios entornos de desarrollo tienen ésta función)
Para ésto se requiere de una configuración especial, pero muy sencilla.
Y sí se encuentra en MPLABX, de hecho desde que era MPLAB, ya existía el ICD.

Mira la siguiente información:
In-Circuit Debuggers (Programmer-Debuggers)
YouTube: In-Circuit Debugger

Edito:

Esta es una captura usando ICD desde MPLAB.


Ahí se puede ver que coloqué un punto de ruptura (Break Point) en la rutina "testeanumero"
Se avanza paso a paso y se puede ver que no entra a la rutina "pic_1" porque no está comparando un '1'
Si miras lo que hay en las variables "digito_1", "dato_serie" y el registro RCREG, es un punto '.'
O sea que no se están recibiendo los datos correctamente y por eso salta a "fin_isr" (Ver imagen)

La prueba la realicé con un PIC16F877A conectado al PICkit 3 (Cómo Debugger)
Imágenes Adjuntas
Tipo de Archivo: jpg MPLAB_PK3_ICD.jpg (203,2 KB (Kilobytes), 47 visitas)
26/08/2016 #13

Avatar de kapotik

por lo que veo hace falta conectar harware para hacer el debuger? no es algo simulado?
26/08/2016 #14
Moderador

Avatar de D@rkbytes

No, con ICD se realiza una depuración que se lleva a cabo físicamente.
El depurador va respondiendo ante los eventos externos y actúa sobre los puntos de ruptura colocados en el programa.

No se requiere nada más que tener conectado el programador al PIC por medio de sus terminales ICSP.

En éste caso no hay mucho que conectar.

Como casi todos los puertos son salidas, su estado se puede verificar con una punta lógica.
Únicamente conecté el LED que se mantiene destellando y las terminales del puerto serial.
Imágenes Adjuntas
Tipo de Archivo: jpg Dsc01849.jpg (85,2 KB (Kilobytes), 45 visitas)
26/08/2016 #15

Avatar de Daniel Meza

Buena idea lo de la depuración. Contestando a la pregunta, si colocas un LED en el pin que se declaró como salida y este parpadea continuamente conforme llegan los comandos es indicación de que el pic se está reiniciando continuamente .
Si la intuición que hice es incorrecta, (que el micro no se reinicia) el LED hará solamente un cambio y se mantendrá en ese nuevo nivel todo el tiempo.

Esto ocurre porque los registros PORTx no se alteran al hacerle un reset al micro, mantienen su estado lógico.


Enviado desde mi iPad utilizando Tapatalk
03/09/2016 #16

Avatar de kapotik

hola, vuelvo con algunos avanses,

Dani el pic no se esta reseteando, luego de cargar el codigo completo y de poner todos los led al micro me di cuenta de que funciona, o eso parece, los puertos B, C y D funcionan perfecto, hacen todo lo que quiero, que era encender, apagar o parpadear, los unicos puertos que no andan son el A y el E, haber si le digo que encienda PORTDA,0 lo hace, pero cuando le digo que encienda PORTA,1 lo hace pero apaga el anterior.
Pensando que podria haber un error en el codigo coloque algo tan simple como esto:

Código:
        bsf	PORTA,0
	call	DEMORA_6
	bsf	PORTA,1
	call	DEMORA_6
	bsf	PORTA,2
	call	DEMORA_6
	bsf	PORTA,3
	call	DEMORA_6
	bsf	PORTA,5
	call	DEMORA_6
	bsf	PORTE,0
	call	DEMORA_6
	bsf	PORTE,1
	call	DEMORA_6
	bsf	PORTE,2
	call	DEMORA_6
y esto es lo que sucede:

cuando se deberian haber quedado prendidos todos a la vez.

buscando en google encontre la siguiente nota:
Las lineas cuando actuan como salidas estan <<lacheadas>>, lo que significa que sus patitas sacan el nivel logico que se haya cargado por ultima vez en el Registro "PORTA". La escritura de una puerta implica la operacion <<lectura/modificacion/escritura>>, primero lee la puerta, luego se modifica el valor y finalmente se escribe en el lach de salida.
ahora no creo que no se pueda encender y apagar a discrecion, yo no soy un programador experto en PIC pero si un viejo usuario y es la primera ves que no puedo manipular las salidas a mi antojo, por lo que sospecho que tal vez el problema este en la configuracion de los puertos, cuando lo compilo al codigo el MPLAP me tira varios WARNIG sobre configuraciones fuera de los bancos:

Message[302] D:\PINBAL.ASM 126 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] D:\PINBAL.ASM 128 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] D:\PINBAL.ASM 129 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] D:\PINBAL.ASM 1470 : Register in operand not in bank 0. Ensure that bank bits are correct.
el codigo completo

Código:
;*******************************************************************

        LIST P=16F877, R=HEX    ; Usar el PIC16F877A y sistema decimal

        #include "P16F877A.INC"  ; Incluye datos de PIC16F877A

	__CONFIG   _CP_OFF & _WDT_OFF & _LVP_OFF & _PWRTE_ON & _XT_OSC 


;*******************************************************************
; CONFIGURACION
;*******************************************************************


;*******************************************************************
; VARIABLES
;*******************************************************************
dat9	    EQU     0x32
dat8	    EQU     0x33
dat6        EQU     0x34
dat3        EQU     0x35
dat4	    EQU     0x36
dat5        EQU     0x37
dat10	    EQU     0x38
PDel0       EQU     0x39	;VARIABLES TEMPORIZADOR
PDel1 	    EQU     0x40
PDel2 	    EQU     0x41
PDel0A	    EQU     0x42
PDel1A	    EQU     0x43
PDel0W      EQU     0X44 	;VARIABLES TEMPORIZADOR
PDel1W 	    EQU     0X45
PDel2W 	    EQU     0x46
PDel03 	    EQU     0x47
PDel13	    EQU     0x48
PDel05 	    EQU     0x49
PDel15	    EQU     0x50
PDel25 	    EQU     0x51
contador    EQU     0x52	; variable
dato_serie  EQU     0x53	; dato serie desde la PC
puerto_a    EQU     'A'     	;puerto A
puerto_b    EQU     'B'         ;puerto B
puerto_c    EQU     'C'         ;puerto C
puerto_d    EQU     'D'         ;puerto D
puerto_e    EQU     'E'         ;puerto E
digito_0    EQU     '0'         ;salida puerto 0
digito_1    EQU     '1'         ;salida puerto 1
digito_2    EQU     '2'         ;salida puerto 2
digito_3    EQU     '3'         ;salida puerto 3
digito_4    EQU     '4'         ;salida puerto 4
digito_5    EQU     '5'         ;salida puerto 5
digito_6    EQU     '6'         ;salida puerto 6
digito_7    EQU     '7'         ;salida puerto 7
caracter_q  EQU     'Q'         ;encendido
caracter_w  EQU     'W'         ;apagado
caracter_p  EQU     'P'         ;parpadea
caracter_f  EQU     'F'         ;flash
caracter_x  EQU     'X'         ;apaga todo

CONF_ADCON1 EQU 	b'00000110' 	; Configuracion PORTA E/S digital
;*******************************************************************
        ORG    0x00            ; El programa empieza en 0x000
        goto   configuracion
        org    0x04            ;Vector de interrupción
        goto   interrup
;*******************************************************************
; Inhibe comparadores
;*******************************************************************
	
;*********************************************Patillas ****************************************************************
;                 _______________
;   MCLR - VPP  -|1     \__/   40|- RB,7 - LED 16
; LED 1  - RA,0 -|2            39|- RB,6 - LED 17
; LED 2  - RA,1 -|3  16F877a   38|- RB,5 - LED 18
; LED 3  - RA,2 -|4            37|- RB,4 - LED 19
; LED 4  - RA,3 -|5            36|- RB,3 - LED 20
; LED 5  - RA,4 -|6            35|- RB,2 - LED 21
; LED 6  - RA,5 -|7            34|- RB,1 - LED 22
; LED 7  - RE,0 -|8            33|- RB,0 - LED 23
; LED 8  - RE,1 -|9            32|- VDD
; LED 9  - RE,2 -|10           31|- VSS
;          VDD  -|11           30|- RD,7 - LED 24
;          VSS  -|12           29|- RD,6 - LED 25
;    [XT]- OSC  -|13           28|- RD,5 - LED 26
;    [XT]- OSC  -|14           27|- RD,4 - LED 27
; LED 10 - RC,0 -|15           26|- RC,7/RX -
; LED 11 - RC,1 -|16           25|- RC,6/TX -
; LED 12 - RC,2 -|17           24|- RC,5 - LED 28
; LED 13 - RC,3 -|18           23|- RC,4 - LED 29
; LED 14 - RD,0 -|19           22|- RD,3 - LED 30
; LED 15 - RD,1 -|20           21|- RD,2 - LED 31
;                |_______________|
;
;***********************************************************************************************************************

configuracion
    bsf     STATUS,RP0 		  ; Ir banco 1
    bcf     STATUS,RP1	    ;xxxxxx
    movlw   b'00000000'       ; valor inicial portA
    movwf   PORTA
    movlw   b'00000000'       ; valor inicial portB
    movwf   PORTB
    movlw   b'00000000'       ; valor inicial portC
    movwf   PORTC
    movlw   b'00000000'       ; valor inicial portD
    movwf   PORTD
    movlw   b'00000000'       ; valor inicial portE
    movwf   PORTE
    
    movlw   b'00000000'	      ; valor  portA
    movwf   PORTA
    movlw   b'00000000'	      ; valor  portB  0 SALIDA---1 ENTRADA
    movwf   PORTB
    movlw   b'10000000'       ; valor  portC
    movwf   PORTC
    movlw   b'00000000'       ; valor  portD
    movwf   PORTD
    movlw   b'00000000'       ; valor  portE
    movwf   PORTE

;*******************************************************************
; BAUD RATE para la comunicación RS232
; y otras definiciones para USART
;*******************************************************************
; Baud Rate = 9600, Sin Paridad, 1 Bit parada
    movlw   0x19              ; 0x19=9600 bps (0x0C=19200 bps)
    movwf   SPBRG
    movlw   b'00100100'       ;
    movwf   TXSTA             ; habilita la transmisión Async
    bsf     PIE1,RCIE           ;Habilita interrupción en la recepción
    bcf     STATUS,RP0 		  ; Ir banco 0
    
    movlw   b'10010000'       ; habilita de recepción Async
    movwf   RCSTA
    bsf     INTCON,PEIE       ;Activa interrupción de periféricos
    bsf     INTCON,GIE        ;Activa interrupciones

   
  
	 
	 
;*******************************************************************
; TIEMPO DE ESTABILIZACION
;*****************************************************************
 	    
	clrf	dat9
	clrf	dat8
	clrf	dat6
	clrf	dat3
	clrf	dat4
	clrf	dat5
	clrf	dat10
	clrf	PDel0
	clrf	PDel1
	clrf	PDel2
	clrf	PDel0A
	clrf	PDel1A
	clrf	PDel0W
	clrf	PDel1W
	clrf	PDel2W
	clrf	PDel03
	clrf	PDel13
	clrf	dato_serie
	clrf	PDel05
	clrf	PDel15
	clrf	PDel25
	clrf	PORTA
	clrf	PORTB
        clrf	PORTC
	clrf	PORTD
        clrf	PORTE
	clrf    contador
	clrf	0x31
	clrf	0x54
	clrf	0x55
	clrf	0x56

	 
      
	
estab	decfsz  contador,F
        goto	estab
        movf	RCREG,W
        movf	RCREG,W
        movf	RCREG,W             ; vacía el buffer de recepcion
	
	bsf	0x56,6		    ;LED_31	; ESTA EN ALTO PARA PROBAR
	
	bsf	PORTA,0
	call	DEMORA_6
	bsf	PORTA,1
	call	DEMORA_6
	bsf	PORTA,2
	call	DEMORA_6
	bsf	PORTA,3
	call	DEMORA_6
	bsf	PORTA,5
	call	DEMORA_6
	bsf	PORTE,0
	call	DEMORA_6
	bsf	PORTE,1
	call	DEMORA_6
	bsf	PORTE,2
	call	DEMORA_6
	
;*******************************************************************
;INICIO 
;*******************************************************************
inicio
	btfsc	0x31,0      ;LED_1
	bsf	PORTA,0
	btfsc	0x31,1	    ;LED_2
	bsf	PORTA,1
	btfsc	0x31,2	    ;LED_3
	bsf	PORTA,2
	btfsc	0x31,3      ;LED_4
	bsf	PORTA,3
	btfsc	0x31,4      ;LED_5
	bsf	PORTA,4
	btfsc	0x31,5      ;LED_6
	bsf	PORTA,5
	btfsc	0x31,6      ;LED_7
	bsf	PORTE,0
	btfsc	0x31,7      ;LED_8
	bsf	PORTE,1
	btfsc	0x54,0      ;LED_9
	bsf	PORTE,2
	btfsc	0x54,1	    ;LED_10
	bsf	PORTC,0
	btfsc	0x54,2	    ;LED_11
	bsf	PORTC,1
	btfsc	0x54,3      ;LED_12
	bsf	PORTC,2
	btfsc	0x54,4      ;LED_13
	bsf	PORTC,3
	btfsc	0x54,5      ;LED_14
	bsf	PORTD,0
	btfsc	0x54,6      ;LED_15
	bsf	PORTD,1
	btfsc	0x54,7      ;LED_16
	bsf	PORTB,7
	btfsc	0x55,0      ;LED_17
	bsf	PORTB,6
	btfsc	0x55,1	    ;LED_18
	bsf	PORTB,5
	btfsc	0x55,2	    ;LED_19
	bsf	PORTB,4
	btfsc	0x55,3      ;LED_20
	bsf	PORTB,3
	btfsc	0x55,4      ;LED_21
	bsf	PORTB,2
	btfsc	0x55,5      ;LED_22
	bsf	PORTB,1
	btfsc	0x55,6      ;LED_23
	bsf	PORTB,0
	btfsc	0x55,7      ;LED_24
	bsf	PORTD,7
	btfsc	0x56,0      ;LED_25
	bsf	PORTD,6
	btfsc	0x56,1	    ;LED_26
	bsf	PORTD,5
	btfsc	0x56,2	    ;LED_27
	bsf	PORTD,4
	btfsc	0x56,3      ;LED_28
	bsf	PORTC,5
	btfsc	0x56,4      ;LED_29
	bsf	PORTC,4
	btfsc	0x56,5      ;LED_30
	bsf	PORTD,3
	btfsc	0x56,6      ;LED_31
	bsf	PORTD,2
	call	DEMORA1
	call	DEMORA1	    ; 300 milisegundos
	call	DEMORA1
	btfsc	0x31,0      ;LED_1
	bcf	PORTA,0
	btfsc	0x31,1	    ;LED_2
	bcf	PORTA,1
	btfsc	0x31,2	    ;LED_3
	bcf	PORTA,2
	btfsc	0x31,3      ;LED_4
	bcf	PORTA,3
	btfsc	0x31,4      ;LED_5
	bcf	PORTA,4
	btfsc	0x31,5      ;LED_6
	bcf	PORTA,5
	btfsc	0x31,6      ;LED_7
	bcf	PORTE,0
	btfsc	0x31,7      ;LED_8
	bcf	PORTE,1
	btfsc	0x54,0      ;LED_9
	bcf	PORTE,2
	btfsc	0x54,1	    ;LED_10
	bcf	PORTC,0
	btfsc	0x54,2	    ;LED_11
	bcf	PORTC,1
	btfsc	0x54,3      ;LED_12
	bcf	PORTC,2
	btfsc	0x54,4      ;LED_13
	bcf	PORTC,3
	btfsc	0x54,5      ;LED_14
	bcf	PORTD,0
	btfsc	0x54,6      ;LED_15
	bcf	PORTD,1
	btfsc	0x54,7      ;LED_16
	bcf	PORTB,7
	btfsc	0x55,0      ;LED_17
	bcf	PORTB,6
	btfsc	0x55,1	    ;LED_18
	bcf	PORTB,5
	btfsc	0x55,2	    ;LED_19
	bcf	PORTB,4
	btfsc	0x55,3      ;LED_20
	bcf	PORTB,3
	btfsc	0x55,4      ;LED_21
	bcf	PORTB,2
	btfsc	0x55,5      ;LED_22
	bcf	PORTB,1
	btfsc	0x55,6      ;LED_23
	bcf	PORTB,0
	btfsc	0x55,7      ;LED_24
	bcf	PORTD,7
	btfsc	0x56,0      ;LED_25
	bcf	PORTD,6
	btfsc	0x56,1	    ;LED_26
	bcf	PORTD,5
	btfsc	0x56,2	    ;LED_27
	bcf	PORTD,4
	btfsc	0x56,3      ;LED_28
	bcf	PORTC,5
	btfsc	0x56,4      ;LED_29
	bcf	PORTC,4
	btfsc	0x56,5      ;LED_30
	bcf	PORTD,3
	btfsc	0x56,6      ;LED_31
	bcf	PORTD,2
	call	DEMORA1
	call	DEMORA1	    ; 300 milisegundos
	call	DEMORA1
	goto	inicio
	
FLASH
MUERTO
;******************************************************************************************
;Tratamiento de la interrupción
;******************************************************************************
interrup
      btfss   PIR1,RCIF		  ;Ha sido interrupción en la recepción ??
      retfie                      ;No, falsa interrupción
      bcf     PIR1,RCIF           ;Si, restaurar el flag de interrupción
      call    recibeRS232         ; sí, hay
      movwf   dato_serie          ; guarda dato (para uso de cualquier rutina)
      goto    testeanumero	  ; llama rutina para testear clave
      ;movf    RCREG,W            ;Lee el dato recibido
      ;movwf   PORTB              ;Lo saca por la puerta B
      ;call    Tx_Dato            ;Lo retransmite a modo de eco
      ;retfie

;***********************************************************************************
; CHEQUEA QUE PIC ES
;***********************************************************************************

testeanumero
           
        movf	dato_serie,w         ; Guarda el contenido de la tecla pulsada.
        xorlw	digito_1            ; ¿Es el pic 1?
        btfsc	STATUS,Z
        goto	pic_1               ; Sí, se procede a chequear el puerto
	
        movf	dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	digito_2            ; ¿Es el pic 2?
        btfsc	STATUS,Z
        goto	pic_2               ; Sí, se reemvian datos al pic 2

        movf	dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	digito_3            ; ¿Es es el pic 3?
        btfsc	STATUS,Z
        goto	pic_3               ; Sí, se reemvian datos al pic 3

        movf	dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	digito_4            ; ¿Es tecla del movimiento hacia la derecha?
        btfsc	STATUS,Z
        goto	pic_4               ; Sí, se reemvian datos al pic 4
        ;goto    inicio
	retfie
;***********************************************************************************
; CHEQUEAR QUE PUERTO ES
;***********************************************************************************
	
pic_1
	movf 	 RCREG,W            ; Borra el buffer
loopi   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 loopi              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Guarda el contenido de la tecla pulsada.
        xorlw	 puerto_a           ; ¿Es el puerto A?
        btfsc	 STATUS,Z
        goto	 port_a             ; Sí, se procede a chequear el bit

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 puerto_b           ; ¿Es el puerto B?
        btfsc	 STATUS,Z
        goto	 port_b             ; Sí, se procede a chequear el bit

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 puerto_c           ; ¿Es el puerto C?
        btfsc	 STATUS,Z
        goto	 port_c             ; Sí, se procede a chequear el bit

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 puerto_d           ; ¿Es el puerto D?
        btfsc	 STATUS,Z
        goto	 port_d             ; Sí, se procede a chequear el puerto

        movf	 dato_serie,W       ; Guarda el contenido de la tecla pulsada.
        xorlw	 puerto_e           ; ¿Es el puerto E?
        btfsc	 STATUS,Z
        goto	 port_e             ; Sí, se procede a chequear el bit
        ;goto     inicio
	retfie
pic_2
pic_3
pic_4
;***********************************************************************************
; CHEQUEAR QUE BIT ES DEL PUERTO A
;***********************************************************************************
port_a
	movf 	 RCREG,W            ; Borra el buffer
loopo   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 loopo              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf	 dato_serie         ; Guarda el contenido de la tecla pulsada.
        xorlw	 digito_0           ; ¿Es la salida 0?
        btfsc	 STATUS,Z
        goto	 a_0                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_1           ; ¿Es la salida 1?
        btfsc	 STATUS,Z
        goto	 a_1                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_2           ; ¿Es la salida 2?
        btfsc	 STATUS,Z
        goto	 a_2                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_3           ; ¿Es la salida 3?
        btfsc	 STATUS,Z
        goto	 a_3                ; Sí, se procede a chequear la accion

        movwf	 dato_serie         ; Guarda el contenido de la tecla pulsada.
        xorlw	 digito_4           ; ¿Es la salida 4?
        btfsc	 STATUS,Z
        goto	 a_4                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_5           ; ¿Es la salida 5?
        btfsc	 STATUS,Z
        goto	 a_5                ; Sí, se procede a chequear la accion
        ;goto     inicio
	retfie
;***********************************************************************************
; CHEQUEAR LA ACCION DEL PUERTO A
;***********************************************************************************
a_0
        movf 	 RCREG,W            ; Borra el buffer
loopp   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 loopp              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTA,0	    ;LED_1

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTA,0	    ;LED_1   
        bcf      0x31,0

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x31,0             ; Sí,

        ;call     fla                ; FLASH
        ;call     muer               ; MUERTO
        ;goto     inicio
	retfie

a_1
        movf 	 RCREG,W            ; Borra el buffer
l_oopp  btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 l_oopp             ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTA,1            ;LED_2              
                 
        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTA,1            ;LED_2
        bcf      0x31,1

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x31,1             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie

a_2
        movf 	 RCREG,W            ; Borra el buffer
lo_opp   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 lo_opp             ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTA,2	    ;LED_3             

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTA,2	    ;LED_3              ; Sí,
        bcf      0x31,2

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x31,2             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie

a_3
        movf 	 RCREG,W            ; Borra el buffer
loo_pp  btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 loo_pp             ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTA,3	    ;LED_4              ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTA,3	    ;LED_4              ; Sí,
        bcf      0x31,3

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x31,3             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie

a_4
        movf 	 RCREG,W            ; Borra el buffer
loop_p  btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 loop_p             ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTA,4	    ;LED_5              ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTA,4	    ;LED_5              ; Sí,
        bcf      0x31,4

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x31,4             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie

a_5
        movf 	 RCREG,W            ; Borra el buffer
poopl   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 poopl              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTA,5	    ;LED_6              ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTA,5	    ;LED_6              ; Sí,
        bcf      0x31,5

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x31,5             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie

;***********************************************************************************
; CHEQUEAR QUE BIT ES DEL PUERTO B
;***********************************************************************************
port_b
    	movf 	 RCREG,W            ; Borra el buffer
loopl   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 loopl              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf	 dato_serie         ; Guarda el contenido de la tecla pulsada.
        xorlw	 digito_0           ; ¿Es la salida 0?
        btfsc	 STATUS,Z
        goto	 b_0                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_1           ; ¿Es la salida 1?
        btfsc	 STATUS,Z
        goto	 b_1                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_2           ; ¿Es la salida 2?
        btfsc	 STATUS,Z
        goto	 b_2                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_3           ; ¿Es la salida 3?
        btfsc	 STATUS,Z
        goto	 b_3                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W       ; Guarda el contenido de la tecla pulsada.
        xorlw	 digito_4           ; ¿Es la salida 4?
        btfsc	 STATUS,Z
        goto	 b_4                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_5           ; ¿Es la salida 5?
        btfsc	 STATUS,Z
        goto	 b_5                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W
	xorlw	 digito_6
	btfsc	 STATUS,Z
	goto	 b_6

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_7           ; ¿Es la salida 7?
        btfsc	 STATUS,Z
        goto	 b_7                ; Sí, se procede a chequear la accion
        ;goto     inicio
	retfie
;***********************************************************************************
; CHEQUEAR LA ACCION DEL PUERTO B
;***********************************************************************************
b_0
        movf 	 RCREG,W            ; Borra el buffer
loooo   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 loooo              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTB,7	    ;LED_16             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTB,7	    ;LED_16             ; Sí,
        bcf      0x54,7

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x54,7             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie

b_1
        movf 	 RCREG,W            ; Borra el buffer
loo     btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 loo                ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTB,6	    ;LED_17             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTB,6	    ;LED_17             ; Sí,
        bcf      0x55,0

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x55,0             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie

b_2
        movf 	 RCREG,W            ; Borra el buffer
loo_1   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 loo_1              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTB,5	    ;LED_18             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTB,5	    ;LED_18             ; Sí,
        bcf      0x55,1

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x55,1             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie

b_3
        movf 	 RCREG,W            ; Borra el buffer
loo1pp  btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 loo1pp             ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTB,4	    ;LED_19             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTB,4	    ;LED_19             ; Sí,
        bcf      0x55,2

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x55,2             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie

b_4
        movf 	 RCREG,W            ; Borra el buffer
loop1p  btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 loop1p             ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTB,3	    ;LED_20             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTB,3	    ;LED_20             ; Sí,
        bcf      0x55,3

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x55,3             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie

b_5
        movf 	 RCREG,W            ; Borra el buffer
poop1   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 poop1              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTB,2	    ;LED_21             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTB,2	    ;LED_21             ; Sí,
        bcf      0x55,4

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x55,4             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie

b_6  
	movf 	 RCREG,W            ; Borra el buffer
p1opo   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 p1opo              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTB,1	    ;LED_22             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTB,1	    ;LED_22             ; Sí,
        bcf      0x55,5

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x55,5             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie

b_7
        movf 	 RCREG,W            ; Borra el buffer
op1po   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 op1po              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTB,0	    ;LED_23             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTB,0	    ;LED_23             ; Sí,
        bcf      0x55,6

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x55,6             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie
;***********************************************************************************
; CHEQUEA puerto C
;***********************************************************************************
port_c
    	movf 	 RCREG,W            ; Borra el buffer
loop2   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 loop2              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf	 dato_serie         ; Guarda el contenido de la tecla pulsada.
        xorlw	 digito_0           ; ¿Es la salida 0?
        btfsc	 STATUS,Z
        goto	 c_0                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_1           ; ¿Es la salida 1?
        btfsc	 STATUS,Z
        goto	 c_1                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_2           ; ¿Es la salida 2?
        btfsc	 STATUS,Z
        goto	 c_2                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_3           ; ¿Es la salida 3?
        btfsc	 STATUS,Z
        goto	 c_3                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W       ; Guarda el contenido de la tecla pulsada.
        xorlw	 digito_4           ; ¿Es la salida 4?
        btfsc	 STATUS,Z
        goto	 c_4                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_5           ; ¿Es la salida 5?
        btfsc	 STATUS,Z
        goto	 c_5                ; Sí, se procede a chequear la accion
        ;goto     inicio
	retfie
;***********************************************************************************
; CHEQUEAR LA ACCION DEL PUERTO C
;***********************************************************************************
c_0
        movf 	 RCREG,W            ; Borra el buffer
looo2   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 looo2              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTC,0	    ;LED_10             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTC,0	    ;LED_10             ; Sí,
        bcf      0x54,1

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x54,1             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie
	
c_1
        movf 	 RCREG,W            ; Borra el buffer
loo2    btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 loo2               ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTC,1	    ;LED_11             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTC,1	    ;LED_11             ; Sí,
        bcf      0x54,2

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x54,2             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie
	
c_2
        movf 	 RCREG,W            ; Borra el buffer
loo_2   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 loo_2              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTC,2	    ;LED_12             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTC,2	    ;LED_12             ; Sí,
        bcf      0x54,3

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x54,3             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie
	
c_3
        movf 	 RCREG,W            ; Borra el buffer
loo1p2  btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 loo1p2             ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTC,3	    ;LED_13             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTC,3	    ;LED_13             ; Sí,
        bcf      0x54,4

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x54,4             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie
	
c_4
        movf 	 RCREG,W            ; Borra el buffer
loop12  btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 loop12             ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTC,4	    ;LED_29             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTC,4	    ;LED_29             ; Sí,
        bcf      0x56,4

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x56,4             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie
	
c_5
        movf 	 RCREG,W            ; Borra el buffer
poop2   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 poop2              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTC,5	    ;LED_28             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTC,5	    ;LED_28             ; Sí,
        bcf      0x56,3

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x56,3             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie
	
;***********************************************************************************
; CHEQUEA puerto D
;***********************************************************************************
port_d
    	movf 	 RCREG,W            ; Borra el buffer
l3opo   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 l3opo              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf	 dato_serie         ; Guarda el contenido de la tecla pulsada.
        xorlw	 digito_0           ; ¿Es la salida 0?
        btfsc	 STATUS,Z
        goto	 d_0                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_1           ; ¿Es la salida 1?
        btfsc	 STATUS,Z
        goto	 d_1                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_2           ; ¿Es la salida 2?
        btfsc	 STATUS,Z
        goto	 d_2                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_3           ; ¿Es la salida 3?
        btfsc	 STATUS,Z
        goto	 d_3                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W       ; Guarda el contenido de la tecla pulsada.
        xorlw	 digito_4           ; ¿Es la salida 4?
        btfsc	 STATUS,Z
        goto	 d_4                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_5           ; ¿Es la salida 5?
        btfsc	 STATUS,Z
        goto	 d_5                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_6           ; ¿Es la salida 6?
        btfsc	 STATUS,Z
        goto	 d_6                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_7           ; ¿Es la salida 7?
        btfsc	 STATUS,Z
        goto	 d_7                ; Sí, se procede a chequear la accion
        ;goto     inicio
	retfie
;***********************************************************************************
; CHEQUEAR LA ACCION DEL PUERTO B
;***********************************************************************************
d_0
        movf 	 RCREG,W            ; Borra el buffer
l3ooo   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 l3ooo              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTD,0	    ;LED_14             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTD,0	    ;LED_14             ; Sí,
        bcf      0x54,5

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x54,5             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie
	
d_1
        movf 	 RCREG,W            ; Borra el buffer
l3o     btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 l3o                ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTD,1	    ;LED_15             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTD,1	    ;LED_15             ; Sí,
        bcf      0x54,6

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x54,6             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie
	
d_2
        movf 	 RCREG,W            ; Borra el buffer
l3o_1   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 l3o_1              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTD,2	    ;LED_31             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTD,2	    ;LED_31             ; Sí,
        bcf      0x56,6

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x56,6             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie
	
d_3
        movf 	 RCREG,W            ; Borra el buffer
l3o1pp  btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 l3o1pp             ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTD,3	    ;LED_30             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTD,3	    ;LED_30             ; Sí,
        bcf      0x56,5

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x56,5             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie
d_4
        movf 	 RCREG,W            ; Borra el buffer
l3op1p  btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 l3op1p             ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTD,4	    ;LED_27             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTD,4	    ;LED_27             ; Sí,
        bcf      0x56,2

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x56,2             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie
	
d_5
        movf 	 RCREG,W            ; Borra el buffer
p3op1   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 p3op1              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTD,5	    ;LED_26             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTD,5	    ;LED_26             ; Sí,
        bcf      0x56,1

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x56,1             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie
d_6
        movf 	 RCREG,W            ; Borra el buffer
popo3   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 popo3              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTD,6	    ;LED_25             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTD,6	    ;LED_25             ; Sí,
        bcf      0x56,0

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x56,0             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie
	
d_7
        movf 	 RCREG,W            ; Borra el buffer
oppo3   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 oppo3              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTD,7	    ;LED_24             ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTD,7	    ;LED_24             ; Sí,
        bcf      0x55,7

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x55,7             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie
;***********************************************************************************
; CHEQUEA puerto E
;***********************************************************************************
port_e
    	movf 	 RCREG,W            ; Borra el buffer
leopo   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 leopo              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf	 dato_serie         ; Guarda el contenido de la tecla pulsada.
        xorlw	 digito_0           ; ¿Es la salida 0?
        btfsc	 STATUS,Z
        goto	 e_0                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_1           ; ¿Es la salida 1?
        btfsc	 STATUS,Z
        goto	 e_1                ; Sí, se procede a chequear la accion

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 digito_2           ; ¿Es la salida 2?
        btfsc	 STATUS,Z
        goto	 e_2                ; Sí, se procede a chequear la accion
        ;goto     inicio
	retfie
;***********************************************************************************
; CHEQUEAR LA ACCION DEL PUERTO B
;***********************************************************************************
e_0
        movf 	 RCREG,W            ; Borra el buffer
loooe   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 loooe              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTE,0	    ;LED_7              ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTE,0	    ;LED_7              ; Sí,
        bcf      0x31,6

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x31,6             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie
	
e_1
        movf 	 RCREG,W            ; Borra el buffer
loe     btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 loe                ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTE,1	    ;LED_8              ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTE,1	    ;LED_8              ; Sí,
        bcf      0x31,7

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x31,7             ; Sí,

        call     fla                ; FLASH
        call     muer               ; MUERTO
        ;goto     inicio
	retfie
	
e_2
        movf 	 RCREG,W            ; Borra el buffer
loo_e   btfss 	 PIR1,RCIF          ; (5) se fija si hay dato RS232
    	goto 	 loo_e              ; no, no llegó
    	call 	 recibeRS232	    ; sí, hay
        movwf    dato_serie         ; Recupera el contenido de la tecla pulsada.
    	xorlw    caracter_q         ; ¿Es el caracter Q? ENCENDIDO
    	btfsc    STATUS,Z
    	bsf      PORTE,2	    ;LED_9              ; Si,

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_w         ; ¿Es el caracter W? APAGADO
        btfsc	 STATUS,Z
        bcf      PORTE,2	    ;LED_9              ; Sí,
        bcf      0x54,0

        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_p         ; ¿Es el caracter P? PARPADEA
        btfsc	 STATUS,Z
        bsf      0x54,0             ; Sí,
	retfie
        ;call     fla                ; FLASH
        ;call     muer               ; MUERTO
        ;goto     inicio

;***********************************************************************************
; FIN CHEQUEA PUERTOS
;***********************************************************************************
;***********************************************************************************
; RUTINA FLASH Y MUERTO
;***********************************************************************************
fla
        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_f         ; ¿Es el caracter F? FLASH
        btfsc	 STATUS,Z
        goto	 FLASH              ; Sí,
        return

muer
        movf	 dato_serie,W	    ; Recupera el contenido de la tecla pulsada.
        xorlw	 caracter_x         ; ¿Es el caracter X? MUERTO
        btfsc	 STATUS,Z
        goto     MUERTO             ; Sí,
        return
;******************************************************************************
;
;******************************************************************************



;***********************************************************************************
; ENVIA CARACTER SERIE - RS232 - A LA Placa Y ESPERA A QUE HAYA SALIDO
;***********************************************************************************
enviaRS232
        movwf  TXREG            ; envío el dato en acunulador w
        bsf    STATUS,RP0	; Pág 1 RAM
Espere 	btfss  TXSTA,TRMT       ; transmision completa si es alto
       	goto   Espere
       	bcf    STATUS,RP0       ; Pág 0 RAM
       	return
;***********************************************************************************
; RECIBE CARACTER SERIE - RS232 - DESDE LA PC
;***********************************************************************************

recibeRS232
        movf    RCREG,W            ; guarda dato recibido en acumulador
        return
;**********************************************************************************
;TEMPORIZADOR 1S
;**********************************************************************************
DEMORA  movlw     .14       ; 1 set numero de repeticion  (C)
        movwf     PDel0     ; 1 |
PLoop0  movlw     .72       ; 1 set numero de repeticion  (B)
        movwf     PDel1     ; 1 |
PLoop1  movlw     .247      ; 1 set numero de repeticion  (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        decfsz    PDel2,1   ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,1   ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
        decfsz    PDel0,1   ; 1 + (1) es el tiempo 0  ? (C)
        goto      PLoop0    ; 2 no, loop
PDelL1  goto      PDelL2    ; 2 ciclos delay
PDelL2  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
;-------------------------------------------------------------
;  600 milisegundos
;-------------------------------------------------------------
DEMORA_6  movlw     .37       ; 1 set numero de repeticion  (C)
          movwf     PDel0W    ; 1 |
PLoop0W   movlw     .21       ; 1 set numero de repeticion  (B)
          movwf     PDel1W    ; 1 |
PLoop1W   movlw     .192      ; 1 set numero de repeticion  (A)
          movwf     PDel2W    ; 1 |
PLoop2W   clrwdt
          decfsz    PDel2W,1  ; 1 + (1) es el tiempo 0  ? (A)
          goto      PLoop2W   ; 2 no, loop
	  decfsz    PDel1W,1  ; 1 + (1) es el tiempo 0  ? (B)
          goto      PLoop1W   ; 2 no, loop
	  decfsz    PDel0W,1  ; 1 + (1) es el tiempo 0  ? (C)
          goto      PLoop0W   ; 2 no, loop
PDelL1W   goto      PDelL2W        ; 2 ciclos delay
PDelL2W   clrwdt              ; 1 ciclo delay
          return              ; 2+2 Fin.
;===========================================================================
; 10 milisegundos
;===========================================================================
DEMORA3  movlw     .8         ; 1 set numero de repeticion  (B)
         movwf     PDel03     ; 1 |
PLoop13  movlw     .249       ; 1 set numero de repeticion  (A)
         movwf     PDel13     ; 1 |
PLoop23  clrwdt               ; 1 clear watchdog
         clrwdt               ; 1 ciclo delay
         decfsz    PDel13,1   ; 1 + (1) es el tiempo 0  ? (A)
         goto      PLoop23    ; 2 no, loop
         decfsz    PDel03,1   ; 1 + (1) es el tiempo 0  ? (B)
         goto      PLoop13    ; 2 no, loop
PDelL13  goto      PDelL23    ; 2 ciclos delay
PDelL23  clrwdt               ; 1 ciclo delay
         return               ; 2+2 Fin.

;-------------------------------------------------------------
; TEMPORIZADOR 100 MS
;-------------------------------------------------------------
DEMORA1  movlw     .110       ; 1 set numero de repeticion  (B)
         movwf     PDel0A     ; 1 |
PLoop1A  movlw     .181       ; 1 set numero de repeticion  (A)
         movwf     PDel1A     ; 1 |
PLoop2A  clrwdt               ; 1 clear watchdog
         clrwdt               ; 1 ciclo delay
         decfsz    PDel1A,1   ; 1 + (1) es el tiempo 0  ? (A)
         goto      PLoop2A    ; 2 no, loop
         decfsz    PDel0A,1   ; 1 + (1) es el tiempo 0  ? (B)
         goto      PLoop1A    ; 2 no, loop
PDelL1A  goto      PDelL2A    ; 2 ciclos delay
PDelL2A  goto      PDelL3A    ; 2 ciclos delay
PDelL3A  clrwdt               ; 1 ciclo delay
         return               ; 2+2 Fin.

    END
03/09/2016 #17

Avatar de Saint_

hola kapotik, ten en cuenta que en los puertos A y E del pic 16f877A se encentran las entradas analógicas y que para que se comporten como I/O digitales tienes que configurar los registros CMCON y ADCON1.
Por otro lado a pesar que cuando se esta en el bank1 y da lo mismo colocar PORTX o TRISX para definir si los puertos sean de entrada o salida seria mejor que se usen los nombres de los registros.
CMCON=0x07; desactiva el comparador analógico
ADCON1=0x07;configura las entradas analógicas como I/O digitales.

Aunque no influya, seria mejor que:
LIST P=16F877->LIST P=16F877A
03/09/2016 #18
Moderador

Avatar de D@rkbytes

kapotik dijo: Ver Mensaje
Los puertos B, C y D funcionan perfecto, hacen todo lo que quiero, que era encender, apagar o parpadear, los únicos puertos que no andan son el A y el E.
A ver, si le digo que encienda PORTA,0 lo hace, pero cuando le digo que encienda PORTA,1 lo hace pero apaga el anterior.
Eso tiene que ser debido a lo que te menciona Saint_ sobre la configuración de los puertos con conversores de análogo a digital.
Sobre el registro CMCON en el PIC16F877A, no hay que preocuparse por los puertos con función de análogo o digital en E/S, ya que su estado por defecto en el POR (Power On Reset), es con los comparadores inactivos.
O sea: CMCON = 0b00000111 (<CM2:CM0> = 1)

Ésta sería una configuración recomendada:
Código PHP:
configuracion
    errorlevel    
-302        Suprimir advertencias de selección de bancos.
    
bsf        STATUS,RP0        Ir al banco 1
    bcf        STATUS
,RP1
    movlw    0x06            
Conversores AD Off
    movwf    ADCON1
    movlw    0x00
    clrf    TRISA            
Todo el puerto A como salidas. (RA4 es drenador abierto)
    
clrf    TRISB            Todo el puerto B como salidas.
    
movlw    b'10000000'        RC7 (RXcomo entradalos demás como salidas.
    
movwf    TRISC
    clrf    TRISD            
Todo el puerto D como salidas.
    
clrf    TRISE            Todo el puerto E como salidas.
;*************************************************************************************************************
Configuración para la comunicación RS-232 y otras definiciones para el EUSART
;*************************************************************************************************************
Baud Rate 9600sin paridad y 1 bit de parada
    movlw   0x19            
9600 Bps 4 MHz.
    
movwf   SPBRG
    movlw   
b'00100100'        Habilita la transmisión Asíncrona
    movwf   TXSTA
    bsf     PIE1
,RCIE        Habilita interrupción en la recepción
    bcf     STATUS
,RP0        Ir al Banco 0
    movlw   
b'10010000'        Habilita de recepción Asíncrona
    movwf   RCSTA

    bsf     INTCON
,PEIE        Activa interrupción de periféricos
    bsf     INTCON
,GIE        Activa interrupciones globales

    clrf    PORTA
    clrf    PORTB
    clrf    PORTC
    clrf    TRISD
    clrf    TRISE
    errorlevel    
+302        Reactivar advertencias de selección de bancos
Ten en cuenta lo siguiente, ya que es importante:
En esta parte de código se debe entrar en un bucle y no salir hasta que ocurra una nueva interrupción:
Código PHP:
loopi   btfss      PIR1,RCIF          ; (5se fija si hay dato RS232
        
goto      loopi              nono llegó 
Como usaste partes de un ejemplo que subí al Foro en el tema; Interfaz RS232 PIC PC (Proyecto Completo VB6)
En el ejemplo de la carpeta "ASM" no se usó la interrupción por recepción RS-232.
Por eso se hace uso del estado del bit RCIF, pero ese bit se limpia automáticamente cuando se lee el búfer de recepción, que es lo que se hace para determinar recepción por poleo.
Así que como llegas a la rutina "pic_1" después de leer el buffer en la interrupción, el bit RCIF ya se encontrará en 0.
Ésto lo repites en otras partes del programa y debes omitirlo para evitar el bucle.
kapotik dijo: Ver Mensaje
Ahora, no creo que no se pueda encender y apagar a discreción, yo no soy un programador experto en PIC pero si un viejo usuario y es la primera vez que no puedo manipular las salidas a mi antojo, por lo que sospecho que tal vez el problema esté en la configuración de los puertos.
Cuando compilo el código, el MPLAP me tira varios WARNING sobre configuraciones fuera de los bancos:
Sobre eso no te preocupes mientras configures los registros dentro de los bancos correctos.
Puedes omitir esos mensajes usando la siguiente declaración:
errorlevel -302
Ésta declaración se puede escribir en la cabecera del programa o en otros segmentos del programa.
Posteriormente es recomendable activar nuevamente las advertencias, así cómo en código de configuración expuesto arriba.

También debes tener en cuenta que el pin RA4 es con drenador abierto y por lo tanto no podrás obtener un 1 lógico así como lo estás haciendo para encender un LED.
04/09/2016 #19

Avatar de kapotik

solucionado!
gracias señores tenían razón, el problema estaba con la configuración del análogo/digital.

D@rkbytes use la configuración que me propusiste y salio andando a la primera, gracias, con respecto a lo que mencionas del bucle en PIR1,RCIF, aunque me funciona, pienso que tenes razón y lo voy a modificar.
Lo del errorlevel no lo sabia, eso es lo bueno de esto uno nunca deja de aprender.ejejeje!

Ahora quisiera saber si de alguna manera se puede guardar el estado de los pines de los puertos, apagarlos todos un tiempo determinado y luego leer lo que se guardo y ponerlo de nuevo en los puertos?.

Para que se entienda mejor guardar que pines están prendidos y cuales apagados y cuales parpadeando, apagar todo y luego volver todo a como estaba.

saludos
04/09/2016 #20
Moderador

Avatar de D@rkbytes

kapotik dijo: Ver Mensaje
Con respecto a lo que mencionas del bucle en PIR1,RCIF, aunque me funciona, pienso que tenés razón y lo voy a modificar.
Mira, eso que te mencioné está en la hoja de datos.
La sección 10.2.2 de la hoja de datos dijo:
The heart of the receiver is the Receive (Serial) Shift Register (RSR).
After sampling the Stop bit, the
received data in the RSR is transferred to the RCREG register (if it is empty).
If the transfer is complete, flag
bit, RCIF (PIR1<5>), is set.
The actual interrupt can be
enabled/disabled by setting/clearing enable bit, RCIE (PIE1<5>).
Flag bit RCIF is a read-only bit which is
cleared by the hardware.
It is cleared when the RCREG
register has been read and is empty.

kapotik dijo: Ver Mensaje
Lo del errorlevel no lo sabía, eso es lo bueno de esto, uno nunca deja de aprender. Jejeje!
Cada advertencia tiene un número, y si no es relevante se puede ignorar de la misma forma.
kapotik dijo: Ver Mensaje
Ahora quisiera saber si de alguna manera se puede guardar el estado de los pines de los puertos, apagarlos todos un tiempo determinado y luego leer lo que se guardo y ponerlo de nuevo en los puertos.
Puedes guardar el estado de los puertos en variables de uso temporal, y si requieres esos valores para otra ocasión, puedes guardarlos en la EEPROM interna.
kapotik dijo: Ver Mensaje
Para que se entienda mejor, guardar que pines están prendidos, cuales apagados y cuales parpadeando, apagar todo y luego volver todo a como estaba.
Esto lo puedes verificar como eventos, usando banderas de estado que también debes almacenar para su posterior lectura.
¿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.