Autor Tema: Problema al volver de una llamada  (Leído 2318 veces)

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

Desconectado JOSERS

  • PIC10
  • *
  • Mensajes: 4
Problema al volver de una llamada
« en: 19 de Noviembre de 2010, 11:44:52 »
Hola! Estoy iniciándome en mis primeros programas en .asm, y estoy usando mplab v8.6 y proteus7.7 para simular.

Mi problema es que hago una llamada a una rutina de 1 segundo con TMR0 y al volver de esa llamada ya no se me cargan valores en el acumulador para cargarlos en el puerto D,que es la salida al display de 7 segmentos.Este es el código:


CONTADOR EQU 0X20
REGISTRO EQU 0X21
CONTADOR2 EQU 0X22
   ORG 0
   GOTO INICIO
   
   ORG 5


   LIST P=16f887
   include "P16F887.inc"


INICIO
      BSF STATUS,RP0      ;CONFIGURACION
      BSF STATUS,RP1
      CLRF ANSELH
      CLRF ANSEL
      BCF STATUS,RP1
      BSF TRISA,4
      BSF TRISC,0
      BSF TRISC,1
      BSF TRISE,2
      MOVLW B'00000000'
      MOVWF TRISD
      CLRF PORTD
      BCF STATUS,RP0     ;CONFIGURACION
      
      
T7
      MOVLW b'01100001'
      MOVWF PORTD  ;MUESTRA EL NUMERO 7 EN EL DISPLAY
      CALL RETARDO1 ;LLAMADA A LA RUTINA DE RETARDO1 DE 1 SEGUNDO
      
T6   
      MOVLW B'00111111'
      MOVWF PORTD
      CALL RETARDO1
   
T5
      
      MOVLW b'00111011'
      MOVWF PORTD
   
      CALL RETARDO2

   
T4
      
      MOVLW b'01011001'
      MOVWF PORTD

      CALL RETARDO2
   
T3

      MOVLW b'01101011'
      MOVWF PORTD
   
      CALL RETARDO2
   
T2
   
   
      MOVLW b'01101110'
      MOVWF PORTD
      
   
      CALL RETARDO2
   
T1
   
      MOVLW b'01000001'
      MOVWF PORTD
   
      CALL RETARDO2
T0
   
      MOVLW b'01110111'
      MOVWF PORTD
   
      CALL RETARDO2
      
      GOTO INICIO

RETARDO1
   

   BSF    STATUS,RP0

   BSF    STATUS,RP1

   MOVLW    b'00000111'

   MOVWF   OPTION_REG

   BCF    STATUS,RP0

AA

   BSF   PORTC,2

   MOVLW   d'20'

   MOVWF   CONTADOR

AQ
   BSF PORTC,2
   MOVLW    d'61'

   MOVWF    TMR0

AQU

   BTFSS   INTCON,T0IF

   goto   AQU

   BCF   INTCON,T0IF
   BCF PORTC,2
   DECFSZ   CONTADOR,F

   goto   AQ
   BCF STATUS,RP0
   RETURN


RETARDO2
   

   BSF    STATUS,RP0

   BSF    STATUS,RP1

   MOVLW    b'00000111'

   MOVWF   OPTION_REG

   BCF    STATUS,RP0

AA2



   MOVLW   D'20'

   MOVWF   CONTADOR2

AQ2
   BSF PORTC,2
   MOVLW    D'61'

   MOVWF    TMR0

AQU2

   BTFSS   INTCON,T0IF

   B   AQU2
   BCF PORTC,2
   BCF   INTCON,T0IF

   DECFSZ   CONTADOR2,F
   B   AQ2

   RETURN
   
   end

al volver de la rutina RETARDO1 ya no me muestra 6 ni los números posteriores hasta el 0, se queda mostrando el 7 aunque el programa se sigue ejecutando hasta el final.

No sé donde puede estar el error.

Si alguien me pudiera ayudar se lo agradecería
« Última modificación: 19 de Noviembre de 2010, 12:49:57 por JOSERS »

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: Problema al volver de una llamada
« Respuesta #1 en: 19 de Noviembre de 2010, 12:36:30 »
Hola amigo josers: me gustaría ayudarte pero no entiendo tu programa, ¿que hace el mismo?, ¿Podrías comentar las líneas?, ¿En qué circuito trabaja?
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado JOSERS

  • PIC10
  • *
  • Mensajes: 4
Re: Problema al volver de una llamada
« Respuesta #2 en: 19 de Noviembre de 2010, 13:03:36 »
Hola Flacoclau! Esta es la parte de código de un programa y simplemente lo que muestra es un contador de 7 a 0 que muestra en un display, mostrando cada numero durante un segundo.Las etiquetas de T7....T0 es donde cargo el valor de los bits al PORTD que es el puerto de salida al display, y luego llamo a la rutina RETARDO1 para que muestre en el display los números durante 1seg. El problema es que me representa el 7 y al volver de RETARDO1 y pasar a T6 ejecuta las instrucciones pero no me carga el valor que le pongo en PORTD para que me muestre el 6 en el display.Se queda mostrando el 7 durante todo el programa y no se donde está el fallo.

He subido la placa para que la veas.

Si me pudieras ayudar te lo agradecería amigo.

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: Problema al volver de una llamada
« Respuesta #3 en: 19 de Noviembre de 2010, 22:33:24 »
Hola Josers: Ya estuve viendo tu código, el problema es que en la instrucción de retardo1 estás direccionando el banco 3 para el OPTION_REG, si bien en la hoja de datos figura implementado en el simulador no funciona, yo te lo dejé direccionando el banco 1, además debes configurar los fuses para desabilitar el WATCH DOG ya que se resetea el micro, esto último lo intenté pero no pude hacerlo, de nuevo no sé si es el simulador o estoy escribiendo algo mal, por eso puse la instrucción CLRWDT en cada retardo para poder simularlo.
Acá te dejo el código modificado, espero te sirva mi ayuda, saludos!!



