Например TDA7294

РадиоКот > Конкурс: Поздравь Кота по-человечески 2014!

Анализ работы счетчика СЕ101

Автор: Panda_Y2K
Опубликовано 18.09.2014.
Создано при помощи КотоРед.

Что то стало скучновато, и решил тоже отметиться на конкурсе. :)

На этот раз проанализируем работу счетчика электрической энергии эне*****ра СЕ***101 на предмет уязвимости от постороннего вмешательства. Сразу скажу, что статья предназначена исключительно для образовательных целей, а работникам соответствующих служб может оказать помощь в отлове так сказать мошенников :).

Пациент

Итак приступим. Указанный выше счетчик - собран на никому неизвестной (кроме разработчиков) микросхеме, о которой соответственно в нете ничего нет, но это нас не должно останавливать на пути познания :).

Исследуя работу устройства путем подключения к нему нагрузки 1-3КВт узнаем, что микросхема на своей 22й ноге мигает светодиодом (который выведен на лицевую панель) и еще один в оптопаре передает сигнал на специально выведенные клеммы для снятия показаний электриками (каким-то своим прибором). Каждые 16 миганий внутри этой адской микросхемы что то срабатывает и она переключает счетный механизм на одно положение.

схема устройства

Механизм считает только в одну сторону соответственно, так, что скрутить показания без его разбора не получится. Вращает механизм устройство (что то вроде бифазного шагового двигателя). У него два вывода, если на один подать +5, на другой 0, механизм шагнет на шаг вперед, чтобы шагнуть еще на шаг, напряжения (выводы) необходимо поменять местами. Итак нарисовалась схема. Управление мы берем на себя, использовать будем контроллер ATTINY13.

Схема доработки

Отсоединяем вывод 22 микросхемы от резистора R26 и подключаем к выводу 7 контроллера, резистор R26 подключаем к выводу 5 контроллера. Далее перезаем две дорожки идущие к счетному механизму и соединяем ноги 2 и 3 контроллера с управлением счетным механизмом. Общий провод не сложно найти, питание всей схемы осуществляется от встроенного стабилизатора 78l05.

 

Вот такая простенькая программа зашивается в контроллер:

#include <TINY13.H>
#include <delay.h>

#define INPUT PINB.2

unsigned int code;
unsigned char k_div, /*k_div_tmp,*/ fr, out, cnt;

//**********************************************************************************
// External Interrupt 0 service routine receive command from IR remote control unit
//**********************************************************************************
interrupt [EXT_INT0] void ext_int0_isr(void)
{unsigned char ppp, pin;
unsigned int tmp, tout;
GIMSK = 0;
tmp = 1;
for(ppp = 1; ppp<14; ppp++)
{delay_us(1200); //было 1200
pin = PINB.1;
for (tout = 700; tout > 0; tout--)
if (pin != PINB.1) break;
if (tout == 0) {GIMSK = 0x40; //timeout
GIFR = 0x40;
return;};
tmp = tmp << 1;
if (!PINB.1) tmp++;
};
tmp &= 0x000F;
code = code << 8;
code &= 0xFF00;
code = code + tmp;

if (code == 0x0209) k_div = 254; //Save 50% energy
if (code == 0x0305) k_div = 252; //save 75% energy
if (code == 0x0402) k_div = 248; //save 87.5% energy
if (code == 0x0507) k_div = 255; //normal mode NO SAVE

GIFR = 0x40;
GIMSK = 0x40;
}

interrupt [TIM0_OVF] void timer0_interrupt_subroutine(void)
{
cnt--;
TCNT0 = k_div;
PORTB.0 = 1; //LED ON
if (cnt == 0)
{cnt = 16;
PORTB.3 = out & 0x01;
PORTB.4 = ~out & 0x01;
out = ~out;
};
delay_ms(250);
PORTB.0 = 0; //LED OFF
PORTB.3 = 0; //MOTOR DRIVE OFF
PORTB.4 = 0; //MOTOR DRIVE OFF
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func4=In Func3=In Func2=In Func1=In Func0=In
// State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x19;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
TCCR0B=0x07; //External pin T0 is activated, on RISING edge
TCNT0=0x00; //Clear timer counter

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
GIMSK=0x40;
MCUCR=0x02;
GIFR=0x40;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK0=0x02; //TOIE - on

// Global enable interrupts
#asm("sei")

if (fr != INPUT) fr = INPUT;
k_div = 255;
//k_div_tmp = 1;
PORTB.3 = 0;
PORTB.4 = 0;
out = 1;
cnt =16;
PORTB.0 = 1;
delay_ms(500);
PORTB.0 = 0;
delay_ms(500);
PORTB.0 = 1;
delay_ms(500);
PORTB.0 = 0;
TCNT0 = 255;
while (1)
{};
}

 

Программа считает количество импульсов пришедших с выв. микросхемы счетчика и в зависимости от установок управляет счетным механизмом. Установка производится ИК пультом стандарта RC5. Жирненьким в тексте программы выделены коды на пульте для установки режима энергосбережения. Соответственно код 29 - учитывается 50% импульсов, код 35 - учитывается 25% имульсов, код 42 - учитывается 12.5% импульсов и код 57 - учитываются все импульсы, точно так как без устройства. При включении устройство находится именно в этом режиме, соответственно если перезагрузить контроллер (выключить и включить автоматы), то устройство будет учитывать все импульсы.

Для уменьшения показаний есть еще одна уязвимость - это кварцевый резонатор. Его можно поставить на более низкую частоту, но этот аспект работы счетчика не проверялся.

PS Не рекомендуется к практическому использованию. Желаю всем за электроэнергию платить честно, что и сам делаю.

Это все...


Файлы:



Все вопросы в Форум.


ID: 1983

Как вам эта статья?

 Нравится
 Так себе
 Не нравится

Заработало ли это устройство у вас?

 Заработало сразу
 Заработало после плясок с бубном
 Не заработало совсем

19 12 22
2
Подробно