uControl
Septiembre 08, 2010, 07:45:58 *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: 1   Ir Abajo
  Imprimir  
Autor Tema: Alimentacion de proyecto LM7805 y bat 9 v??? o disipa mucho?  (Leído 363 veces)
0 Usuarios y 1 Visitante están viendo este tema.
velazquezbio
PIC10F
*
Desconectado Desconectado

Mensajes: 65

Desafia a mi BRUTO http://sir-valtimor.elbruto.es/


WWW
« : Julio 23, 2010, 11:31:25 »

Hola, hace rato que no visitaba la web, estoy con un proyecto.... bang y me dedique de lleno.

Estoy por terminarlo pero tengo cosas que definir y quisiera que me orienten.

Hice un dispositivo (Ahora portatil), que levanta unos datos, y luego los bajo por USB.
uso un DS1307 y una memoria 24lc512 (por si sirve para tener idea de como hacer la interrupcion)

Necesito alimentarlo con 5V porque uso un 18f4550. y unos sensores que van de 4v a 5.6v de alimentacion.

No conozco exactamente el consumo, porque mi multimetro (todavia no compre el nuevo), no tiene una escala, tan pequeña.
Pero aproximadamente esta por debajo de los  300 mA, si no calcule mal.

Mi pregunta es... como lo alimento... Bateria de 9v y Lm7805? lei en el foro que quizas eso generaba mucho consumo.

y la otra consulta... para ahorrar energia, pensaba mandar a dormir el pic  cuando el intervalo de mediciones es mayor igual que 30 minutos.
Como lo despierto? mire las interrupciones del 18f4550.

usos CCS-interrupciones del 18f4550

RTCC           Timer 0 overflow (using RTCC name)
TIMER0   Timer 0 overflow (using TIMER0 name)
TIMER1   Timer 1 overflow
TIMER2   Timer 2 overflow
TIMER3   Timer 3 overflow
EXT           External interrupt
EXT1           External interrupt #1
EXT2           External interrupt #2
RB           Port B any change on B4-B7
AD           Analog to digital conversion complete
RDA          RS232 receive data available
TBE          RS232 transmit buffer empty
SSP         SPI or I2C activity
CCP1         Capture or Compare on unit 1
CCP2         Capture or Compare on unit 2
BUSCOL    Bus collision
LOWVOLT Low voltage detected
COMP         Comparator event
EEPROM   Write complete
OSCF        System oscilator failed
SPP        Streaming Parallel Port Read/Write
USB        Universal Serial Bus activity

cual uso?
La autonomia tiene que ser de 2 meses. al menos seria un buen comienzo.

Agradezco cualquier ayuda.


GRACIAS

Criistian


« Última modificación: Julio 25, 2010, 10:55:18 por velazquezbio » En línea
willynovi
PIC12F
**
Desconectado Desconectado

Sexo: Masculino
Mensajes: 118



« Respuesta #1 : Julio 23, 2010, 11:38:40 »

es como un datalogger que tomas muestras cada 30 minutos?
Quieres dormirlo durante 30 minutos y tomar una muestra y luego ponerlo a dormir nuevamente?
No te he entendido bien.

Imagino que usaria una interrupcion que fuera del mismo origen que por el cual puedas obtener una señal de vida.
Por decirlo así, si quieres que se despierte cuando lo enchufas a un puerto de la PC usaria la interrupcion del USB.
« Última modificación: Julio 24, 2010, 09:14:16 por Marioguillote » En línea

Proximamente, definir si participo de la 8va Competencia de Sumo en Bahía Blanca
velazquezbio
PIC10F
*
Desconectado Desconectado

Mensajes: 65

Desafia a mi BRUTO http://sir-valtimor.elbruto.es/


WWW
« Respuesta #2 : Julio 24, 2010, 03:52:38 »

Si es un Datalogger, cuando este midiendo no se me ocurre ninguna interrupcion que lo haga despertar.
el ciclo seria algo asi...

Mide
duerme
pasan 30 minutos
se desipierta
Mide...
Duerme...
etc

