Hrací kostka s kondenzátorem

Z MAM wiki

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

[editovat] ZDROJOVÝ KÓD



;******************************************************
;*		CVUT v Praze			*
;*			
;*							
;*					
;*		HRACI KOSTKA																	  ;
;*					
;*										
;*							
;*		2010 by Martin Horak & Martin Kolbe
;******************************************************
;******************* INICIALIZACE *********************
;******************************************************

;----- Definicni soubor Atmega88 ----- 
.NOLIST	;vypnuti listingu
.INCLUDE "m88def.inc" 
.LIST

;----- Definici konstant ----- 
;prvnich 8bitu
.EQU U1=0b00101000	;40
.EQU U2=0b01010001	;81
.EQU U3=0b01111001	;121
.EQU U4=0b10100010	;162
.EQU U5=0b11001010	;202




;----- Pojmenování registru ----- 
.DEF Temp=R16	;Registr Temp bude vyuzit pro pouziti LDI
.DEF Temp2=R17
.DEF Loop=R18
.DEF Napeti=R19
.DEF Data=R20
.DEF Beh=R21


;******************** ZACATEK KODU ******************

.CSEG	;zacatek kodoveho segmentu
.ORG $0000	;pocatecni adresa PC

;----- RESET A VEKTORY PRERUSENI ----- 
rjmp Inicializace	;Reset-vector adresa 0
rjmp IInt0	;External Interrupt Request 0


;----- INICIALIZACE -----


;----- NASTAVENI PORTU -----
Inicializace:
;multiplexer
sbi DDRD,5	;PORTD 5 - vystupni A0
sbi DDRD,6	;PORTD 6 - vystupni A1
sbi DDRD,7	;PORTD 7 - vystupni E

sbi DDRB,0	;PORTB 0 - vystupni LED
cbi DDRD,2	;PORTD 2 - vstupni INT0 pull_up

;posuvny registr
sbi DDRB,3	;PORTB 3 - vystupni MOSI
sbi DDRB,4	;PORTB 4 - vystupni ST_CP
sbi DDRB,5	;PORTB 5 - vystupni SCK
sbi DDRB,2	;PORTB 5 - vystupni SS

;signalizace LED
sbi DDRC,3	;PORTC 3 - vystupni 1
sbi DDRC,4	;PORTC 4 - vystupni 2
sbi DDRC,5	;PORTC 5 - vystupni 4




;----- NASTAVENI POSUVNEHO REGISTRU ----
;SPSR-status registr
;Nastavime MOSI a SCK na output, ostatni jsou input
;ldi Temp,(1<<DDB3)|(1<<DDB5)
;out DDRB,Temp

;SPCR-SPI Control register
;SPE-povoleni SPI, MSTR-master SPI
;SPR0 a SPR1-nastaveni fosc,f=fosc/16
;ldi Temp,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
;out SPCR,Temp

;inicializace posuveho registru
;ldi Temp,0b01010001
;ldi Temp,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
;out SPCR,Temp



;----- NASTAVENI PRERUSENI -----

ldi Temp,0b00000010	;reaguje na nebeznou hranu
sts EICRA,Temp

ldi Temp, 0b00000001	;preruseni int0
out EIMSK,Temp

SEI	;povoleni vsech preruseni nastaveni log 1 v registru SREG

;EIFR priznaky preruseni (pri preruseni je nastavena "1")



       
;*******************************************************
;****************** HLAVNÍ PROGRAM *********************
;*******************************************************

Start:
SEI
sbi portd,2	;pull_up

;LED
sbi portb,0	;LED sviti
ldi Beh,2

Zhasnout:

ldi Loop,2	;
hop2:
; vybijeni C
sbi portd,5	;A0-MPLX
cbi portd,6	;A1-MPLX
cbi portd,7	;E-MPLX
rcall Delay15m


;nabijeni C
cbi portd,5	;A0-MPLX
cbi portd,6	;A1-MPLX
rcall Delay15m

dec Loop
brne hop2

dec Beh
cbi portb,0	;LED nesviti
brne Zhasnout

rjmp Start	;navrat na zacatek




;***** OBSLUHA PRERUSENI *****

IInt0:
;odpojeni C
cbi portd,5	;A0-MPLX
sbi portd,6	;A1-MPLX

sbi portb,0	;LED sviti
rcall Delay1s



;///////////////////////////////
;****----- AD PREVODNIK ----- ****
;registr ADMUX inicializace A/D prevodniku na kanalu 0 s vnejsi referenci
ldi Temp,0b00100000	;zarovnani doprava
sts ADMUX, Temp

ldi Temp,0b11000000
sts ADCSRA, Temp	;zapnuti a zahajeni prevodu


;cekame nez bude ADIF=1 (prevod ukoncen)
smycka:
lds Temp2,ADCSRA
andi Temp2,0b00010000
;** vynulovani Z v SREG
ldi Temp,SREG
andi Temp,0b11111110
sts SREG,Temp

cpi Temp2,0b00010000

brne smycka	;skoc pokud je priznak 1
;prevod ukoncen, vyhodnoceni cisel
;hodnota je zapsana do ADCL a ADCH
lds Napeti,ADCL	;ADCL musime cist jako prvni
lds Napeti,ADCH	;hornich 8 bitu je presunuto do Napeti

;inicilizace posuvneho registru
ldi Temp,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
out SPCR,Temp




