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 14:07:29 +0400
committerAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2014-01-22 14:07:29 +0400
commit70b17eb5286357b7edc7490f1fa4be944a709931 (patch)
tree5d5aec7a531b116ef3b4ca46d2029aebc56795b4
parent5207d7532021239d648a4d4dc5b34fe81dab68c2 (diff)
Search command support
-rw-r--r--.gitignore2
-rw-r--r--Makefile2
-rw-r--r--ibutton.c71
-rw-r--r--onewire.c3
-rw-r--r--onewire.h1
5 files changed, 61 insertions, 18 deletions
diff --git a/.gitignore b/.gitignore
index c6fcc12..f5d8291 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,5 +10,3 @@
*.bat
*.d
*.sym
-bootloader.m8/
-bootloader/
diff --git a/Makefile b/Makefile
index 1ab7ea0..b952369 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
MCU_PROGRAMMER = m8
PROGRAMMER_TYPE = avr109
-PROGRAMMER_PORT = com4
+PROGRAMMER_PORT = com3
PRG = ibutton
OBJ = ibutton.o usart.o onewire.o cyfral.o usb.o metacom.o
diff --git a/ibutton.c b/ibutton.c
index 4df3076..7a4a365 100644
--- a/ibutton.c
+++ b/ibutton.c
@@ -13,6 +13,8 @@
#include "metacom.h"
#include "usb.h"
+#define DEBUG
+
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};
@@ -255,7 +257,7 @@ int ibutton_wait_for_master3(unsigned char* key)
WRITE_LOG(0);
wdt_reset();
set_leds(0); // гасим светодиоды, т.к. нет времени ими мигать
- ONEWIRE_WAIT(20); // delay 20us
+ ONEWIRE_WAIT(20) // delay 20us
ONEWIRE_MASTER_TX(140);
TCNT1 = 0; while (ONEWIRE_MASTER_RX && (TCNT1 < 30000));
if (TCNT1 >= 300) return 1;
@@ -270,7 +272,7 @@ int ibutton_wait_for_master3(unsigned char* key)
if (i != 2) return i;
}
- if ((command == 0x33) || (command == 0x0F)) // Получили запрос, шлём ключ
+ if ((command == ONEWIRE_COMMAND_READ_ROM) || (command == ONEWIRE_COMMAND_READ_ROM_ALT)) // Получили запрос, шлём ключ
{
for (i = 0; i < 8; i++)
{
@@ -283,7 +285,43 @@ int ibutton_wait_for_master3(unsigned char* key)
}
TCNT1 = 0; while (ONEWIRE_MASTER_RX && (TCNT1 < 30000));
WRITE_LOG(TCNT1+1);
- if (TCNT1 >= 350) return 1;
+ 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));
+ WRITE_LOG(TCNT1+1);
+ 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));
+ WRITE_LOG(TCNT1+1);
+ 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));
+ WRITE_LOG(TCNT1);
+ if (TCNT1 >= 300) return 1;
+ char d2;
+ if (TCNT1 < 45) d2 = 1; else d2 = 0; // Бит, который подтверждает мастер
+ if (d != d2) return 0; // Если они не совпадают, выходим
}
}
}
@@ -311,15 +349,16 @@ void ibutton_wait_for_master(unsigned char* key)
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) // Не слишком короткий
{
WRITE_LOG(TCNT1);
ibutton_wait_for_master2(key); // Дверь заговорила, отвечаем
- waittime = 0;
}
+ waittime = 0;
}
ibutton_wait_for_master2(key); // Не дождались, начинаем сами
}
@@ -479,26 +518,30 @@ int main (void)
}
}
t++;
- if (t == 5) // Если долго держим кнопку, то пишем лог для отладки
+ if (t == 5) // Если долго держим кнопку, то пишем лог для отладки или переходим в режим вездехода (в зависимости от директивы DEBUG)
{
- show_digit(0);
- /*
+ 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);
- */
- debug_log_size = 0;
- for (i = 0;i < 500; i++)
+ 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);
}
+#ifndef DEBUG
vezdehod_mode = 1; // Включаем режим вездеход-ключей!
current_key = 0;
-/*
+#endif
+/*
set_leds(0);
while(1);
-*/
+*/
+
}
} while (BUTTON_PRESSED);
diff --git a/onewire.c b/onewire.c
index 03d916a..18a3a62 100644
--- a/onewire.c
+++ b/onewire.c
@@ -118,7 +118,7 @@ char onewire_all_zeros(unsigned char* data, unsigned char size)
return 1;
}
-
+/*
// Поиск устройств, num - битовая маска, по которой идёт ветвление, out - указатель на 8 байт
// возвращает кол-во пройденных ветвений
int onewire_search(unsigned int num, unsigned char* out)
@@ -177,6 +177,7 @@ void onewire_search_all(void (*f)(unsigned char* out))
{
onewire_search_iter(0, -1, f);
}
+*/
// Включает мощную подтяжку к VCC
void onewire_pullup()
diff --git a/onewire.h b/onewire.h
index d538a2b..5d8f4fc 100644
--- a/onewire.h
+++ b/onewire.h
@@ -6,6 +6,7 @@
#define ONEWIRE_WAIT(t) {ONEWIRE_TIMER_REG=0; while(ONEWIRE_TIMER_REG < ONEWIRE_USEC * t);}
#define ONEWIRE_COMMAND_READ_ROM 0x33
+#define ONEWIRE_COMMAND_READ_ROM_ALT 0x0F
#define ONEWIRE_COMMAND_MATCH_ROM 0x55
#define ONEWIRE_COMMAND_READ_SCRATCHPAD 0xBE
#define ONEWIRE_COMMAND_WRITE_SCRATCHPAD 0x4E