Uživatel:Mottljir

Z MAM wiki

Přejít na: navigace, hledání

Obsah

[editovat] Úvod

Stránka k předmětu A2M99MAM studenta Jiřího Mottla.

Upozorňuji, že použití všech zde uvedených programů je na své vlastní nebezpečí. Neručím za škody vzniklé používáním těchto programů. Práce vyjadřují osobní názor autora, práce v žádném případě nevyjadřují stanoviska Českého vysokého učení technického v Praze.

[editovat] Některé úlohy ze cvičení

Zde jsou některé funkční okomentované úlohy, které jsem dělali během cvičení.

[editovat] 4. cvičení

Program ze 4. cvičení, dokonce to i fungovalo :-) [1]

[editovat] 9. cvičení

Program ze 9. cvičení, taky to fungovalo :-) [2]

[editovat] Návrhy na semestrální práci

Všechna témata jsou takovým návrhem, který bude asi nutno upravit, ale uvidíme :-)

Digitální hrací kostka - hrací kostka ukazující na sedmisegmentovce čísla třeba klidně od jedné do devíti. Po stisknutí tlačítka se rychle rozběhne a po dalším stisknutí se zastaví.

Návod pro úplného začátečníka - v Assembleru pro ATmega 168 - soupis a předvedení funkcí různých příkazů na jednodušších i o něco těžších dobře komentovaných příkladech. Tak jak bych si to představoval u tohoto předmětu, aby to každý pochopil.

Displej - rozchodit nějaký znakový či bodový displej a pomocí tlačítek na něm něco zobrazovat - nějaké menu (kterým se případně budou zapínat nějaké výstupy). Něco takového zřejmě použiji u své diplomové práce.

případně by se mi líbila i regulace stěračů nebo ventilátorů

[editovat] Semestrální práce - Návod pro úplného začátečníka v Assembleru - autor Jiří Mottl

Program je raději psaný poměrně podrobně, je to přeci jenom návod pro začátečníky :-). Návod by mohl být samozřejmě mnohem větší a komplexnější. Vzhledem k tomu, že na semestrální práci pracuji sám a vzhledem k rozsahu tohoto předmětu, zde není možné vše ve velkém rozsahu udělat. Ale třeba někdo na tuto práci příští rok naváže a udělá nějakou další část.

[editovat] Důležité části procesoru

Zde si ukážeme základní věci, které budeme potřebovat. Celý popis procesoru najdeme u výrobce v datasheetu. Podrobná verze datasheetu je ke stažení přesně zde

Zapojení procesoru do programátoru je hezky patrné z obrázku na tomto webu: Programátor_AVR_Dragon

Napájení: +5 V

Reset: Mikroprocesory AVR se po připojení na napájení automaticky resetují, čímž se uvedou do výchozího stavu. Všechny hodnoty v paměti se uvedou do nějakého výchozího kontrolovaného stavu, takže zde již nejsou nějaké náhodné hodnoty, které zde mohly být předtím. Reset se dá také použít při zacyklení nějakého programu, pak ho resetujeme ručně. Pokud je na resetu log. 1 - procesor pracuje, při log. 0 se vyresetuje. Procesor lze při log. 1 také přeprogramovat.

Paměť: Procesor AVR používá 3 typy paměti:

Paměť Flash - v ní je nahraný program. Po vypnutí napájení je obsah paměti zachován, vydrží asi 1000 přepisovacích cyklů.

Paměť EEPROM - po vypnutí napájení je obsah paměti zachován, vydrží asi 100000 přepisovacích cyklů. Sem se ukládají data, která se mají po vypnutí napájení zachovat - např. různá nastavení.

Paměť SRAM (statická RAM) - rychlá paměť, která obsahuje právě zpracovávaná data. Bez napájení se její obsah vymaže.

Čítač instrukcí: Program je seznam po sobě jdoucích instrukcí, který procesor vykonává. Adresa instrukce, která je právě na řadě a má se právě vykonat je zapsána v registru - čítači instrukcí (= PC = program counter). Po připojení procesoru k napájení dojde automatickému resetu, kdy je PC nastaven na adresu 000h. V programu se dále jeho adresa zvětšuje o jedna nebo o i více. Může se také změnit skokem. Pokud není v instrukci skok nebo podmínka, přejde se obvykle na další řádek.

