From 84b980994934d54b3dad6dd2184830f4464b9933 Mon Sep 17 00:00:00 2001 From: Florian Jung Date: Sun, 29 Nov 2015 00:30:43 +0100 Subject: usb hello world \o/ --- avr/1wire.c | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 avr/1wire.c (limited to 'avr/1wire.c') diff --git a/avr/1wire.c b/avr/1wire.c new file mode 100644 index 0000000..237abb9 --- /dev/null +++ b/avr/1wire.c @@ -0,0 +1,130 @@ +/************************************************************************/ +/* */ +/* Access Dallas 1-Wire Devices */ +/* */ +/* Author: Peter Dannegger */ +/* danni@specs.de */ +/* */ +/************************************************************************/ +#include +#include +#include + +#ifndef W1_PIN +#define W1_PIN PA0 +#define W1_IN PINA +#define W1_OUT PORTA +#define W1_DDR DDRA +#endif + +uint8_t buff[2]; + +uint8_t w1_reset(void) +{ + uint8_t err; + + W1_OUT &= ~(1<>= 1; + if( j ) + b |= 0x80; + }while( --i ); + return b; +} + + +uint w1_byte_rd( void ) +{ + return w1_byte_wr( 0xFF ); +} + + +uint8_t w1_rom_search( uint8_t diff, uint8_t idata *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 w1_command( uint8_t command, uint8_t idata *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 ); +} -- cgit v1.2.1