;*** PWM krmiljenje koracnika - S53MV 28.08.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

;*** Konstante stirifaznega koracnega motorja ***
PWMA	EQU	480		;PWM amplituda osnovne
PWMH	EQU	80		;PWM amplituda 3. harmonika
PWMS	EQU	720		;PWM sredina
PWMP	EQU	2*PWMS-1	;PWM perioda 1440-1 (20.48kHz)
NCIKEL	EQU	50*256		;število ciklov za polni krog *256
NKOT	EQU	(3600*65536)/NCIKEL
NSTOLP	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 -
;P0.3.od/SDA0/MAT0.0/EINT1 -
;P0.4/SCK0/CAP0.1/AD0.6 -
;P0.5/MISO0/MAT0.1/AD0.7 -
;P0.6/MOSI0/CAP0.2/AD1.0 -
;P0.7/SSEL0/PWM2/EINT2 - izhod PWM test
;P0.8/TXD1/PWM4/AD1.1 - izhod PWM navitje 1
;P0.9/RXD1/PWM6/EINT3 - izhod PWM navitje 2
;P0.10/RTS1/CAP1.0/AD1.2 -
;P0.11.od/CTS1/CAP1.1/SCL1 -
;P0.12/DSR1/MAT1.0/AD1.3 -
;P0.13/DTR1/MAT1.1/AD1.4 -
;P0.14.od/DCD1/EINT1/SDA1/BOOTLOADER(!) - vhod vezan na /RTS.FT231XS 
;P0.15/RI1/EINT2/AD1.5 -
;P0.16-23 - digitalni izhodi za LCD D0-7.HD44780
;P0.24 - ne obstaja ***
;P0.25/AD0.4/AOUT -
;P0.26/AD0.5 -
;P0.27/AD0.0/CAP0.1/MAT0.1 -
;P0.28/AD0.1/CAP0.2/MAT0.2 -
;P0.29/AD0.2/CAP0.3/MAT0.3 -
;P0.30/AD0.3/EINT3/CAP0.0 -
;P0.31(!) - nepovezan ***
;P1.0-15 - ne obstajajo ***
;P1.16-19 - vhodi z vgrajenim PULL-UP za tipke 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 (8bit)
ENICE	EQU	0x40000405	;enice (8bit)
DEKA	EQU	0x40000406	;desetice (8bit)
HEKTO	EQU	0x40000407	;stotice (8bit)
STARI	EQU	0x40000408	;stari kot (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]
	LDR	R0,=0xE006C000	;DACR sredina skale, visok tok
	LDR	R1,=0x00008000
	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 osnovne
	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 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	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
	LDR	R1,=PWMS
	STR	R1,[R0]
	LDR	R0,=0xE0014040	;PWMMR4
	LDR	R1,=PWMS
	STR	R1,[R0]
	LDR	R0,=0xE0014048	;PWMMR6
	LDR	R1,=PWMS
	STR	R1,[R0]
	LDR	R0,=0xE0014050	;PWMLER enable all latches
	MOV	R1,#0x7F
	STR	R1,[R0]
	LDR	R0,=0xE0014004	;PWMTCR PWM & Counter Enable
	MOV	R1,#0x09
	STR	R1,[R0]
	MOV	PC,LR
	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	T4MS		;zakasnitev 4ms
	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	T4MS		;zakasnitev 4ms
	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=enacrtica
	DCB	0x14,0x14,0x14,0x14,0x14,0x14,0x00,0x04	;2=dvecrtici
	DCB	0x15,0x15,0x15,0x15,0x15,0x15,0x00,0x04	;3=tricrtice
	DCB	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F	;0=praznina podcrtana
	DCB	0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x1F	;1=enacrtica podcrtana
	DCB	0x14,0x14,0x14,0x14,0x14,0x14,0x00,0x1F	;2=dvecrtici podcrtana
	DCB	0x15,0x15,0x15,0x15,0x15,0x15,0x00,0x1F	;3=tricrtice podcrtana
	ALIGN