Pracovní registry: Procesor AVR má 32 pracovních registrů označovaných R0 až R31. S těmito registry pak pracují jednotlivé instrukce. Nějaké instrukce mají svá omezení a pracují jen s horní polovinou registrů.

[editovat] Zápis čísel v různých číselných soustavách

Procesor umí pracovat s různými číselnými soustavami. Číslo se do programu v různých soustavách zapisuje dle následujících pravidel:

(42)10 = (101010)2 = (0b101010)2AVR

(42)10 = (52)8 = (052)8AVR

(42)10 = (42)10AVR = (042)10AVR

(42)10 = (2A)16 = (0x2A)16AVR = ($2A)16AVR

Např. pokud chceme číslo 42 (zapsáno desítkově) napsat jako číslo v šestnáctkové soustavě, což je rovno 2A - napíšeme pro AVR procesor 0x2A nebo $2A.

[editovat] Základy programu

Každou instrukci píšeme na samostatný řádek. Na začátku je název instrukce, dále mohou být její parametry - tzv. operandy. První operand bývá obvykle cílový, druhý zdrojový. Zdrojový operand se vykonáním instrukce nezmění. Operandem může být např. registr nebo nějaká číselná hodnota.

Komentáře: Pokud chceme okomentovat program, což je zvláště u větších programů velice vhodné pro lepší vyznání se v kódu, použijeme komentáře. Komentář napíšeme za středník. Co je zbytku řádku za středníkem, to bude kompilátor ignorovat a nepřeloží to.

Návěstí: Návěstí je název pro nějaké místo v programu. Je to označení pro adresu v programu, kde leží instrukce, která následuje za návěstím. Využívá se pro větší přehlednost v případě skoků a přeskoků v programu.

Direktivy Jsou to řídící výrazy pro překladač. Píší se ve formátu . název a pak nějaké její paramtery. Pár příkladů direktiv:

  • INCLUDE – do programu vloží soubor s nějakým dalším programem, jejím parametrem je název souboru. Vložený program se tváří jako by byl součástí tohoto programu.
  • DEF – nějaký registr si můžeme pojmenovat vlastním jménem
  • EQU – nějakému názvu, symbolu přiřadí nějakou hodnotu

Řízení vstupních a výstupních portů (I/O porty).

Abychom dobře porozuměli prvnímu programu na blíkání s LED diodou, je vhodné si ještě popsat vstupní a výstupní porty a zacházení s nimi. Těmito porty mikroprocesor vlastně komunikuje s okolním světem.

Výstupní piny jsou u procesorů AVR organizovány po 8mi, nemusí být ale všechny vyvedeny ven z pouzdra. 8 pinů tvoří jeden výstupní port. Například procesor ATMega168 má celkem 23 výstupních pinů, neboli téměř celé 4 porty. Jmenují se Port A až Port D. Na schématu jsou jednostlivé piny portů označeny PB0 až PB7, PC0 až PC6 a PD0 až PD7. V dnešní době je na čipu drahé pouzdro, naopak vnitřní integrované součástky na čipu jsou levné. Proto mají piny na procesoru různou funkci – například pin PC6 může sloužit jako vstupní a výstupní pin nebo jako reset. Další piny umožňují použití analogově digitálního převodníku a další.

Výstupní porty pracují s log. proměnnými: log 0 – zem a log 1 – napájecí napětí. Je zde však nějaká tolerance – viz datasheet od výrobce. Procesor je schopen na výstupu dodat poměrně velký proud. Pro zapojení diody bude vhodné použít předřadný rezistor.

Pro ovládání vstupů a výstupů slouží 3 registry:

DDRx Za písmeno x si můžeme dosadit písmeno portu. Je to osmibitový registr kde každý bit znamená 1 ovládací pin. Např. 3. bit (počítáno zprava) registru DDRB ovládá pin PB2. Tento registr nastavuje, zda příslušné piny budou vstupní nebo výstupní. Log. 1 = příslušný pin je výstupní, log. 0 = příslušný pin je vstupní. Např. pokud do registru DDRB uložím číslo 12 (dekadicky) = 00001100 (binárně) = nastaví se piny PB2 a PB3 jako výstupní a ostatní piny jako vstupní.

