A szülõi osztály a spi-alapú eszközök számára, vagy egy szórakoztató és kényelmes c az avr

Mindig is szeretem az objektumorientált programozás ötletét. Ez nagyon kényelmes és egyszerű, különösen, ha a program bővült nagy méretben, vagy van néhány nagyon hasonló elemek, de a különböző beállításokat. És én mindig is érdekelt a szokatlan, érdekes megoldások és nyelvi trendek - minták, lambda függvények, háromkomponensű szereplők ... Sajnos, nem tudtam őket -, hogy nem volt idő, az agy nem volt kész. Természetesen tudtam, hogy mi az, de én soha nem próbáltam meg. De hirtelen az egyik program a AVR, láttam egy érdekes felhasználási mód, ami nagyban megkönnyítette a munkát. Érdeklődtem - és az idő megtalálta, és a vágy ... És most a cikk ötlete született. Az eredmény - a szülő osztályban könnyű munka eszközök alapján SPI (shift regisztert, adó-vevő, Ethernet stb), a hardver és a szoftver végrehajtását. Érdekes - kérjük, a macska alatt.

tl; dr - a végén minden link a cikkből, beleértve a kész kódot és példákat.

generáció
Nagyszámú perifériával foglalkozva csendesen utálod a védelmet portokkal és tűkkel. Olyan sokan vannak, hogy nem tudsz átjutni. A SlaveSelectet egy portba helyezzük a Hardver SPI segítségével. Ó, ott nehéz megtalálni az utat, megváltoztatjuk egy másikra. És ezzel természetesen a DDRx és a PINx védelmét is meg fogjuk tenni - mindent meg akarunk kezdeni. És így mindenkinek ... És ha eltömíted a vasat, bármilyen változtatással meg kell lapolnod az összes kódot.

Volt egy ötletem - miért ne csinálnánk egész osztályt? Adja meg az összes portot a konstruktor érvei alapján. Kényelmes, gyönyörű, kis hely. De. A PORTx nem funkció, ez nem egy típus, ez egy megrázó makró, amire leírhatod. Ennek ellenére elhagytottam az OOP ötletét, hogy az AVR portokkal dolgozhassak.

A kikötők problémája megoldódott, most a legérdekesebbekké válhat. Néhány osztályt írtam ezzel a funkcióval, azt gondoltam: nagyszerű lenne egy szülőkategóriát létrehozni, amelyből a felület öröklődik. Úgy döntöttek, mi fogunk írni egy ilyen dolgot az SPI számára.

Hardver végrehajtása SPI
Van libSPI könyvtár (alapítvány vette a Tinkerer) három változatban - Hardver (vas használ SPI), USI-alapú (fut USI - például a ATtiny24) és szoftver (teljes szoftver verzió). Visszatérve a második (USI most meglehetősen ritka), elkezdtem a legegyszerűbb - Hardver. Ezt a szülõi osztály csontvázat használtam:

Azok számára, akik nem ismerik a sablonok, írja le röviden a lényege a dolog (akik tudják, - kérem, ne rúg annyira rövid, nem egészen helyes változatot.). A sablon lehetővé teszi, hogy különböző típusokat helyettesítsen ugyanabban a konstrukcióban. Ebben az esetben az objektum inicializálása SPI_Base_Hardware én pont osztály IO port (ugyanaz, amely létrehoz egy makró MAKE_PORT) és PIN-kódot SlaveSelect (a továbbiakban: SS), amely ezután működni az osztályban segítségével szavak PORT és PIN_SS volt. Itt jól le van írva, hogy milyen állat van és mit is eszik a példák.


Egy ilyen design még mindig nem tetszett, és egy idő után egy meglehetősen egyszerű változatot találtak. A fő includa-ból (a mi esetünkben - spi_base_hardware.h) az osztályleírás a spi_base_hardware.hpp-ban jelenik meg, az egész implementáció spi_base_hardware.cpp. Ebben az esetben a spi_base_hardware.h fájl így fog megjelenni:


Ez minden. Leírás külön-külön, a megvalósítás különálló, boldog vagyok :)

