Умный дом

Программа модуля приема ИК-команд на языке С

Файл заголовка

#define MODULNAMESIM ИСИ #define CMDSIM "$"

Void putch (unsigned char) ; unsigned char getch (void); int init_comms (); int sim_num_adr () ; int cmd ();

Файл программы

11 Считываем содержимое приемного

// Первый символ адреса модуля. // Второй символ адреса модуля.

#include <picl6f62xa. h> #include <stdio. h> # include " ir_rec_fnl. h"

Unsigned char input; регистра.

Unsigned char M0D_SIM1; unsigned char M0D_SIM2; unsigned char IRSIM1; unsigned char IRSIM2; unsigned char IRSIM3;

Unsigned char coiranand_r ec іev [63; //. Массив для полученной команды.

Int PH0T0C0ME = 0; // Флаг активности фотоприемника,

Int M0D_ADDR; // Заданный адрес модуля, как число,

Unsigned char IRCOMMAND = 0;

Int M0D_ADDR; // Заданный адрес модуля, как число,

Int siml_num = 0; int sim2_num = 0; int sim_end_num = 0;

Int MOD_NUM; // Полученный адрес модуля, как число,

Int і;

Int к; int 1; int in;

Unsigned char getch() {

While((!RCIF)&(RB3 ==1)) // Устанавливается, когда регистр не пуст, continue; return RCREG;

}

Void putch (unsigned char byte) // Вывод одного байта. {

// Настройка режима приема-передачи. // Запретить прерывания. // Выключим передатчик драйвера RS485. // Настройка таймера 1, запрет прерывания. // Выбор внутреннего генератора, бит 1 в

While(ITXIF) // Устанавливается, когда регистр пуст.

Continue; TXREG = byte;

}

Int init_comms () // Инициализация модуля. {

PORTA = 0x00;

CMCON = 0x7; // Настройка портов А и В.

TRISA = 0x00; TRISB = OxFE;

PCON = 0x8; // Тактовая частота 4 МГц.

RCSTA = Obi0010000; // Настройка приемника.

TXSTA = ObOOOOOllO; // Настройка передатчика.

SPBRG = 0x68; INTCON = 0x0; RB0 = 0x0; PIEl = 0x0; T1CON = 0x0; ноль.

TMR1H = 0x00; TMR1L = 0x00; IRCOMMAND = 0x0;

// Определим номер модуля. MOD_ADDR = PORTB; // Номер модуля в старших битах.

MOD_ADDR=MOD_ADDR»4; // Сдвинем на четыре бита. }

// Преобразуем символьный адрес в число, int sim_num_adr()

{

Sim_end_num = 0x0;

MODjSIMl = conimand_reciev [1]; // Первый символ номера.

MODJSIM2 = command_reciev [2]; // Второй символ номера.

M0D_SIM1 = M0D_SIM1 - 0x30;

MOD_SIM2 = MOD_SIM2 - 0x30;

Sim_end_num = MOD_SIMl*OxOA + MODJSIM2;

Return sim_end_num;

}

