Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. #include <util/delay.h>
  2.  
  3. #define ADDR_DDR DDRA
  4. #define ADDR_PORT PORTA
  5. #define ADDR_PIN PINA
  6.  
  7. uint8_t get_one_address(int pin) {
  8.   uint8_t result = 0;
  9.  
  10.   ADDR_DDR &= ~(1<<pin);    // set pin to input
  11.   ADDR_PORT &= ~(1<<pin);   // disable internal pull-up
  12.   _delay_ms(1);
  13.   if (ADDR_PIN & (1 << pin)) {
  14.     result = 2;         // pin set high
  15.   } else {          // is pin set low or floating?
  16.     ADDR_PORT |= (1<<pin);  // enable internal pull-up
  17.     _delay_ms(0.1);     // see Tiny44A datasheet, 10.1.4
  18.     if (ADDR_PIN & (1<<pin)) {  // ... is pin floating?
  19.       result = 0;       // pin floating
  20.     } else {
  21.       result = 1;       // pin forced low
  22.     }
  23.     ADDR_PORT &= ~(1<<pin); // disable internal pull-up
  24.   }
  25.   return result;
  26. }