PORTx Platí podobná pravidla jako u registru DDRx – 8 bitový registr ovládající příslušné vstupní/výstupní piny. Pokud je nastaven příslušný bit jako výstup a do tohoto registru na jeho místo zapíšeme logickou hodnotu 0 nebo 1, nastaví se nám tato hodnota na příslušný výstupní pin. Pokud je nastaven příslušný bit jako vstup, logickou hodnotou 1 se připojí pull-up rezistor, log. 0 se odpojí. Pull-up rezistor je rezistor zapojený mezi napájení a nějaký spínač spojený se zemí. Pokud navážu na předchozí příklad kde DDRB = 00001100 a do programu přiřadím registru PORTB hodnotu 11111000, budou piny PB0 a PB1 vstupní bez pull-up rezistorů, piny PB2 výstupní s hodnotou log. 0, pin PB3 výstupní s hodnotou log. 1 a piny PB4 až PB7 vstupní s připojeným pull-up rezistorem.

PINx Opět platí výše zmíněná přiřazení jako u registr DDR a PORT. Tento registr slouží pro čtení hodnoty na vstupních pinech. Tento registr má aktuální hodnotu stejnou jako hodnotu nacházející se na vstupně-výstupních pinech. Např. je-li hodnota registru PIND 01100110, je na pinech PD1, PD2, PD5 a PD6 log. jednička a na pinech PD0, PD3, PD4 a PD7 log. nula.

Stavový registr

Zde si popíšeme v krátkosti stavový registr - SREG. Jedná se o osmibitový vstupně-výstupní registr, který obsahuje jednotlivé bity - tzv. příznaky definující stav procesoru po vykonání některé instrukce. Která instrukce má na který příznak vliv se dozvíme například v datasheetu. Je dobré tento registr využít pro řízení přerušení, skoků apod. Existují speciální instrukce, které nastavují nějaký konkrétní příynak na určitou hodnotu. Registr obsahuje 8 bitů - označené C, Z, N, V, S, H, T, I (zprava tj. od 0 do 7).

Význam jednotlivých bitů stavového registru:

  • C = příznak přetečení - pokud po nějaké operaci přeteklo číslo, nastaví se na log1
  • Z = příznak nulového výsledku - pokud je po nějaké operaci nulový výsledek, nastaví se na log1
  • N = příznak negativního výsledku - pokud je po nějaké operaci záporný výsledek, nastaví se na log1
  • V = příznak přeplnění čísla v druhém doplňku - ukazuje přeplnění, viz aritmetika druhého doplňku
  • S = znaménkový bit - ukazuje znaménko čísla v druhém doplňku
  • H = pomocný příznak přetečení - přenos mezi dolní a horní polovinou výsledku
  • T = kopírovací bit - pro kopírování bitu - viz instrukce BLD, BST
  • I = globální povolení přerušení - pro povolení přerušení, musí být log1, pro zákaz přerušení log0, využívá se při obsluže přerušení

[editovat] Základní instrukce

Zde s iukážeme nějaké základní instrukce. Všechny instrukce můžeme najít v datasheetu – nebo spíš v instrukčním souboru pro AVR. Zde si ukážeme ty základní a na konci tohoto návodu je také postup jak si najít nějaké další v datasheetu. Označení zde používané: Rx = registr s číslem x, jako Rr je používán zdrojový registr a jako Rd registr, k = konstanta, A je vstupně-výstupní registr

LDI = Load direct into

Ldi Rd, k

Tato instrukce vloží do registru Rd konstantu k v rozmezí od 0 do 255 (dáno tím, že pracovní registry jsou osmibitové, 2^8 = 256). Připomínám že v počítačích se čísluje obvykle od nuly. Tato instrukce pracuje pouze s registry R16 až R31 (do těch menších by se totiž nevešla).

NOP = No operation

Nop

Tato instrukce nedělá nic :-), po dobu jednoho hodinového taktu

SBI = Set bit in I/O register

Sbi P,b

Nastaví bit s pořadovým číslem b v registru P na jedničku.

CBI = Clear bit in I/O register

Cbi P,b

Nastaví bit s pořadovým číslem b v registru P na nulu.

MOV

Mov Rd, Rr

Zkopíruje hodnotu registru Rr do registru Rd.

OUT = store a register into I/O location

Out A, Rr

Zkopíruje hodnotu z registru Rr do vstupně-výstupního registru A (o adrese 0 až 63)

IN = load I/O location into a register

In Rr, A

Zkopíruje hodnotu z I/O registru A do registru Rr. Je to opak instrukce out.

DEC = decrement a register