Int ir_cmd () {

Int b = 0; CREN = 0;

While (RB3 == 0) continue; // Ждем окончания заголовка.

For (b=0; b<8; b++) //Обработаем наши импульсы.

{

While (RB3 != 0)

Continue; // Дождемся импульса,

Time (); // Включаем таймер 1. while (ITMR1IF); // Дождемся такта. T1CON = 0x0; II Выключаем таймер. TMR1IF = 0x0; // Сбросим флаг.

If (RB3 ==0) // Если низкий уровень, то "І".

{

IRCOMMAND = IRCOMMAND +1; // Запишем это. time (); // Включаем таймер 1. while (ITMR1IF); // Дождемся такта. T1CON = 0x0; // Выключаем таймер. TMR1IF = 0x0; // Сбросим флаг.

} else // Высокий уровень, значит "О".

{

IRCOMMAND = IRCOMMAND; // Запишем это. }

If (b<7) IRCOMMAND = IRCOMMAND«l; //Сместимся влево

На бит. }

PHOTOCOME = 0x0; RA0 = 0x0; RAl=0xl;

For (m=0; m<4; ++m) {

For (1=0; 1<10000; ++1);

}

CREN = 1; RA1 = 0;

Int cmd() {

CREN = 1; input = getch();

Switch (input) {

Case "С": // Если обращение к фото модулю.

For (i=l; i<6; ++i) // Запишем команду в массив.

{

Input = getchO;

Command_reciev [і] = input; }

MOD_NUM = sim_num_adr(); // Чтение из сети.

If (MOD_NUM! = MOD_ADDR) break; // Если не наш адрес.

Else

If (command_reciev [3] = "$") // Если команда. {

If (command_reciev [5] = "S") ir_stat();

}

Default: break; }

Void time() {

TMR1H = OxFD; переполнения. TMR1L = 0x43; T1CON = 0x1;

}

Int ir_stat() {

Int ircom; int ircoml; int ircom2; int ігсошЗ;

// Таймер 1 для чтения ИК.

// Установка числа циклов до

// FFFF минус 700 (2BCh). // Включение таймера.

Command_reciev[0] = "С"; command_reciev[l] = MOD_SIMl+0x30; command_reciev [ 2 ] = MOD_SIM2+0x30;

Ircom = IRCOMMAND; // Преобразуем команду в символы.

Ircoml = ircom/0x64;

IRSIM1 = ircoml + 0x30;

Ircom2 = (ircom - ircoml*0x64)/OxA;

IRSIM2 = ircom2 + 0x30;

ІгсошЗ = (ircom - ircoml*0x64 - ircom2*0xA); IRSIM3 = ігсотЗ + 0x30;

If (IRCOMMAND == 0) {

Coirimand_reciev[3] = "#"; command_reciev[4] = "f"; commander ec і ev [ 5 ] = "f";

CREN =0x0; // Запрещаем прием.

RB0 = 0x1; //Переключи драйвер RS485 на передачу.

TXEN = 0x1; // Разрешаем передачу.

For (i=0; i<6; ++i) putch(command_reciev[i]) ;

For (i=0;i<1000;i++); // Задержка для вывода.

For (i=0; i<6; ++i) command_reciev [i] = " ";

RB0 = 0x0; // Выключаем драйвер RS485 на передачу.

TXEN = 0x0; // Запрещаем передачу.

CREN =0x1; //Разрешаем прием.

} else //За время между двумя запросами пришла ИК

Команда. {

Command_reciev[3] = IRSIM1; command_reciev[4] = IRSIM2; command_reciev[5] = IRSIM3;

CREN =0x0; // Запрещаем прием.

RB0 = 0x1; //Переключим драйвер RS485 на передачу. TXEN = 0x1; // Разрешаем передачу for (i=0; i<6; ++i) putch(command_reciev[i]) ; for (i=0;i<1000;i++); // Задержка для вывода, for (i=0; i<6; ++i) command_reciev [i] = " "; RB0 = 0x0; // Выключаем драйвер RS485 на передачу. TXEN = 0x0; // Запрещаем передачу.

CREN =0x1; // Разрешаем прием.

}

IRCOMMAND = 0x0; //Мы передали команду, она больше не

Нужна. }

Void main (void) // Начнем работать.

{

Init_comms (); // Инициализация модуля,

For (i=0; i<6; ++i) command_reciev [і] = " "; conimand_reciev [0] = "С"; PHOTOCOME = 0x0; RAO = 0x00;

// Прочитаем и преобразуем номер модуля. MOD_ADDR = PORTB; // Номер модуля в старших битах. MOD_ADDR=MOD_ADDR»4; // Сдвинем на четыре бита.

Start: RA2 = 0x1; /./ Чтобы видно, что модуль включен. /* Нет ИК-сигнала, проверим сеть */ CREN =0x1; if (RCIF)cmdO;

If (!RB3) // Появился ИК сигнал. {

CREN =0x0;

For (k=0; k<3 0;++k); / / Поставим задержку.

If (!RB3) // ИК сигнал не пропал? {

PHOTOCOME = 0x1; RAO = 0x01;

// Обработаем ИК команду. ir_cmd (); PHOTOCOME = 0x0; RAO = 0x00; goto start;

}

} else {

PHOTOCOME = 0x0; RAO = 0x00;

CREN =0x1; }

НЕХ-файл для загрузим в программатор

:10000000830100308A000428203084004C300D2009 :10OOlOOO83OllO2AO4O68OO184OAO406O31DOA28AD :02002000003^А

:1002D8008301861D71298C1E6C291A080800FD30BF

:1002E80083018F0043308E009001900A080083013B

:1002F800CB00831203130C1E7D294B0899000800BC

:10030800F401F5010310F30CF20C031C9229700898

:10031800F40771080318710AF5070310F00DF10DC1

:1003280072087304031900348629830lB901BA01DC

:100338003C08A4003D08A500D030A407A5070A3052

:10034800F200F3012408F000F10184212508740764

:10035800B90075080318750ABA00F1003908F000E9

:1003680008008301850107309F0083168501FE3050

:10037800860008308E00903083129800063083166D

:100388009800683099008B018312061083168C013F

:10039800831290018F018E01A0010608A700A80111

:1003A8000430F000280DA80CA70CF00BD629080083

:1003B800830118166C21A6000B2AAD01AD0AAE0107

:1003C8002E08803AF00080307002063003192D02A2

:1003D8000318FA296C21A6002D083B3E84008313DC

:1003E80026088000AD0A0319AE0AE429992170088D

:0803F800A9007108AA00280603

:10040000031D042A27082906031D08002430BE0006

:100410005330C000B62A2608433A031D0800E129DC

:10042000B521AD01AE011D2A2D083B3E840083138A

:lOO430002O3O8000AD0AO319AE0A2E08803AF00081

:1004400080307002063003192D02031C142A433039

:10045000BBOOAB01AC0105100608A700A8010430E1

:10046000F000280DA80CA70CF00B312A0515181662

:100470008C1ADC218619582A1812AF01B0013008F5

:10048000803AF000803070021E3003192F020318EA

:lOO490004D2AAF0A0319B00A3F2A8619362AAB0142

:1004A000AB0AAC0105145D22AB01AC010510362A84

:1004B000AB01AC0105101816362A8301C101C20137

:1004C0001812861D612AC101C2018619652A73218D

:10O4D00O0ClC682A9001OC108619752AA00A732139

:1004E0000C1C702A90010C10762A20084208803AD1

:1004F000F000803070020730031941020318822A8D

:100500000310A00DC10A0319C20A4208803AF00084

:1005100080307002083003194102031C652AAB01C8

:10052000AC0105108514B301B4013408803AF00021 10053000803070020430031933020318В32АВ1016А 10054000B2013208803AFOOOA7307002103003196F 1005500031020318AF2AB10A0319B20AA12AB30A59 100560000319В40А952А1816851008004330830130 10057000BB002408303EBC002508303EBD002008EA 10058000C500C6016430F200F3014608F1004508D9 10059000F000B1237408C7007508C8004708303E52 1005A000A1006430F200F3014808F1004708F000B0 1005B00084214608F1004508F0007408F002031C8D 1005C000F1037508F1020A30F2000030F301B123A3 1005D0007408C3007508C4004308303EA2000A3006 1005E000F200F3014408F1004308F000842174088C 1005F000C9007508CA006430F200F3014808F10030 100600004708F00084214608F1004508F00074080E 10061000F002031CF1037508F1024908F002031C03 10062000F1034A08F1027008C1007108C2004108D4 10063000303EA300A008031D632B2330BE006630AC 10064000BF00C00018120614831698168312AD015D 10065000AE012E08803AF000803070020630031997 100660002D0203183D2B2D083B3E84008313000808 100670007B21AD0A0319AE0A292BAD01AE012E086C 10068000803AF00083307002E83003192D0203181D 100690004D2BAD0A0319AE0A3F2BAD01AE012E085A 1006A000803AF00080307002063003192D020318E2 1006B000AA2B2D083B3E8400831320308000AD0A16 1006C0000319AE0A4F2B2108BE002208BF002308E1 1006D000C00018120614831698168312AD01AE01DD 1006E0002E08803AF00080307002063003192D0287 1006F0000318842B2D083B3E8400831300087B21C4 10070000AD0A0319AE0A702BAD01AE012E08803A76 10071000F00083307002E83003192D020318942B87 10072000AD0A0319AE0A862BAD01AE012E08803A40 10073000F00080307002063003192D020318AA2B36 100740002D083B3E8400831320308000AD0A03193E 10075000АЕ0А962В06108316981283121816А00163 100760000800F601F11FBB2BF009F00A0319F10391 10077000F1097617F61773088039F606F31FC72BB1 10078000F209F20A0319F303F309C72BF601F40186 10079000F50172087304031DD02BF001F101003440 1007A0001F30F6040310F60AF20DF30D031CD32BD1 1007B000F30CF20C73087102031DE02B7208700237 1007C000031CE82B7208F0027308031C730AF10281 1007D000F40DF50DF60BF61AD82BF61FF42BF409D1

:1007E000F40A0319F503F5097408F2007508F3001B :1007F000761F0034F009FOOA0319F103F1090034FF :00000001FF

А для тех, кто не потерял интерес к процессу разработки собственных модулей и не спешит, я продолжу рассказ.

Итак. Какие требования мы предъявим к нашему модулю приемника инфракрасных кодов? Учтем, что основная задача модуля - принимать коды, которые мы назовем системными.

В качестве системных кодов, удобно было бы взять числа от 1 до 255 в формате выше разобранной структуры ИК-кода. На данном этапе примем этот вариант. Повторим еще раз, как будет выглядеть системный ИК-код. Вспышка с несущей частотой 37 кГц длительностью 2,2 мс (заголовок). Байт ко­манды от 1 до 255 с соответствующими вспышками и пауза­ми. Пауза 25 мс между командами.

Требования к модулю:

• модуль должен принимать системные ИК-команды с не­сущей частотой 37 кГц;

• модуль должен ответить на запрос центрального управ­ляющего устройства (компьютера) по интерфейсу RS485, обозначив номер принятой ИК-команды.

Несколько слов о комплектующих элементах. Разумнее всего, с моей точки зрения, использовать фотоприемник TSOP1737 - рис. 1.46 - (если вы задействуете пульт с несу­щей частотой 37 кГц, в противном случае следует выбрать другой фотоприемник из этой серии). На рис. 1.47 схема его включения.

Программа модуля приема ИК-команд на языке С

Рис. 1.46. Внешний вид и выводы фотоприемника

-o+5V

>10к

Optional

MC

I

Application Circuit

TSOF17.. 4 ym 100*)

