Jednočipové mikropočítače
Atmel AVR 90S8515 činnost procesoru si budeme demonstrovat na jednočipovém mikropočítači AVR 90S8515 firmy Atmel jednočipové mikropočítače mikropočítače, obsahující na jednom čipu kromě jádra procesoru (řadič a ALU) i paměti a různé podpůrné obvody pro řízení periférií např. čítače/časovače, A/D a D/A převodníky, komunikační rozhraní, V/V porty (brány) jsou různě specializované (pro různé aplikace)
Atmel AVR 90S8515 kde se jednočipové mikropočítače používají jako řídicí mikropočítače v tzv. vestavěných systémech (embeded systems) spotřební elektronika (TV, hifi např. dálkové ovladače, mobilní svět, )
Obecná charakteristika procesorů AVR Atmel 8 bitové jednočipové mikropočítače datové cesty a ALU mají šířku 8 bitů obecně: jednočipové mikropočítače jsou bitově orientované, tj. mají instrukce pro práci s jednotlivými bity dat Poznámka: procesory řady AVR (např. ATmega8, AT90S8515, atd.) mají stejné jádro (instrukce,liší se velikostí pamětí a vybaveností perifériemi)
Atmel AVR 90S8515 paměti procesoru AVR 90S8515 8 kb paměti programu Flash EEPROM s organizací 4K 16-bitových slov 512B interní paměti dat RAM 512B interní paměti dat EEPROM 2 čítače, sériové rozhraní, 4 vstupně výstupní brány možnost připojit až 64 kb externí paměti dat RAM
Instrukce ještě jednou: elementární operace pro procesor zakódovaný dvojkově zakódování se nazývá instrukční kód instrukce se skládá ze dvou částí: operačního kódu (znaku) - OZ co se provádí, operace, např. sčítej, porovnej operandu (operandů) - OP s čím se operace provádí, např. číslo, odkaz na hodnotu v registru
Příklad zakódování instrukce jednočipový mikropočítač firmy Atmel AT90S8515 pevný formát instrukcí 1 instrukce je dlouhá 16 bitů (OZ + OP) instrukce ADD Rd, Rr provádí součet hodnot v registrech procesoru Rd := Rd + Rr, tj. do k registru číslo Rd přičte obsah registru Rr a výsledek uloží opět do registru Rd
Příklad zakódování instrukce Rd a Rr je jeden z 32 univerzálních registrů procesoru R0 R31 (vybírá je programátor) např. ADD R0,R15 operační znak
Registry speciální paměťové buňky v procesoru důvod existence: rychlý přístup k jejich obsahu uchovávají mezivýsledky a výsledky aritmetických operací, některé instrukce pracují pouze s daty v registrech uchovávají stav procesoru, speciální informace
Architektura procesoru AVR
Registry střadač (acumulator A) speciální registr, se kterým pracují aritmetické instrukce; ukládají se do něj operandy a výsledky má jej většina procesorů procesory AVR nemají 1 střadač, ale sadu 32 univerzálních 8 bitových registrů pro aritmetické operace 6 může být využito jako tři 16-bitové registry X, Y, Z (pro nepřímou adresaci)
Univerzální registry procesoru AVR nižší slabika vyšší slabika Registr X Registr Y Registr Z
Registry programový čítač (Program Counter) 16 bitový programový čítač PC obsahuje adresu právě vykonávané instrukce tj. adresu do paměti programu po zapnutí nebo resetu procesoru má hodnotu 0 po zapnutí se začíná vykonávat program od adresy 0
Registry příznakový registr (status nebo také flag) v tomto registru je uložen stav procesoru (včetně výsledků aritmetických a logických operací) probereme se zatím jen některé (pro nás zajímavé) příznaky (bity)
Příznakový registr I global interrupt enable globální povolení přerušení (1 = povoleno) přerušení se povoluje/zakazuje instrukcemi SEI (set interrupt) a CLI (clear interrupt) Z zero je-li nastaven, výsledek předchozí operace byl nulový používá se v při testování/porovnávání
Příznakový registr S sign znaménkový bit, výsledek aritmetické operace (0 kladný, 1 záporný) N negative nastaven, je-li výsledek aritmetické operace záporný C carry přenos z nejvyššího řádu při aritmetických operacích
Zásobník datová struktura LIFO (last in first out) odebírá se naposledy uložená hodnota operace: PUSH (uložení hodnoty na vrchol zásobníku) POP (odebrání hodnoty z vrcholu zásobníku) POP PUSH
zásobník se využívá v programech pro odložení mezivýsledků, automaticky se využívá při volání procedur a funkcí instrukce CALL adr automaticky se uloží na vrchol zásobníku návratová adresa, provede se skok na adresu adr instrukce RET návratová adresa se odebere ze zásobníku, na ní se provede návrat
Ukazatel na vrchol zásobníku SP (stack pointer) pro zásobník je vyhrazena část paměti dat RAM procesor nemá samostatný zásobník SP obsahuje adresu vrcholu zásobníku ukazuje do paměti na vrchol zásobníku zásobník roste směrem dolů (snížení hodnoty SP při uložení dat na zásobník)
Ukazatel na vrchol zásobníku SP (stack pointer) SP je 16-bitový, skládá se ze dvou samostatně přístupných 8 bitových částí SPH (high vyšších 8 bitů), SPL (low nižších 8 bitů)
Ukazatel na vrchol zásobníku SP SP musí být nastaven v programu před prvním voláním procedury (nejlépe na začátku programu) nad hodnotu 60h, protože dolníčást paměti s adresami 0 až 60h je využita pro periférie zpravidla se nastavuje na konec paměti RAM: ldi out ldi out R16,low(RAMEND) SPL,R16 R16,high(RAMEND) SPH, R16
Další registry procesor má další speciální registry, které jsou určeny pro řízení periférií, tzv. vstupně-výstupní (I/O input/output) registry každý má svoji adresu pro snadnější orientaci a programování jsou definovány zkratky registrů, např. PORTA pro bránu A,
Organizace paměti
Příklad 1 napíšeme program v assembleru, který bude počítat počet stisknutí tlačítka 0 na výukovém přípravku STK500 po 10. stisknutí tlačítka program rozsvítí diodu na přípravku a vynuluje počítadlo stisků po dalších 10. stisknutích tlačítka dioda zhasne atd.
Co budeme ještě potřebovat? porty neboli brány paralelní porty (brány) jednočipového mikropočítače AVR slouží pro vstup/výstup digitálních dat, tj. 0 a 1 procesor 8515 obsahuje 4 vstupně-výstupní 8-mi bitové porty A až D PORTx je výstupní port (PORTA až PORTD) PINx je vstupní port (PINA až PIND)
Brány porty neboli brány zápisem 0 nebo 1 do příslušný bit brány nastavíme na 0 nebo 1 vývod procesoru směr přenosu (vstup/výstup) se řídí obsahem registru DDR (Data Direction Register) DDRA až DDRD zápis 1 na příslušný bit znamená, že výstup je konfigurován jako výstupní dovolené zatížení 1 bitu (pinu) 20 ma
Brány
Přípravek přípravek obsahuje 8 svítivých diod LED a 8 tlačítek propojovacím kabelem je možné připojit diody a tlačítka na libovolný port zvolíme: LED připojíme na PORTB a tlačítka na PORTD zapojení LED a tlačítek: zápisem 1 na port dioda zhasne, při stisknutém tlačítku čteme log. 0
Algoritmus ZAČÁTEK r = 0 je tlač. povoleno? ne ano zvyš r r = 10 ne ano změň stav diody r = 0 je tlač. stisknuto? ne ano
Jaké instrukce jsou použity v příkladu rjmp a (relative jump) relativní skok o +/-počet adres a ldi R,konst (load immediate) nastaví obsah registru R16-R31 konstantou konst. out P,R (output) zkopíruje obsah registru R na výstupní port P
Jaké instrukce jsou použity v příkladu ser R (set register) nastaví všechny bity registru R na 1 clr R (clear register) nastaví všechny bity registru R na 0 rcall a (relative call) volání podprogramu ret (return) návrat z podprogramu
Jaké instrukce jsou použity sbis P,b v příkladu přeskočí následující instrukci, je-li b-tý bit ve V/V registru P nastaven (Skip if Bit in I/O Register is Set) sbic P,b přeskočí následující instrukci, je-li b-tý bit ve V/V registru P vynulovaný (Skip if Bit in I/O Register is Cleared)
Jaké instrukce jsou použity cbi P,b (clear bit) v příkladu vynuluje bit b na portu P sbi P,b (set bit) nastaví bit b na portu P cpi R,k (compare immediate) porovná hodnotu v registru R s konstantou k pokud se rovnají, nastaví příznak Z stavového registru na 1
Jaké instrukce jsou použity v příkladu brne adr (branch if not equal) skočí na adresu adr, pokud není nastaven příznak na hodnotu 1 (tj. např. jestliže se obsahy dvou registru nerovnají), jinak pokračuje na následující instrukci inc R (increment) zvýší obsah registru R o 1
Eliminace zákmitu tlačítek při čtení stavu tlačítek je nutné ošetřit zákmit signálu při změně stavu tlačítka
Eliminace zákmitu tlačítek pokud čekáme např. v cyklu na změnu log. stavu tlačítka bez dalšího ošetření, může dojít při jednom stisku k mylnému několikanásobnému vyhodnocení program obsluhy skončí dříve, než odezní přechodový děj, a další test vyhodnotí zákmity jako opětovné stisknutí je možnéřešit speciálními vstupními obvody s hysterezí, což přípravek nemá
Eliminace zákmitu tlačítek správný postup spočívá ve vložení čekací smyčky, jakmile zjistíme změnu stavu, a následné opětovné kontrole stavu tlačítka předpokládejme, že stisk tlačítka znamená na vstupu log. 0: 1. čekej dokud je stav tlačítka roven log. 1 2. Počkej 0,1 s (čas záleží na délce přechodového jevu) 3. Je-li stav tlačítka log. 0, pokračuj, jinak se vrať na krok 1
Eliminace zákmitu tlačítek čekací smyčku budeme realizovat procedurou, kterou voláme instrukcí rcall před voláním se na vrchol zásobníku uloží návratová adresa procedura je ukončena instrukcí ret, která zajistí návrat za místo volání dle adresy na vrcholu zásobníku a odebere tuto adresu z vrcholu zásobníku čekací smyčka je vnořený trojitý cyklus
Příklad 1 zdrojový kód je uložen jako příklad1.asm s podrobným komentářem
Příklad 1b počítání stisků tlačítka mohu provádět i opačně, tj. na počátku nastavím hodnotu čítače na 10 a čítač snižuji o 1 pomocí instrukce dec R (decrement); testuji výsledek na hodnotu 0 výhoda: instrukce dec nastaví automaticky příznak Z na hodnotu 1, pokud je po provedení hodnota registru rovna 0 v programu odpadá instrukce cpi pro porovnání
Příklad 1c tentýž příklad zapsaný v jazyce C využívá logické operace jazyka C & - and - or ^ - xor
Příklad 2 Doplňte příklad 1 tak, aby program nezávisle blikal další diodou na přípravku s periodou 1s (0,5s svítí). Využijeme časovače a přerušení od časovače při dosažení určité hodnoty!
Čítače a časovače Čítač speciální registr, který kromě operací čtení/zápisu hodnoty může zvýšit (snížit) svoji hodnotu o 1 při změně vnějšího signálu může zvýšit = čítání lze povolit/zakázat čítače v jednočipových mikropočítačích zpravidla hodnotu zvyšují
Čítače a časovače Časovač speciální registr, který kromě operací čtení/zápisu hodnoty může zvýšit (snížit) svoji hodnotu o 1 při změně vnitřního hodinového signálu mikropočítače v jednočipových mikropočítačích bývá čítač/časovač v jediném bloku, programátor vybírá mezi funkcíčítače a časovače
Čítače a časovače 90S8515 má 2 časovače/čítače s předděličkou kmitočtu TIMER0 jednoduchý osmibitový čítač/časovač TIMER1 šestnáctibitový čítač/časovač 2 x komparační registr
Čítače a časovače
Čítače a časovače Komparační registr čítač bez komparačního registru čítá od 0 do maximální hodnoty, např. 16 bitový čítač od 0 do 65535 a pak opět od 0 čítač s komparačním registrem komparační registr obsahuje určitou hodnotu zapsanou programátorem čítaččítá od 0 do této hodnoty a pak opět od 0 (zkrácení periody čítání)
Čítače a časovače Komparační registr
Přerušení přerušení (interrupt) asynchronní událost vyvolaná např. časovačem při dosažení komparované hodnoty (interrupt on compare) zdrojů přerušení může být více (čítač, změna vnějšího signálu, příchod dat po komunikačním rozhraní, u PC např. stisk klávesy) jádru procesoru (řadiči) je tato událost oznámena speciálním signálem interrupt (resp. více signály)
Přerušení řadič procesoru na konci instrukčního cyklu testuje, zda nenastalo přerušení pokud ano, procesor přeruší vykonávání aktuálního programu a vykoná tzv. obslužnou rutinu přerušení (přerušovací rutinu); po jejím dokončení se opět vrátí k vykonávání původního programu před vstupem do přerušovací rutiny se na vrchol zásobníku uloží návratová adresa a navíc stavový registr procesoru (např. u procesorů Intel, Motorola, nikoliv u procesoru AT90S8515)
Přerušení přerušení lze maskovat (tj. zakázat) globálně je přerušení povoleno nastavením příznaku I (interrupt flag) ve stavovém registru u AT90S8515 je po startu shozen, tj. přerušení zakázáno příznak se nastavuje instrukcí sei (set interrupt), nuluje instrukcí cli (clear interrupt) individuálně se povolují přerušení od různých zdrojů např. v registru TIMSK Timer Interrupt Mask Register se nastavením bitů povolují přerušení od různých událostí časovače
Přerušení některé procesory mají speciální signál NMI (Non-maskable interrupt) nemaskovatelné přerušení, tj. přerušení, které nelze zakázat AT90S8515 nemá NMI procesory Intel NMI mají, v prvním PC bylo aktivováno hlídačem chyby paměti přeruš. rutina vypsala hlášení a zastavila chod PC Poznámka: na NMI může být zapojen třeba požární hlásič
Přerušení u AT90S8515 se při vstupu do přerušovací rutiny automaticky nuluje příznak I tj. zakazuje se přerušení, aby běh přerušovací rutiny nebyl přerušen příznak nastaví opět instrukce RETI Poznámka: některé procesory ponechávají příznak I po vstupu do rutiny nastaven; záleží na programátorovi, zda ponechá povolené přerušení a dovolí přerušovací rutinu přerušit
Přerušení uvádí se, že systém přerušení procesoru je vektorový systém, tj. má velikost a směr velikost = priorita (přednost) je definováno pořadí (priority) zdrojů přerušení pokud dojde k přerušení od více zdrojů v jediném okamžiku, např. od časovače a komunikační linky, procesor nejprve obslouží to s vyšší prioritou směr jsou dány adresy v paměti programu, kde je přerušovací rutina umístěna
Přerušení procesoru 8515 jádro obsluhuje 12 zdrojů přerušení (+ reset) priorita je pevně dána vektory přerušení (tj. adresy přerušovacích rutin) jsou pevně umístěny za sebou na počátku paměti programu na danou adresu umístí programátor instrukci rjmp (relative jump - relativní skok) na obslužnou rutinu rutina musí být ukončena instrukcí RETI (interrupt return)
Zdroje přerušení nejvyšší priorita nejnižší priorita
Jak to budeme dělat? využijeme čítač/časovač TIMER1 použijme přerušení při porovnání (Compare Match A) přerušovací rutina změní svit diody
TIMER1
Vypočítáme porovnávací hodnotu požadujeme přerušení v intervalech po 0,5s hodinový signál procesoru na přípravku má kmitočet 3,68 MHz vypočítáme periodu hodinového signálu Th = 1/(3,68 Mhz) = 2,72 10-7 s využijeme předděličku 1024 a vypočítáme periodu čítání časovače T = 2,72 10-7 s x 1024 = 2,78 10-4 s
Vypočítáme porovnávací hodnotu požadujeme přerušení v intervalech po 0,5s Otázka: Do kolika musíčasovač dočítat, aby odměřil 0,5s? číslo = 0,5 s/ 2,78 10-4 s = 1798 = 0x0706
Co nastavíme komparační registr OCR1A pro časovač na hodnotu 0706h OCR1A = Output Compare Registerčasovače TIMER1 A časovač má 2 komparační registry, ještě OCR1B řídící registr čítače TCCR1B TCCR1B = Timer/Counter1 Control Register B vybereme dělící poměr hodinového signálu 1024 a nastavíme mód čítače CTC (Clear Timer on Compare), tj. po dosažení hodnoty se čítač vynuluje
Co nastavíme registr masky přerušení časovače TIMSK TIMSK = Timer Interrupt Mask Register povolíme, aby obvody časovače 1 generovaly pro jádro procesoru přerušení při události Compare, tj. čítač dosáhl hodnoty zapsané v reg. OCR1A povolíme globálně přerušení instrukcí sei sei set interrupt bit
Řídicí registr čítače TCCR1B Clear Timer on Compare Clock Select (výběr frekvence) log. 1 = nulování po dosažení porovnávací hodnoty
Výběr frekvence TCCR1B nastavím na hodnotu 00001101b = 13d = 0Dh
Registr masky přerušeníčítače TIMSK Timer/Counter1 Output CompareA Match Interrupt Enable log. 1 = přerušení je povoleno TCCR1B nastavím na hodnotu 01000000b = 64d = 40h
Vektor přerušení při vyvolání přerušovací rutiny skáče procesor na adresu 4 pozor, na adresu 5 skáče při jiném přerušení na adresu 4 umístíme instrukci skoku rjmp na návěští přerušovací rutiny
Přerušovací rutina změní stav výstupního portu, tj. stav diody bude ukončena instrukcí reti interrupt return (návrat z přerušovací rutiny) odebírá obyčejně ze zásobníku kromě návratové adresy i stavový registr procesoru, který obnovuje (u AT90S8515 jen odebírá ze zásobníku návratovou adresu) u AT90S8515 nastavuje příznak I ve stavovém registru, tj. opět povoluje přerušení
Příklad 2 a 2c dvě verze programu v assembleru v jazyce C