Fórum témák

» Több friss téma
Cikkek » Launchpad: ismerkedés az MSP430 mikrovezérlőkkel II.
Launchpad: ismerkedés az MSP430 mikrovezérlőkkel II.
Szerző: icserny, idő: Nov 3, 2011, Olvasva: 22576, Oldal olvasási idő: kb. 10 perc
Lapozás: OK   3 / 8

Mintaprogramok az órajelek beállításához

Az alapértelmezett órajelek

Ha egyetlen sornyi programot sem írunk az óra beállításával kapcsolatban, akkor is működni fog a mikrovezérlőnk az alábbi alapértelmezett beállásokkal (a cikksorozat első részében is így használtuk a mikrovezérlőt):

ACLK forrása LFXT1 lesz, de ez csak akkor működik, ha be van forrasztva az XIN/XOUT lábak közé a 32 kHz-es órakvarc. Alapértelmezetten 6-6 pF belső kapacitás kapcsolódik a lábakra. Ha nem akarjuk beforrasztani a kristályt, akkor ACLK átkapcsolható a VLO oszcillátorra, s az XIN (P2.6) és XOUT (P2.7) kivezetések digitális I/O-ként használhatók. Ehhez a beállításhoz az alábbi utasításokat kell beszúrni a programunkba:

  1. BCSCTL3 = LFXT1S_2;   // ACLK forrása legyen VLO
  2. P2SEL = 0;            // P2.6 és P2.7 legyen digitális I/O
  3. P2DIR = 0;            // Bemeneti irány
  4. P2REN = BIT6|BIT7;    //Belső felhúzás bekapcsolása (6. és 7. biten)

Fentiekből tulajdonképpen csak az első sor kapcsolatos az óra beállításával, a többi utasítással a P2 portot állítjuk be digitális bemenetnek, s egyúttal bekapcsoljuk a belső felhúzást, hogy ne lebegjen a bemenet. Természetesen, egy konkrét alkalmazásnál előfordulhat, hogy a P2 port lábait nem bemenetként, hanem kimenetnek használjuk. Ilyen esetben nem használható a felhúzás, helyette a P2OUT kimeneti adatregiszterben állítjuk be, hogy a kimenetek alacsony, vagy magas szintre álljanak be.

MCLK forrása alapértelmezetten DCO lesz, (DCOx = 3, RSELx = 7, MODx = 0 paraméterekkel), ami hozzávetőlegesen 1 MHz körüli (vagy inkább 1,1 MHz) frekvenciát jelent.

SMCLK forrása alapértelmezetten ugyancsak DCO lesz.

A következőkben néhány olyan programot mutatunk be, amelyekben az alapértelmezettől eltérő órajel beállításokat használunk.

VLO kipróbálása - aktív állapot alacsony frekvencián

Első kísérletünkben a VLO oszcillátor leosztott jelét használjuk (VLO/8 = ~ 1500 Hz, ez a belső oszcillátorokkal beállítható legalacsonyabb frekvencia), ez lesz beállítva az ACLK, MCLK és SMCLK órajelnek. A DCO oszcillátort pedig kikapcsoljuk, így kapjuk a legkisebb fogyasztású aktív módot. Az aktív mód azt jelenti, hogy a CPU be van kapcsolva, fut a program. A későbbiekben majd mutatunk példákat a még kisebb fogyasztású energiatakarékos módokra is, azonban ezeknél a CPU-t is lekapcsoljuk, akkor tehát nem futhat program.

Az alábbi programban LED1-et villantjuk fel 10 másodpercenként, 0.1 másodpercre.  A CPU frekvenciája MCLK = VLO/8 = ~1500 Hz lesz. Ha a VCC átkötést lehúzzuk, akkor egy árammérővel megmérhetjük a CPU áramfelvételét (kb. 80 µA lesz). Az alapértelmezett 1 MHz-es frekvencián, DCO-t használva kb. négyszer nagyobb volna az áramfelvétel, ugyanezen a tápfeszültségen (VCC kb. 3,3 V). Telepes üzemmódban ez azt jelenti, hogy a VLO és az alacsonyabb CPU frekvencia használata esetén négyszer lassabban merül le az elem, vagy az akkumulátor. Ennek természetesen ára is van: a CPU nagyságrendekkel kevesebb utasítást hajt végre időegységenként.

