Умный дом

Программный блок ожидания активности в сети

1. Проверим бит RCIF в регистре PIR1.

2. Если бит установлен, пропустим следующую команду.

3. Вызовем подпрограмму обработки команды.

4. Вернемся к началу.

Вот и вся программа:

Start: BTFSS PIR1, RCIF ; Ждем прихода первого символа команды.

GOTO start

CALL cmnd ; С приходом первого символа начинаем обработку. GOTO start

Следующая трудность спрятана как раз в этом месте, хотя я умудрился наступить на эти грабли при обработке «іпі». Разумная, как мне казалось, конструкция:

Start: BTFSS PIRl, RCIF ; Ждем прихода первого символа команды.

GOTO start

Работать в режиме отладки MPLAB не хотела. Я все перепро­верил многократно. Все было правильно, но анимация про­граммы безнадежно застревала, я решил, что программа не работает. Понять, в чем здесь дело, помогло обращение к сай­ту Microchip, где на форуме этот вопрос уже обсуждался При­чина столь не очевидного поведения программы очевидна (когда знаешь). Отладчик в цикле опроса ждет прохождения нескольких тысяч тактов внутреннего генератора, работаю­щего на частоте в 4-20 МГц до заполнения регистра, которое происходит с частотой примерно 10 кГц. Вдобавок, настрой­ки отладчика по умолчанию делают анимацию хорошо воспри­нимаемой (одно или два перемещения в секунду), но дождать­ся нескольких тысяч таких перемещений лично у меня ума не хватило.

Обработку команды я опять оформил в виде подпрограммы.

; Обработка команды - проверка адреса, определение команды.

Cmnd: BCF STATUS, Z MOVF RCREG, 0

XORLW 0x52 ; Проверим наш ли модуль R (52h).

BTFSS STATUS, Z ; Если нет вернемся.

RETURN

Inl: BTFSS PIR1, RCIF ; Ждем прихода первого символа адреса.

GOTO inl ; Если совпадает, продолжим. MOVF RCREG, 0 BCF STATUS, Z

XORWF 0x21, 0 ; Первый символ адреса в регистре 21h.

BTFSS STATUS, Z

RETURN

In2: BTFSS PIRl, RCIF ; Ждем прихода второго символа адреса.

GOTO in2 ; Если совпадает, продолжим. MOVF RCREG, 0 BCF STATUS, Z

XORWF 0x22, 0 ; Второй символ адреса в регистре 22h.

BTFSS STATUS, Z

RETURN

ІпЗ: BTFSS PIR1, RCIF ; Ждем прихода символа.

GOTO іпЗ ;Если следом символ команды, продолжим. MOVF RCREG, О BCF STATUS, Z

XORLW 0x24 ; Символ команды "$" (24h) . BTFSC STATUS, Z

CALL swtch ; Вызываем подпрограмму выполнения. RETURN

; Подпрограмма определения команды N (включить), F

(выключить)

; или S (состояние).

Swtch: CLRW

In4: BTFSS PIR1, RCIF ; Ждем прихода символа. GOTO in4

MOVF RCREG, 0 ; Прочитаєм номер реле.

MOVWF 0x23 ; Сохраним номер реле в регистре 23h

MOVLW 0x30 ; Запишем регистр 30h в аккумулятор.

SUBWF 0x23, 0 ; Переведем символ в номер.

MOVWF 0x23 ; Сохраним номер реле в регистре 23h

In5: BTFSS PIR1, RCIF ; Ждем прихода символа. GOTO in5

MOVF RCREG, 0 ; Разберем N-включить, F-выключить, S - статус.

MOVWF 0x24 ; Сохраним команду в регистре 24h. BCF STATUS, Z

XORLW 0x4E ; Включение N (4Eh) . BTFSC STATUS, Z ; Если нет, то пропустим. CALL cmdset

MOVF 0x24, 0 ; Перепишем из 24h в аккумулятор. BCF STATUS, Z

XORLW 0x46 ; Выключение F (46h) . BTFSC STATUS, Z ; Если нет, то пропустим. CALL cmdreset

MOVF 0x24, 0 ; Перепишем из 24h в аккумулятор. BCF STATUS, Z

XORLW 0x53 ; S (53h) запрос статуса. BTFSC STATUS, Z ; Если нет, то пропустим. CALL stat

; Сохраним состояние всех реле в энергонезависимой памяти. ; Перепишем регистр 30h состояния реле в EEPROM.

CLRW

MOVLW 0x00 ; Запишем Oh в аккумулятор.

MOVWF EEADR ; Запишем адрес Oh в регистр адреса.

BCF STATUS, RPl; Выбор банка 0.

BCF STATUS, RPO

CLRW

ADDWF 0x30,0 ; Запишем содержимое 3Oh в аккумулятор.

COMF 0x30,0 ; Инвертируем перед сохранением.

BSF STATUS, RP0 ; Выбор банка 1.

BCF STATUS, RPl

MOVWF EEDATA

BSF STATUS, RPO

BCF STATUS, RPl ; Выбор банка 1. BSF EECONl, WREN ; Разрешить запись. BCF INTCON, GIE ; Запретить прерывания. MOVLW 0x55

MOVWF EECON2 ; Записать 55h. MOVLW OxAA

MOVWF EECON2 ; Записать AAh.

BSF EECONl, WR ; Установить флаг для начала запись. BSF INTCON, GIE ; Разрешить прерывания. BCF EECONl, WREN ; Запретить запись.

; Запись 55h и AAh относятся к обязательным при работе с EEPROM.

BCF STATUS, RPl ; Выбор банка 0. BCF STATUS, RPO

Chkwr: BTFSS PIR1, EEIF ; Проверка завершения записи. GOTO chkwr CLRW

ADDWF 0x30, 0

MOVWF PORTA ; Перепишем 30h в порт. BCF PIR1, EEIF ; Сбросим флаг. RETURN

В этом месте работы с отладчиком я вначале проверил выполнение двух команд подряд. Все работало. Затем я впи­сал запись состояния реле в EEPROM с проверкой окончания записи. И, естественно, обнаружил, что вторая команда пере­стала выполняться. Но теперь я быстрее сообразил, что запись занимает время, в течение которого успевает пройти необра­ботанная часть команды. Я не стал «городить огород», вставив между двумя нужными командами третью, ненужную. Хочу еще заметить, что изготовитель микросхем советует осуще­ствить проверку записи в EEPROM, которая вставляется пос­ле проверки завершения записи. Я этого не сделал. Но после создания прототипа я могу переделать программу, удалив из слова команды символьное представление номера модуля и номера реле, могу сделать и программное задание адреса. То­гда и добавлю проверку правильности записи в EEPROM.

Умный дом

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

/****************^ * 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@msd.com.ua
Схема проезда к производственному офису:
Схема проезда к МСД

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

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