Dec Rd

Tato instrukce sníží hodnotu registru Rd o 1. Ovlivňuje stavový registr SREG. Je-li výsledek po instrukci DEC roven 0, nastaví se v SREG příznak Z = zero flag do log.1

INC = increment a register

Inc Rd

Zvýší hodnotu registru Rd o 1. Je to opak instrukce Dec. Také ovlivňuje stavový registr SREG – je-li výsledek operace 0, je Z = 1. Výsledek operace inc může být roven nule při přetečení – v 8mi bitových registrech je 255+1 = 0.

RJMP = relative jump

Rjmp k

Jde o nepodmíněný skok – skok se provede i bez splnění nějaké podmínky. Program pokračuje instrukcí která je určena konstantou k – k hodnotě PC je přičtena hodnota k. Místo konstanty k je vhodné použít návěstí. Podobně fungují i další skoky

BRNE = branch if not equal

Brne k

Jde o podmíněný skok – provede se pouze za splnění určité podmínky. Pokud je ve stavovém registru SREG příznak Z = 0, provede se skok na místo dané konstantou k – podobně jako v instrukci Rjmp se k hodnotě PC přičte hodnota k.

[editovat] První program + stručný návod k AVR studio

První program je volen tak, aby bylo vidět, že program něco a nějak dělá. Proto bude nejlepší program na blikání LED diody. Je vhodné si ho blíže prozkoumat během krokování v AVR Studiu. Doporučuji si AVR Studio nainstalovat doma a odsimulovat si na něm nějaký program.

Spustíme si program AVR Studio.

Soubor:1.jpg

Založíme si nový projekt

Soubor:2.jpg

Programujeme v Assembleru a proto zvolíme položku Atmel AVR Assembler, napíšeme název projektu, stiskneme Next. Soubor:3.jpg

Zatím budeme program simulovat na počítači a proto vybereme v Debug platform položku AVR Simulator a v Device vyberem náš proceosr – Atmega168 a stiskneme Finish. Soubor:4.jpg

Zobrazí se nám okno AVR Studia:

Největší okno uprostřed obsahuje před chvílí založený soubor blikani.asm, okno vlevo Project obsahuje přehled o našem projektu. Dole se nám vypisují různé informace – můžeme si přepínat v oknech Build, Message, Find in Files, Breakpoints and Tracepoints. Vpravo nahoře najdeme okno I/O View zobrazující vstupní a výstupní porty, paměti, AD převodník, čítače a jiné části procesoru. Po kliknutí na nějakou položku z tohoto seznamu se v pravém dolním rohu zobrazují informace o těchto položkách – především stav jednotlivých bitů.

Do programu blikani si zkopírujeme první program.

; program pro blikání LED pro ATmega168
;
; 2-barevna LED v sérii s rezistorem 300 Ohmu je pripojena 
; mezi piny 15 (PB1, LED_X) and 16 (PB2, LED_Y).
;
; Barva1 svítí když LED_X je log1 a LED_Y je log0
; Barva2 svítí když LED_Y je log1 a LED_X je log0

; za středníkem najdeme komentáře kompilátor si jich nevšímá,
; my si jich však všímat budeme

;  DIREKTIVY - nějakému názvu, symbolu přiřadí nějakou hodnotu
;  zde přiřaďujeme registru DDRB hodnotu 4 - jde o jeho adresu
	.EQU DDRB = $04  ;$04=číslo 4 v šestnáctkové soustavě = 100 binárně
	.EQU PORTB = $05 ;$05=číslo 5 v šestnáctkové soustavě = 101 binárně
	.EQU LED_X = 1	 ;např. zde - pokud se v programu objeví LED_X, znamená to 1
	.EQU LED_Y = 2

; aktivace výstupů
	SBI	DDRB, LED_X; Piny připojené k LED nastavíme jako výstupy, to znamená do registru 
	SBI	DDRB, LED_Y; DDRB zapíšeme log1 na 1. a 2. místo (vystupni porty budou PB1 a PB2)

;HLAVNÍ PROGRAM
; který se neustále opakuje má návěstí SHOW
;volá další procedury a neustále se opakuje
SHOW:	
	RCALL	COLOR1 ;RCALL zavolá proceduru COLOR1
	RCALL	WAIT
	
	RCALL	DARK
	RCALL	WAIT
	
	RCALL	COLOR2
	RCALL	WAIT

	RCALL	DARK
	RCALL	WAIT
	
	RCALL	COL3W
	
	RCALL	DARK
	RCALL	WAIT
	
	RJMP SHOW ; zavolá návěstí SHOW = hlavní program - neustále se dokola opakuje 

