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.
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). |
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.
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.
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).
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`).
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).
1. A C Fordítási Lánc (Toolchain) Lépései
#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).
.s vagy .asm fájl).
.o vagy .obj fájl, relokálható szimbólumtáblával).
.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
// 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!
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)!
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).
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.
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! |
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
RBPUbit). - 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;`) |
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.
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.
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.
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!
1. PWM Periódusidő (TPWM):
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`).
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
0x0008cí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.
- Magas prioritás (High Priority): Vektor:
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. |
- 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!
- Az ISR-ben csak egy állapotjelző flaget állítsunk be vagy adatot mentsünk pufferbe, a feldolgozást a
main()ciklus végezze! - 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)! - Minden változót, amit az ISR és a főprogram közösen használ,
volatilekulcsszóval kell deklarálni!
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).
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.
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) ésSCL(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
SDAvonal magasból alacsonyba vált, miközben azSCLmagas. - STOP: Az
SDAvonal alacsonyból magasba vált, miközben azSCLmagas.
- START: Az
- 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 |
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:
- Legalább 74 dummy órajelimpulzus kiküldése magas CS mellett alacsony órajelen (100–400 kHz).
CMD0 (GO_IDLE_STATE)küldése alacsony CS mellett → Válasz: `0x01` (In Idle State).CMD8 (SEND_IF_COND)küldése a feszültségtartomány és SD v2.0 kompatibilitás ellenőrzésére.ACMD41 (SD_SEND_OP_COND)ciklikus küldése, amíg a válasz `0x00` nem lesz (Inicializálás kész).CMD16 (SET_BLOCKLEN): 512 bájtos szektorméret beállítása.- Ezután az SPI órajel felkapcsolható maximális sebességre (10–25 MHz).
- Adatolvasás és Írás:
CMD17 (READ_SINGLE_BLOCK)ésCMD24 (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().