├── 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\makefileatmega1611
Bootloader.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 | 
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 | 
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 |
--------------------------------------------------------------------------------