fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Ayuda con el timer ...
 
Avisos
Vaciar todo

Ayuda con el timer del pic16f690

7 Respuestas
3 Usuarios
0 Reactions
7,437 Visitas
plapu
Respuestas: 80
Topic starter
(@plapu)
Trusted Member
Registrado: hace 16 años

Hola me he comprado recientemente el programador pickit2 y estoy haciendo mis primeros programas para luego ponerme a hacer cosas con servos. El siguiente programa lo que intenta hacer es que pasado 20 ciclos de reloj se apague el bit 0 del puerto c y se active el 1. Llevo un buen rato mirandome la rutina del programa y no se donde esta el error. A ver si me ayudais!
#include <p16F690.inc>

VAR EQU 0x24 ;Variable

ORG 00H ;Vector de reset
GOTO INICIO
ORG 04H ;Vector de interrupción
GOTO INTERRUPCION

INTERRUPCION:

BTFSS PIR1,TMR1IF ; Comprovamos si la interrupción viene de timer1.Si PIR1
;es 0 se executa la siguiente instrucción. Si es 1
;no se executa l'instrucció.
GOTO LOOP

BCF STATUS,RP1
BCF STATUS,RP0

INCF VAR ;Incrementamos el valor de la variable.

INICIO:

BCF STATUS,RP1
BSF STATUS,RP0
MOVLW b'00000000' ;Configuración de los puertos entrada / salida de PORTB
; 1= Entrada
; 0= Salida
MOVWF TRISC

BCF STATUS,RP1
BCF STATUS,RP0

BSF PORTC,0
;***********************Configuración del timmer1***************************
BCF STATUS,RP1
BSF STATUS,RP0

;ACTIVAMOS MASCASCARAS
BSF PIE1,TMR1IE
BSF INTCON,PEIE
BSF INTCON,GIE

;CONFIGURAMOS EL TIMER
BCF STATUS,RP0

BSF T1CON,T1GINV
BCF T1CON,6 ;TMRGE1

BCF T1CON,T1CKPS1
BCF T1CON,T1CKPS0

BCF T1CON,T1OSCEN

BCF T1CON,1 ;TMRCS
BSF T1CON,0 ;TM1RON

LOOP:

;***********CODIGO PER VAR=20*****************************************
MOVFW VAR
XORLW d'20'

BTFSC STATUS,Z
CLRF VAR

BTFSC STATUS,Z
BCF PORTC,0

BTFSC STATUS,Z
BSF PORTC,1

GOTO LOOP
END

Responder
6 respuestas
fj_sanchez
Respuestas: 1083
(@fj_sanchez)
Ardero
Registrado: hace 19 años

¿Pero qué le pasa al código? No se si es que no te compila o que no ves los resultados que esperas.

Responder
plapu
Respuestas: 80
Topic starter
(@plapu)
Trusted Member
Registrado: hace 16 años

Al grabarlo en el pic y probarlo en el circuito de desarollo del pickit no se encienden los leds correspondientes. Creo que el codigo interrupcion no se llega a ejecutar ya que siempre tengo el led encendido correspondiente al puerto C C0 y no me canvia al C1. Le tengo que meter un oscilador de cristal externo?

Responder
juanjo
Respuestas: 451
(@juanjo)
Ardero
Registrado: hace 18 años

Has comprobado que se graba correctamen el programa. No se cual es el estado por defecto de los pines, pero podría ser "1". Si bloqueas el reset este pin se apaga. Si no usa otro pin para saber cuando el programa se está ejecutando.

Si todo esto está ok, y no tienes debugueador puedes usar pines de salida con leds para saber cuando pasa por un zona del códog en concreto o si alguna variable tiene el valor que esperas. Esto te puede ayudar a encontrar el problema.

NO te hace falta ningún oscilador externo siepre que la frecuencia sea menor o igual de 8 MHz. ¿Has comprobado si has activado correctametne el relog interno y la frecuencia?

Saludos.

Responder
juanjo
Respuestas: 451
(@juanjo)
Ardero
Registrado: hace 18 años

¿Donde tienes el RETI? ¿No guardas el acumlador ni la palabra de estado cuando procesas la interrupción?

Recuerda que para acceder correctamente a ciertos registros debes tener correctamente asignado el banco de memoria.

Mejor será que quites el GOTO de la subrutina de interrupción. La subrutina de interrupción se ejecuta de forma paralela al código del programa principal, por lo tanto no tiene que tener entrada ni salida en este ni viceversa, es el micro el que se encarga de ordenar la ejecución de la subrutina de interrupción y tu con la instrucción RETI el que decides cuando se acaba. Las subrutinas de interrupción deben de llevar el mínimo número de líneas de código posible.

Revisalo todo a fondo por que tienes errores graves.

Saludos.

Responder
Página 1 / 2
Compartir: