;*** Konstante mikrokrmilnika LPC2138/01 ***
;KVARC	EQU	19442715	;frekvenca TCXO od Matjaza (Hz)
KVARC	EQU	19439906	;frekvenca TCXO od Ane (Hz)
CLK	EQU	KVARC*3		;frekvenca jedra ARM (PLL)
PCLK	EQU	CLK		;frekvenca vhodno/izhodnih enot (APBDIV)
BAUD	EQU	PCLK/153600	;modulo deljenja UART za 9600bps*16
N1US	EQU	CLK/3000000	;konstanta cakanja T1US za HD44780
PWMMR0	EQU	CLK*33		;konstante za PWM
PWMMR1	EQU	CLK+1000
PWMMR1A	EQU	CLK/10+1000
PWMMR2	EQU	1000
ADC_DIV	EQU	PCLK/4000000	;ADC clock 4 MHz
MINUS60	EQU	3550000		;zacetek uporabne skale -60dBm (0.7V, 24bit)
SKALA80	EQU	10400		;skala stolpca 80dBm (768 korakov do 2.3V, 24bit)
SKALADB	EQU	SKALA80*768/800	;skala dBm (80dBm = 800 korakov)
POPRAVA	EQU	3000000		;popravek amplitudnega odziva AD8309

;*** 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 - nepovezan
;P0.3.od/SDA0/MAT0.0/EINT1 - nepovezan
;P0.4/SCK0/CAP0.1/AD0.6 - vhod AD0.6 za merjenje jakosti signala
;P0.5/MISO0/MAT0.1/AD0.7 - vhod	P0.5 ki opazuje PWM2 za preprost program
;P0.6/MOSI0/CAP0.2/AD1.0 - vhod CAP0.2 za vhod stevca TIMER0
;P0.7/SSEL0/PWM2/EINT2 - izhod PWM2 za vrata stevca ECL 74ACT32
;P0.8/TXD1/PWM4/AD1.1 - ECL stevec vhod #1
;P0.9/RXD1/PWM6/EINT3 - ECL stevec vhod #2
;P0.10/RTS1/CAP1.0/AD1.2 - ECL stevec vhod #3
;P0.11.od/CTS1/CAP1.1/SCL1 - ECL stevec vhod #4
;P0.12/DSR1/MAT1.0/AD1.3 - ECL stevec vhod #5
;P0.13/DTR1/MAT1.1/AD1.4 - nepovezan
;P0.14.od/DCD1/EINT1/SDA1/BOOTLOADER(!) - vhod vezan na /RTS.FT231XS 
;P0.15/RI1/EINT2/AD1.5 - nepovezan
;P0.16-23 - digitalni izhodi za LCD D0-7.HD44780
;P0.24 - ne obstaja ***
;P1.16 - vhod z vgrajenim PULL-UP, modra tipka levo na maso
;P1.17 - vhod z vgrajenim PULL-UP, rumena tipka gor na maso
;P1.18 - vhod z vgrajenim PULL-UP, rdeca tipka dol na maso
;P1.19 - vhod z vgrajenim PULL-UP, zelena tipka desno 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
JAKOST	EQU	0x40000400	;dvojiski rezultat meritve (32bit)
DELTAF	EQU	0x40000404	;razlika frekvence (32bit)
FREKVNC	EQU	0x40000408	;izmerjena frekvenca za preracunavanje amplitude (32bit)
STANJE	EQU	0x40000500	;bit0=stolpec/dbm,bit1=10Hz/1Hz (8bit),bt2=meritev veljavna
STANJE1	EQU	0x40000504	;zakasnjeno STANJE
STANJE2	EQU	0x40000508	;zakasnjeno STANJE

;*** 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

;*** Onemogoci zascito vsebine FLASH na naslovu 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,=0x0000102A	;TIM0,UART0,PWM,AD0
	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=0x22 P=2,M-1=2
	MOV	R1,#0x22
	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
	LDR	R1,=0x0000A305	; P0.0-1=UART0,P0.4=AD0.6,P0.6=CAP0.2,P0.7=PWM2
	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.13-31, vhodi 0.4-12, izhodi 0.0-3
	LDR	R1,=0xFFFFE00F
	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

;*** 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	UART0	;inicializiraj UART0
	BL	INILCD	;inicializiraj HD44780 5X7,2vrstici,CGRAM
	BL	INITIM0 ;inicializiraj TIMER0
	MOV	R1,#1
	LDR	R0,=STANJE	;zacetno stanje instrumenta 01
	STRB	R1,[R0]
	LDR	R0,=STANJE1	
	STRB	R1,[R0]
	LDR	R0,=STANJE2	
	STRB	R1,[R0]
	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,#31		;zacetni stevec zanke
	MOV	R0,#0x01	;display clear
	BL	UKAZ
	BL	T4MS		;zakasnitev 4ms
	B	ZANKA	;glavna zanka programa
	LTORG
ZACNI5	DCB	"Frekv.meter 1GHz",0
ZACNI6	DCB	"ANCKA 02.09.2014",0
	ALIGN	4

;*** Glavna zanka programa ***
ZANKA	
	BL	INIPWM		;inicializiraj PWM
ZANKA2	LDR	R0,=0x3FFFC014	;FIO0PIN0 meritev zacne?
	LDRB 	R1,[R0]
	TST	R1,#0x20	;vhod P0.5?
	BNE	ZANKA2
ZANKA1	BL	ADC	;meritev amplitude preko ADC

;Izbira izpisa dBm ali stolpec

	LDR	R2,=STANJE	;izpis na LCD v dBm?
	LDRB	R0,[R2]
	TST	R0,#1
	BLNE	IZPIS_dBm
	LDR	R2,=STANJE	;izpis stolpca na LCD?
	LDRB	R0,[R2]
	TST	R0,#1
	BLEQ	IZPIS_STOLPCEV
	
	LDR	R0,=0x3FFFC014	;FIO0PIN0 meritev zakljucena?
	LDRB	R1,[R0]
	TST	R1,#0x20	;vhod P0.5?
	BEQ	ZANKA1
	BL	T100US		;pocakam 100us
	BL	MERIF		;meritev frekvence
	LDR	R0,=STANJE2	;1Hz ali 10Hz, meritev veljavna?
	LDRB	R2,[R0]

	TST	R2,#0x02	
	ADDNE	R3,R3,R3,LSL#2	;pomnozimo z 10 v nacinu 10Hz
	MOVNE	R3,R3,LSL#1
	LDR	R0,=FREKVNC	;shranimo izmerjeno vrednost frekvence za preracunavanje amplitude
	STR	R3,[R0]

	BL  DECIZP_SP	;desetiski izpis z brisanjem vodilnih nicel
	BL	TIPKE	;ukaz s tipk
	BL	RXUART	;ukaz z UART0
	BL	RESPWM		;reset PWM
	
	LDR		R0,=STANJE1		;zakasnitev za 2 cikla/meritvi
	LDR		R1,=STANJE2	
	LDRB	R2,[R0]
	STRB	R2,[R1]
	LDR		R1,=STANJE	
	LDRB	R2,[R1]
	STRB	R2,[R0]
	
	B	ZANKA
	LTORG

;*** Desetiski izpis z brisanjem vodilnih nicel *** (R0-5, SKLAD-48)
;uporaba sklada: en polozaj (4byte) za LR in 10 polozajev (40byte) za 10 cifer

