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.
#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.