;*** DME merilec razdalje (CPUCLK=9.72MHz) - S53MV - 23/6/2005 *** ;*** Uporaba vrat PICa 16F84 *** ;prozenje/vklop oddajnika PTT=RA0 ;izhod impulzov /PULSE=RA1 ;BACKPLANE=RA2 ;I2C vodilo: SCL=RA3, SDA=RA4 - krmiljenje TSA5512 ;INT=RB0 ;STROBE=RB1 ;DATA=RB2 ;CLOCK=RB3 ;tipka DESNO=RB4 ;tipka DOL=RB5 ;tipka GOR=RB6 ;tipka LEVO=RB7 ;*** Uporaba RAMa *** ;0C LCDBIT, TXI2C, RXI2C, PRIKAZ, MODULO, OBDELA, PREKIN, ODDAJA ;0D LCDDAT, CAKAJ, TXI2C, RXI2C, MODULO, OBDELA ;0E LCDDAT oscilator za BACKPLANE in utripanje stevilk ;0F TIPKE spomin prejsnjega stanja ;10,11,12,13 LCDDAT vsebina zaslona, ODDAJA, PREKIN stevci desetink milje ;14,15 MODULO deljenja PLLja, ODDAJA, PREKIN stevci desetink milje ;16 STANJE iz TSA5512 ;17 VRATA za TSA5512, PREKIN stevec oddaje za okno ;18,19 ODDAJA, PREKIN, PREVER, ZAMENA, PRIKAZ desetinke navticnih milj ;20 stevilka spomina ;21,22,23,24 DME kanala ali VOR frekvenca ;25 NF vklop ;26,27 PREVER prejsnji veljavni rezultat ;28,29 ZAMENA nadomestni rezultat na zaslon ;2A ZAMENA, ODDAJA stevec veljavnosti rezultata ;2B ZAMENA, ODDAJA, PREKIN polozaj okna ;2C,2D,2E,2F NAKLJUC notranje stanje ;*** Zacetek programa, inicializacije *** LIST P=16F84 ORG 0 CLRF 20 ;zacetni spomin CALL RMEM ;zacetni kanal CALL INIPIC ;inicializacija vrat PICa GOTO GLAVNI ;*** Prekinitveni program (takt 9.72MHz) *** (0C,10,11,12,13,14,15,16,17,18,19) ORG 4 PREKIN DECFSZ 0C,1 ;zakasnitev do drugega impulza GOTO PREKIN BTFSS 6,0 ;preveri drugi impulz pri 12us/30us GOTO PREKIN1 MOVLW 0F8 ;preveri konec okna ADDWF 11,0 BTFSC 3,0 GOTO PREKIN1 CLRF 18 ;okno (2B) v (18,19) - popravek za stevec (11) MOVF 2B,0 MOVWF 19 COMF 19,1 INCF 19,1 DECF 10,0 ;pristej stevec (10) s popravkom -1 ADDWF 19,1 BTFSC 3,0 INCF 18,1 MOVF 11,0 ;pristej stevec (11) ADDWF 19,1 BTFSC 3,0 INCF 18,1 MOVF 12,0 ;pristej stevec (12) ADDWF 19,1 BTFSC 3,0 INCF 18,1 MOVF 13,0 ;pristej stevec (13) ADDWF 19,1 BTFSC 3,0 INCF 18,1 MOVF 14,0 ;pristej stevec (14) ADDWF 19,1 BTFSC 3,0 INCF 18,1 MOVF 15,0 ;pristej stevec (15) ADDWF 19,1 BTFSC 3,0 INCF 18,1 MOVWF 17 ;stevec oddaje za okno PREKIN1 BSF 0C,7 ;zastavica za predcasni izhod iz zanke stetja ANDLW 0 ;postavi W=0 in Z=1 za pravilen izhod iz zanke stetja! RETURN ;*** Oddaja in meritev dvojnega DME impulza (takt 9.72MHz) *** (0C,10,11,12,13,14,15,18,19,2A,2B) ODDAJA MOVLW 88 ;vrednost neizvedene meritve $8888 MOVWF 18 MOVWF 19 MOVLW 10 ;stevec veljavnosti rezultata <16? SUBWF 2A,0 MOVWF 0C BTFSS 0C,7 RETURN MOVF 16,0 ;prisotnost TSA5512 in uklenitev PLLja? XORLW 40 ANDLW 0C0 BTFSS 3,2 RETURN MOVLW 0DB ;prikaz meritev vkljuci oddajnik? ADDWF 4,0 BTFSS 3,0 RETURN CLRF 10 ;resetiraj stevce zakasnitve (10,11,12,13,14,15) INCF 10,1 ;popravek +1 za stevec (10) MOVF 2B,0 MOVWF 11 ;stevec (11) zacne okno CLRF 12 CLRF 13 CLRF 14 CLRF 15 MOVLW 0B ;zakasnitev RX do drugega impulza X=11/Y=25 v (0C) BTFSC 24,0 MOVLW 19 MOVWF 0C BSF 5,0 ;vkljuci PTT oddajnika NOP NOP NOP BCF 5,1 ;zacetek prvega impulza (8ukazov) NOP NOP NOP BSF 5,1 ;konec prvega impulza NOP NOP NOP MOVLW 13 ;TX razmak Y=36us(88ukazov)-zakasnitve(13ukazov) NOP BTFSC 24,0 GOTO ODDAJA1 MOVLW 4 ;TX razmak X=12us(29ukazov)-zakasnitve(14ukazov) NOP ODDAJA1 ADDLW 0FF ;zanka cakanja (N*4)-1 ukazov BTFSS 3,2 GOTO ODDAJA1 BCF 5,1 ;zacetek drugega impulza (8ukazov) NOP NOP NOP BSF 5,1 ;konec drugega impulza NOP NOP MOVLW 90 ;pripravi W za vklop prekinitev GIE in INTE NOP ;zakasnitev izklopa oddajnika po 9 dodatnih ukazih NOP NOP NOP ; NOP NOP NOP ; NOP NOP BCF 5,0 ;izkljuci PTT oddajnika ODDAJA2 INCF 10,1 ;zanka stetja zakasnitve BTFSC 3,2 ;konec po izteku stevca (10)? GOTO ODDAJA3 INCF 11,1 BTFSC 3,2 ;vkljuci okno - prekinitve GIE in INTE MOVWF 0B INCF 12,1 BTFSC 0C,7 ;predcasni izhod po prekinitvi? GOTO ODDAJA3 INCF 13,1 NOP NOP INCF 14,1 NOP NOP INCF 15,1 GOTO ODDAJA2 ODDAJA3 CLRF 0B ;izkljuci prekinitve RETURN ;*** Preveri odstopanje izmerjenih rezutlatov (0C,0D,18,19,26,27) PREVER BTFSC 18,7 ;preveri veljavnost rezultata? RETURN MOVLW 1F ;popravek zakasnitve X=31(38us)/Y=16(20us) BTFSC 24,0 MOVLW 10 SUBWF 19,1 BTFSS 3,0 DECF 18,1 MOVF 26,0 ;odstevanje starega (26,27) od novega (18,19)? SUBWF 18,0 MOVWF 0C MOVF 27,0 SUBWF 19,0 BTFSS 3,0 DECF 0C,1 MOVWF 0D MOVF 18,0 ;novi (18,19) zamenja starega (26,27) MOVWF 26 MOVF 19,0 MOVWF 27 BTFSS 0C,7 ;izracunaj absolutno vrednost razlike v (0C,0D) GOTO PREVER1 COMF 0C,1 COMF 0D,1 INCF 0D,1 BTFSC 3,2 INCF 0C,1 PREVER1 MOVF 0C,1 ;razlika manjsa od predpisane meje (3)? BTFSS 3,2 GOTO PREVER2 MOVLW 3 SUBWF 0D,0 BTFSS 3,0 RETURN PREVER2 MOVLW 88 ;prevelika razlika >>> neveljavno v (18,19) MOVWF 18 MOVWF 19 RETURN ;*** Zamenjava izmerjenega rezultata s spominom, nastavljanje okna *** (18,19,28,29,2A,2B) ZAMENA MOVF 18,0 ;preveri veljavnost rezultata? ANDLW 0F0 XORLW 80 BTFSC 3,2 GOTO ZAMENA1 MOVF 18,0 ;prepisi novi veljaven rezultat v (28,29) MOVWF 28 MOVF 19,0 MOVWF 29 MOVLW 20 ;stevec (2A) na zacetno vrednost 32 MOVWF 2A MOVF 17,0 ;nastavi okno za veljaven rezultat MOVWF 2B COMF 2B,1 INCF 2B,1 BTFSC 3,2 DECF 2B,1 RETURN ZAMENA1 BTFSC 2A,7 ;preveri stanje stevca GOTO ZAMENA2 MOVF 28,0 ;prepisi stari veljaven rezultat v (18,19) MOVWF 18 MOVF 29,0 MOVWF 19 DECF 2A,1 ;znizaj stevec RETURN ZAMENA2 INCF 2B,1 ;premikaj okno brez rezultata! RETURN ;*** Inicializacija vrat PICa *** INIPIC MOVLW 1A ;zacetno stanje vrat A=11010 MOVWF 5 MOVLW 0 ;zacetno stanje vrat B=00000000 MOVWF 6 BSF 3,5 ;postavi PAGE1 MOVLW 0 ;port A: izhodi RA0-4 MOVWF 5 ;vpisi TRISA MOVLW 0F1 ;port B: vhod RB0, izhodi RB1-3, vhodi RB4-7 MOVWF 6 ;vpisi TRISB MOVLW 40 ;OPTION: /RBPU, INTEDG MOVWF 1 BCF 3,5 ;postavi PAGE0 CLRF 2A ;resetiraj stevec veljavnosti rezultata RETURN ;*** Dvojna zanka fiksnega/nakljucnega cakanja *** (0D,2F) CAKAJ MOVLW 60 ;fiksno cakanje med nastavljanjem parametrov MOVWF 0D MOVLW 0DB ;izvajanje meritev? ADDWF 4,0 BTFSS 3,0 GOTO CAKAJ1 MOVF 2F,0 ;nakljucno cakanje med meritvijo ANDLW 7F ADDLW 1 MOVWF 0D CAKAJ1 CALL CAKAJ2 ;zunanja zanka cakanja DECF 0D,1 BTFSS 3,2 GOTO CAKAJ1 RETURN CAKAJ2 MOVLW 20 ;notranja zanka cakanja CAKAJ3 NOP ADDLW 0FF BTFSS 3,2 GOTO CAKAJ3 RETURN ;*** Generator nakljucnega stevila 2**31-1 *** (2C,2D,2E,2F) NAKLUC RLF 2F,1 ;32-bitni pomikalni register RLF 2E,1 RLF 2D,1 RLF 2C,1 BCF 2F,0 MOVLW 1 ;izracunaj povratno vezavo X**31+X**28+1 BTFSC 2C,7 XORWF 2F,1 BTFSC 2C,4 XORWF 2F,1 MOVF 2F,1 ;preveri stanje samih nicel? BTFSS 3,2 RETURN MOVF 2E,1 BTFSS 3,2 RETURN MOVF 2D,1 BTFSS 3,2 RETURN MOVF 2C,1 BTFSS 3,2 RETURN MOVWF 2F ;vrini enico v stanje samih nicel RETURN ;*** 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 ODDAJA ;oddaja in meritev dvojnega impulza CALL PREVER ;preveri odstopanje izmerjenih rezultatov CALL ZAMENA ;zamenjava rezultata s spominom in nastavitev okna CALL NAKLUC ;generator nakljucnega stevila 2**31-1 CALL NAKLUC CALL NAKLUC CALL NAKLUC CALL CAKAJ ;fiksno/nakljucno cakanje CALL TIPKE ;izvedi ukaz s tipk GOTO GLAVNI ;*** Precitaj kanal 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 MOVLW 3C ;precitaj NF vklop MOVWF 9 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 21 ;kazalec v RAMu MOVWF 4 RETURN ;*** Vpisi kanal v EEPROM *** WMEM CALL MEJE ;preveri meje spremenljivk CALL KMEM ;doloci kazalce za prepisovanje CALL WMEM1 ;vpisi 4 bajte kanala CALL WMEM1 CALL WMEM1 CALL WMEM1 MOVLW 3C ;vpisi NF vklop MOVWF 9 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 kanala (21,22,23,24) ali rezultata meritve (18,19) ali spomina (20) *** (0C,18,19) PRIKAZ MOVLW 0DB ;prikazi meritev? ADDWF 4,0 BTFSC 3,0 GOTO PRIKAZ2 MOVLW 0E0 ;prikazi stevilko spomina? ADDWF 4,0 BTFSC 3,2 COMF 6,0 ANDLW 0F0 BTFSC 3,2 GOTO PRIKAZ1 MOVF 20,0 ;izpis stevilke spomina na prvo stevilko CALL LCDDEK MOVWF 10 CLRF 11 ;druga stevilka prazna CLRF 12 ;tretja stevilka prazna CLRF 13 ;cetrta stevilka prazna RETURN PRIKAZ1 MOVF 21,0 ;prva stevilka kanala - izpis kanala ali frekvence ANDLW 1 CALL LCDDEK MOVWF 10 MOVF 22,0 ;druga stevilka kanala CALL LCDDEK MOVWF 11 MOVF 23,0 ;tretja stevilka kanala CALL LCDDEK MOVWF 12 MOVLW 0DA ;vrsta kanala X ali Y BTFSC 24,0 MOVLW 0D6 BTFSS 21,1 ;izpis zadnje stevilke VOR frekvence? GOTO PRIKAZ0 MOVLW 7E BTFSC 24,0 MOVLW 0E6 PRIKAZ0 MOVWF 13 BTFSS 0E,4 ;utripanje znaka, ki se ga nastavlja gor/dol? GOTO PRIKAZ9 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 PRIKAZ9 BTFSC 21,1 ;napisi decimalno piko za VOR frekvenco? BSF 11,0 RETURN PRIKAZ2 MOVF 18,0 ;preveri veljavnost rezultata? ANDLW 0F0 XORLW 80 BTFSC 3,2 GOTO PRIKAZ6 MOVLW 0 ;izpis predznaka rezultata meritve BTFSS 18,7 GOTO PRIKAZ3 COMF 18,1 COMF 19,1 INCF 19,1 BTFSC 3,2 INCF 18,1 MOVLW 80 PRIKAZ3 MOVWF 10 MOVLW 64 ;izracunaj in prikazi desetice milj CLRF 0C PRIKAZ4 INCF 0C,1 SUBWF 19,1 BTFSC 3,0 GOTO PRIKAZ4 DECF 18,1 BTFSS 18,7 GOTO PRIKAZ4 ADDWF 19,1 DECF 0C,0 BTFSC 3,2 ;pobrisi vodilno niclo desetic? GOTO PRIKAZ7 MOVWF 0C ;dodaj stotice milj na prvo mesto? ADDLW 0F6 BTFSS 3,0 GOTO PRIKAZ8 MOVWF 0C MOVLW 12 IORWF 10,1 PRIKAZ8 MOVF 0C,0 ;prikazi desetice milj (razen vodilne nicle) CALL LCDDEK PRIKAZ7 MOVWF 11 MOVLW 0A ;izracunaj in prikazi enice milj CLRF 0C PRIKAZ5 INCF 0C,1 SUBWF 19,1 BTFSC 3,0 GOTO PRIKAZ5 ADDWF 19,1 DECF 0C,0 CALL LCDDEK IORLW 1 ;vkljuci decimalno piko MOVWF 12 MOVF 19,0 ;izracunaj in prikazi desetinke milj CALL LCDDEK MOVWF 13 RETURN PRIKAZ6 MOVLW 8 ;neveljaven rezultat - migalo na prvo mesto BTFSS 0E,4 MOVLW 40 MOVWF 10 MOVLW 0 ;ostala tri mesta - prazen zaslon MOVWF 11 MOVWF 12 MOVWF 13 RETURN ;*** Preveri prisotnost TSA5512 in uklenitev PLLja *** UNLOCK MOVF 16,0 ;prisotnost TSA5512 in uklenitev PLLja XORLW 40 ANDLW 0C0 BTFSC 3,2 RETURN MOVLW 1 ;vkljuci vse decimalne pike na LCDju IORWF 10,1 IORWF 11,1 IORWF 12,1 RETURN ;*** Preveri meje kazalca, spomina, kanala *** MEJE MOVLW 0E0 ;spodnja meja kazalca ADDWF 4,1 BTFSS 3,0 CLRF 4 SUBWF 4,1 MOVLW 0DB ;gornja meja kazalca 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 vrste kanala (X,Y) GOTO MEJE1 MOVLW 1 MOVWF 24 DECF 23,1 ;prenos: znizaj tretjo stevilko MEJE1 MOVLW 2 ;gornja meja vrste kanala (X,Y) 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 kanala (enice) GOTO MEJE3 MOVLW 9 MOVWF 23 DECF 22,1 ;prenos: znizaj drugo stevilko MEJE3 MOVLW 0A ;gornja meja tretje stevilke kanala (enice) 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 kanala (desetice) GOTO MEJE5 MOVLW 9 MOVWF 22 DECF 21,1 ;prenos: znizaj prvo stevilko MEJE5 MOVLW 0A ;gornja meja druge stevilke kanala (desetice) SUBWF 22,0 BTFSS 3,0 GOTO MEJE6 CLRF 22 INCF 21,1 ;prenos: zvisaj prvo stevilko MEJE6 MOVLW 3 ;meje prve stevilke kanala (stotice) ANDWF 21,1 BTFSC 25,7 ;spodnja meja NF vklop CLRF 25 DECF 25,1 ;gornja meja NF vklop BTFSS 25,7 CLRF 25 INCF 25,1 RETURN ;*** 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 5,2 BTFSC 0E,0 BSF 5,2 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 ;*** Zacetek komunikacije na I2C vodilu *** ZACI2C BSF 5,4 CALL ZZZI2C BSF 5,3 CALL ZZZI2C BCF 5,4 CALL ZZZI2C BCF 5,3 CALL ZZZI2C RETURN ;*** Zaviranje zaspanega I2C vodila *** ZZZI2C MOVLW 10 ZZZI2C1 ADDLW 0FF BTFSS 3,2 GOTO ZZZI2C1 RETURN ;*** Oddaja bajta iz W na I2C vodilu *** (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 CALL ZZZI2C BSF 5,3 ;oddaja taktnega impulza CALL ZZZI2C BCF 5,3 CALL ZZZI2C DECFSZ 0D,1 ;zanka po 8 podatkovnih bitih GOTO TXI2C1 CALL KONI2C RETURN ;*** Sprejem bajta na I2C vodilu v W *** (0C,0D) RXI2C MOVLW 8 MOVWF 0D RXI2C1 BSF 5,4 ;sprejem enega bita podatkov CALL ZZZI2C MOVLW 18 IORWF 5,1 CALL ZZZI2C RLF 0C,1 BCF 0C,0 BTFSC 5,4 BSF 0C,0 BCF 5,3 CALL ZZZI2C DECFSZ 0D,1 ;zanka po 8 podatkovnih bitih GOTO RXI2C1 CALL KONI2C MOVF 0C,0 RETURN ;*** Konec bajta na I2C vodilu *** KONI2C BSF 5,4 CALL ZZZI2C MOVLW 18 IORWF 5,1 CALL ZZZI2C BCF 5,3 CALL ZZZI2C 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 MOVLW 1C ;NF vklop? BTFSC 25,0 IORWF 17,1 BTFSC 14,3 ;kanali >128 - postavi frekvenco sita najvisje RETURN BTFSS 14,2 ;kanali <64 - postavi DAC za VF vhodno sito GOTO VRATA1 BTFSC 24,0 ;kanal Y>64? BSF 17,6 RETURN VRATA1 BTFSC 24,0 ;kanal Y<64? BSF 17,5 BTFSS 24,0 ;kanal X<64? BSF 17,7 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 kanala (stotice) MOVF 21,0 MOVWF 15 CALL MODULO3 ;pomnozi z 10 CLRF 0C ;druga stevilka kanala (desetice) MOVF 22,0 MOVWF 0D CALL MODULO1 ;pristej drugo stevilko CALL MODULO3 ;pomnozi z 10 CLRF 0C ;tretja stevilka kanala (enice) MOVF 23,0 MOVWF 0D CALL MODULO1 ;pristej tretjo stevilko CALL MODULO4 ;pretvori VOR frekvenco v DME kanal? CALL MODULO2 ;pomnozi s 16 CALL MODULO2 CALL MODULO2 CALL MODULO2 MOVLW 40 ;konstanta za kanal0: 1024MHz=16384=$4000 MOVWF 0C MOVLW 0 MOVWF 0D CALL MODULO1 ;pristej konstanto 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 MODULO4 BTFSS 21,1 ;pretvori VOR frekvenco v DME kanal? RETURN MOVLW 0F9 ADDWF 15,1 CLRF 14 ;omeji rezultat na 0-127 BCF 15,7 MOVLW 3C ;izloci kanale 60-69? SUBWF 15,0 BTFSS 3,0 RETURN MOVLW 0A ;pristej 10 izracunani stevilki kanala ADDWF 15,1 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 0 ;spomin0: 069Y DW 6 DW 9 DW 1 DW 2 ;spomin1: 108.60 DW 8 DW 6 DW 0 DW 0 ;spomin2: 037X DW 3 DW 7 DW 0 DW 3 ;spomin3: 110.50 DW 0 DW 5 DW 0 DW 3 ;spomin4: 111.25 DW 1 DW 2 DW 1 DW 3 ;spomin5: 112.70 DW 2 DW 7 DW 0 DW 3 ;spomin6: 112.90 DW 2 DW 9 DW 0 DW 3 ;spomin7: 113.40 DW 3 DW 4 DW 0 DW 3 ;spomin8: 114.10 DW 4 DW 1 DW 0 DW 3 ;spomin9: 114.20 DW 4 DW 2 DW 0 DW 3 ;spominA: 114.80 DW 4 DW 8 DW 0 DW 3 ;spominB: 115.30 DW 5 DW 3 DW 0 DW 1 ;spominC: 111X DW 1 DW 1 DW 0 DW 3 ;spominD: 117.05 DW 7 DW 0 DW 1 DW 3 ;spominE: 117.70 DW 7 DW 7 DW 0 DW 1 ;NF vklop END ;*** Konec programa ***