; PROCEDURY
	
SMALLWAIT:    ;procedura zpusobi malé počkání procesoru
	INC	R1	  ;registr R1 se zvětší o +1
	BRNE	SMALLWAIT 	;opět se zavolá tato procedura
	RET		;po dosahnutí 255 přeteče R1 - příznak ve stavovém registru Z
			;způsobí nezavolání procedury SMALLWAIT, ale její ukončení
			;a návrat zpět do hlavního programu instrukcí RET = return

WAIT:		;procedura WAIT zpusobi delší počkání procesoru
	LDI	R16, 4 ;do registr R16 se načte číslo 4 a pokračuje se na další řádek - proceduru WAIT1
WAIT1:	INC	R1 		;registr R1 se zvětší o +1
	BRNE	WAIT1 	;opět se zavolá procedura WAIT1
	INC	R2			
	BRNE	WAIT1
	DEC	R16			;registr R16 se zmenší o -1
	BRNE	WAIT1
	RET		;návrat do hlavního programu
	;celá čekací procedura WAIT pracuje následovně:
	;obsahuje celkem 3 vnořené smyčky s použitím registrů R1, R2 a R16
	;probíhá zvyšování resp. snižování jejich obsahu
	;pokud je registr nulový (treba po přetečení) - pokračuje se na další řádek
	;na úplném konci je návrat zpět do hlavního programu
	
COLOR1:		;procedura která rozsviti prvni barvu na LED diodě, druhou zhasne
		;dioda je pripojena mezi 2 vystupy mikroprocesoru - 1. nastavi na log1, 2. na log0
       	SBI	PORTB, LED_X	;výstup na diodu X (= PB1) nastavi na log1 
	CBI	PORTB, LED_Y	;výstup na diodu Y (= PB2) nastavi na log0 
	RET	;návrat zpět

COLOR2:		;procedura která rozsviti druhou barvu na LED diodě,, první zhasne, obdoba procedury COLOR2
		;výstupz y mikroprocesoru nastaví opačně - proud tečě opačně - svítí druhá barva
       	SBI	PORTB, LED_Y
	CBI	PORTB, LED_X
	RET

COL3W:		;procedura která rozsvítí "treti barvu" - ve skutečnosti se rychle bliká jednou a druhou barvou
	LDI	R16, 2	;nastaveni "čekací" proměnné
COL3X: 	RCALL	COLOR1	;zavolá proceduru COLOR1 - rozsviti prvni barvu
	RCALL	SMALLWAIT	;a procedura SMALLWAIT chvilku počká
	RCALL	COLOR2	;procedura COLOR2 - rozsviti druhou barvu
	RCALL	SMALLWAIT	;a opět chvilku počká
	INC	R2	;cyklus zajišťující opětovné volání procedury COL3X po nějakou dobu
	BRNE	COL3X	;COL3X se opakuje dokud není R2 rovno nule
	DEC	R16	;další cyklus
	BRNE	COL3X

DARK:		;procedura způsobující zhasnutí - nastaví oba výstupy k LED na log0
       	CBI	PORTB, LED_X
	CBI	PORTB, LED_Y
	RET

Program přeložíme a spustíme - v menu dáme Build ->Build and run (Ctrl+F7) Program krokujeme pomocí krokovacích tlačítek:

Soubor:5.jpg

  • Start Debugging - start ladění
  • Stop Debugging - stop ladění, dále se ladí opět od začátku
  • Run (F5) - spustí běh programu
  • Break (Ctrl+F5) - pozastaví běh programu
  • Reset (Shift+F5) - vyresetuje program - např. pokud se něco zacyklí
  • Step Into (F11) - skočí na další příkaz
  • Step Over (F10) - skočí přes další příkaz - vynechá procedury
  • Step Out (Shift+F11) - vyskočí až za právě dělanou proceduru
  • Run to Cursor (Ctrl+F10) - běží až tam, kde je umístněn kurzor
  • Autostep (Alt+F5) - sám určitou rychlostí krokuje

Dále můžeme použít i Breakpointy a další nástroje

