Умный дом

Программа регулировки яркости на языке С

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

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

Основной файл

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

Unsigned char input; // Для считывания приемного регистра.

Unsigned char M0DJSIM1; // Первый символ адреса модуля.

Unsigned char M0D_SIM2; // Второй символ адреса модуля.

Int LEVEL = 100; // Уровень яркости.

Unsigned char command_reciev [б]; // Массив для полученной

Команды.

Unsigned char COMMAND; // Флаг прихода сетевой команды, int M0D_ADDR; // Заданный адрес модуля, как число,

Int sim_end_num =0; // Полный символьный номер модуля, int MODJsIUM; // Полученный адрес модуля, как число

Int і; int k;

// Получение байта.

Unsigned char getchO {

While(!RCIF) // Когда регистр не пуст.

Continue; return RCREG;

// Вывод одного байта.

Void putch (unsigned char byte) {

While(!TXIF) // Когда регистр пуст.

Continue; TXREG = byte;

}

// Преобразуем символьный адрес в число.

Int sim_num_adr() {

Sim_end_num = 0;

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

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

M0D_SIM1 = M0D_SIM1 - 0x30;

MOD_SIM2 = MOD_SIM2 - 0x30;

Sim_end_num = MOD_SIMl*OxOA + MOD_SIM2;

Return sim_end_num;

}

// Выполнение команды.

Int cmd() {

Command_reciev [0] = "L";

For (i=l; i<3; ++i) // Запишем номер модуля.

{

Input = getch(); conimand_reciev [i] = input;

}

MOD_NUM = sim_num_adr(); // Полученные номер, как число, if (MOD_NUM == MOD_ADDR) // Если номер модуля совпадает.

{

MOD_NUM = 0;

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

{

Input = getch(); command_reciev [і] = input;

}

Connnand_reciev [4] = И3И; // Для получения иллюстрации.

LEVEL = (command_reciev [4] - 0x30) * 0x64; //Уровень яркости.

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

COMMAND =0; // Сбросим флаг команды.

}

Else {

For (i=0; i<6; ++i) command_reciev [і] = и //Очистим массив.

COMMAND = 0; // Сбросим флаг.

}

}

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

{

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

CMCON = 0x7;

TRISA = ОЬООООЮОО;

TRISB = OxFE;

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

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

SPBRG = 0x68; // Настройка режима приема-передачи.

RB0 = 0 CREN =1

RAO = 1 }

Void main (void) {

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

For (i=0; i<6; ++i) command_reciev [і] = и "; COMMAND = 0; // Прочитаем и преобразуем номер модуля.

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

MOD_ADDR = MOD_ADDR»4; // Сдвинем на четыре бита. // Начинаем работать, start:

If ((RA3 == 1) & (COMMAND == 0)) // Сканирование -220 В, если нет

{ // сетевой команды,

For (k=0; k<LEVEL; k++) RA1 = 0; RA1 = 1;

If (RCIF) // Если пришла команда по сети. {

COMMAND = 1; // Устанавливаем флаг команды.

// Выключаем драйвер RS485 на передачу.

Input = getchO;

If (input: == "L") cmd(); 11 Если наш модуль, else COMMAND = 0; // Иначе сбросим флаг.

}

}

Goto start;

}

Выделенная строка добавлена только для получения иллюст­рации, как это описано ниже.

Вначале приведу таблицу настроек (рис. 2.10).

Программа регулировки яркости на языке С

Рис. 2.10. Таблица настроек стимулов

Эти настройки пришлось продолжить до времени 140 ООО. При наладке я выбрал единицы измерения - циклы.

Этим не ограничилось - пришлось изменить частоту с 4 МГц на 20 МГц, изменить основной текст в функции при­ема команды, закомментировав часть текста:

Int cmd() {

/* command_reciev [0] = "L";

For (i=l; i<3; ++i) // Запишем номер модуля.

{

Input = getchO; command_reciev [і] ь input;

}

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

If (MOD_NUM == MOD_ADDR) {

MOD_NUM = 0;

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

{

Input = getchO;

Ccmmand_reciev [і] = input;

} */

Command_reciev [4] = "3n ;

LEVEL = (command_reciev [4] - 0x30) * 0x64;

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

COMMAND = 0;

/* }

Else {

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

COMMAND = 0; } */

Только после всех этих обманных маневров мне удалось получить иллюстрацию к тому, что я хотел сказать. После по­лучения команды интервал от момента перехода напряжения сети -220 В через ноль, до момента включения триака, отме­ченный на рис. 2.11 маркером, меняется на новый интервал, отмеченный на рис. 2.12.

Что можно сказать в данный момент? Отработка сканиро­вания и включения выглядит нормально (рис. 2.13 и 2.14).

Уровень яркости определяется переменной LEVEL, кото­рая изменяется командой, получаемой от компьютера. На этих рисунках видно, что импульсы управления идут с часто­той 100 Гц (10000 мкс). Вышеприведенные картинки, полу­ченные «жульническим путем», дают надежду на то, что ко­манду от компьютера все-таки удастся прочитать. Мои опасения по поводу «мигания» света, скорее всего, беспочвен­ны. Их лучше отнести к опасениям по поводу отработки сете­вых команд.

Программа регулировки яркости на языке С

Рис. 2.11. Отладка управления триаком

□ LegJcAn*»yzej

Программа регулировки яркости на языке С

L Г

J

L Г

J

950000 100000.0 105000.0 1100000 115000.0 120000.0 125000.0

Рис. 2.12. Изменение управления триаком

Программа регулировки яркости на языке С

Рис. 2.13. Отладка изменения яркости

Программа регулировки яркости на языке С

LJ

И

Li

U

І і і і і і і і і і і і і і і і і і і і і і і і і і і і і і і 10000.0 15000.0 20000.0 25000.0 300000 35000.0 40000.0

Рис. 2.14. Другое значение яркости

Для очистки совести мне следовало проверить работу мо­дуля на макете. Но я не хочу работать с силовой сетью -220 В.

Завершая разговор о диммере, приведу НЕХ-файл модуля управления яркостью.

Умный дом

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

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

Циклы

Циклы выполняют выражения или блоки выражений до тех пор, пока выражение условия не становится истинным. Наша программа требует двух циклов (один вложен в дру­гой). Пока пользователь желает угадывать последовательно­сти: { …

Две полезные схемы

Первая схема относится к настенному выключателю, работа­ющему по протоколу XI0. Что полезного можно почерпнуть из этой схемы? Например, организацию сканирования сети и управления триаком. Схему я привожу, как она сохранилась …

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

Украина:
г.Александрия
тел./факс +38 05235  77193 Бухгалтерия
+38 050 512 11 94 — гл. инженер-менеджер (продажи всего оборудования)

+38 050 457 13 30 — Рашид - продажи новинок
e-mail: msd@inbox.ru
msd@msd.com.ua
Схема проезда к производственному офису:
Схема проезда к МСД

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

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