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

поговори-ка ты со мной..

И снова здравствуйте.. приятно осознать, что устройство, сделанное своими руками и доработанное головой работает, несмотря на. Однако понажимав на кнопку и вызвав ухмылки на физиономиях окружающих (что, и это все???) начинаешь понимать, что судьба свела тебя с AVR для чего-то более глобального и полезного. Конечно можно сейчас пустится в рассуждения о прерываниях, оперативной памяти, таймерах и всем таком прочем, однако.. поверьте: окружающих не интересует, КАК программа работает внутри. Их интересует ЧТО она делает. Открою маленький секрет: простой обыватель не испытывает НИЧЕГО, когда слышит что программа решает дифуравнения или рисует на лету картинку марса. Обыватель к этому привык блин. Но, стоит включить-выключить с клавиатуры обыкновенную лампочку, и все. Можете считать что вы вошли в легенды. Ну чтож.. великие художники не всегда рисовали черные квадраты. Скрепя сердце снизойдем до потребностей простого лоха в маленьком чуде. Тем более что научившись связывать компьютер с нашим чипом, мы практически получаем логический пробник и генератор ТТЛ уровней на 8X2 каналов. С таким прибором в домашнем хозяйстве уже можно спокойно ковыряться в чип-картах для телефонов, домофонных ключах и взламывать их. Короче мы получаем практически на халяву неоценимой мощи хакерский инструмент.

Разобьем эту тему на 3 части. В первой мы научимся подключать устройство к компьютеру и делать так чтобы оно понимало что компьютер передает по COM порту или через USB. Во второй напишем простую программу на Delphi для пущего удобства работы с устройством. И наконец, в третьей спаяем схему компьютерного включателя для лампочки 220В.

Для начала о протоколе COM-порта. Не вдаваясь в лишние технические детали скажу что протокол очень гибкий, со множеством «ручек», «крутилок», и других специфичных настроек. Которые нам не нужны. Большинство из них очень специфичные, по этому мы просто прибьем их гвоздиками и скажем – для связи с компьютером надо делать так и не иначе. Единственная педаль которую надо нажимать – это скорость обмена..  опять же не вдаваясь в подробности – вот формула по которой можно вычислить силу нажатия на педаль:   

«делитель»= «частота кварца» / (16* «скорость» -1) 

чем ближе «делитель» к целому числу – тем лучше.

 

