@*** Frekvencmeter - zbirnik Gnu as+ld+objcopy - Ancka 18.02.2015 ***

@*** Konstante mikrokrmilnika LPC2138/01 ***
.equ	KVARC,19442715		@frekvenca TCXO od Matjaza (Hz)
@.equ	KVARC,19439906		@frekvenca TCXO od Ane (Hz)
.equ	CLK,KVARC*3		@frekvenca jedra ARM (PLL)
.equ	PCLK,CLK		@frekvenca vhodno/izhodnih enot (APBDIV)
.equ	BAUD,PCLK/153600	@modulo deljenja UART za 9600bps*16
.equ	N1US,CLK/3000000	@konstanta cakanja T1US za HD44780
.equ	PWMMR0,CLK*33		@konstante za PWM
.equ	PWMMR1,CLK+1000
.equ	PWMMR1A,CLK/10+1000
.equ	PWMMR2,1000
.equ	ADC_DIV,PCLK/4000000	@ADC clock 4 MHz
.equ	MINUS60,3550000		@zacetek uporabne skale -60dBm (0.7V, 24bit)
.equ	SKALA80,10400		@skala stolpca 80dBm (768 korakov do 2.3V, 24bit)
.equ	SKALADB,SKALA80*768/800	@skala dBm (80dBm = 800 korakov)
.equ	POPRAVA,3000000		@popravek amplitudnega odziva AD8309
.equ	VOLT,24576		@preracunavanje VOLT

@*** 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 - vhod CAP0.0 za vhod stevca TIMER0 NF
@P0.3.od/SDA0/MAT0.0/EINT1 - vhod P0.3 za 74AC stevec
@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 VF
@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 ***
@P0.25/AD0.4/Aout - vhod AD0.5 za merjenje enosmerne komponente
@P0.26/AD0.5 - nepovezan
@P0.27/AD0.0/CAP0.1/MAT0.1 - nepovezan brez 220ohm, pin zrtvovan za vhod takta
@P0.28/AD0.1/CAP0.2/MAT0.2 - nepovezan
@P0.29/AD0.2/CAP0.3/MAT0.3 - nepovezan
@P0.30/AD0.3/EINT3/CAP0.0 - nepovezan
@P0.31(!) - nepovezan ***
@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 ***
.equ	SKLAD,0x40000100	@sklad raste navzdol -256byte
.equ	JAKOST,0x40000400	@dvojiski rezultat meritve (32bit)
.equ	DELTAF,0x40000404	@razlika frekvence (32bit)
.equ	FREKVNC,0x40000408	@izmerjena frekvenca za preracunavanje amplitude (32bit)
.equ	STANJE,0x40000500	@bit0=stolpec/dbm,bit1=10Hz/1Hz,bit2=meritev_veljavna,bit3=NF/VF (8bit)
.equ	STANJE1,0x40000504	@enkrat zakasnjeno STANJE
.equ	STANJE2,0x40000508	@dvakrat zakasnjeno STANJE

@*** 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

@*** Onemogoci zascito vsebine FLASH na naslovu 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,=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,=0x0000A325	@ P0.0-1=UART0,P0.2=CAP0.0,P0.4=AD0.6,P0.6=CAP0.2,P0.7=PWM2
	STR	R1,[R0]
	LDR	R0,=0xE002C004	@PINSEL1 P0.25=AD0.4
	LDR	R1,=0x00040000
	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.2-12, izhodi 0.0-1
	LDR	R1,=0xFFFFE003
	STR	R1,[R0]
	LDR	R0,=0x3FFFC020	@FIO1DIR izhodi 1.20-1.31
	LDR	R1,=0xFFF00000
	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:
.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04	@0=praznina
.byte	0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x04	@1=enacrtica
.byte	0x14,0x14,0x14,0x14,0x14,0x14,0x00,0x04	@2=dvecrtici
.byte	0x15,0x15,0x15,0x15,0x15,0x15,0x00,0x04	@3=tricrtice
.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F	@0=praznina podcrtana
.byte	0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x1F	@1=enacrtica podcrtana
.byte	0x14,0x14,0x14,0x14,0x14,0x14,0x00,0x1F	@2=dvecrtici podcrtana
.byte	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
.LTORG

@*** Zakasnitev 1us *** (R0)
.balign	16,0
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
	MOV	R1,#5	@zacetno stanje instrumenta 05,01,01
	LDR	R0,=STANJE
	STRB	R1,[R0]
	MOV	R1,#1
	LDR	R0,=STANJE1	
	STRB	R1,[R0]
	MOV	R1,#1
	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:	B	ZANKA	@glavna zanka programa
.LTORG
ZACNI5:	.asciz	"Frekv.meter 1GHz"
ZACNI6:	.asciz	"ANCKA 18.02.2015"
.ALIGN

@*** Glavna zanka programa ***
ZANKA:	BL	INITIM0 	@inicializiraj TIMER0
	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
	BL	TIPKE	@ukaz s tipk
	BL	RXUART	@ukaz z UART0

