💻 Arduino programozás - haladó C++
Utoljára frissítve: 2024. 06. 29. 19:40:46
Ezek a lehetőségek nélkül is teljes mértékben programozható az Arduino - de ha megértjük és használjuk őket gyorsabb és jobb minőségű kódot tudunk írni!
Mutatók
A mutatók, vagy más néven pointerek - ahogy nevük is mutatják - a memória egy bizonyos részére mutatnak. Nehéz elképzelni? itt egy kis magyarázat.
Bármilyen számítógép memóriája voltaképpen egy nagyon hosszú tömb. Ebbe a tömbe tudunk változókat létrehozni, amelyeknek innentől kezdve a számítógép nyelvén lesz egy memóriacíme. Például ha létrehozunk egy alma változót, az például kerülhet a 12-es helyre:
Változó alma
▼
Érték | │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
Cím 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
Ennek a változónak aztán tudunk egy értéket is adni, pl. ez az érték legyen 40.
int i = 0;
i += 3; //i=3
i *= 2; //i=6
i -= 4; //i=2
i /= 2; //i=1
Maga a számítógép az alma névről sosem fog tudni. Neki csak úgy lesz ismert, mint a valami ami a 12-es helyen van.
A pointer is egy sima egyszerű változó. Ha létrehozzuk a mutat mutatónkat, ugyanúgy egy memória-helyre fog kerülni és ugyanúgy lehet neki értéke, pl. 12
Változó *mutat alma
▼ ▼
Érték | │ │ │ 12 │ │ │ │ │ │ │ │ │ 40 │ │ │ │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
Cím 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
Ha most lefuttatnánk a következő kódot valami nagyon érdekes történne:
int korte = mutat; //korte = 40
Mi is történt? Az korte nevű változó értéke 40 lett - pedig a mutat változóé csak 12!
Pointerekben ugyanis mindig egy memóriacímet tárolunk. A változó értéke azért lett 30, mert a mutatóban tárolt érték - 12 - memóriacímen éppen ez az érték volt.
Változó korte *mutat alma
▼ ▼ ▼
Érték | 40 │ │ │ 12 │ │ │ │ │ │ │ │ │ 40 │ │ │ │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
Cím 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
▲│ ▲│ ▲│
│└─────#1───────┘└─────────────────#2───────────────────────┘│
└─────────────────────────#3─────────────────────────────────┘
Portok
Bár az Arudino környezet nagyon megkönnyíti a digitális ki- és bemenetek kezelését (ld. digitalWrite), a Arduino nem más, mint egy túlhype-olt mikrokontroller. Leggyakrabban egy Atmel gyártmányú ATMega 32.
A mikrokontrollereknél szinte kivétel nélkül a legkisebb be- és kiviteli egység a port. Ezek általában 8 lábat fognak össze, mivel a mikrokontroller által lezelt legkisebb adatmennyiség 8 bit, azaz 1 bájt. Ez ugye felvet pár kérdést, például valószínűleg a legfontosabb ezek közül:
Hogyan tudok akkor csak egyetlen lábat állítani?
Egyszerű: bitműveletekkel. Leggyakrabban ún. maszkolást szoktunk használni. Ennek lényege, hogy a hozzáadott értéket vagy hozzá VAGY-oljuk vagy ÉS-eljük a meglévő értékhez.
char port = 0x00010010
char mask = 0x10000000
PORTB = port | mask; //0x10010010
Az Arduino portjait a PORTA, PORTB, PORTC és PORTD változókkal lehet elérni. Ezeket az Arduino rendszer előre létrehozza, nekünk nem kell (és nem is lehetésges) definiálni.
PORTA | PORTB | PORTC | PORTD |
8 | |||
9 | |||
10 | |||
11 | |||
12 | |||
13 |
|||
A0 (14) |
|||
A1 (15) |
|||
A2 (16) |
|||
A3 (17) |
|||
A4 (18) |
|||
A5 (19) |
|||
RESET | |||
0 (RX) |
|||
1 (TX) |
|||
2 | |||
3 | |||
4 | |||
5 | |||
6 | |||
7 |