me conmueve tu honestidad y tu lucha por conocimiento
te explicare:
el sistema Multitarea consiste en hacer una base de tiempo, esta base de tiempo parte de una unidad fija de reloj.
digamos 50us
obteniendo esta base de reloj podemos sacar muchos multiplos de este reloj, puede ser mas pequeño
todo depende de los ticks del CPU
ejemplo
1 tick= 1/(fosc/4)
digamos que tenemos un cristal de 20Mhz
1 tick estaria dado en 20/4= 5Mhz ahora 1/5Mhz
nos daria 0.2us como un tick
que significa que cada instruccion se ejecutaria a 0.2us asi que esa seria nuestra frecuencia limite para hacer un timer o base de tiempo.
pero por comodidad haremos un ejemplo con un
timer de 1ms
en el CCS tenemos la estructura del timer de la siguiente manera:
Código:
#INT_TIMER0
void TIMER0_isr(void)
{
//codigo
}
esta estructura nos permite hacer un desbordamiento de timer con la cual podemos hacer nuestra base de tiempo
hay calculadoras para hacer un calculo rapido para el desbordamiento de timer en lo particular me gusta el
Pic Timer Calculator 0.9.0
hay que hacer unos calculillos para obtener la frecuencia de desbordamiento del timer.
en este caso busque el resultado del timer con un cristal de 20Mhz para timer 0
y me dio los siguientes resultados:
timer 0
preescaler 1:32
modo 8 bit
y el modo de interrupcion es 100
ahora el codigo quedaria del siguiente modo
Código:
#INT_TIMER0
void TIMER0_isr(void)
{
//codigo
set_TIMER0(100); //desborda cada 1ms
clear_interrupt(INT_TIMER0); // limpia la bandera de interrupcion CCS lo hace por defecto
}
y en el main quedaria asi:
Código:
void main()
{
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_32|RTCC_8_bit); //preescaler a 32 y 8 bits
enable_interrupts(global);
while(1)
{
//codigo
}
}
ahora ya que tenemos toda la base de la estructura del programa nos falta hacer nuestra base de tiempo que es la que nos importa como dije
esta interrupcion se dara cada 1ms
podemos generar tiempos de 1,2,3 segundos o 50ms, 500ms ,etc.
siempre y cuando no sean menores a 1ms
ahora lo que falta es hacer uso de variables globales para hacer las cuentas tanto en la interrupcion como usarlas en el main
eso se hace asi:
Código:
#include<blabla.h>
#include <etc.c>
y asi ...
int16 contador; //lo usaremos para contar 1000milisegundos que forman 1 segundo
char segundo1,segundo2,segundo3; //seran nuestros segundos
#INT_TIMER0
void TIMER0_isr(void)
{
contador++;
if(contador>=1000)
{
contador=0; //reiniciamos la cuenta
segundo1++;
segundo2++;
segundo3++;
}
set_TIMER0(100); //desborda cada 1ms
clear_interrupt(INT_TIMER0); // limpia la bandera de interrupcion CCS lo hace por defecto
}
void main()
{
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_32|RTCC_8_bit); //preescaler a 32 y 8 bits
enable_interrupts(global);
while(1)
{
if(segundo1>=3) //si son 3 segundos prende led
{
segundo1=0;
//prendemos led eso depende del pin que uses o hacer otra cosa
}
else{
//apagamos o hacemos otra cosa
}
if(segundo2>=1) //si son 1 segundos prende led
{
segundo2=0;
//prendemos led eso depende del pin que uses o hacer otra cosa
}
else{
//apagamos o hacemos otra cosa
}
if(segundo3>=60) //si son 60 segundos prende led
{
segundo3=0;
//prendemos led eso depende del pin que uses o hacer otra cosa
}
else{
//apagamos o hacemos otra cosa
}
}//fin de while
}// fin del main
y asi bajita la mano hisimos un proseso multitarea en el prendido de 3 leds con 3 tiempos diferentes
los 3 son totalmente independientes , estudia el codigo, piensalo, juega con el
y seguimos con el proseso de
LECTURA DE BOTONES
sin rebotes con multitarea