Hola compañeros. Empecé con este tema de los PIC hace una semana siguiendo los temas de este foro pero me trabé cuando llegué a la parte de temporizadores.
No sé sinceramente si estoy entendiendo mal el concepto o simplemente le estoy errando en la programación, es por ello que les pido una mano.
Tengo un PIC18F4550 con cristal de 20 Mhz y la intención es hacer un cronometro, pero para hacer pruebas de tiempo empecé simplemente encendiendo y apagando un led cada 1 segundo.
Para esto utilizo el TIMER0 del PIC configurado como 16 bits y con preescaler de 256. Los calculos que hice son:
1s = 4 . (1/20MHz) . (65536 - TMR0) . 256
TMR0 = 65536 - 19531.25 -----------> TMR0 = 46005
Cosas a tener en cuenta: para simular use proteus tarda unos 4 segundos en prender y apagar el led.
Hace lo que tiene que hacer pero tarda 4 segundos en vez de 1.
Monté el circuito en una protoboard y, si bien funciona, lo hace aún más lento que en proteus; aproximadamente unos 8 segundos para cambiar de estado el led.
El código en C para CCS es:
Desde ya, les agradezco mucho su ayuda.
No sé por qué sale todo tachado. Pido disculpas por eso.
No sé sinceramente si estoy entendiendo mal el concepto o simplemente le estoy errando en la programación, es por ello que les pido una mano.
Tengo un PIC18F4550 con cristal de 20 Mhz y la intención es hacer un cronometro, pero para hacer pruebas de tiempo empecé simplemente encendiendo y apagando un led cada 1 segundo.
Para esto utilizo el TIMER0 del PIC configurado como 16 bits y con preescaler de 256. Los calculos que hice son:
1s = 4 . (1/20MHz) . (65536 - TMR0) . 256
TMR0 = 65536 - 19531.25 -----------> TMR0 = 46005
Cosas a tener en cuenta: para simular use proteus tarda unos 4 segundos en prender y apagar el led.
Hace lo que tiene que hacer pero tarda 4 segundos en vez de 1.
Monté el circuito en una protoboard y, si bien funciona, lo hace aún más lento que en proteus; aproximadamente unos 8 segundos para cambiar de estado el led.
El código en C para CCS es:
C:
#include <18f4550.h> ////
#fuses hs,nowdt,nowrt,noprotect,noput,nolvp //// ///DIRECTIVAS///
#use delay(clock=20000000) ////
int segundo=0; //// ///DECLARACIÓN DE VARIABLES///
#int_Timer0
void interrupcion_timer0(void)
{
segundo++; //Cada 1 segundo llama a la interrupcion y aumenta 1 segundo
set_timer0(46005);
}
void main()
{
set_tris_d(0x00);
SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_256); //Configuro timer0
set_timer0(46005); //Valor inicial del timer0
enable_interrupts(global);
enable_interrupts(int_Timer0);
while(TRUE)
{
if(segundo==1){output_d(0b00000100);} //Segun el valor de segundo, prende o apaga el led
if(segundo==2){output_d(0b00000000);}
if(segundo==3){output_d(0b00000100);}
if(segundo==4){output_d(0b00000000);}
if(segundo==5){output_d(0b00000100);}
if(segundo==6){output_d(0b00000000);}
if(segundo==7){output_d(0b00000100);}
}
}
Desde ya, les agradezco mucho su ayuda.
No sé por qué sale todo tachado. Pido disculpas por eso.