Rozklikneme si vlevo okno I/O View - položku PORT B a ve spodním okně se nám zobrazí stav registrů tohoto portu: Soubor:6.jpg

Ve sloupci adresa vidíme adresu těchto registrů - ta se nastavovala v úvodu programu, v dalším sloupci je hodnota tohoto registru. V tomto případě je rovna 6 = 110 desítkově. Poslední sloupec ukazuje obsazení bitů tohoto registru. Jsou číslovány zprava doleva, černý bit znamená log1, bílý bit je log0. Je zřejmé, že se jedná o číslo 00000110.

Levý sloupec obsahuje dvě záložky - Project a Processor

Soubor:7.jpg

Během krokování si můžeme povšimnout např. hodnoty programového čítače (Program Counter), počítače cyklů procesoru (Cycle Counter), času pozorování (Stop Watch), jednotlivé bity stavového registru (SREG) - černý bit = log1, bílý = log0. V našem případě se zde objevuje příznak Z. Po kliknutí na položku Registers zde můžeme vidět obsahy jednotlivých registrů R0 až R31.

Pro skutečný běh programu si musíme přepnout simulátor na skutečný procesor - a to buď na začátku anebo při spouštění AVR Studia anebo tedˇ- menu Debug - Select Platform and Device... - v okně Debug platform vyberem položku AVR Dragon a v okně Device ATmega168. Připojíme procesor k vývojové desce a dle návodu, který je na těchto stránkách názorně popsán zde Programátor_AVR_Dragon. 2-barevnou LED v sérii s rezistorem 300 Ohmu připojíme mezi piny 15 (PB1) a 16 (PB2). V menu Tools zvolíme Program AVR - Connect... a stiskneme tlačítko Connect. Dále spustíme tlačítko Assemble and run (Ctrl+F7) a program by měl na procesoru běžet i pokud program AVR Studio zavřeme. Počítač bychom ale měli nechat připojený k vývojové desce - napájení procesoru je totiž zajištěno z vývojové desky přes USB.

[editovat] Další program na regulaci ventilátoru pomocí PWM

Program pochází z 5. cvičení. Úvodní komentář je dobře udělaný, nebudu ho zde proto opakovat. Ale chtělo by to více komentovat kód, lehce se v něm studenti ztrácí. Proto ho sem dám lehce upravený a lépe okomentovaný. Jde o program ukazující použití PWM a také čtení z maticové klávesnice.

; program pro ATmega168 - regulace ventilátoru pomoci maticove klavesnice
; pouziti casovace, PWM, rezim spanku a prerusovaci system
;
; rychlost otaceni je ovladana klavesnici
; tlacitka 0-9 reprezentuji rychlost 0-100 %
;
; větrák se začne točit s prvním zmačknutým tlačítkem
; neuvolňovat tlačítko
; prvním tlačítko stiskněte nějaké vyšší, aby se větrák bezpečně roztočil
; ventilátor se točí když pin 11 je log1
;
; zapojení ventilátoru z CPU:
; Ucc pin +15 V
; GND pin NMOS Drain
; Source GND
; Gate pin 11 (OC0B, PD5)
; zapojeni klavesnice jako v predchozi uloze

.INCLUDE "m168def.inc" ;vlozi parametry procesoru ATmega168 - pojmenování a navesti
.EQU PWM_PULSES = 36   ;hodnota OCR0A pro 27,8 kHz PWM

.ORG 0x0000 
	jmp Main ; Reset Handler
.ORG 0x0008 
	jmp isr1 ; PCINT1 Handler
; .ORG je direktiva překladače  - kód za direktivou bude v paměti programu 
;  na adrese, která je za direktivou uvedena


; Zacatek hlavniho programu
Main: 

; Stack pointer init = nastavení zásobníku - nastavení na konec RAM
; ukazatel zásobníku je dvoubajtové číslo
; konstanta RAMEND udává velikost RAM
	ldi r16,high(RAMEND); do registru R16 nacte vyssi byte konce RAM
	out SPH,r16 ; a prenese do registru SPH ktery urcuje vyssi byte adresy zasobniku
	ldi r16,low(RAMEND) ;to same akorat pro nizsi byte konce RAM
	out SPL,r16



; inicializace hardware

