;*** Govoreci vertikalni navigacijski RADAR - S53MV 29.02.2008 *** ;*** Inputno/izhodni prikljucki LPC2148 @60MHz (crystal=12MHz) *** ;P0.0-4 - (neuporabljeno) digital izhodi ;P0.5 - analog input AD0.7 - neuporabljen mora biti v zraku ;P0.6-7 - (neuporabljeno) digital izhoda ;P0.8 - izhod TXD UART1 - 9600bps izmerjeni podatki ;P0.9-13 - (neuporabljeno) digital izhodi ;P0.14 - digital input /bootloader, pullup na +3.3V ;P0.15-24 - (neuporabljeno) digital izhodi ;P0.25 - analog izhod AOUT - govor ;P0.26-27 - (neuporabljeno) USB? ;P0.28 - analog input AD0.1 - medfrekvencni input za prvi vzorec ;P0.29 - analog input AD0.2 - neuporabljen medfrekvencni input ;P0.30 - analog input AD0.3 - medfrekvencni input za drugi vzorec ;P0.31 - (neuporabljen) digital izhod ;P1.16 - digital izhod - obmocje meritve F1 ;P1.17 - digital izhod - obmocje meritve F2 ;P1.18-23 - (neuporabljeno) digital izhodi ;P1.24-25 - (neuporabljeno) digitalna inputa ;P1.26 - JTAG input/izhod RTCK ;P1.27 - JTAG izhod TDO ;P1.28 - JTAG input TDI, jumper za eksponent povprecenja (bit 0) ;P1.29 - JTAG input TCK, jumper za eksponent povprecenja (bit 2) ;P1.30 - JTAG input TMS, jumper za eksponent povprecenja (bit 1) ;P1.31 - JTAG input TRST, jumper za omejevalnik impulznih motenj ;*** Ukazi za delovanje zbirnika ARM *** AREA RESET, CODE, READONLY, ALIGN=9 ENTRY CODE32 ;*** Dodelitev pomnilnika RAM *** STACK EQU 0x40000180 ;stack (navzdol ???) ISTACK EQU 0x400001A0 ;int stack (navzdol 12 bajtov) OSTEVEC EQU 0X400001B0 ;stevec oddaje UART1 (4 bajti) OKAZALC EQU 0x400001B4 ;kazalec oddaje UART1 (4 bajti) ZSTEVEC EQU 0x400001B8 ;stevec vzorcev zvoka v zapisu (4 bajti) ZKAZALC EQU 0x400001BC ;kazalec vzorcev zvoka v zapisu (4 bajti) STANJE EQU 0x400001C0 ;stanje izvajanja meritev (4 bajti) VISINA EQU 0x400001C4 ;logaritemska visina (4 bajti) GCAKAJ EQU 0x400001C8 ;cakanje enakega sporocila (4 bajti) GIDENT EQU 0x400001CC ;ident (naslov) govornega sporocila (4 bajti) MNASLOV EQU 0x40000300 ;rezultat meritev (512 bajtov) RNASLOV EQU 0x40000500 ;povpreceni rezultat (512 bajtov) PNASLOV EQU 0x40000700 ;interface za RS-232 (69 bajtov) ANASLOV EQU 0x40000800 ;interface ADC (6152 bajtov, zacetek -8!!!) TNASLOV EQU 0x40002000 ;FFT tabela (8192 bajtov) LNASLOV EQU 0x40004000 ;histogram omejevalnika (2048 bajtov) FNASLOV EQU 0x40004000 ;interface FFT (16348 bajtov) ;*** Tabela izjem na zacetnem naslovu 0 *** IZJEME B ZACNI B IZJEME ;Undef B IZJEME ;SWI B IZJEME ;PAbt B IZJEME ;DAbt NOP ;Reserved Vector B PREKIN ;IRQ ;*** FIQ podprogram za ADC0 v LPC2148 *** (FIQ_R8-12) SUBS R10,R10,#1 ;stevec vpisov v interface, zavrze AD0.2,7 LDR R11,[R8,#0x14] ;AD0DR1=AD0CR+0x14 prvi vzorec iz AD0.1 LDR R12,[R8,#0x1C] ;AD0DR3=AD0CR+0x1C drugi vzorec iz AD0.3 STRHPL R11,[R9],#2 ;prvi vzorec v [R9],#2 STRHPL R12,[R9],#2 ;drugi vzorec v [R9],#2 SUBPLS PC,LR,#4 ;pogojni izhod iz FIQ MOV R10,#0 MRS R12,SPSR ;izkljuci prekinitve FIQ ORR R12,#0x40 MSR SPSR_c,R12 SUBS PC,LR,#4 ;izhod iz FIQ ALIGN 512 ;izbrisi naslov 0x00001FC ;*** Nastavi 340/85kHz prekinitve ADC0 v LPC2148 (PCLK=15MHz) *** (R0-1) ADC0 LDR R0,=0xFFFFF00C ;VICIntSelect=0x00040000 AD0 LDR R1,=0x00040000 STR R1,[R0] LDR R0,=0xFFFFF010 ;VICIntEnable=0x00040000 AD0 LDR R1,=0x00040000 STR R1,[R0] LDR R0,=0xE003400C ;AD0INTEN prekinitve 85kHz/4vzorci prozi AD0.3 LDR R1,=0x00000008 STR R1,[R0] LDR R0,=0xE0034000 ;AD0CR burst, 3750kHz/11, kanali AD0.1,2,3,7 LDR R1,=0x0021038E ;1=pdn,0=clks,1=burst,3=clkdiv,0x8E=sel STR R1,[R0] BX LR LTORG ;*** Vkljuci prekinitve FIQ za A/D v ARM *** (R0,FIQ_R8-10) AZACNI MRS R0,CPSR ;preberi CPSR BIC R0,R0,#0x02 ;preklopi v nacin FIQ MSR CPSR_c,R0 ;popravi CPSR LDR R8,=0xE0034000 ;AD0CR [R8] (osnovni naslov AD0 v FIQ) LDR R9,=ANASLOV ;interface ADC dolizne 6152 bajtov [R9] SUB R9,R9,#8 ;zacetek -8!!! LDR R10,=1538 ;stevec vpisov v interface 1536+2 MRS R0,CPSR ;preberi CPSR ORR R0,R0,#0x03 ;preklopi v nacin supervisor BIC R0,R0,#0x40 ;vkljuci prekinitve FIQ MSR CPSR_c,R0 ;popravi CPSR BX LR LTORG ;*** Pocakaj konec delovanja A/D *** (R0-1,FIQ_R10) ACAKAJ MRS R0,CPSR ;preberi CPSR BIC R0,R0,#0x02 ;preklopi v nacin FIQ MSR CPSR_c,R0 ;popravi CPSR MOV R1,R10 ;precitaj stevec vpisov v interface MRS R0,CPSR ;preberi CPSR ORR R0,R0,#0x03 ;preklopi v nacin supervisor MSR CPSR_c,R0 ;popravi CPSR MOVS R1,R1 BNE ACAKAJ BX LR ;*** Prekinitveni podprogram za TIMER0 v LPC2148 *** (R0-2) ALIGN 16 SPACE 4 PREKIN STR R0,[SP,#-4]! ;resi registre R0,R1,R2 STR R1,[SP,#-4]! STR R2,[SP,#-4]! MOV R0,#0x80 ;bajt za tisino LDR R1,=ZSTEVEC ;stevec vzorcev v zapisu LDR R2,[R1] MOVS R2,R2 BEQ PREKIN1 SUB R2,R2,#1 STR R2,[R1] LDR R1,=ZKAZALC ;kazalec vzorcev v zapisu LDR R2,[R1] LDRB R0,[R2],#1 ;bajt iz zapisa STR R2,[R1] PREKIN1 MOV R1,R0,LSL#8 ;obdelaj bajt za DAC in nastavi glasnost LDR R0,=0xE006C000 ;naslov DACR STR R1,[R0] LDR R0,=0xE0010014 ;U1LSR THRE=? LDRB R1,[R0] TST R1,#0x20 BEQ PREKIN2 LDR R1,=OSTEVEC ;stevec oddaje UART1? LDR R2,[R1] MOVS R2,R2 BEQ PREKIN2 SUB R2,R2,#1 STR R2,[R1] LDR R1,=OKAZALC ;kazalec oddaje UART1 LDR R2,[R1] LDRB R0,[R2],#1 ;precitaj bajt za oddajo STR R2,[R1] LDR R1,=0xE0010000 ;U1THR vpisi bajt za oddajo STRB R0,[R1] PREKIN2 LDR R0,=0xE0004000 ;T0IR=0xFF reset zahtev TIMER0 MOV R1,#0xFF STRB R1,[R0] LDR R2,[SP],#4 ;povrni registre R2,R1,R0 LDR R1,[SP],#4 LDR R0,[SP],#4 SUBS PC,LR,#4 ;izhod iz prekinitve LTORG ;*** Vkljuci prekinitve IRQ v ARM *** (R0) IRQON MRS R0,CPSR ;preberi CPSR BIC R0,R0,#0x01 ;preklopi v nacin IRQ MSR CPSR_c,R0 ;popravi CPSR LDR SP,=ISTACK ;inicializiraj IRQ SP MRS R0,CPSR ;preberi CPSR ORR R0,R0,#0x03 ;preklopi v nacin supervisor BIC R0,R0,#0x80 ;vkljuci prekinitve IRQ MSR CPSR_c,R0 ;popravi CPSR BX LR ;*** Nastavi 8kHz prekinitve TIMER0 v LPC2148 (PCLK=15MHz) *** (R0,R1) TIMER0 LDR R0,=0xE0004018 ;T0MR0=1874 deli PCLK/1875 LDR R1,=1874 STR R1,[R0] LDR R0,=0xE0004014 ;T0MCR=0x0003 reset in int iz MR0 MOV R1,#0x0003 STR R1,[R0] LDR R0,=0xFFFFF010 ;VICIntEnable=0x00000010 TIMER0 LDR R1,=0x00000010 STR R1,[R0] LDR R0,=0xE0004004 ;T0TCR=0x01 vklop TIMER0 MOV R1,#0x01 STR R1,[R0] BX LR LTORG ;*** Inicializiraj MAM v LPC2148 *** (R0,R1) 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] BX LR LTORG ;*** Inicializiraj PLL0 v LPC2148 *** (R0,R1,R2) PLL0 LDR R0,=0xE01FC084 ;PLL0CFG=0x24 P=2,M=5 MOV R1,#0x24 STRB R1,[R0] LDR R0,=0xE01FC080 ;PLL0CON=0x01 PLL-enable MOV R1,#0x01 STRB R1,[R0] LDR R0,=0xE01FC08C ;PLL0FEED MOV R1,#0xAA MOV R2,#0x55 STRB R1,[R0] STRB R2,[R0] PLL01 LDR R0,=0xE01FC088 ;PLL0STAT cakanje uklenitve LDR R1,[R0] ANDS R1,R1,#0x400 BEQ PLL01 LDR R0,=0xE01FC080 ;PLL0CON=0x03 PLL-enable&connect MOV R1,#0x03 STRB R1,[R0] LDR R0,=0xE01FC08C ;PLL0FEED MOV R1,#0xAA MOV R2,#0x55 STRB R1,[R0] STRB R2,[R0] BX LR LTORG ;*** Inicializiraj GPIO v LPC2148 *** (R0,R1) GPIO LDR R0,=0xE002C000 ;PINSEL0 P0.5=AD0.7 P0.8=TXD(UART1) LDR R1,=0x00010C00 STR R1,[R0] LDR R0,=0xE002C004 ;PINSEL1 P0.25=Aout(DAC) P0.28-30=AD0.1-3 LDR R1,=0x15080000 STR R1,[R0] LDR R0,=0xE01FC1A0 ;SCS=0x03 high-speed GPIO 0&1 MOV R1,#0x03 STR R1,[R0] LDR R0,=0x3FFFC000 ;FIO0DIR izhodi 0.0-0.13 0.15-0.31 LDR R1,=0xFFFFBFFF STR R1,[R0] LDR R0,=0x3FFFC020 ;FIO1DIR izhodi 1.16-1.23 LDR R1,=0x00FF0000 STR R1,[R0] BX LR LTORG ;*** Inicializiraj UART1 v LPC2148 *** (R0,R1) UART1 LDR R0,=0xE001000C ;U1LCR=0x87 DLAB=1,no-parity,2stop,8bit MOV R1,#0x87 STRB R1,[R0] LDR R0,=0xE0010000 ;U1DLL=98 9600bps@15MHzPCLK MOV R1,#98 STRB R1,[R0] LDR R0,=0xE0010008 ;U1FCR=0x01 FIFO Enable MOV R1,#0x01 STRB R1,[R0] LDR R0,=0xE001000C ;U1LCR=0x07 DLAB=0,no-parity,2stop,8bit MOV R1,#0x07 STRB R1,[R0] BX LR LTORG ;*** RS-232 oddaja UART1 *** (R0-6) ODDAJA LDR R0,=OSTEVEC ;stevec oddaje UART1? LDR R1,[R0] MOVS R1,R1 BXNE LR LDR R1,=PNASLOV MOV R2,#0xFF ;bajt 0xFF za zacetek STRB R2,[R1],#1 LDR R2,=VISINA ;poisci zapis v tabeli za log.visino LDR R3,[R2] AND R3,R3,#0x7F LDR R2,=ODDAJA4 ADD R2,R2,R3,LSL#2 LDRB R0,[R2],#1 ;prepisi 4 znake stevilske visine STRB R0,[R1],#1 LDRB R0,[R2],#1 STRB R0,[R1],#1 LDRB R0,[R2],#1 STRB R0,[R1],#1 LDRB R0,[R2],#1 STRB R0,[R1],#1 LDR R0,=RNASLOV ;pretvori in poslji vsako drugo vrednost (64) MOV R2,#64 ODDAJA1 LDR R3,[R0],#8 MOV R4,#31 ;stetje dvojiskih mest za logaritem ODDAJA2 TST R3,#0x80000000 BNE ODDAJA3 ADD R3,R3,R3 SUBS R4,R4,#1 BNE ODDAJA2 ODDAJA3 UMULL R6,R5,R3,R3 ;dodatni bit 1 logaritma MOV R3,R5 ADDS R5,R5,R5 MOVCC R3,R5 ADC R4,R4,R4 UMULL R6,R5,R3,R3 ;dodatni bit 2 logaritma MOV R3,R6 ADDS R5,R5,R5 MOVCC R3,R5 ADC R4,R4,R4 UMULL R6,R5,R3,R3 ;dodatni bit 3 logaritma skala 256=96dB ADDS R5,R5,R5 ADC R4,R4,R4 SUBS R4,R4,#40 ;porezi spodnji del skale MOVCC R4,#0 STRB R4,[R1],#1 ;shrani rezultat 0-215 SUBS R2,R2,#1 BNE ODDAJA1 LDR R0,=OKAZALC ;kazalec oddaje UART1 LDR R1,=PNASLOV ;utezeni logaritem STR R1,[R0] LDR R0,=OSTEVEC ;stevec oddaje UART1 MOV R1,#69 ;skupina 69 bajtov STR R1,[R0] BX LR LTORG ODDAJA4 DCB " 0" ;0 tabela zapisov visine v ASCII obliki DCB " 0.5" DCB " 1" DCB " 1.5" DCB " 2" DCB " 3" DCB " 4" DCB " 5" DCB " 6" ;8 DCB " 7" DCB " 8" DCB " 9" DCB " 10" DCB " 11" DCB " 12" DCB " 13" DCB " 14" ;16 DCB " 15" DCB " 16" DCB " 17" DCB " 19" DCB " 20" DCB " 22" DCB " 24" DCB " 26" ;24 DCB " 28" DCB " 30" DCB " 32" DCB " 35" DCB " 37" DCB " 40" DCB " 42" DCB " 45" ;32 DCB " 47" DCB " 50" DCB " 52" DCB " 55" DCB " 57" DCB " 60" DCB " 65" DCB " 70" ;40 DCB " 75" DCB " 80" DCB " 85" DCB " 90" DCB " 95" DCB " 100" DCB " 105" DCB " 110" ;48 DCB " 115" DCB " 120" DCB " 125" DCB " 130" DCB " 140" DCB " 150" DCB " 160" DCB " 170" ;56 DCB " 175" DCB " 180" DCB " 190" DCB " 200" DCB " 210" DCB " 220" DCB " 230" DCB " 250" ;64 DCB " 260" DCB " 270" DCB " 280" DCB " 300" DCB " 310" DCB " 330" DCB " 350" DCB " 370" ;72 DCB " 380" DCB " 400" DCB " 420" DCB " 450" DCB " 470" DCB " 500" DCB " 520" DCB " 550" ;80 DCB " 570" DCB " 600" DCB " 630" DCB " 660" DCB " 700" DCB " 730" DCB " 770" DCB " 800" ;88 DCB " 850" DCB " 900" DCB " 950" DCB "1000" DCB "1050" DCB "1100" DCB "1150" DCB "1200" ;96 DCB "1250" DCB "1300" DCB "1350" DCB "1400" DCB "1450" DCB "1500" DCB "1600" DCB "1700" ;104 DCB "1800" DCB "1900" DCB "2000" DCB "2100" DCB "2200" DCB "2300" DCB "2400" DCB "2500" ;112 DCB "2700" DCB "2800" DCB "3000" DCB "3100" DCB "3200" DCB "3400" DCB "3600" DCB "3800" ;120 DCB "4000" DCB "4200" DCB "4400" DCB "4600" DCB "4800" DCB "5000" DCB "----" ;127 neveljavno ALIGN ;*** Tabela faznih zasukov *** (R0-10) FFTTAB LDR R0,=TNASLOV ;zapolni tabelo z enotnimi zasuki MOV R1,#512 FFTTAB1 LDR R2,=0x7FFFFFFF STR R2,[R0],#4 LDR R2,=0x00000000 STR R2,[R0],#4 SUBS R1,R1,#1 BNE FFTTAB1 MOV R2,#0x00000000 ;cos(fi)/2 zacetek pi/2 MOV R3,#0x80000000 ;sin(fi)/2 MOV R10,#0 FFTTAB2 MOV R4,#0x80000000 ;1/2+cos(fi)/2 ADD R4,R4,R2 MOV R5,#0x80000000 ;R2 koren iz R4 MOV R2,#0 FFTTAB3 ADD R2,R2,R5 UMULL R6,R7,R2,R2 ;R6 izgubljen CMP R4,R7 SUBCC R2,R2,R5 MOVS R5,R5,LSR#1 BNE FFTTAB3 MOV R5,#0x80000000 ;sin(fi)/2/cos(fi/2) R4=R3/R2 MOV R4,#0 FFTTAB4 ADD R4,R4,R5 UMULL R6,R7,R2,R4 ;R6 izgubljen CMP R3,R7 SUBCC R4,R4,R5 MOVS R5,R5,LSR#1 BNE FFTTAB4 MOV R2,R2,LSR#1 ;cos(fi/2)/2 v R2 MOV R3,R4,LSR#1 ;sin(fi/2)/2 v R3 LDR R8,=TNASLOV ;dodajaj zasuke v tabelo dolzine 512 MOV R9,#0 FFTTAB5 LDR R0,[R8] LDR R1,[R8,#4] MOV R4,#0x100 MOV R4,R4,LSR R10 ANDS R4,R4,R9 BEQ FFTTAB6 ADD R4,R0,R0 ;Re*2 v R4 ADD R5,R1,R1 ;Im*2 v R5 UMULL R7,R0,R4,R2 ;Re*cos(fi) v R0, izguba v R7 UMULL R7,R1,R5,R2 ;Im*cos(fi) v R0, izguba v R7 UMULL R7,R6,R4,R3 ;Re*sin(fi) v R6, izguba v R7 ADD R1,R1,R6 ;noviIm=Im*cos(fi)+Re*sin(fi) v R1 UMULL R7,R6,R5,R3 ;Im*sin(fi) v R6, izguba v R7 SUB R0,R0,R6 ;noviRe=Re*cos(fi)-Im*sin(fi) v R0 FFTTAB6 STR R0,[R8],#4 STR R1,[R8],#4 ADD R9,R9,#1 ;zanka po tabeli CMP R9,#512 BCC FFTTAB5 ADD R10,R10,#1 ;zanka po fi CMP R10,#9 BCC FFTTAB2 LDR R0,=TNASLOV ;prepisi v zrcalno polovico tabele ADD R1,R0,#4096 MOV R2,#512 FFTTAB7 LDR R3,[R0],#4 ;cos(0...PI/2) >>> sin(PI/2...PI) LDR R4,[R0],#4 ;-sin(0...PI/2) >>> cos(PI/2...PI) RSB R4,R4,#0 STR R4,[R1],#4 STR R3,[R1],#4 SUBS R2,R2,#1 BNE FFTTAB7 BX LR LTORG ;*** Podatki iz A/D v FFT *** (R0-10) ALIGN 16 SPACE 12 ADCFFT LDR R0,=ANASLOV LDR R1,=FNASLOV MOV R2,#0 LDR R3,=TNASLOV MOV R9,#-1 ;konstanti za izracun okna MOV R10,#0x40000000 ADCFFT1 MOV R4,#2048 ;drugi 10-bitni vzorec iz A/D v 32-bit predznaceno LDRH R5,[R0,R4] BIC R5,R5,#0x3F SUB R5,R5,#0x8000 MOV R5,R5,LSL#5 LDRH R4,[R0],#2 ;prvi 10-bitni vzorec iz A/D v 32-bit predznaceno BIC R4,R4,#0x3F SUB R4,R4,#0x8000 MOV R4,R4,LSL#5 SUBS R6,R2,#1024 ;naslov R7 za cos iz FFTTAB v obe smeri SUBMI R6,R9,R6 ADD R7,R3,R6,LSL#3 LDR R6,[R7] ;okno dvignjeni kosinus (1+cos)/2 v R6 ADD R6,R10,R6,ASR#1 SMULL R8,R7,R4,R6 ;pomnozi oba vzorca z oknom ADD R4,R7,R7 SMULL R8,R7,R5,R6 ADD R5,R7,R7 MOV R7,R2 ;obrni 10-bitni naslov v R6 MOV R6,#0 MOVS R7,R7,RRX ;1 ADC R6,R6,R6 MOVS R7,R7,RRX ;2 ADC R6,R6,R6 MOVS R7,R7,RRX ;3 ADC R6,R6,R6 MOVS R7,R7,RRX ;4 ADC R6,R6,R6 MOVS R7,R7,RRX ;5 ADC R6,R6,R6 MOVS R7,R7,RRX ;6 ADC R6,R6,R6 MOVS R7,R7,RRX ;7 ADC R6,R6,R6 MOVS R7,R7,RRX ;8 ADC R6,R6,R6 MOVS R7,R7,RRX ;9 ADC R6,R6,R6 MOVS R7,R7,RRX ;10 ADC R6,R6,R6 MOVS R7,R7,RRX ;11 ADC R6,R6,R6 MOV R6,R6,LSL#3 STR R4,[R1,R6] ;shrani oba vzorca v Re in Im ADD R6,R6,#4 STR R5,[R1,R6] ADD R2,R2,#1 ;zanka po vzorcih A/D CMP R2,#2048 BCC ADCFFT1 BX LR ;*** FFT metuljcki za 2048 tock *** (R0-12,14) ALIGN 16 SPACE 12 FFTMET STR R14,[SP,#-4]! ;resi link LDR R14,=TNASLOV ;tabela faznih zasukov MOV R12,#0 ;glavni koraki FFT FFTMET1 MOV R11,#0 ;koraki po skupinah metuljckov LDR R8,=FNASLOV ;zacetna gornja veja metuljcka MOV R0,#8 ;razkorak metuljcka MOV R0,R0,LSL R12 ADD R9,R8,R0 ;zacetna spodnja veja metuljcka FFTMET2 MOV R10,#0 ;koraki po faznih zasukih FFTMET3 ADD R0,R14,R10 ;naslov faznih zasukov v skupini metuljckov LDR R2,[R0],#4 ;cos(fi) v R2 LDR R3,[R0] ;sin(fi) v R3 LDR R0,[R9] ;spodnja veja s faznim zasukom LDR R1,[R9,#4] ADD R4,R0,R0 ;Re*2 v R4 fazni zasuk R0-1 za R2-3 ADD R5,R1,R1 ;Im*2 v R5 SMULL R7,R0,R4,R2 ;Re*cos(fi) v R0, izguba v R7 SMULL R7,R1,R5,R2 ;Im*cos(fi) v R0, izguba v R7 SMULL R7,R6,R4,R3 ;Re*sin(fi) v R6, izguba v R7 ADD R1,R1,R6 ;noviIm=Im*cos(fi)+Re*sin(fi) v R1 SMULL R7,R6,R5,R3 ;Im*sin(fi) v R6, izguba v R7 SUB R0,R0,R6 ;noviRe=Re*cos(fi)-Im*sin(fi) v R0 LDR R4,[R8] ;gornja veja brez faznega zasuka LDR R5,[R8,#4] SUB R2,R4,R0 ;izracunaj in shrani razliko, povecaj naslov R9 SUB R3,R5,R1 STR R2,[R9],#4 STR R3,[R9],#4 ADD R4,R4,R0 ;izracunaj in shrani vsoto, povecaj naslov R8 ADD R5,R5,R1 STR R4,[R8],#4 STR R5,[R8],#4 MOV R0,#0x2000 ;naslov naslednjega faznega zasuka ADD R10,R10,R0,LSR R12 CMP R10,#0x2000 BCC FFTMET3 SUB R0,R9,R8 ;naslovi vej naslednje skupine MOV R8,R9 ADD R9,R9,R0 ADD R11,R11,#1 ;naslednja skupina metuljckov 1024>1 MOV R0,#1024 CMP R11,R0,LSR R12 BCC FFTMET2 ADD R12,R12,#1 ;glavni koraki FFT 2048: 11 CMP R12,#11 BCC FFTMET1 LDR PC,[SP],#4 LTORG ;*** Utezeni log spekter v 32 oken (R8) *** (R0-12) FFTLOG STR LR,[SP,#-4]! ;resi link LDR R11,=TNASLOV LDR R0,=FNASLOV ;input 2048 FFT, izhod 1.skupina 8 oken ADD R1,R0,#0x4000 LDR R2,=136 ;naslov zacetnega okna ADD R0,R0,R2,LSL#3 SUB R1,R1,R2,LSL#3 LDR R9,=165 ;okno1 136-164 BL FFTLOG1 LDR R9,=200 ;okno5 165-199 BL FFTLOG1 LDR R9,=242 ;okno9 200-241 BL FFTLOG1 LDR R9,=294 ;okno13 242-293 BL FFTLOG1 LDR R9,=356 ;okno17 294-355 BL FFTLOG1 LDR R9,=431 ;okno21 356-430 BL FFTLOG1 LDR R9,=522 ;okno25 431-521 BL FFTLOG1 LDR R9,=633 ;okno29 522-632 BL FFTLOG1 SUB R8,R8,#124 ;izhod 2. skupina 8 oken LDR R0,=FNASLOV ;input 2048 FFT ADD R1,R0,#0x4000 LDR R2,=143 ;naslov zacetnega okna ADD R0,R0,R2,LSL#3 SUB R1,R1,R2,LSL#3 LDR R9,=173 ;okno2 143-172 BL FFTLOG1 LDR R9,=210 ;okno6 173-209 BL FFTLOG1 LDR R9,=254 ;okno10 210-253 BL FFTLOG1 LDR R9,=308 ;okno14 254-307 BL FFTLOG1 LDR R9,=373 ;okno18 308-372 BL FFTLOG1 LDR R9,=452 ;okno22 373-451 BL FFTLOG1 LDR R9,=548 ;okno26 452-547 BL FFTLOG1 LDR R9,=664 ;okno30 548-663 BL FFTLOG1 SUB R8,R8,#124 ;izhod 3.skupine 8 oken LDR R0,=FNASLOV ;input 2048 FFT ADD R1,R0,#0x4000 LDR R2,=150 ;naslov zacetnega okna ADD R0,R0,R2,LSL#3 SUB R1,R1,R2,LSL#3 LDR R9,=182 ;okno3 150-181 BL FFTLOG1 LDR R9,=220 ;okno7 182-219 BL FFTLOG1 LDR R9,=267 ;okno11 220-266 BL FFTLOG1 LDR R9,=323 ;okno15 267-322 BL FFTLOG1 LDR R9,=392 ;okno19 323-391 BL FFTLOG1 LDR R9,=474 ;okno23 392-473 BL FFTLOG1 LDR R9,=575 ;okno27 474-574 BL FFTLOG1 LDR R9,=696 ;okno31 575-695 BL FFTLOG1 SUB R8,R8,#124 ;izhod 4.skupine 8 oken LDR R0,=FNASLOV ;input 2048 FFT ADD R1,R0,#0x4000 LDR R2,=157 ;naslov zacetnega okna ADD R0,R0,R2,LSL#3 SUB R1,R1,R2,LSL#3 LDR R9,=191 ;okno4 157-190 BL FFTLOG1 LDR R9,=231 ;okno8 191-230 BL FFTLOG1 LDR R9,=280 ;okno12 231-279 BL FFTLOG1 LDR R9,=339 ;okno16 280-338 BL FFTLOG1 LDR R9,=411 ;okno20 339-410 BL FFTLOG1 LDR R9,=498 ;okno24 411-497 BL FFTLOG1 LDR R9,=603 ;okno28 498-602 BL FFTLOG1 LDR R9,=730 ;okno32 603-729 BL FFTLOG1 LDR PC,[SP],#4 LTORG ALIGN 16 SPACE 12 FFTLOG1 STR LR,[SP,#-4]! ;resi link SUB R3,R9,R2 ;izracun sirine utezi ADD R3,R3,#1 MOV R3,R3,LSL#21 MOV R12,#0 ;obratna vrednost sirine v R12 MOV R4,#0x10000 FFTLOG2 ADD R12,R12,R4 UMULL R14,R10,R3,R12 CMP R10,#0x400 SUBCS R12,R12,R4 MOVS R4,R4,LSR#1 BNE FFTLOG2 MOV R6,#0 ;sestevanje moci v oknu MOV R7,#0 FFTLOG3 SUB R3,R9,R2 ;sinusni polval iz tabele [R11] MOV R3,R3,LSL#21 UMULL R14,R4,R3,R12 ADD R4,R11,R4,LSL#3 LDR R3,[R4,#4] MOV R4,R2,LSL#22 ;mnozenje utezi s frekvenco v R10 UMULL R14,R10,R4,R3 LDR R5,[R0],#4 ;utezene realne frekvence SMULL R14,R3,R5,R10 LDR R5,[R1],#4 SMULL R14,R4,R5,R10 ADD R5,R3,R4 ;vsota realnih SMLAL R6,R7,R5,R5 SUB R5,R3,R4 ;razlika realnih SMLAL R6,R7,R5,R5 LDR R5,[R0],#4 ;utezene imaginarne frekvence SMULL R14,R3,R5,R10 LDR R5,[R1],#-12 SMULL R14,R4,R5,R10 SUB R5,R3,R4 ;razlika imaginarnih SMLAL R6,R7,R5,R5 ADD R5,R3,R4 ;vsota imaginarnih SMLAL R6,R7,R5,R5 ADD R2,R2,#1 ;sestej frekvence okna CMP R2,R9 BCC FFTLOG3 STR R7,[R8],#16 ;shrani rezultat LDR PC,[SP],#4 ;*** Govor iz zvocnih zapisov .WAV 8bit/8kHz/mono *** (R0-2) GOVOR LDR R0,=ZSTEVEC ;veljavna (ZSTEVEC),(ZKAZALC)? LDR R1,[R0] MOVS R1,R1 BXNE LR ;izhod med govorjenjem STR LR,[SP,#-4]! LDR R0,=VISINA ;poisci zvocni zapis za logaritemsko visino LDR R1,[R0] CMP R1,#0x80 ;sporocilo ob vklopu za (VISINA)>127 BCS ZVOKR LDR R0,=GOVOR3 ADD R0,R0,R1,LSL#2 MOV PC,R0 GOVOR1 LDR R0,=GCAKAJ ;preveri stevec cakanja LDR R1,[R0] SUB R1,R1,#1 ;odstevaj in preveri CMP R1,#1024 ;max cakanje 1024 zank MOVCS R1,#0 STR R1,[R0] MOVS R1,R1 ;konec cakanja? BEQ GOVOR2 LDR R0,=GIDENT ;primerjaj idente (naslove) sporocil LDR R1,[R0] CMP R1,LR LDREQ PC,[SP],#4 ;izhod za enako sporocilo GOVOR2 MOVS R0,LR ;zacetek .WAV zapisa v R0 LDREQ PC,[SP],#4 ;izhod za nicno sporocilo LDR R1,=GCAKAJ ;postavi stevec cakanja 240 zank MOV R2,#240 STR R2,[R1] LDR R1,=GIDENT ;shrani ident (naslov) sporocila STR R0,[R1] ADD R0,R0,#46 ;zacetek zvoka v (ZKAZALC) LDR R1,=ZKAZALC STR R0,[R1] LDRB R1,[LR,#4] ;dolzina zvoka: dva bajta iz .WAV max 64kB LDRB R2,[LR,#5] ADD R1,R1,R2,LSL#8 SUBS R1,R1,#46 ;odstej 30 bajtov glave MOVMI R1,#0 LDR R0,=ZSTEVEC ;dolzina zvoka v (ZSTEVEC) STR R1,[R0] LDR PC,[SP],#4 LTORG GOVOR3 B ZVOK0 ;" 0" tabela zvokov v .WAV obliki B ZVOKH ;" 0.5" B ZVOK1 ;" 1" B ZVOK1H ;" 1.5" B ZVOK2 ;" 2" B ZVOK3 ;" 3" B ZVOK4 ;" 4" B ZVOK5 ;" 5" B ZVOK6 ;" 6" ;8 B ZVOK7 ;" 7" B ZVOK8 ;" 8" B ZVOK9 ;" 9" B ZVOK10 ;" 10" B ZVOK10 ;" 11" B ZVOK12 ;" 12" B ZVOK12 ;" 13" B ZVOK12 ;" 14" ;16 B ZVOK15 ;" 15" B ZVOK15 ;" 16" B ZVOK15 ;" 17" B ZVOK15 ;" 19" B ZVOK20 ;" 20" B ZVOK20 ;" 22" B ZVOK20 ;" 24" B ZVOK25 ;" 26" ;24 B ZVOK25 ;" 28" B ZVOK30 ;" 30" B ZVOK30 ;" 32" B ZVOK30 ;" 35" B ZVOK30 ;" 37" B ZVOK40 ;" 40" B ZVOK40 ;" 42" B ZVOK40 ;" 45" ;32 B ZVOK40 ;" 47" B ZVOK50 ;" 50" B ZVOK50 ;" 52" B ZVOK50 ;" 55" B ZVOK50 ;" 57" B ZVOK60 ;" 60" B ZVOK60 ;" 65" B ZVOK60 ;" 70" ;40 B ZVOK60 ;" 75" B ZVOK80 ;" 80" B ZVOK80 ;" 85" B ZVOK80 ;" 90" B ZVOK80 ;" 95" B ZVOK100 ;" 100" B ZVOK100 ;" 105" B ZVOK100 ;" 110" ;48 B ZVOK100 ;" 115" B ZVOK120 ;" 120" B ZVOK120 ;" 125" B ZVOK120 ;" 130" B ZVOK120 ;" 140" B ZVOK150 ;" 150" B ZVOK150 ;" 160" B ZVOK150 ;" 170" ;56 B ZVOK150 ;" 175" B ZVOK150 ;" 180" B ZVOK150 ;" 190" B ZVOK200 ;" 200" B ZVOK200 ;" 210" B ZVOK200 ;" 220" B ZVOK200 ;" 230" B ZVOK250 ;" 250" ;64 B ZVOK250 ;" 260" B ZVOK250 ;" 270" B ZVOK250 ;" 280" B ZVOK300 ;" 300" B ZVOK300 ;" 310" B ZVOK300 ;" 330" B ZVOK350 ;" 350" B ZVOK350 ;" 370" ;72 B ZVOK350 ;" 380" B ZVOK400 ;" 400" B ZVOK400 ;" 420" B ZVOK450 ;" 450" B ZVOK450 ;" 470" B ZVOK500 ;" 500" B ZVOK500 ;" 520" B ZVOK500 ;" 550" ;80 B ZVOK500 ;" 570" B ZVOKN ;" 600" B ZVOKN ;" 630" B ZVOKN ;" 660" B ZVOKN ;" 700" B ZVOKN ;" 730" B ZVOKN ;" 770" B ZVOKN ;" 800" ;88 B ZVOKN ;" 850" B ZVOKN ;" 900" B ZVOKN ;" 950" B ZVOKN ;"1000" B ZVOKN ;"1050" B ZVOKN ;"1100" B ZVOKN ;"1150" B ZVOKN ;"1200" ;96 B ZVOKN ;"1250" B ZVOKN ;"1300" B ZVOKN ;"1350" B ZVOKN ;"1400" B ZVOKN ;"1450" B ZVOKN ;"1500" B ZVOKN ;"1600" B ZVOKN ;"1700" ;104 B ZVOKN ;"1800" B ZVOKN ;"1900" B ZVOKN ;"2000" B ZVOKN ;"2100" B ZVOKN ;"2200" B ZVOKN ;"2300" B ZVOKN ;"2400" B ZVOKN ;"2500" ;112 B ZVOKN ;"2700" B ZVOKN ;"2800" B ZVOKN ;"3000" B ZVOKN ;"3100" B ZVOKN ;"3200" B ZVOKN ;"3400" B ZVOKN ;"3600" B ZVOKN ;"3800" ;120 B ZVOKN ;"4000" B ZVOKN ;"4200" B ZVOKN ;"4400" B ZVOKN ;"4600" B ZVOKN ;"4800" B ZVOKN ;"5000" B ZVOKN ;"----" ;127 neveljavno ZVOK0 BL GOVOR1 ;naslovi .WAV zvokovnih zapisov INCBIN ZVOK0.WAV ALIGN ZVOKH BL GOVOR1 INCBIN ZVOKH.WAV ALIGN ZVOK1 BL GOVOR1 INCBIN ZVOK1.WAV ALIGN ZVOK1H BL GOVOR1 INCBIN ZVOK1H.WAV ALIGN ZVOK2 BL GOVOR1 INCBIN ZVOK2.WAV ALIGN ZVOK3 BL GOVOR1 INCBIN ZVOK3.WAV ALIGN ZVOK4 BL GOVOR1 INCBIN ZVOK4.WAV ALIGN ZVOK5 BL GOVOR1 INCBIN ZVOK5.WAV ALIGN ZVOK6 BL GOVOR1 INCBIN ZVOK6.WAV ALIGN ZVOK7 BL GOVOR1 INCBIN ZVOK7.WAV ALIGN ZVOK8 BL GOVOR1 INCBIN ZVOK8.WAV ALIGN ZVOK9 BL GOVOR1 INCBIN ZVOK9.WAV ALIGN ZVOK10 BL GOVOR1 INCBIN ZVOK10.WAV ALIGN ZVOK12 BL GOVOR1 INCBIN ZVOK12.WAV ALIGN ZVOK15 BL GOVOR1 INCBIN ZVOK15.WAV ALIGN ZVOK20 BL GOVOR1 INCBIN ZVOK20.WAV ALIGN ZVOK25 BL GOVOR1 INCBIN ZVOK25.WAV ALIGN ZVOK30 BL GOVOR1 INCBIN ZVOK30.WAV ALIGN ZVOK40 BL GOVOR1 INCBIN ZVOK40.WAV ALIGN ZVOK50 BL GOVOR1 INCBIN ZVOK50.WAV ALIGN ZVOK60 BL GOVOR1 INCBIN ZVOK60.WAV ALIGN ZVOK80 BL GOVOR1 INCBIN ZVOK80.WAV ALIGN ZVOK100 BL GOVOR1 INCBIN ZVOK100.WAV ALIGN ZVOK120 BL GOVOR1 INCBIN ZVOK120.WAV ALIGN ZVOK150 BL GOVOR1 INCBIN ZVOK150.WAV ALIGN ZVOK200 BL GOVOR1 INCBIN ZVOK200.WAV ALIGN ZVOK250 BL GOVOR1 INCBIN ZVOK250.WAV ALIGN ZVOK300 BL GOVOR1 INCBIN ZVOK300.WAV ALIGN ZVOK350 BL GOVOR1 INCBIN ZVOK350.WAV ALIGN ZVOK400 BL GOVOR1 INCBIN ZVOK400.WAV ALIGN ZVOK450 BL GOVOR1 INCBIN ZVOK450.WAV ALIGN ZVOK500 BL GOVOR1 INCBIN ZVOK500.WAV ALIGN ZVOKR BL GOVOR1 ;zacetni govor INCBIN ZVOKR.WAV ALIGN ZVOKN MOV LR,#0 ;nicno sporocilo B GOVOR1 ;*** Logaritemska visina v (VISINA) *** (R0-4) ALIGN 16 SPACE 4 LOGVIS LDR R1,=RNASLOV MOV R2,#127 ;zanka po rezultatih navzdol MOV R3,#0 LOGVIS1 LDR R4,[R1,R2,LSL#2] CMP R4,R3 MOVCS R3,R4 ;max v R3 MOVCS R0,R2 ;lega v R0 SUBS R2,R2,#1 BPL LOGVIS1 CMP R3,#8192 ;preveri jakost maksimuma MOVCC R0,#127 LDR R1,=VISINA ;shrani v pomnilnik (4 bajti) STR R0,[R1] BX LR LTORG ;*** Omejevalnik impulznih motenj *** (R0-5) ALIGN 16 SPACE 4 LIMIT LDR R0,=0x3FFFC037 ;FIO1PIN3 preveri P1.31=/TRST LDRB R1,[R0] TST R1,#0x80 BXNE LR LDR R0,=LNASLOV ;pobrisi histogram MOV R1,#0 MOV R2,#512 LIMIT1 STR R1,[R0],#4 SUBS R2,R2,#1 BNE LIMIT1 LDR R0,=ANASLOV ;izracunaj histogram LDR R1,=LNASLOV MOV R2,#3072 LIMIT2 LDRH R3,[R0],#2 MOV R3,R3,LSR#6 MOV R3,R3,LSL#1 LDRH R4,[R1,R3] ADD R4,R4,#1 STRH R4,[R1,R3] SUBS R2,R2,#1 BNE LIMIT2 MOV R5,#100 ;nastavi mejo stevila vzorcev v R5 LDR R0,=LNASLOV ;poisci spodnjo mejo v R2 MOV R1,#0 MOV R2,#-0x40 LIMIT3 LDRH R4,[R0],#2 ADD R1,R1,R4 ADD R2,R2,#0x40 CMP R1,#100 BCC LIMIT3 LDR R0,=LNASLOV ;poisci gornjo mejo v R3 ADD R0,R0,#2048 MOV R1,#0 MOV R3,#0x10000 LIMIT4 LDRH R4,[R0,#-2]! ADD R1,R1,R4 SUB R3,R3,#0x40 CMP R1,#100 BCC LIMIT4 SUB R0,R3,R2 ;razsiri meje na 150% SUBS R2,R2,R0,LSR#2 MOVMI R2,#0 ADD R3,R3,R0,LSR#2 LDR R0,=ANASLOV ;omejevanje vpisa v ANASLOV MOV R1,#3072 LIMIT5 LDRH R4,[R0] CMP R4,R2 ;zamenjaj s spodnjo mejo? MOVCC R4,R2 CMP R4,R3 ;zamenjaj z zgornjo mejo? MOVCS R4,R3 STRH R4,[R0],#2 SUBS R1,R1,#1 BNE LIMIT5 BX LR LTORG ;*** Eksponentno povprecenje rezultata *** (R0-5) ALIGN 16 EXPOVP LDR R0,=0x3FFFC037 ;precitaj eksponent iz FIO1PIN3 LDRB R1,[R0] MOV R5,#0 TST R1,#0x10 ;P1.28=TDI obrnjeni bit 0 ORREQ R5,R5,#1 TST R1,#0x40 ;P1.30=TMS obrnjeni bit 1 ORREQ R5,R5,#2 TST R1,#0x20 ;P1.29=TCK obrnjeni bit 2 ORREQ R5,R5,#4 LDR R0,=MNASLOV ;zanka povprecenja po vseh rezultatih LDR R1,=RNASLOV MOV R2,#128 EXPOVP1 LDR R3,[R0],#4 LDR R4,[R1] BIC R4,R4,#0x80000000 SUB R3,R3,R4 ADD R4,R4,R3,ASR R5 STR R4,[R1],#4 SUBS R2,R2,#1 BNE EXPOVP1 BX LR LTORG ;*** Zacetek programa po resetu *** (R0,R1) ZACNI LDR SP,=STACK ;inicializiraj SP LDR R0,=0xE01FC0C4 ;PCONP vklop napajanja interfaceov LDR R1,=0x00001012 ;TIMER0,UART1,ADC0 STR R1,[R0] BL MAM ;inicializiraj MAM v LPC2148 BL GPIO ;inicializiraj GPIO v LPC2148 BL PLL0 ;inicializiraj PLL0 v LPC2148 BL FFTTAB ;tabela faznih zasukov FFT LDR R0,=ZSTEVEC ;stevec vzorcev zvoka v zapisu MOV R1,#0 STR R1,[R0] LDR R0,=OSTEVEC ;stevec oddaje UART1 MOV R1,#0 STR R1,[R0] BL TIMER0 ;nastavi 8kHz prekinitve TIMER0 v LPC2148 BL UART1 ;inicializiraj UART1 v LPC2148 BL IRQON ;vkljuci prekinitve IRQ (DAC) LDR R0,=STANJE ;zacetno stanje izvajanja meritev MOV R1,#0 STRB R1,[R0] BL ADC0 ;nastavi 340/85kHz prekinitve ADC0 v LPC2148 BL AZACNI ;vkljuci prekinitve FIQ za A/D v ARM LDR R0,=VISINA ;visina za zacetno govorno sporocilo MOV R1,#0xFF STR R1,[R0] LDR R0,=GCAKAJ ;brez cakanja na zacetku MOV R1,#0 STR R1,[R0] BL GOVOR ;zacetni govor LDR R0,=MNASLOV ;pobrisi zacetne rezultate LDR R1,=RNASLOV MOV R2,#128 MOV R3,#0 ZACNI1 STR R3,[R0],#4 STR R3,[R1],#4 SUBS R2,R2,#1 BNE ZACNI1 B ZANKA LTORG ;*** Glavna zanka programa *** (R0,R1,R8) ZANKA MOV R0,#1 ;zaporedje meritev 1,0,2,0,3,0 v R0 BL ZANKA1 MOV R0,#0 BL ZANKA1 MOV R0,#2 BL ZANKA1 MOV R0,#0 BL ZANKA1 MOV R0,#3 BL ZANKA1 MOV R0,#0 BL ZANKA1 B ZANKA LTORG ZANKA1 STR R14,[SP,#-4]! ;resi link STR R0,[SP,#-4]! ;resi naslednjo meritev (R0) BL ACAKAJ ;pocakaj konec delovanja A/D LDR R0,=0x3FFFC036 ;nastavi zago naslednje meritve V FIO1PIN2 LDR R1,[SP] STRB R1,[R0] BL LIMIT ;omejevalnik impulznih motenj BL ADCFFT ;podatki iz A/D v FFT BL AZACNI ;vkljuci prekinitve FIQ za A/D v ARM BL FFTMET ;FFT metuljcki za 2048 tock LDR R0,=STANJE ;stara meritev v (R1) LDR R1,[R0] LDR R2,[SP],#4 ;nova meritev v (STANJE) STR R2,[R0] LDR R8,=MNASLOV ;izracunaj polozaj stare meritve v rezultatu AND R1,R1,#3 ADD R8,R8,R1,LSL#7 BL FFTLOG ;utezeni log spekter v 32 oken (R8) BL EXPOVP ;eksponentno povprecenje rezultata BL LOGVIS ;logaritemska visina v (VISINA) BL ODDAJA ;RS-232 oddaja UART1 BL GOVOR ;govor iz zvocnih zapisov .WAV 8bit/8kHz/mono LDR PC,[SP],#4 LTORG ;*** Konec delovanja zbirnika ARM *** END