ПредишенСледващото

Винаги съм харесвал идеята за обектно-ориентираното програмиране. Това е много удобно и лесно, особено когато програмата се разширява до големи размери, или има няколко много близки позиции, но с различни настройки. И аз винаги се интересува от необичайни, интересни решения и езиковите тенденции - модели, ламбда функции, трикомпонентни оператори ... За съжаление, не можах да стигна до тях - че не е имало време, мозъкът не е готова. По принцип аз го знам, но той никога не се е опитал. Но изведнъж една от програмите за AVR, видях интересно приложение модел, което значително улеснява работата. Аз започнах да се чудя - и времето е намерен, и желанието ... А идеята на тази статия е роден. Резултатът - родителския клас за лесна работа с устройства, базирани на SPI (регистри на смени, приемо-предавателни устройства, Ethernet и т.н.), в изпълнение на хардуер и софтуер. Интересно - изисква съгласно разпоредбите на среза.

TL; д-р - в края на всички връзки от статията, включително готов код и примери.

поколение
Когато става въпрос за голям брой периферни устройства, да започнете да мразя мълчаливо defayny пристанища и щифтове. Те стават толкова много, че не е пренаселен. Hang SlaveSelect един порт хардуер SPI. О, трудно да се задържи на песен чрез преместване на друго. И с това, разбира се, ние defayny за DDRx и PINx - Ние също искаме всичко се инициализира. И така, за всеки ... И ако да чука на желязо, в който и да е промяна в проекта е необходимо да се събере с лопата целия код.

Имах една идея - защо да не направим всичко клас? Всички пристанища, определени от аргументите конструктор. Удобна, хубаво, малко място. Но. PORTx - не работи и не е от типа, който е херметично макрос, където zapishesh фиг. Попаднали по този въпрос, аз се отказах от идеята за освобождение на Палестина да работи с AVR пристанища.

Решен е проблемът с пристанищата, сега можете да преминете към забавлението. Напишете няколко паралелки с използването на тази функция, аз мислех, че ще бъде готино да се направи клас родител, който ще наследи работата с интерфейса. Реших - ще напишем едно парче за SPI.

Хардуер Изпълнение SPI
Имам libSPI библиотека (фондация взе Tinkerer) в три версии - Hardware (желязо използва SPI), USI-базирани (работи на USI - например, за ATtiny24) и софтуер (пълна версия на софтуера). Хвърляне на гърба на втория (USI сега е доста рядко), аз започнах с най-лесният - хардуер. Nakidal тук е клас родител скелет:

За тези, които не са запознати с шаблони, опишете накратко същността на нещо (тези, които знаят. - моля, не се рита за толкова кратко и не е съвсем вярна версия). Шаблонът ви позволява да замества различни видове в една и съща структура. В този случай, SPI_Base_Hardware обекта инициализация Посочвам клас IO порт (същата, която създава макро MAKE_PORT) и ПИН код SlaveSelect (наричан SS), който след това може да работи в класната стая с помощта на думи PORT и PIN_SS съответно. Тук доста добре описва какво вид на животните и за какво се яде, примерите.


Този дизайн аз все още не ми харесва, и след известно време бе установено, сравнително прост вариант. От първичен inklyudy (в нашия случай - spi_base_hardware.h) описание клас да вземе spi_base_hardware.hpp, всичко изпълнение - в spi_base_hardware.cpp. По този начин той става spi_base_hardware.h файл по следния начин:


Това е всичко. Описание на личността, осъществяване на индивидуална, аз съм доволен :)

Продължавай да пишеш
Напиши изпълнението на всяка функция, реших да отида напред. В Hardware-версия на пристанището и интерфейсни щифтове SPI да промените добре, просто не мога (защото и хардуер). Така че нека да е началник defayny върху тях, което казвате. Да, нека да, аз ще отговоря, но в същото време добавката - само няма да ги види. Нека ги себе си ще бъде добавен към десния камък - defayny желания. Отваряне на файл включва \ io.h и започват да се мине през всички по MK - Конекторите Google. След това в стила на една и съща io.h създадете файл, който ще тества избраната версия на Комитета за наблюдение и да се създаде желаната defayn. Ето какво имам spi_hardware_defs.h. Всички MK Не съм имал списък с поддържаните (всички версии на тях) - в началото на файла. Ако най-малко някой това нещо би могло да бъде от полза - винаги ще завърши.

И какво се случи?
spi_hardware.h


примери
А клас може да се използва по няколко начина - като двигател за интерфейса SPI, като родител към друг клас като родител за друг клас шаблон и шофьорът се съдържа в шаблон клас. Да покажа на всички видове.
Пример 1. хардуер SPI, се използва като водач


Пример 2. хардуер SPI, създавайки клас-приемник


И накрая, най-интересното ...
Пример 3. хардуер SPI, създавайки получен клас шаблон

Тук трябва да се направи резервация. Може би сте забелязали, че при метода първоначален Използвах това-> SPI ... Ако не го направите, компилаторът ще крещи на висок глас, че той не може да намери тези методи. Това важи за всички практики, които са в SPI_Base_Hardware клас.

Всички предишните примери, има един недостатък - имената fast_shift методи и т.н. са заети, което не е от решаващо значение, а като нещо лошо ... Затова мисля, че най-добрият вариант ...

Пример 4. хардуер SPI, създавайки клас шаблон съдържащ вътре водача
Шофьор капсулирани, сега всички като цяло готино :)

Каква е следващата стъпка?
След като свири с хардуер SPI, реших да направя версия на софтуера. Вече има големи открити хоризонти да висят няколко устройства на различни пристанища, без да се обръща внимание на Конекторите на контролера - което е лесно да се поддържа, и там прекарва. Красота!

Скелетът е същото, с изключение на името на класа и шаблон:
Сега тя се предава не само до пристанището и ПИН СС, както и изводите, Мишо, Моси и SCK. Но какво, ако ние нямаме свободни краката в пристанище? Точно така, хвърляне на различни - имаме една и съща изпълнението софтуер, ние правим това, което искаме. Шаблон промени в следния вид:

Той израства и се превръща в огромен скандал. Изпълнението ще трябва да напишете това:

Ужас ... Но ако направите две макроси, всичко изглежда много хармонично: Това е по-добре? Тези макроси ще могат активно да използват в бъдеще.

Напиши за: изпълнението на софтуер SPI
Оставих две възможности - Софтуер SPI и Отделни софтуер SPI. Произход виси на един порт и отнема по шаблон клас порт и пин 4 - MOSI, Мишо, SCK и SS. Второто необходимо на всеки порт щифт, тя изглежда така:
За да направите две от един и същи клас, което направих SPI_Base_Software наследник на SPI_Base_Software_Separate. Ето как:

И какво се случи?
spi_software.h


примери
Начини за използване - в същия размер, както в hardvarnogo опции.
Пример 5. Софтуер SPI, шофьор.

Пример 6: Създаване на получени клас

Пример 7. Създаване получен клас шаблон

Пример 8. Създаване на клас шаблон, съдържащ вътре шофьор

Свързани статии

Подкрепете проекта - споделете линка, благодаря!