;odecitame od referencnich napeti, pokud nepretece skok na cislo
;BRVC
mov Temp,Napeti
SUBI Temp, U1
BRPL Jedna

mov Temp,Napeti
SUBI Temp, U2
BRPL Dva

mov Temp,Napeti
SUBI Temp, U3
BRPL Tri

mov Temp,Napeti
SUBI Temp, U4
BRPL Ctyri

mov Temp,Napeti
SUBI Temp, U5
BRPL Pet
rjmp Sest


/*
SUBI Napeti, U1
BRPL Jedna
SUBI Napeti, U2
BRPL Dva
SUBI Napeti, U3
BRPL Tri
SUBI Napeti, U4
BRPL Ctyri
SUBI Napeti, U5
BRPL Pet
rjmp Sest
*/

;a.b.c.d,e,f,g, DP == 10,9,8,5,4,3,2,7 nozicky
;a.b.c.d,e,f,g, DP == 7,6,5,4,3,2,1,0 bity

Jedna:
cbi portc,3
cbi portc,4
cbi portc,5

sbi portc,3


;posle cislo na sedmisegmentovy displej


ldi Data, 0b01100000	;"1"
out SPDR,Data	;zapisem do SPDR zahajime prenos
;cekame nez bude prenos ukoncen
Cekani1:
;po dokonceni prenosu je nastaven priznak SPIF
in Temp, SPSR
sbrs Temp,SPIF	;je-li priznak preskoci jednu instrukci PCounter+2
rcall Cekani1

sbi portb,4
nop
nop
cbi portb,4
nop
nop
sbi portb,4
nop
nop
cbi portb,4

;rcall Delay1s
SEI
rjmp Start

;--------------
Dva:
cbi portc,3
cbi portc,4
cbi portc,5

sbi portc,4

;posle cislo na sedmisegmentovy displej
ldi Data, 0b11011100	;"2"
out SPDR,Data	;zapisem do SPDR zahajime prenos
;cekame nez bude prenos ukoncen
Cekani2:
;po dokonceni prenosu je nastaven priznak SPIF
in Temp, SPSR
sbrs Temp,SPIF	;je-li priznak preskoci jednu instrukci PCounter+2
rcall Cekani1



SEI
rjmp Start
;--------------
Tri:
cbi portc,3
cbi portc,4
cbi portc,5

sbi portc,3
sbi portc,4

;posle cislo na sedmisegmentovy displej
ldi Data, 0b11110100	;"3"
out SPDR,Data	;zapisem do SPDR zahajime prenos
;cekame nez bude prenos ukoncen
Cekani3:
;po dokonceni prenosu je nastaven priznak SPIF
in Temp, SPSR
sbrs Temp,SPIF	;je-li priznak preskoci jednu instrukci PCounter+2
rcall Cekani1


SEI
rjmp Start
;--------------
Ctyri:
cbi portc,3
cbi portc,4
cbi portc,5

sbi portc,5

;posle cislo na sedmisegmentovy displej
ldi Data, 0b01100110	;"4"
out SPDR,Data	;zapisem do SPDR zahajime prenos
;cekame nez bude prenos ukoncen
Cekani4:
;po dokonceni prenosu je nastaven priznak SPIF
in Temp, SPSR
sbrs Temp,SPIF	;je-li priznak preskoci jednu instrukci PCounter+2
rcall Cekani1


SEI
rjmp Start
;--------------
Pet:
cbi portc,3
cbi portc,4
cbi portc,5

sbi portc,3
sbi portc,5

;posle cislo na sedmisegmentovy displej
ldi Data, 0b10110110	;"5"
out SPDR,Data	;zapisem do SPDR zahajime prenos
;cekame nez bude prenos ukoncen
Cekani5:
;po dokonceni prenosu je nastaven priznak SPIF
in Temp, SPSR
sbrs Temp,SPIF	;je-li priznak preskoci jednu instrukci PCounter+2
rcall Cekani1


SEI
rjmp Start
;--------------
Sest:
cbi portc,3
cbi portc,4
cbi portc,5

sbi portc,4
sbi portc,5

;posle cislo na sedmisegmentovy displej
ldi Data, 0b01111110	;"6"
out SPDR,Data	;zapisem do SPDR zahajime prenos
;cekame nez bude prenos ukoncen
Cekani6:
;po dokonceni prenosu je nastaven priznak SPIF
in Temp, SPSR
sbrs Temp,SPIF	;je-li priznak preskoci jednu instrukci PCounter+2
rcall Cekani1


SEI
rjmp Start


;//////////////////////////////////////



;----- Podprogramy ----- 
;16*255*255=1 040 400
Delay1s:
		LDI	Temp, 5
WAIT1:	INC	R1
		BRNE	WAIT1
		INC	R2
		BRNE	WAIT1
		DEC	Temp
		BRNE	WAIT1
		RET

;59*255=15 045
Delay15m:
		LDI Temp,30	;59
Wait2:	INC R1
		BRNE Wait2
		DEC Temp
		BRNE Wait2
		RET

;----- MAKRA ----- 
;problem makro je prekladacem nakopirovano 
;lepsi je vyuzit podprogram

.MACRO ObnoveniSR
;obnoveni stavoveho registru
pop r16
out sreg,r16
pop r16
rjmp Start	;navrat do hlavniho programu
.ENDMACRO







by --Horakma6 13. 5. 2010, 21:48 (UTC)

Osobní nástroje