@Izbira izpisa dBm ali stolpec
	LDR	R2,=STANJE2	@meritev veljavna?
	LDRB	R0,[R2]
	TST	R0,#0x04
	BEQ	NEVELJAVNA

	TST	R0,#0x08	@izpis Volt za NF vhod
	BEQ	DBMSTOL
	BL	IZPIS_VOLT
	B	NEVELJAVNA

DBMSTOL:
	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
	
NEVELJAVNA:

	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?
	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]

	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]

	LDR	R0,=STANJE2	@meritev veljavna?
	LDRB	R2,[R0]
	TST	R2,#0x04
	BLNE	DECIZP_SP	@desetiski izpis z brisanjem vodilnih nicel

	BL	RESPWM		@reset PWM
	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
	STREQB	R0,[R1]		@ukaz namesto STRBEQ ???

	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,=STANJE	@bit3=NF/VF
	LDRB	R1,[R0]
	TST	R1,#0x08
	MOVEQ	R1,#0x0B	@CAP0.2,BOTH VF meritev
	MOVNE	R1,#0x03	@CAP0.0,BOTH NF meritev
	LDR	R0,=0xE0004070	@T0CTCR
	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]
	AND	R1,R1,#0x0F	@samo spodnji 4 biti (0=pritisnjena)
	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

	CMP	R1,#0x05	@zelena+rumena? (0101)
	BICEQ	R0,R0,#0x08	@VF meritev
	CMP	R1,#0x0C	@modra+rumena? (1100)
	ORREQ	R0,R0,#0x08	@NF meritev

	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

	CMP	R1,#'V'		@ukaz v ali V?
	BICEQ	R0,R0,#0x08	@meritev VF
	CMP	R1,#'N'		@ukaz n ali N?
	ORREQ	R0,R0,#0x08	@meritev NF

	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
	LDR	R0,=STANJE	@bit3=NF/VF
	LDRB	R1,[R0]
	TST	R1,#0x08
	LDREQ	R1,=0x01200040	@START=001,PDN=1,CLKS=11,CLKDIV,SEL=6 VF
	LDRNE	R1,=0x01200010	@START=001,PDN=1,CLKS=11,CLKDIV,SEL=4 NF    
	MOV	R0,#ADC_DIV	@izracunaj deljenje takta ADC0
	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,#'V'		@izpisi "VF"
	BL	ZNAK				
	MOV	R0,#'F'
	BL	ZNAK				
	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				

@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
	MOV	R0,#' '
	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
	MOV	R0,#' '
	BL	ZNAK				
	LDR	PC,[SP],#4
.LTORG

@*** Izpis na LCD v VOLT *** (R0-5)
IZPIS_VOLT:
	STR	LR,[SP,#-4]!
	MOV	R0,#0xC0	@set DDRAM address druga vrstica
	BL	UKAZ
	MOV	R0,#'N'		@izpisi "NF"
	BL	ZNAK				
	MOV	R0,#'F'
	BL	ZNAK			
	MOV	R0,#' '		@presledki na zacetku za poravnavo merske enote v drugi(VOLT) vrstici
	BL	ZNAK				
	MOV	R0,#' '
	BL	ZNAK				
	MOV	R0,#' '
	BL	ZNAK				

	LDR	R0,=JAKOST	@rezultat AD pretvorbe
	LDR	R3,[R0]
	LDR	R0,=VOLT	@konstanta za preracunavanje VOLT
	BL	NDELI

	MOV 	R4,#5		@zacetek zanke, 5 cifer
VOLT_CIFRA:			
	BL	DELI10			
	STR	R0,[SP,#-4]!	@ostanek (cifro) shrani na sklad
	SUBS 	R4,R4,#1
	BNE	VOLT_CIFRA		
	
	MOV 	R4,#5		@stevec 5 cifer
	MOV    	R5,#' '   	@podremo zastavico za cifro razlicno od 0 z ASCII kodo za presledek
	
VOLT_PISI:	
	CMP	R4,#3		@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,#2		@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	VOLT_PISI

	MOV	R0,#' '		@izpisemo mersko enoto
	BL	ZNAK
	MOV	R0,#'V'
	BL	ZNAK
	MOV	R0,#' '
	BL	ZNAK
	MOV	R0,#' '
	BL	ZNAK
	MOV	R0,#' '
	BL	ZNAK
	LDR	PC,[SP],#4
.LTORG

@*** Meritev frekvence *** (R0-3)
MERIF:	LDR	R0,=0xE0004008	@T0TC izpis razlike Timer Counter 0
	LDR	R3,[R0]

	LDR	R0,=STANJE	@bit3=NF/VF
	LDRB	R1,[R0]
	TST	R1,#0x08
	BNE	MERIFNF

	MOV	R3,R3,LSL#5
	LDR	R0,=0x3FFFC015	@FIO0PIN1
	LDRB	R1,[R0]
	AND	R1,R1,#0x1F	@5 bitov ECL
	ORR	R3,R3,R1
	B	MERIF1

MERIFNF:
	MOV	R3,R3,LSL#1
	LDR	R0,=0x3FFFC014	@FIO0PIN0
	LDRB	R1,[R0]
	TST	R1,#0x08
	ADDNE	R3,R3,#1

MERIF1:	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 Gnu ***
.end