DECIZP_SP
	STR	LR,[SP,#-4]!
	MOV 	R4,#9		;zacetek zanke
	
DECIZP1_SP			
	BL	DELI10		;izpisi desetiska mesta na sklad 
	STR	R0,[SP,#-4]!	;ostanek (cifro) shrani na sklad
	SUBS	R4,R4,#1
	BPL	DECIZP1_SP	;cifre s sklada posiljamo na zaslon
	
	LDR	R0,=0x80	;nastavi polozaj
	BL	UKAZ	
	MOV 	R4,#9		;stevec cifer
	MOV     R5,#' '   	;podremo zastavico za cifro razlicno od 0 z ASCII kodo za presledek
	
SKLAD_BERI	
	CMP	R4,#6		;ali smo na mestu enic, ker nicle enic nikoli ne brisemo?
	MOVEQ	R5,#'0'		;postavimo ASCII znak za '0' v zastavico, da nicel ne brisemo vec

	CMP     R4,#5		;ali smo na mestu za dec. piko
	MOV	R0,#'.'

	LDR	R1,=0xE000C000	;U0THR izpis pike na UART0
	STRBEQ	R0,[R1]

	BLEQ 	ZNAK		;izpisemo piko, klic podprograma pogazi zastavico EQ!

	LDR	R0,[SP],#4		;precitamo cifro iz sklada
	
	CMP	R0,#0		;ali je cifra enaka nic?
	MOVEQ	R0,R5		;niclo zamenjamo z vrednostjo zastavice (presledek ali nicla ASCII)
	ADDNE	R0,R0,#'0'	;ne-niclo pretvorimo v ASCII znak tako, da pristejemo kodo za niclo
	MOVNE	R5,#'0'		;postavimo ASCII znak za '0' v zastavico, da nicel ne brisemo vec

	LDR	R1,=0xE000C000	;U0THR izpis znaka na UART0
	STRB	R0,[R1]

	BL	ZNAK		;izpisemo presledek ali cifro kot ASCII znak
	SUBS	R4,R4,#1	;zmanjsamo stevec cifer
	BPL	SKLAD_BERI
	
	LDR	R1,=0xE000C000	;U0THR izpis nove vrste na UART0
	MOV	R0,#13		;<CR>
	STRB	R0,[R1]
	MOV	R0,#10		;<LF>
	STRB	R0,[R1]

	MOV	R0,#' '		;izpisemo mersko enoto
	BL	ZNAK
	MOV	R0,#'M'
	BL	ZNAK
	MOV	R0,#'H'
	BL	ZNAK
	MOV	R0,#'z'
	BL	ZNAK

	MOV	R0,#' '		;izpisemo, ce je 1Hz
	LDR	R2,=STANJE	;1Hz ali 10Hz
	LDRB R1,[R2]
	TST	R1,#0x02	;preverimo bit1
	MOVNE R0,#'*'	;izpisemo, ce je 10Hz
	BL	ZNAK
	
	LDR	PC,[SP],#4
	LTORG

;*** Deli vsebino R3 z 10, ostanek v R0 in kvocient v R3 *** (R0-4)
DELI10	MOV	R0,R3		;deljenec v R0
	MOV	R1,#0xA0000000	;odstevam od deljenca 10*2^N
	MOV	R2,#0x10000000	;pristevam k kvocientu	1*2^N
	MOV	R3,#0		;kvocient v R3
DELI101	SUBS	R0,R0,R1	;odstejem R0-R1
	ADDCS	R3,R3,R2	;ni izposoje >>> pristejem kvocientu R3+R2
	ADDCC	R0,R0,R1	;je izposoja >>> pristejem prevec odsteto R0+R1
	MOV	R1,R1,LSR#1	;pomaknem R1 v desno
	MOVS	R2,R2,LSR#1	;pomaknem R2 v desno, preverim konec zanke!
	BNE	DELI101
	MOV	PC,R14

;*** 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

;*** Inicializacija TIMER0 *** (R0-1)
INITIM0	LDR	R0,=0xE0004070	;T0CTCR
	MOV	R1,#0x0B		;CAP0.2,BOTH
	STRB	R1,[R0]
	LDR	R0,=0xE0004004	;T0TCR
	MOV	R1,#0x01
	STRB	R1,[R0]
	MOV	PC,LR
	LTORG

;*** Inicializacija PWM *** (R0-1)
INIPWM	LDR	R0,=0xE0014014	;PWMMCR
	LDR	R1,=0x00000002	;PWMMR0R
	STR	R1,[R0]
	LDR	R0,=0xE001404C	;PWMPCR
	LDR	R1,=0x00000404	;PWMSEL2,PWMENA2
	STR	R1,[R0]
	LDR	R0,=0xE0014050	;PWMLER
	MOV	R1,#0x07	;Enable PWM latch 0,1,2
	STRB	R1,[R0]
	LDR	R0,=0xE0014018	;PWMMR0
	LDR	R1,=PWMMR0
	STR	R1,[R0]
	LDR	R0,=STANJE	;stanje 1Hz ali 10Hz?
	LDRB	R2,[R0]
	TST	R2,#0x02
	LDR	R0,=0xE001401C	;PWMMR1
	LDREQ	R1,=PWMMR1	;1Hz
	LDRNE	R1,=PWMMR1A	;10Hz
	STR	R1,[R0]
	LDR	R0,=0xE0014020	;PWMMR2
	LDR	R1,=PWMMR2
	STR	R1,[R0]
	LDR	R0,=0xE0014004	;PWMTCR CounterEnable & PWMEnable
	MOV	R1,#0x09
	STRB	R1,[R0]
	MOV	PC,LR
	LTORG

;*** Reset PWM *** (R0-1)
RESPWM	LDR	R0,=0xE0014018	;PWMMR0
	LDR	R1,[R0]
	LDR	R0,=0xE0014008	;PWMTC
	STR	R1,[R0]
	MOV	PC,LR
	LTORG

;*** Ukaz s tipk *** (R0-2)
TIPKE	

	STR	LR,[SP,#-4]!	;resi link
	
	LDR	R0,=0x3FFFC036 ;FIO1PIN2 branje tipk
	LDRB	R1,[R0]
	LDR	R2,=STANJE
	LDRB	R0,[R2]
	TST	R1,#0x01	;modra tipka levo?
	BICEQ	R0,R0,#0x01	;izpis stolpec
	TST	R1,#0x02	;rumena tipka gor?
	ORREQ	R0,R0,#0x01	;izpis dBm
	TST	R1,#0x04	;rdeca tipka dol?
	BICEQ	R0,R0,#0x02	;meritev 1Hz
	TST	R1,#0x08	;zelena tipka desno?
	ORREQ	R0,R0,#0x02	;meritev 10Hz
	STRB	R0,[R2]

	LDR	PC,[SP],#4	;povratek na link

;*** Ukaz z UART0 *** (R0-2)
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,=STANJE
	LDRB	R0,[R2]
	CMP	R1,#"S"		;ukaz s ali S (stolpec za jakost)?
	BICEQ	R0,R0,#0x01	;izpis stolpec
	CMP	R1,#"D"		;ukaz d ali D (dBm za jakost)?
	ORREQ	R0,R0,#0x01	;izpis dBm
	CMP	R1,#"P"		;ukaz p ali P?
	BICEQ	R0,R0,#0x02	;pocasna meritev frekvence 1Hz
	CMP	R1,#"H"		;ukaz h ali H?
	ORREQ	R0,R0,#0x02	;hitra meritev frekvence 10Hz
	STRB	R0,[R2]
	MOV	PC,LR
	LTORG

;*** Meritev amplitude preko ADC s povprecenjem *** (R0-3)
ADC	MOV	R2,#16384	;16384=2**14 povprecenj! cca 50ms
	MOV	R3,#0		;rezultat povprecenja
ADC_INIT	;inicializacija ADC in zacetek konverzije
	MOV	R0,#ADC_DIV	;izracunaj deljenje takta ADC0
	LDR	R1,=0x01200040	;START=001,PDN=1,CLKS=11,CLKDIV,SEL=6    
	ORR	R1,R1,R0,LSL#8
	LDR	R0,=0xE0034000	;AD0CR
	STR	R1,[R0]	
ADC_MERITEV
	LDR	R0,=0xE0034004	;AD0GDR cakaj konec pretvorbe-zanka
	LDR	R1,[R0]
	TST	R1,#0x80000000
	BEQ	ADC_MERITEV
	MOV	R1,R1,LSL#16	;pocisti register in postavi bite na zacetek
	MOV	R1,R1,LSR#22
	ADD	R3,R3,R1	;pristejemo povprecenju v R3
	SUBS	R2,R2,#1	;zanka povprecenja
	BNE	ADC_INIT
	LDR	R0,=JAKOST	;shrani 24-bitni rezultat v JAKOST(32bit)
	STR	R3,[R0]
	MOV	PC,LR
	LTORG

;*** Izracun in izpis ADC stolpcev *** (R0-3)
IZPIS_STOLPCEV
	STR	LR,[SP,#-4]!
	LDR	R0,=JAKOST
	LDR	R3,[R0]
	LDR	R0,=MINUS60	;odstejemo offset za 0.7 V (-60 dBm)
	SUBS 	R3,R3,R0
	MOVMI	R3,#0
	LDR 	R0,=SKALA80	;ADC vrednost za 2.3 V (+20 dBm) zmanjsana za 0.7 V, ki smo jih odsteli
	BL	NDELI
	BL	STOLP
	LDR	PC,[SP],#4
	LTORG

;*** Izpis na LCD v dBm *** (R0-5)
IZPIS_dBm
	STR	LR,[SP,#-4]!
	MOV	R0,#0xC0	;set DDRAM address druga vrstica
	BL	UKAZ
	MOV	R0,#' '		;presledki na zacetku za poravnavo merske enote v prvi(MHz) in drugi(dBm) vrstici
	BL	ZNAK				
	MOV	R0,#' '
	BL	ZNAK				
	MOV	R0,#' '
	BL	ZNAK				
	MOV	R0,#' '
	BL	ZNAK				
	MOV	R0,#' '
	BL	ZNAK				
	MOV	R0,#' '
	BL	ZNAK				

;Izpis ADC // 0 V = 0(dec), 3.3 V = 1023(dec) / 0.7 V = 217(dec) = -60 dBm, 2.3 V = 713(dec) = 20 dBm
	LDR	R0,=FREKVNC	;izracunam popravek frekvence fs*1024 v R0
	LDR	R3,[R0]
	LDR	R0,=POPRAVA
	BL	NDELI
	ADD	R0,R3,#1024
	LDR	R3,=SKALADB	;izracunam popravek SKALADB v R0 in na sklad
	MOV	R3,R3,LSL#10	;pomnozim s 1024
	BL	NDELI
	MOV	R0,R3
	MOV	R4,R3
	LDR	R1,=JAKOST	;ADC vrednost zadnje meritve v R3
	LDR	R3,[R1]
	BL	NDELI
	MOV	R0,R4		;izracunam popravljeni MINUSDB v R0
	MOV	R4,R3
	LDR	R3,=MINUS60
	BL	NDELI
	MOV	R0,R3		;odstejem MINUSDB
	MOV	R3,R4
	SUBS R3,R3,R0
	
	BMI DBM_LOW		;manjse od -60dBm
	LDR	R1,=800		;razpon 80 dB
	CMP R3, R1
	BPL DBM_HIGH	;vecje od +20dBm
	
	LDR	R1,=600		;0=-60dBm, 600=0dBm, 800=+20dBm
	SUBS	R3,R3,R1
	BPL	DBM_PLUS
	MOV	R0,#'-'		;izpisemo -dBm
	BL	ZNAK		;izpisi -
	RSB	R3,R3,#0
	B 	IZPIS_dBm_CIFRE
DBM_PLUS			;izpisemo +dBm
	MOV	R0,#'+'
	BL	ZNAK		;izpisi +

IZPIS_dBm_CIFRE	
	MOV 	R4,#3		;zacetek zanke, 3 cifre
dBm_CIFRA			
	BL	DELI10			
	STR	R0,[SP,#-4]!	;ostanek (cifro) shrani na sklad
	SUBS 	R4,R4,#1
	BNE	dBm_CIFRA		
	
	MOV 	R4,#3		;stevec cifer
	MOV    	R5,#' '   	;podremo zastavico za cifro razlicno od 0 z ASCII kodo za presledek
	
dBm_PISI	
	CMP	R4,#2		;ali smo na mestu enic, ker nicle enic nikoli ne brisemo?
	MOVEQ	R5,#'0'		;postavimo ASCII znak za '0' v zastavico, da nicel ne brisemo vec

	CMP     R4,#1		;ali smo na mestu za dec. piko
	MOV	R0,#'.'
	BLEQ 	ZNAK		;izpisemo piko, klic podprograma pogazi zastavico EQ!

	LDR	R0,[SP],#4	;nalozimo cifro iz sklada
	
	CMP	R0,#0		;ali je cifra enaka nic?
	MOVEQ	R0,R5		;niclo zamenjamo z vrednostjo zastavice (presledek ali nicla ASCII)
	ADDNE	R0,R0,#'0'	;ne-niclo pretvorimo v ASCII znak tako, da pristejemo kodo za niclo
	MOVNE	R5,#'0'		;postavimo ASCII znak za '0' v zastavico, da nicel ne brisemo vec

	BL	ZNAK		;izpisemo presledek ali cifro kot ASCII znak
	SUBS	R4,R4,#1	;zmanjsamo stevec cifer
	BNE	dBm_PISI
	
	MOV	R0,#' '		;izpisemo mersko enoto
	BL	ZNAK
	MOV	R0,#'d'
	BL	ZNAK
	MOV	R0,#'B'
	BL	ZNAK
	MOV	R0,#'m'
	BL	ZNAK
	MOV	R0,#' '
	BL	ZNAK
	LDR	PC,[SP],#4
	LTORG
	
DBM_LOW	
	MOV	R0,#' '	
	BL	ZNAK
	MOV	R0,#' '	
	BL	ZNAK
	MOV	R0,#' '	
	BL	ZNAK
	MOV	R0,#' '	
	BL	ZNAK
	MOV	R0,#' '	
	BL	ZNAK
	MOV	R0,#' '	
	BL	ZNAK
	MOV	R0,#'L'
	BL	ZNAK
	MOV	R0,#'O'
	BL	ZNAK
	MOV	R0,#'W'
	BL	ZNAK
	LDR	PC,[SP],#4
	LTORG

DBM_HIGH
	MOV	R0,#' '	
	BL	ZNAK
	MOV	R0,#' '	
	BL	ZNAK
	MOV	R0,#' '	
	BL	ZNAK
	MOV	R0,#' '	
	BL	ZNAK
	MOV	R0,#' '	
	BL	ZNAK
	MOV	R0,#'H'	
	BL	ZNAK
	MOV	R0,#'I'
	BL	ZNAK
	MOV	R0,#'G'
	BL	ZNAK
	MOV	R0,#'H'
	BL	ZNAK
	LDR	PC,[SP],#4
	LTORG

;*** Meritev frekvence *** (R0-3)
MERIF	LDR	R0,=0xE0004008	;T0TC izpis razlike Timer Counter 0
	LDR	R3,[R0]
	MOV	R3,R3,LSL#5
	LDR	R0,=0x3FFFC015	;FIO0PIN1
	LDRB	R1,[R0]
	AND	R1,R1,#0x1F	;5 bitov ECL
	ORR	R3,R3,R1
	MOV	R1,R3
	LDR	R0,=DELTAF	;razlika do stare meritve
	LDR	R2,[R0]
	SUB	R3,R3,R2
	STR	R1,[R0]
	MOV	PC,LR
	LTORG

;*** Konec delovanja zbirnika ARM ***
	END
	
