Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Programování mikropočítačů Programování HCS08 v C KBI, Časovač
2
Vytvoření projektu v C Vybereme C zde Ostatní volby jsou stejné jako u projektu v ASM
3
Pojmy Přerušení: způsob jak procesor přinutit reagovat na vnější podmět – např. signál od vnějších zařízení (připravenost dat, stisk klávesy apod.). V reakci na přerušení procesor přeruší provádění právě běžícího programu a provede speciální podprogram přiřazený danému přerušení nazývaný obsluha přerušení. Příklady využití přerušení: Stisk tlačítka (změna logické úrovně na portu) Uplynutí určitého času – od časovače Příchod dat – od sériového rozhraní Dokončení převodu – od analogově digitálního převodníku
4
Přerušení od tlačítka Keyboard interrupt module (KBI) obvod zajišťující generování přerušení při změně log. úrovně na vstupu. Původně pro připojení klávesnic, použitelný ale i pro jiné účely (reakce CPU na vnější signál) Připojen na portu A, tj. piny portu A mohou být buď KBI vstupy nebo „běžné“ vstupně/výstupní piny – nastavuje se v registru KBIPE. Pin nastavený v KBIPE jako KBI vstup bude vstupní, ostatní piny jsou stále konfigurovatelné pomocí registrů PTADD a PTAPE. Vektor přerušení od KBI je umístěn na adrese $FFD2
5
Režimy detekce Určují, za jakých podmínek se má vyvolat přerušení: a) Hrana (edge) – např. sestupná hrana = v jednom cyklu je log. úroveň 1 a v následujícím je log. 0. b) Hrana a úroveň (edge & level) PORTA, bity 0 – 3 = pouze sestupná hrana (nebo nízká úroveň) PORTA, bity 4 – 7 = vzestupná či sestupná hrana (nebo vysoká či nízká úroveň) - zde jsou tlačítka SW1 až SW4. Náběžná hrana log. 1 log. 0 Sestupná hrana
6
Registry pro řízení KBI KBI Status and control register (KBI1SC) Řídicí a stavový registr KBI. Význam jednotlivých bitů: KBIMOD – nastavení režimu detekce 1 = úroveň a hrana 0 = pouze hrana KBIE – povolení přerušení klávesnice 1 = přerušení povoleno 0 = přerušení není generováno KBACK – zápisem 1 vynulujeme příznak KBF KBF – příznak přerušení KBI 1 = byla detekována hrana/úroveň 0 = nebyla detekována hrana/úroveň KBEDGx – výběr hrany pro detekci, KBI bity 4 až 7 1 = náběžné hrany / vysoké úrovně (log.1) 0 = sestupné hrany / nízké úrovně (log.0)
7
Registry pro řízení KBI KBI pin enable register (KBI1PE) Každý bit nastavuje zda je odpovídající pin „vstupem klávesnice“ nebo běžným vstupem/výstupem KBIPE0 až KBIPE7: 1 = vstup klávesnice 0 = běžný I/O
8
Příklad - tlačítka a přerušení Zadání: Vytvořte program, který při stisku tlačítka SW1 zapne nebo vypne LED1. Pro detekci stisku tlačítka využijte přerušení klávesnice (KBI). Poznámka: obsluha přerušení v C je funkce označená klíčovým slovem interrupt.
9
Tlačítka - opakování Tlačítka jsou připojena na port A SW1 – PTA4, SW2 – PTA5 SW3 – PTA6, SW4 – PTA7 Port je řízen pomocí 3 registrů: PTAD – datový registr portu A, při jeho načtení získáme stav pinů portu, zápisem změníme stav výstupních pinů. PTADD – řídicí registr portu A, slouží pro konfiguraci jednotlivých pinů do vstupního nebo výstupního režimu. (0=vstupní, 1=výstupní režim) PTAPE – registr pro aktivaci interních „pull-up“ rezistorů (0=pull-up deaktivován, 1=pull-up aktivován).
10
Postup v programu Nastavit PTA4 jako vstup (tlačítko SW1) Nastavit PTF0 jako výstup (LED1) Nastavit řídící registr modulu KBI – povolit přerušení (v registru KBI1SC) Povolit použití PTA4 jako vstupu KBI Při stisku tlačítka bude obvod KBI generovat přerušení a provede se naše obsluha – funkce kbi_int().
11
Obsluha tlačítka – vývojové diagramy Začátek Inicializace portu F Inicializace KBI Povolení přerušení Resetuj Watchdog KBI_int Nastav bit KBACK v reg. KBI1SC na 1 Čekej 10ms pro doznění zákmitů Invertuj stav PTFD0 Návrat Obsluha přerušení od KBI modulu: Hlavní program:
12
Program - tlačítko void cekej(void); void MCU_init(void); /* Device initialization function declaration */ // definujeme globalni promennou jako ukazatel na funkci // a to na dane misto pameti (na adresu vektoru preruseni) // Do teto promenne nastavime adresu nasi funkce kbi_int interrupt void kbi_int(void);// prototyp funkce obsluhy preruseni void (*const obsluha)(void) @0xFFD2 = kbi_int; void main(void) { PTADD_PTADD4 =0; // PTA4 vstupni rezim PTAPE_PTAPE4 = 1;// pull-up pro PTA4 zapnut PTFD = 0xFF; // zhasneme LED diody PTFDD_PTFDD0 = 1;// PTF0 vystupni rezim PTFPE = 0x00;// pull-up vypnuty KBI1SC = 0x06;// nast. ridiciho reg. KBI - preruseni povoleno KBI1PE = 0x10;// PTA4 vstup pro KBI EnableInterrupts; /* enable interrupts */ for(;;) { __RESET_WATCHDOG(); /* feeds the dog */ } /* loop forever */ } interrupt void kbi_int(void) { // cekej na dozneni zakmitu na tlacitku cekej_10ms(); // pokud LED sviti, zhasnout if ( PTFD_PTFD0 == 0 ) PTFD_PTFD0 = 1; else PTFD_PTFD0 = 0; // jinak rozsvitit // potvrd KBI modulu prijem preruseni KBI1SC_KBACK = 1; }
13
Využití časovače v C, Přerušení při přetečení čítače (TOF)
14
Použití přerušení časovače Při přetečení čítače se generuje přerušení TOF (TOF = timer overflow interrupt) Hodnota čítače, při které dojde k přetečení je nastavitelná v tzv. modulo registru Výběr zdroje hodinového kmitočtu Programovatelná frekvenční dělička Dělení 1, 2, 4…128 16 bit čítač TOF Komparátor Reset čítače - Interní f BUS (20MHz) - Interní XCLK - Externí 16 bit Modulo registr
15
Jak nastavit časovač (1/4) 1)Vybrat zdroj hodinového kmitočtu pro modul časovače v řídicím registru TPMxSC bity CLKSB a CLKSA. CLKSBCLKSAZdroj hodinového kmitočtu 00TPM modul deaktivován 01BUSCLK – hodinový kmitočet sběrnice (20MHz) 10XCLK – fixní hodinový kmitočet 11Externí zdroj hodinového kmitočtu
16
Jak nastavit časovač (2/4) 2)Zvolit požadovaný dělící poměr hodinového kmitočtu v prescaleru (děličce kmitočtu) časovače. TPMxSC bity PS2, PS1 a PS0 PS2PS1PS0Dělící poměr prescaleru 0001 0012 0104 0118 10016 10132 11064 111128
17
Jak nastavit časovač (3/4) 3)Nastavit modulo registr (TPMxMODH:TPMxMODL) na požadovanou hodnotu. Čím menší číslo uložíme, tím častěji bude časovač přetékat a vyvolávat přerušení TOF. 4)Povolit přerušení od přetečení časovače v registru TPMxSC bit TOIE. TOIE = 1 – přerušení od přetečení časovače povoleno TOIE = 0 – přerušení od přetečení časovače zakázáno 5)V obsluze přerušení od TOF nezapomenout přečíst řídicí registr TPMxSC a zapsat do bitu TOF nulu. Tím se vynuluje příznak přerušení a je možné opustit obsluhu přerušení. V případě nedodržení tohoto postupu dojde k zacyklení požadavků na přerušení.
18
Jak nastavit časovač (4/4) Hodnotu modulo registru (TPMxMODH:TPMxMODL) časovače pro požadovaný čas do přetečení časovače lze vypočítat dle následujícího vzorce: Kde:Modulo – údaj, který zapíšeme do modulo registru t TOF – požadovaný čas do přetečení časovače [s] f source – frekvence zdroje hodinového kmitočtu [Hz] Prescaler – nastavení vstupní frekvenční děličky Pozn.: Prescaler (frekvenční dělič) je nutné pro docílení co nejvyšší přesnosti nastavit tak, aby modulo bylo co největší číslo (nesmí ovšem přesáhnout hodnotu 65535).
19
Časovač v C – ukázkový program Zadání: Vytvořte program, který bude na výstupu PTF0 generovat obdélníkový signál o frekvenci 2 Hz (blikat LED1). Využijte přerušení od časovače. Poznámka: obsluha přerušení v C je funkce označená klíčovým slovem interrupt.
20
Generátor obdélníkového signálu – vývojové diagramy Začátek Inicializace portu F Inicializace TPM1 Povolení přerušení Reset watchdog systému TOF_int Potvrď příjem přerušení TPM1 Invertuj stav PTF0 Návrat Obsluha přerušení TOF od TPM1 modulu: Hlavní program:
21
Program - časovač void MCU_init(void); /* Device initialization function declaration */ interrupt void timer_int(void); // prototyp funkce pro obslouzeni preruseni // definujeme globalni promennou jako ukazatel na funkci a to na dane misto pameti // (na adresuvektoru preruseni) a do teto promenne nastavime adresu nasi funkce timer_int void (*const obsluha)(void) @0xFFEE = timer_int; char svit = 0; void main(void) { PTFDD_PTFDD0 = 1; // bit 0 portu F jako vystup PTFPE = 0;// pull-up vypnuty PTFD=0xFF; // zhasneme LED diody TPM1SC = 0x4F; // source fbus, delicka 128 TPM1MOD = 39063; // modulo registr EnableInterrupts;// povoleni preruseni for(;;) { __RESET_WATCHDOG(); /* feeds the dog */ } /* loop forever */ } interrupt void timer_int(void) { TPM1SC &= 0x7F; // nuluj priznak preruseni // tj bit 7 a neguj stav led (^ je XOR) // PTFD_PTFD0 = PTFD_PTFD0 ^ 0x01; // nebo takto s promennou svit if ( svit ) { svit = 0; PTFD_PTFD0 = 1; } else { svit = 1; PTFD_PTFD0 = 0; }
22
Konec Zvládli jste základy programování HCS08 v C
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.