«скорость» обмена... числа 1200, 9600, 14400,57600 вам что-нибудь говорят?  Нет?  В вашем компьютере нет такого архаизма как COM порт? Ну чтож, мы и не будем настаивать. Возьмем простой переходник, с драйвером, который создает виртуальный  COM порт на компьютере. Для этого прочитаем статейку об этом переходнике (http://avr.ru/solution/device/usbuart). Теперь соединим выход Tx(9) переходника со входом Rx(8). Подключим к компьютеру. Откроем программу ГиперТерминал. Установим скорость передачи данных скажем 19200 и попробуем понажимать на клавиши. Если мы все сделали верното введенные нами символы должны отображаться в окне программы.

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

 

Внимание!!!  это надо сделать обязательно! иначе облом!!!

Далее пишем или скачиваем (http://avr.ru/int/Files/Dounload/sbs/sbs_05.zip) вот такую простенькую програмку...

;==========================================================
;Autor:     MadMayDay 2008   
;Project:   StepByStep
;Name:      USART-LED
;==========================================================
.device     ATtiny2313
.include    "tn2313def.inc"
.def        SlopReg=R16
.def        ViewReg=R18
;==========================================================
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-порта и если он принят без ошибок
            ; отображаем на «монитор» и передаем в COM-порт как эхо.
            ldi     ViewReg,0xff       ; формируем начальное состояние и
            out     PortB,ViewReg      ; отображаем его на «экране»
            ;----------------------------------------------
NoData:     in      SlopReg,UCSRA      ; Считываем регистр состояния USART
            bst     SlopReg,RXC        ; и запоминаем флаг принятости байта.
            brtc    NoData             ; если запомненный флаг не установлен
                                       ; то, ждем еще раз.
            ;----------------------------------------------
            ; если символ принят, то    
            bst     SlopReg,FE         ; запоминаем флаг ошибки.
            in      ViewReg,UDR        ; и считываем принятый байт
            brts    NoData             ; если флаг ошибки установлен
                                       ; не отображаем символ, а ждем следующий   
            ;----------------------------------------------
            ; если флаг ошибки не установлен         -
            out     PortB,ViewReg      ; отображаем на «экране»
            out     UDR,ViewReg        ; а потом возвращаем в виде эха.
            ;----------------------------------------------
            rjmp    NoData             ; и снова здорова.
End:
;==========================================================

 

Компилируем ее, ну, или опять же скачиваем (http://avr.ru/int/Files/Dounload/sbs/sbs_05.zip), и заливаем в чип.

Затем немного дорабатываем схему из шага4 (творческие издевательства) а именно подключаем к ней переходник USB - COM(TTL) (http://avr.ru/solution/device/usbuart) по следующему принципу - соединяем землю переходника(7) с землей схемы; выход Tx(9) переходника со входом RxD(2) микросхемы; а вход переходника Rx(8) с выходом микросхемы TxD(3).


Теперь подключаем питание, вставляем наш переходник в USB порт компьютера, открываем терминальную программу. К примеру HyperTerminal из стандартного  софта винды. Пишем какую ни будь галиматью,  и видим все введенные нами символы в бинарном виде: нолю соответствует горящий светодиод, а 1 потухший.

Вот можно сказать и все, мы своего добились, теперь разберем по косточкам программу.

 

По сути, эта программа является переработкой  программы из предыдущего шага.  Единственные новые команды, которые в ней применены это brts и brtc . Обе эти команды обеспечивают условный переход по состоянию флага «Т». Флаг «Т» - это специальный флаг для временного хранения флагов.  Довольно удобная штука. Командой bst можно скопировать в флаг «Т» любой бит, а командой bld вставить флаг «Т» в любой разряд рабочего регистра.  В зависимости от состояния флага «Т» мы можем выполнять условные переходы. Команда brts выполняет переход, в случае если флаг установлен (=1), а команда brtc напротив - когда флаг равен нолю.

Кроме того в программе используется устройство UART. Это устройство может передавать данные в последовательном коде, и управляется через  регистры UBRR ($02:$09), UCSRA ($0b), UCSRB ($0a),UCSRC ($03), UDR ($0c). Процессор загружает в регистр UBRR - значение делителя (обратите внимание, этот регистр имеет разрядность два байта!), затем конфигурирует UART путем записи в регистр UCSRC определенных флагов. (значение 0b00000110 - то, что надо для связи с компьютером).  и «включает» устройство записью в регистр UCSRC битов разрешения приема и передачи (0b00011000). Устройство UART может работать по прерываниям, но пока мы собираем простенькие программы - прерывания нас не интересуют. Из регистра UCSRA мы можем считать информацию о состоянии устройства.

Теперь разберем работу программы более подробно. В первой секции происходит уже знакомая нам инициализация выводов микросхемы. Порт B как выход, и порт D как вход. Во второй секции инициализируется устройство последовательной передачи данных. Параметры, заданные в программе: 19200 бод, 8 бит, 1 стоп бит, без четности. В конце секции происходит включение устройства. Внимание, как только устройство включилось - выводы pin2 и pin3 микросхемы отключаются от порта D и начинают использоваться UART. То есть, попытки считать с этих выводов что-то через порт D покажут будто эти «ноги висят в воздухе», то есть ни к чему не подключены.

В основном цикле программа проверяет, пришел ли новый байт от компьютера, путем проверки флага RXC в регистре состояния UCSRA. Если флаг «поднят», то байт пришел, и мы можем считать его из регистра данных UDR. После считывания из регистра мы передаем полученный байт в порт «B». В результате чего тот отображается на нашем 8 пиксельном экране. Кроме того для того чтобы обеспечить «эхо» от ввода с клавиатуры мы снова передаем полученный символ компьютеру. Для того чтобы UART передал данные нужно просто записать их в регистр данных UDR.

Вот и вся логика работы  программы. На самом деле тут еще очень много подводных камней. К примеру скорость передачи по последовательному протоколу гораздо ниже скорости работы процессора, и в принципе мы должны проверять флаг готовности передатчика перед отправкой каждого нового символа... однако сама логика работы программы (передача начинается не чаще приема) позволяет нам пока обойтись без этого.

В принципе, все приведенные выше примеры наглядно демонстрируют, что даже для таких серьезных приложений как работа с компьютером, мы можем в принципе ограничится минимальным набором знаний. Несколько команд, несколько устройств «на борту», несколько регистров. А ведь мы еще не коснулись таких понятий как подпрограмма, прерывание, работа с ОЗУ и энергонезависимой памятью  (да и вообще не рассмотрели распределение памяти). Не коснулись мы пока ни счетчиков, ни компараторов ни большинства других «на бортных» устройств. Из всего этого можно сделать вывод что для того чтобы решить конкретную задачу даже не нужно знать AVR от и до. В этом и есть один из плюсов этой технологии.

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

 

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