El logger va a estaren un campo dos meses nadie lo va a tocar en todo ese tiempo.

Si lo mando a dormir (para que gaste la menor energia posible) con que lo despierto?
que me conviene hacer consultar el ds1307? para comparar la hora?
si fuese asi ese tiempo que tiene que esperar hasta comprobar la hora como se lo doy?
que hago para que el pic se entere que pasaron  30 minutos si esta dormido?
« Última modificación: Julio 24, 2010, 09:14:02 por Marioguillote » En línea
Marioguillote
Global Moderator
PIC12F
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 452



WWW
« Respuesta #3 : Julio 24, 2010, 09:13:06 »

La punta del ovillo está en que no tenés que usar un DS1307 sino un DS1337 o cualquier otro que, además de ser un RTC, tenga alarma.
El RTC siempre estará "despierto" con consumos del orden de los nanoamperes hasta que se dispare la alarma.
Podés programarlo para que se active cada "X tiempo" quieras tomar mediciones. Con eso, "despiertas" el PIC, haces el registro de datos y lo vuelves a mandar a dormir.
Quien tiene que hacer el trabajo es el RTC, no el PIC.
El PIC debe ser un esclavo eficiente a las órdenes del RTC.

Después de tener eso organizado hay que calcular los consumos y el máximo ahorro de energía posible.

Saludos!
Mario

PD: Modifiqué los títulos del post. Le saqué el [AYUDA]. No hace falta colocarlo. Saludos!
« Última modificación: Julio 24, 2010, 09:16:16 por Marioguillote » En línea

100% Oligarca - Actualmente con Bluetooth - RN41
Ivan
PIC12F
**
Desconectado Desconectado

Sexo: Masculino
Mensajes: 247


« Respuesta #4 : Julio 24, 2010, 03:20:45 »

Me parece que en microchip hay una guia de bajo consumo para esa clase de aplicaciones, decia de usar resistencias de alto valor para las pull-ups y alimentar los circuitos que consuman menos de 20mA desde los pines del pic para poder encenderlos segun se necesite. Otra era el de usar un capacitor tipo Goldcap conectado al comparador para hacer periodos de sleep mas largos.

EDITO:

PIC® MCU Tips 'n Tricks Featuring nanoWatt XLP Technology (DS01146B)
http://ww1.microchip.com/downloads/en/DeviceDoc/01146B_chapter%202.pdf

Deep Sleep Mode on Microchip PIC18 and PIC24 microcontrollers
http://techtrain.microchip.com/webseminars/ArchivedDetail.aspx?Active=196
« Última modificación: Julio 24, 2010, 03:32:15 por Ivan » En línea
velazquezbio
PIC10F
*
Desconectado Desconectado

Mensajes: 65

Desafia a mi BRUTO http://sir-valtimor.elbruto.es/


WWW
« Respuesta #5 : Julio 24, 2010, 04:39:48 »

Hola, gracias por las respuestas. el Lunes me voy  a comprar el ds1337.

Uso CCS y  no esta la libreria del DS1337, busque en la web y encontre  una, (no soy muy ducho con esta parte) mi pregunta es, esta implementada la funcion del seteo de la alarma y la lectura de la misma... a mi me parecio que no....
Código:
/ DS1337.H


/* ---------------------------------------------
Use the following lines or declare in application.

#ifndef DS1337_SDA
#define DS1337_SDA  PIN_C4
#define DS1337_SCL  PIN_C3
#endif

#use i2c(master, sda=DS1337_SDA, scl=DS1337_SCL)
*/

// i2c addresses
#define DS1337_I2C_WRITE_ADDR    0xD0
#define DS1337_I2C_READ_ADDR     0xD1

