ImagenImagenImagenImagen
Hazte Socio (El Foro siempre Gratis)
Paga con Tarjetas+ Info www.arde.cc/socios

Ayuda con el timer del pic16f690

Foro para postear los temas de ensamblador

Moderador: Junta Directiva

Responder
Avatar de Usuario
plapu
Principiante
Principiante
Mensajes: 31
Registrado: Dom Nov 09, 2008 10:58 pm

Ayuda con el timer del pic16f690

Mensaje por plapu » Mar Jun 23, 2009 10:55 am

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



FJ_Sanchez
Usuario Desarrollador
Usuario Desarrollador
Mensajes: 1082
Registrado: Mié Jun 07, 2006 11:09 pm
Nombre: Francisco Javier Sánchez
Ubicación: Vejer de la Frontera
Contactar:

Re: Ayuda con el timer del pic16f690

Mensaje por FJ_Sanchez » Mar Jun 23, 2009 12:05 pm

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

Hack your mind \\ F.J. Sánchez

Okupa tu mente. \\ _ _ _ _ _ _ _ _ _ _ _ _

Avatar de Usuario
plapu
Principiante
Principiante
Mensajes: 31
Registrado: Dom Nov 09, 2008 10:58 pm

Re: Ayuda con el timer del pic16f690

Mensaje por plapu » Mar Jun 23, 2009 12:18 pm

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?

Juanjo
Usuario Experto
Usuario Experto
Mensajes: 451
Registrado: Dom Dic 17, 2006 9:44 pm
Contactar:

Re: Ayuda con el timer del pic16f690

Mensaje por Juanjo » Mar Jun 23, 2009 12:26 pm

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.
Sytek

Juanjo
Usuario Experto
Usuario Experto
Mensajes: 451
Registrado: Dom Dic 17, 2006 9:44 pm
Contactar:

Re: Ayuda con el timer del pic16f690

Mensaje por Juanjo » Mar Jun 23, 2009 12:29 pm

¿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.
Última edición por Juanjo el Mar Jun 23, 2009 12:35 pm, editado 1 vez en total.
Sytek

Avatar de Usuario
plapu
Principiante
Principiante
Mensajes: 31
Registrado: Dom Nov 09, 2008 10:58 pm

Re: Ayuda con el timer del pic16f690

Mensaje por plapu » Mar Jun 23, 2009 12:32 pm

No la verdad jejej... me he puesto a hacer el codigo y no he tenido en cuenta la frecuencia. Me pensaba que utilitza el reloj interno del pc. A donde puedo configurar la frecuencia interna en el Mplab? Porque en el programa grabador PICKit2 Programmer he mirado todas las opciones y no encuentro nada.

Gracias!

Juanjo
Usuario Experto
Usuario Experto
Mensajes: 451
Registrado: Dom Dic 17, 2006 9:44 pm
Contactar:

Re: Ayuda con el timer del pic16f690

Mensaje por Juanjo » Mar Jun 23, 2009 12:42 pm

Para la configuración del PIC, creo que además hay que tocar un registro para asignar la frecuancia, pero con esto te funcionará. Esto es por código, estos flags los puedes ocnfigurar en el MPLAB también.


list p=16f690 ; list directive to define processor
#include <P16F690.inc> ; processor specific variable definitions

__CONFIG _CP_ON & _CPD_OFF & _BOR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_ON & _FCMEN_OFF & _IESO_OFF


Para la subrutina de interrupción:

ORG 0x005 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,w ; move pclath register into W register
movwf pclath_temp ; save off contents of PCLATH register

;;;;; Tu codigo


movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
Sytek

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado