;*** Letalski sprejemnik z VOR dekoderjem - S53MV - 17/12/2002 *** ;*** Uporaba portov *** ;LCD kontrolni: RS=RB4, R/W=MASA, E=RB5 ;LCD podatki: DB0=DB1=DB2=DB3=MASA, DB4=RB0, DB5=RB1, DB6=RB2, DB7=RB3 ;VOR vhoda: RA0=REF, RA1=PHI ;Tipke: RB0-4 skaniranje, RA2 vhod ;I2C vodilo: SCL=RA3, SDA=RA4 ;VOLUME 3-bit DAC: TSA5512 P0-2 ;SQUELCH izhod: TSA5512 P3 ;S-METER A/D vhod: TSA5512 P6 ;*** Uporaba RAMa *** ;0C UKAZLCD, ZNAKLCD, TXI2C, RXI2C, RADIAL, INIFOVS, MEMFOVS ;0D CAKAJ5, STEVLCD, TXI2C, RXI2C, CDILCD, RADIAL ;0E STEVLCD gornji bajt, FREKI2C, SMETER, CDILCD, RADIAL, AVGRAD ;0F STEVLCD spodnji bajt, FREKI2C, SMETER, CDILCD, RADIAL, AVGRAD ;10 PREKIN resi W ;11 PREKIN resi STATUS ;12 PREKIN stara vrednost enkoderja ;13 PREKIN racunanje ;14 PREKIN stara vrednost premika ;15 FREKLCD, OBSLCD, FREKI2C, CDILCD ;16 STATI2C precitani bajt ;18+19 VOLUME 0-7 ;1A+1B SQUELCH 0-4 ;1C+1D OBS 0-359 stopinj ;1E+1F frekvenca 108-140MHz ;20+21 RADIAL stevec, AVGRAD ;22+23 RADIAL popravek kota ;24+25 AVGRAD povprecje meritve ;2E+2F vpisovanje v prazno ;*** Zacetek programa, tocno 4 ukazi, sledi PREKIN *** LIST P=16F84 ORG 0 MOVLW 0A0 ;konstanta za umerjanje OBS (0B4=180) MOVWF 23 ;LSBYTE CLRF 22 ;MSBYTE=0 GOTO GLAVNI ;*** Prekinitveni program *** (10,11,12,13,14) ORG 4 PREKIN MOVWF 10 ;resi W SWAPF 3,0 ;resi STATUS MOVWF 11 MOVF 12,0 ;prestavi staro (12) v (13) MOVWF 13 MOVF 6,0 ;precitaj port B v (12) MOVWF 12 BTFSC 12,7 ;izracunaj premik koracnega enkoderja XORLW 40 MOVWF 12 ANDLW 0C0 SUBWF 13,1 BTFSS 13,6 ;premik obstaja? GOTO PREKIN1 MOVLW 1 ;doloci smer popravka stevca BTFSS 13,7 MOVLW 0FF ADDWF 14,1 ;zakasni obrat smeri, izloci napake (14) MOVWF 14 BTFSC 3,2 GOTO PREKIN1 INCF 4,1 ;popravi 16-bitni stevec (FSR,FSR+1) ADDWF 0,1 DECF 4,1 MOVWF 13 MOVF 3,0 BTFSC 13,7 XORLW 1 MOVWF 3 MOVF 13,0 BTFSC 3,0 ADDWF 0,1 PREKIN1 BCF 0B,0 ;resetiraj RBIF SWAPF 11,0 ;obnovi STATUS MOVWF 3 SWAPF 10,1 ;obnovi W SWAPF 10,0 RETFIE ;*** Inicializacija portov *** INIPORT MOVLW 18 ;zacetno stanje porta A MOVWF 5 MOVLW 0 ;zacetno stanje porta B MOVWF 6 BSF 3,5 ;postavi PAGE1 MOVLW 7 ;port A: vhodi RA0-2 in izhoda RA3-4 MOVWF 5 ;vpisi TRISA MOVLW 0C0 ;port B: izhodi RB0-5, vhoda RB6-7 MOVWF 6 ;vpisi TRISB BCF 3,5 ;postavi PAGE0 BCF 0B,0 ;resetiraj RBIF BSF 0B,3 ;vklopi RBIE BSF 0B,7 ;vklopi GIE RETURN ;*** Inicializacija frekvence, OBS, SQUELCH, VOLUME *** (0C) INIFOVS MOVLW 18 ;kazalec v RAMu MOVWF 4 MOVLW 0 ;kazalec v EEPROMu MOVWF 9 MOVLW 8 ;stevec prepisanih bajtov v 0C MOVWF 0C INIFOV1 BSF 3,5 ;postavi PAGE1 BSF 8,0 ;EECON1 RD BCF 3,5 ;postavi PAGE0 MOVF 8,0 MOVWF 0 INCF 4,1 ;stevci INCF 9,1 DECFSZ 0C,1 GOTO INIFOV1 MOVLW 2E ;postavi kazalec v prazno (2E+2F) MOVWF 4 RETURN ;*** Shrani frekvenco, OBS, SQUELCH, VOLUME *** (0C) MEMFOVS BCF 0B,7 ;GIE prepreci prekinitve MOVLW 18 ;kazalec v RAMu MOVWF 4 MOVLW 0 ;kazalec v EEPROMu MOVWF 9 MOVLW 8 ;stevec prepisanih bajtov v 0C MOVWF 0C MEMFOV1 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 MEMFOV3 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 MEMFOV2 BTFSS 8,4 ;EECON1 EEIF test GOTO MEMFOV2 BCF 8,4 ;EECON1 EEIF reset BCF 8,2 ;EECON1 WREN reset BCF 3,5 ;postavi PAGE0 MEMFOV3 INCF 4,1 ;stevci INCF 9,1 DECFSZ 0C,1 GOTO MEMFOV1 MOVLW 2E ;postavi kazalec v prazno (2E+2F) MOVWF 4 BSF 0B,7 ;GIE omogoci prekinitve RETURN ;*** Inicializacija LCDja za 4-bitni vmesnik *** INILCD CALL CAKAJ5 ;cakanje 5ms na zacetku MOVLW 3 ;8-bit reset to display +5ms CALL VPISLCD CALL CAKAJ5 MOVLW 3 ;8-bit reset to display +100us CALL VPISLCD CALL CAKAJ MOVLW 3 ;8-bit reset to display +100us CALL VPISLCD CALL CAKAJ MOVLW 2 ;8-bit function set to 4-bit +100us CALL VPISLCD CALL CAKAJ MOVLW 28 ;function set N=1..2lines, F=0..5x7dots CALL UKAZLCD MOVLW 8 ;display off CALL UKAZLCD MOVLW 1 ;dislay clear +5ms CALL UKAZLCD CALL CAKAJ5 MOVLW 6 ;entry mode set CALL UKAZLCD MOVLW 0C ;display ON, cursor OFF, blink OFF CALL UKAZLCD MOVLW 80 ;enter DDRAM data CALL UKAZLCD RETURN ;*** Poslji iz W 4-bitni ukaz LCDju v 4-bitnem nacinu, brez cakanja! *** VPISLCD ANDLW 0F ;postavi 4 bite na RB0-3 MOVWF 6 BSF 6,5 ;E=1 impulz na E NOP BCF 6,5 ;E=0 RETURN ;*** Poslji iz W 8-bitni ukaz (RS=0) LCDju v 4-bitnem nacinu *** (0C) UKAZLCD MOVWF 0C ;gornji 4 biti SWAPF 0C,0 ANDLW 0F NOP MOVWF 6 BSF 6,5 ;E=1 impulz na E NOP BCF 6,5 ;E=0 MOVF 0C,0 ;spodnji 4 biti ANDLW 0F NOP MOVWF 6 BSF 6,5 ;E=1 impulz na E NOP BCF 6,5 ;E=0 CALL CAKAJ RETURN ;*** Izpis iz W 8-bitnega znaka (RS=1) na LCD v 4-bitnem nacinu *** (0C) ZNAKLCD MOVWF 0C ;gornji 4 biti SWAPF 0C,0 ANDLW 0F IORLW 10 MOVWF 6 BSF 6,5 ;E=1 impulz na E NOP BCF 6,5 ;E=0 MOVF 0C,0 ;spodnji 4 biti ANDLW 0F IORLW 10 MOVWF 6 BSF 6,5 ;E=1 impulz na E NOP BCF 6,5 ;E=0 CALL CAKAJ RETURN ;*** Zanka cakanja 100us *** CAKAJ MOVLW 14 CAKAJ1 NOP ADDLW 0FF BTFSS 3,2 GOTO CAKAJ1 RETURN ;*** Zanka cakanja 5ms *** (0D) CAKAJ5 MOVLW 32 MOVWF 0D CAKAJ6 CALL CAKAJ DECF 0D,1 BTFSS 3,2 GOTO CAKAJ6 RETURN ;*** Izpis trimestnega stevila 0E+0F *** (0D) STEVLCD INCF 0E,1 MOVLW 2F MOVWF 0D MOVF 0F,0 STEVLC3 INCF 0D,1 ADDLW 9C BTFSC 3,0 GOTO STEVLC3 DECF 0E,1 BTFSS 3,2 GOTO STEVLC3 ADDLW 64 MOVWF 0F MOVF 0D,0 CALL ZNAKLCD MOVLW 2F MOVWF 0D MOVF 0F,0 STEVLC2 INCF 0D,1 ADDLW 0F6 BTFSC 3,0 GOTO STEVLC2 ADDLW 0A MOVWF 0F MOVF 0D,0 CALL ZNAKLCD MOVLW 2F MOVWF 0D MOVF 0F,0 STEVLC1 INCF 0D,1 ADDLW 0FF BTFSC 3,0 GOTO STEVLC1 MOVF 0D,0 CALL ZNAKLCD RETURN ;*** Preveri in izpisi frekvenco (1E+1F) na LCD *** (15) FREKLCD MOVF 1E,0 ;preveri spodnjo mejo frekvence ADDLW 5 BTFSS 3,0 GOTO FREKLC1 MOVWF 1E GOTO FREKLCD FREKLC1 MOVF 1E,0 ;preveri gornjo mejo frekvence ADDLW 0FB BTFSS 3,0 GOTO FREKLC2 MOVWF 1E GOTO FREKLC1 FREKLC2 MOVLW 1E ;izpisi zastavico in MHz.kHz SUBWF 4,0 MOVLW 20 BTFSC 3,2 MOVLW 3E CALL ZNAKLCD MOVF 1E,0 ;izracunaj celi in decimalni del, 25kHz kanali MOVWF 0C MOVF 1F,0 MOVWF 0D CLRF 0E CLRF 0F MOVLW 0D8 ;deljenje s 40: pristevaj konstanto -40 FREKLC3 ADDWF 0D,1 BTFSS 3,0 GOTO FREKLC4 INCF 0F,1 GOTO FREKLC3 FREKLC4 MOVF 0C,1 BTFSC 3,2 GOTO FREKLC5 DECF 0C,1 INCF 0F,1 GOTO FREKLC3 FREKLC5 SUBWF 0D,0 MOVWF 15 MOVLW 6C ;dodaj zacetek celih pri 108MHz ADDWF 0F,1 CLRF 0E CALL STEVLCD ;celi del (MHz) na LCD MOVLW 2E ;decimalna pika CALL ZNAKLCD CLRF 0E ;pomnozi ostanek s 25 CLRF 0F INCF 15,1 MOVLW 19 FREKLC6 DECF 15,1 BTFSC 3,2 GOTO FREKLC7 ADDWF 0F,1 BTFSC 3,0 INCF 0E,1 GOTO FREKLC6 FREKLC7 CALL STEVLCD ;decimalni del (kHz) na LCD RETURN ;*** Preveri in izpisi OBS (1C+1D) na LCD *** (15) OBSLCD MOVF 1C,0 ;preveri spodnjo mejo OBS ADDLW 5 BTFSS 3,0 GOTO OBSLCD1 INCF 1C,1 MOVLW 68 ADDWF 1D,1 BTFSC 3,0 INCF 1C,1 GOTO OBSLCD OBSLCD1 MOVF 1C,0 ;preveri gornjo mejo OBS MOVWF 15 MOVF 1D,0 ADDLW 98 BTFSC 3,0 INCF 15,1 MOVF 15,0 ADDLW 0FE BTFSS 3,0 GOTO OBSLCD2 DECF 1C,1 MOVLW 98 ADDWF 1D,1 BTFSS 3,0 DECF 1C,1 GOTO OBSLCD1 OBSLCD2 MOVLW 1C ;izpisi zastavico in OBS SUBWF 4,0 MOVLW 20 BTFSC 3,2 MOVLW 3E CALL ZNAKLCD MOVF 1C,0 MOVWF 0E MOVF 1D,0 MOVWF 0F CALL STEVLCD RETURN ;*** Preveri in izpisi VOLUME *** VOLLCD BTFSC 19,7 ;preveri VOLUME CLRF 19 MOVLW 7 SUBWF 19,0 MOVLW 7 BTFSC 3,0 MOVWF 19 MOVF 1B,0 ;izklop zvocnika? ADDLW 0FB BTFSS 3,0 GOTO VOLLCD1 MOVLW 4F ;izpisi "OFF" za izklop zvocnika CALL ZNAKLCD MOVLW 46 CALL ZNAKLCD MOVLW 46 CALL ZNAKLCD RETURN VOLLCD1 MOVLW 18 ;izpisi VOL+1 z zastavico SUBWF 4,0 MOVLW 20 BTFSC 3,2 MOVLW 3E CALL ZNAKLCD MOVF 19,0 ANDLW 7 ADDLW 31 CALL ZNAKLCD RETURN ;*** Preveri in izpisi SQUELCH *** SQLLCD BTFSC 1B,7 ;preveri SQUELCH CLRF 1B MOVLW 5 SUBWF 1B,0 MOVLW 5 BTFSC 3,0 MOVWF 1B MOVLW 1A ;izpisi zastavico SUBWF 4,0 MOVLW 20 BTFSC 3,2 MOVLW 3E CALL ZNAKLCD MOVF 1B,0 ;izklop zvocnika? ADDLW 0FB BTFSC 3,0 RETURN MOVF 1B,0 ;izpisi SQL ANDLW 07 ADDLW 30 CALL ZNAKLCD RETURN ;*** Skaniranje tipk in izvedba ukazov *** TIPKE MOVLW 1 ;Tipka 1 - nastavljanje frekvence MOVWF 6 CALL CAKAJ BTFSS 5,2 GOTO TIPKE1 MOVLW 1E MOVWF 4 RETURN TIPKE1 MOVLW 2 ;Tipka 2 - nastavljanje OBS MOVWF 6 CALL CAKAJ BTFSS 5,2 GOTO TIPKE2 MOVLW 1C MOVWF 4 RETURN TIPKE2 MOVLW 4 ;Tipka 3 - nastavljanje SQUELCH MOVWF 6 CALL CAKAJ BTFSS 5,2 GOTO TIPKE3 MOVLW 1A MOVWF 4 RETURN TIPKE3 MOVLW 8 ;Tipka 4 - nastavljanje VOLUME MOVWF 6 CALL CAKAJ BTFSS 5,2 GOTO TIPKE4 MOVLW 18 MOVWF 4 RETURN TIPKE4 MOVLW 10 ;Tipka 5 - shrani stanje v EEPROM MOVWF 6 CALL CAKAJ BTFSS 5,2 GOTO TIPKE5 CALL MEMFOVS ;shrani stanje sprejemnika v EEPROM RETURN TIPKE5 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, VOL in SQL na TSA5512 preko I2C *** (0E,0F) CMDI2C CALL ZACI2C ;poslji ukaz TSA5512 MOVLW 0C2 CALL TXI2C MOVF 1E,0 ;izracunaj modulo v 0E+0F, pristej 4320+160=4480=$1180 ADDLW 11 MOVWF 0E MOVF 1F,0 ADDLW 80 MOVWF 0F BTFSC 3,0 INCF 0E,1 MOVF 0E,0 ;postavi gornji bajt frekvence ANDLW 7F CALL TXI2C MOVF 0F,0 ;postavi spodnji bajt frekvence CALL TXI2C MOVLW 8E ;inicializiraj TSA5512 CALL TXI2C MOVF 19,0 ;postavi VOL in SQL na port TSA5512 ANDLW 7 XORLW 7 ;obrni polariteto krmiljenja VOL MOVWF 0E MOVF 16,0 ;primerjaj SQL ANDLW 7 ADDWF 1B,0 ADDLW 0FB BTFSC 3,0 BSF 0E,3 MOVF 0E,0 CALL TXI2C RETURN ;*** Precitaj port TSA5512 v (16), S-METER na LCD *** (0E,0F,16) SMETER CALL ZACI2C ;precitaj podatke iz TSA5512 MOVLW 0C3 CALL TXI2C CALL RXI2C MOVWF 16 MOVLW 4 ;stevilo izpisanih znakov MOVWF 0F BTFSS 16,7 ;preveri prisotnost TSA5512: ???? GOTO SMETER2 SMETER1 MOVLW 3F CALL ZNAKLCD DECFSZ 0F,1 GOTO SMETER1 RETURN SMETER2 BTFSC 16,6 ;preveri ujetje PLLja: !!!! GOTO SMETER4 SMETER3 MOVLW 21 CALL ZNAKLCD DECFSZ 0F,1 GOTO SMETER3 RETURN SMETER4 MOVF 16,0 ;ocisti podatke za S-METER ANDLW 7 ADDLW 0FB MOVWF 0E SMETER5 INCFSZ 0E,1 GOTO SMETER7 SMETER6 MOVLW 20 CALL ZNAKLCD DECFSZ 0F,1 GOTO SMETER6 RETURN SMETER7 MOVLW 2A CALL ZNAKLCD DECFSZ 0F,1 GOTO SMETER5 RETURN ;*** Izpisi izmerjeni radial na LCD *** RADLCD BTFSS 20,7 ;preveri veljavnost meritve radiala? GOTO RADLCD1 MOVLW 4F ;izpisi "OFF" za neveljavno meritev CALL ZNAKLCD MOVLW 46 CALL ZNAKLCD MOVLW 46 CALL ZNAKLCD RETURN RADLCD1 MOVF 20,0 ;izpisi izmerjeni radial MOVWF 0E MOVF 21,0 MOVWF 0F CALL STEVLCD RETURN ;*** Izpisi CDI s FROM/TO zastavico na LCD *** (0D,0E,0F,15) CDILCD BTFSS 20,7 ;preveri veljavnost meritve radiala? GOTO CDILCD2 MOVLW 11 ;izpisi 17 pikic za neveljavno meritev MOVWF 0D CDILCD1 MOVLW 2E CALL ZNAKLCD DECFSZ 0D,1 GOTO CDILCD1 RETURN CDILCD2 MOVF 20,0 ;izracunaj razliko OBS-RADIAL v 0E+0F SUBWF 1C,0 MOVWF 0E MOVF 21,0 SUBWF 1D,0 MOVWF 0F BTFSS 3,0 DECF 0E,1 CLRF 15 ;zastavica FROM/TO v 15 CDILCD3 MOVF 0E,0 ;preveri razlika <-90 stopinj MOVWF 0D MOVLW 5A ADDWF 0F,0 BTFSC 3,0 INCF 0D,1 BTFSS 0D,7 GOTO CDILCD4 MOVLW 0B4 ;pristej 180 stopinj ADDWF 0F,1 BTFSC 3,0 INCF 0E,1 COMF 15,1 ;obrni zastavico FROM/TO GOTO CDILCD3 CDILCD4 MOVF 0E,0 ;preveri razlika >89 stopinj MOVWF 0D MOVLW 5A SUBWF 0F,0 BTFSS 3,0 DECF 0D,1 BTFSC 0D,7 GOTO CDILCD5 MOVLW 0B4 ;odstej 180 stopinj SUBWF 0F,1 BTFSS 3,0 DECF 0E,1 COMF 15,1 ;obrni zastavico FROM/TO GOTO CDILCD4 CDILCD5 MOVF 0F,0 ;obrni prikazovanje CDI za smer TO BTFSC 15,0 SUBLW 0 MOVWF 0F MOVLW 7F ;nadomestne puscice v levo MOVWF 0D MOVLW 20 ;presledki za pozitivne razlike? BTFSS 0F,7 MOVWF 0D MOVF 0F,0 ;presledki za razlike >-9 ADDLW 8 MOVLW 20 BTFSC 3,0 MOVWF 0D MOVLW 0F8 ;zanka izpisa 8 znakov v levo MOVWF 0E CDILCD6 MOVF 0F,0 ;zamenjava presledka s puscico? SUBWF 0E,0 MOVLW 3C BTFSC 3,2 MOVWF 0D MOVF 0D,0 ;izpis puscice ali presledka CALL ZNAKLCD INCF 0E,1 BTFSS 3,2 GOTO CDILCD6 MOVLW 46 ;izpisi zastavico FROM/TO (15) BTFSC 15,0 MOVLW 54 CALL ZNAKLCD MOVLW 7E ;nadomestne puscice v desno MOVWF 0D MOVLW 8 ;puscice za razlike <9 SUBWF 0F,0 MOVLW 3E BTFSS 3,0 MOVWF 0D MOVLW 20 ;presledki za negativne razlike? BTFSC 0F,7 MOVWF 0D CLRF 0E ;zanka izpisa 8 znakov v desno CDILCD7 MOVF 0F,0 ;zamenjava puscice s presledkom? SUBWF 0E,0 MOVLW 20 BTFSC 3,2 MOVWF 0D MOVF 0D,0 ;izpis puscice ali presledka CALL ZNAKLCD INCF 0E,1 MOVLW 8 SUBWF 0E,0 BTFSS 3,2 GOTO CDILCD7 RETURN ;*** Glavni program *** GLAVNI CALL INIFOVS ;zacetne vrednosti frekvence, OBS, SQL in VOL CALL INIPORT ;inicializacija portov 16F84 CALL INILCD ;inicializacija HD44780 GOTO ZANKA ;*** Glavna zanka programa *** ZANKA CALL TIPKE ;ukazi iz tipk CALL RADIAL ;izmeri VOR radial CALL AVGRAD ;povpreci izmerjeno vrednost radiala MOVLW 80 ;prva vrstica na LCDju CALL UKAZLCD CALL RADLCD ;izpisi izmerjeni VOR radial CALL CDILCD ;narisi CDI na LCD MOVLW 0C0 ;druga vrstica na LCDju CALL UKAZLCD CALL SMETER ;precitaj stanje in SQL, S-METER CALL FREKLCD ;preveri in izpisi frekvenco CALL OBSLCD ;preveri in izpisi OBS CALL SQLLCD ;preveri in izpisi SQUELCH CALL VOLLCD ;preveri in izpisi VOLUME CALL CMDI2C ;postavi frekvenco, VOL in SQL GOTO ZANKA ;*** Izmeri VOR radial v 20+21 *** (0C,0D,0E,0F,20,21,22,23) RADIAL CALL RADIALR ;cakanje na prvi impulz REF RADIAL1 MOVLW 2 ;predolgo cakanje? SUBWF 20,0 BTFSC 3,0 GOTO RADIAL9 CALL RADIALS ;stevec casa ANDLW 1 BTFSC 3,2 GOTO RADIAL1 CALL RADIALR ;meritev periode REF RADIAL2 MOVLW 2 ;predolgo cakanje? SUBWF 20,0 BTFSC 3,0 GOTO RADIAL9 CALL RADIALS ;stevec casa ANDLW 1 BTFSC 3,2 GOTO RADIAL2 DECF 20,1 ;preveri periodo REF? BTFSS 3,2 GOTO RADIAL9 MOVLW 5E ;OKNO 360+/-10 SUBWF 21,0 ADDLW 0EB BTFSC 3,0 GOTO RADIAL9 CALL RADIALR ;cakanje na prvi impulz PHI RADIAL3 MOVLW 2 ;predolgo cakanje? SUBWF 20,0 BTFSC 3,0 GOTO RADIAL9 CALL RADIALS ;stevec casa ANDLW 2 BTFSC 3,2 GOTO RADIAL3 CALL RADIALR ;meritev periode PHI RADIAL4 MOVLW 2 ;predolgo cakanje? SUBWF 20,0 BTFSC 3,0 GOTO RADIAL9 CALL RADIALS ;stevec casa ANDLW 2 BTFSC 3,2 GOTO RADIAL4 DECF 20,1 ;preveri periodo PHI? BTFSS 3,2 GOTO RADIAL9 MOVLW 5E ;OKNO 360+/-10 SUBWF 21,0 ADDLW 0EB BTFSC 3,0 GOTO RADIAL9 CALL RADIALR ;cakanje na impulz REF RADIAL5 MOVLW 2 ;predolgo cakanje? SUBWF 20,0 BTFSC 3,0 GOTO RADIAL9 CALL RADIALS ;stevec casa ANDLW 1 BTFSC 3,2 GOTO RADIAL5 CALL RADIALR ;meritev zamika PHI-REF RADIAL6 MOVLW 2 ;predolgo cakanje? SUBWF 20,0 BTFSC 3,0 GOTO RADIAL9 CALL RADIALS ;stevec casa ANDLW 2 BTFSC 3,2 GOTO RADIAL6 MOVF 22,0 ;pristej popravek kota 22+23 ADDWF 20,1 MOVF 23,0 ADDWF 21,1 BTFSC 3,0 INCF 20,1 RADIAL7 MOVF 20,0 ;omeji obmocje rezultata na 0-359 stopinj MOVWF 0C MOVF 21,0 ADDLW 98 BTFSC 3,0 INCF 0C,1 MOVF 0C,0 ADDLW 0FE BTFSS 3,0 RETURN DECF 20,1 MOVLW 98 ADDWF 21,1 BTFSS 3,0 DECF 20,1 GOTO RADIAL7 RADIAL9 MOVLW 0EE ;izhod v slucaju napake MOVWF 20 RETURN ;*** Resetiraj 32-bitni stevec 20+21+0E+0F in port A komplement v 0D *** RADIALR CLRF 0E ;resetiranje stevca CLRF 0F CLRF 20 CLRF 21 MOVF 5,0 ;precitaj port A v W, komplement v 0D MOVWF 0D COMF 0D,1 RETURN ;*** Povecaj 32-bitni stevec 20+21+0E+0F in port A AND 0D v W, komplement v 0D *** RADIALS MOVF 0F,0 ;pristevanje konstante (3A)DF vsebini 0F ADDLW 0DF MOVWF 0F BTFSC 3,0 INCF 0E,1 BTFSC 3,2 INCF 21,1 BTFSC 3,2 INCF 20,1 MOVF 0E,0 ;pristevanje konstante 3A(DF) vsebini 0E ADDLW 3A MOVWF 0E BTFSC 3,0 INCF 21,1 BTFSC 3,2 INCF 20,1 MOVF 0D,0 ;premakni 0D v 0C MOVWF 0C MOVF 5,0 ;precitaj port A v W, komplement v 0D MOVWF 0D COMF 0D,1 ANDWF 0C,0 ;W AND 0C v W RETURN ;*** Povpreci vrednost radiala 20=21 v 24+25, 2^N=16 *** (0E,0F,20,21,24,25) AVGRAD BTFSC 20,7 ;rezultat meritve v 20+21 veljaven? RETURN CALL AVGD2N ;deli povprecje 24+25/2^N MOVF 0E,0 ;odstej od 20+21 SUBWF 20,1 MOVF 0F,0 SUBWF 21,1 BTFSS 3,0 DECF 20,1 DECF 20,1 ;odstej 360 stopinj od razlike 20+21 MOVLW 68 SUBWF 21,1 BTFSS 3,0 DECF 20,1 AVGRAD1 MOVF 20,0 ;razlika 20+21 manjsa od -180 stopinj? MOVWF 0E MOVF 21,0 ADDLW 0B4 BTFSC 3,0 INCF 0E,1 BTFSS 0E,7 GOTO AVGRAD2 INCF 20,1 ;pristej 360 stopinj razliki 20+21 MOVLW 68 ADDWF 21,1 BTFSC 3,0 INCF 20,1 GOTO AVGRAD1 AVGRAD2 MOVF 20,0 ;pristej razliko 20+21 povprecju 24+25 ADDWF 24,1 MOVF 21,0 ADDWF 25,1 BTFSC 3,0 INCF 24,1 MOVLW 16 ;odstej 2^N*360 stopinj od povprecja 24+25 SUBWF 24,1 MOVLW 80 SUBWF 25,1 BTFSS 3,0 DECF 24,1 AVGRAD3 BTFSS 24,7 ;povprecje 24+25 negativno? GOTO AVGRAD4 MOVLW 16 ;pristej 2^N*360 stopinj povprecju 24+25 ADDWF 24,1 MOVLW 80 ADDWF 25,1 BTFSC 3,0 INCF 24,1 GOTO AVGRAD3 AVGRAD4 CALL AVGD2N ;deli 24+25/2^N in rezultat v 20+21 MOVF 0E,0 MOVWF 20 MOVF 0F,0 MOVWF 21 RETURN ;*** Deli 24+25/2^N, rezultat v 0E+0F *** (0E,0F) AVGD2N MOVF 24,0 ;prepisi v 0E+0F MOVWF 0E MOVF 25,0 MOVWF 0F MOVLW 4 ;faktor povprecenja 2^N=16 AVGD2N1 BCF 3,0 ;zanka pomika vsebine za eno mesto nazaj RRF 0E,1 RRF 0F,1 ADDLW 0FF BTFSS 3,2 GOTO AVGD2N1 RETURN ;*** Nastavi konfiguracijo PICa 16F84 *** ORG 2007 ;naslov konfiguracijske besede DW 12 ;CP=OFF, PWRTE=ON, WDT=OFF, OSC=HS ;*** Nastavi zacetne vrednosti EEPROMa *** ORG 2100 DW 0 ;zacetni VOLUME 3 (+1) DW 3 DW 0 ;zacetni SQUELCH 2 DW 2 DW 0 ;zacetni OBS 180 DW 0B4 DW 2 ;zacetna frekvenca 123.500 DW 6C ;********************** END ;*** Konec programa ***