Autor Tema: Comprensión de "INT_AD"  (Leído 996 veces)

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

Desconectado Thaanhiel

  • PIC10
  • *
  • Mensajes: 2
Comprensión de "INT_AD"
« en: 07 de Octubre de 2016, 14:04:53 »

Buen día tengan todos,

Quiero agradecer por toda la información que han dejado en el foro y que en realidad durante mis años de estudio fue muy provechosa. Realmente esta es mi primer publicación .

El programa que tengo hasta el momento, funciona pero hala corriente como desesperado y la aplicación es con baterías (No están durando).
La idea (A groso modo) es medir condiciones de humedad en 2 entradas continuamente, y cuando sobrepasen un valor establecido en el promedio me generen una señal sobre un actuador (Fácil cierto?).

Me tienen haciendo esto en PIC C, (Afortunadamente esto es C plano) y el micro es el PIC16LF1614. Lo tengo con una batería de 9V estándar y el consumo de corriente mientras está apagado (Sleep) es de 2uA, pero cuando arranca se come 2mA y no consigo bajar el consumo.

Las interrupciones son algo que hasta ahora estoy digiriendo. y quiero en primera instancia entender la interrupción "INT_AD" y su uso cuando el micro se está trabajando con reloj LFINTOSC a ver si lo puedo mandar a dormir entre lecturas. De antemano agradezco cualquier ayuda y felicidades para todos.

Incluyo el código por si alguien tiene la paciencia de explicarme sobre él mismo.
Código: [Seleccionar]

#include <16LF1614.h>
#device ADC=10
#FUSES INTRC_IO,PUT,MCLR,NOPROTECT,BROWNOUT_NOSL,NOCLKOUT,NOWRT,LPBOR,LVP,NOWDT  // Configuración de fusibles
#use delay(internal=31kHz)                                                       // Velocidad del osc
// Creación de las entradas Análogas
   // sAN3 conectado a Sense1
   // sAN7 conectado a Sense2
// Creación del teclado
#define Pulse1 PIN_A2                                                            // Pin 11 conectado al pulsador
// Creación de las salidas
#define QAct PIN_C4                                                              // Pin 6 conectado al transistor
#define LedY PIN_C5                                                              // Pin 5 conectado al Led
///////////////////////////////////////////////////////////////////////////////
// Creación de variables.
int Pulso=0;
int1 bit=0;
///////////////////////////////////////////////////////////////////////////////
#int_ext
void ext_isr(){                                                                  // Arranca si se pulsa el botón de interrupción externa.
   bit=1;
   output_high(LedY);
   delay_ms(50);
   disable_interrupts(int_ext_h2l);
   output_low(LedY);
   delay_ms(50);
}
void main(){
   setup:                                                                        // Configuración de inicio
   int a=0,j=0,k=0;
   if(bit==1){
   goto loop;
   }
   set_tris_a(0b00011100);
   set_tris_c(0b00001011);
   long y=0;
   output_low(PIN_A0);  output_low(PIN_A1);  output_low(PIN_A5);
   goto jump;
   
   loop:
 
   setup_adc_ports(sAN3|sAN7);
   setup_adc(ADC_CLOCK_INTERNAL);                                                // Enciende ADC
   
   set_adc_channel (3);
   long S1 = read_adc();
   delay_us(50);

   set_adc_channel (7);
   long S2 = read_adc();
   delay_us(50);
   setup_adc (adc_off);                                                          // Apaga ADC

   if(input(Pulse1)){                                                            // Lee si se pulsa el botón
      Pulso=1;
      output_high(LedY);
      delay_ms(50);
   }
// Encendido del dispositibo y arranque de la rutina de detección.
   if(bit==1){                                                                   // Compara condición de encendido.
      for(a=0;a<=9;a++){                                                          // Genera un contador de 10 seg.
         output_high(LedY);
         delay_ms(50);
         output_low(LedY);
         delay_ms(950);
      }
      y=(...........);                                            // Establece el nivel de disparo.
      bit=0;
   }
// Arranque de la rutina de detección
   long x=((S1+S2)/2);                                                           // Saca el promedio de las lecturas.
   if(k!=3){
      if(((x>y)&&(a<25))||(a>100)){
         a++;
         if(a>=20){                                                              // Condición de disparo en repetición de ciclos.
            output_high(QAct);
            k=3;
         }
      }else if(pulso==0){
         a=0;
      }
   }else if(x<y){
      output_low(QAct);
      k=0;
   }
// Solicitud de apagado del dispositibo y entrada en estado de hibernación.
   while((Pulso!=0)&&(k!=3)){                                                              // Ingreso a la rutina de apagado.
      while(input(Pulse1)==1){
      goto loop;                                                                    // Antitontos
      }
      output_low(LedY);
     
//Apagado del dispositibo y entrada en estado de hibernación.
      jump:
      setup_adc_ports(no_analogs);
      enable_interrupts(global);
      clear_interrupt(int_ext_h2l);
      enable_interrupts(int_ext_h2l);
      output_low(PIN_C2);  output_low(PIN_C4);  output_low(PIN_C5);
      Pulso=a=k=0;
      sleep();
      goto setup;
   }
   Pulso=0;                                                                   // Reinicia la variable "pulso".
   goto loop;
}
/*
picfernalia.blogspot.com.co/2012/07/adc-con-interrupciones.html

Para preguntar si alguien entiende de un modo más dummy el contenido de esa entada, para aplicar mandando a dormir en lugar de poner en delay, mientras espera realizar cualquier acción.
*/


Exitos y grácias.
« Última modificación: 10 de Octubre de 2016, 08:28:44 por Thaanhiel »