@*** PWM krmiljenje koracnika (GNU) - S53MV 27.09.2017 ***

@*** Konstante mikrokrmilnika LPC2138/01 ***
.equ	KVARC,14745600		@frekvenca kristala (Hz)
.equ	CLK,KVARC*4		@frekvenca jedra ARM (PLL)
.equ	PCLK,CLK		@frekvenca vhodno/izhodnih enot (APBDIV)
.equ	BAUD,PCLK/16/115200	@modulo deljenja UART za 115200bps
.equ	N1US,CLK/3000000	@konstanta cakanja T1US za HD44780
.equ	ETIPKE,8		@stevilo enakih tipk za veljaven ukaz
.equ	ZHITRO,4		@zacetna hitrost vrtenja

@*** Konstante stirifaznega koracnega motorja ***
.equ	PWMA,1200	@PWM amplituda osnovne
.equ	PWMH,80		@PWM amplituda 3.harmonika
.equ	PWMS,1440	@PWM sredina
.equ	PWMP,2879	@PWM perioda 2880-1 (20.48kHz)
.equ	NCIKEL,50*256	@stevilo ciklov za polni krog *256
.equ	NKOT,(3600*65536)/NCIKEL
.equ	NCRTA,(768*65536)/NCIKEL
.equ	NDAC,(1024*65536)/NCIKEL

@*** Vhodno/izhodni prikljucki LPC2138/01 ***
@/RESET - vhod vezan na /ERROR.LP2951 in na /DTR.FT231XS
@P0.0/TXD0/PWM1 - izhod vezan na RXD.FT231XS 
@P0.1/RXD0/PWM3/EINT0 - vhod vezan na TXD.FT231XS
@P0.2.od/SCL0/CAP0.0 - neuporabljen izhod
@P0.3.od/SDA0/MAT0.0/EINT1 - neuporabljen izhod
@P0.4/SCK0/CAP0.1/AD0.6 - neuporabljen izhod
@P0.5/MISO0/MAT0.1/AD0.7 - neuporabljen izhod
@P0.6/MOSI0/CAP0.2/AD1.0 - neuporabljen izhod
@P0.7/SSEL0/PWM2/EINT2 - izhod PWM test
@P0.8/TXD1/PWM4/AD1.1 - izhod PWM navitje 1 koracnega motorja
@P0.9/RXD1/PWM6/EINT3 - izhod PWM navitje 2 koracnega motorja
@P0.10/RTS1/CAP1.0/AD1.2 - neuporabljen izhod
@P0.11.od/CTS1/CAP1.1/SCL1 - neuporabljen izhod
@P0.12/DSR1/MAT1.0/AD1.3 - neuporabljen izhod
@P0.13/DTR1/MAT1.1/AD1.4 - neuporabljen izhod
@P0.14.od/DCD1/EINT1/SDA1/BOOTLOADER(!) - vhod vezan na /RTS.FT231XS 
@P0.15/RI1/EINT2/AD1.5 - neuporabljen izhod
@P0.16-23 - digitalni izhodi za LCD D0-7.HD44780
@P0.24 - ne obstaja ***
@P0.25/AD0.4/AOUT - analogni izhod za risalnik
@P0.26/AD0.5 - neuporabljen izhod
@P0.27/AD0.0/CAP0.1/MAT0.1 - neuporabljen izhod
@P0.28/AD0.1/CAP0.2/MAT0.2 - neuporabljen izhod
@P0.29/AD0.2/CAP0.3/MAT0.3 - neuporabljen izhod
@P0.30/AD0.3/EINT3/CAP0.0 - neuporabljen izhod
@P0.31(!) - nepovezan ***
@P1.0-15 - ne obstajajo ***
@P1.16 - nepovezan vhod z vgrajenim PULL-UP
@P1.17 - vhod z vgrajenim PULL-UP za tipko STOJ na maso
@P1.18 - vhod z vgrajenim PULL-UP za tipko DESNO na maso
@P1.19 - vhod z vgrajenim PULL-UP za tipko LEVO na maso
@P1.20(!) - nepovezan ***
@P1.21 - digitalni izhod za LCD RS.HD44780
@P1.22-25 - nepovezani ***
@P1.26(!) - nepovezan ***
@P1.27-29 - nepovezani ***
@P1.30 - digitalni izhod za LCD E.HD44780
@P1.31 - nepovezan ***

@*** Dodelitev pomnilnika RAM ***
.equ	SKLAD,0x40000100	@sklad raste navzdol -256byte