// DS1337 register addresses
#define DS1337_SECONDS_REG       0x00
#define DS1337_MINUTES_REG       0x01
#define DS1337_HOURS_REG         0x02
#define DS1337_DAY_OF_WEEK_REG   0x03
#define DS1337_DATE_REG          0x04
#define DS1337_MONTH_REG         0x05
#define DS1337_YEAR_REG          0x06
//DS1337 Unique Registers
#define DS1337_ALM1_SECONDS_REG  0x07
#define DS1337_ALM1_MINUTES_REG  0x08
#define DS1337_ALM1_HOURS_REG    0x09
#define DS1337_ALM1_DAYDATE_REG  0x0A
#define DS1337_ALM2_MINUTES_REG  0x0B
#define DS1337_ALM2_HOURS_REG    0x0C
#define DS1337_ALM2_DAYDATE_REG  0x0D
#define DS1337_CONTROL_REG       0x0E
#define DS1337_STATUS_REG        0x0F

//Enable Oscillator, Disable SQWV, Disable Ints
#define DS1337_CTRL_REG_INIT_VAL 0x04

//Clear OSF (Oscillator Stop Flag), A2F (Alarm 2 Flag), and A1F (Alarm 1 Flag)
#define DS1337_CLEAR_STATUS_VAL  0x00


char const weekday_names[7][4] = {  {"Sun"},
                                    {"Mon"},
                                    {"Tue"},
                                    {"Wed"},
                                    {"Thu"},
                                    {"Fri"},
                                    {"Sat"} };

// This structure defines the user's date and time data.
// The values are stored as unsigned integers.  The user
// should declare a structure of this type in the application
// program. Then the address of the structure should be
// passed to the DS1337 read/write functions in this
// driver, whenever you want to talk to the chip.
typedef struct {
   int8 seconds;    // 0 to 59
   int8 minutes;    // 0 to 59
   int8 hours;      // 0 to 23  (24-hour time)
   int8 day;        // 0 = Sunday, 1 = Monday, etc.
   int8 date;       // 1 to 31
   int8 month;      // 1 to 12
   int8 year;       // 00 to 99
} date_time_t;


//----------------------------------------------
void DS1337_write_byte(int8 address, int8 data) {

   disable_interrupts(GLOBAL);

   i2c_start();
   i2c_write(DS1337_I2C_WRITE_ADDR);
   i2c_write(address);
   i2c_write(data);
   i2c_stop();

   enable_interrupts(GLOBAL);

}

//----------------------------------------------
int8 DS1337_read_byte(int8 address) {

   int8 retval;

   disable_interrupts(GLOBAL);
   i2c_start();
   i2c_write(DS1337_I2C_WRITE_ADDR);
   i2c_write(address);
   i2c_start();
   i2c_write(DS1337_I2C_READ_ADDR);
   retval = i2c_read(0);
   i2c_stop();
   enable_interrupts(GLOBAL);

   return(retval);
}


//----------------------------------------------
// This function converts an 8 bit binary value
// to an 8 bit BCD value.
// The input range must be from 0 to 99.

int8 bin2bcd(int8 value) {

   char retval;
   retval = 0;

   while(1)
     {
      // Get the tens digit by doing multiple subtraction
      // of 10 from the binary value.
      if(value >= 10)
        {
         value -= 10;
         retval += 0x10;
        }
      else // Get the ones digit by adding the remainder.
        {
         retval += value;
         break;
        }
      }

   return(retval);

}

//----------------------------------------------
// This function converts an 8 bit BCD value to
// an 8 bit binary value.
// The input range must be from 00 to 99.

char bcd2bin(char bcd_value) {

   char temp;

   temp = bcd_value;

   // Shifting the upper digit right by 1 is
   // the same as multiplying it by 8.
   temp >>= 1;

   // Isolate the bits for the upper digit.
   temp &= 0x78;

   // Now return: (Tens * 8) + (Tens * 2) + Ones
   return(temp + (temp >> 2) + (bcd_value & 0x0f));

}

