;*** VOR+LOC RX s stiristevilcnim LCDjem - S53MV - 29/12/2004 *** ;*** Uporaba vrat PICa 16F84 *** ;VOR vhod REF=RA0 ;VOR vhod PHI=RA1 ;neuporabljen izhod RA2 ;I2C vodilo: SCL=RA3, SDA=RA4 ;BACKPLANE=RB0 ;STROBE=RB1 ;DATA=RB2 ;CLOCK=RB3 ;tipka DESNO=RB4 ;tipka DOL=RB5 ;tipka GOR=RB6 ;tipka LEVO=RB7 ;*** Uporaba vrat TSA5512 ** ;VOLUME 3-bit D/A: P0-3 (2+3 vzporedno) ;SQUELCH izhod: P4 ;LOC 150Hz vhod: P5 ;S-METER A/D vhod: P6 ;LOC 90Hz vhod: P7 ;*** Uporaba RAMa *** ;0C LCDBIT, TXI2C, RXI2C, PRIKAZ, CHKxxx, ILSLOC ;0D LCDDAT, CAKAJ, TXI2C, RXI2C, PRIKAZ, CHKxxx, ILSLOC ;0E LCDDAT oscilator za BACKPLANE in utripanje stevilk ;0F TIPKE spomin prejsnjega stanja ;10,11,12,13 LCDDAT vsebina zaslona ;14,15 MODULO deljenja PLLja ;16 STANJE iz TSA5512 ;17 VRATA za TSA5512 ;18,19 rezultat meritve (negativen je neveljaven) RADIAL, ILSLOC ;1A,1B povprecenje rezultata meritve radiala AVGRAD ;1C,1D,1E,1F 32-bitni stevec RADIALx, CHKxxx, racunanje ILSLOC ;20 stevilka spomina TIPKE, MEJE ;21,22,23,24 frekvenca TIPKE, MEJE ;25 squelch TIPKE, MEJE ;26 volume TIPKE, MEJE ;27 meritev TIPKE, MEJE, MERIVL ;28 OBS avtomat TIPKE, MEJE ;29 OBS nastavitev TIPKE, MEJE ;2A,2B OBS MEJE ;*** Zacetek programa, inicializacije *** LIST P=16F84 ORG 0 CALL INIPIC ;inicializacija vrat PICa CLRF 20 ;zacetni kazalec CLRF 28 ;resetiraj OBS avtomat CLRF 29 ;resetiraj OBS nastavitev CALL RMEM ;zacetni spomin GOTO GLAVNI ;*** Glavna zanka programa *** GLAVNI CALL STANJE ;precitaj stanje TSA5512 CALL MEJE ;preveri meje spremenljivk CALL MODULO ;izracunaj modulo PLLja CALL VRATA ;izracunaj vrednosti vrat CALL CMDI2C ;nastavi modulo in vrata TSA5512 CALL PRIKAZ ;priprava podatkov prikaza CALL UNLOCK ;preveri delovanje TSA5512 CALL LCDDAT ;poslji podatke v pomikalni register CALL MERIVL ;meritev radiala ali loc (+zakasnitev) CALL TIPKE ;izvedi ukaz s tipk GOTO GLAVNI ;*** Precitaj frekvenco, squelch in volume iz EEPROMa *** RMEM CALL MEJE ;preveri meje spremenljivk CALL KMEM ;doloci kazalce za prepisovanje CALL RMEM1 ;precitaj 4 bajte frekvence CALL RMEM1 CALL RMEM1 CALL RMEM1 CLRF 9 ;squelch in volume na zacetku EEPROMa CALL RMEM1 ;precitaj squelch CALL RMEM1 ;precitaj volume MOVLW 3 ;preskoci zastavice ADDWF 4,1 CALL RMEM1 ;precitaj OBS CALL RMEM1 MOVLW 20 ;kazalec v RAMu MOVWF 4 RETURN RMEM1 BSF 3,5 ;postavi PAGE1 - precitaj bajt in povecaj stevca BSF 8,0 ;EECON1 RD BCF 3,5 ;postavi PAGE0 MOVF 8,0 MOVWF 0 INCF 4,1 ;povecaj stevca INCF 9,1 RETURN ;*** Doloci kazalce za prepisovanje EEPROMa *** KMEM MOVF 20,0 ;kazalec v EEPROMu MOVWF 9 ;pomnozi kazalec s 4 ADDWF 9,0 MOVWF 9 ADDWF 9,1 MOVLW 4 ;pristej 4 kazalcu - preskoci squelch, volume in OBS ADDWF 9,1 MOVLW 21 ;kazalec v RAMu MOVWF 4 RETURN ;*** Vpisi frekvenco, squelch in volume v EEPROM *** WMEM CALL MEJE ;preveri meje spremenljivk CALL KMEM ;doloci kazalce za prepisovanje CALL WMEM1 ;vpisi 4 bajte frekvence CALL WMEM1 CALL WMEM1 CALL WMEM1 CLRF 9 ;squelch in volume na zacetku EEPROMa CALL WMEM1 ;vpisi squelch CALL WMEM1 ;vpisi volume MOVLW 3 ;preskoci zastavice ADDWF 4,1 CALL WMEM1 ;vpisi OBS CALL WMEM1 MOVLW 20 ;kazalec v RAMu MOVWF 4 RETURN WMEM1 BSF 3,5 ;postavi PAGE1 - primerjaj vsebino EEPROMa BSF 8,0 ;EECON1 RD BCF 3,5 ;postavi PAGE0 MOVF 8,0 SUBWF 0,0 BTFSC 3,2 GOTO WMEM3 MOVF 0,0 ;razlika - vpisi novo vsebino v EEPROM MOVWF 8 BSF 3,5 ;postavi PAGE1 BCF 8,3 ;EECON1 WRERR reset BSF 8,2 ;EECON1 WREN set MOVLW 55 MOVWF 9 ;EECON2 55 MOVLW 0AA MOVWF 9 ;EECON2 0AA BSF 8,1 ;EECON1 WR WMEM2 BTFSS 8,4 ;EECON1 EEIF test GOTO WMEM2 BCF 8,4 ;EECON1 EEIF reset BCF 8,2 ;EECON1 WREN reset BCF 3,5 ;postavi PAGE0 WMEM3 INCF 4,1 ;povecaj stevca INCF 9,1 RETURN ;*** Prikaz frekvence (21,22,23,24) ali volume (25) + squelch (26) ali *** ;*** spomina (20) ali rezultata (18,19) *** (10,11,12,13) PRIKAZ CLRF 10 ;pobrisi zaslon CLRF 11 CLRF 12 CLRF 13 MOVLW 0DB ;meja za prikaz spomina/frekvence? ADDWF 4,0 BTFSC 3,0 GOTO PRIKAZ3 ADDLW 5 ;prikazi stevilko spomina? BTFSC 3,2 COMF 6,0 ;poglej tipka pritisnjena? ANDLW 0F0 BTFSC 3,2 GOTO PRIKAZ1 MOVF 20,0 ;izpis stevilke spomina na prvo stevilko CALL LCDDEK MOVWF 10 RETURN PRIKAZ1 MOVF 21,0 ;prva stevilka frekvence - izpis frekvence CALL LCDDEK MOVWF 10 MOVF 22,0 ;druga stevilka frekvence CALL LCDDEK MOVWF 11 MOVF 23,0 ;tretja stevilka frekvence CALL LCDDEK MOVWF 12 MOVF 24,0 ;cetrta stevilka frekvence pomnozena z 2.5 ADDWF 24,0 BTFSC 24,1 ADDLW 1 CALL LCDDEK MOVWF 13 BTFSS 0E,4 ;utripanje stevilke, ki se jo nastavlja gor/dol? GOTO PRIKAZ2 MOVLW 21 SUBWF 4,0 ;prvi znak? BTFSC 3,2 CLRF 10 ADDLW 0FF ;drugi znak? BTFSC 3,2 CLRF 11 ADDLW 0FF ;tretji znak? BTFSC 3,2 CLRF 12 ADDLW 0FF ;cetrti znak? BTFSC 3,2 CLRF 13 PRIKAZ2 BSF 11,0 ;decimalna pika za drugo stevilko RETURN PRIKAZ3 ADDLW 0FE ;meja za prikaz squelch/volume? BTFSC 3,0 GOTO PRIKAZ5 MOVF 16,0 ;prva stevilka S-meter ANDLW 7 SUBLW 4 CALL LCDDEK MOVWF 10 MOVF 25,0 ;squelch CALL LCDDEK MOVWF 11 MOVF 26,0 ;volume CALL LCDDEK MOVWF 13 BTFSS 0E,4 ;utripanje stevilke, ki se jo nastavlja gor/dol? GOTO PRIKAZ4 MOVLW 25 SUBWF 4,0 ;drugi znak? BTFSC 3,2 CLRF 11 ADDLW 0FF ;cetrti znak? BTFSC 3,2 CLRF 13 PRIKAZ4 RETURN PRIKAZ5 BTFSC 27,0 ;meritev VOR ali LOC? GOTO CDILCD ;prikaz LOC CDI ADDLW 0FF ;prikaz VOR CDI? BTFSC 3,2 GOTO CDILCD ADDLW 0FF ;prikaz VOR OBS? BTFSC 3,2 GOTO PRIKAZ6 MOVLW 0F0 ;narisi "stopinje" za VOR radial MOVWF 13 GOTO RADLCD ;prikaz VOR radial PRIKAZ6 MOVF 2A,0 ;prepisi OBS iz (2A,2B) v (18,19) MOVWF 18 MOVF 2B,0 MOVWF 19 MOVLW 0DA ;utripaj "H" za VOR OBS BTFSS 0E,3 MOVWF 13 GOTO RADLCD ;prikaz VOR OBS ;*** Prikazi radial na LCDju, negativen neveljaven *** (0C,0D,10,11,12) RADLCD BTFSC 18,7 ;preveri veljavnost rezultata? RETURN MOVF 19,0 MOVWF 0D MOVLW 64 ;izracunaj in prikazi stotice radiala CLRF 0C RADLCD1 INCF 0C,1 SUBWF 0D,1 BTFSC 3,0 GOTO RADLCD1 BTFSS 18,0 GOTO RADLCD3 RADLCD2 INCF 0C,1 SUBWF 0D,1 BTFSC 3,0 GOTO RADLCD2 RADLCD3 ADDWF 0D,1 DECF 0C,0 CALL LCDDEK MOVWF 10 MOVLW 0A ;izracunaj in prikazi desetice radiala CLRF 0C RADLCD4 INCF 0C,1 SUBWF 0D,1 BTFSC 3,0 GOTO RADLCD4 ADDWF 0D,1 DECF 0C,0 CALL LCDDEK MOVWF 11 MOVF 0D,0 ;izracunaj in prikazi enice radiala CALL LCDDEK MOVWF 12 RETURN ;*** Prikazi CDI za rezultat (18,19) na LCDju *** (0C,0D,10,11,12,13) CDILCD MOVF 18,0 ;prepisi rezultat v (0C,0D) MOVWF 0C MOVF 19,0 MOVWF 0D BTFSS 0C,7 ;preveri veljavnost rezultata? GOTO CDILCD1 BTFSS 0E,3 ;zmigaj levo in desno piko za neveljavno BSF 10,0 BTFSC 0E,3 BSF 12,0 RETURN CDILCD1 BSF 11,0 ;prizgi sredinsko piko BSF 13,0 ;prizgi sredinsko dvopicje BTFSC 0C,6 ;CDI ze izracunan za LOC? GOTO CDILCD5 BCF 13,0 ;ugasni sredinsko dvopicje MOVF 2B,0 ;odstej OBS (2A,2B) SUBWF 0D,1 BTFSS 3,0 DECF 0C,1 MOVF 2A,0 SUBWF 0C,1 MOVLW 5A ;odstej 90=$5A SUBWF 0D,1 BTFSS 3,0 DECF 0C,1 CDILCD2 BTFSS 0C,7 ;pristevaj 360=$168 do pozitivnega rezultata GOTO CDILCD3 MOVLW 68 ADDWF 0D,1 BTFSC 3,0 INCF 0C,1 INCF 0C,1 GOTO CDILCD2 CDILCD3 MOVLW 0B4 ;odstej 180=$B4 SUBWF 0D,1 BTFSS 3,0 DECF 0C,1 BTFSS 0C,7 ;obrni predznak za negativen rezultat GOTO CDILCD4 COMF 0D,1 INCF 0D,1 BCF 11,0 ;ugasni sredinsko piko BSF 13,0 ;prizgi sredinsko dvopicje CDILCD4 MOVLW 5A ;odstej 90=$5A SUBWF 0D,1 CDILCD5 MOVF 0D,0 ;prikazi CDI - razlika nic? BTFSC 3,2 RETURN BTFSC 0D,7 ;predznak rezultata? GOTO CDILCD6 BSF 11,1 ;prikazi pozitivne palcke rastejo levo gor DECF 0D,1 BTFSC 3,2 RETURN BSF 11,4 DECF 0D,1 BTFSC 3,2 RETURN BSF 11,3 DECF 0D,1 BTFSC 3,2 RETURN BSF 11,6 DECF 0D,1 BTFSC 3,2 RETURN BSF 10,1 DECF 0D,1 BTFSC 3,2 RETURN BSF 10,4 DECF 0D,1 BTFSC 3,2 RETURN BSF 10,3 DECF 0D,1 BTFSC 3,2 RETURN BSF 10,6 DECF 0D,1 BTFSC 3,2 RETURN BSF 11,7 ;prizgi srednje leve palcke za preveliko BSF 10,7 RETURN CDILCD6 BSF 12,3 ;prikazi negativne palcke rastejo desno gor INCF 0D,1 BTFSC 3,2 RETURN BSF 12,6 INCF 0D,1 BTFSC 3,2 RETURN BSF 12,1 INCF 0D,1 BTFSC 3,2 RETURN BSF 12,4 INCF 0D,1 BTFSC 3,2 RETURN BSF 13,3 INCF 0D,1 BTFSC 3,2 RETURN BSF 13,6 INCF 0D,1 BTFSC 3,2 RETURN BSF 13,1 INCF 0D,1 BTFSC 3,2 RETURN BSF 13,4 INCF 0D,1 BTFSC 3,2 RETURN BSF 12,7 ;prizgi srednje desne palcke za premajhno BSF 13,7 RETURN ;*** Preveri prisotnost TSA5512 in uklenitev PLLja *** UNLOCK MOVF 16,0 ;prisotnost TSA5512 in uklenitev PLLja XORLW 40 ANDLW 0C0 BTFSC 3,2 RETURN BSF 10,0 ;vkljuci vse decimalne pike na LCDju BSF 11,0 BSF 12,0 RETURN ;*** Preveri meje kazalca, spomina, frekvence, volume, squelch *** MEJE MOVLW 0E0 ;spodnja meja kazalca ADDWF 4,1 BTFSS 3,0 CLRF 4 SUBWF 4,1 MOVLW 0D7 ;gornja meja kazalca za VOR BTFSC 27,0 MOVLW 0D9 ;gornja meja kazalca za LOC ADDWF 4,1 BTFSC 3,0 CLRF 4 SUBWF 4,1 MOVLW 0E ;meje spomina BTFSC 20,7 MOVWF 20 MOVLW 0F1 ADDWF 20,1 BTFSS 3,0 SUBWF 20,1 BTFSS 24,7 ;spodnja meja cetrte (zadnje) stevilke frekvence (25kHz) GOTO MEJE1 MOVLW 3 MOVWF 24 DECF 23,1 ;prenos: znizaj tretjo stevilko MEJE1 MOVLW 4 ;gornja meja cetrte (zadnje) stevilke frekvence (25kHz) SUBWF 24,0 BTFSS 3,0 GOTO MEJE2 CLRF 24 INCF 23,1 ;prenos: zvisaj tretjo stevilko MEJE2 BTFSS 23,7 ;spodnja meja tretje stevilke frekvence (100kHz) GOTO MEJE3 MOVLW 9 MOVWF 23 DECF 22,1 ;prenos: znizaj drugo stevilko MEJE3 MOVLW 0A ;gornja meja tretje stevilke frekvence (100kHz) SUBWF 23,0 BTFSS 3,0 GOTO MEJE4 CLRF 23 INCF 22,1 ;prenos: zvisaj drugo stevilko MEJE4 BTFSS 22,7 ;spodnja meja druge stevilke frekvence (1MHz) GOTO MEJE5 MOVLW 9 MOVWF 22 DECF 21,1 ;prenos: znizaj prvo stevilko MEJE5 MOVLW 0A ;gornja meja druge stevilke frekvence (1MHz) SUBWF 22,0 BTFSS 3,0 GOTO MEJE6 CLRF 22 INCF 21,1 ;prenos: zvisaj prvo stevilko MEJE6 MOVLW 3 ;meje prve stevilke frekvence (10MHz) ANDWF 21,1 BTFSC 25,7 ;spodnja meja squelch CLRF 25 MOVLW 0FC ;gornja meja squelch ADDWF 25,1 BTFSC 3,0 CLRF 25 SUBWF 25,1 BTFSC 26,7 ;spodnja meja volume CLRF 26 MOVLW 0F8 ;gornja meja volume ADDWF 26,1 BTFSC 3,0 CLRF 26 SUBWF 26,1 BTFSC 27,7 ;spodnja meja meritev VOR radiala CLRF 27 MOVLW 0FF ;gornja meja meritev ILS LOC ADDWF 27,1 BTFSC 3,0 CLRF 27 SUBWF 27,1 MOVF 28,0 ;OBS avtomat? BTFSC 3,2 GOTO MEJE7 MOVF 18,0 ;preveri veljavna meritev, zastavica pocaka!!!!! ANDLW 0C0 BTFSS 3,2 GOTO MEJE7 MOVF 18,0 ;prepisi radial v OBS (2A,2B) MOVWF 2A MOVF 19,0 MOVWF 2B MOVLW 0 ;nobenega popravka za FROM BTFSS 28,7 MOVLW 0B4 ;popravek +180=$B4 za TO ADDWF 2B,1 BTFSC 3,0 INCF 2A,1 CLRF 28 ;pobrisi zastavico OBS avtomata MEJE7 MOVF 29,0 ;OBS nastavitev? BTFSC 3,2 GOTO MEJE8 ADDWF 2B,1 ;pristej zastavice predznaceno k OBS (2A,2B) BTFSC 3,0 INCF 2A,1 BTFSC 29,7 DECF 2A,1 CLRF 29 ;pobrisi zastavico OBS nastavitve MEJE8 BTFSC 2A,7 ;odstevaj 360 do OBS negativen GOTO MEJE9 MOVLW 68 ;odstej 360=$168 od OBS (2A,2B) SUBWF 2B,1 BTFSS 3,0 DECF 2A,1 DECF 2A,1 GOTO MEJE8 MEJE9 BTFSS 2A,7 ;pristevaj 360 do OBS pozitiven RETURN MOVLW 68 ;pristej 360=$168 k OBS (2A,2B) ADDWF 2B,1 BTFSC 3,0 INCF 2A,1 INCF 2A,1 GOTO MEJE9 ;*** Precitaj in izvedi ukaz s tipk *** (0F) TIPKE COMF 6,0 ;precitaj RB4-7 ANDLW 0F0 XORLW 90 ;Vpis v spomin za LEVO+DESNO? BTFSC 3,2 CALL WMEM ;vpisi v spomin COMF 6,0 ;precitaj RB4-7 ANDLW 0F0 MOVF 0F,1 ;prejsnje stanje vse tipke odpuscene? MOVWF 0F BTFSS 3,2 RETURN BTFSS 0F,5 ;Ukaz DOL? GOTO TIPKE1 DECF 0,1 GOTO TIPKE4 TIPKE1 BTFSS 0F,6 ;Ukaz GOR? GOTO TIPKE2 INCF 0,1 GOTO TIPKE4 TIPKE2 BTFSS 0F,4 ;Ukaz DESNO? GOTO TIPKE3 INCF 4,1 RETURN TIPKE3 BTFSS 0F,7 ;Ukaz LEVO? RETURN DECF 4,1 TIPKE4 MOVF 4,0 ;kazalec na spominu? SUBLW 20 BTFSC 3,2 CALL RMEM ;precitaj iz spomina RETURN ;*** Pretvori stevilko v 7-segmentni zapis *** (0C) LCDDEK MOVWF 0C INCF 0C,1 MOVLW 7E ;stevilka 0 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 12 ;stevilka 1 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0BC ;stevilka 2 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0B6 ;stevilka 3 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0D2 ;stevilka 4 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0E6 ;stevilka 5 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0EE ;stevilka 6 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 32 ;stevilka 7 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0FE ;stevilka 8 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0F6 ;stevilka 9 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0FA ;crka A DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0CE ;crka b DECF 0C,1 BTFSC 3,2 RETURN MOVLW 6C ;crka C DECF 0C,1 BTFSC 3,2 RETURN MOVLW 9E ;crka d DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0EC ;crka E DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0A4 ;crtice za napako RETURN ;*** Postavi podatke (10,11,12,13) v LCD pomikalni register *** (0D,0E) LCDDAT MOVF 13,0 ;(13) v pomikalni register MOVWF 0D BTFSS 0E,0 COMF 0D,1 CALL LCDBIT MOVF 12,0 ;(12) v pomikalni register MOVWF 0D BTFSS 0E,0 COMF 0D,1 CALL LCDBIT MOVF 11,0 ;(11) v pomikalni register MOVWF 0D BTFSS 0E,0 COMF 0D,1 CALL LCDBIT MOVF 10,0 ;(10) v pomikalni register MOVWF 0D BTFSS 0E,0 COMF 0D,1 CALL LCDBIT INCF 0E,1 ;obrni fazo za BACKPLANE=RB0 BCF 6,0 BTFSC 0E,0 BSF 6,0 BSF 6,1 ;impulz STROBE=RB1 NOP BCF 6,1 RETURN ;*** Poslji bajt (0D) v LCD pomikalni register *** (0C) LCDBIT MOVLW 8 ;zanka po 8 bitih MOVWF 0C LCDBIT1 BCF 6,2 ;postavi niclo DATA=RB2 RLF 0D,1 ;zavrti register BTFSC 3,0 BSF 6,2 ;postavi enico DATA=RB2 NOP BSF 6,3 ;taktni impulz CLOCK=RB3 NOP BCF 6,3 DECFSZ 0C,1 ;stevec zanke po 8 bitih GOTO LCDBIT1 RETURN ;*** Inicializacija vrat PICa *** INIPIC MOVLW 18 ;zacetno stanje vrat A MOVWF 5 MOVLW 0 ;zacetno stanje vrat B MOVWF 6 BSF 3,5 ;postavi PAGE1 MOVLW 3 ;port A: vhoda RA0-RA1 in izhodi RA2-4 MOVWF 5 ;vpisi TRISA MOVLW 0F0 ;port B: izhodi RB0-3, vhodi RB4-7 MOVWF 6 ;vpisi TRISB BCF 1,7 ;vkljuci /RBPU v OPTION_REG BCF 3,5 ;postavi PAGE0 RETURN ;*** Dvojna zanka cakanja 10ms, ko ne tece meritev *** (0D) CAKAJ MOVLW 96 MOVWF 0D CAKAJ1 CALL CAKAJ2 DECF 0D,1 BTFSS 3,2 GOTO CAKAJ1 RETURN CAKAJ2 MOVLW 14 CAKAJ3 NOP ADDLW 0FF BTFSS 3,2 GOTO CAKAJ3 RETURN ;*** Zacetek komunikacije na I2C vodilu *** ZACI2C BSF 5,4 NOP NOP BSF 5,3 NOP NOP BCF 5,4 NOP NOP BCF 5,3 RETURN ;*** Oddaja bajta iz W na I2C vodilu, potrditev v W *** (0C,0D) TXI2C MOVWF 0C MOVLW 8 MOVWF 0D TXI2C1 BSF 5,4 ;oddaja enega bita podatkov RLF 0C,1 BTFSS 3,0 BCF 5,4 NOP BSF 5,3 ;oddaja taktnega impulza NOP BCF 5,3 DECFSZ 0D,1 ;zanka po 8 podatkovnih bitih GOTO TXI2C1 BSF 5,4 ;oddaja taktnega impulza MOVLW 18 IORWF 5,1 CLRW BTFSC 5,4 ;preveri potrditev sprejema v W MOVLW 0FF BCF 5,3 RETURN ;*** Sprejem bajta na I2C vodilu v W *** (0C,0D) RXI2C MOVLW 8 MOVWF 0D RXI2C1 BSF 5,4 ;sprejem enega bita podatkov MOVLW 18 IORWF 5,1 RLF 0C,1 BCF 0C,0 BTFSC 5,4 BSF 0C,0 BCF 5,3 DECFSZ 0D,1 ;zanka po 8 podatkovnih bitih GOTO RXI2C1 BSF 5,4 ;oddaja taktnega impulza brez potrditve sprejema MOVLW 18 IORWF 5,1 NOP BCF 5,3 MOVF 0C,0 RETURN ;*** Postavi frekvenco in izhodne porte TSA5512 preko I2C *** CMDI2C CALL ZACI2C ;poslji ukaz TSA5512 MOVLW 0C2 CALL TXI2C MOVF 14,0 ;postavi gornji bajt frekvence ANDLW 7F CALL TXI2C MOVF 15,0 ;postavi spodnji bajt frekvence CALL TXI2C MOVLW 8E ;inicializiraj TSA5512 CALL TXI2C MOVF 17,0 ;postavi izhodne porte TSA5512 CALL TXI2C RETURN ;*** Izracunaj vrednost izhodnih vrat TSA5512 *** (17) VRATA CLRF 17 MOVF 26,0 ;precitaj VOL BTFSC 3,2 ;VOL=0 izkljucen? GOTO VRATA1 SUBLW 8 ;obrni polariteto 8-VOL ANDLW 7 IORWF 17,1 BTFSC 17,2 ;ponovi MSB iz P2 na P3 BSF 17,3 MOVF 16,0 ;primerjaj SQL ANDLW 7 ADDWF 25,0 ADDLW 0FB BTFSS 3,0 ;squelch izkljuci NF? GOTO VRATA2 VRATA1 MOVLW 1F ;VOL na min in izklop NF IORWF 17,1 VRATA2 RETURN ;*** Precitaj port TSA5512 v (16) *** (16) STANJE CALL ZACI2C ;precitaj podatke iz TSA5512 MOVLW 0C3 CALL TXI2C CALL RXI2C MOVWF 16 RETURN ;*** Izracunaj modulo deljenja PLLja v (14,15) *** (0C,0D,14,15) MODULO CLRF 14 ;prva stevilka frekvence MOVF 21,0 MOVWF 15 CALL MODULO3 ;pomnozi z 10 CLRF 0C ;druga stevilka frekvence MOVF 22,0 MOVWF 0D CALL MODULO1 ;pristej drugo stevilko CALL MODULO3 ;pomnozi z 10 CLRF 0C ;tretja stevilka frekvence MOVF 23,0 MOVWF 0D CALL MODULO1 ;pristej tretjo stevilko CALL MODULO2 ;pomnozi s 4 CALL MODULO2 CLRF 0C ;cetrta stevilka frekvence MOVF 24,0 MOVWF 0D CALL MODULO1 ;pristej cetrto stevilko MOVLW 10 ;konstanta za 104.250MHz=4170=$104A MOVWF 0C MOVLW 4A MOVWF 0D CALL MODULO1 ;pristej 100MHz+4.25MHz=104.250MHz RETURN MODULO1 MOVF 0C,0 ;pristej (14,15) vsebino (0C,0D) ADDWF 14,1 MOVF 0D,0 ADDWF 15,1 BTFSC 3,0 INCF 14,1 RETURN MODULO2 MOVF 14,0 ;pomnozi (14,15) z 2 ADDWF 14,1 MOVF 15,0 ADDWF 15,1 BTFSC 3,0 INCF 14,1 RETURN MODULO3 CALL MODULO2 ;pomnozi (14,15) z 10 MOVF 14,0 MOVWF 0C MOVF 15,0 MOVWF 0D CALL MODULO2 CALL MODULO2 CALL MODULO1 RETURN ;*** Vklop meritve radial VOR ali ILS LOC *** (18,1C,27) MERIVL MOVLW 0D9 ;vklop meritve? ADDWF 4,0 BTFSC 3,0 GOTO MERIVL1 CALL CAKAJ BSF 18,7 ;zaporedje meritve radiala neveljavno MOVLW 81 MOVWF 1C CLRF 27 ;meritev radiala privzeta! MOVLW 2 ;enice MHz 0,1,8,9? SUBWF 22,0 BTFSS 3,0 ADDLW 0A ADDLW 0FA BTFSS 3,0 RETURN BTFSC 23,0 ;liha stevilka stotic kHz? BSF 27,0 ;nastavi meritev ILSLOC! RETURN MERIVL1 BTFSS 27,0 ;izberi vrsto meritve? GOTO RADIAL GOTO ILSLOC ;*** Meri VOR radial v 18+19 *** (0C,0D,18,19,1C,1D,1E,1F) RADIAL BTFSS 1C,0 ;preveri periodo REF? GOTO RADIAL1 CALL CHKREF BCF 1C,0 BSF 1C,1 RETURN RADIAL1 BTFSS 1C,1 ;preveri periodo PHI? GOTO RADIAL2 BTFSC 1C,7 CALL CAKAJ BTFSS 1C,7 CALL CHKPHI BCF 1C,0 BCF 1C,1 RETURN RADIAL2 BTFSC 1C,7 ;izmeri PHI-REF? CALL CAKAJ BTFSS 1C,7 CALL CHKRAD MOVF 1C,0 ;izmerjeni radial v (18,19) MOVWF 18 MOVF 1D,0 MOVWF 19 CALL AVGRAD ;povprecenje rezultata meritve CLRF 1C BSF 1C,0 RETURN ;*** Preveri periodo REF *** (0C,0D,1C,1D,1E,1F) CHKREF CALL RADIALR ;cakanje na prvi impulz REF CHKREF1 BTFSC 1C,1 ;predolgo cakanje? GOTO CHKERR CALL RADIALS ;stevec casa BTFSS 0C,0 GOTO CHKREF1 CALL RADIALR ;meritev periode REF CHKREF2 BTFSC 1C,1 ;predolgo cakanje? GOTO CHKERR CALL RADIALS ;stevec casa BTFSS 0C,0 GOTO CHKREF2 GOTO CHK360 ;*** Preveri periodo PHI *** (0C,0D,1C,1D,1E,1F) CHKPHI CALL RADIALR ;cakanje na prvi impulz PHI CHKPHI1 BTFSC 1C,1 ;predolgo cakanje? GOTO CHKERR CALL RADIALS ;stevec casa BTFSS 0C,1 GOTO CHKPHI1 CALL RADIALR ;meritev periode PHI CHKPHI2 BTFSC 1C,1 ;predolgo cakanje? GOTO CHKERR CALL RADIALS ;stevec casa BTFSS 0C,1 GOTO CHKPHI2 GOTO CHK360 ;*** Izmeri radial PHI-REF *** (0C,0D,1C,1D,1E,1F) CHKRAD CALL RADIALR ;cakanje na prvi impulz REF CHKRAD1 BTFSC 1C,1 ;predolgo cakanje? GOTO CHKERR CALL RADIALS ;stevec casa BTFSS 0C,0 GOTO CHKRAD1 CALL RADIALR ;meritev zakasnitve PHI-REF CHKRAD2 BTFSC 1C,1 ;predolgo cakanje? GOTO CHKERR CALL RADIALS ;stevec casa BTFSS 0C,1 GOTO CHKRAD2 RETURN ;*** Preveri perioda 360+/-10 stopinj *** (1C) CHK360 DECF 1C,0 ;preveri periodo REF? BTFSS 3,2 GOTO CHKERR MOVLW 5E ;OKNO 360+/-10 SUBWF 1D,0 ADDLW 0EB BTFSS 3,0 RETURN CHKERR BSF 1C,7 ;minus oznaci napako RETURN ;*** Resetiraj 32-bitni stevec 1C+1D+1E+1F in port A komplement v 0D *** RADIALR CLRF 1C ;resetiranje stevca CLRF 1D CLRF 1E CLRF 1F COMF 5,0 ;precitaj port A v W, komplement v 0D MOVWF 0D RETURN ;*** Povecaj 32-bitni stevec 1C+1D+1E+1F in port A komplement v 0D, preskok v 0C *** RADIALS MOVF 1F,0 ;pristevanje konstante (33)F2 vsebini 1F ADDLW 0F2 MOVWF 1F BTFSC 3,0 INCF 1E,1 BTFSC 3,2 INCF 1D,1 BTFSC 3,2 INCF 1C,1 MOVF 1E,0 ;pristevanje konstante 33(F2) vsebini 1E ADDLW 33 MOVWF 1E BTFSC 3,0 INCF 1D,1 BTFSC 3,2 INCF 1C,1 COMF 0D,0 ;premakni komplement 0D v 0C MOVWF 0C COMF 5,0 ;precitaj port A komplement v W in 0D MOVWF 0D ANDWF 0C,1 ;(W AND 0C) v 0C RETURN ;*** Povpreci vrednost radiala (18,19) v (1A,1B) 2^N=16 *** (0C,0D,18,19,1A,1B) AVGRAD BTFSC 18,7 ;rezultat meritve v (18,19) veljaven? RETURN CALL AVGD2N ;deli povprecje (1A,1B)/2^N, N=4 MOVF 0C,0 ;odstej od (18,19) SUBWF 18,1 MOVF 0D,0 SUBWF 19,1 BTFSS 3,0 DECF 18,1 DECF 18,1 ;odstej 360 stopinj ($168) od razlike (18,19) MOVLW 68 SUBWF 19,1 BTFSS 3,0 DECF 18,1 AVGRAD1 MOVF 18,0 ;razlika (18,19) manjsa od -180 stopinj? MOVWF 0C MOVF 19,0 ADDLW 0B4 BTFSC 3,0 INCF 0C,1 BTFSS 0C,7 GOTO AVGRAD2 INCF 18,1 ;pristej 360 stopinj ($168) razliki (18,19) MOVLW 68 ADDWF 19,1 BTFSC 3,0 INCF 18,1 GOTO AVGRAD1 AVGRAD2 MOVF 18,0 ;pristej razliko (18,19) povprecju (1A,1B) ADDWF 1A,1 MOVF 19,0 ADDWF 1B,1 BTFSC 3,0 INCF 1A,1 MOVLW 16 ;odstej 2^N*360 stopinj ($1680) od povprecja (1A,1B) SUBWF 1A,1 MOVLW 80 SUBWF 1B,1 BTFSS 3,0 DECF 1A,1 AVGRAD3 BTFSS 1A,7 ;povprecje (1A,1B) negativno? GOTO AVGRAD4 MOVLW 16 ;pristej 2^N*360 stopinj ($1680) povprecju (1A,1B) ADDWF 1A,1 MOVLW 80 ADDWF 1B,1 BTFSC 3,0 INCF 1A,1 GOTO AVGRAD3 AVGRAD4 CALL AVGD2N ;deli (1A,1B)/2^N, N=4 in rezultat v (18,19) MOVF 0C,0 MOVWF 18 MOVF 0D,0 MOVWF 19 RETURN ;*** Deli (1A,1B)/2^N, N=4 rezultat v (0C,0D) *** (0C,0D) AVGD2N MOVF 1A,0 ;prepisi v (0C,0D) MOVWF 0C MOVF 1B,0 MOVWF 0D MOVLW 4 ;faktor povprecenja 2^N=16 AVGD2N1 BCF 3,0 ;zanka pomika vsebine za eno mesto nazaj RRF 0C,1 RRF 0D,1 ADDLW 0FF BTFSS 3,2 GOTO AVGD2N1 RETURN ;*** Meritev jakosti 90Hz+150Hz *** (0C,0D,18,19,1E,1F) ILSLOC BSF 6,1 ;izprazni kondenzator s STROBE=RB1 CALL CAKAJ BCF 6,1 CLRF 18 CLRF 19 CLRF 1F ILSLOC1 CALL STANJE ;zanka citanja casovnih vhodov P5 in P7 MOVF 1F,0 BTFSS 16,4 ;P5 izmeri jakost 150Hz MOVWF 18 BTFSS 16,5 ;P7 izmeri jakost 90Hz MOVWF 19 INCF 1F,1 BTFSS 3,2 GOTO ILSLOC1 MOVF 18,0 ;jakost/2 vsote signalov 90Hz+150Hz v 0C ADDWF 19,0 MOVWF 0C RRF 0C,1 MOVLW 10 ;odmik nicle detektorjev $10=16 !!!!!!!!!!!!!!!!!!!!! SUBWF 0C,1 BTFSS 3,0 CLRF 0C MOVLW 0E8 ;preveri prag jakosti s konstanto $E8=256-24? ADDWF 0C,0 BTFSC 3,0 GOTO ILSLOC2 BSF 18,7 ;zastavica za neveljaven rezultat v (18) RETURN ILSLOC2 MOVF 19,0 ;izracunaj razliko/2 150Hz-90Hz V (0D) SUBWF 18,0 MOVWF 0D RRF 0D,0 XORLW 80 MOVWF 0D CLRF 18 ;zanka deljenja razlike z jakostjo CLRF 19 CLRF 1E CLRF 1F ILSLOC3 MOVF 0C,0 ;pristevaj jakost (1E,1F) ADDWF 1F,1 BTFSC 3,0 INCF 1E,1 BTFSC 1E,5 GOTO ILSLOC4 MOVF 0D,0 ;pristevaj predznaceno razliko (19,18) ADDWF 18,1 BTFSC 3,0 INCF 19,1 BTFSC 0D,7 DECF 19,1 GOTO ILSLOC3 ILSLOC4 MOVLW 40 ;zastavice za veljaven rezultat ILS LOC v (18) MOVWF 18 RETURN ;*** Nastavi konfiguracijo PICa 16F84 *** ORG 2007 ;naslov konfiguracijske besede DW 1A ;CP=OFF, PWRTE=OFF, WDT=OFF, OSC=HS ;*** Nastavi zacetne vrednosti EEPROMa *** ORG 2100 DW 1 ;SQUELCH=1 DW 2 ;VOLUME=2 DW 1 ;OBS=300 DW 2C DW 1 ;spomin0: 110.000 DW 0 DW 0 DW 0 DW 0 ;spomin1: 109.700 DW 9 DW 7 DW 0 DW 1 ;spomin2: 110.500 DW 0 DW 5 DW 0 DW 1 ;spomin3: 111.250 DW 1 DW 2 DW 2 DW 1 ;spomin4: 112.200 DW 2 DW 2 DW 0 DW 1 ;spomin5: 112.700 DW 2 DW 7 DW 0 DW 1 ;spomin6: 112.900 DW 2 DW 9 DW 0 DW 1 ;spomin7: 113.400 DW 3 DW 4 DW 0 DW 1 ;spomin8: 114.100 DW 4 DW 1 DW 0 DW 1 ;spomin9: 114.200 DW 4 DW 2 DW 0 DW 1 ;spominA: 114.800 DW 4 DW 8 DW 0 DW 1 ;spominB: 115.300 DW 5 DW 3 DW 0 DW 1 ;spominC: 117.800 DW 7 DW 8 DW 0 DW 2 ;spominD: 123.500 DW 3 DW 5 DW 0 DW 3 ;spominE: 130.000 DW 0 DW 0 DW 0 END ;*** Konec programa ***