Autor Tema: Mi primer programa: Alarma para anemómetro. Espero que os guste!!  (Leído 2556 veces)

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

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Mi primer programa: Alarma para anemómetro. Espero que os guste!!
« en: 30 de Octubre de 2006, 15:25:38 »
Después de dar tanto la lata con preguntas de novato... quería aportar algo al foro, aunque fuese algo sencillo. Me he basado en algunos consejos y ejemplos del foro. Si veis algo mal o que se puede hacer mejor lo decís para poder mejorarlo.

El programa utiliza la interrupción externa por RB0 para leer los pulsos generados por el anemómetro (cada vuelta hay dos cierres de contacto del relé reed). Luego mediante el Timer0 y un cristal de 3,2768Mhz conseguimos 1 segundo exacto y vamos leyendo los pulsos almacenados en un contador.

A partir de ahí, una vez la frecuencia supera la máxima programada se activa la salida y el LED de funcionamiento pasa de parpadear a quedar fijo. La salida no se desactiva hasta que la velocidad baja por debajo del 70% del valor de alarma programado.

Y por fin, ahí va el código:

#include <16LF84A.h>                               //pic a utilizar
#fuses XT, NOWDT, NOPROTECT, PUT                   //ordenes para el programador
#use delay (clock=3276800)                         //Fosc=3,2768Mhz
#use fast_io(a)
#use fast_io(b)

#define SALIDA PIN_A0                              //SALIDA de alarma
#define LED PIN_A1                                 //LED de funcionamiento

int const MaxPulsos=50;                            //frecuencia de alarma (Vel=F/1,4) Obetenido experimentalmente
float const Threshold=0.7;                         //factor de umbral de alarma

int nPulsos, Pulsos, nClocks, MinPulsos, ModoAlarma;

#INT_EXT
void Interrupcion_Anemo()
{                                   
   delay_ms(2);                                    //antirrebote para reed
   nPulsos++;                                      //contar pulsos               
}


#INT_TIMER0
void Interrupcion_Timer0()
{
   nClocks++;                                      //contar numero de interrupciones del timer0

   if(nClocks==25)                                 //25 interrupciones -> ha pasado 1seg
   {
      Pulsos=nPulsos;                              //actualizar variable Pulsos
      nPulsos=0;                                   //reiniciar contadores
      nClocks=0;
     
      if(ModoAlarma==0)                            //parpadeo LED de funcionamiento cada 1seg
      {
         output_high(LED);                           
         delay_ms(50);
         output_low(LED);
      }
   }
}


void inicializar_parametros()                      //secuencia de inicio
{
   int i=0;
   output_a(0x00);
   output_b(0x00);
   nPulsos=Pulsos=nClocks=0;
   MinPulsos=(MaxPulsos*Threshold);
   
   for(i=0;i<2;i++)                               
   {
      output_high(LED);
      delay_ms(500);
      output_low(LED);
      delay_ms(500);
   }
}


void main(void)
{

   disable_interrupts(GLOBAL);                     //deshabilitar interrupciones
   disable_interrupts(INT_EEPROM);                 //deshabilitar interrupcion EEPROM
   disable_interrupts(INT_RB);                     //deshabilitar interrupcion portb
   enable_interrupts(INT_EXT);                     //interrupcion del reed del anemo
   ext_int_edge(H_TO_L);                           //interrupcion en flanco de bajada
   enable_interrupts(INT_TIMER0);                  //interrupcion del contador
   enable_interrupts(GLOBAL);                      //interrupciones activadas
   port_b_pullups(FALSE);                          //pullups portb desactivadas
   set_tris_a(0b00000000);                         //porta todo como salida
   set_tris_b(0b00000001);                         //portb todo como salida menos RB0
   setup_TIMER_0(RTCC_INTERNAL | RTCC_DIV_128);    //preescaler=128 para 1seg

   inicializar_parametros();

   do
   {
      if(Pulsos>=MaxPulsos)                        //maxima velocidad del viento sobrepasada
      {                       
         while(Pulsos>=MinPulsos)                  //activar alarma hasta que el viento baje del 70% del maximo
         {
            ModoAlarma=1;
            output_high(SALIDA);
            output_high(LED);                      //LED fijo indica alarma activa                     
         }

      output_low(SALIDA);                          //desactivar alarma
      output_low(LED);             
      ModoAlarma=0;       
      }
 
   }while(TRUE);
}
« Última modificación: 30 de Octubre de 2006, 15:33:53 por DarkVect »

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Mi primer programa: Alarma para anemómetro. Espero que os guste!!
« Respuesta #1 en: 30 de Octubre de 2006, 18:08:04 »
Muy buen proyecto DarkVect!

Te felicito. Da gusto leer todos los post que has puesto en el foro y ver como poco a poco has conseguido hacer algo así.

Ahora... a buscar algún otro proyecto divertido y a por el  :mrgreen: :mrgreen: :mrgreen:


Un saludo desde Alicante.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: Mi primer programa: Alarma para anemómetro. Espero que os guste!!
« Respuesta #2 en: 30 de Octubre de 2006, 18:21:59 »
Muchas gracias por tu comentario. Realmente hace sentir a uno bien cuando, por poco y sencillo que sea (como es el caso), aprecian tu trabajo.

Ahora me gustaría modificarlo para que además de esperar a que el viento baje del 70% del máximo, en este caso, haya también una temporización mínima de unos 20 minutos sin que el viento sobrepase de nuevo el máximo, a modo de evitar ráfagas puntales que suben y bajan muy rápido.

Un saludo!!