Továbbra is írunk
Miután megírtam az egyes funkciók végrehajtását, úgy döntöttem, tovább mennem. A Hardver verzióban a port és az SPI interfész tűk nem könnyen cserélhetők (Hardver ez). Szóval vedd el őket, azt mondja. Igen, válaszolok, de ugyanakkor hozzáadok - csak akkor nem fogod látni őket. Adjuk hozzá magunknak, a kívánt kőhöz - a szükséges meghatározza. Megnyitjuk az include \ io.h fájlt, és elkezdjük válogatni az összes MC-t - google pinout. Ezután az ugyanazon io.h stílusában létrehozunk egy fájlt, amely ellenőrzi az MK kiválasztott verzióját és létrehozza a szükséges definíciót. Ezt kaptam a spi_hardware_defs.h. Minden MC-nél nem volt elég, a támogatott (minden változat) listája - a fájl elején. Ha legalábbis valaki részesül majd ebből a darabból, akkor minden bizonnyal véget fogok hozni.

És mi történt?
spi_hardware.h


példák
Az így kapott osztály többféle módon használható - az SPI-felület illesztőprogramjaként, mint egy másik osztály szülőjének, mint egy másik sablonosztály szülőjének és a sablon-osztályban lévő illesztőprogramnak. Mindent meg fogok mutatni.
Példa 1. Hardver SPI, meghajtó használata


2. példa Hardver SPI, osztály-utód létrehozása


És végül a legérdekesebb ...
3. példa: Hardver SPI, sablon létrehozása az osztály-utód számára

Itt kell foglalni. Valószínűleg észrevette, hogy az init módszerben ezt a ... spi-t használtam ... Ha nem, akkor a fordító hangosan felkiált, hogy nem találja meg ezeket a módszereket. Ez minden olyan módszerre vonatkozik, amelyek az SPI_Base_Hardware osztályban vannak.

Az összes korábbi példának van egy hátránya - a fast_shift stb. Módszerek nevei elfoglaltak, ami nem kritikus, de valahogy nem jó ... Ezért a legoptimálisabb megoldásnak tartom ...

4. példa: Hardver SPI, létrehozva egy osztálysablont, amely tartalmazza a meghajtó belsejében
A vezető be van zárva, most minden rendben van :)

És mi a következő?
Miután játszottam a Hardver SPI-vel, úgy döntöttem, hogy megoldja a szoftver verziót. Már nyitott nagyméretű horizontok: számos eszközt felakasztanak a különböző portokon, figyelmen kívül hagyva a pinout vezérlőt - ahol könnyű vezetni, ott tölteni. Beauty!

A csontváz ugyanaz lesz, kivéve az osztály nevét és mintáját:
Most nem csak a port és az SS-pólus kerül továbbításra, hanem a MISO, MOSI és SCK csapok is. De mi van, ha nincs szabad lábunk egyetlen kikötőben? Helyesen, szétszórjuk a különbözőeket - ugyanazt a szoftvertelepítést végezzük, mi azt tesszük, amit akarunk. A sablon ezen az űrlapon változik:

Felnőtt, és hatalmas vonalgá változott. A megvalósítás során ezt írja:

Bitch ... De ha két makrót készítesz, akkor minden nagyon harmonikusnak tűnik: nem jobb? A jövőben aktívan használom ezeket a makrókat.

Tovább írunk: a szoftver SPI bevezetését
Két lehetőséget választottam: a szoftver SPI és a különálló szoftver SPI. Az első egy porton lóg, és elfogadja a sablon osztályát és 4 pólusát - MOSI, MISO, SCK és SS. A második a kapu minden pólusához hasonlóan így néz ki:
Annak érdekében, hogy ne készítsen két azonos osztályt, a SPI_Base_Software-t egy SPI_Base_Software_Separate örököstől szereztem. Itt van:

És mi történt?
spi_software.h


példák
Használati módok - akárcsak a hardwar verzióban.
5. példa Szoftver SPI, illesztőprogram.

6. példa Örökölési osztály létrehozása

7. példa. Sablon létrehozása az osztály-utód számára

8. példa. Az osztálysablon létrehozása, amely a vezető belsejében található

Kapcsolódó cikkek