Jan Bohata, Vladimír Froněk: Hrací kostka

Z MAM wiki

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

Studenti: Jan Bohata,Vladimir Fronek

Obsah

[editovat] Zadání

Hrací kostka se po startu tlačítkem rozbliká, zpomaluje, během 1,5 až 2 s zobrazí na 7 diodách hod. (téma upravte a dospecifikujte)


[editovat] Upravené zadání

  • po zmáčknutí čísla 1 na klávesnici se diody rozblikají
  • blikání zpomaluje až diody svítí 1s a zhasnou na 1s
  • po té je na diodách zobrazen výsledek hodu

Soubor:doba blikani.jpg

Výsledek je v binárním tvaru, aby nebylo použito tolik diod.

Při zobrazení hodu na jedné ze sedmi diod by byl kód doplněn:

  • maskovaním výsledku nebo posouváním výsledku do registru C
  • podmíněnými skoky


[editovat] Zapojení procesoru

  • výstup: diody, portB PB0-PB2
  • vstup: klávesnice, portD a portC: PD0 a PC2

Soubor:Zapojeni hod kostkou.jpg


[editovat] Použité registry

  • R16 + R18 -> čítač 1 - 6

R16 čítá

R18 porovnává jestli už je číslo 6

  • R20 + R19 -> kontrola zmáčknutí tláčítka - 2x změna stavu po stisku tlačítka, 2x změna PC2, 2x skok do přerušení stlačená klávesa
  • R17 -> uložení výsledku na port B

[editovat] Zajímavosti programu

  • přerušení stlačená klávesa se vyvolá po stisku čísla 1
  • v hlavní smyčce programu jsou použit NOPY kvůli počtu instrukcí

Pravděpodobnost hodu musí být stejná pro všechny čísla.

  • blikaní pomocí skoků

1 x WAIT = 0,2s

Poslední čekání: 5 x WAIT = 1s.

[editovat] Zdrojový kód hrací kostky

==========================================================================

.include "m88def.inc"

------------------------------------------------------------
preruseni
------------------------------------------------------------

.org 0x0000

rjmp start  ; po reset zacina od start .org 0x0004

rjmp stlacena_klavesa  ; obsluha preruseni pri zmene stavu pinu (PCINT)


-------------------------------------------------------------
hl prog
-------------------------------------------------------------

start:



ldi R16,high(RAMEND)  ; do registru R16 se ulozi vyssi byte konstanty RAMEND

out SPH,R16  ; nacitany byte se prekopiruje do SPH

ldi r16,low(RAMEND)  ; do registra R16 sa ulozi nizsi byte konstanty RAMEND

out SPL,R16  ; nacitany byte z R16 se zkopiruje do SPL



 ; klavesnice

 ; porty PC2, vstup-vyvod klavesnice COL1

cbi DDRC,2

 ; na PC2 aktivni pull-up r

sbi PORTC,2

 ; porty PD0 - PD2 vystupy na PD0 se pripojuje vyvod klavesnice ROW1

sbi DDRD,0 ; ROW1

sbi DDRB,0

sbi DDRB,1

sbi DDRB,2


cbi PORTD,0

cbi PORTB,0

cbi PORTB,1

cbi PORTB,2



; nastaveni preruseni pri zmene stavu pinu PC2 (pri stlaceni tlacitka klavesnice)


; pri nastavovani tohto typu preruseni zapis do konfiguracnich registru PCICR a PCMSK1 musi vykonat jako zapis do pameti


; PCICR - Pin Change Interrupt Control Register - treba nastavit prvni bit ktery zapina kontrolu zmeny stavu pinu PCINT14 az PCINT8



; PCIMSK1 - Pin Change Mask Register - nastavenim prislusneho bitu do 1 se vybere, na kterem z pineu PCINT14 az PCINT8 se ma detekovat zmena

; - nas zajima 2., 3. a 4. bit tohto registru ktere aktivujeme

; - nastavenim techto bitu se aktivuje preruseni pri zmene stavu na PCINT10 (PC2)

; zapis do pameti se dela pres instrukci ST (store)

; ukazatel X je 16-bitovy, jeho dolni byte tvori registr R26 a horni byte registr R27


ldi R26,PCICR  ; PCICR tvori nizsi cast adresy X

clr R27 ; vyssi cast adresy X je nulova

ldi R16,0b00000010 ; do R16 dame co se ma ulozit na adresu X, tj. aktivovani PCINT1

st X, R16 ; ulozeni hodnoty R16 na adresu X


; podobny princip jako v predeslem pripade, jen zapisujeme do registru PCMSK1


ldi r26,PCMSK1 ; PCMSK1 tvori nizsi cast adresy

clr r27 ; vyssi cast adresy je nulova

ldi r16,0b00000100  ; povoleni preruseni pri zmene stavu pinu PC2

st X, r16 ; zapsani hodnoty registru PCMSK1 (resp. na jeho adresu)

sei ; (Set Interrupt) - globalni povoleni preruseni

; instrukce nastavi bit I v registru SREG

; timto bitem se daji povolit/zakazat vsechna preruseni




clr R16

ldi R18,6

ldi R20,1

clr R19


loop:

inc R16

cpse R16,R18

rjmp loop

nop

nop

ldi R16,1

clr R19

rjmp loop


-------------------------------------------------------------
obsluha preruseni
-------------------------------------------------------------

stlacena_klavesa:

WAIT = 0,2s

inc R19

cpse R19,R20

reti

mov R17,R16


-------------------------------------------------------------
obsluha preruseni

RCALL COLOR1

RCALL WAIT


RCALL DARK

RCALL WAIT

RCALL COLOR1

RCALL WAIT


RCALL DARK

RCALL WAIT

RCALL COLOR1

RCALL WAIT


RCALL DARK

RCALL WAIT



zpomali

RCALL COLOR1

RCALL WAIT

RCALL WAIT

RCALL WAIT



RCALL DARK

RCALL WAIT

RCALL WAIT

RCALL WAIT

RCALL COLOR1

RCALL WAIT

RCALL WAIT

RCALL WAIT



RCALL DARK

RCALL WAIT

RCALL WAIT

RCALL WAIT



RCALL COLOR1

RCALL WAIT

RCALL WAIT

RCALL WAIT

RCALL WAIT

RCALL WAIT

RCALL DARK

RCALL WAIT

RCALL WAIT

RCALL WAIT

RCALL WAIT

RCALL WAIT







-------------------------------------------------------------



out PORTB,r17

clr R16

ldi R18,6

reti ; navrat z preruseni


;;;

WAIT:

LDI R21, 1

WAIT1: INC R1

BRNE WAIT1

INC R2

BRNE WAIT1

DEC R21

BRNE WAIT1

RET


COLOR1:

       LDI	R18,0xff

out PORTB,r18

RET

DARK:

       LDI	R18,0x00

out PORTB,r18

RET




-------------------------------------------------------------
Osobní nástroje