.equ	KOT,0x40000400		@kot v stopinjah na eno decimalko (32bit)
.equ	DECI,0x40000404		@desetinke (32bit)
.equ	ENICE,0x40000408	@enice (32bit)
.equ	DEKA,0x4000040C		@desetice (32bit)
.equ	HEKTO,0x40000410	@stotice (32bit)
.equ	SKOT,0x40000414		@stari kot (32bit)
.equ	SMETI,0x40000418	@smeti (32bit)
.equ	STEVEC,0x4000041C	@stevec glavne zanke (32bit)
.equ	SMER,0x40000420		@smer vrtenja +1,0,-1 (32bit)
.equ	HITRO,0x40000424	@hitrost vrtenja (32bit)
.equ	RAZPON,0x40000428	@razpon vrtenja (32bit)
.equ	STIPKE,0x4000042C	@stara vrednost tipk (32bit)
.equ	NTIPKE,0x40000430	@stevec enakih tipk (32bit)

@*** Ukazi za delovanje zbirnika GNU ***
.text
.arm

@*** Tabela izjem na zacetnem naslovu 0 ***
IZJEME:	B	ZACNI	@RESET
	B	IZJEME	@Undef
	B	IZJEME	@SWI
	B	IZJEME	@PAbt
	B	IZJEME	@DAbt
	NOP		@Reserved Vector
	B	IZJEME	@IRQ
	B	IZJEME	@FIQ

@*** Pocisti pomnilnik do nevarne lokacije 0x000001FC ***
.balign	512,0

@*** Inicializiraj MAM *** (R0-1)
MAM:	LDR	R0,=0xE01FC000	@MAMCR=0
	MOV	R1,#0
	STRB	R1,[R0]
	LDR	R0,=0xE01FC004	@MAMTIM=3
	MOV	R1,#3
	STRB	R1,[R0]
	LDR	R0,=0xE01FC000	@MAMCR=2
	MOV	R1,#2
	STRB	R1,[R0]
	MOV	PC,LR
.ltorg

@*** Nastavi PCONP in APBDIV *** (R0-1)
PWRCLK:	LDR	R0,=0xE01FC0C4	@PCONP
	LDR	R1,=0x00000028	@UART0,PWM0
	STR	R1,[R0]
	LDR	R0,=0xE01FC100	@APBDIV=1
	MOV	R1,#1
	STRB	R1,[R0]
	MOV	PC,LR
.ltorg

@*** Inicializiraj PLL *** (R0-2)
PLL:	LDR	R0,=0xE01FC084	@PLLCFG=0x24 P=2,M-1=3
	MOV	R1,#0x23
	STRB	R1,[R0]
	LDR	R0,=0xE01FC080	@PLLCON=0x01 PLL-enable
	MOV	R1,#0x01
	STRB	R1,[R0]
	LDR	R0,=0xE01FC08C	@PLLFEED
	MOV	R1,#0xAA
	MOV	R2,#0x55
	STRB	R1,[R0]
	STRB	R2,[R0]
PLL1:	LDR	R0,=0xE01FC088	@PLLSTAT cakanje uklenitve
	LDR	R1,[R0]
	ANDS	R1,R1,#0x400
	BEQ	PLL1
	LDR	R0,=0xE01FC080	@PLLCON=0x03 PLL-enable&connect
	MOV	R1,#0x03
	STRB	R1,[R0]
	LDR	R0,=0xE01FC08C	@PLLFEED
	MOV	R1,#0xAA
	MOV	R2,#0x55
	STRB	R1,[R0]
	STRB	R2,[R0]
	MOV	PC,LR
.ltorg

@*** Inicializiraj GPIO in DAC *** (R0-1)
GPIO:	LDR	R0,=0xE002C000	@PINSEL0 P0.0-1=UART0 P0.7-9=PWM
	LDR	R1,=0x000A8005
	STR	R1,[R0]
	LDR	R0,=0xE002C004	@PINSEL1 P0.25=AOUT
	LDR	R1,=0x00080000
	STR	R1,[R0]
	LDR	R0,=0xE002C014	@PINSEL2 izklop JTAG&TRACE
	LDR	R1,[R0]
	BIC	R1,R1,#0x0C
	STR	R1,[R0]
	LDR	R0,=0xE0028000	@IO0PIN vsi 1
	MOV	R1,#-1
	STR	R1,[R0]
	LDR	R0,=0xE0028010	@IO1PIN vsi 0
	MOV	R1,#0
	STR	R1,[R0]
	LDR	R0,=0xE0028008	@IO0DIR izhodi 0.0-0.31
	LDR	R1,=0xFFFFFFFF
	STR	R1,[R0]
	LDR	R0,=0xE0028018	@IO1DIR izhodi 1.20-1.31
	LDR	R1,=0xFFF00000
	STR	R1,[R0]
	MOV	PC,LR
.ltorg

