├── usb.h ├── usb.c ├── ibutton.lay6 ├── Bootloader ├── main ├── main.c ├── avrprog_boot.pnps ├── makefile ├── readme.txt ├── bootloader.aws ├── mega324p.h ├── mega644p.h ├── mega169.h ├── avrprog_boot.pnproj ├── mega16.h ├── mega32.h ├── mega8.h ├── mega128.h ├── mega64.h ├── mega644.h ├── mega128can.h ├── chipdef.h ├── megaxx4p.h ├── mega162.h ├── main.hex ├── Bootloader.aps └── ldscripts_no_vector │ ├── avr1.x │ ├── avr2.x │ ├── avr3.x │ ├── avr4.x │ └── avr5.x ├── ibutton_scm.png ├── metacom.h ├── ibutton_board.png ├── .github └── FUNDING.yml ├── cyfral.h ├── usart.h ├── onewire_config.h ├── defines.h ├── bits.h ├── metacom.c ├── usart.c ├── onewire.h ├── cyfral.c ├── ibutton.h ├── README.md ├── Makefile ├── onewire.c ├── ibutton.sch ├── ibutton.hex └── main.c /usb.h: -------------------------------------------------------------------------------- 1 | void usb_mode(void); 2 | -------------------------------------------------------------------------------- /usb.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClusterM/ibutton/HEAD/usb.c -------------------------------------------------------------------------------- /ibutton.lay6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClusterM/ibutton/HEAD/ibutton.lay6 -------------------------------------------------------------------------------- /Bootloader/main: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClusterM/ibutton/HEAD/Bootloader/main -------------------------------------------------------------------------------- /ibutton_scm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClusterM/ibutton/HEAD/ibutton_scm.png -------------------------------------------------------------------------------- /metacom.h: -------------------------------------------------------------------------------- 1 | #define METACOM_T 150 2 | 3 | void metacom_send(unsigned char* key); 4 | -------------------------------------------------------------------------------- /Bootloader/main.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClusterM/ibutton/HEAD/Bootloader/main.c -------------------------------------------------------------------------------- /ibutton_board.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClusterM/ibutton/HEAD/ibutton_board.png -------------------------------------------------------------------------------- /Bootloader/avrprog_boot.pnps: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Bootloader/makefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClusterM/ibutton/HEAD/Bootloader/makefile -------------------------------------------------------------------------------- /Bootloader/readme.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClusterM/ibutton/HEAD/Bootloader/readme.txt -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [ClusterM] 2 | custom: ["https://www.buymeacoffee.com/cluster", "https://boosty.to/cluster"] 3 | -------------------------------------------------------------------------------- /cyfral.h: -------------------------------------------------------------------------------- 1 | #define CYFRAL_SIGNAL !(ACSR & (1< 2 | -------------------------------------------------------------------------------- /Bootloader/mega324p.h: -------------------------------------------------------------------------------- 1 | #ifndef _MEGA324P_H_ 2 | #define _MEGA324P_H_ 3 | 4 | /* I (M. Thomas) could not find an official Boot-ID 5 | for the ATmega324P so pretend it's an ATmega32 */ 6 | /* Part-Code ISP */ 7 | #define DEVTYPE_ISP 0x72 8 | /* Part-Code Boot */ 9 | #define DEVTYPE_BOOT 0x73 10 | 11 | #define SIG_BYTE1 0x1E 12 | #define SIG_BYTE2 0x95 13 | #define SIG_BYTE3 0x08 14 | 15 | #include "megaxx4p.h" 16 | 17 | #endif // #ifndef _MEGA324P_H_ 18 | -------------------------------------------------------------------------------- /Bootloader/mega644p.h: -------------------------------------------------------------------------------- 1 | #ifndef _MEGA644P_H_ 2 | #define _MEGA644P_H_ 3 | 4 | /* I (M. Thomas) could not find an official Boot-ID 5 | for the ATmega644P so pretend it's an ATmega64 */ 6 | /* Part-Code ISP */ 7 | #define DEVTYPE_ISP 0x45 8 | /* Part-Code Boot */ 9 | #define DEVTYPE_BOOT 0x46 10 | 11 | #define SIG_BYTE1 0x1E 12 | #define SIG_BYTE2 0x96 13 | #define SIG_BYTE3 0x0A 14 | 15 | #include "megaxx4p.h" 16 | 17 | #endif // #ifndef _MEGA644P_H_ 18 | -------------------------------------------------------------------------------- /onewire_config.h: -------------------------------------------------------------------------------- 1 | #ifndef __onewire_config_h_included__ 2 | #define __onewire_config_h_included__ 3 | 4 | #include "bits.h" 5 | 6 | #define ONEWIRE_PORT PORTD 7 | #define ONEWIRE_DDR DDRD 8 | #define ONEWIRE_PIN PIND 9 | #define ONEWIRE_MASTER_TX_PIN 5 10 | #define ONEWIRE_MASTER_RX_PIN 6 11 | 12 | #define ONEWIRE_TIMER_INIT { set_bit(TCCR1B, CS11); unset_bit2(TCCR1B, CS12, CS10); } // 8x timer 13 | #define ONEWIRE_TIMER_REG TCNT1 14 | #define ONEWIRE_USEC (F_CPU / 8000000UL) 15 | 16 | //#define ONEWIRE_SEARCH_SUPPORT 17 | 18 | #endif 19 | -------------------------------------------------------------------------------- /Bootloader/mega169.h: -------------------------------------------------------------------------------- 1 | #ifndef _MEGA169_H_ 2 | #define _MEGA169_H_ 3 | 4 | #define DEVTYPE_ISP 0x78 5 | #define DEVTYPE_BOOT 0x79 6 | 7 | #define SIG_BYTE3 0x1E 8 | #define SIG_BYTE2 0x94 9 | #define SIG_BYTE1 0x05 10 | 11 | #define UART_BAUD_HIGH UBRRH 12 | #define UART_BAUD_LOW UBRRL 13 | #define UART_STATUS UCSRA 14 | #define UART_TXREADY UDRE 15 | #define UART_RXREADY RXC 16 | #define UART_DOUBLE U2X 17 | #define UART_CTRL UCSRB 18 | #define UART_CTRL_DATA ((1< -------------------------------------------------------------------------------- /Bootloader/mega16.h: -------------------------------------------------------------------------------- 1 | #ifndef _MEGA16_H_ 2 | #define _MEGA16_H_ 3 | 4 | /* Part-Code ISP */ 5 | #define DEVTYPE_ISP 0x74 6 | /* Part-Code Boot */ 7 | #define DEVTYPE_BOOT 0x75 8 | 9 | #define SIG_BYTE1 0x1E 10 | #define SIG_BYTE2 0x94 11 | #define SIG_BYTE3 0x03 12 | 13 | #define UART_BAUD_HIGH UBRRH 14 | #define UART_BAUD_LOW UBRRL 15 | #define UART_STATUS UCSRA 16 | #define UART_TXREADY UDRE 17 | #define UART_RXREADY RXC 18 | #define UART_DOUBLE U2X 19 | #define UART_CTRL UCSRB 20 | #define UART_CTRL_DATA ((1< 2 | #include "defines.h" 3 | #include "ibutton.h" 4 | #include "bits.h" 5 | #include "metacom.h" 6 | #include "onewire.h" 7 | 8 | inline void metacom_send_byte(uint8_t data) 9 | { 10 | uint8_t b; 11 | for (b = 0; b < 8; b++) 12 | { 13 | if (data & (1UL< 5 | 6 | #if defined (SPMCSR) 7 | #define SPM_REG SPMCSR 8 | #elif defined (SPMCR) 9 | #define SPM_REG SPMCR 10 | #else 11 | #error "AVR processor does not provide bootloader support!" 12 | #endif 13 | 14 | #define APP_END (FLASHEND - (BOOTSIZE * 2)) 15 | 16 | #if (SPM_PAGESIZE > UINT8_MAX) 17 | typedef uint16_t pagebuf_t; 18 | #else 19 | typedef uint8_t pagebuf_t; 20 | #endif 21 | 22 | #if defined(__AVR_ATmega169__) 23 | #include "mega169.h" 24 | 25 | #elif defined(__AVR_ATmega16__) 26 | #include "mega16.h" 27 | 28 | #elif defined(__AVR_ATmega162__) 29 | #include "mega162.h" 30 | 31 | #elif defined(__AVR_ATmega8__) 32 | #include "mega8.h" 33 | 34 | #elif defined(__AVR_ATmega32__) 35 | #include "mega32.h" 36 | 37 | #elif defined(__AVR_ATmega324P__) 38 | #include "mega324p.h" 39 | 40 | #elif defined(__AVR_ATmega64__) 41 | #include "mega64.h" 42 | 43 | #elif defined(__AVR_ATmega644__) 44 | #include "mega644.h" 45 | 46 | #elif defined(__AVR_ATmega644P__) 47 | #include "mega644p.h" 48 | 49 | #elif defined(__AVR_ATmega128__) 50 | #include "mega128.h" 51 | 52 | #elif defined(__AVR_AT90CAN128__) 53 | #include "mega128can.h" 54 | 55 | #else 56 | #error "no definition for MCU available in chipdef.h" 57 | #endif 58 | 59 | #endif 60 | -------------------------------------------------------------------------------- /Bootloader/megaxx4p.h: -------------------------------------------------------------------------------- 1 | #ifndef _MEGAxx4_H_ 2 | #define _MEGAxx4_H_ 3 | 4 | #ifndef UART_USE_SECOND 5 | /* UART 0 */ 6 | #define UART_BAUD_HIGH UBRR0H 7 | #define UART_BAUD_LOW UBRR0L 8 | #define UART_STATUS UCSR0A 9 | #define UART_TXREADY UDRE0 10 | #define UART_RXREADY RXC0 11 | #define UART_DOUBLE U2X0 12 | #define UART_CTRL UCSR0B 13 | #define UART_CTRL_DATA ((1< 3 | 4 | void USART_init(void) 5 | { 6 | unsigned int bd = (F_CPU / (16UL * UART_BAUD)) - 1; 7 | UBRRL = bd & 0xFF; 8 | UBRRH = bd >> 8; 9 | 10 | UCSRB = /*_BV(TXEN) | */_BV(RXEN) | _BV(RXCIE); /* tx/rx enable */ 11 | // UCSRC = 1<>4; 27 | char ho = (h < 10) ? (h+'0') : (h+'A'-10); 28 | unsigned char l = data & 0xF; 29 | char lo = (l < 10) ? (l+'0') : (l+'A'-10); 30 | while ( !( UCSRA & (1<>ONEWIRE_MASTER_RX_PIN) & 1) == 0) 22 | #define ONEWIRE_WRITE1 { ONEWIRE_MASTER_TX(10); ONEWIRE_WAIT(75); } 23 | #define ONEWIRE_WRITE0 { ONEWIRE_MASTER_TX(75); ONEWIRE_WAIT(10); } 24 | 25 | void onewire_init(); 26 | char onewire_write_reset(); 27 | char onewire_read_bit(); 28 | unsigned char onewire_read_byte(); 29 | void onewire_write_bit(unsigned char b); 30 | void onewire_write_byte(unsigned char b); 31 | void onewire_pullup(); 32 | void onewire_search_all(void (*f)(unsigned char* out)); 33 | char onewire_check_crc(unsigned char* data, unsigned char size); 34 | char onewire_all_zeros(unsigned char* data, unsigned char size); 35 | 36 | #endif -------------------------------------------------------------------------------- /cyfral.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "defines.h" 3 | #include "ibutton.h" 4 | #include "bits.h" 5 | #include "cyfral.h" 6 | #include "onewire.h" 7 | 8 | inline void cyfral_send_nibble(uint8_t data) 9 | { 10 | uint8_t b; 11 | for (b = 0; b < 4; b++) 12 | { 13 | if (data & (1UL<> (b*2)) & 0b11)); 33 | } 34 | } 35 | 36 | long int read_cyfral() 37 | { 38 | uint16_t buffer[100]; 39 | int pos = 0; 40 | do 41 | { 42 | TCNT1 = 0; 43 | while (!CYFRAL_SIGNAL && TCNT1 < 0x400); 44 | if (TCNT1 >= 0x400) return -1; 45 | //buffer[pos++] = TCNT1; 46 | TCNT1 = 0; 47 | while (CYFRAL_SIGNAL && TCNT1 < 0x400); 48 | if (TCNT1 >= 0x400) return -1; 49 | buffer[pos++] = TCNT1; 50 | 51 | } while (pos < sizeof(buffer)/2); 52 | int i, j; 53 | int startpos = -1; 54 | for (i = 0; i < pos-9*4; i++) 55 | { 56 | if ((buffer[i] > 70) && (buffer[i+1] > 70) && (buffer[i+2] > 70) && (buffer[i+3] < 70)) 57 | { 58 | startpos = i; 59 | break; 60 | } 61 | } 62 | uint16_t code = 0; 63 | int b = 0; 64 | if (startpos >= 0) 65 | { 66 | for (i = startpos+4; i < startpos+9*4; i+=4) 67 | { 68 | for (j = 0; j < 4; j++) 69 | { 70 | //send_num(buffer[i+j]); 71 | if (buffer[i+j] > 70) 72 | code |= j << (b*2); 73 | } 74 | b++; 75 | } 76 | } else return -1; 77 | return code; 78 | } 79 | 80 | long int read_cyfral_with_check() 81 | { 82 | long int code = 0, tries = 0, i; 83 | for (i = 0; i < 10; i++) 84 | { 85 | long int code2 = read_cyfral(); 86 | if ((code2 >= 0) && (code == code2)) 87 | { 88 | tries++; 89 | } else { 90 | tries = 0; 91 | code = code2; 92 | } 93 | if (tries >= 3) 94 | { 95 | return code2; 96 | } 97 | } 98 | return -1; 99 | } 100 | 101 | -------------------------------------------------------------------------------- /Bootloader/main.hex: -------------------------------------------------------------------------------- 1 | :101C000011241FBECFE5D4E0DEBFCDBF10E0A0E6BB 2 | :101C1000B0E001C01D92A03AB107E1F703D09AC12C 3 | :101C200000C008952F923F924F925F926F927F92E1 4 | :101C30008F929F92AF92BF92CF92DF92EF92FF92DC 5 | :101C40000F931F93CF93DF93C49ABC9AF894A895EF 6 | :101C500088E10FB6F89481BD11BC0FBE8B98939AA2 7 | :101C600010BC99E199B98AB986E880BD839B05C00B 8 | :101C7000C498BC98E0E0F0E00995C0E0D0E088248A 9 | :101C800089E5582E0DE0902E11E1612EBFE47B2EE8 10 | :101C9000A0E34A2EF8E33F2EE7E02E2E5F9BFECF17 11 | :101CA0009CB1913621F45D9BFECF5CB8F7CF9134A7 12 | :101CB00079F45F9BFECF9CB15F9BFECF8CB15D9BA7 13 | :101CC000FECFB92EAA24C82FD0E0CA29DB29FDC037 14 | :101CD000923659F45D9BFECF5CB85D9BFECF1CB87D 15 | :101CE0005D9BFECF20E42CB9D9CF923409F05BC0C4 16 | :101CF0005F9BFECF8CB15F9BFECF6CB15F9BFECF35 17 | :101D00002CB190E0E0E6F0E0961710F08FEF03C002 18 | :101D10005F9BFECF8CB180839F5F903411F0319632 19 | :101D2000F3CF77E7871609F03BC0263491F57E01A3 20 | :101D300000E010E0EE0CFF1C001F111FA80197012E 21 | :101D4000A0E6B0E08C9190E01196DC901197CC2445 22 | :101D50008C299D29129671E0F9010C0170935700AE 23 | :101D6000E89511242E5F3F4F4F4F5F4F625051F760 24 | :101D700075E0F70170935700E89507B600FCFDCFBA 25 | :101D800060925700E8955695479537952795E90154 26 | :101D900004C0253411F4C60FD11D5D9BFECF95C044 27 | :101DA0005D9BFECF7FC0973609F03CC05F9BFECFA6 28 | :101DB0008CB15F9BFECFFCB05F9BFECF8CB18634B5 29 | :101DC000E1F4CE01A0E0B0E0880F991FAA1FBB1F6D 30 | :101DD000FC01259134915D9BFECF2CB95D9BFECF1C 31 | :101DE0003CB90296A11DB11DEEEFFE0E89F7B69526 32 | :101DF000A79597958795EC0151CF853409F04ECF83 33 | :101E0000EF2C8E01C8019ED05D9BFECF8CB90F5F79 34 | :101E10001F4FEA94B9F7FA948F2D90E00196C80FFE 35 | :101E2000D91F3CCF9536C1F4F7E78F1691F4E0E067 36 | :101E3000F0E023E020935700E89507B600FCFDCFC3 37 | :101E4000E05CFF4F7CE1E030F70799F760925700C4 38 | :101E5000E8955D9BFECF39C0953461F42CE088E1B4 39 | :101E600090E00FB6F894A89581BD0FBE21BD5D9B93 40 | :101E7000FECF2BC0903519F45D9BFECF26C09C345D 41 | :101E800019F45D9BFECF21C0903721F45D9BFECFFE 42 | :101E900083E556C0943741F45D9BFECFE7E7ECB98C 43 | :101EA0005D9BFECF1CB8FACE892F8857823030F464 44 | :101EB0005F9BFECF8CB15D9BFECF07C0943539F49C 45 | :101EC0005F9BFECF8CB05D9BFECF9CB8E7CE933579 46 | :101ED000D9F45D9BFECFF1E4FCB95D9BFECF26E516 47 | :101EE0002CB95D9BFECF72E57CB95D9BFECF82E491 48 | :101EF0008CB95D9BFECF7CB85D9BFECF7CB85D9BB3 49 | :101F0000FECFE4E5ECB9CACE963539F45D9BFECF41 50 | :101F10004CB85D9BFECF3CB8C1CE933759F45D9B66 51 | :101F2000FECF2CB85D9BFECFF3E9FCB95D9BFECFE5 52 | :101F30008EE106C09B3109F4B1CE5D9BFECF8FE3ED 53 | :101F40008CB9ACCEE199FECF9FBB8EBBE09A9927AE 54 | :081F50008DB30895F894FFCF52 55 | :0400000300001C00DD 56 | :00000001FF 57 | -------------------------------------------------------------------------------- /ibutton.h: -------------------------------------------------------------------------------- 1 | #include "defines.h" 2 | 3 | #define GLUE(a,b) a##b 4 | #define DDR(p) GLUE(DDR,p) 5 | #define PORT(p) GLUE(PORT,p) 6 | #define PIN(p) GLUE(PIN,p) 7 | 8 | #define LED1_DDR DDR(LED_TOP_PORT) 9 | #define LED2_DDR DDR(LED_TOP_RIGHT_PORT) 10 | #define LED3_DDR DDR(LED_BOTTOM_RIGHT_PORT) 11 | #define LED4_DDR DDR(LED_BOTTOM_PORT) 12 | #define LED5_DDR DDR(LED_BOTTOM_LEFT_PORT) 13 | #define LED6_DDR DDR(LED_TOP_LEFT_PORT) 14 | #define LED7_DDR DDR(LED_CENTER_PORT) 15 | #define LED1_PORT PORT(LED_TOP_PORT) 16 | #define LED2_PORT PORT(LED_TOP_RIGHT_PORT) 17 | #define LED3_PORT PORT(LED_BOTTOM_RIGHT_PORT) 18 | #define LED4_PORT PORT(LED_BOTTOM_PORT) 19 | #define LED5_PORT PORT(LED_BOTTOM_LEFT_PORT) 20 | #define LED6_PORT PORT(LED_TOP_LEFT_PORT) 21 | #define LED7_PORT PORT(LED_CENTER_PORT) 22 | #define LED1_PIN LED_TOP_PIN 23 | #define LED2_PIN LED_TOP_RIGHT_PIN 24 | #define LED3_PIN LED_BOTTOM_RIGHT_PIN 25 | #define LED4_PIN LED_BOTTOM_PIN 26 | #define LED5_PIN LED_BOTTOM_LEFT_PIN 27 | #define LED6_PIN LED_TOP_LEFT_PIN 28 | #define LED7_PIN LED_CENTER_PIN 29 | 30 | #define BUTTON_DDR DDR(BUTTON_PORT) 31 | #define BUTTON_OUT PORT(BUTTON_PORT) 32 | #define BUTTON_IN PIN(BUTTON_PORT) 33 | #define USB_DETECT_DDR DDR(USB_DETECT_PORT) 34 | #define USB_DETECT_OUT PORT(USB_DETECT_PORT) 35 | #define USB_DETECT_IN PIN(USB_DETECT_PORT) 36 | 37 | #define LINE_ENABLE_DDR DDR(LINE_ENABLE_PORT) 38 | #define LINE_ENABLE_OUT PORT(LINE_ENABLE_PORT) 39 | #define LINE_ENABLE_IN PIN(LINE_ENABLE_PORT) 40 | 41 | #define CYFRAL_PULLUP_DDR DDR(CYFRAL_PULLUP_PORT) 42 | #define CYFRAL_PULLUP_OUT PORT(CYFRAL_PULLUP_PORT) 43 | #define CYFRAL_PULLUP_IN PIN(CYFRAL_PULLUP_PORT) 44 | 45 | #define CYFRAL_REFERENCE_DDR DDR(CYFRAL_REFERENCE_PORT) 46 | #define CYFRAL_REFERENCE_OUT PORT(CYFRAL_REFERENCE_PORT) 47 | #define CYFRAL_REFERENCE_IN PIN(CYFRAL_REFERENCE_PORT) 48 | 49 | #define LINE_ENABLE set_bit(LINE_ENABLE_OUT, LINE_ENABLE_PIN) 50 | #define LINE_DISABLE unset_bit(LINE_ENABLE_OUT, LINE_ENABLE_PIN) 51 | #define CYFRAL_PULLUP_ENABLE { set_bit(CYFRAL_PULLUP_OUT, CYFRAL_PULLUP_PIN); set_bit(CYFRAL_PULLUP_DDR, CYFRAL_PULLUP_PIN); } 52 | #define CYFRAL_PULLUP_DISABLE { unset_bit(CYFRAL_PULLUP_DDR, CYFRAL_PULLUP_PIN); unset_bit(CYFRAL_PULLUP_OUT, CYFRAL_PULLUP_PIN); } 53 | #define CYFRAL_REFERENCE_ENABLE set_bit(CYFRAL_REFERENCE_OUT, CYFRAL_REFERENCE_PIN) 54 | #define CYFRAL_REFERENCE_DISABLE unset_bit(CYFRAL_REFERENCE_OUT, CYFRAL_REFERENCE_PIN) 55 | 56 | #define BUTTON_PRESSED !(BUTTON_IN & (1<Bootloader28-Aug-2009 01:35:5429-Aug-2009 21:46:36241028-Aug-2009 01:35:5444, 16, 0, 626AVR GCCd:\Coding\AVR\Bootloader\JTAG ICEATmega16falseR00R01R02R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19R20R21R22R23R24R25R26R27R28R29R30R31Auto000main.cD:\Coding\AVR\Bootloader\makefiledefaultYESD:\Coding\AVR\Bootloader\makefileatmega16111Bootloader.elfdefault\1-Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enumsdefault1C:\WinAVR\bin\avr-gcc.exeC:\WinAVR\utils\bin\make.exed:\Coding\AVR\Bootloader\main.c00000main.c100001makefile1 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Эмулятор домофонных ключей iButton/Cyfral/Metacom 2 | ================================================= 3 | 4 | Устроство способно считывать домофонные ключи iButton/Cyfral и имитировать ключи iButton/Cyfral/Metacom для открытия домофонов. Таким образом, можно в одном брелке носить ключи сразу от многих дверей. Есть возможность подключить устройство по USB к компьютеру. 5 | 6 | Схема 7 | ----- 8 | 9 | ![Schematic](ibutton_scm.png) 10 | 11 | Компоненты и их предназначение: 12 | * **IC1** - микроконтроллер ATMEGA8/ATMEGA8A/ATMEGA8L; 13 | * **U1** - USB-контроллер FT232RL, нужен для подключения устройства к компьютеру; 14 | * **CON1** - miniUSB разъём; 15 | * **BT1** - батарейки, дающие 5 вольт; 16 | * **D1** и **D2** - диоды (желательно шоттки), которые изолируют питание от батареи от питания от USB; 17 | * **P1** - "таблетка" iButton, используется для подключения к домофонам; 18 | * **P2** - контакты считывателя ключей, используются для подключения к ключам; 19 | * **R1** - резистор, подтягивающий линию 1-wire к VCC; 20 | * **R2** - токопонижающий резистор для управления транзистором **Q2**; 21 | * **R3** - резистор, ещё сильнее подтягивающий линию к VCC для считывания ключей Cyfral; 22 | * **R4** - токопонижающий резистор, используется для открытия **Q1** и определения подключения к USB; 23 | * **R5** - подтягивает базу **Q1** к земле, чтобы закрывать его, когда нет подключения к USB; 24 | * **R6** - токопонижающий резистор для светодиодов, достаточно одного, т.к. одновременно они не горят; 25 | * **R7** и **R8** - делитель напряжения для одного из входов компаратора, чтобы считывать ключи Cyfral; 26 | * **Q1** - транзистор для определения подключения к USB; 27 | * **Q2** - транзистор для включения земли на считывателе и эмуляторе, чтобы не сажать батарейки, случайно замкнув контакты в кармане; 28 | * **C1**, **C2** и **C3** - конденсаторы для фильтрации питания; 29 | * **SW1** - единственная кнопка для управления устройством; 30 | * **LEDS** - семь светодиодов в форме восьмёрочки для отображения номера ключа. 31 | 32 | Вариант печатной платы: 33 | 34 | ![Board](ibutton_board.png) 35 | 36 | Процесс прошивки 37 | ---------------- 38 | Рекомендуется сначала прошить бутлоадер из директории "Bootloader", чтобы потом иметь возможность обновлять прошивку по USB, без подключения программатора. Бутлоадер сконфигурирован так, что режим обновления прошивки будет включаться, если при запуске (не при пробуждении!) устройства зажата кнопка (она одна), при этом в режиме бутлоадера будет гореть средний светодиод. 39 | Фьюзы: 40 | * Low: 0xE4 41 | * High: 0xDA 42 | 43 | После запуска бутлоадера для обновления или первичной установки прошивки нужно просто подключить устройство по USB, определить его виртуальный COM порт, вписать его в Makefile и набрать "make program". 44 | 45 | Если бутлоадер не нужен, то сразу прошивать основную прошивку, используя фьюзы: 46 | * Low: 0xE4 47 | * High: 0xD9 48 | 49 | Использование 50 | ------------- 51 | 52 | Управление производится всего одной кнопкой. При её первом нажатии устройство включается. Кратковременным нажатием кнопки производится выбор ключа, номер которого отображается светодиодами. Когда нужный ключ выбран, достаточно приложить контакты к считывателю домофона. 53 | 54 | Длительное нажатие на кнопку переводит устройство в режим считывания ключей, при этом мигает средний светодиод. В этот момент нужно приложить ключ к контактам считывателя ключей. Если считывание прошло успешно, отобразится номер, под которым ключ занесён в память. 55 | 56 | Если устройство было включено длительным нажатием кнопки, оно отобразит цифру "0", это означает, что включен режим "вездехода", используя не прочитанные заранее ключи, а несколько общеизвестных универсальных кодов, которые работают с некоторыми домофонами. 57 | 58 | Подключение по USB 59 | ------------------ 60 | Для синхронизации с компьютером используется USB. Клиент под Windows: https://github.com/ClusterM/ibutton_client 61 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | MCU_PROGRAMMER = m8 2 | PROGRAMMER_TYPE = avr109 3 | PROGRAMMER_PORT = com3 4 | 5 | PRG = ibutton 6 | OBJ = main.o usart.o onewire.o cyfral.o usb.o metacom.o 7 | #MCU_TARGET = at90s2313 8 | #MCU_TARGET = at90s2333 9 | #MCU_TARGET = at90s4414 10 | #MCU_TARGET = at90s4433 11 | #MCU_TARGET = at90s4434 12 | #MCU_TARGET = at90s8515 13 | #MCU_TARGET = at90s8535 14 | #MCU_TARGET = atmega128 15 | #MCU_TARGET = atmega1280 16 | #MCU_TARGET = atmega1281 17 | #MCU_TARGET = atmega16 18 | #MCU_TARGET = atmega163 19 | #MCU_TARGET = atmega164p 20 | #MCU_TARGET = atmega165 21 | #MCU_TARGET = atmega165p 22 | #MCU_TARGET = atmega168 23 | #MCU_TARGET = atmega169 24 | #MCU_TARGET = atmega169p 25 | #MCU_TARGET = atmega32 26 | #MCU_TARGET = atmega324p 27 | #MCU_TARGET = atmega325 28 | #MCU_TARGET = atmega3250 29 | #MCU_TARGET = atmega329 30 | #MCU_TARGET = atmega3290 31 | #MCU_TARGET = atmega48 32 | #MCU_TARGET = atmega64 33 | #MCU_TARGET = atmega640 34 | #MCU_TARGET = atmega644 35 | #MCU_TARGET = atmega644p 36 | #MCU_TARGET = atmega645 37 | #MCU_TARGET = atmega6450 38 | #MCU_TARGET = atmega649 39 | #MCU_TARGET = atmega6490 40 | MCU_TARGET = atmega8 41 | #MCU_TARGET = atmega8515 42 | #MCU_TARGET = atmega8535 43 | #MCU_TARGET = atmega88 44 | #MCU_TARGET = attiny2313 45 | #MCU_TARGET = attiny24 46 | #MCU_TARGET = attiny25 47 | #MCU_TARGET = attiny26 48 | #MCU_TARGET = attiny261 49 | #MCU_TARGET = attiny44 50 | #MCU_TARGET = attiny45 51 | #MCU_TARGET = attiny461 52 | #MCU_TARGET = attiny84 53 | #MCU_TARGET = attiny85 54 | #MCU_TARGET = attiny861 55 | OPTIMIZE = -O2 56 | 57 | DEFS = 58 | LIBS = 59 | 60 | # You should not have to change anything below here. 61 | 62 | CC = avr-gcc 63 | 64 | # Override is only needed by avr-lib build system. 65 | 66 | override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) $(DEFS) 67 | override LDFLAGS = -Wl,-Map,$(PRG).map 68 | 69 | OBJCOPY = avr-objcopy 70 | OBJDUMP = avr-objdump 71 | 72 | all: $(PRG).elf lst text eeprom 73 | 74 | $(PRG).elf: $(OBJ) 75 | $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS) 76 | 77 | # dependency: 78 | demo.o: demo.c 79 | 80 | clean: 81 | rm -rf *.o $(PRG).elf *.eps *.png *.pdf *.bak 82 | rm -rf *.lst *.map $(EXTRA_CLEAN_FILES) 83 | 84 | lst: $(PRG).lst 85 | 86 | %.lst: %.elf 87 | $(OBJDUMP) -h -S $< > $@ 88 | 89 | # Rules for building the .text rom images 90 | 91 | text: hex bin srec 92 | 93 | hex: $(PRG).hex 94 | bin: $(PRG).bin 95 | srec: $(PRG).srec 96 | 97 | %.hex: %.elf 98 | $(OBJCOPY) -j .text -j .data -O ihex $< $@ 99 | 100 | %.srec: %.elf 101 | $(OBJCOPY) -j .text -j .data -O srec $< $@ 102 | 103 | %.bin: %.elf 104 | $(OBJCOPY) -j .text -j .data -O binary $< $@ 105 | 106 | # Rules for building the .eeprom rom images 107 | 108 | eeprom: ehex ebin esrec 109 | 110 | ehex: $(PRG)_eeprom.hex 111 | ebin: $(PRG)_eeprom.bin 112 | esrec: $(PRG)_eeprom.srec 113 | 114 | %_eeprom.hex: %.elf 115 | $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ \ 116 | || { echo empty $@ not generated; exit 0; } 117 | 118 | %_eeprom.srec: %.elf 119 | $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O srec $< $@ \ 120 | || { echo empty $@ not generated; exit 0; } 121 | 122 | %_eeprom.bin: %.elf 123 | $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O binary $< $@ \ 124 | || { echo empty $@ not generated; exit 0; } 125 | 126 | # Every thing below here is used by avr-libc's build system and can be ignored 127 | # by the casual user. 128 | 129 | FIG2DEV = fig2dev 130 | EXTRA_CLEAN_FILES = *.hex *.bin *.srec 131 | 132 | dox: eps png pdf 133 | 134 | eps: $(PRG).eps 135 | png: $(PRG).png 136 | pdf: $(PRG).pdf 137 | 138 | %.eps: %.fig 139 | $(FIG2DEV) -L eps $< $@ 140 | 141 | %.pdf: %.fig 142 | $(FIG2DEV) -L pdf $< $@ 143 | 144 | %.png: %.fig 145 | $(FIG2DEV) -L png $< $@ 146 | 147 | program: hex 148 | avrdude -V -p $(MCU_PROGRAMMER) -c $(PROGRAMMER_TYPE) -P $(PROGRAMMER_PORT) -U flash:w:$(PRG).hex 149 | # avrdude -V -p $(MCU_PROGRAMMER) -c avrisp2 -P usb -U flash:w:$(PRG).hex 150 | 151 | read: 152 | avrdude -V -p $(MCU_PROGRAMMER) -c $(PROGRAMMER_TYPE) -P $(PROGRAMMER_PORT) -U eeprom:r:data.bin:r 153 | 154 | -------------------------------------------------------------------------------- /onewire.c: -------------------------------------------------------------------------------- 1 | #include "defines.h" 2 | #include "onewire.h" 3 | #include "onewire_config.h" 4 | #include 5 | #include 6 | #include 7 | 8 | void onewire_port_init() 9 | { 10 | ONEWIRE_DDR &= ~((1 << ONEWIRE_MASTER_TX_PIN) | (1 << ONEWIRE_MASTER_RX_PIN)); 11 | ONEWIRE_PORT &= ~((1 << ONEWIRE_MASTER_TX_PIN) | (1 << ONEWIRE_MASTER_RX_PIN)); 12 | } 13 | 14 | void onewire_init() 15 | { 16 | ONEWIRE_TIMER_INIT; 17 | onewire_port_init(); 18 | } 19 | 20 | // Инициализирует передачу. Возвращает 1, если устройства ответили. 21 | char onewire_write_reset() 22 | { 23 | onewire_port_init(); 24 | int i; 25 | ONEWIRE_DDR |= 1< 100 * ONEWIRE_USEC) 52 | { 53 | t++; 54 | ONEWIRE_TIMER_REG = 0; 55 | } 56 | } 57 | return cbit; 58 | } 59 | 60 | // Читает байт 61 | unsigned char onewire_read_byte() 62 | { 63 | unsigned char res, bit, cbit; 64 | res = 0; 65 | for (bit = 0; bit < 8; bit++) 66 | { 67 | cbit = onewire_read_bit(); 68 | if (cbit) 69 | res |= (1 << bit); 70 | } 71 | return res; 72 | } 73 | 74 | void onewire_write_bit(unsigned char b) 75 | { 76 | onewire_port_init(); 77 | if (b) { ONEWIRE_WRITE1; } else { ONEWIRE_WRITE0;} 78 | } 79 | 80 | void onewire_write_byte(unsigned char b) 81 | { 82 | unsigned char bit; 83 | for (bit = 0; bit < 8; bit++) 84 | { 85 | onewire_write_bit((b >> bit) & 1); 86 | } 87 | } 88 | 89 | // Считает CRC 90 | char onewire_check_crc(unsigned char* data, unsigned char size) 91 | { 92 | uint8_t crc=0; 93 | uint8_t i,j; 94 | for (i=0; i>= 1; 101 | if (mix) 102 | crc ^= 0x8C; 103 | inbyte >>= 1; 104 | } 105 | } 106 | return crc; 107 | } 108 | 109 | 110 | // В буфере только нули? 111 | char onewire_all_zeros(unsigned char* data, unsigned char size) 112 | { 113 | uint8_t i; 114 | for (i=0; i> conflicts) & 1; 147 | conflicts++; 148 | } else if (!bit1 && bit2) 149 | { 150 | rbit = 0; 151 | } 152 | if (rbit) 153 | out[byte] |= 1 << bit; 154 | onewire_write_bit(rbit); 155 | } 156 | } 157 | 158 | return conflicts; 159 | } 160 | 161 | // Итерация поиска 162 | void onewire_search_iter(int num, int depth, void (*f)(unsigned char* out)) 163 | { 164 | unsigned char serial[8]; 165 | int conflicts = onewire_search(num, serial); 166 | if (conflicts < 0) return; 167 | if ((onewire_check_crc(serial, 8) == 0) && !onewire_all_zeros(serial, 8)) 168 | f(serial); 169 | 170 | int d; 171 | for (d = depth+1; d < conflicts; d++) 172 | onewire_search_iter(num | (1UL << d), d, f); // углубляемся. 173 | } 174 | 175 | // Ищет все устройства. f - указатель к функции, которая вызывается для каждого устройства, out - указатель на 8 байт адреса, включая тип и CRC 176 | void onewire_search_all(void (*f)(unsigned char* out)) 177 | { 178 | onewire_search_iter(0, -1, f); 179 | } 180 | #endif 181 | 182 | // Включает мощную подтяжку к VCC 183 | void onewire_pullup() 184 | { 185 | if (ONEWIRE_MASTER_RX) return; 186 | ONEWIRE_PORT |= (1< text 109 | .data : AT (ADDR (.text) + SIZEOF (.text)) 110 | { 111 | PROVIDE (__data_start = .) ; 112 | *(.data) 113 | *(.gnu.linkonce.d*) 114 | . = ALIGN(2); 115 | _edata = . ; 116 | PROVIDE (__data_end = .) ; 117 | } > data 118 | .bss SIZEOF(.data) + ADDR(.data) : 119 | { 120 | PROVIDE (__bss_start = .) ; 121 | *(.bss) 122 | *(COMMON) 123 | PROVIDE (__bss_end = .) ; 124 | } > data 125 | __data_load_start = LOADADDR(.data); 126 | __data_load_end = __data_load_start + SIZEOF(.data); 127 | /* Global data not cleared after reset. */ 128 | .noinit SIZEOF(.bss) + ADDR(.bss) : 129 | { 130 | PROVIDE (__noinit_start = .) ; 131 | *(.noinit*) 132 | PROVIDE (__noinit_end = .) ; 133 | _end = . ; 134 | PROVIDE (__heap_start = .) ; 135 | } > data 136 | .eeprom : 137 | { 138 | *(.eeprom*) 139 | __eeprom_end = . ; 140 | } > eeprom 141 | /* Stabs debugging sections. */ 142 | .stab 0 : { *(.stab) } 143 | .stabstr 0 : { *(.stabstr) } 144 | .stab.excl 0 : { *(.stab.excl) } 145 | .stab.exclstr 0 : { *(.stab.exclstr) } 146 | .stab.index 0 : { *(.stab.index) } 147 | .stab.indexstr 0 : { *(.stab.indexstr) } 148 | .comment 0 : { *(.comment) } 149 | /* DWARF debug sections. 150 | Symbols in the DWARF debugging sections are relative to the beginning 151 | of the section so we begin them at 0. */ 152 | /* DWARF 1 */ 153 | .debug 0 : { *(.debug) } 154 | .line 0 : { *(.line) } 155 | /* GNU DWARF 1 extensions */ 156 | .debug_srcinfo 0 : { *(.debug_srcinfo) } 157 | .debug_sfnames 0 : { *(.debug_sfnames) } 158 | /* DWARF 1.1 and DWARF 2 */ 159 | .debug_aranges 0 : { *(.debug_aranges) } 160 | .debug_pubnames 0 : { *(.debug_pubnames) } 161 | /* DWARF 2 */ 162 | .debug_info 0 : { *(.debug_info) *(.gnu.linkonce.wi.*) } 163 | .debug_abbrev 0 : { *(.debug_abbrev) } 164 | .debug_line 0 : { *(.debug_line) } 165 | .debug_frame 0 : { *(.debug_frame) } 166 | .debug_str 0 : { *(.debug_str) } 167 | .debug_loc 0 : { *(.debug_loc) } 168 | .debug_macinfo 0 : { *(.debug_macinfo) } 169 | } 170 | -------------------------------------------------------------------------------- /Bootloader/ldscripts_no_vector/avr2.x: -------------------------------------------------------------------------------- 1 | /* Default linker script, for normal executables */ 2 | OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr") 3 | OUTPUT_ARCH(avr:2) 4 | MEMORY 5 | { 6 | text (rx) : ORIGIN = 0, LENGTH = 8K 7 | data (rw!x) : ORIGIN = 0x800060, LENGTH = 0xffa0 8 | eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = 64K 9 | } 10 | SECTIONS 11 | { 12 | /* Read-only sections, merged into text segment: */ 13 | .hash : { *(.hash) } 14 | .dynsym : { *(.dynsym) } 15 | .dynstr : { *(.dynstr) } 16 | .gnu.version : { *(.gnu.version) } 17 | .gnu.version_d : { *(.gnu.version_d) } 18 | .gnu.version_r : { *(.gnu.version_r) } 19 | .rel.init : { *(.rel.init) } 20 | .rela.init : { *(.rela.init) } 21 | .rel.text : 22 | { 23 | *(.rel.text) 24 | *(.rel.text.*) 25 | *(.rel.gnu.linkonce.t*) 26 | } 27 | .rela.text : 28 | { 29 | *(.rela.text) 30 | *(.rela.text.*) 31 | *(.rela.gnu.linkonce.t*) 32 | } 33 | .rel.fini : { *(.rel.fini) } 34 | .rela.fini : { *(.rela.fini) } 35 | .rel.rodata : 36 | { 37 | *(.rel.rodata) 38 | *(.rel.rodata.*) 39 | *(.rel.gnu.linkonce.r*) 40 | } 41 | .rela.rodata : 42 | { 43 | *(.rela.rodata) 44 | *(.rela.rodata.*) 45 | *(.rela.gnu.linkonce.r*) 46 | } 47 | .rel.data : 48 | { 49 | *(.rel.data) 50 | *(.rel.data.*) 51 | *(.rel.gnu.linkonce.d*) 52 | } 53 | .rela.data : 54 | { 55 | *(.rela.data) 56 | *(.rela.data.*) 57 | *(.rela.gnu.linkonce.d*) 58 | } 59 | .rel.ctors : { *(.rel.ctors) } 60 | .rela.ctors : { *(.rela.ctors) } 61 | .rel.dtors : { *(.rel.dtors) } 62 | .rela.dtors : { *(.rela.dtors) } 63 | .rel.got : { *(.rel.got) } 64 | .rela.got : { *(.rela.got) } 65 | .rel.bss : { *(.rel.bss) } 66 | .rela.bss : { *(.rela.bss) } 67 | .rel.plt : { *(.rel.plt) } 68 | .rela.plt : { *(.rela.plt) } 69 | /* Internal text space or external memory */ 70 | /DISCARD/ : { *(.vectors); } 71 | .text : 72 | { 73 | /* *(.vectors) */ 74 | __ctors_start = . ; 75 | *(.ctors) 76 | __ctors_end = . ; 77 | __dtors_start = . ; 78 | *(.dtors) 79 | __dtors_end = . ; 80 | *(.progmem.gcc*) 81 | *(.progmem*) 82 | . = ALIGN(2); 83 | *(.init0) /* Start here after reset. */ 84 | *(.init1) 85 | *(.init2) /* Clear __zero_reg__, set up stack pointer. */ 86 | *(.init3) 87 | *(.init4) /* Initialize data and BSS. */ 88 | *(.init5) 89 | *(.init6) /* C++ constructors. */ 90 | *(.init7) 91 | *(.init8) 92 | *(.init9) /* Call main(). */ 93 | *(.text) 94 | . = ALIGN(2); 95 | *(.text.*) 96 | . = ALIGN(2); 97 | *(.fini9) /* _exit() starts here. */ 98 | *(.fini8) 99 | *(.fini7) 100 | *(.fini6) /* C++ destructors. */ 101 | *(.fini5) 102 | *(.fini4) 103 | *(.fini3) 104 | *(.fini2) 105 | *(.fini1) 106 | *(.fini0) /* Infinite loop after program termination. */ 107 | _etext = . ; 108 | } > text 109 | .data : AT (ADDR (.text) + SIZEOF (.text)) 110 | { 111 | PROVIDE (__data_start = .) ; 112 | *(.data) 113 | *(.gnu.linkonce.d*) 114 | . = ALIGN(2); 115 | _edata = . ; 116 | PROVIDE (__data_end = .) ; 117 | } > data 118 | .bss SIZEOF(.data) + ADDR(.data) : 119 | { 120 | PROVIDE (__bss_start = .) ; 121 | *(.bss) 122 | *(COMMON) 123 | PROVIDE (__bss_end = .) ; 124 | } > data 125 | __data_load_start = LOADADDR(.data); 126 | __data_load_end = __data_load_start + SIZEOF(.data); 127 | /* Global data not cleared after reset. */ 128 | .noinit SIZEOF(.bss) + ADDR(.bss) : 129 | { 130 | PROVIDE (__noinit_start = .) ; 131 | *(.noinit*) 132 | PROVIDE (__noinit_end = .) ; 133 | _end = . ; 134 | PROVIDE (__heap_start = .) ; 135 | } > data 136 | .eeprom : 137 | { 138 | *(.eeprom*) 139 | __eeprom_end = . ; 140 | } > eeprom 141 | /* Stabs debugging sections. */ 142 | .stab 0 : { *(.stab) } 143 | .stabstr 0 : { *(.stabstr) } 144 | .stab.excl 0 : { *(.stab.excl) } 145 | .stab.exclstr 0 : { *(.stab.exclstr) } 146 | .stab.index 0 : { *(.stab.index) } 147 | .stab.indexstr 0 : { *(.stab.indexstr) } 148 | .comment 0 : { *(.comment) } 149 | /* DWARF debug sections. 150 | Symbols in the DWARF debugging sections are relative to the beginning 151 | of the section so we begin them at 0. */ 152 | /* DWARF 1 */ 153 | .debug 0 : { *(.debug) } 154 | .line 0 : { *(.line) } 155 | /* GNU DWARF 1 extensions */ 156 | .debug_srcinfo 0 : { *(.debug_srcinfo) } 157 | .debug_sfnames 0 : { *(.debug_sfnames) } 158 | /* DWARF 1.1 and DWARF 2 */ 159 | .debug_aranges 0 : { *(.debug_aranges) } 160 | .debug_pubnames 0 : { *(.debug_pubnames) } 161 | /* DWARF 2 */ 162 | .debug_info 0 : { *(.debug_info) *(.gnu.linkonce.wi.*) } 163 | .debug_abbrev 0 : { *(.debug_abbrev) } 164 | .debug_line 0 : { *(.debug_line) } 165 | .debug_frame 0 : { *(.debug_frame) } 166 | .debug_str 0 : { *(.debug_str) } 167 | .debug_loc 0 : { *(.debug_loc) } 168 | .debug_macinfo 0 : { *(.debug_macinfo) } 169 | } 170 | -------------------------------------------------------------------------------- /Bootloader/ldscripts_no_vector/avr3.x: -------------------------------------------------------------------------------- 1 | /* Default linker script, for normal executables */ 2 | OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr") 3 | OUTPUT_ARCH(avr:3) 4 | MEMORY 5 | { 6 | text (rx) : ORIGIN = 0, LENGTH = 128K 7 | data (rw!x) : ORIGIN = 0x800060, LENGTH = 0xffa0 8 | eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = 64K 9 | } 10 | SECTIONS 11 | { 12 | /* Read-only sections, merged into text segment: */ 13 | .hash : { *(.hash) } 14 | .dynsym : { *(.dynsym) } 15 | .dynstr : { *(.dynstr) } 16 | .gnu.version : { *(.gnu.version) } 17 | .gnu.version_d : { *(.gnu.version_d) } 18 | .gnu.version_r : { *(.gnu.version_r) } 19 | .rel.init : { *(.rel.init) } 20 | .rela.init : { *(.rela.init) } 21 | .rel.text : 22 | { 23 | *(.rel.text) 24 | *(.rel.text.*) 25 | *(.rel.gnu.linkonce.t*) 26 | } 27 | .rela.text : 28 | { 29 | *(.rela.text) 30 | *(.rela.text.*) 31 | *(.rela.gnu.linkonce.t*) 32 | } 33 | .rel.fini : { *(.rel.fini) } 34 | .rela.fini : { *(.rela.fini) } 35 | .rel.rodata : 36 | { 37 | *(.rel.rodata) 38 | *(.rel.rodata.*) 39 | *(.rel.gnu.linkonce.r*) 40 | } 41 | .rela.rodata : 42 | { 43 | *(.rela.rodata) 44 | *(.rela.rodata.*) 45 | *(.rela.gnu.linkonce.r*) 46 | } 47 | .rel.data : 48 | { 49 | *(.rel.data) 50 | *(.rel.data.*) 51 | *(.rel.gnu.linkonce.d*) 52 | } 53 | .rela.data : 54 | { 55 | *(.rela.data) 56 | *(.rela.data.*) 57 | *(.rela.gnu.linkonce.d*) 58 | } 59 | .rel.ctors : { *(.rel.ctors) } 60 | .rela.ctors : { *(.rela.ctors) } 61 | .rel.dtors : { *(.rel.dtors) } 62 | .rela.dtors : { *(.rela.dtors) } 63 | .rel.got : { *(.rel.got) } 64 | .rela.got : { *(.rela.got) } 65 | .rel.bss : { *(.rel.bss) } 66 | .rela.bss : { *(.rela.bss) } 67 | .rel.plt : { *(.rel.plt) } 68 | .rela.plt : { *(.rela.plt) } 69 | /* Internal text space or external memory */ 70 | /DISCARD/ : { *(.vectors); } 71 | .text : 72 | { 73 | /* *(.vectors) */ 74 | __ctors_start = . ; 75 | *(.ctors) 76 | __ctors_end = . ; 77 | __dtors_start = . ; 78 | *(.dtors) 79 | __dtors_end = . ; 80 | *(.progmem.gcc*) 81 | *(.progmem*) 82 | . = ALIGN(2); 83 | *(.init0) /* Start here after reset. */ 84 | *(.init1) 85 | *(.init2) /* Clear __zero_reg__, set up stack pointer. */ 86 | *(.init3) 87 | *(.init4) /* Initialize data and BSS. */ 88 | *(.init5) 89 | *(.init6) /* C++ constructors. */ 90 | *(.init7) 91 | *(.init8) 92 | *(.init9) /* Call main(). */ 93 | *(.text) 94 | . = ALIGN(2); 95 | *(.text.*) 96 | . = ALIGN(2); 97 | *(.fini9) /* _exit() starts here. */ 98 | *(.fini8) 99 | *(.fini7) 100 | *(.fini6) /* C++ destructors. */ 101 | *(.fini5) 102 | *(.fini4) 103 | *(.fini3) 104 | *(.fini2) 105 | *(.fini1) 106 | *(.fini0) /* Infinite loop after program termination. */ 107 | _etext = . ; 108 | } > text 109 | .data : AT (ADDR (.text) + SIZEOF (.text)) 110 | { 111 | PROVIDE (__data_start = .) ; 112 | *(.data) 113 | *(.gnu.linkonce.d*) 114 | . = ALIGN(2); 115 | _edata = . ; 116 | PROVIDE (__data_end = .) ; 117 | } > data 118 | .bss SIZEOF(.data) + ADDR(.data) : 119 | { 120 | PROVIDE (__bss_start = .) ; 121 | *(.bss) 122 | *(COMMON) 123 | PROVIDE (__bss_end = .) ; 124 | } > data 125 | __data_load_start = LOADADDR(.data); 126 | __data_load_end = __data_load_start + SIZEOF(.data); 127 | /* Global data not cleared after reset. */ 128 | .noinit SIZEOF(.bss) + ADDR(.bss) : 129 | { 130 | PROVIDE (__noinit_start = .) ; 131 | *(.noinit*) 132 | PROVIDE (__noinit_end = .) ; 133 | _end = . ; 134 | PROVIDE (__heap_start = .) ; 135 | } > data 136 | .eeprom : 137 | { 138 | *(.eeprom*) 139 | __eeprom_end = . ; 140 | } > eeprom 141 | /* Stabs debugging sections. */ 142 | .stab 0 : { *(.stab) } 143 | .stabstr 0 : { *(.stabstr) } 144 | .stab.excl 0 : { *(.stab.excl) } 145 | .stab.exclstr 0 : { *(.stab.exclstr) } 146 | .stab.index 0 : { *(.stab.index) } 147 | .stab.indexstr 0 : { *(.stab.indexstr) } 148 | .comment 0 : { *(.comment) } 149 | /* DWARF debug sections. 150 | Symbols in the DWARF debugging sections are relative to the beginning 151 | of the section so we begin them at 0. */ 152 | /* DWARF 1 */ 153 | .debug 0 : { *(.debug) } 154 | .line 0 : { *(.line) } 155 | /* GNU DWARF 1 extensions */ 156 | .debug_srcinfo 0 : { *(.debug_srcinfo) } 157 | .debug_sfnames 0 : { *(.debug_sfnames) } 158 | /* DWARF 1.1 and DWARF 2 */ 159 | .debug_aranges 0 : { *(.debug_aranges) } 160 | .debug_pubnames 0 : { *(.debug_pubnames) } 161 | /* DWARF 2 */ 162 | .debug_info 0 : { *(.debug_info) *(.gnu.linkonce.wi.*) } 163 | .debug_abbrev 0 : { *(.debug_abbrev) } 164 | .debug_line 0 : { *(.debug_line) } 165 | .debug_frame 0 : { *(.debug_frame) } 166 | .debug_str 0 : { *(.debug_str) } 167 | .debug_loc 0 : { *(.debug_loc) } 168 | .debug_macinfo 0 : { *(.debug_macinfo) } 169 | } 170 | -------------------------------------------------------------------------------- /Bootloader/ldscripts_no_vector/avr4.x: -------------------------------------------------------------------------------- 1 | /* MODIFIED LINKER SCRIPT - BOOTLOADER: without .vectors */ 2 | OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr") 3 | OUTPUT_ARCH(avr:4) 4 | MEMORY 5 | { 6 | text (rx) : ORIGIN = 0, LENGTH = 8K 7 | data (rw!x) : ORIGIN = 0x800060, LENGTH = 0xffa0 8 | eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = 64K 9 | } 10 | SECTIONS 11 | { 12 | /* Read-only sections, merged into text segment: */ 13 | .hash : { *(.hash) } 14 | .dynsym : { *(.dynsym) } 15 | .dynstr : { *(.dynstr) } 16 | .gnu.version : { *(.gnu.version) } 17 | .gnu.version_d : { *(.gnu.version_d) } 18 | .gnu.version_r : { *(.gnu.version_r) } 19 | .rel.init : { *(.rel.init) } 20 | .rela.init : { *(.rela.init) } 21 | .rel.text : 22 | { 23 | *(.rel.text) 24 | *(.rel.text.*) 25 | *(.rel.gnu.linkonce.t*) 26 | } 27 | .rela.text : 28 | { 29 | *(.rela.text) 30 | *(.rela.text.*) 31 | *(.rela.gnu.linkonce.t*) 32 | } 33 | .rel.fini : { *(.rel.fini) } 34 | .rela.fini : { *(.rela.fini) } 35 | .rel.rodata : 36 | { 37 | *(.rel.rodata) 38 | *(.rel.rodata.*) 39 | *(.rel.gnu.linkonce.r*) 40 | } 41 | .rela.rodata : 42 | { 43 | *(.rela.rodata) 44 | *(.rela.rodata.*) 45 | *(.rela.gnu.linkonce.r*) 46 | } 47 | .rel.data : 48 | { 49 | *(.rel.data) 50 | *(.rel.data.*) 51 | *(.rel.gnu.linkonce.d*) 52 | } 53 | .rela.data : 54 | { 55 | *(.rela.data) 56 | *(.rela.data.*) 57 | *(.rela.gnu.linkonce.d*) 58 | } 59 | .rel.ctors : { *(.rel.ctors) } 60 | .rela.ctors : { *(.rela.ctors) } 61 | .rel.dtors : { *(.rel.dtors) } 62 | .rela.dtors : { *(.rela.dtors) } 63 | .rel.got : { *(.rel.got) } 64 | .rela.got : { *(.rela.got) } 65 | .rel.bss : { *(.rel.bss) } 66 | .rela.bss : { *(.rela.bss) } 67 | .rel.plt : { *(.rel.plt) } 68 | .rela.plt : { *(.rela.plt) } 69 | /* Internal text space or external memory */ 70 | /DISCARD/ : { *(.vectors); } 71 | .text : 72 | { 73 | /* *(.vectors) */ 74 | __ctors_start = . ; 75 | *(.ctors) 76 | __ctors_end = . ; 77 | __dtors_start = . ; 78 | *(.dtors) 79 | __dtors_end = . ; 80 | *(.progmem.gcc*) 81 | *(.progmem*) 82 | . = ALIGN(2); 83 | *(.init0) /* Start here after reset. */ 84 | *(.init1) 85 | *(.init2) /* Clear __zero_reg__, set up stack pointer. */ 86 | *(.init3) 87 | *(.init4) /* Initialize data and BSS. */ 88 | *(.init5) 89 | *(.init6) /* C++ constructors. */ 90 | *(.init7) 91 | *(.init8) 92 | *(.init9) /* Call main(). */ 93 | *(.text) 94 | . = ALIGN(2); 95 | *(.text.*) 96 | . = ALIGN(2); 97 | *(.fini9) /* _exit() starts here. */ 98 | *(.fini8) 99 | *(.fini7) 100 | *(.fini6) /* C++ destructors. */ 101 | *(.fini5) 102 | *(.fini4) 103 | *(.fini3) 104 | *(.fini2) 105 | *(.fini1) 106 | *(.fini0) /* Infinite loop after program termination. */ 107 | _etext = . ; 108 | } > text 109 | .data : AT (ADDR (.text) + SIZEOF (.text)) 110 | { 111 | PROVIDE (__data_start = .) ; 112 | *(.data) 113 | *(.gnu.linkonce.d*) 114 | . = ALIGN(2); 115 | _edata = . ; 116 | PROVIDE (__data_end = .) ; 117 | } > data 118 | .bss SIZEOF(.data) + ADDR(.data) : 119 | { 120 | PROVIDE (__bss_start = .) ; 121 | *(.bss) 122 | *(COMMON) 123 | PROVIDE (__bss_end = .) ; 124 | } > data 125 | __data_load_start = LOADADDR(.data); 126 | __data_load_end = __data_load_start + SIZEOF(.data); 127 | /* Global data not cleared after reset. */ 128 | .noinit SIZEOF(.bss) + ADDR(.bss) : 129 | { 130 | PROVIDE (__noinit_start = .) ; 131 | *(.noinit*) 132 | PROVIDE (__noinit_end = .) ; 133 | _end = . ; 134 | PROVIDE (__heap_start = .) ; 135 | } > data 136 | .eeprom : 137 | { 138 | *(.eeprom*) 139 | __eeprom_end = . ; 140 | } > eeprom 141 | /* Stabs debugging sections. */ 142 | .stab 0 : { *(.stab) } 143 | .stabstr 0 : { *(.stabstr) } 144 | .stab.excl 0 : { *(.stab.excl) } 145 | .stab.exclstr 0 : { *(.stab.exclstr) } 146 | .stab.index 0 : { *(.stab.index) } 147 | .stab.indexstr 0 : { *(.stab.indexstr) } 148 | .comment 0 : { *(.comment) } 149 | /* DWARF debug sections. 150 | Symbols in the DWARF debugging sections are relative to the beginning 151 | of the section so we begin them at 0. */ 152 | /* DWARF 1 */ 153 | .debug 0 : { *(.debug) } 154 | .line 0 : { *(.line) } 155 | /* GNU DWARF 1 extensions */ 156 | .debug_srcinfo 0 : { *(.debug_srcinfo) } 157 | .debug_sfnames 0 : { *(.debug_sfnames) } 158 | /* DWARF 1.1 and DWARF 2 */ 159 | .debug_aranges 0 : { *(.debug_aranges) } 160 | .debug_pubnames 0 : { *(.debug_pubnames) } 161 | /* DWARF 2 */ 162 | .debug_info 0 : { *(.debug_info) *(.gnu.linkonce.wi.*) } 163 | .debug_abbrev 0 : { *(.debug_abbrev) } 164 | .debug_line 0 : { *(.debug_line) } 165 | .debug_frame 0 : { *(.debug_frame) } 166 | .debug_str 0 : { *(.debug_str) } 167 | .debug_loc 0 : { *(.debug_loc) } 168 | .debug_macinfo 0 : { *(.debug_macinfo) } 169 | } 170 | -------------------------------------------------------------------------------- /Bootloader/ldscripts_no_vector/avr5.x: -------------------------------------------------------------------------------- 1 | /* MODIFIED LINKER SCRIPT - BOOTLOADER: without .vectors */ 2 | OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr") 3 | OUTPUT_ARCH(avr:5) 4 | MEMORY 5 | { 6 | text (rx) : ORIGIN = 0, LENGTH = 128K 7 | data (rw!x) : ORIGIN = 0x800060, LENGTH = 0xffa0 8 | eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = 64K 9 | } 10 | SECTIONS 11 | { 12 | /* Read-only sections, merged into text segment: */ 13 | .hash : { *(.hash) } 14 | .dynsym : { *(.dynsym) } 15 | .dynstr : { *(.dynstr) } 16 | .gnu.version : { *(.gnu.version) } 17 | .gnu.version_d : { *(.gnu.version_d) } 18 | .gnu.version_r : { *(.gnu.version_r) } 19 | .rel.init : { *(.rel.init) } 20 | .rela.init : { *(.rela.init) } 21 | .rel.text : 22 | { 23 | *(.rel.text) 24 | *(.rel.text.*) 25 | *(.rel.gnu.linkonce.t*) 26 | } 27 | .rela.text : 28 | { 29 | *(.rela.text) 30 | *(.rela.text.*) 31 | *(.rela.gnu.linkonce.t*) 32 | } 33 | .rel.fini : { *(.rel.fini) } 34 | .rela.fini : { *(.rela.fini) } 35 | .rel.rodata : 36 | { 37 | *(.rel.rodata) 38 | *(.rel.rodata.*) 39 | *(.rel.gnu.linkonce.r*) 40 | } 41 | .rela.rodata : 42 | { 43 | *(.rela.rodata) 44 | *(.rela.rodata.*) 45 | *(.rela.gnu.linkonce.r*) 46 | } 47 | .rel.data : 48 | { 49 | *(.rel.data) 50 | *(.rel.data.*) 51 | *(.rel.gnu.linkonce.d*) 52 | } 53 | .rela.data : 54 | { 55 | *(.rela.data) 56 | *(.rela.data.*) 57 | *(.rela.gnu.linkonce.d*) 58 | } 59 | .rel.ctors : { *(.rel.ctors) } 60 | .rela.ctors : { *(.rela.ctors) } 61 | .rel.dtors : { *(.rel.dtors) } 62 | .rela.dtors : { *(.rela.dtors) } 63 | .rel.got : { *(.rel.got) } 64 | .rela.got : { *(.rela.got) } 65 | .rel.bss : { *(.rel.bss) } 66 | .rela.bss : { *(.rela.bss) } 67 | .rel.plt : { *(.rel.plt) } 68 | .rela.plt : { *(.rela.plt) } 69 | 70 | /* Internal text space or external memory */ 71 | 72 | /* BOOTLOADER-MODIFICATION - not interrupt-vectors */ 73 | /DISCARD/ : { *(.vectors) } 74 | .text : 75 | { 76 | /* *(.vectors) */ /* BOOTLOADER-MODIFICATION ! */ 77 | __ctors_start = . ; 78 | *(.ctors) 79 | __ctors_end = . ; 80 | __dtors_start = . ; 81 | *(.dtors) 82 | __dtors_end = . ; 83 | *(.progmem.gcc*) 84 | *(.progmem*) 85 | . = ALIGN(2); 86 | *(.init0) /* Start here after reset. */ 87 | *(.init1) 88 | *(.init2) /* Clear __zero_reg__, set up stack pointer. */ 89 | *(.init3) 90 | *(.init4) /* Initialize data and BSS. */ 91 | *(.init5) 92 | *(.init6) /* C++ constructors. */ 93 | *(.init7) 94 | *(.init8) 95 | *(.init9) /* Call main(). */ 96 | *(.text) 97 | . = ALIGN(2); 98 | *(.text.*) 99 | . = ALIGN(2); 100 | *(.fini9) /* _exit() starts here. */ 101 | *(.fini8) 102 | *(.fini7) 103 | *(.fini6) /* C++ destructors. */ 104 | *(.fini5) 105 | *(.fini4) 106 | *(.fini3) 107 | *(.fini2) 108 | *(.fini1) 109 | *(.fini0) /* Infinite loop after program termination. */ 110 | _etext = . ; 111 | } > text 112 | .data : AT (ADDR (.text) + SIZEOF (.text)) 113 | { 114 | PROVIDE (__data_start = .) ; 115 | *(.data) 116 | *(.gnu.linkonce.d*) 117 | . = ALIGN(2); 118 | _edata = . ; 119 | PROVIDE (__data_end = .) ; 120 | } > data 121 | .bss SIZEOF(.data) + ADDR(.data) : 122 | { 123 | PROVIDE (__bss_start = .) ; 124 | *(.bss) 125 | *(COMMON) 126 | PROVIDE (__bss_end = .) ; 127 | } > data 128 | __data_load_start = LOADADDR(.data); 129 | __data_load_end = __data_load_start + SIZEOF(.data); 130 | /* Global data not cleared after reset. */ 131 | .noinit SIZEOF(.bss) + ADDR(.bss) : 132 | { 133 | PROVIDE (__noinit_start = .) ; 134 | *(.noinit*) 135 | PROVIDE (__noinit_end = .) ; 136 | _end = . ; 137 | PROVIDE (__heap_start = .) ; 138 | } > data 139 | .eeprom : 140 | { 141 | *(.eeprom*) 142 | __eeprom_end = . ; 143 | } > eeprom 144 | /* Stabs debugging sections. */ 145 | .stab 0 : { *(.stab) } 146 | .stabstr 0 : { *(.stabstr) } 147 | .stab.excl 0 : { *(.stab.excl) } 148 | .stab.exclstr 0 : { *(.stab.exclstr) } 149 | .stab.index 0 : { *(.stab.index) } 150 | .stab.indexstr 0 : { *(.stab.indexstr) } 151 | .comment 0 : { *(.comment) } 152 | /* DWARF debug sections. 153 | Symbols in the DWARF debugging sections are relative to the beginning 154 | of the section so we begin them at 0. */ 155 | /* DWARF 1 */ 156 | .debug 0 : { *(.debug) } 157 | .line 0 : { *(.line) } 158 | /* GNU DWARF 1 extensions */ 159 | .debug_srcinfo 0 : { *(.debug_srcinfo) } 160 | .debug_sfnames 0 : { *(.debug_sfnames) } 161 | /* DWARF 1.1 and DWARF 2 */ 162 | .debug_aranges 0 : { *(.debug_aranges) } 163 | .debug_pubnames 0 : { *(.debug_pubnames) } 164 | /* DWARF 2 */ 165 | .debug_info 0 : { *(.debug_info) *(.gnu.linkonce.wi.*) } 166 | .debug_abbrev 0 : { *(.debug_abbrev) } 167 | .debug_line 0 : { *(.debug_line) } 168 | .debug_frame 0 : { *(.debug_frame) } 169 | .debug_str 0 : { *(.debug_str) } 170 | .debug_loc 0 : { *(.debug_loc) } 171 | .debug_macinfo 0 : { *(.debug_macinfo) } 172 | } 173 | -------------------------------------------------------------------------------- /ibutton.sch: -------------------------------------------------------------------------------- 1 | EESchema Schematic File Version 2 2 | LIBS:power 3 | LIBS:device 4 | LIBS:transistors 5 | LIBS:conn 6 | LIBS:linear 7 | LIBS:regul 8 | LIBS:74xx 9 | LIBS:cmos4000 10 | LIBS:adc-dac 11 | LIBS:memory 12 | LIBS:xilinx 13 | LIBS:special 14 | LIBS:microcontrollers 15 | LIBS:dsp 16 | LIBS:microchip 17 | LIBS:analog_switches 18 | LIBS:motorola 19 | LIBS:texas 20 | LIBS:intel 21 | LIBS:audio 22 | LIBS:interface 23 | LIBS:digital-audio 24 | LIBS:philips 25 | LIBS:display 26 | LIBS:cypress 27 | LIBS:siliconi 28 | LIBS:opto 29 | LIBS:atmel 30 | LIBS:contrib 31 | LIBS:valves 32 | EELAYER 27 0 33 | EELAYER END 34 | $Descr A4 11693 8268 35 | encoding utf-8 36 | Sheet 1 1 37 | Title "" 38 | Date "22 jan 2014" 39 | Rev "" 40 | Comp "" 41 | Comment1 "" 42 | Comment2 "" 43 | Comment3 "" 44 | Comment4 "" 45 | $EndDescr 46 | $Comp 47 | L ATMEGA8-AI IC1 48 | U 1 1 52DFE0CA 49 | P 4950 2250 50 | F 0 "IC1" H 4200 3450 40 0000 L BNN 51 | F 1 "ATMEGA8-AI" H 5450 700 40 0000 L BNN 52 | F 2 "TQFP32" H 4950 2250 30 0000 C CIN 53 | F 3 "" H 4950 2250 60 0000 C CNN 54 | 1 4950 2250 55 | 1 0 0 -1 56 | $EndComp 57 | $Comp 58 | L FT232RL U1 59 | U 1 1 52DFE134 60 | P 6350 5400 61 | F 0 "U1" H 6350 6300 60 0000 C CNN 62 | F 1 "FT232RL" H 6750 4400 60 0000 L CNN 63 | F 2 "" H 6350 5400 60 0000 C CNN 64 | F 3 "" H 6350 5400 60 0000 C CNN 65 | 1 6350 5400 66 | 1 0 0 -1 67 | $EndComp 68 | $Comp 69 | L USB-MINI-B CON1 70 | U 1 1 52DFE1A2 71 | P 3850 5350 72 | F 0 "CON1" H 3600 5800 60 0000 C CNN 73 | F 1 "USB-MINI-B" H 3800 4850 60 0000 C CNN 74 | F 2 "~" H 3850 5350 60 0000 C CNN 75 | F 3 "~" H 3850 5350 60 0000 C CNN 76 | 1 3850 5350 77 | 1 0 0 -1 78 | $EndComp 79 | $Comp 80 | L LTS-6980HR LEDS 81 | U 1 1 52DFE35A 82 | P 7150 1650 83 | F 0 "LEDS" H 7150 2200 60 0000 C CNN 84 | F 1 "LEDS" H 7150 1200 60 0000 C CNN 85 | F 2 "" H 7150 1650 60 0000 C CNN 86 | F 3 "" H 7150 1650 60 0000 C CNN 87 | 1 7150 1650 88 | 1 0 0 -1 89 | $EndComp 90 | $Comp 91 | L BC547 Q1 92 | U 1 1 52DFE525 93 | P 6600 3950 94 | F 0 "Q1" H 6600 3801 40 0000 R CNN 95 | F 1 "BC847" H 6600 4100 40 0000 R CNN 96 | F 2 "SOT23" H 6500 4052 29 0000 C CNN 97 | F 3 "~" H 6600 3950 60 0000 C CNN 98 | 1 6600 3950 99 | 1 0 0 -1 100 | $EndComp 101 | $Comp 102 | L SW_PUSH SW1 103 | U 1 1 52DFE59E 104 | P 6600 3150 105 | F 0 "SW1" H 6750 3260 50 0000 C CNN 106 | F 1 "SW_PUSH" H 6600 3070 50 0000 C CNN 107 | F 2 "~" H 6600 3150 60 0000 C CNN 108 | F 3 "~" H 6600 3150 60 0000 C CNN 109 | 1 6600 3150 110 | 1 0 0 -1 111 | $EndComp 112 | $Comp 113 | L DIODESCH D2 114 | U 1 1 52DFE689 115 | P 3250 2050 116 | F 0 "D2" H 3250 2150 40 0000 C CNN 117 | F 1 "DIODESCH" H 3250 1950 40 0000 C CNN 118 | F 2 "~" H 3250 2050 60 0000 C CNN 119 | F 3 "~" H 3250 2050 60 0000 C CNN 120 | 1 3250 2050 121 | 0 -1 -1 0 122 | $EndComp 123 | $Comp 124 | L GND #PWR? 125 | U 1 1 52DFE88F 126 | P 7750 1800 127 | F 0 "#PWR?" H 7750 1800 30 0001 C CNN 128 | F 1 "GND" H 7750 1730 30 0001 C CNN 129 | F 2 "" H 7750 1800 60 0000 C CNN 130 | F 3 "" H 7750 1800 60 0000 C CNN 131 | 1 7750 1800 132 | 1 0 0 -1 133 | $EndComp 134 | $Comp 135 | L GND #PWR? 136 | U 1 1 52DFEBBE 137 | P 3300 5800 138 | F 0 "#PWR?" H 3300 5800 30 0001 C CNN 139 | F 1 "GND" H 3300 5730 30 0001 C CNN 140 | F 2 "" H 3300 5800 60 0000 C CNN 141 | F 3 "" H 3300 5800 60 0000 C CNN 142 | 1 3300 5800 143 | 1 0 0 -1 144 | $EndComp 145 | $Comp 146 | L GND #PWR? 147 | U 1 1 52DFEC26 148 | P 6200 6850 149 | F 0 "#PWR?" H 6200 6850 30 0001 C CNN 150 | F 1 "GND" H 6200 6780 30 0001 C CNN 151 | F 2 "" H 6200 6850 60 0000 C CNN 152 | F 3 "" H 6200 6850 60 0000 C CNN 153 | 1 6200 6850 154 | 1 0 0 -1 155 | $EndComp 156 | $Comp 157 | L C C3 158 | U 1 1 52DFEC79 159 | P 5400 6450 160 | F 0 "C3" H 5400 6550 40 0000 L CNN 161 | F 1 "0.1uF" H 5406 6365 40 0000 L CNN 162 | F 2 "~" H 5438 6300 30 0000 C CNN 163 | F 3 "~" H 5400 6450 60 0000 C CNN 164 | 1 5400 6450 165 | 1 0 0 -1 166 | $EndComp 167 | $Comp 168 | L C C2 169 | U 1 1 52DFECE4 170 | P 5100 6450 171 | F 0 "C2" H 5100 6550 40 0000 L CNN 172 | F 1 "0.1uF" H 5106 6365 40 0000 L CNN 173 | F 2 "~" H 5138 6300 30 0000 C CNN 174 | F 3 "~" H 5100 6450 60 0000 C CNN 175 | 1 5100 6450 176 | 1 0 0 -1 177 | $EndComp 178 | $Comp 179 | L GND #PWR? 180 | U 1 1 52DFEDA6 181 | P 6900 3450 182 | F 0 "#PWR?" H 6900 3450 30 0001 C CNN 183 | F 1 "GND" H 6900 3380 30 0001 C CNN 184 | F 2 "" H 6900 3450 60 0000 C CNN 185 | F 3 "" H 6900 3450 60 0000 C CNN 186 | 1 6900 3450 187 | 1 0 0 -1 188 | $EndComp 189 | $Comp 190 | L DIODESCH D1 191 | U 1 1 52DFEE61 192 | P 3250 1450 193 | F 0 "D1" H 3250 1550 40 0000 C CNN 194 | F 1 "DIODESCH" H 3250 1350 40 0000 C CNN 195 | F 2 "~" H 3250 1450 60 0000 C CNN 196 | F 3 "~" H 3250 1450 60 0000 C CNN 197 | 1 3250 1450 198 | 0 1 1 0 199 | $EndComp 200 | $Comp 201 | L GND #PWR? 202 | U 1 1 52DFEEB0 203 | P 4900 4100 204 | F 0 "#PWR?" H 4900 4100 30 0001 C CNN 205 | F 1 "GND" H 4900 4030 30 0001 C CNN 206 | F 2 "" H 4900 4100 60 0000 C CNN 207 | F 3 "" H 4900 4100 60 0000 C CNN 208 | 1 4900 4100 209 | 1 0 0 -1 210 | $EndComp 211 | $Comp 212 | L BATTERY BT1 213 | U 1 1 52DFF02C 214 | P 2400 1150 215 | F 0 "BT1" H 2400 1350 50 0000 C CNN 216 | F 1 "BATTERY" H 2400 960 50 0000 C CNN 217 | F 2 "~" H 2400 1150 60 0000 C CNN 218 | F 3 "~" H 2400 1150 60 0000 C CNN 219 | 1 2400 1150 220 | -1 0 0 1 221 | $EndComp 222 | $Comp 223 | L GND #PWR? 224 | U 1 1 52DFF091 225 | P 2100 1500 226 | F 0 "#PWR?" H 2100 1500 30 0001 C CNN 227 | F 1 "GND" H 2100 1430 30 0001 C CNN 228 | F 2 "" H 2100 1500 60 0000 C CNN 229 | F 3 "" H 2100 1500 60 0000 C CNN 230 | 1 2100 1500 231 | 1 0 0 -1 232 | $EndComp 233 | $Comp 234 | L GND #PWR? 235 | U 1 1 52DFF0E2 236 | P 6700 4200 237 | F 0 "#PWR?" H 6700 4200 30 0001 C CNN 238 | F 1 "GND" H 6700 4130 30 0001 C CNN 239 | F 2 "" H 6700 4200 60 0000 C CNN 240 | F 3 "" H 6700 4200 60 0000 C CNN 241 | 1 6700 4200 242 | 1 0 0 -1 243 | $EndComp 244 | $Comp 245 | L R R5 246 | U 1 1 52DFF171 247 | P 6350 4150 248 | F 0 "R5" V 6430 4150 40 0000 C CNN 249 | F 1 "100K" V 6357 4151 40 0000 C CNN 250 | F 2 "~" V 6280 4150 30 0000 C CNN 251 | F 3 "~" H 6350 4150 30 0000 C CNN 252 | 1 6350 4150 253 | 0 -1 -1 0 254 | $EndComp 255 | $Comp 256 | L R R4 257 | U 1 1 52DFF1D9 258 | P 5750 4150 259 | F 0 "R4" V 5830 4150 40 0000 C CNN 260 | F 1 "5K" V 5757 4151 40 0000 C CNN 261 | F 2 "~" V 5680 4150 30 0000 C CNN 262 | F 3 "~" H 5750 4150 30 0000 C CNN 263 | 1 5750 4150 264 | 0 -1 -1 0 265 | $EndComp 266 | $Comp 267 | L GND #PWR? 268 | U 1 1 52DFF341 269 | P 7850 3500 270 | F 0 "#PWR?" H 7850 3500 30 0001 C CNN 271 | F 1 "GND" H 7850 3430 30 0001 C CNN 272 | F 2 "" H 7850 3500 60 0000 C CNN 273 | F 3 "" H 7850 3500 60 0000 C CNN 274 | 1 7850 3500 275 | 1 0 0 -1 276 | $EndComp 277 | $Comp 278 | L R R8 279 | U 1 1 52DFF395 280 | P 7850 3100 281 | F 0 "R8" V 7930 3100 40 0000 C CNN 282 | F 1 "5K" V 7857 3101 40 0000 C CNN 283 | F 2 "~" V 7780 3100 30 0000 C CNN 284 | F 3 "~" H 7850 3100 30 0000 C CNN 285 | 1 7850 3100 286 | -1 0 0 1 287 | $EndComp 288 | $Comp 289 | L R R7 290 | U 1 1 52DFF3A0 291 | P 7850 2450 292 | F 0 "R7" V 7930 2450 40 0000 C CNN 293 | F 1 "5K" V 7857 2451 40 0000 C CNN 294 | F 2 "~" V 7780 2450 30 0000 C CNN 295 | F 3 "~" H 7850 2450 30 0000 C CNN 296 | 1 7850 2450 297 | -1 0 0 1 298 | $EndComp 299 | $Comp 300 | L IBUTTON P1 301 | U 1 1 52DFFCF4 302 | P 2200 3000 303 | F 0 "P1" V 2150 3000 40 0000 C CNN 304 | F 1 "IBUTTON" V 2250 3000 39 0000 C CNN 305 | F 2 "~" H 2200 3000 60 0000 C CNN 306 | F 3 "~" H 2200 3000 60 0000 C CNN 307 | 1 2200 3000 308 | -1 0 0 1 309 | $EndComp 310 | $Comp 311 | L IBUTTON_READER P2 312 | U 1 1 52DFFD03 313 | P 2750 3000 314 | F 0 "P2" V 2700 3000 40 0000 C CNN 315 | F 1 "IBUTTON_READER" V 2800 3000 20 0000 C CNN 316 | F 2 "~" H 2750 3000 60 0000 C CNN 317 | F 3 "~" H 2750 3000 60 0000 C CNN 318 | 1 2750 3000 319 | -1 0 0 1 320 | $EndComp 321 | $Comp 322 | L BC547 Q2 323 | U 1 1 52DFFD38 324 | P 3800 3000 325 | F 0 "Q2" H 3800 2851 40 0000 R CNN 326 | F 1 "BC847" H 3800 3150 40 0000 R CNN 327 | F 2 "SOT23" H 3700 3102 29 0000 C CNN 328 | F 3 "~" H 3800 3000 60 0000 C CNN 329 | 1 3800 3000 330 | 1 0 0 -1 331 | $EndComp 332 | $Comp 333 | L GND #PWR? 334 | U 1 1 52DFFD52 335 | P 3900 3300 336 | F 0 "#PWR?" H 3900 3300 30 0001 C CNN 337 | F 1 "GND" H 3900 3230 30 0001 C CNN 338 | F 2 "" H 3900 3300 60 0000 C CNN 339 | F 3 "" H 3900 3300 60 0000 C CNN 340 | 1 3900 3300 341 | 1 0 0 -1 342 | $EndComp 343 | $Comp 344 | L R R2 345 | U 1 1 52DFFDBA 346 | P 3600 2300 347 | F 0 "R2" V 3680 2300 40 0000 C CNN 348 | F 1 "5K" V 3607 2301 40 0000 C CNN 349 | F 2 "~" V 3530 2300 30 0000 C CNN 350 | F 3 "~" H 3600 2300 30 0000 C CNN 351 | 1 3600 2300 352 | -1 0 0 1 353 | $EndComp 354 | Wire Wire Line 355 | 6550 1250 6400 1250 356 | Wire Wire Line 357 | 6400 1250 6400 1950 358 | Wire Wire Line 359 | 6400 1950 5950 1950 360 | Wire Wire Line 361 | 6550 1350 6350 1350 362 | Wire Wire Line 363 | 6350 1350 6350 2050 364 | Wire Wire Line 365 | 6350 2050 5950 2050 366 | Wire Wire Line 367 | 6550 1450 6300 1450 368 | Wire Wire Line 369 | 6300 1450 6300 1350 370 | Wire Wire Line 371 | 6300 1350 5950 1350 372 | Wire Wire Line 373 | 6550 1550 6250 1550 374 | Wire Wire Line 375 | 6250 1550 6250 1450 376 | Wire Wire Line 377 | 6250 1450 5950 1450 378 | Wire Wire Line 379 | 6550 1650 6200 1650 380 | Wire Wire Line 381 | 6200 1650 6200 1550 382 | Wire Wire Line 383 | 6200 1550 5950 1550 384 | Wire Wire Line 385 | 6550 1750 6150 1750 386 | Wire Wire Line 387 | 6150 1750 6150 1650 388 | Wire Wire Line 389 | 6150 1650 5950 1650 390 | Wire Wire Line 391 | 6550 1850 6100 1850 392 | Wire Wire Line 393 | 6100 1850 6100 1750 394 | Wire Wire Line 395 | 6100 1750 5950 1750 396 | Wire Wire Line 397 | 3300 5350 3100 5350 398 | Wire Wire Line 399 | 3100 5350 3100 6000 400 | Wire Wire Line 401 | 3100 6000 4600 6000 402 | Wire Wire Line 403 | 4600 6000 4600 5100 404 | Wire Wire Line 405 | 4600 5100 5400 5100 406 | Wire Wire Line 407 | 3300 5200 3100 5200 408 | Wire Wire Line 409 | 3100 5200 3100 4700 410 | Wire Wire Line 411 | 3100 4700 4600 4700 412 | Wire Wire Line 413 | 4600 4700 4600 5000 414 | Wire Wire Line 415 | 4600 5000 5400 5000 416 | Wire Wire Line 417 | 3300 5050 3300 4800 418 | Wire Wire Line 419 | 3300 4800 5400 4800 420 | Wire Wire Line 421 | 5400 4800 5400 4650 422 | Wire Wire Line 423 | 3300 5650 3300 5800 424 | Wire Wire Line 425 | 6650 6600 6200 6600 426 | Wire Wire Line 427 | 6200 6600 6200 6850 428 | Wire Wire Line 429 | 5400 5900 5400 6250 430 | Wire Wire Line 431 | 5100 6650 6200 6650 432 | Connection ~ 6200 6650 433 | Connection ~ 5400 6650 434 | Wire Wire Line 435 | 5100 4400 5100 6250 436 | Connection ~ 5100 4800 437 | Wire Wire Line 438 | 5950 2850 7250 2850 439 | Wire Wire Line 440 | 7250 2850 7250 4700 441 | Wire Wire Line 442 | 7250 4800 7350 4800 443 | Wire Wire Line 444 | 7350 4800 7350 2950 445 | Wire Wire Line 446 | 7350 2950 5950 2950 447 | Wire Wire Line 448 | 5950 3150 6300 3150 449 | Wire Wire Line 450 | 6900 3150 6900 3450 451 | Wire Wire Line 452 | 3250 2250 3250 4400 453 | Wire Wire Line 454 | 3250 4400 5500 4400 455 | Wire Wire Line 456 | 5000 3850 4900 3850 457 | Wire Wire Line 458 | 4900 3850 4900 4100 459 | Wire Wire Line 460 | 3250 1650 3250 1850 461 | Wire Wire Line 462 | 2950 1750 3700 1750 463 | Wire Wire Line 464 | 3700 1750 3700 800 465 | Wire Wire Line 466 | 3700 800 4900 800 467 | Wire Wire Line 468 | 4900 800 4900 950 469 | Connection ~ 3250 1750 470 | Wire Wire Line 471 | 4900 950 5000 950 472 | Wire Wire Line 473 | 2700 1150 3250 1150 474 | Wire Wire Line 475 | 3250 1150 3250 1250 476 | Wire Wire Line 477 | 2100 1150 2100 1500 478 | Wire Wire Line 479 | 6700 4000 6700 4050 480 | Wire Wire Line 481 | 6700 3300 6700 3750 482 | Wire Wire Line 483 | 6700 3300 6100 3300 484 | Wire Wire Line 485 | 6100 3300 6100 3050 486 | Wire Wire Line 487 | 6100 3050 5950 3050 488 | Wire Wire Line 489 | 6600 4150 6700 4150 490 | Wire Wire Line 491 | 6000 4150 6100 4150 492 | Wire Wire Line 493 | 6050 3950 6050 4150 494 | Connection ~ 6050 4150 495 | Connection ~ 5100 4400 496 | Wire Wire Line 497 | 5950 1250 6100 1250 498 | Wire Wire Line 499 | 6100 1250 6100 1000 500 | Wire Wire Line 501 | 6100 1000 7850 1000 502 | Wire Wire Line 503 | 7850 1000 7850 2200 504 | Wire Wire Line 505 | 7850 2700 7850 2850 506 | Wire Wire Line 507 | 7850 3350 7850 3500 508 | Wire Wire Line 509 | 5950 3550 7650 3550 510 | Wire Wire Line 511 | 7650 3550 7650 2800 512 | Wire Wire Line 513 | 7650 2800 7850 2800 514 | Connection ~ 7850 2800 515 | Wire Wire Line 516 | 5500 4400 5500 4150 517 | Wire Wire Line 518 | 6050 3950 6400 3950 519 | Wire Wire Line 520 | 3900 3200 3900 3300 521 | Wire Wire Line 522 | 4050 1950 3600 1950 523 | Wire Wire Line 524 | 3600 1950 3600 2050 525 | Wire Wire Line 526 | 3600 2550 3600 3000 527 | Wire Wire Line 528 | 3900 2800 2550 2800 529 | Wire Wire Line 530 | 2550 2800 2550 2900 531 | Wire Wire Line 532 | 3100 2900 3100 2800 533 | Connection ~ 3100 2800 534 | Wire Wire Line 535 | 2550 3100 2550 3900 536 | Wire Wire Line 537 | 2550 3900 6050 3900 538 | Wire Wire Line 539 | 6050 3900 6050 3350 540 | Wire Wire Line 541 | 6050 3350 5950 3350 542 | Wire Wire Line 543 | 5950 3450 6050 3450 544 | Connection ~ 6050 3450 545 | Wire Wire Line 546 | 3100 3100 3100 3200 547 | Wire Wire Line 548 | 2550 3200 3150 3200 549 | Connection ~ 2550 3200 550 | $Comp 551 | L R R6 552 | U 1 1 52E00128 553 | P 7750 1550 554 | F 0 "R6" V 7830 1550 40 0000 C CNN 555 | F 1 "1K" V 7757 1551 40 0000 C CNN 556 | F 2 "~" V 7680 1550 30 0000 C CNN 557 | F 3 "~" H 7750 1550 30 0000 C CNN 558 | 1 7750 1550 559 | -1 0 0 1 560 | $EndComp 561 | Wire Wire Line 562 | 7750 1200 7750 1300 563 | $Comp 564 | L R R1 565 | U 1 1 52E0028B 566 | P 2950 2300 567 | F 0 "R1" V 3030 2300 40 0000 C CNN 568 | F 1 "5K" V 2957 2301 40 0000 C CNN 569 | F 2 "~" V 2880 2300 30 0000 C CNN 570 | F 3 "~" H 2950 2300 30 0000 C CNN 571 | 1 2950 2300 572 | -1 0 0 1 573 | $EndComp 574 | Wire Wire Line 575 | 3150 3200 3150 2550 576 | Wire Wire Line 577 | 3150 2550 2950 2550 578 | Connection ~ 3100 3200 579 | Wire Wire Line 580 | 2950 2050 2950 1750 581 | $Comp 582 | L R R3 583 | U 1 1 52E00367 584 | P 3600 3650 585 | F 0 "R3" V 3680 3650 40 0000 C CNN 586 | F 1 "750" V 3607 3651 40 0000 C CNN 587 | F 2 "~" V 3530 3650 30 0000 C CNN 588 | F 3 "~" H 3600 3650 30 0000 C CNN 589 | 1 3600 3650 590 | -1 0 0 1 591 | $EndComp 592 | Wire Wire Line 593 | 4050 2150 4050 3400 594 | Wire Wire Line 595 | 4050 3400 3600 3400 596 | Wire Wire Line 597 | 3700 1450 4050 1450 598 | Connection ~ 3700 1450 599 | $Comp 600 | L C C1 601 | U 1 1 52E00544 602 | P 3850 1000 603 | F 0 "C1" H 3850 1100 40 0000 L CNN 604 | F 1 "0.1uF" H 3856 915 40 0000 L CNN 605 | F 2 "~" H 3888 850 30 0000 C CNN 606 | F 3 "~" H 3850 1000 60 0000 C CNN 607 | 1 3850 1000 608 | 1 0 0 -1 609 | $EndComp 610 | $Comp 611 | L GND #PWR? 612 | U 1 1 52E0054A 613 | P 3850 1200 614 | F 0 "#PWR?" H 3850 1200 30 0001 C CNN 615 | F 1 "GND" H 3850 1130 30 0001 C CNN 616 | F 2 "" H 3850 1200 60 0000 C CNN 617 | F 3 "" H 3850 1200 60 0000 C CNN 618 | 1 3850 1200 619 | 1 0 0 -1 620 | $EndComp 621 | Wire Wire Line 622 | 6700 4150 6700 4200 623 | $EndSCHEMATC 624 | -------------------------------------------------------------------------------- /ibutton.hex: -------------------------------------------------------------------------------- 1 | :100000003CC057C065C054C053C052C051C050C05E 2 | :100010004FC04EC04DC014C94BC04AC049C048C0B3 3 | :1000200047C046C045C0F7C0F8C0F9C0FAC0FBC021 4 | :10003000FCC0FDC0FEC0FFC000C101C102C103C1C0 5 | :1000400004C105C1E6C0010000000000003D01BE82 6 | :1000500040115A3600E101FFFFFFFFFFFF2FFEFFB7 7 | :10006000FFFFFF01FFFFFFFF00009B01FFFFFFFFFE 8 | :10007000FF001AFFFFFFFF00000011241FBECFE5A5 9 | :10008000D4E0DEBFCDBF10E0A0E6B0E0EEEDF7E1DA 10 | :1000900002C005900D92A23FB107D9F712E0A2EF7E 11 | :1000A000B0E001C01D92A532B107E1F7FFD495CBB6 12 | :1000B000A7CF1F920F920FB60F9211248F938BB779 13 | :1000C0008F7B8BBF8F910F900FBE0F901F90189555 14 | :1000D0001F920F920FB60F9211248F938BB78F77C9 15 | :1000E0008BBF8F910F900FBE0F901F90189580FFC0 16 | :1000F00014C0A89A81FF14C0A99A82FF14C0C19AA3 17 | :1001000083FF14C0C29A84FF14C0C39A85FF14C031 18 | :10011000C59A86FD14C0C4980895A89881FDECCFB7 19 | :10012000A99882FDECCFC19883FDECCFC29884FDE5 20 | :10013000ECCFC39885FDECCFC59886FFECCFC49A71 21 | :1001400008958091F6009091F70080969093F700C3 22 | :100150008093F60008952091F6003091F7002F5F0C 23 | :100160003F4F3093F7002093F6004091F40047FD95 24 | :1001700010C02F70307081E090E0A0E0B0E004C0CB 25 | :10018000880F991FAA1FBB1F2A95D2F78423AFDFC0 26 | :10019000089535FFEECF80E0AADF08952091F600A4 27 | :1001A0003091F7002F5F3F4F3093F7002093F60018 28 | :1001B0004091F40047FD10C02770307081E090E05E 29 | :1001C000A0E0B0E004C0880F991FAA1FBB1F2A95AA 30 | :1001D000D2F784238CDF089535FFEECF80E087DFF0 31 | :1001E0000895282F90E0A0E0B0E08F709070A0708C 32 | :1001F000B070FC018031910548F080E022952F70AD 33 | :1002000009F080688093F40072DF0895ED5EFF4F7F 34 | :10021000099481E7F3CF8FE3F1CF86E0EFCF8BE551 35 | :10022000EDCF8FE4EBCF86E6E9CF8DE6E7CF8DE724 36 | :10023000E5CF87E0E3CF8FE7E1CF8FE6DFCF87E73A 37 | :10024000DDCF8CE7DBCF89E3D9CF8EE5D7CF89E748 38 | :10025000D5CFFC01108240E050E061E070E01DBCB1 39 | :100260001CBC869B05C08CB59DB580539547C8F3D3 40 | :100270008CB59DB58053954728F51DBC1CBC86994F 41 | :1002800005C08CB59DB580539547C8F38CB59DB519 42 | :100290008C529140D8F48CB59DB58D9750F49B014C 43 | :1002A000042E02C0220F331F0A94E2F78081822BB2 44 | :1002B00080834F5F5F4F4830510589F622E030E080 45 | :1002C000C901089520E030E0C901089521E030E03F 46 | :1002D000C9010895EF92FF920F931F93DF93CF937D 47 | :1002E0000F92CDB7DEB77C01A89580E000DF1DBC82 48 | :1002F0001CBC8CB59DB54497E0F38D9A1DBC1CBC0D 49 | :100300008CB59DB58C389105D8F38D981DBC1CBC5F 50 | :10031000869905C08CB59DB580539547C8F38CB5BB 51 | :100320009DB58C52914058F021E030E0C9010F900A 52 | :10033000CF91DF911F910F91FF90EF900895198257 53 | :100340008E010F5F1F4FC80184DF9C018230910531 54 | :1003500069F78091F80088230CF4F2C0E82FF0E0F0 55 | :10036000EE0FFF1FE250FF4F6981608311828F5FA4 56 | :100370008093F8006C3C09F4E5C0633341F06F30C2 57 | :1003800031F0603F09F445C020E030E0CFCF40E0DD 58 | :1003900050E020E030E0F701E40FF51F1DBC1CBC6D 59 | :1003A000869B05C08CB59DB580539547C8F38CB529 60 | :1003B0009DB58053954740F7808190E0022E02C0A2 61 | :1003C000959587950A94E2F780FD08C08D9A1DBC2B 62 | :1003D0001CBC8CB59DB58397E0F38D981DBC1CBCEF 63 | :1003E000869905C08CB59DB580539547C8F38CB5EB 64 | :1003F0009DB58C52914008F097CF2F5F3F4F28302A 65 | :10040000310561F64F5F5F4F4830510509F0C1CFAC 66 | :10041000B8CF60E070E0F701E60FF71F8081E82FAA 67 | :10042000F0E040E050E01DBC1CBC869B05C08CB5D4 68 | :100430009DB580539547C8F38CB59DB580539547BE 69 | :1004400008F0A2CFCF01042E02C0959587950A949B 70 | :10045000E2F7382F317080FD08C08D9A1DBC1CBC9E 71 | :100460008CB59DB58397E0F38D981DBC1CBC869917 72 | :1004700005C08CB59DB580539547C8F38CB59DB527 73 | :100480008C52914008F050CF1DBC1CBC869B05C00F 74 | :100490008CB59DB580539547C8F38CB59DB58053F9 75 | :1004A000954708F071CF332341F08D9A1DBC1CBCD9 76 | :1004B0008CB59DB58397E0F38D981DBC1CBC8699C7 77 | :1004C00005C08CB59DB580539547C8F38CB59DB5D7 78 | :1004D0008C52914008F028CF1DBC1CBC869B05C0E7 79 | :1004E0008CB59DB580539547C8F38CB59DB58053A9 80 | :1004F000954708F049CF1DBC1CBC869905C08CB53A 81 | :100500009DB580539547C8F38CB59DB58C529140ED 82 | :1005100008F00ACF8CB59DB520E08D9708F421E056 83 | :10052000321709F031CF4F5F5F4F4830510509F066 84 | :100530007ACF6F5F7F4F6830710509F06CCF24CFA1 85 | :10054000698118CFC80185DE9C018230910509F0D0 86 | :10055000EDCE8091F80088236CF0E82FF0E0EE0FEC 87 | :10056000FF1FE250FF4F6981608311828F5F80938C 88 | :10057000F80003CF698101CFCF93DF93EC01CE0167 89 | :10058000A9DE892BE1F7DF91CF910895EF92FF92D9 90 | :100590000F931F93CF93DF938C01C0E0D0E030E343 91 | :1005A000E32E35E7F32EA8951DBC1CBC869B12C01C 92 | :1005B0008CB59DB58053954768F4A895CCDD839B99 93 | :1005C00002C08299F3CFDF91CF911F910F91FF90DD 94 | :1005D000EF9008958CB59DB580539547A8F41DBC48 95 | :1005E0001CBC869909C08CB59DB581539547C8F34D 96 | :1005F000FDBCECBC869BF7CF8CB59DB58D52914070 97 | :1006000050F4C1E0D0E0CFCF2196C436D1055CF2E2 98 | :10061000C801B2DFD8CFC801AFDFF3CF45D380E048 99 | :1006200066DD1AB890989198889A899AC698BF986A 100 | :10063000C798C09885B7806285BF85B78F7A85BF18 101 | :100640008BB7806C8BBF81B5806181BD81B5877FA1 102 | :1006500081BD839B09C0829B07C085B7806885BF29 103 | :10066000889585B78F7785BF0895BF92CF92DF9227 104 | :10067000EF92FF920F931F93DF93CF93CDB7DEB727 105 | :1006800028970FB6F894DEBF0FBECDBF7C018091D6 106 | :10069000F200882369F1BB246E010894C11CD11CAF 107 | :1006A0000B2D10E00F5F1F4FB801660F771F660F0D 108 | :1006B000771F660F771FC60148E050E060D841E021 109 | :1006C00020E030E0F701E20FF31FD601A20FB31FC5 110 | :1006D00090818C91981340E02F5F3F4F2830310577 111 | :1006E00089F7442339F4B3948091F200B816C0F22C 112 | :1006F00000E010E0C80128960FB6F894DEBF0FBEE8 113 | :10070000CDBFCF91DF911F910F91FF90EF90DF90C0 114 | :10071000CF90BF9008958F929F92AF92BF92CF9249 115 | :10072000DF92EF92FF920F931F93DF93CF93CDB79A 116 | :10073000DEB728970FB6F894DEBF0FBECDBF80910D 117 | :10074000F200882309F48FC06E010894C11CD11CEB 118 | :10075000A0EDAA2EA7E0BA2EF2E08F2E912C8C0EDF 119 | :100760009D1E8091F2009091F300981708F091C0BF 120 | :10077000892F8F5F36DD839907C0A8950FDDC501EE 121 | :100780000197F1F7839BF9CF8091F500882309F455 122 | :1007900090C0E091F300F0E0EE0FFF1FE05AFF4F32 123 | :1007A0002081318180E090E0F901E80FF91FE491A8 124 | :1007B000D601A80FB91FEC93019688309105A1F7D7 125 | :1007C00073D200E010E089818F3F91F08E3F09F4F1 126 | :1007D00064C0023011050CF069C0C601D7DE839BEE 127 | :1007E00020C0829B40C00F5F1F4F89818F3F71F7F0 128 | :1007F00023E0093E12070CF059C0A8958091F6003D 129 | :100800009091F70080969093F7008093F600A3DC18 130 | :10081000FB80EE248A819701280F311DC90161D424 131 | :10082000DECF9091F3009F5F9093F3008091F200F0 132 | :10083000981718F01092F30090E0892F8F5FD1DCA9 133 | :1008400000E010E083998DCFA895A8DCC501019741 134 | :10085000F1F70F5F1F4F83E0083E18079CF380916C 135 | :10086000F500882379F721E030E0C90128960FB61A 136 | :10087000F894DEBF0FBECDBFCF91DF911F910F91D6 137 | :10088000FF90EF90DF90CF90BF90AF909F908F90B0 138 | :1008900008951092F30090E06BCF33E0093E130708 139 | :1008A0002CF4A89558DCC401D8D699CF20E030E0CC 140 | :1008B000DCCF6091F30070E06F5F7F4F660F771FB2 141 | :1008C000660F771F660F771FC60148E050E057D7C5 142 | :1008D00077CF5F926F927F928F929F92AF92BF92EB 143 | :1008E000CF92DF92EF92FF920F931F93DF93CF93FC 144 | :1008F000CDB7DEB728970FB6F894DEBF0FBECDBFD9 145 | :10090000D3D180E48093F400839909C000ED17E00F 146 | :10091000A89521DCC8010197F1F7839BF9CFCC247E 147 | :10092000DD243E010894611C711C99E0A92EB12CB4 148 | :10093000AC0EBD1E88248A9480EDE82E87E0F82E48 149 | :1009400000E4502EA89507DCBCD1882309F05CC0D8 150 | :1009500010E0C79ABF9AC09A81D3BF98C798C09831 151 | :1009600097FD0FC089826A83BB2797FDBA95A92F8F 152 | :10097000982F872F8B8318861F821E821D821C82D0 153 | :1009800011E00894C11CD11CF1EDCF16F7E0DF0691 154 | :100990000CF089C0839B50C0829B4EC0112391F202 155 | :1009A000C30163DE009709F460C0982ECC24DD24D7 156 | :1009B000892D17DC00E010E0A895CDDBC701019779 157 | :1009C000F1F70F5F1F4F81E00C321807A9F780E0A5 158 | :1009D0008EDB20E030E0A895C7010197F1F72F5F8B 159 | :1009E0003F4FE1E02C323E07B1F70894C11CD11C07 160 | :1009F000F3E0CF16D104E1F65092F400A895ABDBFA 161 | :100A000060D1882309F4A4CF83E3F2D18301A7D175 162 | :100A1000F80181938F01EA15FB05C9F7C30168E06E 163 | :100A200001D2882309F094CFC30168E017D288234C 164 | :100A300009F08ECF11E08DCF21E030E0C90128967A 165 | :100A40000FB6F894DEBF0FBECDBFCF91DF911F91DF 166 | :100A50000F91FF90EF90DF90CF90BF90AF909F905D 167 | :100A60008F907F906F905F9008958091F2008093B7 168 | :100A7000F3008091F2008F5F8093F2006091F200AA 169 | :100A800070E0660F771F660F771F660F771FC30131 170 | :100A900048E050E08CD66091F20080E090E090D683 171 | :100AA0009090F20083CF20E030E0C8CF8F929F92E9 172 | :100AB000AF92BF92CF92DF92EF92FF920F931F936C 173 | :100AC000CF93DF931AB8A09AA19AB99ABA9ABB9A0F 174 | :100AD000BD9ABC9A8B98939A8A98929ABF98C79815 175 | :100AE000B89AC098BE9AC698DFD0A49AAC98A59A36 176 | :100AF000AD988C9A9498789451E0A52EB12C40ED45 177 | :100B0000E42E47E0F42E9924939438E0832E81B5A7 178 | :100B1000806181BD81B5886081BD81B5806181BD05 179 | :100B200081B5876081BD1092F500CC24DD2400E002 180 | :100B300010E0C501002E02C0880F991F0A94E2F749 181 | :100B40008093F400C0E0D0E0A89505DBC7010197D1 182 | :100B5000F1F72196CE31D105B9F70F5F1F4F06305F 183 | :100B6000110539F70894C11CD11C85E0C816D104C1 184 | :100B700001F1839BDCCF8091F500882309F43DC00F 185 | :100B80008092F2008091F200803410F01092F20016 186 | :100B9000829B39C0C69ABFDD892B19F09ADE892B5A 187 | :100BA000B9F78091F500882311F01092F30036DD3B 188 | :100BB000AECF80E016DB81E090E06091F80000D6D7 189 | :100BC0004091F80050E0440F551F8EEF90E060E038 190 | :100BD00071E0EDD51092F800C0E0D0E0A895BBDA46 191 | :100BE000C7010197F1F7219681E0C43FD807B1F71B 192 | :100BF0009092F5001092F300BCCF80E090E0CFD54A 193 | :100C00008093F200BFCFAFD3CCCF89E189B910BCBC 194 | :100C100080E98AB980B5806480BD08955D9BFECF70 195 | :100C20008CB90895982F92959F709A3070F4905DCA 196 | :100C30008F708A3040F4805D5D9BFECF9CB95D9BD8 197 | :100C4000FECF8CB90895895CF7CF995CF1CFFC0198 198 | :100C50008081882339F05D9BFECF8CB931968081ED 199 | :100C60008823C9F708959C01411551056105710557 200 | :100C700099F080E090E0A0E0B0E0F901E80FF91F02 201 | :100C8000E0815D9BFECFECB90196A11DB11D8417DB 202 | :100C90009507A607B70788F3089581B38F7981BBBD 203 | :100CA00082B38F7982BB08958EB582608EBD8EB57A 204 | :100CB0008A7F8EBD81B38F7981BB82B38F7982BBEE 205 | :100CC000089581B38F7981BB82B38F7982BB8D9A6E 206 | :100CD00020E030E01DBC1CBC8CB59DB58436910570 207 | :100CE000D8F32F5F3F4F25303105A1F78D9840E0B5 208 | :100CF00050E020E030E0869902C041E050E01DBCA9 209 | :100D00001CBC8CB59DB5892BE1F32F5F3F4F81E073 210 | :100D1000243F380781F7842F089581B38F7981BBF1 211 | :100D200082B38F7982BB8D9A1DBC1CBC8CB59DB5DE 212 | :100D30000597E0F38D981DBC1CBC8CB59DB505973F 213 | :100D4000E0F31DBC1CBC21E0869B20E08CB59DB56A 214 | :100D500085369105C8F31DBC1CBC822F0895EF9207 215 | :100D6000FF921F93CF93DF9310E0C0E0D0E081E0CB 216 | :100D7000E82EF12CD2DF882341F0C7010C2E02C0EF 217 | :100D8000880F991F0A94E2F7182B2196C830D105D5 218 | :100D900089F7812FDF91CF911F91FF90EF900895F8 219 | :100DA00091B39F7991BB92B39F7992BB882381F0D5 220 | :100DB0008D9A1DBC1CBC8CB59DB50A97E0F38D982F 221 | :100DC0001DBC1CBC8CB59DB58B349105D8F3089522 222 | :100DD0008D9A1DBC1CBC8CB59DB58B349105D8F388 223 | :100DE0008D981DBC1CBC8CB59DB50A97E0F3089589 224 | :100DF0000F931F93CF93DF93082F10E0C0E0D0E054 225 | :100E0000C8010C2E02C0959587950A94E2F781706F 226 | :100E1000C7DF2196C830D10599F7DF91CF911F9197 227 | :100E20000F910895582F6623B9F09C01F90130E025 228 | :100E30004CE8208190E001C02695822F83273695CB 229 | :100E400080FD34279F5F9830B9F731968E2F851B30 230 | :100E5000861778F3832F089580E00895FC016623B8 231 | :100E600061F08081882359F490E004C0818131963B 232 | :100E7000882329F49F5F9617C8F381E0089580E0E6 233 | :100E8000089580B3829586958695837080FF06C00D 234 | :100E900082B3806682BB81B3806681BB0895482F90 235 | :100EA00050E060E070E020E030E0DB01CA01022E9B 236 | :100EB00004C0B695A795979587950A94D2F7817047 237 | :100EC0009070892BA9F08D9A1DBC1CBC8CB59DB56A 238 | :100ED00089369105D8F38D981DBC1CBC8CB59DB589 239 | :100EE0008497E0F32F5F3F4F24303105F1F60895EA 240 | :100EF0008D9A1DBC1CBC8CB59DB5C597E0F38D9833 241 | :100F00001DBC1CBC8CB59DB580359105D8F32F5FF9 242 | :100F10003F4F2430310549F6EACFEF92FF921F93FD 243 | :100F2000DF93CF93CDB7DEB7C85CD0400FB6F8944F 244 | :100F3000DEBF0FBECDBFDE0111967D01FD0120E0B9 245 | :100F400030E01DBC1CBC459B05C08CB59DB58050D8 246 | :100F50009440C8F38CB59DB58050944008F06BC0A8 247 | :100F60001DBC1CBC459905C08CB59DB580509440F6 248 | :100F7000C8F38CB59DB58050944008F05CC08CB52A 249 | :100F80009DB5819391932F5F3F4F24363105C9F66C 250 | :100F900021E030E008C0A90112962F5F3F4F403496 251 | :100FA00051050CF048C08D919C91119787349105A3 252 | :100FB00090F3A90112968D919C9113978734910516 253 | :100FC00058F314968D919C9115978734910520F3D1 254 | :100FD00016968D919C91179786349105E8F6D90164 255 | :100FE000139660E070E040E050E0142FFD01EE0F3A 256 | :100FF000FF1FEE0DFF1D20E030E0808191818734DE 257 | :10100000910548F0C901012E02C0880F991F0A946A 258 | :10101000E2F7682B792B2F5F3F4F32962430310552 259 | :1010200061F714964E5F5F4F40315105F1F69B0119 260 | :1010300040E050E004C02FEF3FEF4FEF5FEFB9010A 261 | :10104000CA01C853DF4F0FB6F894DEBF0FBECDBF45 262 | :10105000CF91DF911F91FF90EF900895AF92BF92D3 263 | :10106000CF92DF92EF92FF920F931F93CF93DF9374 264 | :10107000AA24BB246501EE24FF248701C0E0D0E050 265 | :1010800009C05B016C01EE24FF2487012196CA3060 266 | :10109000D105B1F042DF97FDF4CFA616B706C8061A 267 | :1010A000D90679F70894E11CF11C011D111D83E09C 268 | :1010B000E816F104010511054CF3A601950104C0E1 269 | :1010C0002FEF3FEF4FEF5FEFB901CA01DF91CF91F3 270 | :1010D0001F910F91FF90EF90DF90CF90BF90AF9056 271 | :1010E0000895CF92DF92EF92FF920F931F93CF93C9 272 | :1010F000DF936C0120E030E047E050E060E070E01A 273 | :10110000DB01CA01022E04C0B695A7959795879575 274 | :101110000A94D2F781709070892B09F47BC08D9A64 275 | :101120001DBC1CBC8CB59DB589369105D8F38D9836 276 | :101130001DBC1CBC8CB59DB58497E0F32F5F3F4F61 277 | :1011400024303105E9F6C0E0D0E091E0E92EF12C41 278 | :10115000012D112DF6D7FFD7C6010C2E02C0969592 279 | :1011600087950A94E2F783709070A801970104C0F4 280 | :10117000220F331F441F551F8A95D2F7422F50E08C 281 | :1011800060E070E020E030E0DB01CA01022E04C024 282 | :10119000B695A795979587950A94D2F78170907028 283 | :1011A000892B11F18D9A1DBC1CBC8CB59DB589365F 284 | :1011B0009105D8F38D981DBC1CBC8CB59DB584974A 285 | :1011C000E0F32F5F3F4F24303105F1F62296C03116 286 | :1011D000D10509F0BFCFDF91CF911F910F91FF9003 287 | :1011E000EF90DF90CF9008958D9A1DBC1CBC8CB5FC 288 | :1011F0009DB5C597E0F38D981DBC1CBC8CB59DB505 289 | :1012000080359105D8F32F5F3F4F2430310509F029 290 | :10121000BBCFDCCF8D9A1DBC1CBC8CB59DB5C597D2 291 | :10122000E0F38D981DBC1CBC8CB59DB58035910537 292 | :10123000D8F32F5F3F4F2430310509F061CF83CFC2 293 | :101240001F920F920FB60F9211242F933F934F933B 294 | :101250008F939F93EF93FF9341E05F9B22C02CB14C 295 | :101260002D3059F12A3049F1203209F45FC08091C4 296 | :10127000FE01882361F58091F9009091FA000196B2 297 | :101280004E9758F78091F9009091FA00FC01E95FC0 298 | :10129000FD4F208301969093FA008093F9005F99A7 299 | :1012A000DECFFF91EF919F918F914F913F912F91C1 300 | :1012B0000F900FBE0F901F901895E091F900F091DC 301 | :1012C000FA00E95FFD4F10824093FD00C6CF322F38 302 | :1012D00030533A3030F0822F8154863008F0BDCF41 303 | :1012E00037508091FB009091FC0040970CF0B5CFF7 304 | :1012F0008091FB009091FC0080FF23C0E091FB00F7 305 | :10130000F091FC00F7FD2BC0F595E795E150FE4FFD 306 | :1013100080813F70382B30838091FB009091FC00DE 307 | :1013200001969093FC008093FB0097CF8091FE0183 308 | :10133000882321F41092FC001092FB004093FE01E0 309 | :101340008CCFE091FB00F091FC00F7FD0AC0F59511 310 | :10135000E7953295307FE150FE4F3083DDCF3196F7 311 | :10136000D3CF3196F4CF2F923F924F925F926F92EC 312 | :101370007F928F929F92AF92BF92CF92DF92EF9225 313 | :10138000FF920F931F93DF93CF93CDB7DEB72897CC 314 | :101390000FB6F894DEBF0FBECDBF1092FA001092C8 315 | :1013A000F9001092FE011092FD0080E090E0FC0137 316 | :1013B000E150FE4F1082019688309105C1F780E020 317 | :1013C00090E0EDD1882E21DC71E0272E312C68ECE5 318 | :1013D000E62EF12C2E010894411C511C59E0652E7B 319 | :1013E000712C6C0E7D1E829994C000E010E0A895CF 320 | :1013F000C101002E02C0880F991F0A94E2F777D628 321 | :1014000024EF31E0C7010197F1F721503040D1F7C7 322 | :101410008091FD00882309F495C08091F900909196 323 | :10142000FA00181619060CF060C0539A80E29EE488 324 | :101430000197F1F76091D0007091D10087E092E0C0 325 | :1014400095D1009709F485C06091D9007091DA00B8 326 | :1014500087E092E08BD1009709F4B9C06091E00079 327 | :101460007091E10087E092E081D1009709F07AC0A5 328 | :1014700086E990E0ECDB882DD5DB9924939448E055 329 | :10148000C42ED12CA82CBB240894A11CB11CAA0CDE 330 | :10149000BB1CAA0CBB1CAA0CBB1CCA14DB04E9F0C5 331 | :1014A0008EE990E0D4DB892DBDDB86EA90E0CFDBCE 332 | :1014B000C201B60148E050E062D18201F801819199 333 | :1014C0008F01B0DB06151705C9F7939488E090E00B 334 | :1014D000C80ED91ECA14DB0419F788EA90E0B7DBFE 335 | :1014E00080E29EE40197F1F753981092FA0010926F 336 | :1014F000F9001092FE011092FD0080E090E0FC01E6 337 | :10150000E150FE4F1082019688309105C1F7829B11 338 | :101510006CCF28960FB6F894DEBF0FBECDBFCF912B 339 | :10152000DF911F910F91FF90EF90DF90CF90BF90D0 340 | :10153000AF909F908F907F906F905F904F903F9073 341 | :101540002F9008950F5F1F4F0630110509F44BCF00 342 | :101550004ECF80E790E07BDB80E29EE40197F1F7DD 343 | :101560005398C3CF6091E8007091E90087E092E062 344 | :10157000FDD00097F9F06091F0007091F10087E0E4 345 | :1015800092E0F4D00097F9F48394682D70E0660F30 346 | :10159000771F660F771F660F771F8FEF91E048E088 347 | :1015A00050E005D180E090E0682D0AD18DEA90E00E 348 | :1015B0004EDBD2CF80E090E060E002D18DEA90E097 349 | :1015C00046DB8824C9CF87EB90E041DBC5CF80E9BB 350 | :1015D00090E03DDBF89481B5886081BDFFCF482F56 351 | :1015E00050E060E070E020E030E0DB01CA01022E54 352 | :1015F00004C0B695A795979587950A94D2F7817000 353 | :101600009070892BA9F08D981DBC1CBC8CB59DB524 354 | :1016100084369105D8F38D9A1DBC1CBC8CB59DB544 355 | :10162000C297E0F32F5F3F4F28303105F1F6089560 356 | :101630008D981DBC1CBC8CB59DB5C297E0F38D9AEE 357 | :101640001DBC1CBC8CB59DB584369105D8F32F5FAD 358 | :101650003F4F2830310549F6EACF0F931F93CF93C0 359 | :10166000DF938C018D9A1DBC1CBC8CB59DB5863951 360 | :101670009105D8F38D981DBC1CBC8CB59DB5C29747 361 | :10168000E0F38D9A1DBC1CBC8CB59DB584369105CC 362 | :10169000D8F38D981DBC1CBC8CB59DB584369105C6 363 | :1016A000D8F38D9A1DBC1CBC8CB59DB5C297E0F3D8 364 | :1016B0008D981DBC1CBC8CB59DB5C297E0F38D9A6E 365 | :1016C0001DBC1CBC8CB59DB584369105D8F38D9896 366 | :1016D000C0E0D0E040D5F801EC0FFD1F8081482F1D 367 | :1016E00050E060E070E020E030E0DB01CA01022E53 368 | :1016F00004C0B695A795979587950A94D2F78170FF 369 | :101700009070892BE9F08D981DBC1CBC8CB59DB5E3 370 | :1017100084369105D8F38D9A1DBC1CBC8CB59DB543 371 | :10172000C297E0F32F5F3F4F28303105F1F6219645 372 | :10173000C430D10579F6DF91CF911F910F910895B3 373 | :101740008D981DBC1CBC8CB59DB5C297E0F38D9ADD 374 | :101750001DBC1CBC8CB59DB584369105D8F32F5F9C 375 | :101760003F4F2830310509F0C0CFE1CFFB01DC014C 376 | :101770008D91019080190110D9F3990B0895DC0126 377 | :10178000CB01FC01E199FECF06C0FFBBEEBBE09AA6 378 | :1017900031960DB20D9241505040B8F70895E1993D 379 | :1017A000FECF9FBB8EBBE09A99278DB30895DC01D5 380 | :1017B000CB0102C02D9105D041505040D8F708957B 381 | :1017C000262FE199FECF9FBB8EBB2DBB0FB6F894A1 382 | :0E17D000E29AE19A0FBE01960895F894FFCFB9 383 | :1017DE0046004E0056005E0063006B0073007600FC 384 | :1017EE0069427574746F6E204D756C74696B657992 385 | :1017FE0020627920436C75737465720D0A3E200069 386 | :10180E004F4B2E0D0A00436F756E743A20000D0A71 387 | :10181E004B65793A200020000D0A3E2000446F6E81 388 | :10182E00652E0D0A3E2000556E6B6E6F776E20632F 389 | :10183E006F6D6D616E640D0A3E20006E616D650008 390 | :10184E00CB007265626F6F7400D2007265616400C6 391 | :10185E00DB00657261736500E20077726974650082 392 | :02186E00EA008E 393 | :00000001FF 394 | -------------------------------------------------------------------------------- /main.c: -------------------------------------------------------------------------------- 1 | #include "defines.h" 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include "ibutton.h" 10 | #include "bits.h" 11 | #include "onewire.h" 12 | #include "cyfral.h" 13 | #include "metacom.h" 14 | #include "usb.h" 15 | 16 | // Некоторые универсальные ключи 17 | unsigned char VEZDEHOD_KEY1[] PROGMEM = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D}; 18 | unsigned char VEZDEHOD_KEY2[] PROGMEM = {0x01, 0xBE, 0x40, 0x11, 0x5A, 0x36, 0x00, 0xE1}; 19 | unsigned char VEZDEHOD_KEY3[] PROGMEM = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F}; 20 | unsigned char VEZDEHOD_KEY4[] PROGMEM = {0xFE, 0xFF, 0xFF, 0xFF, 0xFF}; 21 | unsigned char VEZDEHOD_KEY5[] PROGMEM = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x9B}; 22 | unsigned char VEZDEHOD_KEY6[] PROGMEM = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1A}; 23 | unsigned char VEZDEHOD_KEY7[] PROGMEM = {0xFF, 0xFF, 0xFF}; 24 | unsigned char VEZDEHOD_KEY8[] PROGMEM = {0xFF, 0x00, 0x00}; 25 | /* 26 | unsigned char VEZDEHOD_KEY9[] PROGMEM = {0x01, 0xBE, 0x40, 0x11, 0x0A, 0x00, 0x00, 0x1D}; 27 | unsigned char VEZDEHOD_KEY10[] PROGMEM = {0x01, 0x05, 0xE7, 0x56, 0x0B, 0x00, 0x00, 0x4D}; 28 | unsigned char VEZDEHOD_KEY11[] PROGMEM = {0x01, 0x48, 0x7A, 0x44, 0x0D, 0x00, 0x00, 0xC7}; 29 | unsigned char VEZDEHOD_KEY12[] PROGMEM = {0x01, 0x87, 0x26, 0x87, 0x0B, 0x00, 0x00, 0xA8}; 30 | unsigned char VEZDEHOD_KEY13[] PROGMEM = {0x01, 0x46, 0x81, 0x57, 0x0B, 0x00, 0x00, 0x63}; 31 | unsigned char VEZDEHOD_KEY14[] PROGMEM = {0x01, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x2D}; 32 | unsigned char VEZDEHOD_KEY15[] PROGMEM = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x14}; 33 | unsigned char VEZDEHOD_KEY16[] PROGMEM = {0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xB2}; 34 | unsigned char VEZDEHOD_KEY17[] PROGMEM = {0x01, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x74}; 35 | unsigned char VEZDEHOD_KEY18[] PROGMEM = {0x01, 0x4C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x71}; 36 | unsigned char VEZDEHOD_KEY19[] PROGMEM = {0x01, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x49}; 37 | unsigned char VEZDEHOD_KEY20[] PROGMEM = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4C, 0xFF}; 38 | unsigned char VEZDEHOD_KEY21[] PROGMEM = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00}; 39 | unsigned char VEZDEHOD_KEY22[] PROGMEM = {0x01, 0xF0, 0xD6, 0xBC, 0x0B, 0x00, 0x00, 0xCF}; 40 | unsigned char VEZDEHOD_KEY23[] PROGMEM = {0x01, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5D}; 41 | unsigned char VEZDEHOD_KEY24[] PROGMEM = {0x01, 0x38, 0x3A, 0x65, 0x0E, 0x00, 0x00, 0xAD}; 42 | */ 43 | unsigned char* VEZDEHOD_KEYS[] = {VEZDEHOD_KEY1, VEZDEHOD_KEY2, VEZDEHOD_KEY3, VEZDEHOD_KEY4, VEZDEHOD_KEY5, VEZDEHOD_KEY6, VEZDEHOD_KEY7, VEZDEHOD_KEY8 44 | /*, VEZDEHOD_KEY9, VEZDEHOD_KEY10, VEZDEHOD_KEY11, VEZDEHOD_KEY12, VEZDEHOD_KEY13, VEZDEHOD_KEY14, VEZDEHOD_KEY15, VEZDEHOD_KEY16, VEZDEHOD_KEY17, VEZDEHOD_KEY18, VEZDEHOD_KEY19, VEZDEHOD_KEY20, VEZDEHOD_KEY21, VEZDEHOD_KEY22, VEZDEHOD_KEY23, VEZDEHOD_KEY24 45 | */}; 46 | 47 | volatile unsigned char key_count = 0; 48 | unsigned char current_key = 0; 49 | unsigned char leds_mask = 0; 50 | unsigned char vezdehod_mode = 0; 51 | uint16_t leds_time = 0; 52 | 53 | #ifdef DEBUG 54 | uint16_t debug_log[128]; 55 | uint8_t debug_log_size = 0; 56 | #define WRITE_LOG(t) if (debug_log_size < 128) debug_log[debug_log_size++] = t 57 | #else 58 | #define WRITE_LOG(t) ; 59 | #endif 60 | 61 | ISR(INT0_vect) 62 | { 63 | // Выключаем прерывание после срабатывания 64 | // Его цель - только вывести устройство из спящего режима 65 | unset_bit(GICR, INT0); 66 | } 67 | 68 | ISR(INT1_vect) 69 | { 70 | // Выключаем прерывание после срабатывания 71 | // Его цель - только вывести устройство из спящего режима 72 | unset_bit(GICR, INT1); 73 | } 74 | 75 | // Включает заданные светодиоды по маске 76 | void set_leds(unsigned char leds_mask) 77 | { 78 | if (leds_mask & (1<<0)) set_bit(LED1_PORT, LED1_PIN); else unset_bit(LED1_PORT, LED1_PIN); // top led 79 | if (leds_mask & (1<<1)) set_bit(LED2_PORT, LED2_PIN); else unset_bit(LED2_PORT, LED2_PIN); // top-right led 80 | if (leds_mask & (1<<2)) set_bit(LED3_PORT, LED3_PIN); else unset_bit(LED3_PORT, LED3_PIN); // bottom-right led 81 | if (leds_mask & (1<<3)) set_bit(LED4_PORT, LED4_PIN); else unset_bit(LED4_PORT, LED4_PIN); // bottom led 82 | if (leds_mask & (1<<4)) set_bit(LED5_PORT, LED5_PIN); else unset_bit(LED5_PORT, LED5_PIN); // bottom-left led 83 | if (leds_mask & (1<<5)) set_bit(LED6_PORT, LED6_PIN); else unset_bit(LED6_PORT, LED6_PIN); // top-left led 84 | if (leds_mask & (1<<6)) set_bit(LED7_PORT, LED7_PIN); else unset_bit(LED7_PORT, LED7_PIN); // center led 85 | } 86 | 87 | // Ускоряет мигание светодиодами 88 | void speedup_leds(void) 89 | { 90 | leds_time+=32; 91 | } 92 | 93 | // Зажигаем следующий светодиод, если надо, 94 | // т.е. в каждый момент времени горит только один 95 | void update_leds(void) 96 | { 97 | leds_time++; 98 | if ((leds_mask & (1<<7)) && ((leds_time >> 13) % 2 == 1)) 99 | set_leds(0); 100 | else set_leds(leds_mask & (1UL << (leds_time % 16))); 101 | } 102 | 103 | // Зажигаем следующий светодиод, но больше времени уделяем на горение, 104 | // т.е. светодиоды визуально светятся ярче 105 | void update_leds_bright(void) 106 | { 107 | leds_time++; 108 | if ((leds_mask & (1<<7)) && ((leds_time >> 13) % 2 == 1)) 109 | set_leds(0); 110 | else set_leds(leds_mask & (1UL << (leds_time % 8))); 111 | } 112 | 113 | // Отображает заданную цифру 114 | void show_digit(unsigned char digit) 115 | { 116 | unsigned char mask = 0; 117 | switch (digit&0x0F) 118 | { 119 | case 0: mask = 0b00111111; break; 120 | case 1: mask = 0b00000110; break; 121 | case 2: mask = 0b01011011; break; 122 | case 3: mask = 0b01001111; break; 123 | case 4: mask = 0b01100110; break; 124 | case 5: mask = 0b01101101; break; 125 | case 6: mask = 0b01111101; break; 126 | case 7: mask = 0b00000111; break; 127 | case 8: mask = 0b01111111; break; 128 | case 9: mask = 0b01101111; break; 129 | case 0xA: mask = 0b01110111; break; 130 | case 0xB: mask = 0b01111100; break; 131 | case 0xC: mask = 0b00111001; break; 132 | case 0xD: mask = 0b01011110; break; 133 | case 0xE: mask = 0b01111001; break; 134 | case 0xF: mask = 0b01110001; break; 135 | default: mask = 0; break; 136 | } 137 | if (digit >> 4) mask |= (1<<7); 138 | leds_mask = mask; 139 | set_leds(mask); 140 | } 141 | 142 | // Проверяет, есть ли заданный ключ в базе 143 | int key_exists(unsigned char* new_key) 144 | { 145 | unsigned char i, i2, bingo; 146 | unsigned char old_key[8]; 147 | for (i = 0; i < key_count; i++) 148 | { 149 | bingo = 1; 150 | eeprom_read_block(old_key, (void*)((i+1)*8), 8); 151 | for (i2 = 0; i2 < 8; i2++) if (new_key[i2] != old_key[i2]) bingo = 0; 152 | if (bingo) return i+1; 153 | } 154 | return 0; 155 | } 156 | 157 | // Считывает ключ 158 | int read_mode() 159 | { 160 | onewire_init(); 161 | 162 | int t = 0; 163 | unsigned char serial[8]; 164 | char read_ok = 0; 165 | 166 | leds_mask = 1<<6; // Во время считывания мигаем средним светодиодом 167 | while (BUTTON_PRESSED) 168 | { 169 | wdt_reset(); 170 | update_leds(); 171 | _delay_ms(1); 172 | } 173 | 174 | while (1) 175 | { 176 | wdt_reset(); 177 | update_leds(); 178 | char res = onewire_write_reset(); // Посылает 1-wire ресет 179 | if (res) // Если устройство ответило... 180 | { 181 | // Посылаем команду считывания ключа 182 | onewire_write_byte(ONEWIRE_COMMAND_READ_ROM); 183 | int b; 184 | // Читаем 8 байт из ключа 185 | for (b = 0; b < 8; b++) 186 | serial[b] = onewire_read_byte(); 187 | // Проверяем CRC 188 | if ((onewire_check_crc(serial, 8) == 0) && !onewire_all_zeros(serial, 8)) 189 | { 190 | read_ok = 1; 191 | } 192 | } 193 | 194 | // Теперь пытаемся прочитать цифрал-клюс 195 | CYFRAL_PULLUP_ENABLE; // подтяжка 750 Ом 196 | CYFRAL_REFERENCE_ENABLE; // делитель напряженния 197 | // Читаем ключ несколько раз, с проверкой 198 | long int code = read_cyfral_with_check(); 199 | // Выключаем назад подтяжку и делитель напряжения 200 | CYFRAL_PULLUP_DISABLE; 201 | CYFRAL_REFERENCE_DISABLE; 202 | // Если ключ прочитан успешно... 203 | if (code >= 0) 204 | { 205 | serial[0] = 0xFF; 206 | serial[1] = code & 0xFF; 207 | serial[2] = (code>>8) & 0xFF; 208 | serial[3] = serial[4] = serial[5] = serial[6] = serial[7] = 0; 209 | read_ok = 1; 210 | } 211 | t++; 212 | // После 2000 неудачных попыток выходим и выключаемся 213 | if (t > 2000) 214 | return 0; 215 | if (BUTTON_PRESSED || USB_POWERED) // При нажатии кнопки или подключения USB... 216 | return 1; // возврат в основной режим 217 | 218 | // Если ключ прочитан успешно... 219 | if (read_ok) 220 | { 221 | read_ok = 0; 222 | t = 0; 223 | 224 | // Проверяем - нет ли у нас уже такого ключа? 225 | int exists = key_exists(serial); 226 | int num; 227 | // Если нет... 228 | if (!exists) 229 | { 230 | // Сохраняем ключ 231 | current_key = key_count; 232 | key_count++; 233 | eeprom_write_block(serial, (void*)(key_count*8), 8); 234 | eeprom_write_byte((void*)0, key_count); 235 | num = key_count; 236 | } else 237 | { 238 | // Иначе отображаем номер существующего 239 | num = exists; 240 | } 241 | // Мигаем три раза номером ключа 242 | for (t = 0; t < 3; t++) 243 | { 244 | show_digit(num); 245 | int i; 246 | for (i = 0;i < 300; i++) 247 | { 248 | wdt_reset(); 249 | update_leds(); 250 | _delay_ms(1); 251 | } 252 | set_leds(0); 253 | for (i = 0;i < 300; i++) 254 | { 255 | wdt_reset(); 256 | _delay_ms(1); 257 | } 258 | } 259 | leds_mask = 1<<6; 260 | } 261 | } 262 | } 263 | 264 | // Читает байт от мастера. Таймаут - возвращает 0, ресет - 1, удачно - 2 265 | int ibutton_read_byte_from_master(unsigned char* value) 266 | { 267 | int i; 268 | *value = 0; 269 | for (i = 0; i < 8; i++) // Ждем команду 270 | { 271 | TCNT1 = 0; while (!ONEWIRE_MASTER_RX && (TCNT1 < 30000)); if (TCNT1 >= 30000) return 0; 272 | TCNT1 = 0; while (ONEWIRE_MASTER_RX && (TCNT1 < 30000)); 273 | if (TCNT1 >= 300) return 1; 274 | if (TCNT1 < 45) *value |= (1 << i); 275 | } 276 | return 2; 277 | } 278 | 279 | // Посылает мастуру presence-pulse и ждёт команду 280 | int ibutton_wait_for_master3(unsigned char* key) 281 | { 282 | wdt_reset(); 283 | set_leds(0); // Гасим светодиоды, т.к. нет времени ими мигать 284 | ONEWIRE_WAIT(20) // Немножко ждём 285 | ONEWIRE_MASTER_TX(140); // Presence-pulse 286 | // Ждём возобновления линии 287 | TCNT1 = 0; while (ONEWIRE_MASTER_RX && (TCNT1 < 30000)); 288 | if (TCNT1 >= 300) return 1; // Если линия долго прижата мастером, это ресет 289 | int i, bit; 290 | unsigned char command = 0; 291 | i = ibutton_read_byte_from_master(&command); // Получаем комманду 292 | if (i != 2) return i; 293 | WRITE_LOG(command); 294 | 295 | if (command == ONEWIRE_COMMAND_SKIP_ROM) // Если нам сначала прислали SKIP_ROM команду. На практике такого не бывало. 296 | { 297 | i = ibutton_read_byte_from_master(&command); 298 | if (i != 2) return i; 299 | WRITE_LOG(command); 300 | } 301 | 302 | if ((command == ONEWIRE_COMMAND_READ_ROM) || (command == ONEWIRE_COMMAND_READ_ROM_ALT)) // Получили запрос, шлём ключ 303 | { 304 | for (i = 0; i < 8; i++) 305 | { 306 | for (bit = 0; bit < 8; bit++) 307 | { 308 | // Ждём запроса от мастера 309 | TCNT1 = 0; while ((!ONEWIRE_MASTER_RX) && (TCNT1 < 30000)); if (TCNT1 >= 30000) return 0; 310 | // Если нужно передать логический ноль, прижимаем линию 311 | if (((key[i] >> bit) & 1) == 0) 312 | { 313 | ONEWIRE_MASTER_TX(35); 314 | } 315 | // Ждём возобновления линии 316 | TCNT1 = 0; while (ONEWIRE_MASTER_RX && (TCNT1 < 30000)); 317 | if (TCNT1 >= 300) return 1; // Если линия долго прижата мастером, это ресет 318 | } 319 | } 320 | } 321 | 322 | if (command == ONEWIRE_COMMAND_SEARCH) // Мастер выполняет поиск! 323 | { 324 | for (i = 0; i < 8; i++) 325 | { 326 | for (bit = 0; bit < 8; bit++) 327 | { 328 | char d = (key[i] >> bit) & 1; // Текущий бит 329 | // Ждём запроса от мастера 330 | TCNT1 = 0; while ((!ONEWIRE_MASTER_RX) && (TCNT1 < 30000)); if (TCNT1 >= 30000) return 0; 331 | if (d == 0) // Если нужно передать логический ноль, прижимаем линию 332 | { 333 | ONEWIRE_MASTER_TX(35); 334 | } 335 | // Ждём возобновления линии 336 | TCNT1 = 0; while (ONEWIRE_MASTER_RX && (TCNT1 < 30000)); 337 | if (TCNT1 >= 300) return 1; // Если линия долго прижата мастером, это ресет 338 | 339 | // Ждём запроса от мастера 340 | TCNT1 = 0; while ((!ONEWIRE_MASTER_RX) && (TCNT1 < 30000)); if (TCNT1 >= 30000) return 0; 341 | if (d != 0) // Если нужно передать логическую единицу, прижимаем линию 342 | { 343 | ONEWIRE_MASTER_TX(35); 344 | } 345 | // Ждём возобновления линии 346 | TCNT1 = 0; while (ONEWIRE_MASTER_RX && (TCNT1 < 30000)); 347 | if (TCNT1 >= 300) return 1; // Если линия долго прижата мастером, это ресет 348 | 349 | // Ждём сигнала от мастера 350 | TCNT1 = 0; while (!ONEWIRE_MASTER_RX && (TCNT1 < 30000)); if (TCNT1 >= 30000) return 0; 351 | // Ждём возобновления линии 352 | TCNT1 = 0; while (ONEWIRE_MASTER_RX && (TCNT1 < 30000)); 353 | if (TCNT1 >= 300) return 1; // Если линия долго прижата мастером, это ресет 354 | char d2; 355 | if (TCNT1 < 45) d2 = 1; else d2 = 0; // Бит, который подтверждает мастер 356 | if (d != d2) return 0; // Если они не совпадают, выходим 357 | } 358 | } 359 | } 360 | return 0; 361 | } 362 | 363 | // Отвечает на ресет мастеру 364 | void ibutton_wait_for_master2(unsigned char* key) 365 | { 366 | int reset; 367 | do 368 | { 369 | reset = ibutton_wait_for_master3(key); 370 | } while (reset); // Если в результате общения получили ресет, то начинаем общение заново 371 | } 372 | 373 | // Ждём ресета от мастера 374 | void ibutton_wait_for_master(unsigned char* key) 375 | { 376 | int waittime; 377 | for (waittime = 0; waittime < 100; waittime++) 378 | { 379 | wdt_reset(); 380 | TCNT1 = 0; 381 | while (!ONEWIRE_MASTER_RX && (TCNT1 < 30000)) // Пока нет сигнала 382 | { 383 | wdt_reset(); 384 | update_leds(); 385 | if (BUTTON_PRESSED || USB_POWERED) return; 386 | }; 387 | // Если долго не было сигнала, ждём дальше 388 | if (TCNT1 >= 30000) continue; 389 | // Если же сигнал есть, считаем время 390 | TCNT1 = 0; 391 | while (ONEWIRE_MASTER_RX) if (TCNT1 > 30000) TCNT1 = 30000; // Пока есть сигнал 392 | if (TCNT1 > 300) // Не слишком короткий 393 | { 394 | ibutton_wait_for_master2(key); // Дверь заговорила, отвечаем 395 | } 396 | // Был сигнал, ждём ресета с нуля 397 | waittime = 0; 398 | } 399 | ibutton_wait_for_master2(key); // Не дождались, начинаем сами 400 | } 401 | 402 | // Режим посылки ключа 403 | int send_mode() 404 | { 405 | // Если ключей нет, сразу переходим в режим чтения ключей 406 | if (!key_count) return 1; 407 | int t; 408 | while (1) 409 | { 410 | if (current_key >= key_count) current_key = 0; 411 | // Показываем номер текущего ключа 412 | show_digit(current_key+1); 413 | // Ждём пока кнопку, отпустят 414 | while (BUTTON_PRESSED) 415 | { 416 | wdt_reset(); 417 | update_leds_bright(); 418 | _delay_ms(1); 419 | } 420 | unsigned char key[8]; 421 | // В обычном режиме читаем ключ из EEPROM 422 | if (!vezdehod_mode) 423 | eeprom_read_block(key, (void*)((current_key+1)*8), 8); 424 | else 425 | { // Если режим вездехода, то читаем ключ из PGM памяти 426 | int i; 427 | for (i = 0; i < 8; i++) 428 | key[i] = pgm_read_byte(&VEZDEHOD_KEYS[current_key][i]); 429 | } 430 | // Включаем 1-wire 431 | onewire_init(); 432 | t = 0; 433 | while (1) 434 | { 435 | if (key[0] == 0xFF) // Цифрал 436 | { 437 | // После 1000 попыток выключаемся 438 | if (t > 1000) return 0; 439 | wdt_reset(); 440 | speedup_leds(); 441 | update_leds(); 442 | uint16_t cyfral_key = key[1] + key[2]*0x100; 443 | // Посылаем ключ 444 | cyfral_send(cyfral_key); 445 | } 446 | else if (key[0] == 0xFE) // Метаком 447 | { 448 | // После 1000 попыток выключаемся 449 | if (t > 1000) return 0; 450 | wdt_reset(); 451 | update_leds(); 452 | // Посылаем ключ 453 | metacom_send(key+1); 454 | } else { // iButton 455 | // После трёх попыток выключаемся 456 | if (t >= 2) return 0; 457 | // Переходим в режим переговоров с дверью 458 | ibutton_wait_for_master(key); 459 | } 460 | 461 | if (BUTTON_PRESSED) 462 | { 463 | t = 0; 464 | current_key++; 465 | if (current_key >= key_count) current_key = 0; 466 | show_digit(current_key+1); 467 | while (BUTTON_PRESSED) 468 | { 469 | wdt_reset(); 470 | update_leds_bright(); 471 | _delay_ms(1); 472 | t++; 473 | if (t >= 1000 && !vezdehod_mode) return 1; // смена режима 474 | } 475 | break; 476 | } 477 | if (USB_POWERED) return 1; 478 | t++; 479 | } 480 | } 481 | } 482 | 483 | void sleep() 484 | { 485 | onewire_init(); 486 | set_leds(0); 487 | UCSRB = 0; // disable USART 488 | unset_bit(PORTD, 0); unset_bit(PORTD, 1); // Прижимаем USART к земле 489 | set_bit(DDRD, 0); set_bit(DDRD, 1); 490 | 491 | LINE_DISABLE; 492 | CYFRAL_PULLUP_DISABLE; 493 | CYFRAL_REFERENCE_DISABLE; 494 | 495 | set_bit(MCUCR, SM1); unset_bit2(MCUCR, SM0, SM2); // Power-down спящий режим 496 | set_bit2(GICR, INT1, INT0); // Включаем прерывания 497 | 498 | set_bit(WDTCR, WDCE), unset_bit(WDTCR, WDE); // Собаку выключаем 499 | 500 | if (BUTTON_PRESSED || USB_POWERED) return; 501 | sleep_mode(); 502 | } 503 | 504 | int main (void) 505 | { 506 | UCSRB = 0; // Выключаем UART, из-за него ток утекает, куда не надо 507 | 508 | set_bit(LED1_DDR, LED1_PIN); // top led 509 | set_bit(LED2_DDR, LED2_PIN); // top-right led 510 | set_bit(LED3_DDR, LED3_PIN); // bottom-right led 511 | set_bit(LED4_DDR, LED4_PIN); // bottom led 512 | set_bit(LED5_DDR, LED5_PIN); // bottom-left led 513 | set_bit(LED6_DDR, LED6_PIN); // top-left led 514 | set_bit(LED7_DDR, LED7_PIN); // center led 515 | 516 | unset_bit(BUTTON_DDR, BUTTON_PIN); set_bit(BUTTON_OUT, BUTTON_PIN); // Подтяжка кнопки 517 | unset_bit(USB_DETECT_DDR, USB_DETECT_PIN); set_bit(USB_DETECT_OUT, USB_DETECT_PIN); // Подтяжка определения USB 518 | unset_bit(CYFRAL_PULLUP_DDR, CYFRAL_PULLUP_PIN); unset_bit(CYFRAL_PULLUP_OUT, CYFRAL_PULLUP_PIN); // Подтяжка 750 Ом выключена 519 | set_bit(CYFRAL_REFERENCE_DDR, CYFRAL_REFERENCE_PIN); unset_bit(CYFRAL_REFERENCE_OUT, CYFRAL_REFERENCE_PIN); // Делитель напряжения выключен 520 | set_bit(LINE_ENABLE_DDR, LINE_ENABLE_PIN); unset_bit(LINE_ENABLE_OUT, LINE_ENABLE_PIN); // линия выключена 521 | onewire_init(); 522 | 523 | // Лишние ноги прижимаем к земле 524 | set_bit(DDRC, 4); unset_bit(PORTC, 4); 525 | set_bit(DDRC, 5); unset_bit(PORTC, 5); 526 | set_bit(DDRD, 4); unset_bit(PORTD, 4); 527 | 528 | sei(); 529 | 530 | int b, i; 531 | /* 532 | LINE_ENABLE; 533 | CYFRAL_REFERENCE_ENABLE; 534 | while(1) 535 | for(b = 0; b < 10; b++) 536 | { 537 | if (CYFRAL_SIGNAL) 538 | show_digit(1); 539 | else 540 | show_digit(0); 541 | } 542 | */ 543 | 544 | while (1) 545 | { 546 | set_bit(WDTCR, WDCE), set_bit(WDTCR, WDE); // Собака 547 | set_bit(WDTCR, WDCE), set_bit3(WDTCR, WDP2, WDP1, WDP0); // Неспешащая собака 548 | 549 | int t = 0; 550 | vezdehod_mode = 0; 551 | do 552 | { 553 | // При включении показываем бегущий по кругу светодиод 554 | for(b = 0; b < 6; b++) 555 | { 556 | //set_leds(1< 63) key_count = 0; 597 | 598 | while (1) 599 | { 600 | if (USB_POWERED) 601 | { 602 | usb_mode(); 603 | break; 604 | } 605 | LINE_ENABLE; 606 | if (send_mode() == 0) break; 607 | if (read_mode() == 0) break; 608 | } 609 | 610 | if (vezdehod_mode) current_key = 0; 611 | sleep(); 612 | } 613 | 614 | } 615 | 616 | --------------------------------------------------------------------------------