Hardver követelmények:

  • Az MSP430 Launchpad kártyát használjuk, kiegészítések nélkül.
  • Mivel minden kivezetést kimenetnek állítunk be, vegyük le a TxD, RxD átkötéseket, hogy az emulátor és a kísérleti áramkörünk kimenetei ne kapcsolódhassanak szembe!
  • Feltételezzük, hogy a 32 kHz-es kvarc nincs beforrasztva! Ha mégis be lenne forrasztva, akkor a P2 portra vonatkozó beállításokat hagyjuk ki a programból!

3_1. lista: A vlo_test.c program listája

  1. #include "io430.h"
  2. #include "intrinsics.h"
  3.  
  4. void main(void) {
  5.   WDTCTL = WDTPW + WDTHOLD;             // Letiltjuk a watchdog időzítőt
  6.   BCSCTL3 |= LFXT1S_2;                  // ACLK forrása: LFXT1 helyett VLO
  7.   IFG1 &= ~OFIFG;                       // "Oszcillátor hiba" bit törlése
  8.   __bis_SR_register(SCG0);              // DCO kikapcsolása
  9.   BCSCTL1 |= DIVA_3;                    // ACLK osztója: 8
  10.   BCSCTL2 = SELM_3 +                    // MCLK forrása: LFXT1/VLO
  11.             DIVM_3 +                    // MLCK osztója: 8
  12.             SELS   +                    // SCLK forrása: LFXT1/VLO
  13.             DIVS_3;                     // SMCLK osztója: 8
  14.   P1DIR = 0xFF;                         // Minden P1.x legyen kimenet
  15.   P1OUT = 0;                            // Minden P1.x alacsony állapotba
  16.   P2SEL = 0;                            // P2.x legyen digitális I/O
  17.   P2DIR = 0xFF;                         // Minden P2.x legyen kimenet
  18.   P2OUT = 0;                            // Minden P2.x alacsony állapotba
  19.  
  20.   while(1) {
  21.     P1OUT |= BIT0;                      // P1.0 (LED1) bekapcsolása
  22.     __delay_cycles(150);                // kb. 100 ms várakozás
  23.     P1OUT &= ~BIT0;                     // P1.0 (LED1) lekapcsolása
  24.     __delay_cycles(15000);              // Delay 100x
  25.   }
  26. }

A program elején a szokásos módon letiltjuk a watchdog időzítőt (ezt a sort a projekt létrehozásakor a projektvarázsló rakja be a főprogram elejére). A következő sorban az alapértelmezett LFXT1 kristályoszcillátorról átkapcsolunk a kis teljesítményfelvételű belső oszcillátorra (VLO). Ehhez a BCSCTL3 regiszter LFXT1S1 és LFXT1S0 bitjeiben a bináris '10' bitkombinációt kell beállítani az eredeti '00' helyett. Tudva azt, hogy bekapcsoláskor ez a bitcsoport '00'-ban áll, a VLO bekapcsolásához elegendő az LFXT1S1 bitet '1'-be állítani, amit itt bitenkénti VAGY művelettel valósítunk meg.  BCSCTL3 biteinek kiosztását fentebb már bemutattuk. Abból látható, hogy a beállítandó bit helyiértéke 0x20, tehát a bitbeállítást így végezhetjük:

  1. BCSCTL3 = BCSCTL3 | 0x20; //LFXT1Sx bitcsoport '00'-ból '10'-ba állítása

A bitcsoportok beállításánál azonban nem muszáj mindig kiszámolgatni a bitek helyiértékeit, használhatjuk helyettük az io430g2231.h állományban előre definiált makrókat. A programban használt LFXT1S_2 értéke 0x20, tehát a '10' bitkombinációt az LFXT1Sx bitcsoport beállításához megfelelő helyiértéken tartalmazza. Ennek felhasználásával, és a C nyelvben szokásos rövidítéssel a fenti utasítást így is megadhatjuk tehát:

  1. BCSCTL3 |= LFXT1S_2; //LFXT1Sx bitcsoport '00'-ból '10'-ba állítása

