17 Versenyvizsga Tétel Mélyreható Kidolgozása

Kattints bármelyik tételre a lenyitáshoz. Az anyag tartalmazza az elméletet, regisztereket, hardveres működést, C/Assembly kódokat és vizsgabuktatókat.

🔍
17 tétel elérhető
1. Tétel
Számábrázolások, mikroprocesszorok és mikrokontrollerek fejlődéstörténete

1. Számábrázolási Módok Beágyazott Rendszerekben

A mikrokontrollerekben az adatok véges bitszélességű regiszterekben és memóriacellákban tárolódnak. A legfontosabb formátumok:

  • Előjel nélküli egész (Unsigned Integer): N biten a tartomány 0 … 2N − 1. (pl. 8 bit: 0 … 255, 16 bit: 0 … 65535).
  • Kettes komplemens (Two's Complement): A legelterjedtebb előjeles ábrázolás. A legfelső bit (MSB) a negatív súlyú előjelbit (−2N-1). N biten: −2N-1 … 2N-1 − 1 (8 bit: −128 … +127). Képzése: bitek invertálása (egyes komplemens) + 1. Előnye: az összeadás és kivonás hardvere azonos!
  • Lebegőpontos ábrázolás (IEEE 754): 32 bites egyszeres pontosság (Single precision): 1 előjelbit (S), 8 bit exponens (E, bias = 127), 23 bit mantissza (M). Érték: (−1)S × 1.M × 2E−127. 8 bites MCU-n szoftveres emulációja rendkívül lassú és sok flash memóriát igényel!
  • Fixpontos ábrázolás (Fixed-point Q-formátum): Pl. Q15 (1 előjel, 15 törtbit) vagy Q8.8. Gyors törtműveleteket tesz lehetővé egész értékű ALU-val rendelkező mikrovezérlőkön.
  • BCD (Binary Coded Decimal): Minden decimális számjegyet (0–9) 4 bit (egy nibble) kódol. RTC (valós idejű órák) és 7-szegmenses kijelzők kedvelt formátuma. Packed BCD: 1 bájt = 2 számjegy (pl. `0x59` = 59 perc).
  • Endianness (Bájt-sorrend):
    • Little-Endian: A legkisebb helyiértékű bájt (LSB) kerül az alacsonyabb memóriacímre (pl. PIC, ARM Cortex-M, x86, RISC-V).
    • Big-Endian: A legnagyobb helyiértékű bájt (MSB) kerül az alacsonyabb címre (pl. hálózati TCP/IP protokollok, régebbi Motorola 68k).

2. Mikroprocesszorok és Mikrokontrollerek Fejlődéstörténete

Korszak / Év Típus / Család Jellemzők & Mérföldkő
1971 Intel 4004 Az első kereskedelmi 4 bites mikroprocesszor (számológépekhez, PMOS technológia).
1974–1976 Intel 8080 / TMS1000 8 bites általános célú processzorok; a Texas Instruments TMS1000 az első igazi mikrokontroller (ROM+RAM+CPU egy lapkán).
1980 Intel 8051 (MCS-51) Az ipari mikrovezérlők etalonja: Harvard architektúra, bit-címezhető memória, beépített UART és timerek.
1989–1993 Microchip PIC (PIC16/PIC18) Egyszerű RISC utasításkészlet, Harvard felépítés, egyciklusos utasításvégrehajtás, beépített EEPROM és FLASH (PIC16F84).
1997 Atmel AVR (ATmega) C nyelvre optimalizált 8 bites RISC, 32 általános célú munkaregiszter, egyciklusos végrehajtás (később az Arduino alapja).
2004–napjainkig ARM Cortex-M (M0/M3/M4/M7) 32 bites szabványos ipari architektúra, Thumb-2 kód, hardveres osztás, FPU/DSP (M4/M7), rendkívül alacsony fogyasztás (STM32, NXP).
2015–napjainkig RISC-V (RV32I) & ESP32 Nyílt forráskódú, moduláris ISA, valamint Wi-Fi/Bluetooth SoC-k forradalma (Espressif ESP32).
⚠️
Gyakori vizsgakérdés / Buktató: Mi a lényegi különbség a mikroprocesszor (MPU) és a mikrokontroller (MCU) között?
Válasz: Az MPU (pl. Intel Core, ARM Cortex-A) csak a CPU magot és gyorsítótárat tartalmazza, a RAM, Flash/ROM és a perifériák külső buszokon kapcsolódnak. Az MCU (pl. PIC18, STM32) egyetlen szilícium lapkára integrálja a CPU-t, a memóriát (Flash + SRAM) és a perifériákat (GPIO, Timerek, ADC, UART), így önálló beágyazott vezérlésre képes.
2. Tétel
Mikrokontroller architektúrák: Harvard vs. Von Neumann, 8, 16 és 32 bites belső buszok

1. Von Neumann vs. Harvard Architektúra

Von Neumann (Princeton)

  • Közös buszrendszer: A kód és az adat azonos címtartományban és közös adat/címbuszon mozog.
  • Szűk keresztmetszet: "Von Neumann bottleneck" — a CPU nem tud egyszerre utasítást beolvasni (Fetch) és adatot olvasni/írni (Data memory access).
  • Példák: Régebbi 8086, 68HC11, MSP430 bizonyos részei, általános PC processzorok külső buszai.

Harvard Architektúra

  • Különálló buszok: Fizikailag független programmemória busz (Program Bus) és adatmemória busz (Data Bus).
  • Párhuzamos elérés: Az utasítás beolvasása és az adatművelet végrehajtása egyszerre (1 órajelciklus alatt) megtörténhet → Pipeline alapja!
  • Eltérő szószélesség: Pl. PIC18-nál a programmemória 16 bites szavakat tárol, míg az adatmemória 8 bites bájtos szervezésű!
  • Módosított Harvard: A modern rendszerek (ARM Cortex-M, AVR) engedik a konstans adatok olvasását a Flash memóriából is speciális utasításokkal (pl. `LDR`, `LPM`, `TBLRD`).

2. CISC vs. RISC Utasításkészlet-architektúrák

  • CISC (Complex Instruction Set Computer): Változó hosszúságú utasítások (1–15 bájt), bonyolult címzési módok, egyetlen utasítás közvetlenül memóriában végezhet műveletet (pl. 8051, x86).
  • RISC (Reduced Instruction Set Computer): Kevés, egyszerű, rögzített hosszúságú utasítás. "Load-Store" architektúra: aritmetikai és logikai műveletek kizárólag belső munkaregiszterek között végezhetők, a memóriát csak `LOAD` és `STORE` utasítások érik el (pl. PIC, AVR, ARM Cortex-M, RISC-V).

3. 8, 16 és 32 bites Belső Buszok és Címzési Terek

  • 8 bites MCU (pl. PIC18F4620, ATmega328P): Az ALU és a belső adatbusz 8 bites széles. Egy 16 vagy 32 bites összeadáshoz több ALU művelet és átviteli bit (C - Carry) láncolás szükséges. Címtartomány: Adat RAM tipikusan bankolt (256 bájtos bankok, PIC18-nál 4 KB-ig), Kódmemória 64 KB .. 128 KB.
  • 16 bites MCU (pl. PIC24, dsPIC33, MSP430): 16 bites ALU, egyciklusos 16 bites műveletek, DSP funkciók és szorzás.
  • 32 bites MCU (pl. ARM Cortex-M, STM32, RISC-V): 32 bites belső buszok (AHB, APB), egységes 4 GB-os (232 bájt) lineáris lapos címtér (Flat memory model), ahol a kód, az SRAM és a perifériák regiszterei (Memory-Mapped I/O) azonos címtérbe illeszkednek.
3. Tétel
CPU felépítés, memóriaszervezés, regiszterek, utasítás-végrehajtás, pipeline, DMA

1. A CPU Belső Felépítése és Működési Lépései

A CPU fő funkcionális blokkjai:

  • ALU (Arithmetic Logic Unit): Végzi a számtani (+, -, szorzás) és logikai (AND, OR, XOR, NOT, shift) műveleteket.
  • Program Counter (PC): A következő végrehajtandó utasítás memóriacímét mutatja. Automatikusan növekszik az utasítás méretével, vagy ugrás/függvényhívás/megszakítás esetén felülíródik.
  • Utasításregiszter (IR) & Dekóder: A memóriából beolvasott gépikódú szót tárolja és vezérlőjelekké dekódolja.
  • Állapotregiszter (STATUS / CCR / APSR): Flag bitek az ALU műveletek eredményéről: Z (Zero), C (Carry/Borrow), N (Negative), OV (Overflow), DC (Digit Carry).
  • Stack és Stack Pointer (SP): LIFO (Last-In First-Out) tároló a visszatérési címek (`CALL`, `RET`, `RETI`) és lokális változók/regisztermentések számára. PIC18-nál hardveres 31 szintű stack van (TOSU, TOSH, TOSL), míg ARM-nál a RAM-ban kijelölt terület (Main Stack Pointer - MSP / Process Stack Pointer - PSP).

2. Az Utasítás-végrehajtás Lépései és az Egyszerű Csővezeték (Pipeline)

Az utasítás ciklus 4 alapszakaszból áll: Fetch (beolvasás) → Decode (dekódolás) → Execute (végrehajtás) → Writeback (eredmény visszaírása).

2-fokozatú Pipeline működése (PIC18 példa):
Míg az N. utasítás a végrehajtási (Execute) fázisban van, addig a processzor a független programbuszon párhuzamosan elvégzi az (N+1). utasítás beolvasását (Fetch).
Így a legtöbb utasítás látszólag 1 utasításciklus (Instruction Cycle = 4 × TOSC) alatt fut le.
Pipeline Flush (Csővezeték kiürítés): Feltételes vagy feltétel nélküli ugrás (`GOTO`, `BRA`, `CALL`) esetén a már előre beolvasott (N+1). utasítás érvénytelenné válik. Ezt a processzor NOP-ként végzi el, így az ugróutasítások 2 ciklust vesznek igénybe!

3. DMA (Direct Memory Access) és Periféria-hozzáférési Mechanizmusok

  • DMA vezérlő: Lehetővé teszi az adatok közvetlen átvitelét periféria ↔ memória vagy memória ↔ memória között a CPU beavatkozása nélkül (pl. ADC minták folyamatos írása SRAM pufferbe, vagy UART adatok kiküldése memóriából). A CPU felszabadul számítási feladatokra. Módok: Burst átvitel vagy Cycle Stealing (órajellopás).
  • Periféria-hozzáférési modellek:
    • Memory-Mapped I/O (MMIO): A perifériák vezérlő- és adatregiszterei a közös memóriatérképen (címtartományban) jelennek meg. Ugyanazok a memóriakezelő utasítások (`MOV`, `LDR`, `STR`, C nyelvű pointerek) érik el őket (pl. ARM Cortex-M, PIC18 SFR-ek).
    • Port-Mapped / Isolated I/O: Külön címbusz és speciális I/O utasítások léteznek a perifériák elérésére (pl. x86 `IN`/`OUT`).
4. Tétel
Mikrokontrollerek típusai és családfái: PIC/AVR, ARM Cortex-M és RISC-V RV32

1. Microchip PIC és Atmel AVR Családfák

  • 8 bites PIC családok:
    • PIC10/12/16: Alapszintű 12/14 bites utasításszó, korlátozott stack, akkumulátor alapú (`WREG`).
    • PIC18 (pl. PIC18F4620): Kifejlett 8 bites MCU, 16 bites utasításszó, 83 utasítás, 31 szintű hardveres stack, Access Bank architektúra, beépített hardveres szorzó (8 × 8), 2 szintű megszakításrendszer, gazdag perifériakészlet (MSSP - SPI/I2C, EUSART, 10 bites ADC, Timerek 0..4, CCP modulok).
  • 16 és 32 bites PIC-ek: PIC24 (általános célú), dsPIC33 (beépített DSP motorral motorvezérléshez és tápegységekhez), PIC32 (MIPS/ARM alapú 32 bites MCU-k).
  • AVR család (ATtiny, ATmega): 32 db 8 bites általános célú munkaregiszter, lineárisabb regisztermodell, GCC-optimalizált felépítés.

2. ARM Cortex-M Architektúra (32 bites ipari etalon)

  • Cortex-M0 / M0+: Ultra-alacsony fogyasztás, 2 fokozatú pipeline, ARMv6-M utasításkészlet (Thumb), 8/16 bites MCU-k kiváltására.
  • Cortex-M3 / M4: Nagy teljesítmény, ARMv7-M, 3 fokozatú pipeline, hardveres osztás, egyciklusos szorzás. A Cortex-M4 rendelkezik hardveres lebegőpontos egységgel (FPU - Single Precision) és DSP utasításokkal (SIMD).
  • Cortex-M7: Csúcsteljesítményű beágyazott mag (akár 400–600 MHz), superscalar architektúra (2 utasítás/ciklus), dupla pontosságú FPU (DP-FPU), L1 Instruction és Data Cache.
  • Közös Cortex-M komponensek:
    • NVIC (Nested Vectored Interrupt Controller): Hardveres, alacsony késleltetésű prioritásos megszakításvezérlő.
    • SysTick Timer: 24 bites hardveres visszaszámláló RTOS időzítéshez.
    • Thumb-2 technológia: 16 és 32 bites utasítások keverése a maximális kódtömörségért és sebességért.

3. RISC-V RV32 (Nyílt Forráskódú ISA)

A RISC-V egy royalty-mentes, nyílt utasításkészlet. Alapváltozata a RV32I (32 bites alap egész utasításkészlet, 32 db 32 bites regiszter x0..x31, ahol x0 mindig konstans 0). Moduláris kiterjesztések: M (hardveres szorzás/osztás), A (atomi műveletek), F/D (egyszeres/dupla lebegőpontos), C (tömörített 16 bites utasítások).

5. Tétel
Hardverközeli programozás C nyelven, fordítás folyamata, regiszterkezelés

1. A C Fordítási Lánc (Toolchain) Lépései

1. Előfeldolgozó (Preprocessor): Kezeli a #include, #define, #ifdef, #pragma direktívákat. Nem végez szintaktikai ellenőrzést, csak szöveges behelyettesítést és makrókifejtést végez (kimenet: .i fájl).
2. Fordító (Compiler): Lexikális, szintaktikai és szemantikai elemzést végez, absztrakt szintaxisfát (AST) épít, optimalizációt hajt végre és generálja a processzor-specifikus Assembly forráskódot (kimenet: .s vagy .asm fájl).
3. Asszembler (Assembler): Az assembly szöveges mnemonikokat bináris gépi kódú objektumfájllá fordítja le (kimenet: .o vagy .obj fájl, relokálható szimbólumtáblával).
4. Szerkesztő (Linker): Összefűzi a lefordított objektumfájlokat és a könyvtárakat (lib). A Linker Script (.lkr vagy .ld) memóriatérképe alapján hozzárendeli a szimbólumokat, függvényeket és változókat a fizikai Flash és RAM címekhez (kimenet: .elf, .hex vagy .bin).

2. Direkt Regisztercímzés és Bitmezők (Bitfields) C-ben

C Language
// 1. Direkt memóriacímzés mutatóval (pl. PORTB = 0xF81 a PIC18F4620-ban)
#define PORTB_REG  (*(volatile uint8_t*)0xF81)
PORTB_REG = 0x55; // 0b01010101 kiírása

// 2. Bitmaszkolás és bitmanipuláció
#define LED_PIN  (1 << 2) // RB2 láb
LATB |= LED_PIN;          // RB2 HIGH (Set bit)
LATB &= ~LED_PIN;         // RB2 LOW (Clear bit)
LATB ^= LED_PIN;          // RB2 Invertálás (Toggle bit)

// 3. Bitfield struktúra regiszterleíró fejlécekben (pl. pic18f4620.h)
typedef union {
    struct {
        unsigned RB0:1;
        unsigned RB1:1;
        unsigned RB2:1;
        unsigned RB3:1;
        unsigned RB4:1;
        unsigned RB5:1;
        unsigned RB6:1;
        unsigned RB7:1;
    };
} LATBbits_t;

extern volatile LATBbits_t LATBbits __at(0xF8A);
LATBbits.RB2 = 1; // Nagyon olvasható, közvetlen bitállítás!

3. A volatile és const Kulcsszavak Kulcsszerepe

  • volatile: Jelzi a fordítónak, hogy a változó értéke bármelyik pillanatban megváltozhat a normál programfutástól függetlenül (pl. hardveres periféria regiszter, megszakítási rutinban módosított globális állapotjelző). Megtiltja, hogy az optimalizáló regiszterben tárolja (cache-elje) vagy feleslegesnek ítélve törölje az olvasási/írási műveleteket!
  • const: Jelzi, hogy az adat csak olvasható. Mikrovezérlőknél biztosítja, hogy a nagy méretű konstans táblázatok (pl. lookup table, betűkészlet, kalibráció) ne a szűkös SRAM-ba másolódjanak induláskor, hanem a tágas Flash kódmemóriában maradjanak!
6. Tétel
Programmemória programozása: ICSP vs. Bootloader, Firmware azonosítás

1. ICSP (In-Circuit Serial Programming)

A mikrovezérlő áramkörbe forrasztott állapotban történő felprogramozása dedikált hardveres programozóval (pl. PICkit, ICD, ST-Link, J-Link).

  • PIC ICSP vezetékek:
    • VPP / MCLR: Programozófeszültség (HVP módban ~12–13V a programozó mód aktiválásához; LVP - Low Voltage Programming esetén 5V/3.3V logikai jellel).
    • VDD & VSS: Tápfeszültség és közös test.
    • PGC (ICSPCLK): Szinkron órajel a programozótól.
    • PGD (ICSPDAT): Kétirányú adatvonal a parancsok és Flash memóriablokkok átviteléhez.
  • ARM Cortex megfelelője: SWD (Serial Wire Debug): mindössze 2 aktív vonal (SWCLK, SWDIO) + Táp/Test, ami kiváltja a régebbi 20 lábas JTAG csatlakozást.

2. A Rezidens Bootloader Felépítése és Működése

A Bootloader egy kisméretű, állandóan a Flash memória kijelölt védett szektorában (általában a memóriatérkép legelején vagy legvégén) futó program, amely képes külső szabványos interfészen (pl. UART, USB, SPI, SD-kártya, CAN) keresztül új firmware-t fogadni és beírni a Flash alkalmazási területére. Nincs szükség hozzá külső programozó hardverre (PICkit, ST-Link)!

📌
Bootloader Memóriatérkép & Vektor-átirányítás (Vector Remapping):
Mivel a PIC18 hardveres Reset vektora a 0x0000 címen van, bekapcsoláskor mindig a Bootloader indul el.
1. Megvizsgálja az indulási feltételt (pl. le van-e nyomva egy nyomógomb, vagy érkezett-e UART-on Bootloader parancs).
2. Ha nincs programozási kérés, átugrik a felhasználói alkalmazás kezdőcímére (pl. goto 0x1000).
3. Vektor-átirányítás: A Bootloadernek át kell irányítania a hardveres megszakítási vektorokat (0x0008 High priority és 0x0018 Low priority) az alkalmazás eltolt vektortáblájára (pl. 0x1008 és 0x1018), hogy a felhasználói interruptok helyesen fussanak le!

3. Firmware Szintű Jelzések és Integritásvédelem

  • Magic Number / Header: Az új firmware elején egy specifikus azonosító számsorozat (pl. `0xAA55BEEF`) és eszköz-azonosító (Device ID) található a téves letöltés megelőzésére.
  • CRC32 / Checksum: A teljes Flash tartalom átvitele után a bootloader ellenőrzi a kapott és számított CRC ellenőrzőösszeget. Hiba esetén a memóriát törli és hibaállapotot jelez (pl. LED villogtatás).
7. Tétel
Integrált fejlesztőkörnyezetek (IDE) és hardveres hibavadászat (Debugging)

1. Integrált Fejlesztőkörnyezetek és Eszközök

  • MPLAB X IDE (Microchip): NetBeans alapú környezet PIC és AVR vezérlőkhöz. Integrált XC8, XC16 és XC32 fordítókkal, MCC (MPLAB Code Configurator) periféria-beállítóval.
  • STM32CubeIDE / Keil MDK / IAR: ARM Cortex-M vezérlők ipari és egyetemi környezetei, CubeMX grafikus órahálózat és pinout tervezővel.
  • VS Code + PlatformIO / CMake: Modern, nyílt platformfüggetlen fejlesztőkörnyezet beágyazott rendszerekhez.

2. In-Circuit Debugging (Hardveres Nyomkövetés)

A processzor magjába épített dedikált hibavadász áramkör (PIC-nél a beépített ICD/ICSP debug modul, ARM Cortex-M-nél a CoreSight Debug Access Port) kommunikál az IDE-vel a külső debuggeren (PICkit, ST-Link) keresztül.

  • Hardware Breakpoint: A chip dedikált komparátor regisztere figyeli a Program Counter (PC) címét. Amikor a PC eléri a beállított címet, a CPU mag leáll (Halt állapot), anélkül, hogy a Flash memóriát módosítani kellene.
  • Single Step (Lépésenkénti végrehajtás): Utasításonként (`Step Into`) vagy C soronként (`Step Over`) történő végrehajtás.
  • Watch & Live Watch: Regiszterek, globális és lokális változók valós idejű értékének kiolvasása a memória buszról megálláskor vagy futás közben.
8. Tétel
Hardverleíró réteg (HAL, CMSIS, LL driverek és közvetlen regiszterkezelés)

1. A Szoftverrétegek Szerepe Beágyazott Rendszerekben

Réteg Típus Leírás & Példa Előnyök Hátrányok
Közvetlen Regiszterkezelés Direkt bitmaszkok és címek (`TRISB=0; PORTB=1;`) Maximális sebesség, legkisebb kódméret, 100% hardverkontroll. Nem hordozható, bonyolult karbantarthatóság.
CMSIS (ARM szabvány) Cortex Microcontroller Software Interface Standard: egységes magfüggvények (`__enable_irq()`, NVIC, SysTick). Minden ARM Cortex gyártónál azonos szintaxis, nagy hatékonyság. Csak ARM architektúrára korlátozódik.
LL (Low-Layer) Driverek Vékony inline wrapper függvények a regiszterek körül (pl. `LL_GPIO_SetOutputPin`). Gyors, alacsony memóriaterhelés, könnyebben olvasható mint a raw regiszterek. Gyártófüggő API.
HAL (Hardware Abstraction Layer) Magas szintű, objektum-szerű API (pl. `HAL_UART_Transmit(&huart1, data, len, timeout)`). Rendkívül gyors prototípus-készítés, könnyű chip-váltás családon belül. Jelentős kódméret (overhead), lassabb futás, elrejti a hardveres működést a hallgatók elől!
9. Tétel
Alapvető perifériák: GPIO portok (Digitális I/O, TRIS/PORT/LAT, RMW probléma, Prellmentesítés)

1. GPIO Belső Felépítése és Üzemmódjai

  • Bemeneti fokozat: Schmitt-triggeres komparátor a zajérzékenység csökkentésére és határozott logikai szintek (0/1) kialakítására. Belső felhúzó ellenállások (Weak Pull-Up, pl. PIC18 PORTB RBPU bit).
  • Kimeneti fokozat:
    • Push-Pull: Két komplementer FET (P-MOS felhúz VDD-re, N-MOS lehúz VSS-re). Nagy áramú vezérlés 0 és 1 állapotban is.
    • Open-Drain (Nyitott nyelőjű): Csak N-MOS lehúzó tranzisztor van jelen. 0-nál lehúz GND-re, 1-nél lebeg (High-Z). Külső felhúzó ellenállást igényel (pl. I2C busz, vezetékes VAGY kapcsolat).

2. A PIC18 GPIO Regiszterhármasa: TRIS, PORT, LAT

Regiszter Funkció Szabály / Jelentés
TRISx (Tri-state) Adatirány beállítása (Adat-irányváltó) 1 = Bemenet (1nput - High-Z lebegő állapot)
0 = Kimenet (0utput - meghajtott kimenet)
PORTx A fizikai láb logikai szintjének közvetlen olvasása Bemenet állapotának olvasására használjuk (`if (PORTBbits.RB0 == 0)...`)
LATx (Latch) A kimeneti adatretessz (Output Data Latch) Kimenet írására kizárólag LAT-ot használunk! (`LATBbits.LATB2 = 1;`)
🛑
A Read-Modify-Write (RMW) Hiba és Kiküszöbölése:
Amikor bitműveletet végzünk a PORTx regiszteren (pl. PORTB |= (1<<1);), a CPU először beolvassa a 8 fizikai láb pillanatnyi feszültségszintjét, módosítja a kijelölt bitet, majd visszairja a teljes bájtot a reteszbe.
A Hiba oka: Ha az egyik szomszédos kimeneti lábon (pl. RB0) kapacitív terhelés vagy lassú felfutási él van, a beolvasás pillanatában a feszültsége még nem éri el a logikai '1' küszöböt, így a CPU '0'-nak olvassa be, és visszairáskor véletlenül lekapcsolja (0-ra állítja) a szomszédos kimenetet!
Megoldás: Mindig a LATx (Output Latch) regiszterre írunk! A LATBbits.LATB1 = 1; a belső digitális reteszt módosítja, nem a terhelt analóg lábat olvassa vissza.
10. Tétel
Alapvető perifériák: Számlálók és Időzítők (Timers & Counters) és Watchdog (WDT)

1. Időzítő (Timer) vs. Számláló (Counter) Üzemmód

  • Időzítő (Timer) mód: Az órajelforrás a belső rendszerórajel osztott változata (FCY = FOSC / 4 PIC18-nál). Rendszeres, ismert frekvenciájú időalap készítésére alkalmas.
  • Számláló (Counter) mód: Az órajel egy külső bemeneti lábról (pl. T0CKI, T1CKI) érkezik. Külső impulzusok, események (felfutó vagy lefutó élek) számlálására szolgál.
  • Prescaler (Előosztó) & Postscaler (Utóosztó):
    • Prescaler: A bejövő órajelet osztja le (pl. 1:2, 1:4, ..., 1:256 arányban), mielőtt a számlálóregisztert inkrementálná.
    • Postscaler: A túlcsordulási (overflow) eseményeket osztja le, mielőtt a megszakításjelző bitet (pl. `TMR2IF`) beállítaná.

2. A PIC18 Timer Moduljainak Összehasonlítása

Időzítő Bitek Prescaler Jellemzők & Alkalmazás
Timer0 8 / 16 bit 1:2 .. 1:256 Általános célú időzítés, T0CKI külső számláló, `T0CON` regiszter.
Timer1 16 bit 1:1 .. 1:8 Külön alacsony fogyasztású 32.768 kHz LP oszcillátor bemenet (RTC-hez), Capture/Compare időalapja.
Timer2 8 bit 1:1, 1:4, 1:16 Periódusregiszteres (`PR2`) összehasonlító számláló! Postscaler 1:1..1:16. A PWM modul hardveres időalapja!
Timer3 16 bit 1:1 .. 1:8 Második 16 bites időzítő a CCP2 modulhoz.

3. Watchdog Timer (WDT) Működése és Célja

A Watchdog egy teljesen független belső RC oszcillátorról (f ≈ 31 kHz) járó hardveres számláló. Ha a szoftver egy végtelen ciklusban ragad, vagy zavarjel hatására lefagy, és nem törli időben a WDT-t a CLRWDT (Clear Watchdog) utasítással a timeout lejárta előtt, a WDT hardveres Reset-et (újraindítást) kényszerít ki a mikrovezérlőn, visszaállítva a működőképességet.

11. Tétel
Speciális integrált perifériák: Valós idejű óra (Real-Time Clock - RTC)

1. Az RTC Modul Felépítése és Működési Elve

Az RTC feladata az emberi idő (másodperc, perc, óra, nap, hét napja, hónap, év) folyamatos, pontos számlálása még akkor is, amikor a mikrovezérlő energiatakarékos Sleep/Standby módban van, vagy a fő tápfeszültség megszűnik.

  • 32.768 kHz órakvarc: Miért pont 32768 Hz? Mert 32768 = 215. Egy egyszerű 15 fokozatú bináris aszinkron osztólánccal (flip-flop sorral) pontosan **1 Hz-es (1 másodperces)** órajel impulzus állítható elő minimális energiafogyasztással!
  • BCD Adatformátum: A számlálóregiszterek BCD kódolásúak (pl. a másodperc regiszter alsó 4 bitje: 0..9 másodperc, felső 3 bitje: 0..5 tízes másodperc).
  • Naptár és Szökőév Korrekció: Hardveresen kezeli a hónapok hosszát (28, 30, 31 nap) és a szökőéveket 2099-ig.
  • Ébresztési (Alarm) Funkció: Beállítható időpont egyezésekor hardveres megszakítást generál, ami felébreszti a CPU-t energiatakarékos módból.
  • Tartalék Tápellátás (Battery Backup - VBAT): Automatikus átkapcsolás gombelemre (CR2032) vagy szuperkondenzátorra a tápkimaradás észlelésekor.
12. Tétel
Capture, Compare és PWM (CCP modul) belső felépítése, működése és programozása

1. A Capture (Jelfogás) Üzemmód

Külső digitális esemény (pl. CCP1 lábon felfutó vagy lefutó él) bekövetkezésekor a hardver egy órajelciklus alatt átmásolja a 16 bites Timer1 pillanatnyi értékét a CCPR1 (CCPR1H:CCPR1L) regiszterpárba, és megszakítást generál (`CCP1IF = 1`).

  • Alkalmazás: Ismeretlen frekvenciájú jel periódusidejének mérése, impulzusszélesség mérése (pl. RC szervó jel, ultrahangos távolságmérő Echo jele), tachométer fordulatszámmérés.

2. A Compare (Összehasonlítás) Üzemmód

A hardver folyamatosan összehasonlítja a CCPR1 regiszterbe előre beírt értéket a Timer1 pillanatnyi értékével. Egyezés (Match) esetén a CCP1 láb állapota automatikusan módosul (High, Low, Invertálás), vagy szoftveres megszakítás generálódik.

  • Alkalmazás: Precíz hardveres időzítés, egyedi mintavételezési trigger az ADC-nek, szimmetrikus négyszögjel generálás.

3. A PWM (Impulzusszélesség-moduláció) Üzemmód

A PWM egy fix frekvenciájú négyszögjel, amelynek a kitöltési tényezője (Duty Cycle) folyamatosan változtatható. A PIC18-ban a PWM a Timer2 és a PR2 periódusregiszter alapján működik!

📐
Kulcsfontosságú Képletek a Versenyvizsgán:
1. PWM Periódusidő (TPWM):
TPWM = [(PR2) + 1] × 4 × TOSC × (TMR2 Prescale)
fPWM = FOSC / (4 × (PR2 + 1) × Prescaler)
2. PWM Kitöltési Tényező (10 bites felbontás):
Impulzusszélesség = (CCPR1L:CCP1CON<5:4>) × TOSC × (TMR2 Prescale)
Kitöltési tényező (%) = [ (CCPR1L:CCP1CON<5:4>) / (4 × (PR2 + 1)) ] × 100%
13. Tétel
Analóg perifériák: ADC, DAC és Komparátorok belső felépítése és programozása

1. Az ADC (Analóg-Digitális Átalakító) Működési Elve: SAR (Szukcesszív Approximáció)

A mikrokontrollerek leggyakoribb ADC típusa a **SAR (Successive Approximation Register)** átalakító. Működése bináris keresésen alapul: egy belső DAC feszültségét hasonlítja össze a mérendő analóg feszültséggel a legfelső bittől (MSB) a legalsóig (LSB).

  • Kvantálás és Felbontás: 10 bites ADC esetén 210 = 1024 kvantálási szint létezik (0 … 1023).
    ULSB = (VREF+ − VREF−) / 1024 = 5.0V / 1024 ≈ 4.88 mV / digit
  • Sample & Hold (Mintavevő-Tartó) áramkör: Egy analóg kapcsolóból és egy belső mintavevő kondenzátorból (CHOLD ≈ 25 pF) áll.
  • TACQ (Mintavételezési idő): A kondenzátor feltöltődéséhez szükséges minimális várakozási idő (≥ 2.4µs, a gyártói adatlap példaszámítása szerint RS=2.5kΩ, 85°C esetén). Enélkül a mért érték hibás lesz!
  • TAD (ADC Órajel periódus): Egyetlen bit eldöntéséhez szükséges idő (0.7µs ≤ TAD ≤ 25µs). A 10 bites konverzió az adatlap funkcionális leírása szerint 11 × TAD-t vesz igénybe (az elektromos jellemzők táblázata 11–12 × TAD tartományt ad meg specifikációként).

2. PIC18F4620 ADC Regiszterei

  • ADCON0: Csatornaválasztás (`CHS3:CHS0`), ADC bekapcsolása (`ADON`), Konverzió indítása/állapota (`GO/DONE`).
  • ADCON1: Analóg vs. Digitális pin konfiguráció (`PCFG3:PCFG0`), Feszültségreferencia kiválasztása (`VCFG1:VCFG0` belső VDD/VSS vagy külső VREF+/VREF-).
  • ADCON2: Eredmény igazítása (`ADFM`: 1 = Jobbra igazított 10 bit, 0 = Balra igazított), TACQ hardveres időzítés (`ACQT2:ACQT0`), TAD órajelosztó (`ADCS2:ADCS0`).
14. Tétel
Megszakítási (Interrupt) rendszer: Prioritások, vektorok, mentés, ISR szabályok

1. A Megszakítás Működése és Szerepe

Az interrupt egy aszinkron esemény, amely megszakítja a főprogram normál szekvenciális futását, elmenti a processzor állapotát, és átadja a vezérlést a Megszakítás-kiszolgáló Rutinnak (ISR - Interrupt Service Routine). Kiküszöböli az erőforrás-pazarló szoftveres lekérdezést (Polling).

2. PIC18 Megszakítási Vektorok és Prioritási Szintek

  • Kompatibilitási mód (`RCONbits.IPEN = 0`): Egyetlen vektor létezik a 0x0008 címen. Bármely engedélyezett forrás ide ugrik.
  • Prioritásos mód (`RCONbits.IPEN = 1`): Két különálló prioritási szint és vektor:
    • Magas prioritás (High Priority): Vektor: 0x0008. Azonnal megszakíthatja az alacsony prioritású ISR futását is! Gyors hardveres kontextusmentés (Shadow regiszterek: `WREG`, `STATUS`, `BSR`).
    • Alacsony prioritás (Low Priority): Vektor: 0x0018. Csak szoftveres stack mentést kap.

3. A Megszakításvezérlő Regiszterek Szentháromsága: Flag, Enable, Priority

Bitelem Regiszter Példa Funkció
IF (Interrupt Flag) `PIR1bits.RCIF`, `TMR0IF` Esemény bekövetkezésekor a hardver 1-be állítja. A szoftvernek kötelező törölnie (0-ra írnia) a kilépés előtt!
IE (Interrupt Enable) `PIE1bits.RCIE`, `TMR0IE` Egyedi forrás megszakításának maszkolása / engedélyezése (1 = engedélyezve).
IP (Interrupt Priority) `IPR1bits.RCIP` Prioritás hozzárendelése (1 = Magas prioritás 0x08, 0 = Alacsony prioritás 0x18).
Globális Enablerek `INTCONbits.GIEH`, `GIEL` Minden magas / alacsony prioritású megszakítás globális engedélyezése.
⚠️
Aranyszabályok Megszakítási Rutin (ISR) Írásához:
  1. Az ISR legyen a lehető legrövidebb és leggyorsabb! Tilos benne hosszas várakozást (`delay()`), lassú I/O műveletet vagy blokkoló kommunikációt hívni!
  2. Az ISR-ben csak egy állapotjelző flaget állítsunk be vagy adatot mentsünk pufferbe, a feldolgozást a main() ciklus végezze!
  3. A vizsgált periféria megszakításjelző flagjét (pl. TMR0IF = 0;) mindig törölni kell szoftveresen, különben a processzor a kilépés pillanatában azonnal visszaugrik az ISR-be (végtelen ciklus)!
  4. Minden változót, amit az ISR és a főprogram közösen használ, volatile kulcsszóval kell deklarálni!
15. Tétel
Soros/párhuzamos átvitel, UART periféria és az RS232 protokoll

1. Soros vs. Párhuzamos és Szinkron vs. Aszinkron Átvitel

  • Párhuzamos: Több adatbit egyidejű átvitele külön vezetékeken. Hátránya: sok láb (pin), áthallás (crosstalk), szóródás nagy sebességnél és távolságon.
  • Soros: Az adatbitek egymás után, időben sorban közlekednek 1 vonalon. Olcsóbb kábelezés, kisebb lábszám, nagyobb megbízhatóság.
  • Szinkron vs. Aszinkron:
    • Szinkron (pl. SPI, I2C): Dedikált közös órajelvonal (Clock) kíséri az adatot.
    • Aszinkron (pl. UART): Nincs külön órajelvonal! A feleknek előre meg kell egyezniük az adatátviteli sebességben (Baud rate, pl. 9600, 115200 bps). A szinkronizációt a bájtok elején lévő Start bit lefutó éle biztosítja.

2. Az UART Keretstruktúra és Baud Rate Generálás

Alapértelmezett állapot: a vonal magas szinten van (IDLE = High, Mark).

  • Start bit: 1 bitidő hosszúságú alacsony szint (Low, Space), amely jelzi az átvitel kezdetét.
  • Adatbitek: 5–9 bit (leggyakrabban 8 bit), LSB-first (legkisebb helyiértékű bit megy először) sorrendben.
  • Paritásbit (opcionális): Páros (Even) vagy Páratlan (Odd) 1-esek számának ellenőrzése.
  • Stop bit(ek): 1 vagy 2 bitidő magas szint (High), a vevő reszinkronizációjához. (Szabvány jelölés: pl. 8-N-1 = 8 adatbit, No parity, 1 stop bit).
🎛️
Baud Rate Számítása (PIC18 EUSART):
Baud Rate = FOSC / [ 16 × (SPBRG + 1) ]   (BRGH = 1, BRG16 = 0 esetén)
SPBRG = [ FOSC / (16 × Baud) ] − 1
A megengedett maximális órajel-eltérési hiba adó és vevő között legfeljebb ±2.5% lehet!

3. Az RS232 Fizikai Réteg és Szintillesztés

  • Az UART TTL/CMOS logikát használ (0V = Low (0), 5V/3.3V = High (1)).
  • Az RS232 szabvány a zajvédelem és nagyobb távolság (~15 m) érdekében bipoláris, invertált feszültségszinteket alkalmaz:
    • Logikai '0' (Space): +3V … +15V
    • Logikai '1' (Mark): -3V … -15V
  • MAX232 szintillesztő IC: Belső töltéspumpás kondenzátorokkal állítja elő az egyetlen +5V-os tápból a szükséges ± 10V-os RS232 feszültségszinteket.
16. Tétel
Szinkron soros kommunikáció: SPI és I2C protokollok összehasonlítása és programozása

1. Az SPI (Serial Peripheral Interface) Protokoll

4-vezetékes, szinkron, Full-Duplex (egyidejű kétirányú) Master-Slave kommunikációs busz.

  • Vezetékek:
    • SCK (SCLK): Órajel a Mastertől.
    • SDO / MOSI: Master kimenet, Slave bemenet.
    • SDI / MISO: Master bemenet, Slave kimenet.
    • SS / CS: Slave Select / Chip Select (aktív alacsony, eszközönként külön vonal).
  • Működési elv: Két shift regiszter (Master és Slave) egy zárt gyűrűt alkot. Minden órajelciklusra 1 bit kicserélődik a Master és a kijelölt Slave között.
  • SPI 4 Módja:
    • CPOL (Clock Polarity): 0 = Inaktív alacsony órajel, 1 = Inaktív magas órajel.
    • CPHA (Clock Phase): 0 = Mintavételezés az első órajelen, 1 = Mintavételezés a második órajelen.

2. Az I2C (Inter-Integrated Circuit) Protokoll

2-vezetékes, szinkron, Half-Duplex (váltakozó irányú) Multi-Master busz.

  • Vezetékek: SDA (Soros Adat) és SCL (Soros Órajel). Mindkét vonal Open-Drain (nyitott nyelőjű), kötelező külső felhúzó ellenállásokkal (RP ≈ 2.2kΩ … 10kΩ)!
  • START és STOP feltételek:
    • START: Az SDA vonal magasból alacsonyba vált, miközben az SCL magas.
    • STOP: Az SDA vonal alacsonyból magasba vált, miközben az SCL magas.
  • Címzés és Nyugtázás (ACK/NACK): 7 bites egyedi eszközcím + 1 bit Írás/Olvasás (R/W). Minden átvitt 8 bit után a 9. órajelen a fogadó fél lehúzza az SDA-t alacsonyba (ACK = 0) nyugtázásként.

3. SPI vs. I2C Összehasonlító Táblázat

Tulajdonság SPI I2C
Vezetékek száma 4 db (3 + N darab Slave) Mindig 2 db (SDA, SCL)
Duplexitás Full-Duplex (egyidejű adás-vétel) Half-Duplex
Sebesség Nagy sebesség (10–50+ MHz) 100 kbps (Standard), 400 kbps (Fast), 1 Mbps
Protokoll bonyolultság Nagyon egyszerű shift regiszter Bonyolult (START, STOP, ACK, címzés, arbitration)
Tipikus perifériák SD-kártya, grafikus TFT kijelző, gyors Flash Hőmérsékletszenzor, RTC (DS3231), EEPROM (24LC), OLED
17. Tétel
Fájlrendszerek és SD-kártya kezelés mikrovezérlős rendszerekben

1. Az SD-kártya Hardveres Illesztése és SPI Mód

Bár az SD kártyák támogatják a natív 4 bites nagysebességű SD buszt, a mikrovezérlők a hardveres egyszerűség miatt szinte mindig a beépített **1 bites SPI módot** használják.

  • Inicializálási szekvencia SPI módban:
    1. Legalább 74 dummy órajelimpulzus kiküldése magas CS mellett alacsony órajelen (100–400 kHz).
    2. CMD0 (GO_IDLE_STATE) küldése alacsony CS mellett → Válasz: `0x01` (In Idle State).
    3. CMD8 (SEND_IF_COND) küldése a feszültségtartomány és SD v2.0 kompatibilitás ellenőrzésére.
    4. ACMD41 (SD_SEND_OP_COND) ciklikus küldése, amíg a válasz `0x00` nem lesz (Inicializálás kész).
    5. CMD16 (SET_BLOCKLEN): 512 bájtos szektorméret beállítása.
    6. Ezután az SPI órajel felkapcsolható maximális sebességre (10–25 MHz).
  • Adatolvasás és Írás: CMD17 (READ_SINGLE_BLOCK) és CMD24 (WRITE_SINGLE_BLOCK) 512 bájtos nyers szektorok mozgatásához.

2. A FAT (File Allocation Table) Fájlrendszer Szerkezete és a FatFs

  • Fájlrendszer felépítése:
    • MBR (Master Boot Record) & VBR (Volume Boot Record): Partíciós tábla és BIOS paraméterblokk (szektorméret, klaszterméret, FAT másolatok száma).
    • FAT táblák (FAT1, FAT2): Nyilvántartja az összetartozó klaszterek láncolt listáját.
    • Root Directory & Data Area: Fájlnevek, attribútumok, dátumok, kezdő klaszter azonosítók és a tényleges fájltartalom.
  • A ChaN FatFs Könyvtár: Szabványos, hardverfüggetlen beágyazott C könyvtár FAT12/FAT16/FAT32/exFAT fájlrendszerekhez. Csak az alsó szintű Disk I/O réteget kell megírni az MCU SPI perifériájához: disk_initialize(), disk_read(), disk_write(), disk_status(), disk_ioctl().