× Aktuálně z oboru

SHIELD Experience Upgrade 7 – méně hledání a více zábavy [ clanek/2018052902-shield-experience-upgrade-7-mene-hledani-a-vice-zabavy/ ]
Celá zprávička [ clanek/2018052902-shield-experience-upgrade-7-mene-hledani-a-vice-zabavy/ ]

AVR - obecně

[ http://programujte.com/profil/90-ondrej-karas/ ]Google [ ?rel=author ]       [ http://programujte.com/profil/118-zdenek-lehocky/ ]Google [ ?rel=author ]       17. 6. 2006       39 537×

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.


Článek stažen z webu Programujte.com [ http://programujte.com/clanek/2006061301-avr-obecne/ ].