Mielőtt tovább mennénk, törölnünk kell LFXT1 "oszcillátor hiba" jelzését, ami bekapcsoláskor vagy újrainduláskor (RESET) automatikusan beáll '1'-be, s megakadályozza DCO kikapcsolását, s azt is, hogy MCLK és SMCLK a VLOCLK órajelet használhassa. A BCSCTL3 regiszter LFXT1OF hibajelző bitje azonban csak olvasható, tehát közvetlenül nem törölhető. Az "oszcillátor hiba" jelzést a hozzá kapcsolódó OFIFG programmegszakítást kérő jelzőbit törlésével tudjuk megszüntetni (ez a jelzőbit az IFG1 regiszterben található).

Az OFIFG bit törlésére a programban a bitenkénti ÉS műveletet használtuk. Ehhez olyan számot kell megadnunk bitmaszk gyanánt, ami csak azokon a biten tartalmaz nullát, amelyet törölni akarunk. Mivel az io430.h állományban definiált OFIFG makró azon a helyiértéken tartalmaz '1'-et , ahol az OFIFG bit található (OFIFG = 0b00000010), a törléshez az OFIFG makró értékének komplemensét kell használnunk (az ~OFIFG kifejezést használjuk, melynek értéke 0b11111101).

  1. IFG1 &= ~OFIFG; // Az "oszcillátor hiba" jelzőbit törlése

Az alábbi sorral a DCO oszcillátort kapcsolhatjuk ki. Az SCG0 vezérlő bit a CPU Státusz Regiszterében (SR) található, ezért C nyelvű utasításokkal nem nyúlhatunk hozzá (egy C utasítás feldolgozása során SR értéke többször is megváltozhat, így a kiolvasás - módosítás - visszaírás során könnyen előfordulhatna, hogy egyes bitekbe rossz, idejét múlt értéket írunk vissza). Ezért a __bis_SR_register() nevű beépített függvénnyel (BIS = bit set, azaz '1'-be állító) billentjük be az SG0 bitet.

  1. __bis_SR_register(SCG0);

Az ACLK osztójának beállításánál figyelembe vettük, hogy csak bitek '1'-be állítását kell végeznünk, amit a BCSCTL3 beállításához hasonlóan bitenként logikai VAGY kapcsolatra egyszerűsíthetjük. Ezt így írhatjuk:

  1. BCSCTL1 |= DIVA_3;

Más a helyzet a BCSCTL2 regiszter beállításánál, mivel itt szinte minden bitet módosítunk (csak a DCOR bittel nem foglalkozunk, mert az a mi mikrovezérlőinknél nem használható).  Bár úgy is írhattuk volna, hogy:

  1. BCSCTL2 = 0xFE;

de ennek az utólagos értelmezése elég nehéz volna. Ezért, ha lehetséges, mindig az alábbihoz hasonló öndokumentáló formát használjuk:

  1. BCSCTL2 = SELM_3 +           // MCLK forrása: LFXT1/VLO
  2.           DIVM_3 +           // MLCK osztója: 8
  3.           SELS   +           // SCLK forrása: LFXT1/VLO
  4.           DIVS_3;            // SMCLK osztója: 8

Megjegyzés: ha a főprogram eddig tárgyalt része zavarosnak vagy nehezen követhetőnek tűnik, az azért van mert már egy sor 'ad hoc' kézi optimalizálást tartalmaz, másrészt a gyári fejléc állományok (pl.  io430g2231.h nem támogatják a több-bites bitcsoportok írását.) Így marad az ÉS és VAGY műveletekkel végzett bitfaragás...

A portok beállításánál nincs semmi trükközés, vagy magyarázatra szoruló utasítás. Az összes portlábat kimenetnek állítjuk (P1DIR és P2DIR összes bitjét '1'-be állítjuk). Nem görcsöltünk rajta, hogy a P2DIR regiszternek csak két bitje van kiépítve. Abból nincs gond, ha a nemlétező bitekbe is megpróbálunk írni... A P2 portnál külön be kell állítani a P2.6 és P2.7 digitális I/O funkcióját a P2SEL megfelelő bitjeinek törlésével. A P1 portnál ezzel nem kell foglalkoznunk, mert ott eleve a digitális I/O az alapértelmezett funkció.

