TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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.
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.
#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.
-
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??
-
¿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.
-
Listo maunix, en ya hago las pruebas que me dices.
Gracias!
-
:( 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:
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:
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. :(
-
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?? :?
-
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
-
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)
-
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;
-
#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
-
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 ;)
-
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
#byte T1CONFIG = 0xfcd
Ahora manipulo los bits de T1CON en asm, ya que en C parece no hace lo que debe CCS.
#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.
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!
-
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.
-
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.
-
T1CON es un registro de tu micro, no veo porque no podrías acceder a él...
Ese es mi punto.
-
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!
-
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.
-
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..
-
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.
-
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.