/* * powerEngine.c * * Created on: Mar 23, 2015 * Author: shinobi */ #include "powerEngined.h" #include "usi_i2c_slave.h" #include #include #define DQ_HIGH DQ_PORT |= (1<Numero de bytes a escribir * \see write_byte */ void write_bytes(uint8_t* pbytes,uint8_t len){ do{ len-=1; write_byte(pbytes[len]); }while(len>0); } /*! * \fn read_signal * \brief Lee un bit del puerto DQ * \return '1' o '0'. * \see read_byte */ uint8_t read_signal(){ uint8_t bit = 0; DQ_LOW; _delay_us(2); DQ_HIGH; DQ_INPUT; _delay_us(8); bit = DQ_READ; _delay_us(55); DQ_OUTPUT; DQ_HIGH; _delay_us(1); return bit; } /*! * \fn read_byte * \brief Lee un byte de el puerto DQ * \see read_signal * \see read_bytes */ uint8_t read_byte(){ uint8_t shift = 0x00; uint8_t byte = 0x00; uint8_t bit= 0; while(shift< 8){ bit = read_signal(); byte |= (bit<0); } /*! * \fn initialization * \brief Inicia o reinicia al IC DS2438Z */ void initialization(){ TCNT0 = 0x0000; presenced_flg = 0; DQ_LOW; _delay_us(490); TM0_ON; DQ_HIGH; while(presenced_flg != 1){} } /*! * \fn memory_read * \brief Realiza la lectura de toda la memoria del IC DS2438Z */ void memory_read(uint8_t* pbytes, uint8_t page_addr){ uint8_t crc; initialization(); write_byte(SKIP_ROM); write_byte(READ_SP); write_byte(page_addr); read_bytes(pbytes,8); crc = read_byte(); initialization(); } /*! * \fn convert * \brief Inicia la conversion ADC de los parametros desados * \param cmd CONVERT_T para iniciar la conversion de temperatura. CONVERT_V * para iniciar la conversion de voltaje. */ void convert(uint8_t cmd){ uint8_t bit = 0; initialization(); write_byte(SKIP_ROM); write_byte(cmd); do{ bit = read_signal(); }while(bit != 1); initialization(); } /*! * \fn void send_data * \brief Envia data al sistema enbebido por puerto twi * \param pbytes Puntero a buffer de bytes a enviar. * \param len Numero de bytes a enviar. Debe ser menor o igual a USI_SLAVE_REGISTER_COUNT. */ void send_data(uint8_t* pbytes, uint8_t len){ int i; for(i=0;i=60*US)&&(cnt<=240*US)){ presenced_flg=1; } } } ISR(TIM1_COMPB_vect){ tm_cycles++; // cuenta de 60 segundos if(tm_cycles>=MAX_TM_CYCLES){ process_flg = 1; tm_cycles=0; } } int main(){ uint8_t pbytes[8]; // inicializa USI_I2C_Init(I2C_SLAVE_ADDR); cli(); // interrupcion externa GIMSK |= _BV(PCIE); // Turn on Pin Change interrupt PCMSK |= _BV(PCINT3); // Which pins are affected by the interrupt // timer0 CTC con OCRA como top. Debe interrumpir en 250us luego de // TM0_ON TCCR0A = (1<