Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/ibutton.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2014-01-22 22:08:11 +0400
committerAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2014-01-22 22:08:11 +0400
commit6ae7f93ce562a140a76e704c68a1ac7f812b5e85 (patch)
tree7215120fdfb632d880e081862cdf8176c3114e0e
parentced434cba51302bb36bfecb16da5909f8e5d2d03 (diff)
main.c
-rw-r--r--.gitignore12
-rw-r--r--Bootloader/main.hex56
-rw-r--r--Makefile2
-rw-r--r--ibutton.c615
-rw-r--r--ibutton.hex393
-rw-r--r--ibutton3.lay6bin52623 -> 63890 bytes
6 files changed, 450 insertions, 628 deletions
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index f5d8291..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,12 +0,0 @@
-*.o
-*.hex
-*.bin
-*.elf
-*.lst
-*.lss
-*.eep
-*.map
-*.srec
-*.bat
-*.d
-*.sym
diff --git a/Bootloader/main.hex b/Bootloader/main.hex
new file mode 100644
index 0000000..239d228
--- /dev/null
+++ b/Bootloader/main.hex
@@ -0,0 +1,56 @@
+:101C000011241FBECFE5D4E0DEBFCDBF10E0A0E6BB
+:101C1000B0E001C01D92A03AB107E1F703D09AC12C
+:101C200000C008952F923F924F925F926F927F92E1
+:101C30008F929F92AF92BF92CF92DF92EF92FF92DC
+:101C40000F931F93CF93DF93C49ABC9AF894A895EF
+:101C500088E10FB6F89481BD11BC0FBE8B98939AA2
+:101C600010BC99E199B98AB986E880BD839B05C00B
+:101C7000C498BC98E0E0F0E00995C0E0D0E088248A
+:101C800089E5582E0DE0902E11E1612EBFE47B2EE8
+:101C9000A0E34A2EF8E33F2EE7E02E2E5F9BFECF17
+:101CA0009CB1913621F45D9BFECF5CB8F7CF9134A7
+:101CB00079F45F9BFECF9CB15F9BFECF8CB15D9BA7
+:101CC000FECFB92EAA24C82FD0E0CA29DB29FDC037
+:101CD000923659F45D9BFECF5CB85D9BFECF1CB87D
+:101CE0005D9BFECF20E42CB9D9CF923409F05BC0C4
+:101CF0005F9BFECF8CB15F9BFECF6CB15F9BFECF35
+:101D00002CB190E0E0E6F0E0961710F08FEF03C002
+:101D10005F9BFECF8CB180839F5F903411F0319632
+:101D2000F3CF77E7871609F03BC0263491F57E01A3
+:101D300000E010E0EE0CFF1C001F111FA80197012E
+:101D4000A0E6B0E08C9190E01196DC901197CC2445
+:101D50008C299D29129671E0F9010C0170935700AE
+:101D6000E89511242E5F3F4F4F4F5F4F625051F760
+:101D700075E0F70170935700E89507B600FCFDCFBA
+:101D800060925700E8955695479537952795E90154
+:101D900004C0253411F4C60FD11D5D9BFECF95C044
+:101DA0005D9BFECF7FC0973609F03CC05F9BFECFA6
+:101DB0008CB15F9BFECFFCB05F9BFECF8CB18634B5
+:101DC000E1F4CE01A0E0B0E0880F991FAA1FBB1F6D
+:101DD000FC01259134915D9BFECF2CB95D9BFECF1C
+:101DE0003CB90296A11DB11DEEEFFE0E89F7B69526
+:101DF000A79597958795EC0151CF853409F04ECF83
+:101E0000EF2C8E01C8019ED05D9BFECF8CB90F5F79
+:101E10001F4FEA94B9F7FA948F2D90E00196C80FFE
+:101E2000D91F3CCF9536C1F4F7E78F1691F4E0E067
+:101E3000F0E023E020935700E89507B600FCFDCFC3
+:101E4000E05CFF4F7CE1E030F70799F760925700C4
+:101E5000E8955D9BFECF39C0953461F42CE088E1B4
+:101E600090E00FB6F894A89581BD0FBE21BD5D9B93
+:101E7000FECF2BC0903519F45D9BFECF26C09C345D
+:101E800019F45D9BFECF21C0903721F45D9BFECFFE
+:101E900083E556C0943741F45D9BFECFE7E7ECB98C
+:101EA0005D9BFECF1CB8FACE892F8857823030F464
+:101EB0005F9BFECF8CB15D9BFECF07C0943539F49C
+:101EC0005F9BFECF8CB05D9BFECF9CB8E7CE933579
+:101ED000D9F45D9BFECFF1E4FCB95D9BFECF26E516
+:101EE0002CB95D9BFECF72E57CB95D9BFECF82E491
+:101EF0008CB95D9BFECF7CB85D9BFECF7CB85D9BB3
+:101F0000FECFE4E5ECB9CACE963539F45D9BFECF41
+:101F10004CB85D9BFECF3CB8C1CE933759F45D9B66
+:101F2000FECF2CB85D9BFECFF3E9FCB95D9BFECFE5
+:101F30008EE106C09B3109F4B1CE5D9BFECF8FE3ED
+:101F40008CB9ACCEE199FECF9FBB8EBBE09A9927AE
+:081F50008DB30895F894FFCF52
+:0400000300001C00DD
+:00000001FF
diff --git a/Makefile b/Makefile
index b952369..7004782 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ PROGRAMMER_TYPE = avr109
PROGRAMMER_PORT = com3
PRG = ibutton
-OBJ = ibutton.o usart.o onewire.o cyfral.o usb.o metacom.o
+OBJ = main.o usart.o onewire.o cyfral.o usb.o metacom.o
#MCU_TARGET = at90s2313
#MCU_TARGET = at90s2333
#MCU_TARGET = at90s4414
diff --git a/ibutton.c b/ibutton.c
deleted file mode 100644
index 253bfc7..0000000
--- a/ibutton.c
+++ /dev/null
@@ -1,615 +0,0 @@
-#include "defines.h"
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <avr/sleep.h>
-#include <avr/eeprom.h>
-#include <util/delay.h>
-#include <avr/pgmspace.h>
-#include <avr/wdt.h>
-#include "ibutton.h"
-#include "bits.h"
-#include "onewire.h"
-#include "cyfral.h"
-#include "metacom.h"
-#include "usb.h"
-
-// Некоторые универсальные ключи
-unsigned char VEZDEHOD_KEY1[] PROGMEM = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D};
-unsigned char VEZDEHOD_KEY2[] PROGMEM = {0x01, 0xBE, 0x40, 0x11, 0x5A, 0x36, 0x00, 0xE1};
-unsigned char VEZDEHOD_KEY3[] PROGMEM = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F};
-unsigned char VEZDEHOD_KEY4[] PROGMEM = {0xFE, 0xFF, 0xFF, 0xFF, 0xFF};
-unsigned char VEZDEHOD_KEY5[] PROGMEM = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x9B};
-unsigned char VEZDEHOD_KEY6[] PROGMEM = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1A};
-unsigned char VEZDEHOD_KEY7[] PROGMEM = {0xFF, 0xFF, 0xFF};
-unsigned char VEZDEHOD_KEY8[] PROGMEM = {0xFF, 0x00, 0x00};
-/*
-unsigned char VEZDEHOD_KEY9[] PROGMEM = {0x01, 0xBE, 0x40, 0x11, 0x0A, 0x00, 0x00, 0x1D};
-unsigned char VEZDEHOD_KEY10[] PROGMEM = {0x01, 0x05, 0xE7, 0x56, 0x0B, 0x00, 0x00, 0x4D};
-unsigned char VEZDEHOD_KEY11[] PROGMEM = {0x01, 0x48, 0x7A, 0x44, 0x0D, 0x00, 0x00, 0xC7};
-unsigned char VEZDEHOD_KEY12[] PROGMEM = {0x01, 0x87, 0x26, 0x87, 0x0B, 0x00, 0x00, 0xA8};
-unsigned char VEZDEHOD_KEY13[] PROGMEM = {0x01, 0x46, 0x81, 0x57, 0x0B, 0x00, 0x00, 0x63};
-unsigned char VEZDEHOD_KEY14[] PROGMEM = {0x01, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x2D};
-unsigned char VEZDEHOD_KEY15[] PROGMEM = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x14};
-unsigned char VEZDEHOD_KEY16[] PROGMEM = {0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xB2};
-unsigned char VEZDEHOD_KEY17[] PROGMEM = {0x01, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x74};
-unsigned char VEZDEHOD_KEY18[] PROGMEM = {0x01, 0x4C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x71};
-unsigned char VEZDEHOD_KEY19[] PROGMEM = {0x01, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x49};
-unsigned char VEZDEHOD_KEY20[] PROGMEM = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4C, 0xFF};
-unsigned char VEZDEHOD_KEY21[] PROGMEM = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00};
-unsigned char VEZDEHOD_KEY22[] PROGMEM = {0x01, 0xF0, 0xD6, 0xBC, 0x0B, 0x00, 0x00, 0xCF};
-unsigned char VEZDEHOD_KEY23[] PROGMEM = {0x01, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5D};
-unsigned char VEZDEHOD_KEY24[] PROGMEM = {0x01, 0x38, 0x3A, 0x65, 0x0E, 0x00, 0x00, 0xAD};
-*/
-unsigned char* VEZDEHOD_KEYS[] = {VEZDEHOD_KEY1, VEZDEHOD_KEY2, VEZDEHOD_KEY3, VEZDEHOD_KEY4, VEZDEHOD_KEY5, VEZDEHOD_KEY6, VEZDEHOD_KEY7, VEZDEHOD_KEY8
-/*, 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
-*/};
-
-volatile unsigned char key_count = 0;
-unsigned char current_key = 0;
-unsigned char leds_mask = 0;
-unsigned char vezdehod_mode = 0;
-uint16_t leds_time = 0;
-
-#ifdef DEBUG
-uint16_t debug_log[128];
-uint8_t debug_log_size = 0;
-#define WRITE_LOG(t) if (debug_log_size < 128) debug_log[debug_log_size++] = t
-#else
-#define WRITE_LOG(t) ;
-#endif
-
-ISR(INT0_vect)
-{
- // Выключаем прерывание после срабатывания
- // Его цель - только вывести устройство из спящего режима
- unset_bit(GICR, INT0);
-}
-
-ISR(INT1_vect)
-{
- // Выключаем прерывание после срабатывания
- // Его цель - только вывести устройство из спящего режима
- unset_bit(GICR, INT1);
-}
-
-// Включает заданные светодиоды по маске
-void set_leds(unsigned char leds_mask)
-{
- if (leds_mask & (1<<0)) set_bit(LED1_PORT, LED1_PIN); else unset_bit(LED1_PORT, LED1_PIN); // top led
- if (leds_mask & (1<<1)) set_bit(LED2_PORT, LED2_PIN); else unset_bit(LED2_PORT, LED2_PIN); // top-right led
- if (leds_mask & (1<<2)) set_bit(LED3_PORT, LED3_PIN); else unset_bit(LED3_PORT, LED3_PIN); // bottom-right led
- if (leds_mask & (1<<3)) set_bit(LED4_PORT, LED4_PIN); else unset_bit(LED4_PORT, LED4_PIN); // bottom led
- if (leds_mask & (1<<4)) set_bit(LED5_PORT, LED5_PIN); else unset_bit(LED5_PORT, LED5_PIN); // bottom-left led
- if (leds_mask & (1<<5)) set_bit(LED6_PORT, LED6_PIN); else unset_bit(LED6_PORT, LED6_PIN); // top-left led
- if (leds_mask & (1<<6)) set_bit(LED7_PORT, LED7_PIN); else unset_bit(LED7_PORT, LED7_PIN); // center led
-}
-
-// Ускоряет мигание светодиодами
-void speedup_leds(void)
-{
- leds_time+=32;
-}
-
-// Зажигаем следующий светодиод, если надо,
-// т.е. в каждый момент времени горит только один
-void update_leds(void)
-{
- leds_time++;
- if ((leds_mask & (1<<7)) && ((leds_time >> 13) % 2 == 1))
- set_leds(0);
- else set_leds(leds_mask & (1UL << (leds_time % 16)));
-}
-
-// Зажигаем следующий светодиод, но больше времени уделяем на горение,
-// т.е. светодиоды визуально светятся ярче
-void update_leds_bright(void)
-{
- leds_time++;
- if ((leds_mask & (1<<7)) && ((leds_time >> 13) % 2 == 1))
- set_leds(0);
- else set_leds(leds_mask & (1UL << (leds_time % 8)));
-}
-
-// Отображает заданную цифру
-void show_digit(unsigned char digit)
-{
- unsigned char mask = 0;
- switch (digit&0x0F)
- {
- case 0: mask = 0b00111111; break;
- case 1: mask = 0b00000110; break;
- case 2: mask = 0b01011011; break;
- case 3: mask = 0b01001111; break;
- case 4: mask = 0b01100110; break;
- case 5: mask = 0b01101101; break;
- case 6: mask = 0b01111101; break;
- case 7: mask = 0b00000111; break;
- case 8: mask = 0b01111111; break;
- case 9: mask = 0b01101111; break;
- case 0xA: mask = 0b01110111; break;
- case 0xB: mask = 0b01111100; break;
- case 0xC: mask = 0b00111001; break;
- case 0xD: mask = 0b01011110; break;
- case 0xE: mask = 0b01111001; break;
- case 0xF: mask = 0b01110001; break;
- default: mask = 0; break;
- }
- if (digit >> 4) mask |= (1<<7);
- leds_mask = mask;
- set_leds(mask);
-}
-
-// Проверяет, есть ли заданный ключ в базе
-int key_exists(unsigned char* new_key)
-{
- unsigned char i, i2, bingo;
- unsigned char old_key[8];
- for (i = 0; i < key_count; i++)
- {
- bingo = 1;
- eeprom_read_block(old_key, (void*)((i+1)*8), 8);
- for (i2 = 0; i2 < 8; i2++) if (new_key[i2] != old_key[i2]) bingo = 0;
- if (bingo) return i+1;
- }
- return 0;
-}
-
-// Считывает ключ
-int read_mode()
-{
- onewire_init();
-
- int t = 0;
- unsigned char serial[8];
- char read_ok = 0;
-
- leds_mask = 1<<6; // Во время считывания мигаем средним светодиодом
- while (BUTTON_PRESSED)
- {
- wdt_reset();
- update_leds();
- _delay_ms(1);
- }
-
- while (1)
- {
- wdt_reset();
- update_leds();
- char res = onewire_write_reset(); // Посылает 1-wire ресет
- if (res) // Если устройство ответило...
- {
- // Посылаем команду считывания ключа
- onewire_write_byte(ONEWIRE_COMMAND_READ_ROM);
- int b;
- // Читаем 8 байт из ключа
- for (b = 0; b < 8; b++)
- serial[b] = onewire_read_byte();
- // Проверяем CRC
- if ((onewire_check_crc(serial, 8) == 0) && !onewire_all_zeros(serial, 8))
- {
- read_ok = 1;
- }
- }
-
- // Теперь пытаемся прочитать цифрал-клюс
- CYFRAL_PULLUP_ENABLE; // подтяжка 750 Ом
- CYFRAL_REFERENCE_ENABLE; // делитель напряженния
- // Читаем ключ несколько раз, с проверкой
- long int code = read_cyfral_with_check();
- // Выключаем назад подтяжку и делитель напряжения
- CYFRAL_PULLUP_DISABLE;
- CYFRAL_REFERENCE_DISABLE;
- // Если ключ прочитан успешно...
- if (code >= 0)
- {
- serial[0] = 0xFF;
- serial[1] = code & 0xFF;
- serial[2] = (code>>8) & 0xFF;
- serial[3] = serial[4] = serial[5] = serial[6] = serial[7] = 0;
- read_ok = 1;
- }
- t++;
- // После 2000 неудачных попыток выходим и выключаемся
- if (t > 2000)
- return 0;
- if (BUTTON_PRESSED || USB_POWERED) // При нажатии кнопки или подключения USB...
- return 1; // возврат в основной режим
-
- // Если ключ прочитан успешно...
- if (read_ok)
- {
- read_ok = 0;
- t = 0;
-
- // Проверяем - нет ли у нас уже такого ключа?
- int exists = key_exists(serial);
- int num;
- // Если нет...
- if (!exists)
- {
- // Сохраняем ключ
- current_key = key_count;
- key_count++;
- eeprom_write_block(serial, (void*)(key_count*8), 8);
- eeprom_write_byte((void*)0, key_count);
- num = key_count;
- } else
- {
- // Иначе отображаем номер существующего
- num = exists;
- }
- // Мигаем три раза номером ключа
- for (t = 0; t < 3; t++)
- {
- show_digit(num);
- int i;
- for (i = 0;i < 300; i++)
- {
- wdt_reset();
- update_leds();
- _delay_ms(1);
- }
- set_leds(0);
- for (i = 0;i < 300; i++)
- {
- wdt_reset();
- _delay_ms(1);
- }
- }
- leds_mask = 1<<6;
- }
- }
-}
-
-// Читает байт от мастера. Таймаут - возвращает 0, ресет - 1, удачно - 2
-int ibutton_read_byte_from_master(unsigned char* value)
-{
- int i;
- *value = 0;
- for (i = 0; i < 8; i++) // Ждем команду
- {
- TCNT1 = 0; while (!ONEWIRE_MASTER_RX && (TCNT1 < 30000)); if (TCNT1 >= 30000) return 0;
- TCNT1 = 0; while (ONEWIRE_MASTER_RX && (TCNT1 < 30000));
- if (TCNT1 >= 300) return 1;
- if (TCNT1 < 45) *value |= (1 << i);
- }
- return 2;
-}
-
-// Посылает мастуру presence-pulse и ждёт команду
-int ibutton_wait_for_master3(unsigned char* key)
-{
- wdt_reset();
- set_leds(0); // Гасим светодиоды, т.к. нет времени ими мигать
- ONEWIRE_WAIT(20) // Немножко ждём
- ONEWIRE_MASTER_TX(140); // Presence-pulse
- // Ждём возобновления линии
- TCNT1 = 0; while (ONEWIRE_MASTER_RX && (TCNT1 < 30000));
- if (TCNT1 >= 300) return 1; // Если линия долго прижата мастером, это ресет
- int i, bit;
- unsigned char command = 0;
- i = ibutton_read_byte_from_master(&command); // Получаем комманду
- if (i != 2) return i;
- WRITE_LOG(command);
-
- if (command == ONEWIRE_COMMAND_SKIP_ROM) // Если нам сначала прислали SKIP_ROM команду. На практике такого не бывало.
- {
- i = ibutton_read_byte_from_master(&command);
- if (i != 2) return i;
- WRITE_LOG(command);
- }
-
- if ((command == ONEWIRE_COMMAND_READ_ROM) || (command == ONEWIRE_COMMAND_READ_ROM_ALT)) // Получили запрос, шлём ключ
- {
- for (i = 0; i < 8; i++)
- {
- for (bit = 0; bit < 8; bit++)
- {
- // Ждём запроса от мастера
- TCNT1 = 0; while ((!ONEWIRE_MASTER_RX) && (TCNT1 < 30000)); if (TCNT1 >= 30000) return 0;
- // Если нужно передать логический ноль, прижимаем линию
- if (((key[i] >> bit) & 1) == 0)
- {
- ONEWIRE_MASTER_TX(35);
- }
- // Ждём возобновления линии
- TCNT1 = 0; while (ONEWIRE_MASTER_RX && (TCNT1 < 30000));
- if (TCNT1 >= 300) return 1; // Если линия долго прижата мастером, это ресет
- }
- }
- }
-
- if (command == ONEWIRE_COMMAND_SEARCH) // Мастер выполняет поиск!
- {
- for (i = 0; i < 8; i++)
- {
- for (bit = 0; bit < 8; bit++)
- {
- char d = (key[i] >> bit) & 1; // Текущий бит
- // Ждём запроса от мастера
- TCNT1 = 0; while ((!ONEWIRE_MASTER_RX) && (TCNT1 < 30000)); if (TCNT1 >= 30000) return 0;
- if (d == 0) // Если нужно передать логический ноль, прижимаем линию
- {
- ONEWIRE_MASTER_TX(35);
- }
- // Ждём возобновления линии
- TCNT1 = 0; while (ONEWIRE_MASTER_RX && (TCNT1 < 30000));
- if (TCNT1 >= 300) return 1; // Если линия долго прижата мастером, это ресет
-
- // Ждём запроса от мастера
- TCNT1 = 0; while ((!ONEWIRE_MASTER_RX) && (TCNT1 < 30000)); if (TCNT1 >= 30000) return 0;
- if (d != 0) // Если нужно передать логическую единицу, прижимаем линию
- {
- ONEWIRE_MASTER_TX(35);
- }
- // Ждём возобновления линии
- TCNT1 = 0; while (ONEWIRE_MASTER_RX && (TCNT1 < 30000));
- if (TCNT1 >= 300) return 1; // Если линия долго прижата мастером, это ресет
-
- // Ждём сигнала от мастера
- TCNT1 = 0; while (!ONEWIRE_MASTER_RX && (TCNT1 < 30000)); if (TCNT1 >= 30000) return 0;
- // Ждём возобновления линии
- TCNT1 = 0; while (ONEWIRE_MASTER_RX && (TCNT1 < 30000));
- if (TCNT1 >= 300) return 1; // Если линия долго прижата мастером, это ресет
- char d2;
- if (TCNT1 < 45) d2 = 1; else d2 = 0; // Бит, который подтверждает мастер
- if (d != d2) return 0; // Если они не совпадают, выходим
- }
- }
- }
- return 0;
-}
-
-// Отвечает на ресет мастеру
-void ibutton_wait_for_master2(unsigned char* key)
-{
- int reset;
- do
- {
- reset = ibutton_wait_for_master3(key);
- } while (reset); // Если в результате общения получили ресет, то начинаем общение заново
-}
-
-// Ждём ресета от мастера
-void ibutton_wait_for_master(unsigned char* key)
-{
- int waittime;
- for (waittime = 0; waittime < 100; waittime++)
- {
- wdt_reset();
- TCNT1 = 0;
- while (!ONEWIRE_MASTER_RX && (TCNT1 < 30000)) // Пока нет сигнала
- {
- wdt_reset();
- update_leds();
- if (BUTTON_PRESSED || USB_POWERED) return;
- };
- // Если долго не было сигнала, ждём дальше
- if (TCNT1 >= 30000) continue;
- // Если же сигнал есть, считаем время
- TCNT1 = 0;
- while (ONEWIRE_MASTER_RX) if (TCNT1 > 30000) TCNT1 = 30000; // Пока есть сигнал
- if (TCNT1 > 300) // Не слишком короткий
- {
- ibutton_wait_for_master2(key); // Дверь заговорила, отвечаем
- }
- // Был сигнал, ждём ресета с нуля
- waittime = 0;
- }
- ibutton_wait_for_master2(key); // Не дождались, начинаем сами
-}
-
-// Режим посылки ключа
-int send_mode()
-{
- // Если ключей нет, сразу переходим в режим чтения ключей
- if (!key_count) return 1;
- int t;
- while (1)
- {
- if (current_key >= key_count) current_key = 0;
- // Показываем номер текущего ключа
- show_digit(current_key+1);
- // Ждём пока кнопку, отпустят
- while (BUTTON_PRESSED)
- {
- wdt_reset();
- update_leds_bright();
- _delay_ms(1);
- }
- unsigned char key[8];
- // В обычном режиме читаем ключ из EEPROM
- if (!vezdehod_mode)
- eeprom_read_block(key, (void*)((current_key+1)*8), 8);
- else
- { // Если режим вездехода, то читаем ключ из PGM памяти
- int i;
- for (i = 0; i < 8; i++)
- key[i] = pgm_read_byte(&VEZDEHOD_KEYS[current_key][i]);
- }
- // Включаем 1-wire
- onewire_init();
- t = 0;
- while (1)
- {
- if (key[0] == 0xFF) // Цифрал
- {
- // После 1000 попыток выключаемся
- if (t > 1000) return 0;
- wdt_reset();
- speedup_leds();
- update_leds();
- uint16_t cyfral_key = key[1] + key[2]*0x100;
- // Посылаем ключ
- cyfral_send(cyfral_key);
- }
- else if (key[0] == 0xFE) // Метаком
- {
- // После 1000 попыток выключаемся
- if (t > 1000) return 0;
- wdt_reset();
- update_leds();
- // Посылаем ключ
- metacom_send(key+1);
- } else { // iButton
- // После трёх попыток выключаемся
- if (t >= 2) return 0;
- // Переходим в режим переговоров с дверью
- ibutton_wait_for_master(key);
- }
-
- if (BUTTON_PRESSED)
- {
- t = 0;
- current_key++;
- if (current_key >= key_count) current_key = 0;
- show_digit(current_key+1);
- while (BUTTON_PRESSED)
- {
- wdt_reset();
- update_leds_bright();
- _delay_ms(1);
- t++;
- if (t >= 1000 && !vezdehod_mode) return 1; // смена режима
- }
- break;
- }
- if (USB_POWERED) return 1;
- t++;
- }
- }
-}
-
-void sleep()
-{
- onewire_init();
- set_leds(0);
- UCSRB = 0; // disable USART
- unset_bit(PORTD, 0); unset_bit(PORTD, 1); // Прижимаем USART к земле
- set_bit(DDRD, 0); set_bit(DDRD, 1);
-
- LINE_DISABLE;
- CYFRAL_PULLUP_DISABLE;
- CYFRAL_REFERENCE_DISABLE;
-
- set_bit(MCUCR, SM1); unset_bit2(MCUCR, SM0, SM2); // Power-down спящий режим
- set_bit2(GICR, INT1, INT0); // Включаем прерывания
-
- set_bit(WDTCR, WDCE), unset_bit(WDTCR, WDE); // Собаку выключаем
-
- if (BUTTON_PRESSED || USB_POWERED) return;
- sleep_mode();
-}
-
-int main (void)
-{
- UCSRB = 0; // Выключаем UART, из-за него ток утекает, куда не надо
-
- set_bit(LED1_DDR, LED1_PIN); // top led
- set_bit(LED2_DDR, LED2_PIN); // top-right led
- set_bit(LED3_DDR, LED3_PIN); // bottom-right led
- set_bit(LED4_DDR, LED4_PIN); // bottom led
- set_bit(LED5_DDR, LED5_PIN); // bottom-left led
- set_bit(LED6_DDR, LED6_PIN); // top-left led
- set_bit(LED7_DDR, LED7_PIN); // center led
-
- unset_bit(BUTTON_DDR, BUTTON_PIN); set_bit(BUTTON_OUT, BUTTON_PIN); // Подтяжка кнопки
- unset_bit(USB_DETECT_DDR, USB_DETECT_PIN); set_bit(USB_DETECT_OUT, USB_DETECT_PIN); // Подтяжка определения USB
- unset_bit(CYFRAL_PULLUP_DDR, CYFRAL_PULLUP_PIN); unset_bit(CYFRAL_PULLUP_OUT, CYFRAL_PULLUP_PIN); // Подтяжка 750 Ом выключена
- set_bit(CYFRAL_REFERENCE_DDR, CYFRAL_REFERENCE_PIN); unset_bit(CYFRAL_REFERENCE_OUT, CYFRAL_REFERENCE_PIN); // Делитель напряжения выключен
- set_bit(LINE_ENABLE_DDR, LINE_ENABLE_PIN); unset_bit(LINE_ENABLE_OUT, LINE_ENABLE_PIN); // линия выключена
- onewire_init();
-
- // Лишние ноги прижимаем к земле
- set_bit(DDRC, 4); unset_bit(PORTC, 4);
- set_bit(DDRC, 5); unset_bit(PORTC, 5);
- set_bit(DDRD, 4); unset_bit(PORTD, 4);
-
- sei();
-
- int b, i;
-/*
- LINE_ENABLE;
- CYFRAL_REFERENCE_ENABLE;
- while(1)
- for(b = 0; b < 10; b++)
- {
- if (CYFRAL_SIGNAL)
- show_digit(1);
- else
- show_digit(0);
- }
- */
-
- while (1)
- {
- set_bit(WDTCR, WDCE), set_bit(WDTCR, WDE); // Собака
- set_bit(WDTCR, WDCE), set_bit3(WDTCR, WDP2, WDP1, WDP0); // Неспешащая собака
-
- int t = 0;
- vezdehod_mode = 0;
- do
- {
- // При включении показываем бегущий по кругу светодиод
- for(b = 0; b < 6; b++)
- {
- //set_leds(1<<b);
- leds_mask = 1<<b;
- for (i = 0;i < 30; i++) // Ждём 30мс, обнуляя собаку и обновляя светодиоды
- {
- wdt_reset();
- update_leds();
- _delay_ms(1);
- }
- }
- t++;
- if (t == 5) // Если долго держим кнопку, то пишем лог для отладки или переходим в режим вездехода (в зависимости от директивы DEBUG)
- {
- show_digit(0); // Показываем 0
-#ifdef DEBUG
- eeprom_write_byte((void*)1, debug_log_size);
- eeprom_write_block((char*)debug_log, (void*)256, debug_log_size*2);
-#endif
-
- debug_log_size = 0; // Обнуляем debug-log
- for (i = 0;i < 500; i++) // Показываем 0 в течении некоторого полусекунды
- {
- wdt_reset();
- update_leds();
- _delay_ms(1);
- }
- vezdehod_mode = 1; // Включаем режим вездеход-ключей!
- current_key = 0;
-/*
- set_leds(0);
- while(1);
-*/
-
- }
- } while (BUTTON_PRESSED);
-
- if (!vezdehod_mode)
- key_count = eeprom_read_byte((void*)0);
- else
- key_count = sizeof(VEZDEHOD_KEYS) / 2;
-
- if (key_count > 63) key_count = 0;
-
- while (1)
- {
- if (USB_POWERED)
- {
- usb_mode();
- break;
- }
- LINE_ENABLE;
- if (send_mode() == 0) break;
- if (read_mode() == 0) break;
- }
-
- if (vezdehod_mode) current_key = 0;
- sleep();
- }
-
-}
-
diff --git a/ibutton.hex b/ibutton.hex
new file mode 100644
index 0000000..7f41dd8
--- /dev/null
+++ b/ibutton.hex
@@ -0,0 +1,393 @@
+:100000003CC057C065C054C053C052C051C050C05E
+:100010004FC04EC04DC014C94BC04AC049C048C0B3
+:1000200047C046C045C0F7C0F8C0F9C0FAC0FBC021
+:10003000FCC0FDC0FEC0FFC000C101C102C103C1C0
+:1000400004C105C1E6C0010000000000003D01BE82
+:1000500040115A3600E101FFFFFFFFFFFF2FFEFFB7
+:10006000FFFFFF01FFFFFFFF00009B01FFFFFFFFFE
+:10007000FF001AFFFFFFFF00000011241FBECFE5A5
+:10008000D4E0DEBFCDBF10E0A0E6B0E0EEEDF7E1DA
+:1000900002C005900D92A23FB107D9F712E0A2EF7E
+:1000A000B0E001C01D92A532B107E1F7FFD495CBB6
+:1000B000A7CF1F920F920FB60F9211248F938BB779
+:1000C0008F7B8BBF8F910F900FBE0F901F90189555
+:1000D0001F920F920FB60F9211248F938BB78F77C9
+:1000E0008BBF8F910F900FBE0F901F90189580FFC0
+:1000F00014C0A89A81FF14C0A99A82FF14C0C19AA3
+:1001000083FF14C0C29A84FF14C0C39A85FF14C031
+:10011000C59A86FD14C0C4980895A89881FDECCFB7
+:10012000A99882FDECCFC19883FDECCFC29884FDE5
+:10013000ECCFC39885FDECCFC59886FFECCFC49A71
+:1001400008958091F6009091F70080969093F700C3
+:100150008093F60008952091F6003091F7002F5F0C
+:100160003F4F3093F7002093F6004091F40047FD95
+:1001700010C02F70307081E090E0A0E0B0E004C0CB
+:10018000880F991FAA1FBB1F2A95D2F78423AFDFC0
+:10019000089535FFEECF80E0AADF08952091F600A4
+:1001A0003091F7002F5F3F4F3093F7002093F60018
+:1001B0004091F40047FD10C02770307081E090E05E
+:1001C000A0E0B0E004C0880F991FAA1FBB1F2A95AA
+:1001D000D2F784238CDF089535FFEECF80E087DFF0
+:1001E0000895282F90E0A0E0B0E08F709070A0708C
+:1001F000B070FC018031910548F080E022952F70AD
+:1002000009F080688093F40072DF0895ED5EFF4F7F
+:10021000099481E7F3CF8FE3F1CF86E0EFCF8BE551
+:10022000EDCF8FE4EBCF86E6E9CF8DE6E7CF8DE724
+:10023000E5CF87E0E3CF8FE7E1CF8FE6DFCF87E73A
+:10024000DDCF8CE7DBCF89E3D9CF8EE5D7CF89E748
+:10025000D5CFFC01108240E050E061E070E01DBCB1
+:100260001CBC869B05C08CB59DB580539547C8F3D3
+:100270008CB59DB58053954728F51DBC1CBC86994F
+:1002800005C08CB59DB580539547C8F38CB59DB519
+:100290008C529140D8F48CB59DB58D9750F49B014C
+:1002A000042E02C0220F331F0A94E2F78081822BB2
+:1002B00080834F5F5F4F4830510589F622E030E080
+:1002C000C901089520E030E0C901089521E030E03F
+:1002D000C9010895EF92FF920F931F93DF93CF937D
+:1002E0000F92CDB7DEB77C01A89580E000DF1DBC82
+:1002F0001CBC8CB59DB54497E0F38D9A1DBC1CBC0D
+:100300008CB59DB58C389105D8F38D981DBC1CBC5F
+:10031000869905C08CB59DB580539547C8F38CB5BB
+:100320009DB58C52914058F021E030E0C9010F900A
+:10033000CF91DF911F910F91FF90EF900895198257
+:100340008E010F5F1F4FC80184DF9C018230910531
+:1003500069F78091F80088230CF4F2C0E82FF0E0F0
+:10036000EE0FFF1FE250FF4F6981608311828F5FA4
+:100370008093F8006C3C09F4E5C0633341F06F30C2
+:1003800031F0603F09F445C020E030E0CFCF40E0DD
+:1003900050E020E030E0F701E40FF51F1DBC1CBC6D
+:1003A000869B05C08CB59DB580539547C8F38CB529
+:1003B0009DB58053954740F7808190E0022E02C0A2
+:1003C000959587950A94E2F780FD08C08D9A1DBC2B
+:1003D0001CBC8CB59DB58397E0F38D981DBC1CBCEF
+:1003E000869905C08CB59DB580539547C8F38CB5EB
+:1003F0009DB58C52914008F097CF2F5F3F4F28302A
+:10040000310561F64F5F5F4F4830510509F0C1CFAC
+:10041000B8CF60E070E0F701E60FF71F8081E82FAA
+:10042000F0E040E050E01DBC1CBC869B05C08CB5D4
+:100430009DB580539547C8F38CB59DB580539547BE
+:1004400008F0A2CFCF01042E02C0959587950A949B
+:10045000E2F7382F317080FD08C08D9A1DBC1CBC9E
+:100460008CB59DB58397E0F38D981DBC1CBC869917
+:1004700005C08CB59DB580539547C8F38CB59DB527
+:100480008C52914008F050CF1DBC1CBC869B05C00F
+:100490008CB59DB580539547C8F38CB59DB58053F9
+:1004A000954708F071CF332341F08D9A1DBC1CBCD9
+:1004B0008CB59DB58397E0F38D981DBC1CBC8699C7
+:1004C00005C08CB59DB580539547C8F38CB59DB5D7
+:1004D0008C52914008F028CF1DBC1CBC869B05C0E7
+:1004E0008CB59DB580539547C8F38CB59DB58053A9
+:1004F000954708F049CF1DBC1CBC869905C08CB53A
+:100500009DB580539547C8F38CB59DB58C529140ED
+:1005100008F00ACF8CB59DB520E08D9708F421E056
+:10052000321709F031CF4F5F5F4F4830510509F066
+:100530007ACF6F5F7F4F6830710509F06CCF24CFA1
+:10054000698118CFC80185DE9C018230910509F0D0
+:10055000EDCE8091F80088236CF0E82FF0E0EE0FEC
+:10056000FF1FE250FF4F6981608311828F5F80938C
+:10057000F80003CF698101CFCF93DF93EC01CE0167
+:10058000A9DE892BE1F7DF91CF910895EF92FF92D9
+:100590000F931F93CF93DF938C01C0E0D0E030E343
+:1005A000E32E35E7F32EA8951DBC1CBC869B12C01C
+:1005B0008CB59DB58053954768F4A895CCDD839B99
+:1005C00002C08299F3CFDF91CF911F910F91FF90DD
+:1005D000EF9008958CB59DB580539547A8F41DBC48
+:1005E0001CBC869909C08CB59DB581539547C8F34D
+:1005F000FDBCECBC869BF7CF8CB59DB58D52914070
+:1006000050F4C1E0D0E0CFCF2196C436D1055CF2E2
+:10061000C801B2DFD8CFC801AFDFF3CF45D380E048
+:1006200066DD1AB890989198889A899AC698BF986A
+:10063000C798C09885B7806285BF85B78F7A85BF18
+:100640008BB7806C8BBF81B5806181BD81B5877FA1
+:1006500081BD839B09C0829B07C085B7806885BF29
+:10066000889585B78F7785BF0895BF92CF92DF9227
+:10067000EF92FF920F931F93DF93CF93CDB7DEB727
+:1006800028970FB6F894DEBF0FBECDBF7C018091D6
+:10069000F200882369F1BB246E010894C11CD11CAF
+:1006A0000B2D10E00F5F1F4FB801660F771F660F0D
+:1006B000771F660F771FC60148E050E060D841E021
+:1006C00020E030E0F701E20FF31FD601A20FB31FC5
+:1006D00090818C91981340E02F5F3F4F2830310577
+:1006E00089F7442339F4B3948091F200B816C0F22C
+:1006F00000E010E0C80128960FB6F894DEBF0FBEE8
+:10070000CDBFCF91DF911F910F91FF90EF90DF90C0
+:10071000CF90BF9008958F929F92AF92BF92CF9249
+:10072000DF92EF92FF920F931F93DF93CF93CDB79A
+:10073000DEB728970FB6F894DEBF0FBECDBF80910D
+:10074000F200882309F48FC06E010894C11CD11CEB
+:10075000A0EDAA2EA7E0BA2EF2E08F2E912C8C0EDF
+:100760009D1E8091F2009091F300981708F091C0BF
+:10077000892F8F5F36DD839907C0A8950FDDC501EE
+:100780000197F1F7839BF9CF8091F500882309F455
+:1007900090C0E091F300F0E0EE0FFF1FE05AFF4F32
+:1007A0002081318180E090E0F901E80FF91FE491A8
+:1007B000D601A80FB91FEC93019688309105A1F7D7
+:1007C00073D200E010E089818F3F91F08E3F09F4F1
+:1007D00064C0023011050CF069C0C601D7DE839BEE
+:1007E00020C0829B40C00F5F1F4F89818F3F71F7F0
+:1007F00023E0093E12070CF059C0A8958091F6003D
+:100800009091F70080969093F7008093F600A3DC18
+:10081000FB80EE248A819701280F311DC90161D424
+:10082000DECF9091F3009F5F9093F3008091F200F0
+:10083000981718F01092F30090E0892F8F5FD1DCA9
+:1008400000E010E083998DCFA895A8DCC501019741
+:10085000F1F70F5F1F4F83E0083E18079CF380916C
+:10086000F500882379F721E030E0C90128960FB61A
+:10087000F894DEBF0FBECDBFCF91DF911F910F91D6
+:10088000FF90EF90DF90CF90BF90AF909F908F90B0
+:1008900008951092F30090E06BCF33E0093E130708
+:1008A0002CF4A89558DCC401D8D699CF20E030E0CC
+:1008B000DCCF6091F30070E06F5F7F4F660F771FB2
+:1008C000660F771F660F771FC60148E050E057D7C5
+:1008D00077CF5F926F927F928F929F92AF92BF92EB
+:1008E000CF92DF92EF92FF920F931F93DF93CF93FC
+:1008F000CDB7DEB728970FB6F894DEBF0FBECDBFD9
+:10090000D3D180E48093F400839909C000ED17E00F
+:10091000A89521DCC8010197F1F7839BF9CFCC247E
+:10092000DD243E010894611C711C99E0A92EB12CB4
+:10093000AC0EBD1E88248A9480EDE82E87E0F82E48
+:1009400000E4502EA89507DCBCD1882309F05CC0D8
+:1009500010E0C79ABF9AC09A81D3BF98C798C09831
+:1009600097FD0FC089826A83BB2797FDBA95A92F8F
+:10097000982F872F8B8318861F821E821D821C82D0
+:1009800011E00894C11CD11CF1EDCF16F7E0DF0691
+:100990000CF089C0839B50C0829B4EC0112391F202
+:1009A000C30163DE009709F460C0982ECC24DD24D7
+:1009B000892D17DC00E010E0A895CDDBC701019779
+:1009C000F1F70F5F1F4F81E00C321807A9F780E0A5
+:1009D0008EDB20E030E0A895C7010197F1F72F5F8B
+:1009E0003F4FE1E02C323E07B1F70894C11CD11C07
+:1009F000F3E0CF16D104E1F65092F400A895ABDBFA
+:100A000060D1882309F4A4CF83E3F2D18301A7D175
+:100A1000F80181938F01EA15FB05C9F7C30168E06E
+:100A200001D2882309F094CFC30168E017D288234C
+:100A300009F08ECF11E08DCF21E030E0C90128967A
+:100A40000FB6F894DEBF0FBECDBFCF91DF911F91DF
+:100A50000F91FF90EF90DF90CF90BF90AF909F905D
+:100A60008F907F906F905F9008958091F2008093B7
+:100A7000F3008091F2008F5F8093F2006091F200AA
+:100A800070E0660F771F660F771F660F771FC30131
+:100A900048E050E08CD66091F20080E090E090D683
+:100AA0009090F20083CF20E030E0C8CF8F929F92E9
+:100AB000AF92BF92CF92DF92EF92FF920F931F936C
+:100AC000CF93DF931AB8A09AA19AB99ABA9ABB9A0F
+:100AD000BD9ABC9A8B98939A8A98929ABF98C79815
+:100AE000B89AC098BE9AC698DFD0A49AAC98A59A36
+:100AF000AD988C9A9498789451E0A52EB12C40ED45
+:100B0000E42E47E0F42E9924939438E0832E81B5A7
+:100B1000806181BD81B5886081BD81B5806181BD05
+:100B200081B5876081BD1092F500CC24DD2400E002
+:100B300010E0C501002E02C0880F991F0A94E2F749
+:100B40008093F400C0E0D0E0A89505DBC7010197D1
+:100B5000F1F72196CE31D105B9F70F5F1F4F06305F
+:100B6000110539F70894C11CD11C85E0C816D104C1
+:100B700001F1839BDCCF8091F500882309F43DC00F
+:100B80008092F2008091F200803410F01092F20016
+:100B9000829B39C0C69ABFDD892B19F09ADE892B5A
+:100BA000B9F78091F500882311F01092F30036DD3B
+:100BB000AECF80E016DB81E090E06091F80000D6D7
+:100BC0004091F80050E0440F551F8EEF90E060E038
+:100BD00071E0EDD51092F800C0E0D0E0A895BBDA46
+:100BE000C7010197F1F7219681E0C43FD807B1F71B
+:100BF0009092F5001092F300BCCF80E090E0CFD54A
+:100C00008093F200BFCFAFD3CCCF89E189B910BCBC
+:100C100080E98AB980B5806480BD08955D9BFECF70
+:100C20008CB90895982F92959F709A3070F4905DCA
+:100C30008F708A3040F4805D5D9BFECF9CB95D9BD8
+:100C4000FECF8CB90895895CF7CF995CF1CFFC0198
+:100C50008081882339F05D9BFECF8CB931968081ED
+:100C60008823C9F708959C01411551056105710557
+:100C700099F080E090E0A0E0B0E0F901E80FF91F02
+:100C8000E0815D9BFECFECB90196A11DB11D8417DB
+:100C90009507A607B70788F3089581B38F7981BBBD
+:100CA00082B38F7982BB08958EB582608EBD8EB57A
+:100CB0008A7F8EBD81B38F7981BB82B38F7982BBEE
+:100CC000089581B38F7981BB82B38F7982BB8D9A6E
+:100CD00020E030E01DBC1CBC8CB59DB58436910570
+:100CE000D8F32F5F3F4F25303105A1F78D9840E0B5
+:100CF00050E020E030E0869902C041E050E01DBCA9
+:100D00001CBC8CB59DB5892BE1F32F5F3F4F81E073
+:100D1000243F380781F7842F089581B38F7981BBF1
+:100D200082B38F7982BB8D9A1DBC1CBC8CB59DB5DE
+:100D30000597E0F38D981DBC1CBC8CB59DB505973F
+:100D4000E0F31DBC1CBC21E0869B20E08CB59DB56A
+:100D500085369105C8F31DBC1CBC822F0895EF9207
+:100D6000FF921F93CF93DF9310E0C0E0D0E081E0CB
+:100D7000E82EF12CD2DF882341F0C7010C2E02C0EF
+:100D8000880F991F0A94E2F7182B2196C830D105D5
+:100D900089F7812FDF91CF911F91FF90EF900895F8
+:100DA00091B39F7991BB92B39F7992BB882381F0D5
+:100DB0008D9A1DBC1CBC8CB59DB50A97E0F38D982F
+:100DC0001DBC1CBC8CB59DB58B349105D8F3089522
+:100DD0008D9A1DBC1CBC8CB59DB58B349105D8F388
+:100DE0008D981DBC1CBC8CB59DB50A97E0F3089589
+:100DF0000F931F93CF93DF93082F10E0C0E0D0E054
+:100E0000C8010C2E02C0959587950A94E2F781706F
+:100E1000C7DF2196C830D10599F7DF91CF911F9197
+:100E20000F910895582F6623B9F09C01F90130E025
+:100E30004CE8208190E001C02695822F83273695CB
+:100E400080FD34279F5F9830B9F731968E2F851B30
+:100E5000861778F3832F089580E00895FC016623B8
+:100E600061F08081882359F490E004C0818131963B
+:100E7000882329F49F5F9617C8F381E0089580E0E6
+:100E8000089580B3829586958695837080FF06C00D
+:100E900082B3806682BB81B3806681BB0895482F90
+:100EA00050E060E070E020E030E0DB01CA01022E9B
+:100EB00004C0B695A795979587950A94D2F7817047
+:100EC0009070892BA9F08D9A1DBC1CBC8CB59DB56A
+:100ED00089369105D8F38D981DBC1CBC8CB59DB589
+:100EE0008497E0F32F5F3F4F24303105F1F60895EA
+:100EF0008D9A1DBC1CBC8CB59DB5C597E0F38D9833
+:100F00001DBC1CBC8CB59DB580359105D8F32F5FF9
+:100F10003F4F2430310549F6EACFEF92FF921F93FD
+:100F2000DF93CF93CDB7DEB7C85CD0400FB6F8944F
+:100F3000DEBF0FBECDBFDE0111967D01FD0120E0B9
+:100F400030E01DBC1CBC459B05C08CB59DB58050D8
+:100F50009440C8F38CB59DB58050944008F06BC0A8
+:100F60001DBC1CBC459905C08CB59DB580509440F6
+:100F7000C8F38CB59DB58050944008F05CC08CB52A
+:100F80009DB5819391932F5F3F4F24363105C9F66C
+:100F900021E030E008C0A90112962F5F3F4F403496
+:100FA00051050CF048C08D919C91119787349105A3
+:100FB00090F3A90112968D919C9113978734910516
+:100FC00058F314968D919C9115978734910520F3D1
+:100FD00016968D919C91179786349105E8F6D90164
+:100FE000139660E070E040E050E0142FFD01EE0F3A
+:100FF000FF1FEE0DFF1D20E030E0808191818734DE
+:10100000910548F0C901012E02C0880F991F0A946A
+:10101000E2F7682B792B2F5F3F4F32962430310552
+:1010200061F714964E5F5F4F40315105F1F69B0119
+:1010300040E050E004C02FEF3FEF4FEF5FEFB9010A
+:10104000CA01C853DF4F0FB6F894DEBF0FBECDBF45
+:10105000CF91DF911F91FF90EF900895AF92BF92D3
+:10106000CF92DF92EF92FF920F931F93CF93DF9374
+:10107000AA24BB246501EE24FF248701C0E0D0E050
+:1010800009C05B016C01EE24FF2487012196CA3060
+:10109000D105B1F042DF97FDF4CFA616B706C8061A
+:1010A000D90679F70894E11CF11C011D111D83E09C
+:1010B000E816F104010511054CF3A601950104C0E1
+:1010C0002FEF3FEF4FEF5FEFB901CA01DF91CF91F3
+:1010D0001F910F91FF90EF90DF90CF90BF90AF9056
+:1010E0000895CF92DF92EF92FF920F931F93CF93C9
+:1010F000DF936C0120E030E047E050E060E070E01A
+:10110000DB01CA01022E04C0B695A7959795879575
+:101110000A94D2F781709070892B09F47BC08D9A64
+:101120001DBC1CBC8CB59DB589369105D8F38D9836
+:101130001DBC1CBC8CB59DB58497E0F32F5F3F4F61
+:1011400024303105E9F6C0E0D0E091E0E92EF12C41
+:10115000012D112DF6D7FFD7C6010C2E02C0969592
+:1011600087950A94E2F783709070A801970104C0F4
+:10117000220F331F441F551F8A95D2F7422F50E08C
+:1011800060E070E020E030E0DB01CA01022E04C024
+:10119000B695A795979587950A94D2F78170907028
+:1011A000892B11F18D9A1DBC1CBC8CB59DB589365F
+:1011B0009105D8F38D981DBC1CBC8CB59DB584974A
+:1011C000E0F32F5F3F4F24303105F1F62296C03116
+:1011D000D10509F0BFCFDF91CF911F910F91FF9003
+:1011E000EF90DF90CF9008958D9A1DBC1CBC8CB5FC
+:1011F0009DB5C597E0F38D981DBC1CBC8CB59DB505
+:1012000080359105D8F32F5F3F4F2430310509F029
+:10121000BBCFDCCF8D9A1DBC1CBC8CB59DB5C597D2
+:10122000E0F38D981DBC1CBC8CB59DB58035910537
+:10123000D8F32F5F3F4F2430310509F061CF83CFC2
+:101240001F920F920FB60F9211242F933F934F933B
+:101250008F939F93EF93FF9341E05F9B22C02CB14C
+:101260002D3059F12A3049F1203209F45FC08091C4
+:10127000FE01882361F58091F9009091FA000196B2
+:101280004E9758F78091F9009091FA00FC01E95FC0
+:10129000FD4F208301969093FA008093F9005F99A7
+:1012A000DECFFF91EF919F918F914F913F912F91C1
+:1012B0000F900FBE0F901F901895E091F900F091DC
+:1012C000FA00E95FFD4F10824093FD00C6CF322F38
+:1012D00030533A3030F0822F8154863008F0BDCF41
+:1012E00037508091FB009091FC0040970CF0B5CFF7
+:1012F0008091FB009091FC0080FF23C0E091FB00F7
+:10130000F091FC00F7FD2BC0F595E795E150FE4FFD
+:1013100080813F70382B30838091FB009091FC00DE
+:1013200001969093FC008093FB0097CF8091FE0183
+:10133000882321F41092FC001092FB004093FE01E0
+:101340008CCFE091FB00F091FC00F7FD0AC0F59511
+:10135000E7953295307FE150FE4F3083DDCF3196F7
+:10136000D3CF3196F4CF2F923F924F925F926F92EC
+:101370007F928F929F92AF92BF92CF92DF92EF9225
+:10138000FF920F931F93DF93CF93CDB7DEB72897CC
+:101390000FB6F894DEBF0FBECDBF1092FA001092C8
+:1013A000F9001092FE011092FD0080E090E0FC0137
+:1013B000E150FE4F1082019688309105C1F780E020
+:1013C00090E0EDD1882E21DC71E0272E312C68ECE5
+:1013D000E62EF12C2E010894411C511C59E0652E7B
+:1013E000712C6C0E7D1E829994C000E010E0A895CF
+:1013F000C101002E02C0880F991F0A94E2F777D628
+:1014000024EF31E0C7010197F1F721503040D1F7C7
+:101410008091FD00882309F495C08091F900909196
+:10142000FA00181619060CF060C0539A80E29EE488
+:101430000197F1F76091D0007091D10087E092E0C0
+:1014400095D1009709F485C06091D9007091DA00B8
+:1014500087E092E08BD1009709F4B9C06091E00079
+:101460007091E10087E092E081D1009709F07AC0A5
+:1014700086E990E0ECDB882DD5DB9924939448E055
+:10148000C42ED12CA82CBB240894A11CB11CAA0CDE
+:10149000BB1CAA0CBB1CAA0CBB1CCA14DB04E9F0C5
+:1014A0008EE990E0D4DB892DBDDB86EA90E0CFDBCE
+:1014B000C201B60148E050E062D18201F801819199
+:1014C0008F01B0DB06151705C9F7939488E090E00B
+:1014D000C80ED91ECA14DB0419F788EA90E0B7DBFE
+:1014E00080E29EE40197F1F753981092FA0010926F
+:1014F000F9001092FE011092FD0080E090E0FC01E6
+:10150000E150FE4F1082019688309105C1F7829B11
+:101510006CCF28960FB6F894DEBF0FBECDBFCF912B
+:10152000DF911F910F91FF90EF90DF90CF90BF90D0
+:10153000AF909F908F907F906F905F904F903F9073
+:101540002F9008950F5F1F4F0630110509F44BCF00
+:101550004ECF80E790E07BDB80E29EE40197F1F7DD
+:101560005398C3CF6091E8007091E90087E092E062
+:10157000FDD00097F9F06091F0007091F10087E0E4
+:1015800092E0F4D00097F9F48394682D70E0660F30
+:10159000771F660F771F660F771F8FEF91E048E088
+:1015A00050E005D180E090E0682D0AD18DEA90E00E
+:1015B0004EDBD2CF80E090E060E002D18DEA90E097
+:1015C00046DB8824C9CF87EB90E041DBC5CF80E9BB
+:1015D00090E03DDBF89481B5886081BDFFCF482F56
+:1015E00050E060E070E020E030E0DB01CA01022E54
+:1015F00004C0B695A795979587950A94D2F7817000
+:101600009070892BA9F08D981DBC1CBC8CB59DB524
+:1016100084369105D8F38D9A1DBC1CBC8CB59DB544
+:10162000C297E0F32F5F3F4F28303105F1F6089560
+:101630008D981DBC1CBC8CB59DB5C297E0F38D9AEE
+:101640001DBC1CBC8CB59DB584369105D8F32F5FAD
+:101650003F4F2830310549F6EACF0F931F93CF93C0
+:10166000DF938C018D9A1DBC1CBC8CB59DB5863951
+:101670009105D8F38D981DBC1CBC8CB59DB5C29747
+:10168000E0F38D9A1DBC1CBC8CB59DB584369105CC
+:10169000D8F38D981DBC1CBC8CB59DB584369105C6
+:1016A000D8F38D9A1DBC1CBC8CB59DB5C297E0F3D8
+:1016B0008D981DBC1CBC8CB59DB5C297E0F38D9A6E
+:1016C0001DBC1CBC8CB59DB584369105D8F38D9896
+:1016D000C0E0D0E040D5F801EC0FFD1F8081482F1D
+:1016E00050E060E070E020E030E0DB01CA01022E53
+:1016F00004C0B695A795979587950A94D2F78170FF
+:101700009070892BE9F08D981DBC1CBC8CB59DB5E3
+:1017100084369105D8F38D9A1DBC1CBC8CB59DB543
+:10172000C297E0F32F5F3F4F28303105F1F6219645
+:10173000C430D10579F6DF91CF911F910F910895B3
+:101740008D981DBC1CBC8CB59DB5C297E0F38D9ADD
+:101750001DBC1CBC8CB59DB584369105D8F32F5F9C
+:101760003F4F2830310509F0C0CFE1CFFB01DC014C
+:101770008D91019080190110D9F3990B0895DC0126
+:10178000CB01FC01E199FECF06C0FFBBEEBBE09AA6
+:1017900031960DB20D9241505040B8F70895E1993D
+:1017A000FECF9FBB8EBBE09A99278DB30895DC01D5
+:1017B000CB0102C02D9105D041505040D8F708957B
+:1017C000262FE199FECF9FBB8EBB2DBB0FB6F894A1
+:0E17D000E29AE19A0FBE01960895F894FFCFB9
+:1017DE0046004E0056005E0063006B0073007600FC
+:1017EE0069427574746F6E204D756C74696B657992
+:1017FE0020627920436C75737465720D0A3E200069
+:10180E004F4B2E0D0A00436F756E743A20000D0A71
+:10181E004B65793A200020000D0A3E2000446F6E81
+:10182E00652E0D0A3E2000556E6B6E6F776E20632F
+:10183E006F6D6D616E640D0A3E20006E616D650008
+:10184E00CB007265626F6F7400D2007265616400C6
+:10185E00DB00657261736500E20077726974650082
+:02186E00EA008E
+:00000001FF
diff --git a/ibutton3.lay6 b/ibutton3.lay6
index 4f114fb..891bce8 100644
--- a/ibutton3.lay6
+++ b/ibutton3.lay6
Binary files differ