Duda en código PICC con IF

tengo 71% de la rom con el codigo! no quiero agregar más je, demas esta decir que estas lineas no son mias si no de sensirion creo

Código:
/////////////////////////////////////////////////////////////////////////////// 
//                                                                           // 
// Driver file for SHT75 Temperature & Humidity Sensor                       // 
//                                                                           // 
// ***** To initialise SHT75 sensor upon power up *****                      // 
//                                                                           // 
// Function : sht_init()                                                     // 
// Return   : none                                                           // 
//                                                                           // 
//                                                                           // 
// ***** To measure and caluculate SHT75 temp & real RH *****                // 
//                                                                           // 
// Function : sht_rd (temp, truehumid)                                       // 
// Return   : temperature & true humidity in float values                    // 
//                                                                           // 
/////////////////////////////////////////////////////////////////////////////// 
 
#define sht_data_pin   PIN_D3 
#define sht_clk_pin    PIN_C4 
 
 
//***** Function to alert SHT75 ***** 
 
void comstart (void) 
{ 
 output_float(sht_data_pin);  //data high 
 output_bit(sht_clk_pin, 0);  //clk low 
 delay_us(1); 
 output_bit(sht_clk_pin, 1);  //clk high 
 delay_us(1); 
 output_bit(sht_data_pin, 0); //data low 
 delay_us(1); 
 output_bit(sht_clk_pin, 0);  //clk low 
 delay_us(2); 
 output_bit(sht_clk_pin, 1);  //clk high 
 delay_us(1); 
 output_float(sht_data_pin);  //data high 
 delay_us(1); 
 output_bit(sht_clk_pin, 0);  //clk low 
} 
 
 
//***** Function to write data to SHT75 ***** 
 
int1 comwrite (int8 iobyte) 
{ 
 int8 i, mask = 0x80; 
 int1 ack; 
 
 //Shift out command 
 delay_us(4); 
 for(i=0; i<8; i++) 
  { 
   output_bit(sht_clk_pin, 0);                          //clk low 
   if((iobyte & mask) > 0) output_float(sht_data_pin);  //data high if MSB high 
   else output_bit(sht_data_pin, 0);                    //data low if MSB low 
   delay_us(1); 
   output_bit(sht_clk_pin, 1);                          //clk high 
   delay_us(1); 
   mask = mask >> 1;                                    //shift to next bit 
  } 
 
 //Shift in ack 
 output_bit(sht_clk_pin, 0);  //clk low 
 delay_us(1); 
 ack = input(sht_data_pin);   //get ack bit 
 output_bit(sht_clk_pin, 1);  //clk high 
 delay_us(1); 
 output_bit(sht_clk_pin, 0);  //clk low 
 return(ack); 
} 
 
 
//***** Function to read data from SHT75 ***** 
 
int16 comread (void) 
{ 
 int8 i; 
 int16 iobyte = 0; 
 const int16 mask0 = 0x0000; 
 const int16 mask1 = 0x0001; 
 
 //shift in MSB data 
 for(i=0; i<8; i++) 
  { 
   iobyte = iobyte << 1; 
   output_bit(sht_clk_pin, 1);                //clk high 
   delay_us(1); 
   if (input(sht_data_pin)) iobyte |= mask1;  //shift in data bit 
   else iobyte |= mask0; 
   output_bit(sht_clk_pin, 0);                //clk low 
   delay_us(1); 
  } 
 
 //send ack 0 bit 
 output_bit(sht_data_pin, 0); //data low 
 delay_us(1); 
 output_bit(sht_clk_pin, 1);  //clk high 
 delay_us(2); 
 output_bit(sht_clk_pin, 0);  //clk low 
 delay_us(1); 
 output_float(sht_data_pin);  //data high 
 
 //shift in LSB data 
 for(i=0; i<8; i++) 
  { 
   iobyte = iobyte << 1; 
   output_bit(sht_clk_pin, 1);                //clk high 
   delay_us(1); 
   if (input(sht_data_pin)) iobyte |= mask1;  //shift in data bit 
   else iobyte |= mask0; 
   output_bit(sht_clk_pin, 0);                //clk low 
   delay_us(1); 
  } 
 
 //send ack 1 bit 
 output_float(sht_data_pin);  //data high 
 delay_us(1); 
 output_bit(sht_clk_pin, 1);  //clk high 
 delay_us(2); 
 output_bit(sht_clk_pin, 0);  //clk low 
 
 return(iobyte); 
} 
 
 
//***** Function to wait for SHT75 reading ***** 
 
