From fe742e35d3fa6d69125e9f463cbbe1c6032969ca Mon Sep 17 00:00:00 2001 From: Florian Jung Date: Sun, 29 Nov 2015 18:15:21 +0100 Subject: meeh --- avr/1wire.c | 239 ++++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 151 insertions(+), 88 deletions(-) (limited to 'avr/1wire.c') diff --git a/avr/1wire.c b/avr/1wire.c index 237abb9..5dbca82 100644 --- a/avr/1wire.c +++ b/avr/1wire.c @@ -9,122 +9,185 @@ #include #include #include +#include "1wire.h" #ifndef W1_PIN -#define W1_PIN PA0 -#define W1_IN PINA -#define W1_OUT PORTA -#define W1_DDR DDRA +#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 ); - return b; + uint8_t i = 8, j; + do + { + j = w1_bit_io( b & 1 ); + b >>= 1; + if( j ) + b |= 0x80; + } + while( --i ); + return b; } -uint w1_byte_rd( void ) +uint8_t w1_byte_rd( void ) { - return w1_byte_wr( 0xFF ); + return w1_byte_wr( 0xFF ); } -uint8_t w1_rom_search( uint8_t diff, uint8_t idata *id ) +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 - } + 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 } - } - 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 + 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 idata *id ) +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 ); + 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 ); } -- cgit v1.2.1