' П І

-oGND

TSAL62^f ^ 3 Out_____________

9612108

Рис. 1.47. Типовая схема включения фотоприемника TSOP

Конденсатор 4,7 мкФ желательно располагать непосред­ственно около фотоприемника, если между модулем и при­емником несколько метров провода. Подобное может про­изойти, если вы не удовлетворитесь проверкой на макетной плате, а захотите воплотить модуль в жизнь и при этом реши­те убрать сам модуль подальше, а на виду оставить только фотоприемник. Фотоприемник невелик по габаритам, его можно приклеить с помощью двустороннего скотча на панель телевизора. Именно в этом случае я советую непосредствен­но к ножкам фотоприемника припаять конденсатор 4,7 мкФ. На выходе фотоприемника формируются сигналы (рис. 1.48): в отсутствие команд его выход в высоком состоянии; при на­личии ИК-пульсаций (с частотой 37 кГц), он переходит в низ­кое состояние.

Output Signal, (see Fig. 10)

ППППП

Ton^ І I I Toff t

948134

Vo Voh VoL

Рис. 1.48. Типовой вид сигнала на выходе фотоприемника

Здесь время Топ соответствует посылке ИК-импульсов, Toff - паузе.

Можно приступать к написанию программы.

Как и прежде, для установки заданного адреса используем четыре старших бита порта В (RB7-RB4). Для работы с сетью применим встроенный в микроконтроллер блок USART, а фотоприемник подключим к выводу RA6. Добавим еще свето - диод для индикации наличия сигнала, который подключим