void comwait (void) 
{ 
 int16 sht_delay; 
 
 output_float(sht_data_pin);                     //data high 
 output_bit(sht_clk_pin, 0);                     //clk low 
 delay_us(1); 
 for(sht_delay=0; sht_delay<30000; sht_delay++)  // wait for max 300ms 
  { 
   if (!input(sht_data_pin)) break;              //if sht_data_pin low, SHT75 ready 
   delay_us(10); 
  } 
} 
 
 
//***** Function to reset SHT75 communication ***** 
 
void comreset (void) 
{ 
 int8 i; 
 
 output_float(sht_data_pin);    //data high 
 output_bit(sht_clk_pin, 0);    //clk low 
 delay_us(2); 
 for(i=0; i<9; i++) 
  { 
   output_bit(sht_clk_pin, 1);  //toggle clk 9 times 
   delay_us(2); 
   output_bit(sht_clk_pin, 0); 
   delay_us(2); 
 } 
 comstart(); 
} 
 
 
//***** Function to soft reset SHT75 ***** 
 
void sht_soft_reset (void) 
{ 
 comreset();           //SHT75 communication reset 
 comwrite(0x1e);       //send SHT75 reset command 
 delay_ms(15);         //pause 15 ms 
} 
 
 
//***** Function to measure SHT75 temperature ***** 
 
int16 measuretemp (void) 
{ 
 int1 ack; 
 int16 iobyte; 
 
 comstart();             //alert SHT75 
 ack = comwrite(0x03);   //send measure temp command and read ack status 
 if(ack == 1) return; 
 comwait();              //wait for SHT75 measurement to complete 
 iobyte = comread();     //read SHT75 temp data 
 return(iobyte); 
} 
 
 
//***** Function to measure SHT75 RH ***** 
 
int16 measurehumid (void) 
{ 
 int1 ack; 
 int16 iobyte; 
 
 comstart();            //alert SHT75 
 ack = comwrite(0x05);  //send measure RH command and read ack status 
 if(ack == 1) return; 
 comwait();             //wait for SHT75 measurement to complete 
 iobyte = comread();    //read SHT75 temp data 
 return(iobyte); 
} 
 
 
//***** Function to calculate SHT75 temp & RH ***** 
 
void calculate_data (int16 temp, int16 humid, float & tc, float & rhlin, float & rhtrue) 
{ 
 float truehumid1, rh; 
 
 //calculate temperature reading 
 tc = ((float) temp * 0.01) - 40.0; 
 
 //calculate Real RH reading 
 rh = (float) humid; 
 
 rhlin = (rh * 0.0405) - (rh * rh * 0.0000028) - 4.0; 
 
 //calculate True RH reading 
 rhtrue = ((tc - 25.0) * (0.01 + (0.00008 * rh))) + rhlin; 
} 
 
 
//***** Function to measure & calculate SHT75 temp & RH ***** 
 
void sht_rd (float & temp, float & truehumid) 
{ 
 int16 restemp, reshumid; 
 float realhumid; 
 restemp = 0; truehumid = 0; 
 
 restemp = measuretemp();    //measure temp 
 reshumid = measurehumid();  //measure RH 
calculate_data (restemp, reshumid, temp, realhumid, truehumid);  //calculate temp & RH 
} 
 
 
//***** Function to initialise SHT75 on power-up ***** 
 
