;*** PWM krmiljenje koracnika - S53MV 04.09.2016 ***

;*** Konstante mikrokrmilnika LPC2138/01 ***
KVARC	EQU	14745600	;frekvenca kristala (Hz)
CLK	EQU	KVARC*4		;frekvenca jedra ARM (PLL)
PCLK	EQU	CLK/2		;frekvenca vhodno/izhodnih enot (APBDIV)
BAUD	EQU	PCLK/153600	;modulo deljenja UART za 9600bps*16
N1US	EQU	CLK/3000000	;konstanta cakanja T1US za HD44780
ETIPKE	EQU	4		;stevilo enakih tipk za veljaven ukaz

;*** Konstante stirifaznega koracnega motorja ***
PWMA	EQU	480		;PWM amplituda osnovne
PWMH	EQU	96		;PWM amplituda 3.harmonika
PWMS	EQU	720		;PWM sredina
PWMP	EQU	1439		;PWM perioda 1440-1 (20.48kHz)
NCIKEL	EQU	50*256		;stevilo ciklov za polni krog *256
NKOT	EQU	(3600*65536)/NCIKEL
NCRTA	EQU	(768*65536)/NCIKEL
NDAC	EQU	(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 ***
SKLAD	EQU	0x40000100	;sklad raste navzdol -256byte

KOT	EQU	0x40000400	;kot v stopinjah na eno decimalko (32bit)
DECI	EQU	0x40000404	;desetinke (32bit)
ENICE	EQU	0x40000408	;enice (32bit)
DEKA	EQU	0x4000040C	;desetice (32bit)
HEKTO	EQU	0x40000410	;stotice (32bit)
SKOT	EQU	0x40000414	;stari kot (32bit)
SMETI	EQU	0x40000418	;smeti (32bit)
STEVEC	EQU	0x4000041C	;stevec glavne zanke (32bit)
SMER	EQU	0x40000420	;smer vrtenja +1,0,-1 (32bit)
HITRO	EQU	0x40000424	;hitrost vrtenja (32bit)
RAZPON	EQU	0x40000428	;razpon vrtenja (32bit)
STIPKE	EQU	0x4000042C	;stara vrednost tipk (32bit)
NTIPKE	EQU	0x40000430	;stevec enakih tipk (32bit)

;*** Ukazi za delovanje zbirnika ARM ***
	AREA	RESET, CODE, READONLY, ALIGN=9
	ENTRY
	CODE32

;*** 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 ***
	ALIGN	512

;*** 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=2
	MOV	R1,#2
	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,=0xE01FC1A0	;SCS=0x03 high-speed GPIO 0&1
	MOV	R1,#0x03
	STR	R1,[R0]
	LDR	R0,=0x3FFFC014	;FIO0PIN vsi 1
	MOV	R1,#-1
	STR	R1,[R0]
	LDR	R0,=0x3FFFC034	;FIO1PIN vsi 0
	MOV	R1,#0
	STR	R1,[R0]
	LDR	R0,=0x3FFFC000	;FIO0DIR izhodi 0.0-0.31
	LDR	R1,=0xFFFFFFFF
	STR	R1,[R0]
	LDR	R0,=0x3FFFC020	;FIO1DIR izhodi 1.20-1.31
	LDR	R1,=0xFFF00000
	STR	R1,[R0]
	MOV	PC,LR
	LTORG

;*** Izracunaj korak motorja iz R0 (8bit) *** (R0-4)
KORAK	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	DCB	0,3,6,9,12,16,19,22,25,28,31,34,37,40,43,46			;tabela sinusa
	DCB	49,51,54,57,60,63,65,68,71,73,76,78,81,83,85,88
	DCB	90,92,94,96,98,100,102,104,106,107,109,111,112,113,115,116
	DCB	117,118,120,121,122,122,123,124,125,125,126,126,126,127,127,127
K1COS	DCB	127,127,127,127,126,126,126,125,125,124,123,122,122,121,120,118
	DCB	117,116,115,113,112,111,109,107,106,104,102,100,98,96,94,92
	DCB	90,88,85,83,81,78,76,73,71,68,65,63,60,57,54,51
	DCB	49,46,43,40,37,34,31,28,25,22,19,16,12,9,6,3
	DCB	0,-3,-6,-9,-12,-16,-19,-22,-25,-28,-31,-34,-37,-40,-43,-46
	DCB	-49,-51,-54,-57,-60,-63,-65,-68,-71,-73,-76,-78,-81,-83,-85,-88
	DCB	-90,-92,-94,-96,-98,-100,-102,-104,-106,-107,-109,-111,-112,-113,-115,-116
	DCB	-117,-118,-120,-121,-122,-122,-123,-124,-125,-125,-126,-126,-126,-127,-127,-127
	DCB	-127,-127,-127,-127,-126,-126,-126,-125,-125,-124,-123,-122,-122,-121,-120,-118
	DCB	-117,-116,-115,-113,-112,-111,-109,-107,-106,-104,-102,-100,-98,-96,-94,-92
	DCB	-90,-88,-85,-83,-81,-78,-76,-73,-71,-68,-65,-63,-60,-57,-54,-51
	DCB	-49,-46,-43,-40,-37,-34,-31,-28,-25,-22,-19,-16,-12,-9,-6,-3
	DCB	0,3,6,9,12,16,19,22,25,28,31,34,37,40,43,46
	DCB	49,51,54,57,60,63,65,68,71,73,76,78,81,83,85,88
	DCB	90,92,94,96,98,100,102,104,106,107,109,111,112,113,115,116
	DCB	117,118,120,121,122,122,123,124,125,125,126,126,126,127,127,127
K3SIN	DCB	0,9,19,28,37,46,54,63,71,78,85,92,98,104,109,113		;tabela 3.harmonika
	DCB	117,121,123,125,126,127,127,126,125,122,120,116,112,107,102,96
	DCB	90,83,76,68,60,51,43,34,25,16,6,-3,-12,-22,-31,-40
	DCB	-49,-57,-65,-73,-81,-88,-94,-100,-106,-111,-115,-118,-122,-124,-126,-127
K3COS	DCB	-127,-127,-126,-124,-122,-118,-115,-111,-106,-100,-94,-88,-81,-73,-65,-57
	DCB	-49,-40,-31,-22,-12,-3,6,16,25,34,43,51,60,68,76,83
	DCB	90,96,102,107,112,116,120,122,125,126,127,127,126,125,123,121
	DCB	117,113,109,104,98,92,85,78,71,63,54,46,37,28,19,9
	DCB	0,-9,-19,-28,-37,-46,-54,-63,-71,-78,-85,-92,-98,-104,-109,-113
	DCB	-117,-121,-123,-125,-126,-127,-127,-126,-125,-122,-120,-116,-112,-107,-102,-96
	DCB	-90,-83,-76,-68,-60,-51,-43,-34,-25,-16,-6,3,12,22,31,40
	DCB	49,57,65,73,81,88,94,100,106,111,115,118,122,124,126,127
	DCB	127,127,126,124,122,118,115,111,106,100,94,88,81,73,65,57
	DCB	49,40,31,22,12,3,-6,-16,-25,-34,-43,-51,-60,-68,-76,-83
	DCB	-90,-96,-102,-107,-112,-116,-120,-122,-125,-126,-127,-127,-126,-125,-123,-121
	DCB	-117,-113,-109,-104,-98,-92,-85,-78,-71,-63,-54,-46,-37,-28,-19,-9
	DCB	0,9,19,28,37,46,54,63,71,78,85,92,98,104,109,113
	DCB	117,121,123,125,126,127,127,126,125,122,120,116,112,107,102,96
	DCB	90,83,76,68,60,51,43,34,25,16,6,-3,-12,-22,-31,-40
	DCB	-49,-57,-65,-73,-81,-88,-94,-100,-106,-111,-115,-118,-122,-124,-126,-127
	ALIGN	4

;*** 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]
	LDR	R0,=STEVEC	;krmiljenje koracnega motorja PWMMR4, PWMMR6 in PWMLER
	LDR	R0,[R0]
	BL	KORAK		;izracunaj korak motorja iz R0 (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	DCB	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04	;0=praznina
	DCB	0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x04	;1=crtica levo
	DCB	0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x04	;2=crtica na sredini
	DCB	0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x04	;3=crtica desno
	DCB	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F	;0=praznina podcrtana
	DCB	0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x1F	;1=crtica levo podcrtana
	DCB	0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x1F	;2=crtica na sredini podcrtana
	DCB	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
	LDR	R1,=0x3FFFC016	;FIO0PIN2 podatek
	STRB	R0,[R1]
	LDR	R1,=0x3FFFC03A	;FIO1SET2
	MOV	R0,#0x20	;RS=1
	STRB	R0,[R1]
	BL	T1US		;zakasnitev 1us
	LDR	R1,=0x3FFFC03B	;FIO1SET3
	MOV	R0,#0x40	;vklopi E
	STRB	R0,[R1]
	BL	T1US		;zakasnitev 1us
	LDR	R1,=0x3FFFC03F	;FIO1CLR3
	MOV	R0,#0x40	;izklopi E
	STRB	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
	LDR	R1,=0x3FFFC016	;FIO0PIN2 podatek
	STRB	R0,[R1]
	LDR	R1,=0x3FFFC03E	;FIO1CLR2
	MOV	R0,#0x20	;RS=0
	STRB	R0,[R1]
	BL	T1US		;zakasnitev 1us
	LDR	R1,=0x3FFFC03B	;FIO1SET3
	MOV	R0,#0x40	;vklopi E
	STRB	R0,[R1]
	BL	T1US		;zakasnitev 1us
	LDR	R1,=0x3FFFC03F	;FIO1CLR3
	MOV	R0,#0x40	;izklopi E
	STRB	R0,[R1]
	BL	T50US		;zakasnitev 50us
	LDR	PC,[SP],#4	;povratek na link
	LTORG

;*** Zakasnitev 1us *** (R0)
	ALIGN	16
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 2ms *** (R0-2)
T2MS	STR	LR,[SP,#-4]!	;resi link
	MOV	R2,#40
T2MS1	BL	T50US
	SUBS	R2,R2,#1
	BPL	T2MS1
	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

;*** 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 stevila na LCD *** (R0-1)
IZPLCD	STR	LR,[SP,#-4]!	;resi link
	LDR	R1,=HEKTO	;stotice
	LDR	R0,[R1]
	ADD	R0,R0,#"0"
	BL	ZNAK
	LDR	R1,=DEKA	;desetice
	LDR	R0,[R1]
	ADD	R0,R0,#"0"
	BL	ZNAK
	LDR	R1,=ENICE	;enice
	LDR	R0,[R1]
	ADD	R0,R0,#"0"
	BL	ZNAK
	MOV	R0,#"."		;pika
	BL	ZNAK
	LDR	R1,=DECI	;desetinke
	LDR	R0,[R1]
	ADD	R0,R0,#"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

;*** 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

;*** Cakanje (HITRO) *** (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	SUBS	R3,R3,#1
	LDRMI	PC,[SP],#4	;povratek na link
	BL	T2MS		;cakanje 2ms
	B	CAKAJ1

;*** Zacetek programa po resetu ***
ZACNI	LDR	SP,=SKLAD	;inicializiraj SP
	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,#5
	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]
	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	DCB	"Koracni vrtiljak",0
ZACNI6	DCB	"S53MV 04.09.2016",0
	ALIGN	4

;*** Glavna zanka programa ***
ZANKA	LDR	R0,=STEVEC	;krmiljenje koracnega motorja PWMMR4, PWMMR6 in PWMLER	
	LDR	R0,[R0]
	BL	KORAK		;izracunaj korak motorja iz R0 (8bit)
	BL	TIPKE		;ukaz s tipk
	BL	RXUART		;ukaz z UART0
	LDR	R0,=STEVEC	;izrisi premikajoco crtico
	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	R0,=STEVEC	;izracunaj izhodno analogno napetost
	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]
	LDR	R0,=STEVEC	;preracunaj kot v stopinje (na eno decimalko)
	LDR	R1,[R0]
	LDR	R0,=NKOT
	MUL	R3,R0,R1
	MOV	R3,R3,LSR#16
	LDR	R0,=KOT
	STR	R3,[R0]
	BL	BCDKOT		;pretvorba KOT v desetisko obliko
	MOV	R0,#0x80	;polozaj v prvi vrstici LCD
	BL	UKAZ
	BL	IZPLCD		;izpis kota na LCD
	BL	IZPUART		;desetiski rezultat na UART0 (samo novo)
	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	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]
	BL	CAKAJ		;cakanje (HITRO)
	B	ZANKA
	LTORG

;*** Ukaz s tipk *** (R0-3)
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 števec 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

;*** Konec delovanja zbirnika ARM ***
	END
