TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: LABmouse en 18 de Abril de 2007, 20:53:03

Título: PIC16F877A Y TMR1 con oscilador Externo
Publicado por: LABmouse en 18 de Abril de 2007, 20:53:03
Hola amigos, es la primera vez que trabajare con el TMR1 con un Oscilador Externo, es por ello que les pido consejos, sugerencias, y pues comentarios sobre sus experiencias sobre esta forma de trabajar con TMR1.
Algun Link con esto bien explicado tambien estaria agradecido.

Para empezar este es el codigo de la configuracion en CCS.

Código: [Seleccionar]
setup_timer_1 (T1_EXTERNAL|T1_CLK_OUT|T1_DIV_BY_1);
enable_interrupts(INT_TIMER1);
enable_interrupts(global);

Este es el esquematico de como esta conectado el oscilador.

(http://img49.imageshack.us/img49/4160/esquematicohz1.gif)


Activa la interrupcion y dentro de la interrupcion tengo esto.

Código: [Seleccionar]
#INT_TIMER1
void reloj(void){
output_toggle(pin_a1);
}

Deberia parpadear el Led pero no lo hace. :? 
A donde quiero llegar es a generar una interrupcion cada segundo.

Estoy en busqueda de donde esta mi error.
Título: Re: PIC16F877A Y TMR1 con oscilador Externo
Publicado por: LABmouse en 19 de Abril de 2007, 12:03:56
bueno Un dia despues de postear, no encuentro el error. Mirando todos los ejemplos del Foro, deberia trabajar. pero no se por que.  :?  Sera CCS el problema??
Título: Re: PIC16F877A Y TMR1 con oscilador Externo
Publicado por: maunix en 19 de Abril de 2007, 13:33:08
¿Puedes postear como te quedó el T1CON luego de hacer esa configuración?  esto lo puedes hacer o bien con el simulador o bien sacándolo por la usart a un hyperterminal por ejemplo.

Respecto a los capacitores, el datasheet sugiere 33pF para esa frecuencia, no creo que sea de gran cuidado ese dato pero tal vez ahí tengas otra posible causa.




Título: Re: PIC16F877A Y TMR1 con oscilador Externo
Publicado por: LABmouse en 19 de Abril de 2007, 13:34:07
Listo maunix, en ya hago las pruebas que me dices.

Gracias!
Título: Re: PIC16F877A Y TMR1 con oscilador Externo
Publicado por: LABmouse en 19 de Abril de 2007, 16:22:38
 :( Bueno segui los pasos para imprimir por puerto Serial y ver el valor del TMR1.

La forma como lo hago es la siguiente:

Configuracion de TMR:
Código: [Seleccionar]
setup_timer_1 (T1_EXTERNAL|T1_DIV_BY_8|T1_CLK_OUT);
SET_TIMER1(0);
enable_interrupts(INT_TIMER1);
enable_interrupts(global);

Un loop eterno con:

Código: [Seleccionar]
while(1){
   value=get_timer1();
   printf("%lu\r\n",value);
}

el resultado por el puerto serial es siempre cero (0), el TMR1 no se incrementa.

Y me quedo esperando la interrupcion. :(
Título: Re: PIC16F877A Y TMR1 con oscilador Externo
Publicado por: LABmouse en 19 de Abril de 2007, 17:16:44
La novedad es que coloco un generador de onda cuadrada en el pin C1 y si incremente el TMR1, pero yo necesito que trabaje con el cristal de 32768 sera que proteus no simula el cristal?? :?
Título: Re: PIC16F877A Y TMR1 con oscilador Externo
Publicado por: maunix en 19 de Abril de 2007, 19:30:02
Yo te pedía que pongas el valor de T1CON, no de TMR1.

La novedad es que coloco un generador de onda cuadrada en el pin C1 y si incremente el TMR1, pero yo necesito que trabaje con el cristal de 32768 sera que proteus no simula el cristal?? :?

La verdad no lo sé, pensé que probabas con un hardware... es posible que el proteus simule el cristal pero no el circuito oscilador interno del pic.  Prueba hacer un "oscilador" externo y así te debiera funcionar..

saludos



Título: Re: PIC16F877A Y TMR1 con oscilador Externo
Publicado por: LABmouse en 22 de Abril de 2007, 10:13:21
Amigo maunix, despues de seguir tu consejo para ver el T1CON, efectivamente puedo ver que despues de la configuracion, T1CON toma el valor de 0x01.

Segun el datasheet, despues de la configuracion que le doy en el programa, T1CON debe tomar otros valores.

(http://img408.imageshack.us/img408/9567/osciladorsq5.gif)
Título: Re: PIC16F877A Y TMR1 con oscilador Externo
Publicado por: maunix en 22 de Abril de 2007, 11:17:18
Bien, ahí tienes algo para corregir entonces.  El problema pudiera estar en la función del CCS (en su código) o bien en que tu no le pasas los parámetros que espera se le pasen.

Por supuesto siempre tienes la opción de hacer T1CON = value;
Título: Re: PIC16F877A Y TMR1 con oscilador Externo
Publicado por: LABmouse en 22 de Abril de 2007, 14:56:59
Código: [Seleccionar]
#asm
BSF   0XFCD,0
BSF   0XFCD,1
BCF   0XFCD,2
BSF   0XFCD,3
BCF   0XFCD,4
BCF   0XFCD,5
BSF   0XFCD,7

MOVF  0XFCD,W
MOVWF temporal2
#endasm

printf ( "\r\n\r\nT1CON=0x%2x\r\n\r\n",temporal2);

Bueno pues no se que hacer!!! No se si el problema soy yo o es que el CCS ya me esta dando guerra tambien  :x 

Despues de hacer lo que esta en el programa anterior, colocar los bits como deben ser para que funciones, imprimo por el puerto serial y obtengo que T!CON es 0  :?

Ahora si toy pero loco.

Segun CCS las unicas funciones que tengo disponibles para TMR1 son:

/////////////////////////// Timer 1
// Timer 1 Functions: SETUP_TIMER_1, GET_TIMER1, SET_TIMER1
// Constants used for SETUP_TIMER_1() are:
//      (or (via |) together constants from each group)
#define T1_DISABLED         0
#define T1_INTERNAL         0x85
#define T1_EXTERNAL         0x87
#define T1_EXTERNAL_SYNC    0x83

#define T1_CLK_OUT          8

#define T1_DIV_BY_1         0
#define T1_DIV_BY_2         0x10
#define T1_DIV_BY_4         0x20
#define T1_DIV_BY_8         0x30

Título: Re: PIC16F877A Y TMR1 con oscilador Externo
Publicado por: maunix en 22 de Abril de 2007, 15:15:35
Probá hacer T1CON = algo; que tu sepas que es correcto y luego imprimelo por la usart.

Si aún asi no anda, entonces lo que no anda bien es la rutina que te saca el dato por la usart ;)
Título: Re: PIC16F877A Y TMR1 con oscilador Externo
Publicado por: LABmouse en 22 de Abril de 2007, 19:51:33
Hola amigo maunix, bueno no se si hay otra forma, pero no se puede hacer T1CON=xxx, directamente,  para poder hacer algo parecido hago esto:

Definir T1CON
Código: [Seleccionar]
#byte   T1CONFIG = 0xfcd
Ahora manipulo los bits de T1CON en asm, ya que en C parece no hace lo que debe CCS.
Código: [Seleccionar]
#asm
BSF   0XFCD,0
BSF   0XFCD,1
BCF   0XFCD,2
BSF   0XFCD,3
BCF   0XFCD,4
BCF   0XFCD,5
BSF   0XFCD,7
#endasm


Luego hago lo siguiente para verlo en el puerto RS232.
Código: [Seleccionar]
temporal2=T1CONFIG;
printf ( "\T1CON=0x%2x",temporal2);

Y obtengo por el puerto serial 0x00  :?

Ya te estoy entendiendo maunix tu posicion respecto a C18. Este CCS me esta sacando de casillas. El problema es que ya esta casi terminado, solo falta esta parte para terminar y listo.

Saludos!

Título: Re: PIC16F877A Y TMR1 con oscilador Externo
Publicado por: maunix en 23 de Abril de 2007, 07:42:26
Hola amigo maunix, bueno no se si hay otra forma, pero no se puede hacer T1CON=xxx, directamente, 

¿Porqué no se puede? Estas completamente seguro? me parece muy extraño.


Ya te estoy entendiendo maunix tu posicion respecto a C18. Este CCS me esta sacando de casillas.

Si, yo tuve que lidiar con comportamientos que se iban de toda lógica y por eso me moví al C18.  De todas formas siempre aducí que "probablemente era yo el que no lo sabía usar bien al ccs", la cuestión es que ser tan desviado del estandar ANSI me produjo también otros dolores de cabeza.

Título: Re: PIC16F877A Y TMR1 con oscilador Externo
Publicado por: LABmouse en 23 de Abril de 2007, 10:22:45
maunix, directamente utilizar T1CON no se puede (eso creo), por eso hay que definir con anterioridad quien es T1CON usando:

#byte T1CONFIG =  0xFCD

Me tocara fabricar el PCB y trabajar con algo real, y definir quien es el problema.

Aunque lo que no entiendo es por que si manipulo directamente los bits del registro T1CON, por que al imprimirlos por el puerto RS232 me da 0x00  :?

Gracias Maunix por tu ayuda.


Título: Re: PIC16F877A Y TMR1 con oscilador Externo
Publicado por: maunix en 23 de Abril de 2007, 11:20:11
T1CON es un registro de tu micro, no veo porque no podrías acceder a él...

Ese es mi punto.
Título: Re: PIC16F877A Y TMR1 con oscilador Externo
Publicado por: LABmouse en 23 de Abril de 2007, 13:44:07
Munix depronto yo no sea claro, no es que no se pueda, si se puede, pero el punto al que yo queria llegar era que en CCS no esta la opcion de decir T1CON=xxxx, debido a que no esta disponible una libreria que declare todos los registros internos del PIC, como CCS no es ANSI-C, solo se utilizan las funciones predefinidas y disponibles y dentro de esas no esta la de manipular directamente el registro T1CON, "supuestamente" el lo configura como sea necesario para que trabaje segun lo necesites, pero que va no lo esta haciendo.

Ahora! eso no quiere decir que no se pueda manipular de otra forma, y para eso lo que se hace es lo que comente anteriormente, definir al inicio del programa  T1CONFIG con #byte ..... pero no esta funcionando tampoco. Entonces la pregunta que me queda ahorita es:

Soy yo o es el Compilador el problema????

saludos!
Título: Re: PIC16F877A Y TMR1 con oscilador Externo
Publicado por: PalitroqueZ en 23 de Abril de 2007, 13:52:38
Picmouse pruebalo en el MPLAB, como está el registro T1CON, en caso de no comportarse como tu quieres ó no poder configurarlo desde el CCS, entonces tendras que hacerlo insertando un código en asm, y después vuelves a mirar en MPLAB hasta que se resuelva.

Título: Re: PIC16F877A Y TMR1 con oscilador Externo
Publicado por: LABmouse en 23 de Abril de 2007, 14:26:04
Perate amigo pedro, pues simulando paso a paso en proteus, veo algo que me pensar que yo tengo el problema por programa.

a pesar de que en asm manipulo el registro T1CON, como comente anteriormente, proteus no me muestras cambio alguno en es registro. Entonces como se hace en CCS para manipular T1CON??

Tambien encontre algo en proteus, pues coloque el osciloscopio en el pin T1OSO y la sorpresa es que no hay oscilacion. aunque si T1CON esta mal configurado, este nunca oscilara tampoco. 

Estoy en la pelea para ver es que es..
Título: Re: PIC16F877A Y TMR1 con oscilador Externo
Publicado por: maunix en 23 de Abril de 2007, 14:38:48
Soy yo o es el Compilador el problema????

Si tu haces 'todo' lo que el manual del CCS dice que hagas y aún así el T1CON no queda como debiera... el problema es el CCS.

Ahora bien, si el software en realidad funciona, es porque el CCS sí hace lo que debe (y esto lo puedes verificar en el asm generado).

Si el problema lo tienes con la salida de la usart entonces eso no implica que el T1CON esté mal seteado, solo que por alguna causa los datos salen mal por la usart con la función printf.

Título: Re: PIC16F877A Y TMR1 con oscilador Externo
Publicado por: PalitroqueZ en 23 de Abril de 2007, 15:57:03
Picmouse , en el otro post mencionaste que colocando un generador de señales, el programa simulaba bien, ¿es correcto?, si es así entonces el problema está en el oscilador con el cristal.

sigo pensando que debieras revisar bien el cambio de ese registro en otro simulador...

o te tocará probarlo en la realidad.