A főprogram végtelen ciklusában LED1-et (a P1.0 lábra van kötve) kb. 0,1 s ideig bekapcsoljuk, majd kb. 10 s időre kikapcsoljuk. Végeredményben tehát 1:100-as kitöltési aránnyal villog LED1. A gyakorlati alkalmazásokhoz (jelzőfény) talán túl hosszú idő a két felvillanás közötti 10 másodperces szünet, de arra jó, hogy kényelmesen megmérhessük a mikrovezérlő áramfelvételét (ehhez a VCC jelű átkötést le kell húzni, s a helyére csatlakoztathatjuk az árammérőt).

Az általunk kipróbált MSP430G2231 példánynál az áramfelvétel I = 75 µA volt (MCLK = 1500 Hz, VCC = 3,5 V, T = 25 ºC mellett).

Kalibrált DCO frekvencia (1 MHz) beállítása

Ha pontosabban akarjuk beállítani a DCO frekvenciáját, akkor használhatjuk az információs memóriában  gyárilag letárolt paramétereket, melyek a gyártás közben egyedileg meghatározott értékek. A gyárilag meghatározott kalibrációs értékeket az információs memória írásvédett "A" szekciójában tárolja a mikrovezérlő (a 0x10FE és 0x10FF címeken), s a gyári fejléc állományok (pl. msp430g2231.h) szimbolikus neveket is definiálnak a kényelmes hivatkozáshoz. A beállításhoz ezt írjuk:

  1. DCOCTL = CALDCO_1MHZ;
  2. BCSCTL1 = CALBC1_1MHZ;

Megjegyzések

  • Ne felejtsük el, hogy a DCO stabilitása nagyságrendekkel rosszabb egy kristályoszcillátorénál: a hőmérséklet vagy a tápfeszültség megváltozása %-os nagyságrendű mértékben elhúzza DCO frekvenciáját. A gyári kalibráció 30 ºC hőmérsékleten és 3 V-os tápfeszültségen biztosítja a pontos frekvenciát (esetünkben 1 MHz-et). A teljes tápfeszültség (1,8 - 3.6 V) vagy a teljes működési hőmérséklet (0 - 85 ºC) tartományban ehhez képest ±3 % eltérés is lehetséges. Ha pedig a hőmérséklet és a tápfeszültség  egyidejűleg változik, akkor akár  ±6 % eltérés is lehetséges.
  • A Launchpad kártyához kapott MSP430G2211 és MSP430G2231 mikrovezérlők csak egyetlen kalibrált frekvenciához (a fenti, 1 MHz-es beállításhoz) tartalmaznak gyárilag meghatározott értékeket, más típusok azonban több kalibrált frekvenciával rendelkezhetnek. Például az MSP430G2452, vagy az MSP430G2553 típusok négy kalibrált frekvencia beállításához tartalmaznak gyárilag meghatározott értékekeket (1 MHz, 8 MHz, 12 MHz és 16 MHz). 

Az alábbi listán egy komplett programot is bemutatunk a kalibrált 1 MHz-es órajel beállítására, amelyben LED2 10 másodpercenként villan fel 0,1 s időtartamra (itt azért választottuk LED2 villogtatását, hogy a LED színe is jelezze, hogy nem az előző programot futtatjuk). A 10 másodperces szünetek lehetőséget adnak a mikrovezérlő áramfelvételének megmérésére. Az MCLK órajelét az 1 MHz-es, gyárilag kalibrált  DCO frekvenciájú DCOCLK adja. Az ACLK forrását VLO/8-ra állítjuk be. Ez utóbbinak ugyan nincs jelentősége, de így azonos lesz ACLK itteni beállítása a kisfogyasztású módot bemutató programéval.

Hardver követelmények: ugyanazok, mint az előző programnál.