@*** Izracunaj korak motorja (8bit) *** (R0-4)
KORAK:	LDR	R1,=STEVEC
	LDR	R0,[R1]
	AND	R1,R0,#0xFF	@PWMMR4 sinus
	LDR	R2,=K1SIN
	LDRSB	R3,[R2,R1]
	LDR	R2,=K3SIN
	LDRSB	R4,[R2,R1]
	LDR	R2,=PWMA
	MUL	R1,R2,R3
	LDR	R2,=PWMH
	MUL	R3,R2,R4
	LDR	R2,=PWMS
	ADD	R1,R2,R1,ASR#7
	ADD	R1,R1,R3,ASR#7
	LDR	R2,=0xE0014040
	STR	R1,[R2]
	AND	R1,R0,#0xFF	@PWMMR6 kosinus
	LDR	R2,=K1COS
	LDRSB	R3,[R2,R1]
	LDR	R2,=K3COS
	LDRSB	R4,[R2,R1]
	LDR	R2,=PWMA
	MUL	R1,R2,R3
	LDR	R2,=PWMH
	MUL	R3,R2,R4
	LDR	R2,=PWMS
	ADD	R1,R2,R1,ASR#7
	ADD	R1,R1,R3,ASR#7
	LDR	R2,=0xE0014048
	STR	R1,[R2]
	LDR	R2,=0xE0014050	@PWMLER enable all latches
	MOV	R1,#0x7F
	STR	R1,[R2]
	MOV	PC,LR
.ltorg
K1SIN:
.byte	0,3,6,9,12,16,19,22,25,28,31,34,37,40,43,46			@tabela sinusa
.byte	49,51,54,57,60,63,65,68,71,73,76,78,81,83,85,88
.byte	90,92,94,96,98,100,102,104,106,107,109,111,112,113,115,116
.byte	117,118,120,121,122,122,123,124,125,125,126,126,126,127,127,127
K1COS:
.byte	127,127,127,127,126,126,126,125,125,124,123,122,122,121,120,118
.byte	117,116,115,113,112,111,109,107,106,104,102,100,98,96,94,92
.byte	90,88,85,83,81,78,76,73,71,68,65,63,60,57,54,51
.byte	49,46,43,40,37,34,31,28,25,22,19,16,12,9,6,3
.byte	0,-3,-6,-9,-12,-16,-19,-22,-25,-28,-31,-34,-37,-40,-43,-46
.byte	-49,-51,-54,-57,-60,-63,-65,-68,-71,-73,-76,-78,-81,-83,-85,-88
.byte	-90,-92,-94,-96,-98,-100,-102,-104,-106,-107,-109,-111,-112,-113,-115,-116
.byte	-117,-118,-120,-121,-122,-122,-123,-124,-125,-125,-126,-126,-126,-127,-127,-127
.byte	-127,-127,-127,-127,-126,-126,-126,-125,-125,-124,-123,-122,-122,-121,-120,-118
.byte	-117,-116,-115,-113,-112,-111,-109,-107,-106,-104,-102,-100,-98,-96,-94,-92
.byte	-90,-88,-85,-83,-81,-78,-76,-73,-71,-68,-65,-63,-60,-57,-54,-51
.byte	-49,-46,-43,-40,-37,-34,-31,-28,-25,-22,-19,-16,-12,-9,-6,-3
.byte	0,3,6,9,12,16,19,22,25,28,31,34,37,40,43,46
.byte	49,51,54,57,60,63,65,68,71,73,76,78,81,83,85,88
.byte	90,92,94,96,98,100,102,104,106,107,109,111,112,113,115,116
.byte	117,118,120,121,122,122,123,124,125,125,126,126,126,127,127,127
K3SIN:
.byte	0,9,19,28,37,46,54,63,71,78,85,92,98,104,109,113		@tabela 3.harmonika
.byte	117,121,123,125,126,127,127,126,125,122,120,116,112,107,102,96
.byte	90,83,76,68,60,51,43,34,25,16,6,-3,-12,-22,-31,-40
.byte	-49,-57,-65,-73,-81,-88,-94,-100,-106,-111,-115,-118,-122,-124,-126,-127
K3COS:
.byte	-127,-127,-126,-124,-122,-118,-115,-111,-106,-100,-94,-88,-81,-73,-65,-57
.byte	-49,-40,-31,-22,-12,-3,6,16,25,34,43,51,60,68,76,83
.byte	90,96,102,107,112,116,120,122,125,126,127,127,126,125,123,121
.byte	117,113,109,104,98,92,85,78,71,63,54,46,37,28,19,9
.byte	0,-9,-19,-28,-37,-46,-54,-63,-71,-78,-85,-92,-98,-104,-109,-113
.byte	-117,-121,-123,-125,-126,-127,-127,-126,-125,-122,-120,-116,-112,-107,-102,-96
.byte	-90,-83,-76,-68,-60,-51,-43,-34,-25,-16,-6,3,12,22,31,40
.byte	49,57,65,73,81,88,94,100,106,111,115,118,122,124,126,127
.byte	127,127,126,124,122,118,115,111,106,100,94,88,81,73,65,57
.byte	49,40,31,22,12,3,-6,-16,-25,-34,-43,-51,-60,-68,-76,-83
.byte	-90,-96,-102,-107,-112,-116,-120,-122,-125,-126,-127,-127,-126,-125,-123,-121
.byte	-117,-113,-109,-104,-98,-92,-85,-78,-71,-63,-54,-46,-37,-28,-19,-9
.byte	0,9,19,28,37,46,54,63,71,78,85,92,98,104,109,113
.byte	117,121,123,125,126,127,127,126,125,122,120,116,112,107,102,96
.byte	90,83,76,68,60,51,43,34,25,16,6,-3,-12,-22,-31,-40
.byte	-49,-57,-65,-73,-81,-88,-94,-100,-106,-111,-115,-118,-122,-124,-126,-127
.align