; inicializace klavesnice
	cbi DDRC, 2 ;nastavi port C jako vstupy (sloupce1-3)
	cbi DDRC, 3 
	cbi DDRC, 4

	sbi PORTC, 2 ;nastavi Pull-up rezistory pro klavesnici
	sbi PORTC, 3
	sbi PORTC, 4

	sbi DDRD, 0 ;nastavi port D jako vystupy (radky 1 - 4)
	sbi DDRD, 1 
	sbi DDRD, 2
	sbi DDRD, 3

	cbi PORTD, 0 ;nastavi na nich log0
	cbi PORTD, 1
	cbi PORTD, 2
	cbi PORTD, 3


; Inicializace PWM
; Registry TCCR0A a TCCR0B pro konfiguraci (ridi funkce citace/casovace), DDRD pro povolení výstupního bitu
; OCR0A pro delku citace a OCR0A pro "delku" vysokeho pulsu
; Registr TIMSK0 kontroluje preruseni - nepouzivan, 0x00 defaultně 

PWM_INIT:
	ldi R17, 0b00100011	; nastaví Fast PWM Mode casovace 0 - nastaveni delicky
	;1. a 2. bit WGM00 a WGM01 nastavi na log1 - vyber PWM
	;5.bit COM0B1 na log1 nastaví výstup OC0B
	out TCCR0A, R17			; 

	ldi R17, 0b00001001	; WGM2:1 (Fast PWM), CS2..0:001 (internal clock, prescale=1)
	out TCCR0B, R17
	;0. až 2. bit CS00 až CS 02 dělá výběr hodin - zde hodiny mikrokontroléru
	; 3. až 4. bit = WGM 02 a WGM 03 - režim generovaného průběhu spolu s WGM00 a WGM 01
	; zde rychlý PWM 10bitový
	ldi R17, PWM_PULSES	; nahrani poctu hodinovych pulsu pro 1 periodu PWM
	out OCR0A, R17   

	sbi DDRD, 5	; nastaveni pinu 11 (=PD5) jako vystup PWM OC0B
; pokračování příště

[editovat] Datasheet

Podrobná verze datasheetu je ke stažení zde. Pro jeho čtení předpokládám alespoň základní znalost technické angličtiny. Datasheet obsahuje snad všechny dostupné informace o tomto procesoru od výrobce. Základní schéma vnitřního zapojení, dodávané varianty, popis částí - jádro, paměti, vstupně-výstupní porty, systémy přerušení, čítače, časovače, analogově-digitální převodník a také přehled všech instrukcí - str. 346. Pro ty málo odvážné, kterým se nechce ho otevírat zde kousek uvádím:

Soubor:8.JPG

V popisu všech instrukcí vidíme několik sloupců - první obsahuje zkratku dané instrukce, druhý operátory s kterými tato instrukce pracuje, třetí sloupec obsahuje popis dané instrukce, další nám ukayuje co se děje s jednotlivými operátory během této instrukce. Předposlední sloupec ukazuje které příznaky tato instrukce ovlivňuje. A poslední sloupec ukazuje počet taktů procesoru na vykonání této instrukce. Například první intrukce ADD pracuje s dvěmi registry Rd a Rr (d a r jsou čísla registrů 0 až 31). Tyto registry se sečtou a výsledek se zapíše do registru Rd, registr Rr zůstává nezměněn. Operace může ovlivňovat příznaky Z, C , N, V a H a proběhne během jednoho cyklu procesoru.

Pokud se chceme o procesoru dovědět co nejvíce, doporučuji datasheet od výrobce, pro většinu studentů však bude vhodnější nějaký zkrácenější výpis, například doporučená literatura. Ta ale občas obsahuje chyby a v případě nejasností je vhodné ji porovnat s datasheetem, který by měl mít vždy pravdu.

[editovat] Doporučená literatura

tato literatura zároveň posloužila jako literatura pro tuto semestrální práci

  • David Matoušek: Práce s mikrokontroléry ATMEL AVR ATmega16, BEN - technická literatura, Praha 2006
  • David Matoušek: Práce s mikrokontroléry ATMEL AVR AT90S, BEN - technická literatura, Praha 2003
  • Vladimír Váňa: Mikrokontroléry Atmel AVR - Assembler, BEN - technická literatura, Praha 2003

[editovat] Zajímave odkazy na internetu

  • Květákov.net - Soubor zajímavých článků o programování procesorů AVR na webu Květákov.net
  • Programujte.com - Seriál o programování procesorů AVR na webu Programujte.com
Osobní nástroje