TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: JOSERS 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
-
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?
-
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.
-
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!!
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
-
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!
-
Hola aparentemente está correcto, ¿has armado el circuito? ¿o es una simulación?
-
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.