@*** Inicializiraj PWM2,4,6 *** (R0-1)
PWM:	STR	LR,[SP,#-4]!	@resi link
	LDR	R0,=0xE0014014	@PWMMCR Reset PWMMR0
	LDR	R1,=0x00000002
	STR	R1,[R0]
	LDR	R0,=0xE001404C	@PWMPCR double edge & enable PWM2,4,6
	LDR	R1,=0x00005454
	STR	R1,[R0]
	LDR	R0,=0xE0014018	@PWMMR0
	LDR	R1,=PWMP
	STR	R1,[R0]
	LDR	R0,=0xE0014020	@PWMMR2 test pravokotnik 50/50
	LDR	R1,=PWMS
	STR	R1,[R0]
	BL	KORAK		@izracunaj korak motorja (8bit)
	LDR	R0,=0xE0014004	@PWMTCR PWM & Counter Enable
	MOV	R1,#0x09
	STR	R1,[R0]
	LDR	PC,[SP],#4	@povratek na link
.ltorg

@*** Inicializiraj UART0 *** (R0-1)
UART0:	LDR	R0,=0xE000C00C	@U0LCR=0x83 DLAB=1,no-parity,1stop,8bit
	MOV	R1,#0x83
	STRB	R1,[R0]
	LDR	R0,=0xE000C000	@U0DLL 
	LDR	R1,=BAUD
	STRB	R1,[R0]
	LDR	R0,=0xE000C004	@U0DLM
	MOV	R1,R1,LSR#8
	STRB	R1,[R0]
	LDR	R0,=0xE000C008	@U0FCR=0xC1 RXtrig=14bit,FIFOenable
	MOV	R1,#0xC1
	STRB	R1,[R0]
	LDR	R0,=0xE000C00C	@U0LCR=0x03 DLAB=0,no-parity,1stop,8bit
	MOV	R1,#0x03
	STRB	R1,[R0]
	MOV	PC,LR
.ltorg

@*** Inicializiraj HD44780 5X7,2vrstici,CGRAM *** (R0-3)
INILCD:	STR	LR,[SP,#-4]!	@resi link
	BL	T100MS		@zakasnitev 100ms
	MOV	R0,#0x38	@function set 
	BL	UKAZ
	BL	T5MS		@zakasnitev 5ms
	MOV	R0,#0x38	@function set
	BL	UKAZ
	MOV	R0,#0x38	@function set
	BL	UKAZ
	MOV	R0,#0x08	@display off
	BL	UKAZ
	MOV	R0,#0x01	@display clear
	BL	UKAZ
	BL	T5MS		@zakasnitev 5ms
	MOV	R0,#0x06	@entry mode set
	BL	UKAZ
	MOV	R0,#0x0C	@display on
	BL	UKAZ
	MOV	R0,#0x40	@set CGRAM address
	BL	UKAZ
	MOV	R2,#64		@prepisi 8 znake = 64 bajtov
	LDR	R3,=INILCD2
INILCD1:
	LDRB	R0,[R3],#1
	BL	ZNAK
	SUBS	R2,R2,#1
	BNE	INILCD1
	MOV	R0,#0x80	@set DDRAM address zacetek prve vrstice
	BL	UKAZ
	LDR	PC,[SP],#4	@povratek na link
.ltorg
INILCD2:
.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04	@0=praznina
.byte	0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x04	@1=crtica levo
.byte	0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x04	@2=crtica na sredini
.byte	0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x04	@3=crtica desno
.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F	@0=praznina podcrtana
.byte	0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x1F	@1=crtica levo podcrtana
.byte	0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x1F	@2=crtica na sredini podcrtana
.byte	0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x1F	@3=crtica desno podcrtana
.align

@*** Podcrtana crtica v drugi vrstici iz R3 *** (R0-3)
CRTA:	STR	LR,[SP,#-4]!	@resi link
	MOV	R0,#0xC0	@set DDRAM address druga vrstica
	BL	UKAZ
	MOV	R2,#0
CRTA1:	MOV	R0,#0		@praznina za velike korake po 16
	MOVS	R1,R3,ASR#4
	BMI	CRTA2
	CMP	R1,#3
	ADDCC	R0,R1,#1
CRTA2:	AND	R1,R3,#15	@podcrtaj pripadajoci znak za male korake po 1
	CMP	R1,R2
	ADDEQ	R0,R0,#4
	BL	ZNAK		@izpisi crtice
	SUB	R3,R3,#48	@odstej 3 crtice
	ADD	R2,R2,#1	@zanka 16 znakov
	CMP	R2,#16
	BMI	CRTA1
	LDR	PC,[SP],#4	@povratek na link
.ltorg

@*** Znak iz R0 v HD44780 *** (R0-1)
ZNAK:	STR	LR,[SP,#-4]!	@resi link
	MOV	R0,R0,LSL#24	@premakni byte na 16-23
	MOV	R0,R0,LSR#8
	LDR	R1,=0xE0028004	@IO0SET
	STR	R0,[R1]
	LDR	R1,=0x00FF0000	@obrni 16-23
	EOR	R0,R0,R1
	LDR	R1,=0xE002800C	@IO0CLR
	STR	R0,[R1]
	LDR	R1,=0xE0028014	@IO1SET
	MOV	R0,#0x00200000	@RS=1
	STR	R0,[R1]
	BL	T1US		@zakasnitev 1us
	LDR	R1,=0xE0028014	@IO1SET
	MOV	R0,#0x40000000	@vklopi E
	STR	R0,[R1]
	BL	T1US		@zakasnitev 1us
	LDR	R1,=0xE002801C	@IO1CLR
	MOV	R0,#0x40000000	@izklopi E
	STR	R0,[R1]
	BL	T50US		@zakasnitev 50us
	LDR	PC,[SP],#4	@povratek na link
.ltorg

@*** Ukaz iz R0 v HD44780 *** (R0-1)
UKAZ:	STR	LR,[SP,#-4]!	@resi link
	MOV	R0,R0,LSL#24	@premakni byte na 16-23
	MOV	R0,R0,LSR#8
	LDR	R1,=0xE0028004	@IO0SET
	STR	R0,[R1]
	LDR	R1,=0x00FF0000	@obrni 16-23
	EOR	R0,R0,R1
	LDR	R1,=0xE002800C	@IO0CLR
	STR	R0,[R1]
	LDR	R1,=0xE002801C	@IO1CLR
	MOV	R0,#0x00200000	@RS=0
	STR	R0,[R1]
	BL	T1US		@zakasnitev 1us
	LDR	R1,=0xE0028014	@IO1SET
	MOV	R0,#0x40000000	@vklopi E
	STR	R0,[R1]
	BL	T1US		@zakasnitev 1us
	LDR	R1,=0xE002801C	@IO1CLR
	MOV	R0,#0x40000000	@izklopi E
	STR	R0,[R1]
	BL	T50US		@zakasnitev 50us
	LDR	PC,[SP],#4	@povratek na link
.ltorg

@*** Zakasnitev 1us *** (R0)
.balign	16,0
T1US:	MOV	R0,#N1US
T1US1:	SUBS	R0,R0,#1
	BPL	T1US1
	MOV	PC,LR

@*** Zakasnitev 50us *** (R0-1)
T50US:	STR	LR,[SP,#-4]!	@resi link
	MOV	R1,#50
T50US1:	BL	T1US
	SUBS	R1,R1,#1
	BPL	T50US1
	LDR	PC,[SP],#4	@povratek na link

@*** Zakasnitev 1ms *** (R0-2)
T1MS:	STR	LR,[SP,#-4]!	@resi link
	MOV	R2,#20
T1MS1:	BL	T50US
	SUBS	R2,R2,#1
	BPL	T1MS1
	LDR	PC,[SP],#4	@povratek na link

@*** Zakasnitev 5ms *** (R0-2)
T5MS:	STR	LR,[SP,#-4]!	@resi link
	MOV	R2,#100
T5MS1:	BL	T50US
	SUBS	R2,R2,#1
	BPL	T5MS1
	LDR	PC,[SP],#4	@povratek na link

@*** Zakasnitev 100ms *** (R0-3)
T100MS:	STR	LR,[SP,#-4]!	@resi link
	MOV	R3,#20
T100MS1:
	BL	T5MS
	SUBS	R3,R3,#1
	BPL	T100MS1
	LDR	PC,[SP],#4	@povratek na link

@*** Zakasnitev 1s *** (R0-3)
T1S:	STR	LR,[SP,#-4]!	@resi link
	MOV	R3,#200
T1S1:	BL	T5MS
	SUBS	R3,R3,#1
	BPL	T1S1
	LDR	PC,[SP],#4	@povratek na link

@*** Inicializiraj nastavitve *** (R0-1)
INIPAR:	LDR	R0,=STEVEC	@zacetni stevec glavne zanke
	MOV	R1,#0	
	STR	R1,[R0]
	LDR	R0,=SMER	@zacetna smer vrtenja
	MOV	R1,#0
	STR	R1,[R0]
	LDR	R0,=SKOT	@zacetna stari kot UART0
	MOV	R1,#-1
	STR	R1,[R0]
	LDR	R0,=HITRO	@zacetna hitrost vrtenja
	MOV	R1,#ZHITRO
	STR	R1,[R0]
	LDR	R0,=RAZPON	@zacetni razpon vrtenja
	MOV	R1,#0
	STR	R1,[R0]
	LDR	R0,=STIPKE	@zacetna vrednost starih tipk
	MOV	R1,#-1
	STR	R1,[R0]
	MOV	PC,LR
.ltorg

@*** Izrisi STEVEC v premikajoco palcko *** (R0-3)
PALCKA:	STR	LR,[SP,#-4]!	@resi link
	LDR	R0,=STEVEC
	LDR	R1,[R0]
	LDR	R0,=NCRTA
	MUL	R3,R0,R1
	MOV	R3,R3,LSR#16
	BL	CRTA		@podcrtana crtica v drugi vrstici iz R3
	LDR	PC,[SP],#4	@povratek na link
.ltorg

@*** Preracunaj STEVEC v desetinke stopinj *** (R0-3)
DSTOP:	LDR	R0,=STEVEC
	LDR	R1,[R0]
	LDR	R0,=NKOT
	MUL	R3,R0,R1
	MOV	R3,R3,LSR#16
	LDR	R0,=KOT
	STR	R3,[R0]
	MOV	PC,LR
.ltorg

@*** Pretvorba KOT v desetisko obliko *** (R0-3)
BCDKOT:	STR	LR,[SP,#-4]!	@resi link
	LDR	R0,=KOT
	LDR	R3,[R0]
	MOV	R0,#10		@desetinke
	BL	NDELI
	LDR	R1,=DECI
	STR	R0,[R1]
	MOV	R0,#10		@enice
	BL	NDELI
	LDR	R1,=ENICE
	STR	R0,[R1]
	MOV	R0,#10		@desetice
	BL	NDELI
	LDR	R1,=DEKA
	STR	R0,[R1]
	LDR	R1,=HEKTO	@stotice
	STR	R3,[R1]
	LDR	PC,[SP],#4	@povratek na link
.ltorg

@*** Nepredznaceno deljenje R3/R0=R3, ostanek v R0 *** (R0-3)
NDELI:	MOVS	R1,R0		@prepreci deljenje z 0?
	MOVEQ	PC,LR
	MOV	R2,#1
	BMI	NDELI2
NDELI1:	MOV	R2,R2,LSL#1	@enica delitelja v MSB
	MOVS	R1,R1,LSL#1
	BPL	NDELI1
NDELI2:	MOV	R0,R3		@ostanek v R0
	MOV	R3,#0		@kvocient v R3
NDELI3:	CMP	R0,R1
	SUBCS	R0,R0,R1
	ADDCS	R3,R3,R2
	MOV	R1,R1,LSR#1
	MOVS	R2,R2,LSR#1
	BNE	NDELI3
	MOV	PC,LR

@*** Izpis parametrov na LCD *** (R0-5)
IZPLCD:	STR	LR,[SP,#-4]!	@resi link
	MOV	R0,#0x80	@polozaj v prvi vrstici LCD
	BL	UKAZ
	LDR	R1,=HEKTO	@stotice kota
	LDR	R0,[R1]
	ADD	R0,R0,#'0'
	BL	ZNAK
	LDR	R1,=DEKA	@desetice kota
	LDR	R0,[R1]
	ADD	R0,R0,#'0'
	BL	ZNAK
	LDR	R1,=ENICE	@enice kota
	LDR	R0,[R1]
	ADD	R0,R0,#'0'
	BL	ZNAK
	MOV	R0,#'.'		@pika
	BL	ZNAK
	LDR	R1,=DECI	@desetinke kota
	LDR	R0,[R1]
	ADD	R0,R0,#'0'
	BL	ZNAK
	MOV	R0,#223		@znak za stopinje
	BL	ZNAK
	MOV	R0,#' '
	BL	ZNAK
	MOV	R0,#' '
	BL	ZNAK
	MOV	R0,#' '
	BL	ZNAK
	LDR	R0,=SMER	@izpisi smer vrtenja
	LDR	R1,[R0]
	MOVS	R1,R1
	MOV	R0,#'D'	
	MOVEQ	R0,#'M'
	MOVMI	R0,#'L'
	BL	ZNAK
	LDR	R0,=HITRO	@izpisi hitrost vrtenja
	LDR	R1,[R0]
	ADD	R0,R1,#'0'
	BL	ZNAK
	MOV	R0,#'/'
	BL	ZNAK
	LDR	R0,=RAZPON	@izpisi razpon vrtenja
	LDR	R1,[R0]
	LDR	R0,=360
	MOV	R3,R0,LSR R1
	MOV	R0,#10
	BL	NDELI
	MOV	R5,R0
	MOV	R0,#10
	BL	NDELI
	MOV	R4,R0
	ADD	R0,R3,#'0'
	BL	ZNAK
	ADD	R0,R4,#'0'
	BL	ZNAK
	ADD	R0,R5,#'0'
	BL	ZNAK
	MOV	R0,#223		@znak za stopinje
	BL	ZNAK
	LDR	PC,[SP],#4	@povratek na link
.ltorg

@*** Desetiski rezultat na UART0 (samo novo) *** (R0-2, UART0 TX FIFO)
IZPUART:
	LDR	R0,=KOT		@primerjaj novo/staro
	LDR	R1,[R0]
	LDR	R0,=SKOT
	LDR	R2,[R0]
	STR	R1,[R0]		@novo v staro
	CMP	R1,R2
	LDR	R2,=SMETI	@nepotrebno v smeti, ampak isti cas izvajanja!
	LDRNE	R2,=0xE000C000	@U0THR
	LDR	R1,=HEKTO	@stotice
	LDR	R0,[R1]
	ADD	R0,R0,#'0'
	STRB	R0,[R2]
	LDR	R1,=DEKA	@desetice
	LDR	R0,[R1]
	ADD	R0,R0,#'0'
	STRB	R0,[R2]
	LDR	R1,=ENICE	@enice
	LDR	R0,[R1]
	ADD	R0,R0,#'0'
	STRB	R0,[R2]
	MOV	R0,#'.'		@pika
	STRB	R0,[R2]
	LDR	R1,=DECI	@desetinke
	LDR	R0,[R1]
	ADD	R0,R0,#'0'
	STRB	R0,[R2]
	MOV	R0,#13		@CR nova vrstica na UART0
	STRB	R0,[R2]
	MOV	R0,#10		@LF
	STRB	R0,[R2]
	MOV	PC,LR
.ltorg

@*** Izracunaj izhodno analogno napetost *** (R0-3)
UDAC:	LDR	R0,=STEVEC
	LDR	R1,[R0]
	LDR	R0,=NDAC
	MUL	R3,R0,R1
	LDR	R0,=RAZPON	@pomnozi z razponom
	LDR	R1,[R0]
	RSB	R0,R1,#16
	MOV	R3,R3,LSR R0
	LDR	R0,=0x03FF	@preveri izhodno napetost
	CMP	R3,R0
	MOVCS	R3,R0
	MOV	R3,R3,LSL#6
	LDR	R0,=0xE006C000	@DACR napetost iz stevca, visok tok
	STR	R3,[R0]
	MOV	PC,LR
.ltorg

@*** Vrti STEVEC desno/stoj/levo *** (R0-4)
VRTI:	LDR	R0,=STEVEC	@preberi stevec zanke in smer vrtenja
	LDR	R1,[R0]
	LDR	R2,=SMER
	LDR	R3,[R2]
	ADDS	R1,R1,R3	@povecaj/zmanjsaj stevec
	MOVMI	R3,#0		@spodnja meja stevca?
	MOVMI	R1,#0
	LDR	R4,=RAZPON	@gornja meja stevca?
	LDR	R5,[R4]
	LDR	R4,=NCIKEL
	CMP	R1,R4,LSR R5
	MOVCS	R3,#0
	MOVCS	R1,R4,LSR R5
	STR	R1,[R0]		@shrani stevec zanke in smer vrtenja
	STR	R3,[R2]
	MOV	PC,LR
.ltorg

@*** Cakanje (HITRO) in tipke *** (R0-3)
CAKAJ:	STR	LR,[SP,#-4]!	@resi link
	LDR	R0,=HITRO
	LDR	R1,[R0]
	EOR	R1,R1,#7
	MOV	R2,R1
	MUL	R3,R2,R1
CAKAJ1:	BL	TIPKE		@ukaz s tipk
	SUBS	R3,R3,#1
	LDRMI	PC,[SP],#4	@povratek na link
	BL	T1MS		@cakanje 1ms
	B	CAKAJ1
.ltorg

@*** Ukaz s tipk *** (R0-2)
TIPKE:	LDR	R0,=0x3FFFC036	@FIO1PIN2 branje tipk
	LDRB	R1,[R0]
	AND	R1,R1,#15
	LDR	R0,=STIPKE	@preveri stare tipke?
	LDR	R2,[R0]
	STR	R1,[R0]
	LDR	R0,=NTIPKE
	CMP	R1,R2
	MOVNE	R2,#0		@resetiraj stevec enakih tipk
	STRNE	R2,[R0]
	MOVNE	PC,LR
	LDR	R2,[R0]		@povecaj stevec enakih tipk
	ADD	R2,R2,#1
	STR	R2,[R0]
	CMP	R2,#ETIPKE	@pravilno stevilo enakih?
	MOVNE	PC,LR
	LDR	R2,=SMER	@ukazi za smer vrtenja (enaki UART0)
	LDR	R0,[R2]
	CMP	R1,#13		@/P1.17 = Stoj?
	MOVEQ	R0,#0
	CMP	R1,#11		@/P1.18 = Desno?
	MOVEQ	R0,#1
	CMP	R1,#7		@/P1.19 = Levo?
	MOVEQ	R0,#-1
	STR	R0,[R2]
	LDR	R2,=HITRO	@ukazi za hitrost
	LDR	R0,[R2]
	CMP	R1,#9		@/P1.17+/P0.18 = Hitro?
	ADDEQ	R0,R0,#1
	CMP	R1,#5		@/P1.17+/P0.19 = Pocasi?
	SUBEQ	R0,R0,#1
	MOVS	R0,R0		@preveri hitrost
	MOVMI	R0,#0
	CMP	R0,#7
	MOVCS	R0,#7
	STR	R0,[R2]
	LDR	R2,=RAZPON	@ukaz za razpon
	LDR	R0,[R2]
	CMP	R1,#1		@vse tri tipke hkrati?
	ADDEQ	R0,R0,#1
	AND	R0,R0,#3	@preveri razpon
	STR	R0,[R2]
	MOV	PC,LR
.ltorg

@*** Ukaz z UART0 *** (R0-3)
RXUART:	LDR	R0,=0xE000C014	@U0LSR ali je kaj prislo v sprejemnik?
	LDRB	R1,[R0]
	TST	R1,#0x01
	MOVEQ	PC,LR
	LDR	R0,=0xE000C000	@U0RBR precitamo sprejeti bajt
	LDRB	R1,[R0]
	AND	R1,R1,#0x7F	@brisemo pariteto za vsak slucaj
	CMP	R1,#0x60	@male crke v velike?
	SUBCS	R1,R1,#0x20
	LDR	R2,=SMER	@ukazi za smer vrtenja (enaki tipkam)
	LDR	R0,[R2]
	CMP	R1,#'S'		@ukaz s ali S = Stoj?
	MOVEQ	R0,#0
	CMP	R1,#'D'		@ukaz d ali D = Desno?
	MOVEQ	R0,#1
	CMP	R1,#'L'		@ukaz l ali L = Levo?
	MOVEQ	R0,#-1
	STR	R0,[R2]
	LDR	R2,=HITRO	@ukazi za hitrost vrtenja '0'-'7'
	LDR	R0,[R2]
	AND	R3,R1,#0xF8
	CMP	R3,#0x30
	ANDEQ	R0,R1,#7
	STR	R0,[R2]
	LDR	R2,=RAZPON	@ukazi za razpon vrtenja '@'-'C'
	LDR	R0,[R2]
	AND	R3,R1,#0xFC
	CMP	R3,#0x40
	ANDEQ	R0,R1,#3
	STR	R0,[R2]
	LDR	R0,=SKOT	@oddaj kot z razveljavljanjem starega
	MOV	R1,#-1
	STR	R1,[R0]
	MOV	PC,LR
.ltorg

@*** Zacetek programa po resetu ***
ZACNI:	LDR	SP,=SKLAD	@inicializiraj SP
	BL	INIPAR	@inicializiraj nastavitve
	BL	MAM	@inicializiraj MAM
	BL	PWRCLK	@nastavi PCONP in APBDIV
	BL	PLL	@inicializiraj PLL
	BL	GPIO	@inicializiraj GPIO in DAC
	BL	PWM	@inicializiraj PWM2,4,6
	BL	UART0	@inicializiraj UART0
	BL	INILCD	@inicializiraj HD44780 5X7,2vrstici,CGRAM
	MOV	R0,#0x80	@prva vrstica besedila
	BL	UKAZ
	LDR	R2,=ZACNI5
ZACNI1:	LDRB	R0,[R2],#1
	MOVS	R0,R0
	BEQ	ZACNI2
	BL	ZNAK
	B	ZACNI1
ZACNI2:	MOV	R0,#0xC0	@druga vrstica besedila
	BL	UKAZ
	LDR	R2,=ZACNI6
ZACNI3:	LDRB	R0,[R2],#1
	MOVS	R0,R0
	BEQ	ZACNI4
	BL	ZNAK
	B	ZACNI3
ZACNI4:	BL	T1S	@zakasnitev 1s
	B	ZANKA	@glavna zanka programa
.ltorg
ZACNI5:	.asciz	"Koracni vrtiljak"
ZACNI6:	.asciz	"S53MV 27.09.2017"
.align

@*** Glavna zanka programa ***
ZANKA:	BL	KORAK	@izracunaj korak motorja (8bit)
	BL	PALCKA	@izrisi STEVEC v premikajoco palcko
	BL	UDAC	@izracunaj izhodno analogno napetost
	BL	DSTOP	@preracunaj STEVEC v desetinke stopinj
	BL	BCDKOT	@pretvorba KOT v desetisko obliko
	BL	IZPUART	@desetiski rezultat na UART0 (samo novo)
	BL	IZPLCD	@izpis parametrov na LCD
	BL	VRTI	@vrti STEVEC desno/stoj/levo
	BL	CAKAJ	@cakanje (HITRO) in ukaz s tipk
	BL	RXUART	@ukaz z UART0
	B	ZANKA
.ltorg

@*** Konec delovanja zbirnika GNU ***
.end

