💻 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
An unhandled exception has occurred. See browser dev tools for details. Reload 🗙