Avr крок за кроком

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

Для початку про протокол COM-порту. Не вдаючись в зайві технічні деталі скажу що протокол дуже гнучкий, з безліччю «ручок», «крутилок», і інших специфічних налаштувань. Які нам не потрібні. Більшість з них дуже специфічні, з цього ми просто приб'ємо їх гвоздиками і скажемо - для зв'язку з комп'ютером треба робити так і не інакше. Єдина педаль яку треба натискати - це швидкість обміну. знову ж таки не вдаючись в подробиці - ось формула по якій можна обчислити силу натискання на педаль:

«Дільник» = «частота кварцу» / (16 * «швидкість» -1)

чим ближче «дільник» до цілого числа - тим краще.

«Швидкість» обміну. числа 1200, 9600, 14400,57600 вам що-небудь говорять? Ні? У вашому комп'ютері немає такого архаїзму як COM порт? Ну що ж, ми і не будемо наполягати. Візьмемо простий перехідник, з драйвером, який створює віртуальний COM порт на комп'ютері. Для цього прочитаємо статейку про це переходнике. Тепер з'єднаємо вихід Tx (9) перехідника зі входом Rx (8). Підключимо до комп'ютера. Відкриємо програму гіпертерміналу. Встановимо швидкість передачі даних скажімо 19200 і спробуємо натискати на клавіші. Якщо ми все зробили верното введені нами символи повинні відображатися у вікні програми.

Avr крок за кроком

«Частота кварцу» - це або частота кварцового резонатора, якщо ви його використовуєте, або частота внутрішнього RC -генератори мікросхеми. Однак, є нюанс. і на ньому спотикається більшість новачків. У мікросхемі ATtiny2313 є внутрішній дільник частоти кварцу. Управляється він як фьюз (битами конфігурації), так і через регістри управління. З цього, треба або враховувати розподіл частоти на 8, або вимикати дільник відразу.

Avr крок за кроком

Увага. це треба зробити обов'язково! інакше облом.

Далі пишемо або завантажуємо ось таку простеньку програмку.

; ------------------------------------------------- ---------
; Встановлюємо частина ніг мікросхеми в стан "вихід",
; І частина в стан "вхід"
; Входи - 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:
; ================================================= =========

Потім трохи допрацьовуємо схему з шага4 (творчі знущання) а саме підключаємо до неї перехідник USB - COM (TTL) за наступним принципом - з'єднуємо землю перехідника (7) з землею схеми; вихід Tx (9) перехідника зі входом RxD (2) мікросхеми; а вхід перехідника Rx (8) з виходом мікросхеми TxD (3).

Avr крок за кроком
Avr крок за кроком

Тепер підключаємо харчування, вставляємо наш перехідник в 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 від і до. В цьому і є один з плюсів цієї технології.