V dnešním díle se podíváme na zoubek samotné architektuře procesoru. Je to věc často opomíjená, zvláště těmi, kteří programují procesory v jazyce C. Musím však upozornit, že pro zvládnutí jakéhokoliv typu procesoru, jsou tyto znalosti nesmírně důležité.
Procesory AVR mají tzv. Hardwardskou architekturu. To znamená, že mají oddělené paměťové prostory (a sběrnice) pro data i program. My se často setkáváme s druhým typem – tzv. von Neumannova architektura – například v běžném PC (data i program máme v jedné RAM, na jednom disku…
Jak je vidět na obrázku, AVR obsahují celkem tři druhy pamětí:
- paměť programu FLASH
- paměť dat (přechodných) RAM (SRAM)
- paměť dat EEPROM
Pamě't RAM slouží k uchovávání přechodných dat. Je rozdělena na několik desítek registrů (bajtů). Tato data mohou být pouze pracovní a nebo také řídící – většina registrů ovládá periferie a nebo samotný chod procesoru. Jiné zase informují o stavu, v jakém se procesor nachází.
Paměť programu, jak už název napovídá, slouží k uložení programu a nebo konstant, které v programu využíváme. (Například při převodu z BIN->7 segment.) Tato data se ukládají pouze za použití programátoru.
Paměť EEPROM slouží pro uchování dat, o která nechceme po vypnutí napájení přijít &ndash jako tomu je například u RAM. Příkladem mohou být konfigurační data anebo například kód v případě kódového zámku.
To, co vidíte na obrázku, je CPU, tato část řídí celý procesor. Zpracovává veškeré instrukce, které do ní vcházejí jako 16 bitové číslo, označující instrukci a případné operandy. Jak vidíte, je propojena sběrnicí se všeni částmi integrovaného obvodu. I tato část má ale určeno paměťové místo, kam ukládá výsledky svých aktivit, a tím je SREG &ndash STATUS REGISTER (umístění v paměti RAM)
Vysvětlíme si, co jednotlivé bity znamenají:
- I &ndash Global Interrupt Enable – globální povolení přerušení
- T – Bit Copy Storage – místo pro ukládání bitu
- H – Half Carry Flag – nastaví se při přenosu ze 3 na 4 bit
- S – SIGN BIT = S XOR N
- V – Two’s Complement Overflow Flag – příznak přeplnění čísla v druhém doplňku
- N – Negative Flag – příznak negativního výsledku
- Z – Zero Flag – příznak nulového výsledku
- C – Carry Flag – příznak přetečení
Existuje i mnoho dalších jiných důležitých registrů, ale o těch si řekneme později. Dnes si ještě povíme něco o rozdělení paměti dat RAM a tím i o programátorském modelu.
Na obrázku nahoře můžete vidět rozložení registrů pro obecné použití. S těmito registry budete realizovat většinu operací. Některé operace ale pracují pouze s druhými šestnácti, které to jsou, si povíme později. Posledních 6 registrů 26 – 32 je možné využít také pro nepřímé adresování, což je většinou jediná možnost, jak „dosáhnout“ na data v celé 1k (S)RAM.
Na tomto obrázku již vidíte zařazení registrů R0 – R31 v rámci celé (S)RAM a pod nimi (vyšší adresy) umístěny vstupně-výstupní registry, jež ovládají periferie i samotný procesor. Od adresy 60H již máte celou zbylou (S)RAM pro sebe…
První krůčky
V minulém díle jsem uvedl odkaz na soubor s instrukční sadou pro procesory AVR. Doufám, že většina z vás si ji pozorně prostudovala, protože už dnes si napíšeme první program. Předpokládám, že již máte nainstalováno AVR studio.
Po spuštění AVR studia se vám zobrazí následující dialog, kde zvolte New Project:
Nastavte projekt podle obou obrazků:
Přepište následující kód:
.NOLIST
.INCLUDE "m16def.inc"
.LIST
// --> nastaveni zasobniku
LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,HIGH(RAMEND)
OUT SPH,R16
// <-- konec nastaveni
CLR R2 ; vynuluje R2
CLR R3 ; vynuluje R3
CLR R19 ; vynuluje R19
zacatek:
RCALL zpozdi ; zavola "zpozdi"
RJMP zacatek ; skoci na "zacatek"
// ************** funkce *************
zpozdi:
INC R2 ; inkrementuje R2
LDI R19,125 ; naplni R19 cislem 125
CP R2,R19 ; je-li R2 mensi nez 125 >>
BRLO pryc ; >> jde pryc
CLR R2
INC R3
LDI R19,25
CP R3,R19
BRLO pryc ; pozdrzi 25x, celkem tedy 3125x
CLR R3
; tady budem dal neco delat...
pryc: NOP
RET
Program zkompilujte stisknutím F7 a spusťte debugger (Shift + Alt + Ctrl + F5). Pomocí klávesy F11 si můžete program krokovat a zjistit, co dělá. Podívejte se hlavě na to, co se děje s registry R2 a R3. To je váš úkol pro příště, kdy si také program detailně popíšeme.