3_2. lista: A dco_1mhz.c program listája

  1. #include "io430.h"
  2. #include "intrinsics.h"
  3.  
  4. void main(void) {
  5.   WDTCTL = WDTPW + WDTHOLD;       // Letiltjuk a watchdog időzítőt
  6.   BCSCTL3 = LFXT1S_2;             // ACLK forrása legyen VLO (LFXT1Sx: '10')
  7.   IFG1 &= ~OFIFG;                 // Az "oszcillátor hiba" jelzőbit törlése
  8.   DCOCTL = CALDCO_1MHZ;           // DCO beállítása a gyárilag kalibrált
  9.   BCSCTL1 = CALBC1_1MHZ;          // 1 MHz-es frekvenciára
  10.   BCSCTL1 |= DIVA_3;              // ACLK osztója: 8
  11.   BCSCTL2 = SELM_0 +              // MCLK forrása: DCO
  12.             DIVM_0 +              // MLCK osztója: 1
  13.             DIVS_0;               // SMCLK osztója: 1
  14.   P1DIR = 0xFF;                   // Minden P1.x legyen kimenet
  15.   P1OUT = 0;                      // Minden P1.x alacsony állapotba
  16.   P2SEL = 0;                      // P2.x legyen digitális I/O
  17.   P2DIR = 0xFF;                   // Minden P2.x legyen kimenet
  18.   P2OUT = 0;                      // Minden P2.x alacsony állapotba
  19.  
  20.   while(1) {
  21.     P1OUT |= BIT6;                // P1.0 (LED1) bekapcsolása
  22.     __delay_cycles(100000);       // kb. 100 ms várakozás
  23.     P1OUT &= ~BIT6;               // P1.0 (LED1) lekapcsolása
  24.     __delay_cycles(10000000);     // kb. 100s várakozás
  25.   }
  26. }

A program nem sokban különbözik az előzőektől, ezért csak az eltéréseket ismertetjük. BCSCTL3 beállítását csak lustaságból végezzük sima értékadással (kihasználva, hogy a regiszter többi bitje 0 lehet). Természetesen írhattuk volna ugyanúgy, mint az előző programban.

DCOCTL és BCSCTL1 beállítását a föntebb ismertetett módon végezzük, felhasználva a fejléc állományban előre definiált címeket. Vegyük észre, hogy ezen utasításokat követően a BCSCTL1 regiszter további beállításra szorul, mivel az alapértelmezettől eltérő ACLK osztót akarunk konfigurálni.

A BCSCTL2 beállítása abban tér el az előző programról, hogy más órajel forrást (DCO) és más leosztást (1:8 helyett 1:1) akarunk használni. Gyakorlatilag a regiszter összes bitjét töröljük (egyébként ez az alapértelmezett beállása BCSCTL2-nek). Természetesen, most is az előre definiált makrókat használjuk, így érthetőbb lesz a program. SELS_0 makró (ami a SELS = 0 beállítás volna) viszont nincs definiálva, s mivel egyébként is nulla lenne, ezért egyszerűen  nem foglalkozunk vele.

A végtelen ciklusban használt késleltetéseket természetesen át kellett számolni az 1 MHz-es frekvenciára, hogy most is 0.1 s, illetve 10 s legyenek. Mivel a CPU órajele 1 MHz, így egyszerűen 1 ciklus = 1 µs alapon számolhatunk. A 0.1 s tehát 100 000 ciklus lesz, a 10 s-os késleltetés pedig 10 000 000 ciklus.

Az előző programhoz hasonlóan most is megmérhetjük a mikrovezérlő áramfelvételét. Az általunk kipróbált MSP430G2231 példánynál az áramfelvétel I = 409 µA volt (MCLK = 1 MHz, VCC = 3,5 V, T = 25 ºC mellett).

Maximális CPU frekvencia (16 MHz) beállítása

Harmadik példánkban bemutatjuk, hogyan állíthatjuk a be a maximális CPU frekvenciát. Az adatlap szerint az MSP430G2xxx mikrovezérlők maximális órajele 16 MHz lehet. Ilyen nagy frekcenciát csak a DCO oszcillátorral tudunk előállítani. Az adatlep szerint az RSELx = 15, DCOx = 3, MODx = 0 beállítással 30 ºC-on, 3 V-os tápfeszültség mellett kb. 15.25 MHz-es frekvencia várható. Tapasztalataink szerint 25 ºC-on, 3,5 V-os tápfeszültségen ennél kevesebb (14,5 MHz) volt mérhető. A kívánt 16 MH-es frekvenciához tehát DCOx inkább 4 kell, hogy legyen. Az alábbi programban szereplő DCOx = 5 beállítással már egy kicsit fölélőttünk: 16.3 MHz körüli frekvenciát kaptunk.

