/************************************************************************/ /* */ /* Access Dallas 1-Wire Devices */ /* */ /* Author: Peter Dannegger */ /* danni@specs.de */ /* */ /************************************************************************/ #include #include #include #include "1wire.h" #ifndef W1_PIN #define W1_PIN PB4 #define W1_IN PINB #define W1_OUT PORTB #define W1_DDR DDRB #endif uint8_t buff[2]; #define hard_gnd do { W1_OUT &= ~(1<>= 1; if( j ) b |= 0x80; } while( --i ); soft_vcc; return b; } uint8_t w1_byte_rd( void ) { return w1_byte_wr( 0xFF ); } /* uint8_t w1_rom_search( uint8_t diff, uint8_t *id ) { uint8_t i, j, next_diff; uint8_t b; if( w1_reset() ) return PRESENCE_ERR; // error, no device found w1_byte_wr( SEARCH_ROM ); // ROM search command next_diff = LAST_DEVICE; // unchanged on last device i = 8 * 8; // 8 bytes do { j = 8; // 8 bits do { b = w1_bit_io( 1 ); // read bit if( w1_bit_io( 1 ) ) // read complement bit { if( b ) // 11 return DATA_ERR; // data error } else { if( !b ) // 00 = 2 devices { if( diff > i || ((*id & 1) && diff != i) ) { b = 1; // now 1 next_diff = i; // next pass 0 } } } w1_bit_io( b ); // write bit *id >>= 1; if( b ) // store bit *id |= 0x80; i--; } while( --j ); id++; // next byte } while( i ); return next_diff; // to continue search }*/ void ds1992_read(uint16_t addr, uint8_t* buf, uint8_t len) { w1_byte_wr(SKIP_ROM); w1_byte_wr(0xF0); // read w1_byte_wr((addr & 0x00FF)); w1_byte_wr((addr & 0xFF00) >> 8); for (int i=0; i < len; i++) buf[i] = w1_byte_rd(); } void w1_command( uint8_t command, uint8_t *id ) { uint8_t i; w1_reset(); if( id ) { w1_byte_wr( MATCH_ROM ); // to a single device i = 8; do { w1_byte_wr( *id ); id++; } while( --i ); } else { w1_byte_wr( SKIP_ROM ); // to all devices } w1_byte_wr( command ); }