void sht_init (void) 
{ 
 comreset();    //reset SHT75 
 delay_ms(20);  //delay for power-up 
}
esto supuestamente está bien, abro otra respuesta para poner lo que basicamente tengo en el programa principal cuando te parezca bien!
 
Última edición:
Oye primero en donde tienes conectado el sensor?

vi la pagina del sensor y es bastante normal ponerle resistencias pullup de unos 4k7 en el clk y el data para I2C y ahi veo que solo le ponen una de 10k en el clk, no sera por ahi el problema?
 
Hermano desactive el led en el pin 36 (b3) y anda bien, ya no trae lecturas erroneas, tú sabes que puede ser o de electronica? ha tengo una r de 10k en el data nada mas
 
:unsure: si entiendo bien, seria mejor que pusieras un transistor y el led con su resistencia limitadora, y el opto tambien con su resistencia limitadora para no sobrecargar el puerto.

se entiende?
 
si de sobremanera pero porque lo usan sin transistor, solo con una r limitadora y el led y anda bien? ademas me parece raro que tengo una r limitadore un led de 5mm y un optoacoplador y funcione mal la lectura... ... ... ... porque???
 
:unsure: ya revise el datasheet y no parece que algo ande raro.... empecemos desde mas atras, ¿la fuente tiene suficiente corriente y esta bien filtrada?.

¿el pic tiene capacitores como filtros?
 
estoy empezando a pensar en que tengo que agregar esa resistencia en sck, voy a estudiar para que sirve y tal ves se estabilice todo ya que tengo el presentimiento que al prender el led crea un pequeño consumo que desestabiliza el sck...



si esta super filtrada y tiene un lm7805, la fuente es de una laptop que va a la fuente del 7805 que esta integrada en la plaqueta del pic



acà tiene una r de 10k en sck pero en el datasheet no se ve y no traduje nada... http://cybertesis.uach.cl/tesis/uach/2008/bmfcif444d/doc/bmfcif444d.pdf
 

Adjuntos

  • fuente 7805.jpg
    fuente 7805.jpg
    25.7 KB · Visitas: 5
Última edición:
pues por lo que voy viendo si es problema de la alimentacion.... el puerto B, en el datasheet no tiene nada fuera de lo normal, y pues supongo que con el codigo que tienes si hace la conmutacion bien el pin_B3

asi que no creo que sea problema de codigo, mas bien en el diseño del circuito.

y si deberia funcionar mas o menos bien como lo tienes el opto y el led, aunque yo generalmente procuro no hacerlo asi.

si puedes mide el consumo de tu circuito con el amperimtro, y el voltaje que no baje.

y vi el documento y si puede estar raro eso del i2C, aunque ahi ponen un pulldown y un pullup :unsure:

yo siempre los pongo asi:

AN50987.jpg
 
Última edición:
Pues deberia funcionar bien el esquema...

pero, por lo que lei tu no tienes esto en tu programa principal, o si?

#include <18F442.H>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use i2c(Master,sda=PIN_C4,scl=PIN_C3)
#define sck pin_c3
#define data pin_c4

#include <lcd_puertoD.c> //libreria LCD//
#include <sht75.c> //libreria sensor//
#use fast_io(C)
#use fast_io(D)

porque si lo tienes estas redirecionando los pines y no funciona que es lo que le paso al del otro post.
 
Última edición:
no que tonto que soy me olvide de poner mis propios fuses, influiran? aunque si con el codigo anda bien me inclino a probar con una r en sck de 10k al gnd, que dices?
 
no que tonto que soy me olvide de poner mis propios fuses, influiran?

pues si influye, en la mayoria de los casos, o sea tienen valores predeterminados, pero por poner un ejemplo, si tienes el wdt y baja el voltaje se restea o se tiene que esta borrando sino se pasma, o no se eso como ejemplo.

y yo las resistencias las pondria a VCC como el esquema del otro post o como diagrama que te puse aqui que es el que recomienda microchip, de echo la liga la puse de una de sus notas de aplicacion, si no me equivoco.
 