Megjegyzés: Az MSP430G2x01, G2x11, G2x21, G2x31 Device Erratasheet (SLAZ061B) szerint DCO beállításánál ügyelnünk kell arra, hogy az RSELx = 13 sávot nem szabad átugrani, mert a DCO oszcillátor kihagy, vagy le is állhat. A probléma elkerülésére az alapértelmezett RSELx = 7 értékről először RSELx = 13-ra kell ugrani, majd onnan léphetünk tovább az RSELx = 15 beállításra.

Az alábbi program ugyanazt csinálja, mint a korábbiak (0.1 s ideig felvillannak a LED-ek majd 10 s szünet következik), de MCLK 16 MHz körüli érték (csúcsra járatjuk a CPU-t!), s hogy valami különbséget is lássunk, most egyszerre mindkét LED-del villantunk.

Hardver követelmények: ugyanazok, mint az előző programoknál.

3_3. lista: A dco_16mhz.c program listája

  1. #include "io430.h"
  2. #include "intrinsics.h"
  3.  
  4. void main(void) {
  5.   WDTCTL = WDTPW + WDTHOLD;           // Letiltjuk a watchdog időzítőt
  6.   BCSCTL3 = LFXT1S_2;                 // ACLK forrása VLO (LFXT1Sx: '10')
  7.   IFG1 &= ~OFIFG;                     // Az "oszcillátor hiba" törlése
  8.   DCOCTL = DCO2 | DCO0;               // DCOx = 5; MODx = 0;
  9.   BCSCTL1 = XT2OFF+RSEL3+RSEL2+RSEL0; // RSELx = 13 (lásd slaz061b p3.)
  10.   BCSCTL1 |= DIVA_3 + RSEL1;          // ACLK osztója: 8 és RSELx = 15
  11.   BCSCTL2 = SELM_0 +                  // MCLK forrása: DCO
  12.             DIVM_0 +                  // MLCK osztója: 1
  13.             DIVS_0;                   // SMCLK osztója: 1
  14.  
  15.   P1DIR = 0xFF;                       // Minden P1.x legyen kimenet
  16.   P1OUT = 0;                          // Minden P1.x alacsony állapotba
  17.   P2SEL = 0;                          // P2.x legyen digitális I/O
  18.   P2DIR = 0xFF;                       // Minden P2.x legyen kimenet
  19.   P2OUT = 0;                          // Minden P2.x alacsony állapotba
  20.  
  21.   while(1) {
  22.     P1OUT |= BIT6 + BIT0;             // P1.0 (LED1) bekapcsolása
  23.     __delay_cycles(1600000);          // kb. 100 ms várakozás
  24.     P1OUT &= ~(BIT6 + BIT0);          // P1.0 (LED1) lekapcsolása
  25.     __delay_cycles(160000000);        // kb. 100s várakozás
  26.   }
  27. }

Ez a program az előzőtől csak a DCOCTL és BCSCTL1 regiszterek beállításában különbözik, s természetesen a nagyobb frekvenciának megfelelően a késleltetéseket is újra kellett számoln.

BCSCTL1 beállításánál ügyelnünk kell az Errata-ban közölt hibára, azaz RCSELx beállítását két lépésben kell végeznünk: először csak RCSELx = 13-ra állítjuk a sávkiválasztó biteket (az RCSEL3, RCSEL2 és RCSEL0 bitek '1'-be állításával), s az RCSEL1 bitet csak a második lépésben állítjuk '1'-be. Ez az utóbbi lépést összevontuk ACLK osztójának beállításával (DIVAx = 3). Végeredményben így jutottunk el az RSELx = 15 beállításhoz.

Az korábbi programokhoz hasonlóan most is megmértük a mikrovezérlő áramfelvételét. Az általunk kipróbált MSP430G2231 példánynál az áramfelvétel I = 4.47 mA volt (MCLK = 16,3 MHz, VCC = 3,5 V, T = 25 ºC mellett).

Az eredményeket az alábbi táblázatban összegezhetjük:

CPU frekvencia
[kHz]
MCU áramfelvétele
[µA]
1,5 75
1 000 409
16 000 4 470

Láthatjuk, hogy aktív módban a nagyobb CPU frekvenciához nagyobb energiafogyasztás tartozik. Ha összevetjük a fenti értékeket az adatlapból kiolvashatókkal, akkor jónak mondható az egyezés.


A cikk még nem ért véget, lapozz!
Következő: »»   3 / 8
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem