diff options
author | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2014-01-22 22:08:11 +0400 |
---|---|---|
committer | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2014-01-22 22:08:11 +0400 |
commit | 6ae7f93ce562a140a76e704c68a1ac7f812b5e85 (patch) | |
tree | 7215120fdfb632d880e081862cdf8176c3114e0e | |
parent | ced434cba51302bb36bfecb16da5909f8e5d2d03 (diff) |
main.c
-rw-r--r-- | .gitignore | 12 | ||||
-rw-r--r-- | Bootloader/main.hex | 56 | ||||
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | ibutton.c | 615 | ||||
-rw-r--r-- | ibutton.hex | 393 | ||||
-rw-r--r-- | ibutton3.lay6 | bin | 52623 -> 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 @@ -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 Binary files differindex 4f114fb..891bce8 100644 --- a/ibutton3.lay6 +++ b/ibutton3.lay6 |