Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilMiloš David Matějka
1
Mikropočítače a PLC Programování mikropočítačů HCS08 v jazyku C Mikropočítače a PLC
2
Co je to mikropočítač? Mikropočítač (mikrokontroler) Integrovaný obvod (čip), který obsahuje kromě procesoru i další obvody jako paměť, časovače, analogově-digitální převodník, obvody pro komunikaci atd. Srovnejte s pojmem procesor: vnější podoba rozdíl - mikropočítač přímo v sobě (na čipu) obsahuje kromě samotného procesoru i větší či menší (podle uvažovaného účelu) množství podpůrných obvodů. „mikro-počítač“ = miniaturní počítač. Tak miniaturní, že je umístěn na jediném čipu.
3
Mikropočítače... Příklady: Atmel (ATMega, ATTiny) Microchip (Pic) Freescale (HC08, ColdFire)
4
...a co s nimi Najdeme prakticky všude… Mobilní telefony Hudební a video přehrávače Bankomat Domácí alarm, autoalarm Automatická pračka Světlo pro jízdní kolo
5
Jakou funkci má tento obvod? Blikač s tranzistory….
6
A co dělá tento obvod?
7
Trend „inteligence“ je v software mikropočítače, ne v zapojení obvodu Je třeba mikropočítač naprogramovat Jak?
8
Potřebujeme k tomu… Počítač (notebook) s nainstalovaným programem, tzv. vývojovým prostředím (IDE) Mikropočítač, který chceme naprogramovat Programátor – zařízení, ve kterém se naprogramuje NEBO Vývojový kit = zařízení pro vývoj a testování programů s určitým mikropočítačem
9
Programování mikropočítače
10
Krok 1 – píšu program na PC
11
Krok 2 – Nahrávám program do mikropočítače
12
Testuji program na vývojovém kitu
13
Mikropočítač M9S08GB60 Základní vlastnosti –8 bitová centrální procesní jednotka HCS08, taktovací frekvence max. 40MHz –60KB FLASH paměti –4KB RAM paměti –56 vstupně/výstupních linek na 7 portech (porty A-G) –5 kanálový TPM2 časovač –3 kanálový TPM1 časovač –1x Synchronní sériové periferní rozhraní (SPI) –1x I2C rozhraní –2x Asynchronní sériové komunikační rozhraní (SCI) Vývojový kit Freescale M68EVB908GB60 Osazen mikropočítačem z rodiny HCS08 (8-bitový )
14
Vývojový kit s tímto mikropočítačem Slouží pro testování a ladění aplikací, pro výuku programování. Je osazen základními periferiemi jako LED diody, tlačítka, displej, sériová rozhraní Připojen přes sériovou linku RS 232 k PC, na kterém se program napíše a přeloží Program je poté odeslán do mikropočítače na kitu a spuštěn Je možno krokovat obdobně jako v režimu simulace
15
Vývojový kit Freescale M68EVB908GB60 COM1 sériový port COM2 sériový port Napájení 9V Tlačítko IRQTlačítko RESET LCD displej 2x16 znaků RS422/485 konektor Vypínač napájení 4x tlačítko SW1 – SW4 Potenciometr Bzučák 4x LED indikátor Mikropočítač M9S08GB60 Kontaktní nepájivé pole
16
Praktické ukázky programování Mikropočítač Freescale HCS08 GB60
17
Programování mikropočítače HCS-08 Vytvoření programu na PC Překlad (kompilace) Nahrání do mikropočítače přes sériovou linku (RS232) Vývojové prostředí CodeWarrior for HC(S)-08 Dostupné zdarma na www.freescale.com
18
Základní datové typy v C Datové typy: char = znak (1 B) int = celé číslo (2 B) long = celé číslo (4 B) float = reálné číslo (4 B) char znak; int c1; long c2 = 150000; float c3 = 2.35; Datový typ float lze použít pokud to překladač podporuje. V CodeWarrior musíme při vytváření projektu povolit „floating point support“. Výchozí nastavení je program bez podpory čísel v plovoucí řádové čárce.
19
Spuštění CodeWarrior IDE Vytvořit nový projekt
20
Vytvoření projektu v C - Výběr typu mikropočítače Výběr příslušného typu mikropočítače (GB60) a připojení 1.Výběr cílového mikropočítače 2.Výběr připojení mikropočítače 3.Klikneme na „Další“
21
Vytvoření projektu v C - Výběr prog. jazyka a umístění projektu 3. Vybereme umístění projektu 2. Napíšeme jméno projektu 1. Vybereme C zde 4. Klikneme na „Dokončit“
22
Kostra programu v C Direktiva #include = vložení souboru Funkce main = hlavní program
23
Program 1 - Aritmetické operace Definice globálních proměnných Kód programu
24
Testování Program přeložíme, nahrajeme do simulátoru a otestujeme jeho funkčnost….
25
Překlad a spuštění (ladění) programu Přeložit program (Make) Spustit a ladit program v simulátoru (Debug) 1.Kompilace: překlad algoritmu zapsaného v programovacím jazyce do strojového kódu. 2.Spustit a ladit program: zavedení programu do cílového mikropočítače (nebo simulátoru) a jeho následné spuštění Sestavení (Make) Ladění (Debug)
26
Běh programu v simulátoru Tlačítka pro krokování programu Zdrojový kód Proměnné Kód v paměti Registry procesoru Obsah paměti
27
Programová obsluha diskrétních vstupů a výstupů LED a Tlačítka
28
Základní pojmy Port: fyzické zařízení mikropočítače umožňující komunikaci s vnějšími jednotkami (displeje, klávesnice, převodníky,…). Bit: základní jednotka informace. Vyjadřuje množství informace potřebné k odlišení dvou vzájemně se vylučujících stavů. Nabývá hodnoty 1 nebo 0 (pravda nebo nepravda). Byte (bajt): 8 bitů 1 bajt = 8 bitů: 2 5 32 07 2 7 128 2 6 64 2 4 16 2382382 224224 212212 201201 BIT BAJT 1 bajt = 2 8 = 256 různých hodnot
29
Binární výstupy – LED diody LED diody jsou připojeny na port F LED1 – PTF0, LED2 – PTF1 LED3 – PTF2, LED4 – PTF3 Port je řízen pomocí 3 registrů: PTFD – datový registr portu F, při jeho načtení získáme stav pinů portu, zápisem změníme stav výstupních pinů. PTFDD – řídicí registr portu F, slouží pro konfiguraci jednotlivých pinů do vstupního nebo výstupního režimu. (0=vstupní, 1=výstupní režim) PTFPE – registr pro aktivaci interních „pull-up“ rezistorů (0=pull-up deaktivován, 1=pull-up aktivován).
30
Binární výstupy – LED diody Zjednodušené schéma zapojení: Port F PTFD_bit0 PTFD_bit1 PTFD_bit2 PTFD_bit3 +5V Ze schématu vyplývá, že LED dioda svítí, pokud je na příslušném pinu portu logická 0. Při logické 1 dioda nesvítí. LED4 LED3 LED2 LED1
31
Obsluha vstupů a výstupů v C Definice registrů portů, časovače atd. viz #include „derivative.h“ -> #include Např. port F (LED), datový registr: PTFD = byte, tj. celý port F nebo PTFD_PTFD0, PTFD_PTFD1… = bity portu F Příklad použití: nastavit bit 0 portu F jako výstup. PTFDD = 0x01;// 0x01 = hexadecimální číslo = %00000001 nebo PTFDD_PTFDD0 = 1;
32
Program - blikání LED Zadání: Vytvořte program, který bude blikat LED1. (LED1 je připojena na portu F, bit 0) Postup činnosti programu: 1)Nastavit bit 0 portu F jako výstup 2)Zapsat na bit 0 portu F log. 0 tj. rozsvítit LED 3)Počkat cca 0,5 s 4)Zapsat do bitu 0 portu F log. 1 tj. zhasnout LED 5)Počkat cca 0,5s 6)Opakovat od bodu 2)
33
Program – blikání LED void main(void) { PTFPE = 0;// vypnuti pull-up rezistoru PTFDD_PTFDD0 = 1; // PTF0 výstupní režim EnableInterrupts; /* enable interrupts */ while (1) { PTFD_PTFD0 = 0;// rozsvitime LED1 cekej(); PTFD_PTFD0 = 1;// zhasneme LED1 cekej(); } for(;;) { __RESET_WATCHDOG(); /* feeds the dog */ } /* loop forever */ /* please make sure that you never leave this function */ } // Cekaci smycka void cekej() { unsigned int i; for (i = 0; i < 0xFFFF; i++ ) __RESET_WATCHDOG(); } Program bliká LED1 Blikání je realizováno pomocí čekací smyčky ve funkci cekej().
34
Vytvoření projektu Vybereme připojení HCS08 Serial Monitor, protože program budeme nyní nahrávat do skutečného mikropočítače na vývojovém kitu. 1.Výběr cílového mikropočítače 2.Výběr připojení mikropočítače
35
Vytvoření projektu v C - Výběr typu mikropočítače Výběr příslušného typu mikropočítače (GB60) a připojení 1.Výběr cílového mikropočítače 2.Výběr připojení mikropočítače 3.Klikneme na „Další“
36
Zapíšeme Program blikání LED void main(void) { PTFPE = 0;// vypnuti pull-up rezistoru PTFDD_PTFDD0 = 1; // PTF0 výstupní režim EnableInterrupts; /* enable interrupts */ while (1) { PTFD_PTFD0 = 0;// rozsvitime LED1 cekej(); PTFD_PTFD0 = 1;// zhasneme LED1 cekej(); } for(;;) { __RESET_WATCHDOG(); /* feeds the dog */ } /* loop forever */ /* please make sure that you never leave this function */ } // Cekaci smycka void cekej() { unsigned int i; for (i = 0; i < 0xFFFF; i++ ) __RESET_WATCHDOG(); } Program bliká LED1 Blikání je realizováno pomocí čekací smyčky ve funkci cekej().
37
Testování Program přeložíme, nahrajeme do vývojového kitu a otestujeme jeho funkčnost….
38
Vývojový kit Freescale M68EVB908GB60 COM1 sériový port COM2 sériový port Napájení 9V Tlačítko IRQTlačítko RESET LCD displej 2x16 znaků RS422/485 konektor Vypínač napájení 4x tlačítko SW1 – SW4 Potenciometr Bzučák 4x LED indikátor Mikropočítač M9S08GB60 Kontaktní nepájivé pole
39
Nahrání programu do kitu Postup: 1)Stiskneme a stále držíme tlačítko SW4 2)Stiskneme a ihned uvolníme tlačítko RESET 3)Uvolníme tlačítko SW4 4)Klikneme na ikonu „Debug“ ve vývojovém prostředí, tím se zahájí nahrávání programu do paměti FLASH mikropočítače
40
Ladění programu v kitu Po prvním spuštění ladícího prostředí budete vyzváni k výběru připojeného mikropočítače. Pro správnou funkci musí být zvolen MC9S08GB60.
41
Binární vstupy – tlačítka 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).
42
Binární vstupy – tlačítka Zjednodušené schéma zapojení: Ze schématu vyplývá, že při stisknutém tlačítku je z portu přečtena 0. POZOR, musí být aktivovány interní „pull-up“ rezistory (ve schématu zakresleny červeně), jinak je při rozepnutém tlačítku stav portu nedefinován !!! Port A PTAD_bit7 PTAD_bit6 PTAD_bit5 PTAD_bit4 GND SW1 SW2 SW3 SW4 +5V
43
Příklad - tlačítka Zadání: Vytvořte program, který při stisku tlačítka SW1 zapne nebo vypne LED1.
44
Postup v programu Nastavit PTA4 jako vstup (tlačítko SW1) Nastavit PTF0 jako výstup (LED1) Ve smyčce testovat stav vstupního pinu PTA4. Pokud je 0, tlačítko je stisknuto, pokud je 1, tlačítko není stisknuto.
45
Program - tlačítko void cekej(void); 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 na portu F vypnuty EnableInterrupts; /* enable interrupts */ for(;;) { // pokud je stisknuto tlacitko if ( PTAD_PTAD4 == 0 ) { // pokud LED sviti, zhasnout if ( PTFD_PTFD0 == 0 ) PTFD_PTFD0 = 1; else PTFD_PTFD0 = 0; // jinak rozsvitit cekej();// kvuli opakovanemu vyhodnoceni stisku… cekej(); } __RESET_WATCHDOG(); /* feeds the dog */ } /* loop forever */ }
46
Testování programu Přeložit Nahrát do vývojového kitu Spustit Testovat funkčnost
47
Úkol k procvičení Vytvořte program, který bude blikat diodou LED1. Blikání se bude zapínat a vypínat stiskem tlačítka SW1. Jedním stiskem se blikání zapne a druhým vypne.
48
Displej Displej – jakákoliv jednotka určená pro zobrazování požadovaných dat. Např. televizor, počítačový LCD monitor, atd. Vlastnosti displeje kitu M68EVB908GB60 LCD, 2 řádky, 16 znaků na každém řádku Matice 5x7 bodů pro každý znak Připojen na portu G a E (PTG3-7, PTE6-7) Až 8 uživatelsky programovatelných znaků
49
Programová obsluha displeje 2 možnosti programové obsluhy: A) Přímé řízeníB) Pomocí ovladače Ovladač: programové vybavení pro práci s hardware, sada podprogramů pro práci s HW zařízením. Ovladač Displej Náš program Registry displeje Zápis kódů požadavků a adres dat do registrů Displej Náš program Registry displeje Požadavky typu vypiš text, smaž displej atd. (podprogramy)
50
Ovladač displeje Ovladač = knihovna podprogramů (funkcí) Před použitím je nutno přidat do projektu zdrojový kód ovladače disp_gb60.asm a soubor definic funkcí ovladače disp_gb60.inc pro program v assembleru, nebo disp_gb60.h pro program v C.
51
Funkce pro práci s displejem void dinit (void) – provede inicializaci displeje př.: dinit(); void dcls (void) – vymazání displeje př.: dcls(); void setcursor (char radek, char sloupec) – nastavení kurzoru na požadovanou pozici př.: setcursor(1,10); void douta (char znak) – výstup znaku na displej př.: douta('A'); void dtext (char* string) – výstup textového řetězce na displej př.: dtext("testovaci text");
52
Práce s displejem v C Zadání: Vytvořte program, který vypíše na displej text „Ahoj Svete“ a na druhý řádek pak znaky U, T, B na pozice 3, 6 a 9. Budeme potřebovat soubory ovladače: disp_gb60.asm – zdrojový kód v assembleru disp_gb60.h – hlavičkový soubor pro C Vytvoříme tzv. „mixed project“ - assembler a C. Hlavičkový soubor disp_gb60.h totiž pouze definuje prototypy pro funkce ovladače napsané v assembleru. Program z C tedy bude volat funkce v assembleru.
53
Projekt pro práci s displejem 1. Vybereme programovací jazyky C a Assembler. 2. Klikneme na tlačítko „Další“
54
Vložení souborů ovladače 1. Zde vybrat disp_gb60.h a disp_gb60.asm 2. Tlačítkem „Add “přidat vybrané soubory do projektu 3. Kliknout na „Dokončit“
55
Vytvořený projekt
56
Program 4 - displej void main(void) { char znak = 'U'; char* text = "ahoj svete"; EnableInterrupts; /* enable interrupts */ /* include your code here */ asm_main(); /* call the assembly function */ dinit();// Inicializace despleje dcls();// Smazani displeje dtext(text); // vypis textoveho retezce setcursor(2,3);// nastaveni kurzoru na 2 radek, 3 sloupec douta(znak);// vypis znaku setcursor(2,6); douta('T'); znak = 'B'; setcursor(2,9); douta(znak); while(1) __RESET_WATCHDOG(); } #include /* for EnableInterrupts macro */ #include "derivative.h" /* include peripheral declars */ #include "main_asm.h" /*interface to the assembly #include "disp_gb60.h" // ovladac displeje
57
Převod čísla na text Často potřebuje zobrazit na displeji hodnotu nějaké proměnné tj. číslo. Jednoduchý výpis pro číslo n = 0 až 9: douta(n + 48); Pro větší čísla můžeme využít standardní funkci jazyka C „sprintf“. Je nutno: #include Změnit velikost zásobníku v souboru PROJECT.PRM (nachází se ve složce nastavení projektu: „Project Settings / Linker Files“): STACKSIZE na 0x100 (místo výchozí hodnoty 0x80), viz obrázek. Ukázkový kód: int cislo = 156; char buffer[20]; sprintf(buffer, ‘‘%d“, cislo); dtext(buffer);
58
Úkoly k procvičení Vypište na displej velikosti datových typů int a char. Použijte příkaz sizeof pro zjištění této velikosti, např. sizeof(char). Vytvořte program, který provede analýzu znakové sady uložené v paměti displeje. Na prvním řádku bude postupně zobrazovat číslice od 0 do 255 a na druhém řádku bude zobrazovat odpovídající znak reprezentovaný daným číselným kódem. Příklad výstupu na displej: Kód:65 Znak:A
59
Využití přerušení
60
Přerušení 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í: Detekce stisku 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
61
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.
62
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
63
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)
64
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
65
Postup v programu Nastavit bit 4 portu A jako vstup (tlačítko SW1) Nastavit bit 0 portu F jako výstup (LED1) Nastavit řídící registr modulu KBI – povolit přerušení (v registru KBI1SC) Povolit použití bitu 4 na portu A jako vstupu KBI Při stisku tlačítka bude obvod KBI generovat přerušení a provede se naše obsluha – funkce kbi_int().
66
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:
67
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; }
68
Využití časovače v C, Přerušení při přetečení čítače (TOF)
69
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
70
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
71
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
72
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í.
73
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).
74
Č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.
75
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:
76
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; }
77
Využití A/D převodníku
78
A/D převodník u HCS08 - vlastnosti A/D převodník: Analogově-digitální převodník (Analog-To-Digital Converter (ATD)) = elektronický obvod pro převod analogového signálu na číslicový Vlastnosti ATD u HCS-08: Rozlišení 8 nebo 10 bitů Doba převodu 14 mikrosekund Nastavení příznaku nebo vyvolání přerušení po dokončení převodu (vektor přerušení na adrese $FFD0) Multiplexer pro 8 vstupních kanálů Funkce A/D převodníku je sdílena s portem B Režim jednoho převodu nebo kontinuální převod (single or continuous)
79
Analogově-Digitální převodník ATDC ATD1SC ATD1PE ATDRH ATDRL 0 7 Multiplexer A/D Registry A/D převodníku Vstup Např. 0 až 3.3V Výstup 0 až 1023 pro 10-bitový převodník Port B 1 Schéma A/D převodníku
80
Programová obsluha A/D převodníku Nastavení vstupů pro A/D převodník Nastavení převodníku (kanál, režim) a start převodu Čekání na dokončení převodu v případě, že není použita signalizace dokončení převodu pomocí přerušení Zpracování výsledku
81
Registry A/D převodníku (1/3) ATD1C: řídicí registr A/D převodníku ATDPU – zapnutí/vypnutí převodníku (pro úsporu energie). 1 = zapnut, 0 = vypnut DJM – zarovnání 10-bitového výsledku ve výsledkových registrech. 1 = zarovnáno vpravo, 0 = vlevo RES8 – vybírá 8/10-bitový režim 1 = 8-bit, 0 = 10-bit převod SGN – vybírá režim se znaménkem 1 = výstup se znaménkem -512 až 511 0 = výstup bez znaménka 0 až 1023 PRS – výběr dělícího poměru děličky hodinového kmitočtu (je nutno nastavit tak, aby frekvence hodinového kmitočtu nepřesáhla 2MHz) Pro f bus = 20 MHz musí být nastaven faktor 10 nebo vyšší. PRS = 0100b
82
Registry A/D převodníku (2/3) ATD1SC: stavový a řídicí registr CCF – příznak dokončení převodu 1 = dokončen, 0 = není dokončen ATDIE – povolení přerušení při dokončení převodu 1 = povoleno, 0 = zakázáno ATDCO – povolení průběžného převodu (continuous mode) 1 = průběžný, 0 = jeden převod ATDCH – výběr kanálu pro převod, viz. tabulka Podrobnosti viz dokumentace CPU, kapitola 14.
83
Registry A/D převodníku (3/3) ATD1RH, ATD1RL: výsledná data, tj. výsledek A/D převodu. 10-bit. výsledek je uložen ve dvou osmi-bitových registrech ATD1RH a ATD1RL. Zarovnání viz bit DJM v reg. ATDC. Při 8-bit konverzi je výsledek v ATD1RH ATD1PE: registr povoluje použití pinů pro použití A/D převodníkem 1 = pin povolen, 0 = pin zakázán Podrobnosti viz dokumentace CPU, kapitola 14.
84
Příklad – A/D převod Zadání: Vytvořte program, který rozsvítí 0 až 4 LED diody v závislosti na nastavení potenciometru na vývojovém kitu. Princip: Hodnotu nastavenou potenciometrem budeme snímat pomocí A/D převodníku ve smyčce a podle její velikosti rozsvítíme příslušný počet LED. Potenciometr je připojen na vstupu AD0 (kanál 0 A/D převodníku), tj. bit 0 portu B.
85
Program – vývojový diagram Start -Inicializace portu F (piny 0-3 výstupní režim) -inicializace A/D pře- vodníku -Zhasni všechny LED -Start převodu na kanálu č.0 Převod dokončen? Ne 1 1 udaj > 112 udaj > 266 udaj > 522 udaj > 767 Ano 2 2 Rozsviť LED1 Rozsviť LED2 Rozsviť LED3 Rozsviť LED4 Čekej 100ms
86
Program – A/D převodník void cekej(void); void MCU_init(void); void main(void) { /* Uncomment this function call after using Device Initialization to use the generated code */ EnableInterrupts; /* enable interrupts */ /* include your code here */ PTFD = 0xFF; // zhasneme LED diody PTFDD_PTFDD0 = 1;// bity 0 az 3 portu F jako vystupy PTFDD_PTFDD1 = 1; PTFDD_PTFDD2 = 1; PTFDD_PTFDD3 = 1; PTFPE = 0x00;// pull-up vypnuty ATD1C = 0xE4; // zapnuti prevodniku, 8 bit vysledek ATD1PE = 1; // pin PTB0 prepneme do rezimu // vstupu A/D prevodniku // opakujeme v nekonecne smycce... while ( 1 ) { ATD1SC = 0;// start prevodu, jednorazovy, kanal 0 while (ATD1SC_CCF == 0) //(ATD1SC & 0x80)==0) ; // zpracuj vysledek prevodu (ATD1RH) PTFD = 0xFF; // zhasni vsechny LED if ( ATD1RH > 50 ) PTFD_PTFD0 = 0; // LED1 on if ( ATD1RH > 100 ) PTFD_PTFD1 = 0; // LED2 on if ( ATD1RH > 150 ) PTFD_PTFD2 = 0; // LED3 on if ( ATD1RH > 200 ) PTFD_PTFD3 = 0; // LED4 on cekej(); } for(;;) { __RESET_WATCHDOG(); /* feeds the dog */ } /* loop forever */ } // main void cekej(void) { int i; for ( i= 0; i<6000; i++ ) __RESET_WATCHDOG(); }
87
Příklad 2 – A/D převodník Vytvořte program, který bude na displeji zobrazovat hodnotu získanou z A/D převodníku. Napětí na vstupu A/D převodníku se mění potenciometrem na vývojovém kitu. Potenciometr je připojen na vstupu AD0 (kanál 0 A/D převodníku), tj. bit 0 portu B.
88
Práce se sériovým komunikačním rozhraním v C - SCI
89
Sériové rozhraní Umožňuje efektivní komunikaci s dalšími mikropočítačovými systémy nebo nadřazenými systémy vybavenými rozhraním RS232 (personální počítače, řídicí průmyslové počítače, …) Vlastnosti SCI u HCS-08: Používá standardní NRZ formát Plně duplexní provoz Dvojitá vyrovnávací paměť přijímače i vysílače Programovatelná délka datového rámce 8 nebo 9 bitů Pokročilá detekce chyb na sériové lince (šum na lince, chyba parity, chybný datový rámec, …) Programovatelná přenosová rychlost Podpora hardwarového generování a kontroly parity Zcela oddělený přijímač a vysílač
90
Programová obsluha SCI Pro zefektivnění práce s modulem SCI byla vytvořena knihovna podprogramů (ovladač) obsahující základní obslužné funkce. Před použitím je nutno přidat do projektu zdrojový kód ovladače sci_gb60.asm a soubor definic funkcí ovladače sci_gb60.inc pro programy v assembleru nebo sci_gb60.h pro programy v C.
91
Funkce pro práci s SCI char sci1_init (char) – provede inicializaci SCI rozhraní na požadovanou přenosovou rychlost. Vrací 1 v případě úspěšné inicializace, jinak 0. př.: stav=sci1_init(BD9600); char sci1_in (void) – vrací přijatý znak z SCI rozhraní. V případě, že nebyl žádný znak přijat, čeká na jeho příjem. př.: znak=sci1_in(); void sci1_out (char znak) – odešle znak na sériové rozhraní 1 př.: sci1_out('C'); void sci1_str_out (char* string) – výstup textového řetězce na SCI1 př.: sci1_str_out("odesilany retezec");
92
Ovladač SCI – konstanty Funkce sci1_init vyžaduje jako parametr kód požadované přenosové rychlosti viz tabulka: KonstantaPřenosová rychlost BD48004800 Bd BD96009600 Bd BD1920019200 Bd BD3840038400 Bd BD5760057600 Bd BD115200115200 Bd
93
Práce s SCI v C Úkol: Vytvořte program, který bude periodicky odesílat na SCI1 rozhraní text „Ahoj Svete“. Budeme potřebovat soubory ovladače: sci_gb60.asm – zdrojový kód v assembleru sci_gb60.h – hlavičkový soubor pro C Vytvoříme tzv. „mixed project“ - assembler a C. Hlavičkový soubor sci_gb60.h totiž pouze definuje prototypy pro funkce ovladače napsané v assembleru. Program z C tedy bude volat funkce v assembleru.
94
Program 5 - SCI void cekej(void); char text[]="Ahoj Svete"; char CRLF []="\r\n"; // CRLF - odradkovaci sekvence void main(void) { sci1_init(BD9600); while(1) { EnableInterrupts; // povoleni preruseni /* include your code here */ // inicializace SCI1 sci1_str_out(text); // vystup textoveho retezce sci1_str_out(CRLF); // odradkuj cekej(); // chvilku pockej } void cekej(void) {// cekaci smycka long i; for (i=0;i<100000;i++) __RESET_WATCHDOG(); } #include /* for EnableInterrupts macro */ #include "derivative.h" /* include peripheral declarations */ #include "main_asm.h" /*interface to the assembly #include "sci_gb60.h" // ovladac serioveho rozhrani
95
Vložení kódu ovladače do projektu 1.Vyhledáme umístění souborů ovladače SCI (soubory sci_gb60.asm a sci_gb60.inc) 2.Tlačítkem „ADD“ je vložíme do projektu 3.Zatržítko „Copy files to project“ musí zůstat zatrhnuto
96
Vložení kódu ovladače do projektu 4.Po vložení souborů ovladače displeje do projektu ukončete průvodce kliknutím na „Dokončit“
97
Nastavení emulátoru terminálu (1/3) Zvolte připojení pomocí sériového rozhraní COM1
98
Nastavení emulátoru terminálu (2/3) Nakonfigurujte sériový port
99
Nastavení emulátoru terminálu (3/3) Nastavte správně přenosovou rychlost (musí být stejná jak na mikropočítači). Ostatní volby ponechte na předvolených hodnotách.
100
Konec
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.