К выводу RA0. Поскольку остальные выводы портов нас не ин­тересуют, отметим только, что в отличие от предыдущей кон­фигурации порта А - вывод RA6 - следует установить на ввод (в предыдущем варианте порт работал на вывод)

Основные блоки программы:

• инициализация модуля;

• ожидание активности приемника USART;

• ожидание активности от фотоприемника;

• обработка сетевой команды от компьютера;

• обработка ИК-команды от фотоприемника.

В предыдущей программе мы могли спокойно лсдать актив­ности в сети и ни о чем не заботиться, в этой программе нам приходится откликаться на два события - активность в сети и активность фотоприемника. Будем считать, что главное - это ожидание активности фотоприемника, и попробуем предста­вить, что будет происходить при работе с реальной системой.

Каждое слово команды, состоящее из 6 байт, занимает (байт - 44 мкс) 0,264 мс. Положим, мы добавим 0,5 мс между командами.

Основное занятие компьютера - постоянный опрос моду­лей, поскольку программа должна выявлять события (измене­ние состояния модулей) и выполнять действия, соответству­ющие этим событиям. В данном плане модуль, который опрашивает и сеть, и фотоприемник, должен отслеживать изменения в обоих источниках. Пока модуль «слушает» сеть, он не «слышит» фотоприемник, и наоборот.

