Программа регулировки яркости на языке С
Файл заголовка
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 В.
Завершая разговор о диммере, приведу НЕХ-файл модуля управления яркостью.