Autor Tema: Ayuda en proyecto con DSPIC30F4013 para controlar leds en secuencia  (Leído 5869 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Pic

  • PIC10
  • *
  • Mensajes: 1
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*/



aaa y se me olvidaba mencionar ... estoy usando el C30 de Mplab xD

Desconectado jacagis

  • PIC10
  • *
  • Mensajes: 4
Re: Ayuda en proyecto con DSPIC30F4013 para controlar leds en secuencia
« Respuesta #1 en: 02 de Marzo de 2011, 00:15:21 »
HOLA QUISIERA HACERTE UNA APORTACION SOBRE TODO A TU FUNCION DE RETARDO, TRATA DE IMPLEMENTARLA VERAS QUE SERA MAS EXACTA EN CUANTO AL TIEMPO QUE DESEAS AUNQUE SOLO ES PARA MILISEGUNDOS. SI DESEAS MAS INFORMACION SOBRE DSPICS PUEDO PROPORCIONARTE ALGUNOS MANUALES Y EJEMPLOS QUE REALIZE CUANDO ESTABA EN LA CARRERA. saludos.

#include <p30fxxxx.h>

/* Macros para configurar los bits de configuración */
_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 Delayms( unsigned t);  //retardo 1mseg

int main()
{
TRISB = 0; //PORTB como salida
ADPCFG = 0xFFFF; //Pines digitales
while(1)
{
PORTB = 0xFFFF; //Pone en "1" los pines del PORTB
Delayms(100);
PORTB = 0; //Pone en "0" los pines del PORTB
Delayms(100);
} //ciclo principal
} //main

void Delayms( unsigned t)  //retardo 1mseg
{
PR1 = 16000;
TMR1 = 0;
T1CON = 0x8000; //Timer1 activo con prescaler de 1:1
while(t--)
{
while(!IFS0bits.T1IF); // Se queda ciclando mientras T1IF = 0
IFS0bits.T1IF = 0; // Pasa 1ms, limpia T1IF y se repite el ciclo
}
}

Desconectado jacagis

  • PIC10
  • *
  • Mensajes: 4
Re: Ayuda en proyecto con DSPIC30F4013 para controlar leds en secuencia
« Respuesta #2 en: 02 de Marzo de 2011, 00:31:18 »
:) se me paso, aqui tambien puedes agregarn esta funcion para los Usegundos. Saludos.

void Delayus( unsigned t)  //retardo 1useg
{
PR1 = 15;
TMR1 = 0;
T1CON = 0x8000; //Timer1 activo con prescaler de 1:1
while(t--)
{
while(!IFS0bits.T1IF); // Se queda ciclando mientras T1IF = 0
IFS0bits.T1IF = 0; // Pasa 1us, limpia T1IF y se repite el ciclo
}
}

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Ayuda en proyecto con DSPIC30F4013 para controlar leds en secuencia
« Respuesta #3 en: 02 de Marzo de 2011, 01:40:03 »
Hola Pic, necesariamente lo debes hacer con un dspic?? eso lo puedes hacer con un pic de lo mas enano (comparando precios del dspic contra un pic de 8 pines + un IC TTL de la familia 74).

Te recomiendo el uso de algun timer para generar pausas, si haces pausas ciclicas no se realizara el rastreo esperado de la tecla.

EN tu lugar haria lo siguiente:

Código: C
  1. Interrupcion Timer a 100us
  2. {
  3. sumar una variable de tal manera de llegar al tiempo que desees.
  4. timer_cont++;
  5. }
  6.  
  7.  
  8. Main
  9. {
  10. if(timer_cont >= tiempo_deseado)
  11. {
  12. timer_cont = 0;
  13. sumo un variable y la cargo en el puerto, esta variable sera el led que se muestre}
  14.  
  15. if(tecla_pulsada)
  16. {
  17. sumar una variable que me indique la presion de la tecla
  18. ejecutar el codigo
  19. tecla_puls++;
  20. switch(tecla_puls)
  21. {
  22. case 1:
  23. {run}
  24. case 2:
  25. {pause}
  26. case 3:
  27. {stop
  28. tecla_puls = 0;}
  29. }
  30.  
  31. }
  32.  
  33. }

Espero haberte ayudado

saludios

A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.


 

anything