Código: [Seleccionar]
      LIST    P=PIC16F887
      INCLUDE <P16F887.inc>


CONTADOR  EQU 0X20
REGISTRO  EQU 0X21
CONTADOR2 EQU 0X22

      ORG    0
      GOTO   INICIO

INICIO
      ORG    5
      BSF    STATUS,RP0   ;CONFIGURACION
      BSF    STATUS,RP1
      CLRF   ANSELH
      CLRF   ANSEL
      BCF    STATUS,RP1
      BSF    TRISA,4
      BSF    TRISC,0
      BSF    TRISC,1
      BSF    TRISE,2
      MOVLW  b'00000000'
      MOVWF  TRISD
      CLRF   PORTD
      BCF    STATUS,RP0   ;CONFIGURACION


T7
      MOVLW  b'01100001'
      MOVWF  PORTD        ;MUESTRA EL NUMERO 7 EN EL DISPLAY
      CALL   RETARDO1     ;LLAMADA A LA RUTINA DE RETARDO1 DE 1 SEGUNDO

T6
      MOVLW  b'00111111'
      MOVWF  PORTD
      CALL   RETARDO1

T5
      MOVLW  b'00111011'
      MOVWF  PORTD
      CALL   RETARDO2

T4
      MOVLW  b'01011001'
      MOVWF  PORTD
      CALL   RETARDO2

T3
      MOVLW  b'01101011'
      MOVWF  PORTD
      CALL   RETARDO2

T2
      MOVLW  b'01101110'
      MOVWF  PORTD
      CALL   RETARDO2

T1
      MOVLW  b'01000001'
      MOVWF  PORTD
      CALL   RETARDO2

T0
      MOVLW  b'01110111'
      MOVWF  PORTD
      CALL   RETARDO2
      GOTO   INICIO

RETARDO1
      BSF    STATUS,RP0
      MOVLW  b'00000111'
      MOVWF  OPTION_REG
      BCF    STATUS,RP0

AA
      BSF    PORTC,2
      MOVLW  d'20'
      MOVWF  CONTADOR

AQ
      BSF    PORTC,2
      MOVLW  d'61'
      MOVWF  TMR0
      CLRWDT

AQU
      BTFSS  INTCON,T0IF
      GOTO   AQU
      BCF    INTCON,T0IF
      BCF    PORTC,2
      DECFSZ CONTADOR,F
      GOTO   AQ
      BCF    STATUS,RP0
      RETURN


RETARDO2
      BSF    STATUS,RP0
      MOVLW  b'00000111'
      MOVWF  OPTION_REG
      BCF    STATUS,RP0

AA2
      MOVLW  D'20'
      MOVWF  CONTADOR2

AQ2
      BSF    PORTC,2
      MOVLW  D'61'
      MOVWF  TMR0
      CLRWDT

AQU2
      BTFSS  INTCON,T0IF
      GOTO   AQU2
      BCF    PORTC,2
      BCF    INTCON,T0IF
      DECFSZ CONTADOR2,F
      GOTO   AQ2
      RETURN

      END
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado JOSERS

  • PIC10
  • *
  • Mensajes: 4
Re: Problema al volver de una llamada
« Respuesta #4 en: 20 de Noviembre de 2010, 07:51:46 »
Gracias por tu ayuda flacoclau! no sabia que el proteus tenía esos problemas con los bancos, opté por hacer una rutina de retardo sin el TMR0 pero después de tu contestación lo volveré a cambiar.

Otra cosa...después de hacer una llamada a una rutina,la cual comprueba si un bit está a uno, si resulta que ese bit es 1, el programa se queda en una instrucción y se resetea. Tengo el WDT desactivado y no se porque se produce este reset, ya que el programa llama a esa rutina muchas veces y esto solo pasa en caso de darse que ese bit este a 1. No se si me he explicado muy bien.....

aqui es una de las partes donde llamo a la rutina CALL S4

      N9      
      MOVLW b'01111011'
      MOVWF PORTD
      SOLTAR_9
      BTFSC PORTC,0
      goto T9
      CALL S4

La rutina hace lo siguiente;
S4
   BTFSS PORTE,2
   RETURN
   GOTO INICIO
comprueba PORTE,2 que corresponde a un pulsador,y si está presionado se va a esta parte del programa y es donde hace el reset
      
      CLRF CONTADOR8
      CLRF CONTADOR9
      MOVLW b'00111011'
      MOVWF PORTD
AQUI
      BTFSS PORTA,4
      B AQUI
Q
      BTFSC PORTA,4
      B Q
      BTFSC PORTC,0
      B CUENTA2   
Se queda esperando en las 4 ultimas instrucciones y hace el reset, cuando en la instrucción btfsc porta,4 ese bit realmente esta a cero,ya que corresponde a un pulsador y no lo tengo presionado....se queda ejecutando B Q....


Saludos y gracias de nuevo!
« Última modificación: 20 de Noviembre de 2010, 07:57:15 por JOSERS »

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: Problema al volver de una llamada
« Respuesta #5 en: 20 de Noviembre de 2010, 21:34:11 »
Hola aparentemente está correcto, ¿has armado el circuito? ¿o es una simulación?
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado JOSERS

  • PIC10
  • *
  • Mensajes: 4
Re: Problema al volver de una llamada
« Respuesta #6 en: 21 de Noviembre de 2010, 07:27:22 »
Hola,es una simulación con Proteus, como es la primera vez que lo uso no se si suele dar fallos de estos,es normal? .Montaré el circuito y a ver que pasa!

Muchas gracias por tu ayuda.

Saludos.