;*** Podcrtan stolpec v desno v drugi vrstici iz R3 *** (R0-3)
STOLP	STR	LR,[SP,#-4]!	;resi link
	MOV	R0,#0xC0	;set DDRAM address druga vrstica
	BL	UKAZ
	MOV	R2,#0
STOLP1	MOV	R0,#0		;praznina za velike korake po 16
	CMP	R3,#16		;ena crtica?
	MOVCS	R0,#1
	CMP	R3,#32		;dve crtici?
	MOVCS	R0,#2
	CMP	R3,#48		;tri crtice?
	MOVCS	R0,#3
	AND	R1,R3,#15	;podcrtaj pripadajoci znak za male korake po 1
	CMP	R1,R2
	ADDEQ	R0,R0,#4
	BL	ZNAK		;izpisi crtice
	SUBS	R3,R3,#48	;odstej 3 crtice, negativno ustavi?
	ANDMI	R3,R3,#15
	ADD	R2,R2,#1	;zanka 16 znakov
	CMP	R2,#16
	BMI	STOLP1
	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	T100US		;zakasnitev 100us
	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	T100US		;zakasnitev 100us
	LDR	PC,[SP],#4	;povratek na link

;*** Zakasnitev 1us *** (R0)
	ALIGN	16
T1US	MOV	R0,#N1US
T1US1	SUBS	R0,R0,#1
	BPL	T1US1
	MOV	PC,LR

;*** Zakasnitev 100us *** (R0-1)
T100US	STR	LR,[SP,#-4]!	;resi link
	MOV	R1,#100
T100US1	BL	T1US
	SUBS	R1,R1,#1
	BPL	T100US1
	LDR	PC,[SP],#4	;povratek na link

;*** Zakasnitev 4ms *** (R0-2)
T4MS	STR	LR,[SP,#-4]!	;resi link
	MOV	R2,#40
T4MS1	BL	T100US
	SUBS	R2,R2,#1
	BPL	T4MS1
	LDR	PC,[SP],#4	;povratek na link

;*** Zakasnitev 100ms *** (R0-3)
T100MS	STR	LR,[SP,#-4]!	;resi link
	MOV	R3,#25
T100MS1	BL	T4MS
	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,#250
T1S1	BL	T4MS
	SUBS	R3,R3,#1
	BPL	T1S1
	LDR	PC,[SP],#4	;povratek na link

;*** Zacetek programa po resetu ***
ZACNI	LDR	SP,=SKLAD	;inicializiraj SP
	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
	MOV	R8,#0		;zacetni stevec zanke
	B	ZANKA	;glavna zanka programa
	LTORG
ZACNI5	DCB	"Koracni vrtiljak",0
ZACNI6	DCB	"S53MV 28.08.2016",0
	ALIGN	4

;*** Glavna zanka programa ***
ZANKA	MOV	R0,R8		;preizkus koracnega motorja 8bit
	BL	KORAK		;izracunaj korak motorja iz R0 (8bit)
	LDR	R0,=NSTOLP	;izrisi rastoci stolpec
	MUL	R3,R0,R8
	MOV	R3,R3,LSR#16
	BL	STOLP		;podcrtan stolpec v desno v drugi vrstici iz R3
	LDR	R0,=NDAC	;izracunaj izhodno analogno napetost
	MUL	R3,R0,R8
	MOV	R3,R3,LSR#16
	MOV	R3,R3,LSL#6
	LDR	R0,=0xE006C000	;DACR napetost iz stevca, visok tok
	STR	R3,[R0]
	LDR	R0,=NKOT	;preracunaj kot v stopinje (na eno decimalko)
	MUL	R3,R0,R8
	MOV	R3,R3,LSR#16
	LDR	R0,=KOT
	STR	R3,[R0]
	BL	BCD		;pretvorba R3 v desetisko obliko
	BL	IZPLCD		;izpis kota na LCD
	LDR	R0,=KOT		;samo nova razlicna vrednost na UART?
	LDR	R1,[R0]
	LDR	R0,=STARI
	LDR	R2,[R0]
	STR	R1,[R0]	
	CMP	R1,R2
	BLNE	IZPUART		;desetiski rezultat na UART0
	ADD	R8,R8,#1	;povecaj in preveri stevec zanke
	LDR	R0,=NCIKEL
	CMP	R8,R0
	BCC	ZANKA
	MOV	R8,#0
	BL	T4MS		;cakanje 4ms
	B	ZANKA
	LTORG

;*** Pretvorba KOT v desetisko obliko *** (R0-3)
BCD	STR	LR,[SP,#-4]!	;resi link
	LDR	R0,=KOT
	LDR	R3,[R0]
	MOV	R0,#10		;desetinke
	BL	NDELI
	LDR	R1,=DECI
	STRB	R0,[R1]
	MOV	R0,#10		;enice
	BL	NDELI
	LDR	R1,=ENICE
	STRB	R0,[R1]
	MOV	R0,#10		;desetice
	BL	NDELI
	LDR	R1,=DEKA
	STRB	R0,[R1]
	LDR	R1,=HEKTO	;stotice
	STRB	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
	MOV	R0,#0x80	;polozaj v prvi vrstici LCD
	BL	UKAZ
	LDR	R1,=HEKTO	;stotice
	LDRB	R0,[R1]
	ADD	R0,R0,#"0"
	BL	ZNAK
	LDR	R1,=DEKA	;desetice
	LDRB	R0,[R1]
	ADD	R0,R0,#"0"
	BL	ZNAK
	LDR	R1,=ENICE	;enice
	LDRB	R0,[R1]
	ADD	R0,R0,#"0"
	BL	ZNAK
	MOV	R0,#"."		;pika
	BL	ZNAK
	LDR	R1,=DECI	;desetinke
	LDRB	R0,[R1]
	ADD	R0,R0,#"0"
	BL	ZNAK
	MOV	R0,#223		;znak za stopinje
	BL	ZNAK
	MOV	R0,#" "
	BL	ZNAK
	LDR	PC,[SP],#4	;povratek na link
	LTORG

;*** Desetiski rezultat na UART0 *** (R0-2, UART0 TX FIFO)
IZPUART	LDR	R2,=0xE000C000	;U0THR
	LDR	R1,=HEKTO	;stotice
	LDRB	R0,[R1]
	ADD	R0,R0,#"0"
	STRB	R0,[R2]
	LDR	R1,=DEKA	;desetice
	LDRB	R0,[R1]
	ADD	R0,R0,#"0"
	STRB	R0,[R2]
	LDR	R1,=ENICE	;enice
	LDRB	R0,[R1]
	ADD	R0,R0,#"0"
	STRB	R0,[R2]
	MOV	R0,#"."		;pika
	STRB	R0,[R2]
	LDR	R1,=DECI	;desetinke
	LDRB	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

;*** Konec delovanja zbirnika ARM ***
	END
