Ola amigos
...
Tengo problemas con un proyecto que estoy haciendo
ya habia manejado antes para algunas cosas sencillas este microcontrolador pero nose que esta pasando on lo que quiero hacer ahora , espero me puedan ayudar, ahi les va...
Con un DSPIC30F4013 quiero controlar 19 leds que van a ir prendiendo en secuencia, entre cada led necesito un retardo de 5 min pero ahorita para probarlo estoy dejandole como 1 seg. ... este proceso de secuencia tiene que empezar cuando precione un boton (prenderia el 1er. led - 5min - 2do. led - 5 min y asi sucesivamente), con ese mismo boton al presionarlo por segunda vez que detenga (pause) la secuencia donde se quedo y con una tercera vez que se presione el mismo boton apagar todos los leds para esperar repetir lo mismo cuando se ocupe otra ves (picando el boton de nuevo) ....
esto es lo que debe hacer el proyecto, pero al momento de probarlo ya en proto algunas veces si lo hace bien y otras no :? ... ya que apago los led, ahi veces que activo la secuencia y llega hasta el segundo led nada mas no sigue con los demas ( se queda trabado ahi D: ) y otras veces que esta corriendo la secuencia no se detiene cuando presiono el boton
... esos son los grandes problemas que estoy teniendo con este circuito, ya probe varias fuentes diferentes para ver si era eso pero no sigue pasando lo mismo con todas, cheke muchas veces el programa y segun yo esta bn, nose si se me este pasando algun detalle que es en lo que espero me puedan ayudar o dar alguna idea de lo k pueda estar pasando
aki dejo el programa y de antemano .. gracias
#include "p30f4013.h"
#include <math.h>
#include <stdio.h>
#define BOTON _RD8 // En este pin se conecta el boton
_FOSC(CSW_FSCM_OFF & XT_PLL16);
_FWDT(WDT_OFF); //Apaga el perro guardian
_FBORPOR(MCLR_EN & PWRT_OFF); //Habilita el reset por el pin MCLR y
//desactiva el temporizador de encendido
_FGS(CODE_PROT_OFF); //Deshabilita la proteccion de codigo
void retardo(int t); //Prototipo de funcion
//void delayms(unsigned t);
int menu,control,reinicia;
int main()
{
int leds,cont;
TRISB = 0x0000; //Puerto B como salida
TRISF = 0x0000; //Puerto F como salida
ADPCFG = 0xFFFF; //Configura pines digitales
/* A continuación los pasos para configurar y programar la interrupción */
_INT1EP = 1; //Disparo de interrupcion por flanco descendente
_INT1IP = 4; //Ajusta la prioridad a 4 (valor predeterminado)
_INT1IF = 0; //Paso 3. Limpia la bandera de interrupcion
_INT1IE = 1; //Paso 4. Habilita la interrupcion externa 1
/*// Configura el CN (change notification)
CNEN1bits.CN2IE = 1; // Habilita la interrupcion del CN2 pin RB0
CNPU1bits.CN2PUE = 1; // Habilita la pull-up del pin CN2
IFS0bits.CNIF = 0; // Limpia la bandera de interrupcion de CN
IPC3bits.CNIP = 7; // Prioridad 5 de interrupcion CN
IEC0bits.CNIE = 1; // Habilita la interrupcion CN*/
//*************************************************************** OPCION 2 DE PROGRAMA ***************************************************************
reinicia = 0;
menu = 0;
control = 0;
leds = 0;
while(1)
{
if (reinicia == 1)
{
PORTB = 0;
PORTF = 0;
reinicia = 0;
menu = 0;
control = 0;
leds = 0;
}
if (control == 1)
{
_LATB0 = 1; //LED de Encendido
while(menu!=2) //Ciclo condicion para 90minutos completos
{
for (cont=1;cont<=50;cont++) //poner a 5min
retardo(10000);
leds++;
if (leds == 1)
_LATB1 = 1;
if (leds == 2)
_LATB2 = 1;
if (leds == 3)
_LATB3 = 1;
if (leds == 4)
_LATB4 = 1;
if (leds == 5)
_LATB5 = 1;
if (leds == 6)
_LATB6 = 1;
if (leds == 7)
_LATB7 = 1;
if (leds == 8)
_LATB8 = 1;
if (leds == 9)
_LATB9 = 1;
if (leds == 10)
_LATB10 = 1;
if (leds == 11)
_LATB11 = 1;
if (leds == 12)
_LATB12 = 1;
if (leds == 13)
_LATF0 = 1;
if (leds == 14)
_LATF1 = 1;
if (leds == 15)
_LATF2 = 1;
if (leds == 16)
_LATF3 = 1;
if (leds == 17)
_LATF4 = 1;
if (leds == 18)
{
_LATF5 = 1;
control = 2;
menu = 2;
}
}//Ciclo 90 min.
}
} //ciclo principal
return(0);
} //main
//**************** Funcion retardo ************************
void retardo(int t)
{
int i=1,j;
for(j=0; j<t; j++) //Repite el ciclo t veces
while(i) //Cicla hasta que i se desborde
i++;
}
/* RUTINA DE SERVICIO DE INTERRUPCION */
// Esta rutina se ejecuta cada vez que se produce un flanco descendente en el BOTON
void __attribute__((interrupt, no_auto_psv)) _INT1Interrupt( void)
{
//Delayms(20); // Espera a que se estabilice el nivel de voltaje
retardo(30);
if(BOTON==0)
{
if(menu==0) // Si no es un rebote...
control=1;
if(menu==1)
control=0;
if(menu==2)
reinicia=1;
}
menu++;
_INT1IF = 0; //Limpia la bandera de interrupción antes de salir
} //INT1Interrupt
/*// Rutina de servicio de interrupcion del Change Notification (CN)
void __attribute__((interrupt, no_auto_psv)) _CNInterrupt(void)
{
if(BOTON == 0) // Si se pulso el boton
{
retardo(20);
if((BOTON==0)&&(menu==0)) // Si no es un rebote...
control=1;
if((BOTON==0)&&(menu==1))
control=0;
if((BOTON==0)&&(menu==2))
reinicia=1;
menu++;
//}
IFS0bits.CNIF = 0; // Limpia la bandera de interrupcio
} //CNInterrupt*/