Вероятно, разумно было бы использовать механизм преры­вания, хотя бы для работы по прерыванию с фотоприемни­ком. Основанием стал бы тот факт, что в сети циркулируют запросы состояния, на которые модуль постоянно «отвлекает­ся». При этом легко пропустить изменение состояния фото­приемника. Но для начала попробуем оценить ситуацию.

Мы определили длительность заголовка ИК-команды в 2,75 мс. Основное назначение заголовка - дать «понять» фо­топриемнику, что далее последует команда.

Таким образом, изменение состояния фотоприемника с целью «привлечь внимание» контроллера модуля будет длить­ся около трех миллисекунд. За это время успеет пройти около 10 (длительность слова команды в сети около 0,3 мс) слов команды. А это дает основания предполагать, что модуль успеет все «оценить» и перейдет к приему ИК-команды. В от­сутствие прерываний он примет команду полностью, если это системная команда, прежде чем вернется к прослушива­нию сети.

Однако скорость поступления ИК-команд едва ли будет превышать 0,3 с (интервал между двумя нажатиями на одну и ту же клавишу). То есть, за время между поступлениями ко­манд у компьютера будет возможность послать около 1000 за­просов. В итоге, если мы не планируем программу, которая будет нуждаться в 2000 запросов, а пользователь не будет иг­рать на клавишах управления, как на рояле, особых проблем возникнуть не должно...

Мы не собираемся строить очень разветвленную сеть с большим количеством устройств. Но даже если бы мы этого захотели, то могли бы увеличить скорость работы в сети с 9600 бит/с (в наших рассуждениях) до 115 000 бит/с. Это из­менение увеличило бы число возможных запросов до 12 000. Реальное время между командами я бы тоже оценил в 3-30 с, что позволило бы увеличить количество возможных сетевых запросов до 120 000. Если это не поможет, что ж, переделаем все полностью!

Итак, предварительная оценка, не исключаю, что ошибоч­ная, позволяет нам считать возможной работу модуля без ис­пользования прерывания. На том и порешим.

Писать программу на ассемблере или на языке С? Я, пожа­луй, пока не перестанет работать демонстрационная версия компилятора С, использую эту возможность.

Умный дом

Программа для компьютера в KDevelop

Причина, по которой я хочу рассказать о другой среде про­граммирования, именно KDevelop, работающей с операци­онной системой Linux, - в ее большей доступности для мно­гих, чем Visual Basic. Эта среда программирования …

Условные выражения

Условия выражения if должны быть записаны в круглых скобках. Если они истинны, выражение, непосредственно следующее за if, выполняется: // #5 If (usr_rsp == "N" II usr_rsp == V) go_for_.it = …

Вторая версия основной программы на языке С++

/****************^ * TOC o "1-3" h z Copyright (С) 2006 by Vladimir Gololobov * * vgololobov@yandex. ru * * * * This program is free software; you can redistribute it …

Как с нами связаться:

Украина:
г.Александрия
тел. +38 05235 7 41 13 Завод
тел./факс +38 05235  77193 Бухгалтерия
+38 067 561 22 71 — гл. менеджер (продажи всего оборудования)
+38 067 2650755 - продажа всего оборудования
+38 050 457 13 30 — Рашид - продажи всего оборудования
e-mail: msd@inbox.ru
msd@msd.com.ua
Скайп: msd-alexandriya

Схема проезда к производственному офису:
Схема проезда к МСД

Представительство МСД в Киеве: 044 228 67 86
Дистрибьютор в Турции
и странам Закавказья
линий по производству ПСВ,
термоблоков и легких бетонов
ооо "Компания Интер Кор" Тбилиси
+995 32 230 87 83
Теймураз Микадзе
+90 536 322 1424 Турция
info@intercor.co
+995(570) 10 87 83

Оперативная связь

Укажите свой телефон или адрес эл. почты — наш менеджер перезвонит Вам в удобное для Вас время.