TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: MexaTronko en 02 de Junio de 2013, 20:43:58
-
Hola que tal espero que me puedan ayudar con un programa que estoy haciendo, estoy tratando de usar el timer0 para tener una onda cuadrada de 1msegundo con el 12f508 pero no obteng nada a la salida del RB0, este es el programa
#include <12F508.H>
#fuses INTRC, NOWDT, MCLR, PROTECT
#use delay( clock = 4000000 )
#use standard_io( B )
#byte port_B = 0x06
void main( void )
{
int Cont = 0; //Contador
setup_timer_0( RTCC_INTERNAL | RTCC_DIV_4 ); //Prescaler de 4.
set_timer0( 6 );
while( 1 )
{
while( get_timer0() >= 6 ) //Obtiene y compara el valor del timer0.
{
Cont++; //Incrementa el contador.
}
if( Cont <= 10 )
{
set_timer0( 6 ); //Carga el timer0 para 1mseg.
output_high( PIN_B0 );
}
if( 10 < Cont <= 20 )
{
set_timer0( 6 ); //Carga el timer0 para 1mseg.
output_low( PIN_B0 );
}
if( Cont > 20 )
{
Cont = 0;
}
}
}
no se si estoy utilizando de manera correcta el timer0,ya que este microcontrolador no se puede usar una interrupcion para este. espero que me puedan ayudar gracias.
-
Hola hise una modificacion y ya tengo una señal cuadrada en el RB0 pero yo kiero una de 10 msegundos, alguien me podria a ayudar para poder una señal de 10 msegundos. la modificacion es la siguiente, no se si el error esta a la hora de obtener el valor del timer o cuando se incrementa el contador. gracias
while( 1 )
{
if( Cont <= 6 )
{
set_timer0( 6 ); //Carga el timer0 para 1mseg.
while( get_timer0() >= 6 ) //Obtiene y compara el valor del timer0.
{
Cont++; //Incrementa el contador.
output_high( PIN_B0 );
}
}
if( 6 < Cont <= 12 )
{
set_timer0( 6 );
while( get_timer0() >= 6 ) //Obtiene y compara el valor del timer0.
{
Cont++; //Incrementa el contador.
output_low( PIN_B0 );
}
}
if( Cont > 20 )
{
Cont = 0;
}
}
}
-
Hola mexatronko en tu configuración de Timer lo que haces al cargar un 6 set_timer0(6); es que si usas el timer0 por la interrupción de su desbordamiento el tiempo que tarda desde que haces la carga hasta que pasa de 255 a 0 es de 1ms, si tu pones el div por 64 RTCC_DIV_64 i pones una carga de set_timer(99) tendrás la interrupción cada 10.048ms. Te recomiendo que empieces por algo mas básico y leer el funcionamiento del timer aquí en el foro hay mucha información sobre eso.
Saludos :-/
-
pero no puedo hacer un retardo de 1omseg repitiendo 10 veces un retardo de 1mseg eso es lo que queria hacer, por eso puse el contador para las veces que se repitiera elretardo de 1mseg estoy mal. la forma en que configuro el timer es incorrecta?.gracias por sus comentarios
-
Necesitas meter el contador dentro de la rutina de interrupción por timer0 cargar el valor que manejas y cuando el contador sea igual a 10 entonces si, tienes que habilitar la interrupción y poner la rutina.
-
Lee un poco sobre el funcionamiento del timer por aquí en el foro hay bastante información para que te sea mas fácil.
-
pero el 12f508 no tiene interrupciones si asi fuera podria generar un retardo con ela, es por eso ke obtengo el valor del timer con get_timer0() y si este menor o igual al contador pondria en estado 1 un pin y asi se haria el retardo, o lo ue estoy haciendo esta mal?
-
si ya te entendi
while( 1 )
{
output_high(PIN_B0); //pone en alto pin b0
while(Cont<10){ //hasta que el contador sea 10(1ms*10=10ms)
set_timer0( 6 ); //se carga el timer para 1ms
while(get_timer0()); //se espera aqui hasta que el timer valga 0 osea que se ha desbordado y ha pasado 1ms
Cont++;} //Cada ms se incrementa contador
Cont=0; //pasado los 10ms en alto pasamos el contador a 0
output_low(PIN_B0); //pone en bajo el pin b0
while(Cont<10){ //hara lo siguiente hasta que contador sea =10
set_timer0( 6 ); //se carga el timer para 1ms
while(get_timer0()); //se espera hasta que se desborde el timer0
Cont++;} //incrementamos el contador cada ms
Cont=0; //al finalizar los 10ms en bajo se pone a 0 el contador
}creo que a alg asi te refieres
Puedes intentar algo asi
-
Gracias gab163 es correcto lo que me has comentado, tengo otra pregunta para poder detener el timer0 solo bastaria con poner un pin b0 en cero?
-
No entiendo a lo que te refieres, quieres parar la señal cuadrada?
-
si, tengo pensado hacer con una opcion A sacar una onda cuadrada por RB0 con una opcin B detner la onda cuadrada
-
Si quieres dejar de mandar señal tienes que mantener el pin b0 en bajo siempre, esto lo puedes hacer donde pones en alto el pin b0 cambiarlo por una condicion algo asi:
SI(OpcionA){
PINB0 en alto
}
else{
PINB0 en bajo}
-
Muchas gracias por la ayuda se resolvio el problema