Última edición:
entiendo! estos son mis fuses!

#include <18f4520.h>

#device adc=10

#FUSES MCLR //Master Clear pin enabled
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES RESERVED //Used to set the reserved FUSE bits
#FUSES PROTECT //Code protected from reads
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD

#define CURSOR_ON 0x0E

#use delay(clock=2000000) // segun interrupt puede ser 1000000 o 4000000

#define CLOCKS_PER_SECOND 10 //8

#include <flex_lcd_c.c> // libreria para manejo de lcd
#include <TONES1.c> // sonido
#include <rtctimer.c> //library for time.h that uses timer2 as time base
#include <stdlib.h>
#include <internal_eeprom.c> // manejo de eeprom

#define sht_data_pin PIN_b1 //(Data pin veya input)
#define sht_clk_pin PIN_b0 //

#fuses nowdt,noput,nobrownout,nolvp/*,noprotect*/
 
Última edición:
para las pruebas el
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
ponlo
#FUSES NOIESO //Internal External Switch Over mode enabled
#FUSES NOFCMEN //Fail-safe clock monitor enabled

y cambia los fuses de abajo hacia arriba, casi por estetica XD, estos:

#fuses nowdt,noput,nobrownout,nolvp

los demas parecen estar bien, y deja checo si no falta alguno.
 
tù dices para las pruebas, qu pruebas? y serias tan amable de decirme que caranchos hace cada uno? jeje si no es mucha molestia y disculpa mi ignorancia!?
 
tù dices para las pruebas, qu pruebas? y serias tan amable de decirme que caranchos hace cada uno?

o sea que ahorita que estas probando/diseñando el circuito, no utilices esos modulos y descartemos que pueda estar fallando eso.

el FCMEN, monitorea la frecuencia del reloj que este bien, si falla cambia el reloj externo al interno con el ieso. eso sirve para cuando se deja el pic ya trabajando por periodos largos y hay fallas como por electrostatica o cosas asi, pero en este momento no se necesita si queremos que primero funcione.

no se si a esos te referias.

el cristal si lo tienes de 20MHZ verdad?

y tienes una resistencia pullup en el MCLR?



De veras hay algo raro con el oscilador, si lo tienes de 20MHz, le falta el fuse

#FUSES HS //High speed Osc (> 4mhz)

o si lo tienes interno deberia ser asi :
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
y el reloj del delay
#use delay(clock=4MHz)
 
Última edición:
Amigo no sabes lo mucho que te agradezco por tù tiempo y ayuda!!!!!! te comento que agregue una resistencia en serie en el led que va al b3 y se soluciono todo el problema! como puedo valorar lo que as echo por mi????
 
pues bueno... pero no esta demas que cheques bien eso de los fuses para que quede mas o menos bien estos son todos los del 18f4520
si no usas el master clear y no tienes cristal externo seria asi

#device adc=10

#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV20 //Brownout reset at 2.0V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES NOSTVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES NOIESO //Internal External Switch Over mode enabled
#FUSES NOFCMEN //Fail-safe clock monitor enabled
#FUSES NOPBADEN //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES NOMCLR //Master Clear pin enabled
#FUSES NOLPT1OSC //Timer1 configured for low-power operation
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL1 //No PLL PreScaler

#use delay(clock=4000000)

le puse que NO a la mayoria pero sin probarlo asi que si te marca algun error lo checas o comentas como quieras.

suerte!



aaah y otra cosa, si es que separando las resitencias funciona, supongo que el optoacoplador encendia y apagaba el sensor no? y si es asi no funcionaba porque no alcanzaba a saturar bien el opto puesto que estaba a la mitad de su corriente necesaria.

ahora si es eso, es mejor que pongas un transistor porque si el opto se lleva 10mA y el led otros 10mA son 20mA, y una salida aguanta 20mA o 25mA quedando muy justo. puede que no te de problemas nunca pero mas vale.
 
Última edición:
Atrás
Arriba