//----------------------------------------------
void DS1337_set_datetime(date_time_t *dt) {

   int8 bcd_sec;
   int8 bcd_min;
   int8 bcd_hrs;
   int8 bcd_day;
   int8 bcd_date;
   int8 bcd_mon;
   int8 bcd_year;

   // Convert the input date/time into BCD values
   // that are formatted for the DS1337 registers.
   bcd_sec  = bin2bcd(dt->seconds);
   bcd_min  = bin2bcd(dt->minutes);
   bcd_hrs  = bin2bcd(dt->hours);    //default to 24 hour mode
   bcd_day  = bin2bcd(dt->day);
   bcd_date = bin2bcd(dt->date);
   bcd_mon  = bin2bcd(dt->month);    //ignore century bit
   bcd_year = bin2bcd(dt->year);

   // Write to the date and time registers.  Disable interrupts
   // so they can't disrupt the i2c operations.
   disable_interrupts(GLOBAL);

   i2c_start();
   i2c_write(DS1337_I2C_WRITE_ADDR);
   i2c_write(DS1337_SECONDS_REG);   // Start at seconds register
   i2c_write(bcd_sec);
   i2c_write(bcd_min);
   i2c_write(bcd_hrs);
   i2c_write(bcd_day);
   i2c_write(bcd_date);
   i2c_write(bcd_mon);
   i2c_write(bcd_year);
   i2c_stop();

   enable_interrupts(GLOBAL);

}

//----------------------------------------------
// Read the Date and Time from the hardware registers
// in the DS1337.
void DS1337_read_datetime(date_time_t *dt) {

   int8 bcd_sec;
   int8 bcd_min;
   int8 bcd_hrs;
   int8 bcd_day;
   int8 bcd_date;
   int8 bcd_mon;
   int8 bcd_year;

   // Disable interrupts so the i2c process is not disrupted.
   disable_interrupts(GLOBAL);

   // Read the date/time registers from the DS1337.
   i2c_start();
   i2c_write(DS1337_I2C_WRITE_ADDR);
   i2c_write(DS1337_SECONDS_REG);   // Start at seconds register
   i2c_start();
   i2c_write(DS1337_I2C_READ_ADDR);

   bcd_sec  = i2c_read();
   bcd_min  = i2c_read();
   bcd_hrs  = i2c_read();
   bcd_day  = i2c_read();
   bcd_date = i2c_read();
   bcd_mon  = i2c_read();
   bcd_year = i2c_read(0);
   i2c_stop();

   enable_interrupts(GLOBAL);

   // Convert the date/time values from BCD to
   // unsigned 8-bit integers. Unpack bits in
   // DS1337 registers where required.
   dt->seconds = bcd2bin(bcd_sec  & 0x7F);
   dt->minutes = bcd2bin(bcd_min  & 0x7F);
   dt->hours   = bcd2bin(bcd_hrs  & 0x3F);
   dt->day     = bcd2bin(bcd_day  & 0x07);
   dt->date    = bcd2bin(bcd_date & 0x3F);
   dt->month   = bcd2bin(bcd_mon  & 0x1F);
   dt->year    = bcd2bin(bcd_year);

}

//----------------------------------------------
//If there has been an oscillator failure since last
//init, then init DS1337. A default time and date is set as well.
void DS1337_init(void) {

    int8 temp = 0;

    //Read the status register to see if the oscillator has failed.
    temp = DS1337_read_byte(DS1337_STATUS_REG);
    //Unpack OSF bit
    temp = temp >> 7;

    //If oscillator has failed then init DS1337
    if(temp) {
      disable_interrupts(GLOBAL);
      i2c_start();
      i2c_write(DS1337_I2C_WRITE_ADDR);
      i2c_write(DS1337_SECONDS_REG);
      i2c_write(0x00);                     //seconds
      i2c_write(0x00);                     //minutes
      i2c_write(0x40);                     //hours & 12/24 hour mode
      i2c_write(0x00);                     //day
      i2c_write(0x01);                     //date
      i2c_write(0x01);                     //month
      i2c_write(0x06);                     //year
      i2c_write(0x00);                     //alm1 seconds
      i2c_write(0x00);                     //alm1 minutes
      i2c_write(0x00);                     //alm1 hours
      i2c_write(0x00);                     //alm1 day/date
      i2c_write(0x00);                     //alm2 minutes
      i2c_write(0x00);                     //alm2 hours
      i2c_write(0x00);                     //alm2 day/date
      i2c_write(DS1337_CTRL_REG_INIT_VAL); //Turn off the squarewave output pin.
      i2c_write(DS1337_CLEAR_STATUS_VAL);  //Clear the status registers
      i2c_stop();
      enable_interrupts(GLOBAL);
   }
}

