«AVR шаг за шагом», версия для печати. Исходный документ: https://avr.ru/beginer/avrsbs/step7

Итак, будем удивлять!

Для начала необходимо спаять схему управления нагрузкой на 220 вольт.

Схема переключателя должна быть простой надежной и безопасной. Таким требованиям отвечает тиристорный ключ с опторазвязкой. Идеальной для повторения была бы схема на полупроводниковом ключе (http://www.msevm.com/main/ds/index.htm) ОДНАКО она имеет один не явный баг. - если в результате перегрузки по току выходит из строя основной "вентиль" BT138 то весь ток который течет через нагрузку потечет через два резистора по сто ом каждый. Будет большой бабах! (история этого бага восходит к даташиту на оптотиристор MOC3061, где один номинал указан в омах (Ω) , а другой в килоомах, но наши не поняв импортных обозначений, тупо решили что оба номинала даны в омах, ошибившись таким образом на 3 порядка ) Для того чтобы этого непроизошло изменим схему как показанно на рисунке.

 

Как показала практика - не всегда и не все детали могут быть легко доступны. Эта схема имеет большой диапазон замен. вместо BT138-600 пойдет практически любой семистор расчитанный на напряжение более 220 вольт (BT138, BT137, КУ208 с любыми индексами). Опто тиристор MOC3061 можно заменить на любой MOC306х или MOC302х (правда тогда возможны помехи при включении). чем еще хороша  MOC3061 так это тем, что она умеет "дожидаться" низкого уровня напряжения в коммутируемой сети. В результате нет никаких помех, и лампы накаливания включенные таким выключателем существенно увеличивают срок службы (чаще всего лампа перегорает при включении на пике амплитуды)

Для работы этой схемы необходимо вывод микросхемы подключить к контакту 2 разъема Х1, а шину питания нашей схемы подключить к контакту 1 разъема Х1.  То-есть при установке на выходе микроконтроллера логического ноля светодиод в оптотиристоре начинает светиться и вся схема включается.

Теперь надо научиться передавать данные через COM-порт.

Хотя эта статья не имеет целью обучить человека программированию окошек, но... вот здесь находится компонент (http://avr.ru/int/Files/Dounload/comport/TComPort4Beta.zip) для дельфи и для Си (с хэлпами и примерами) который сильно упрощает жизнь программисту. Взят он с сайта SourceForge (http://sourceforge.net/) ,на нем же можно проверить наличае новых версий (http://sourceforge.net/projects/comport/)...

Однако, даже если нет желания программировать под виндой - можно обойтись обычной командной строкой, и старыми добрыми командными (*.bat) файлами (http://www.windowsfaq.ru/content/category/3/7/45/). Для того чтобы отправить какое-то сообщение в порт надо сначала его запрограммировать командой mode (http://www.windowsfaq.ru/content/view/127/) а затем командой echo (http://www.windowsfaq.ru/content/view/200/57/) вывести данные и перенаправить (http://www.windowsfaq.ru/content/view/260/57/) в сом-порт:

@echo off 

MODE COM%1: BAUD=19 PARITY=n DATA=8 STOP=1 to=off xon=off odsr=off octs=off dtr=off rts=off idsr=off

echo %2>Com%1

Созданный таким образом файл помещаем на диск (к примеру под именем send.bat), а на рабочем столе делаем два ярлычка указывающих на этот файл. первый назовем "On" и нарисуем ему зеленую кнопку, второй соответственно "Off" с красной кнопкой соответственно. дальше добавим с строку вызова: сперва- номер сом порта который мы используем, затем то, что передаем через этот порт. Для On - 00  а для  Off - FF. Ну и для наведения общей красоты - говорим что выполнять этот файл надо в свернутом окне.

 

Тоесть командная строка для ярлыка on должна выглядеть как send.bat 1 00 , а для ярлыка off соответственно  send.bat 1 FF . Если мы используем не СОМ1 а другой, то необходимо вместо 1 поставить номер используемого порта. Все параметры должны быть разделены пробелами.

Теперь по нажатию на этот ярлык в СОМ- порт будет передаваться текстовая строка ограниченная символом перевода каретки. Получить ее в контроллере и правильно обработать - наша задача.

Программа для получения текстовых сообщений.

Для того чтобы работать с контроллером, не утруждая себя разработкой отдельных приложений в каждой из возможных операционных систем, необходимо применить так называемый терминальный протокол. По виду он напоминает режим работы из командной строки (если ещё кто-то помнит такой). Данные передаются и принимаются в текстовом виде. к примеру если нам нужно передать какое-то число в микроконтроллер, то мы передаем его не "прямиком", а в текстово-шестнадцатеричном виде. К примеру, число 125 мы передадим как его шестнадцатеричное представление 7D.

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

"7D"
 7 D
0
1
1 1 1 1
0
1
0b01111101

В общем программе остается вычислить номер принятого символа из строки "0123456789ABCDEF" и подставив его в нужный полубайт спокойно дожидаться символа <CR> - возврат каретки, который в терминальном режиме означает окончание ввода (клавиша Enter)

  Получение номера принятого символа основанно не на поиске в строке (что было бы правильнее) а на обработке кода принятого символа. так символы с "0" по "9" имеют код  c $30 по $39 а символы "A".."F" ("a".."f") - $41.. $46 ($61..$66). Получая символ программа  убирает старший полубайт принятого символа, и если символ был из буквенного набора (тоесть больше $39) то добавляет к оставшемуся полубайту 9.  

Итог  "7D" --> $37 $44 ---> $07 $04(+9) ---> $07 $0D --> $7D

в таком виде полученный байт выводится в порт В.

;==========================================================
;Autor:      MadMayDay 2008    
;Project:    StepByStep
;Name:       USART-Port
;==========================================================
.device     ATtiny2313
.include    "tn2313def.inc"
.def        SlopReg=R16
.def        ViewReg=R18
.def        HighChar=R19
.def        LowChar =R20
.def        NextChar=R21

;==========================================================
Start:      rjmp    Init;

;----------------------------------------------------------
;устанавливаем часть ног микросхемы в состояние "выход",
;и часть в состояние "вход"
;входы    -    pin    02,03,06,07,08,09,11
;выходы    -    pin    12,13,14,15,16,17,18,19

Init:       ldi        SlopReg,0b11111111    ; грузим признак выхода
            out        DDRB,SlopReg          ; в регистр управления
                                             ; портом "B"
            ldi        SlopReg,0b00000010    ; грузим признак входа
            out        DDRD,SlopReg          ; в регистр упр. портом "D"

            ldi        SlopReg,0b11111111    ; грузим признак "активности"
            out        PortD,SlopReg         ; в регистр  входа

;----------------------------------------------------------
; подготовка приемо передатчика USART
; кроме делителя ничего менять не надо все настроенно на работу с компьютером.
; прерывания не используются.
; вход RXD- PD0(pin2), выход TXD- PD1(pin3)
            
            ldi        SlopReg,0             ; 19200 бод на частте кварца 8 мегагерц
            out        UBRRh,SlopReg         ; Делитель USART = 25
            ldi        SlopReg,25            ; заливаем в регистр UBRR
            out        UBRRl,SlopReg         ; не забывая, что его размер 2 байта

            ldi        SlopReg,0b00000110    ; 8 бит. 1 стоп. без четности
            out        UCSRC,SlopReg         ; заливаем в регистр управления UCSRC
           
            ldi        SlopReg,0b00011000    ; признаки прием и передача разрешена.
            out        UCSRB,SlopReg         ; заливаем в регистр управления UCSRB

;----------------------------------------------------------
; Читаем по одному байту из COM-порта и пытаемся транслировать
; Если принят <CR> то выводим полученное ране значение в порт.

            ldi        ViewReg,$00           ; формируем начальное состояние и
            out        PortB,ViewReg         ; отображаем его на «экране»
       
            ;----------------------------------------------
NoData:     in         SlopReg,UCSRA         ; Считываем регистр состояния USART
            bst        SlopReg,RXC           ; и запоминаем флаг принятости байта.
            brtc       NoData                ; если запомненный флаг не установлен
                                             ; то, ждем еще раз.
            ;----------------------------------------------
                                             ; если символ принят, то    
            bst        SlopReg,FE            ; запоминаем флаг ошибки.
            in         NextChar,UDR          ; и считываем принятый байт
            brts       NoData                ; если флаг ошибки установлен
                                             ; ждем следующий   
            ;----------------------------------------------

            cpi        NextChar,$0d          ; если принятый не <cr>
            brne       StrToInt              ; то обрабатываем его как цифру
                                             ; иначе (если получен <cr>)
DoOut:      out        PortB,ViewReg         ; отображаем на «экране» полученное.
            rjmp       NoData                ; и ждем следующей порции

            ;----------------------------------------------
            ;перевод цифры в число           
StrToInt:   mov        SlopReg,NextChar      ;
            andi       NextChar,$0F          ; обрубаем лишние биты
            sbrc       SlopReg,06            ; если символ из А..F
            subi       NextChar,-9           ; прибавляем к его коду 9
            lsl        ViewReg               ; сдвигаем предыдущий полубайт
            lsl        ViewReg               ; на полубайт (4 бита)
            lsl        ViewReg               ;
            lsl        ViewReg               ; 
            or         ViewReg,NextChar      ; и ставим полученное значение
            ;----------------------------------------------
            rjmp    NoData                   ; и снова здорова.
End:
;==========================================================
 

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

Итак. по порядку.

 

00
11
FF
7F
80

и тд. и убеждаемся что светодиоды гаснут и загораются как надо.

ВНИМАНИЕ! при работе с напряжением более 50 вольт помните золотое правило электрика: работаем ТОЛЬКО ОДНОЙ РУКОЙ  !!!!!!!!!!!

...и зовем окружающих попыриться на чудо чудное, диво дивное, лампочку управляемую с компа. Эгей, да так и до терминатора не далеко!!!!

 

   Далее ---> (http://avr.ru/beginer/avrsbs/step8)

 

Все права защищены © AVR.RU, 2021.