Maunix :
Ahi te puse la foto que me habias pedido del circuito que estoy usando para simular ...hasta ahora.
Cambie la libreria del lcd para poder usa el lcd en el puerto c ya que sino me daba error.
1)En realidad todo se reduce a como podria colocarle el codigo sleep() par aque entre en bajop consumo despues de cierto tiempo.
2) lo del rele era otra opcion que habia pensado , pero esa tengo aun ...que verla.
3) el circuito que te coloque ahi es el que hice hoy pasando el lcd al puerto c para poder implementar el bajo consumo y cuando este en ese estado despertarlo con la instruccion sleep desde el puerto B tal y como vos me lo habias sugerido.
Pelusac :
Aqui te pongo el codigo. Pero en realidad lo he estado publicando durante varias semanasa a medida que iba avanzando.
de todos modos aunque resulte redundante aqui esta.
este es el link que he estado publicando hasta unos dias atras.
http://www.todopic.com.ar/foros/index.php?topic=12416.0////////////////////////////////////////////////////////////////////////////////////
//
// 8/07/06 - Medidor de presion!!! - p+ y p- y ademas posee tabla de conversion.
//
// Programa: Manejo del dispositivo PCF8591 en modo A/D
// Version: 0.0
//
// Dispositivo: PIC 16F628 Compilador: CCS vs3.245
// Entorno IDE: MPLAB IDE v7.31 Simulador: Proteus 6.7sp3
//
// Software con Modificaciones
// METER OTRO SENSOR PARA HACER PRESION DIFERENCIAL O CONSEGUIR UN SENSOR QUE HAGA AMBAS
//////////////////////////////////////////////////////////////////////////////////
/******************************************************/
/********** Programa Medidor de Presion con 16f628 ***/
/******************************************************/
#include <16f876.h> //pic a utilizar
#device *=16
#device adc=8
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT,NOCPD, NOWRT,NODEBUG //No Debug mode for ICD
#use delay (clock=4000000) //Fosc=4Mhz
#define use_portc_lcd TRUE
#include <flex_lcd1.c> //libreria para lcd
//////////////////////////////////////////////////
//Posiciones de memorias en eeprom del pic usadas
//0x00 Lectura A0 del adc negativo
//0x01 Lectura A1 del adc positivo
//0x02 Kp
//0x03 Kn
//0x04 Pob
//0x05 copia dir 0x01
//0x06 PobN
//0x07 copiaN dir 0x00
//0x08 unidad de presion
//0x09 formato
////////////////////////////////////////
/********DECLARACION DE FUNCIONES************/
void calibracionP(void);
void calibracionN(void);
void cartel(int Pob);
void cartelN(int PobN);
void presiones(void);
void CartelU (int unidad);
/********************************************/
long int sleepp=254;
/********************************************/
//Pob: presion observada positiva
//PobN: presion observada negativa
//copia: copia un valor parano modificar el original positivo
//copia: copia un valor parano modificar el original negativo
//unidad:????
//valor:usado para almacenar valores de una operacion positiva
//valorN:usado para almacenar valores de una operacion negativa
//Kp:constante de multiplicacion para visualizacion de la presion positiva
//Kn:constante de multiplicacion para visualizacion de la presion negativa
//Ku:constante de multiplicacion para visualizacion
//de conversion de la presion (PSI , mmHg, Bar)
/********************************************/
///////////PROGRAMA/////////////////////
void main(void)
{int dato,Pob,copia,PobN,copiaN,unidad,formato;//po
float valor,valorN,kp=1,kn=1,Ku=1;
lcd_init( ); //inicializamos lcd
lcd_putc(" Medidor de \n Presion...");
delay_ms(1000);
lcd_putc("\f");
setup_adc_ports(AN0_AN1_VSS_VREF);
setup_adc(ADC_CLOCK_INTERNAL);
while(TRUE)
{
set_adc_channel(0);
dato=read_adc();
delay_ms(50);
write_eeprom(0x00,dato);//0x00 Lectura A0 del adc presion negativa
set_adc_channel(1);
dato=read_adc();
delay_ms(50);
write_eeprom(0x01,dato);//0x01 Lectura A1 del adc presion positivo
if (!input(PIN_A2))
{
calibracionP();//llama a la funcion calibracion positiva
}
if (!input(PIN_A4))
{
calibracionN();//llama a la funcion calibracion negativa
}
if (!input(PIN_A5))
{
presiones(); //funcion que selecciona unidad de Presion (PSI , mmHg, Bar)
}
unidad=read_eeprom(0x08);//inicializo posicion de eeprom dir0x08 => 0x08=1=bar por defecto
formato=read_eeprom(0x09);
/****** Tabla de Comversion **************/
/****** Valores Comversion para otras unidades de presion **************/
/****** por defecto Ku es 1 estaria en Bares **************/
switch (unidad){
case 1: Ku=1; //Presion en Bar
break;
case 2: Ku=750.2467; //Presion en mmHg
break;
case 3: ku=14.5; //Presion en Psi
break;
default:break;
}
/****** Fin de tabla **************/
PobN=read_eeprom(0x06);//calibracion negativa
copiaN=read_eeprom(0x07);//calibracion negativa//copiaN son los escalones del ADC
kn=(float)PobN/copiaN;
dato=read_eeprom(0x00);
valorN=dato*kn*ku*0.01; //Calculo el valor de Presion -
Pob=read_eeprom(0x04);
copia=read_eeprom(0x05);
kp=(float)Pob/copia;
dato=read_eeprom(0x01);
valor=dato*kp*ku*0.01; //Calculo el valor de Presion +
if (formato==2){
/*******************************************/
lcd_gotoxy(1,1);
printf(lcd_putc,"P-:-%1.2f ",valorN); //muestra por lcd
cartelU(unidad);
delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"P+: %1.2f ",valor); //muestra por lcd
cartelU(unidad);
delay_ms(50);
/*******************************************/
}else
{
lcd_gotoxy(1,1);
printf(lcd_putc,"MANOVACUOMETRO!",valorN); //muestra por lcd
delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"P: %1.2f ",(valor-valorN)); //muestra por lcd
cartelU(unidad);
delay_ms(50);
}
/******************REVISAR SI SOLO USAMOS EL RESET PARA VOLVER A ENCENDER EL APARATO************/
--sleepp;
lcd_gotoxy(14,2);
printf(lcd_putc,"%03x",sleepp);
if(sleepp==0)
{
sleep();
}
}//bucle infinito
}
/****** Funcion calibracion positiva**************/
void calibracionP(void)
{
int Pob=0,copia=0,Pobinicial=0;
if(!input(PIN_A2)) //pin A2=0 --> calibracion si lo tenes apretado al pin A2
{
lcd_putc("\f");//borra pantalla
lcd_putc("Cal+ A5=up A4=Down");
Pob=read_eeprom(0x04); //almaceno en memoria el numerador del calculo de Kp
Pobinicial=Pob;
cartel(Pob);// llama a la funcion de impresion en lcd realizando una
//division por 100 ya que POb es un valor entero
delay_ms(1000);
while(!input(PIN_A2))
{
if(!input(PIN_A5)) //para ello leemos el estado del pin A3 del porta para conteo ascendente
{
do
{
Pob++; //decremento contador para visualizar siguiente digito
delay_ms(100);
cartel(Pob);//imprime para ver que avanza la calibracion
delay_ms(100);
}while(!input(PIN_A5));//antirrebote
}
if(!input(PIN_A4)) //para ello leemos el estado del pin A3 del porta para conteo descendente
{
do
{
Pob--; //decremento contador para visualizar siguiente digito
delay_ms(100);
cartel(Pob);
delay_ms(100);
}while(!input(PIN_A4));
}
}
}
/***********esto sirve para que efectivamenete se cargue*************/
/**********el valor calibrado y no el valor original***************/
if (Pobinicial!=Pob)
{//condicion para que cuando salga de calibracion no
//modifique el valor de presion calibrada , si no se varia el valor Pob inicial
write_eeprom(0x04,Pob);
copia=read_eeprom(0x01);//0x01 Lectura A1 del adc presion positivo valor de 0 a 255 del ADC
//copia son los escalones del ADC
write_eeprom(0x05,copia);//0x05copia para no modificar el valor original de lectura del ADC
}
lcd_putc("\f");
}
/****** Funcion calibracion negativa**************/
void calibracionN(void)
{
int PobN=0,copiaN=0,Pobinicial=0;
if(!input(PIN_A4)) //pin A2=0 --> calibracion
{
lcd_putc("\f");
lcd_putc("Cal- A5=up A2=Down");
PobN=read_eeprom(0x06);//almaceno en memoria el numerador del calculo de Kn
Pobinicial=PobN;
cartelN(PobN);
delay_ms(1000);
while(!input(PIN_A4))
{
if(!input(PIN_A5)) //para ello leemos el estado del pin A3 del porta para conteo ascendente
{
do
{
PobN++;
delay_ms(100);
cartelN(PobN);
delay_ms(100);
}while(!input(PIN_A5));
}
if(!input(PIN_A2))
{
do
{
PobN--; //decremento contador para visualizar siguiente digito
delay_ms(100);
cartelN(PobN);
delay_ms(100);
}while(!input(PIN_A2));
}
}
}
/***********esto sirve para que efectivamenete se cargue*************/
/**********el valor calibrado y no el valor original***************/
if (Pobinicial!=PobN){//condicion para que cuando salga de calibracion no
//modifique el valor de presion calibrada , si no se varia el valor PobN inicial
write_eeprom(0x06,PobN);//0x06 Lectura A1 del adc presion negativo valor de 0 a 255 del ADC
copiaN=read_eeprom(0x00);
write_eeprom(0x07,copiaN);//0x07copia para no modificar el valor original de lectura del ADC
}
lcd_putc("\f");
}
/****** Funcion carteles de impresion LCD**************/
void cartel(int Pob)
{
lcd_gotoxy(2,2);
printf(lcd_putc,"P+=%1.2f bar",((float)Pob/100)); //La div por 100 es para que muestre en Bar
}
void cartelN(int PobN)
{
lcd_gotoxy(2,2);
printf(lcd_putc,"P-=%1.2f bar",((float)PobN/100)); //La div por 100 es para que muestre en Bar
}
/**************** Funcion presion (PSI mmHg o Bar) + presentacion INDIVIDUAL*******************/
void presiones(void)
{
int unidad=1,formato=1;
if(!input(PIN_A5))
{
lcd_putc("\f");
lcd_putc("Unidad de P:");
unidad=read_eeprom(0x08);
lcd_gotoxy(2,2);
cartelU(unidad);
while(!input(PIN_A5))
{
if(!input(PIN_A2))//pin A3 apretado + pin A2 como pulsdor cambio a Bar a mmHg o PSI
{
do
{
unidad++;
if (unidad>3) unidad=1;//reset para no exeder la condicion
lcd_gotoxy(2,2);
cartelU(unidad);
delay_ms(1000);
}while(!input(PIN_A2));
}
if(!input(PIN_A4))//pin A3 apretado + pin A4 como pulsdor cambio a formatos de presentacion presion +,- o diferencial
{
do
{
lcd_gotoxy(2,2);
if (formato==1)
{
lcd_putc("Formato P+ P-");
formato=2;
}else
{
lcd_putc("Formato PSUMA");
formato=1;
}
delay_ms(1000);
}while(!input(PIN_A4));
}
}
write_eeprom(0x08,unidad);
write_eeprom(0x09,formato);
lcd_putc("\f");
}
}
/****** Funcion carteles de impresion LCD**************/
void CartelU (int unidad)
{
switch (unidad){
case 1:
lcd_putc("Bar ");// aca se imprimen espacios vacion por una cuetion de refresco del diplay para que no
//queden impresas letras de mas cuando se corra una presentacion en el display.
break;
case 2:
lcd_putc("mmHg ");
break;
case 3:
lcd_putc("psi ");
break;
default:
break;
}
}