si esta implementado, me indicarian donde.

Si alguien tiene la libreria completa, o ya la utilizo,  podrian subirla?. Y sino... me dan una mano para escribir si agole falta.

Gracias.

PD ivan mire los articulos muy interesantes, uno igual m e cargo con error, el que es un pdf, probare mas tarde a ver si se carga completo.Gracias.
En línea
Suky
Administradores
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 2084


PIC32, voy por ti! >:(


WWW
« Respuesta #6 : Julio 24, 2010, 04:54:15 »

velazquezbio fíjate que setear la alarma es como setear la hora. Estudia como realizo eso y ya tienes como configurar el ds1337.


Saludos!
En línea

  Neuquén-Argentina 

InfoPIC
velazquezbio
PIC10F
*
Desconectado Desconectado

Mensajes: 65

Desafia a mi BRUTO http://sir-valtimor.elbruto.es/


WWW
« Respuesta #7 : Julio 24, 2010, 05:49:07 »

Si, me puse con mas detenimiento, no me deje asustar con tanto numero y si... ya salio... quizas fue el miedo escénico duda

ds1337 DONE rolleyes2
En línea
Suky
Administradores
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 2084


PIC32, voy por ti! >:(


WWW
« Respuesta #8 : Julio 24, 2010, 06:14:00 »

Si, me puse con mas detenimiento, no me deje asustar con tanto numero y si... ya salio... quizas fue el miedo escénico duda

Pasa  Wink Uno tiende a preguntar primero antes que tratar de entenderlo.   Tongue

Saludos!
En línea

  Neuquén-Argentina 

InfoPIC
velazquezbio
PIC10F
*
Desconectado Desconectado

Mensajes: 65

Desafia a mi BRUTO http://sir-valtimor.elbruto.es/


WWW
« Respuesta #9 : Julio 24, 2010, 07:49:14 »

Me parecia que no estaba mal escrita la rutina,  igual ahora tengo mis dudas....
Me equivoque en Proteus estaba usando el ds1338. El 1337 no esta.  Idiota tengo la ultima version.

bueno tendre que esperar al lunes. a comprarlo.

posteo la modificacion de la libreria, solo  seteo la alarma 1  por ahora. es correcta la modificacion.?
Código:
//----------------------------------------------
typedef struct {
   int8 a1seconds;    // 0 to 59
   int8 a1minutes;    // 0 to 59
   int8 a1hours;      // 0 to 23  (24-hour time)
   int8 a1day;        // 0 = Sunday, 1 = Monday, etc.
   } a1date_time_t;

//----------------------------------------------
void DS1337_set_alarm1(a1date_time_t *a1dt) {

   int8 bcd_a1sec;
   int8 bcd_a1min;
   int8 bcd_a1hrs;
   int8 bcd_a1day;
  
   // Convert the input date/time alarm 1 into BCD values
   // that are formatted for the DS1337 registers.
   bcd_a1sec  = bin2bcd(a1dt->a1seconds);
   bcd_a1min  = bin2bcd(a1dt->a1minutes);
   bcd_a1hrs  = bin2bcd(a1dt->a1hours);    //default to 24 hour mode
   bcd_a1day  = bin2bcd(a1dt->a1day);
  
   // Write to the date and time alarm 1 registers.  Disable interrupts
   // so they can't disrupt the i2c operations.
   disable_interrupts(GLOBAL);

   i2c_start();
   i2c_write(DS1337_I2C_WRITE_ADDR);
   i2c_write(DS1337_ALM1_SECONDS_REG);   // Start at seconds register in Alarm1
   i2c_write(bcd_a1sec);
   i2c_write(bcd_a1min);
   i2c_write(bcd_a1hrs);
   i2c_write(bcd_a1day);
   i2c_stop();
   enable_interrupts(GLOBAL);

}
//----------------------------------------------
// Read the Date and Time Alarm from the hardware registers
// in the DS1337.
void DS1337_read_alarm1(a1date_time_t *a1dt) {

   int8 bcd_a1sec;
   int8 bcd_a1min;
   int8 bcd_a1hrs;
   int8 bcd_a1day;

   // Disable interrupts so the i2c process is not disrupted.
   disable_interrupts(GLOBAL);

   // Read the date/time registers from the DS1337.
   i2c_start();
   i2c_write(DS1337_I2C_WRITE_ADDR);
   i2c_write(DS1337_ALM1_SECONDS_REG);   // Start at seconds register Alarm1
   i2c_start();
   i2c_write(DS1337_I2C_READ_ADDR);

   bcd_a1sec  = i2c_read();
   bcd_a1min  = i2c_read();
   bcd_a1hrs  = i2c_read();
   bcd_a1day  = i2c_read();
   i2c_stop();

   enable_interrupts(GLOBAL);

   // Convert the date/time Alarm 1 values from BCD to
   // unsigned 8-bit integers. Unpack bits in
   // DS1337 registers where required.
   a1dt->a1seconds = bcd2bin(bcd_a1sec  & 0x7F);
   a1dt->a1minutes = bcd2bin(bcd_a1min  & 0x7F);
   a1dt->a1hours   = bcd2bin(bcd_a1hrs  & 0x3F);
   a1dt->a1day     = bcd2bin(bcd_a1day  & 0x07);
   }

   a1dt->a1seconds = bcd2bin(bcd_a1sec  & 0x7F);
   a1dt->a1minutes = bcd2bin(bcd_a1min  & 0x7F);
   a1dt->a1hours   = bcd2bin(bcd_a1hrs  & 0x3F);
   a1dt->a1day     = bcd2bin(bcd_a1day  & 0x07);

No logro comprender que es la parte que puse en negrita.
« Última modificación: Julio 24, 2010, 08:02:52 por velazquezbio » En línea
Suky
Administradores
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 2084


PIC32, voy por ti! >:(


WWW
« Respuesta #10 : Julio 24, 2010, 08:36:34 »

Es correcto. Lo último es una operación AND para tomar solo los primeros 7 bits de la variable para la conversión y asegurarse de colocar a 0 el último bit.


Saludos!

 
En línea

  Neuquén-Argentina 

InfoPIC
velazquezbio
PIC10F
*
Desconectado Desconectado

Mensajes: 65

Desafia a mi BRUTO http://sir-valtimor.elbruto.es/


WWW
« Respuesta #11 : Julio 24, 2010, 09:12:05 »

con respecto a la otra pregunta....

como lo alimento... Bateria de 9v y Lm7805? lei en el foro que quizas eso generaba mucho consumo.
 
sino que otra queda?

saludos!

EDIT queda esta! la solucion para un dispositivo portatil de bajo consumo.
Hasta 16V y 250mA
SOLUCION

y sale 3 pesos. Baba

« Última modificación: Agosto 04, 2010, 05:37:19 por velazquezbio » En línea
velazquezbio
PIC10F
*
Desconectado Desconectado

Mensajes: 65

Desafia a mi BRUTO http://sir-valtimor.elbruto.es/


WWW
« Respuesta #12 : Agosto 04, 2010, 05:37:41 »

Cierren el tema por favor.
En línea
Islagrande
Administradores
PIC16F
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 774


Amo mis cacharros


« Respuesta #13 : Agosto 04, 2010, 05:52:02 »

Cierren el tema por favor.

Complaciendo peticiones, tema cerrado

Saludos
En línea

Cuando todo le falle: Siga las instrucciones!!!
Páginas: 1   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.9 | SMF © 2006-2009, Simple Machines LLC XHTML 1.0 válido! CSS válido!

Página creada en 0.352 segundos con 22 consultas. (Pretty URLs adds 0.019s, 2q)