;*** Frekvencmeter for radiovisinomer - S53MV - 12/7/2005 *** ;*** Uporaba door PIC 16F84 (takt 20MHz) *** ;input (neuporabljen) RA0 ;input tipka NICLA=RA1 ;output BACKPLANE=RA2 ;input monoflop=RA3 ;input visoki frekvencmeter T0IF=RA4 ;input nizki frekvencmeter INTF=RB0 ;output STROBE=RB1 ;output DATA=RB2 ;output CLOCK=RB3 ;output ISD2560 M0=RA4 ;input ISD2560 /OEM=RB5 ;output ISD2560 PD=RB6 ;output ISD2560 /CE=RB7 ;*** Uporaba RAMa *** ;0C LCDBIT,LCDDEK,AVGFRQ,ANGFRN,BESEDA,PRIKAZ ;0D LCDDAT,CAKAJ,AVGFRQ,AVGFRN,BESEDA,PRIKAZ ;0E LCDDAT oscilator za BACKPLANE in utripanje stevilk ;0F PREKIN,FRQMET gornji bajt visokega stevca frekvence ;10,11,12,13 LCDDAT vsebina zaslona ;14,15 FRQMET,AVGFRQ,SUMTST,NICLA,BESEDA,PRIKAZ,BRISI izmerjena frekvenca ;16,17,18,19 INIPIC,AVGFRQ povprecenje frekvence ;1A,1B PREKIN,FRQMET,AVGFRN,SUMTST izmerjena frekvenca nizko ;1C,1D,1E,1F INIPIC,AVGFRN povprecenje frekvence nizko ;20,21 GOVOR stevec stanja ;25 NICLA stevec pritiska tipke ;*** Start program, inicializacije *** LIST P=16F84 ORG 0 CALL INIPIC ;inicializacija vrat PICa CLRF 20 ;inicializacija GOVOR CLRF 25 ;zakasnitev tipke NICLA GOTO GLAVNI ;*** Prekinitveni program frekvencmetrov (0F,01) in (1A,1B) *** (0F,1A,1B) ORG 4 PREKIN BTFSS 0B,2 ;visoki frekvencmeter T0IF? GOTO PREKIN1 INCFSZ 0F,1 NOP BCF 0B,2 ;resetira T0IF PREKIN1 BTFSS 0B,1 ;nizki frekvencmeter INTF? RETFIE INCFSZ 1B,1 GOTO PREKIN2 INCFSZ 1A,1 NOP PREKIN2 BCF 0B,1 ;resetira INTF RETFIE ;*** Inicializacija vrat PICa *** INIPIC MOVLW 0 ;zacetno stanje vrat A=00000 MOVWF 5 MOVLW 80 ;zacetno stanje vrat B=10000000 MOVWF 6 BSF 3,5 ;postavi PAGE1 MOVLW 0B ;port A: vhoda RA0,1 izhod RA2, vhod RA3, izhod RA4 MOVWF 5 ;vpisi TRISA MOVLW 21 ;port B: vhoda RB0,RB5, izhodi RB1-4,RB6-7 MOVWF 6 ;vpisi TRISB CLRWDT MOVLW 0B0 ;OPTION: RTS, RTE, preskaler:2 MOVWF 1 BCF 3,5 ;postavi PAGE0 MOVLW 30 ;INTCON: T0IE, INTE MOVWF 0B MOVLW 0F0 ;zacetne vrednosti povprecenja MOVWF 16 MOVWF 17 MOVWF 18 MOVWF 19 MOVWF 1C MOVWF 1D MOVWF 1E MOVWF 1F RETURN ;*** Dvojna zanka cakanja 25ms pri taktu 20MHz *** (0D) CAKAJ MOVLW 0B4 MOVWF 0D CAKAJ1 CALL CAKAJ2 DECF 0D,1 BTFSS 3,2 GOTO CAKAJ1 RETURN CAKAJ2 MOVLW 82 CAKAJ3 NOP ADDLW 0FF BTFSS 3,2 GOTO CAKAJ3 RETURN ;*** Frekvencmeter vhoda RA4 *** (0F,14,15,1A,1B) FRQMET CLRF 1 ;resetiraj vse stiri stevce CLRF 0F CLRF 1A CLRF 1B BSF 0B,7 ;zanka meritve postavi GIE in RA4 BSF 5,4 CALL CAKAJ BCF 0B,7 ;ustavi meritev GIE in RA4 BCF 5,4 BCF 3,0 ;deli nizki rezultat (1A,1B) z 2 RRF 1A,1 RRF 1B,1 MOVF 1,0 ;prepis visokega rezultata v (14,15) MOVWF 15 MOVF 0F,0 MOVWF 14 ADDLW 0E1 ;omejitev visokega rezultata na 1F00 BTFSS 3,0 RETURN MOVLW 1F MOVWF 14 CLRF 15 RETURN ;*** Povpreci frekvenco (14,15) v (16,17,18,19) *** (0C,0D,14,15,16,17,18,19) AVGFRQ MOVF 16,0 ;prepisi (16,17) v (0C,0D) - prvo povprecenje MOVWF 0C MOVF 17,0 MOVWF 0D CALL AVGFRQ1 ;deli povprecje /2^N CALL AVGFRQ3 ;odstej (0C,0D) od (14,15) MOVF 14,0 ;pristej razliko (14,15) povprecju (16,17) ADDWF 16,1 MOVF 15,0 ADDWF 17,1 BTFSC 3,0 INCF 16,1 MOVF 16,0 ;prepisi (16,17) v (0C,0D) MOVWF 0C MOVF 17,0 MOVWF 0D CALL AVGFRQ1 ;deli povprecje /2^N CALL AVGFRQ4 ;prepisi (0C,0D) v (14,15) MOVF 18,0 ;prepisi (18,19) v (0C,0D) - drugo povprecenje MOVWF 0C MOVF 19,0 MOVWF 0D CALL AVGFRQ1 ;deli povprecje /2^N CALL AVGFRQ3 ;odstej (0C,0D) od (14,15) MOVF 14,0 ;pristej razliko (14,15) povprecju (18,19) ADDWF 18,1 MOVF 15,0 ADDWF 19,1 BTFSC 3,0 INCF 18,1 MOVF 18,0 ;prepisi (18,19) v (0C,0D) MOVWF 0C MOVF 19,0 MOVWF 0D CALL AVGFRQ1 ;deli povprecje /2^N CALL AVGFRQ4 ;prepisi (0C,0D) v (14,15) RETURN AVGFRQ1 MOVLW 3 ;deli za N=3, (0C,0D)/2^N=8 AVGFRQ2 BCF 3,0 ;zanka pomika vsebine za eno mesto nazaj RRF 0C,1 RRF 0D,1 ADDLW 0FF BTFSS 3,2 GOTO AVGFRQ2 RETURN AVGFRQ3 MOVF 0C,0 ;odstej (0C,0D) od (14,15) SUBWF 14,1 MOVF 0D,0 SUBWF 15,1 BTFSS 3,0 DECF 14,1 RETURN AVGFRQ4 MOVF 0C,0 ;prepisi (0C,0D) v (14,15) MOVWF 14 MOVF 0D,0 MOVWF 15 RETURN ;*** Povpreci f.nizko (1A,1B) v (1C,1D,1E,1F) *** (0C,0D,1A,1B,1C,1D,1E,1F) AVGFRN MOVF 1C,0 ;prepisi (1C,1D) v (0C,0D) - prvo povprecenje MOVWF 0C MOVF 1D,0 MOVWF 0D CALL AVGFRN1 ;deli povprecje /2^N CALL AVGFRN3 ;odstej (0C,0D) od (1A,1B) MOVF 1A,0 ;pristej razliko (1A,1B) povprecju (1C,1D) ADDWF 1C,1 MOVF 1B,0 ADDWF 1D,1 BTFSC 3,0 INCF 1C,1 MOVF 1C,0 ;prepisi (1C,1D) v (0C,0D) MOVWF 0C MOVF 1D,0 MOVWF 0D CALL AVGFRN1 ;deli povprecje /2^N CALL AVGFRN4 ;prepisi (0C,0D) v (1A,1B) MOVF 1E,0 ;prepisi (1E,1F) v (0C,0D) - drugo povprecenje MOVWF 0C MOVF 1F,0 MOVWF 0D CALL AVGFRN1 ;deli povprecje /2^N CALL AVGFRN3 ;odstej (0C,0D) od (1A,1B) MOVF 1A,0 ;pristej razliko (1A,1B) povprecju (1E,1F) ADDWF 1E,1 MOVF 1B,0 ADDWF 1F,1 BTFSC 3,0 INCF 1E,1 MOVF 1E,0 ;prepisi (1E,1F) v (0C,0D) MOVWF 0C MOVF 1F,0 MOVWF 0D CALL AVGFRN1 ;deli povprecje /2^N CALL AVGFRN4 ;prepisi (0C,0D) v (1A,1B) RETURN AVGFRN1 MOVLW 3 ;deli za N=3, (0C,0D)/2^N=8 AVGFRN2 BCF 3,0 ;zanka pomika vsebine za eno mesto nazaj RRF 0C,1 RRF 0D,1 ADDLW 0FF BTFSS 3,2 GOTO AVGFRN2 RETURN AVGFRN3 MOVF 0C,0 ;odstej (0C,0D) od (1A,1B) SUBWF 1A,1 MOVF 0D,0 SUBWF 1B,1 BTFSS 3,0 DECF 1A,1 RETURN AVGFRN4 MOVF 0C,0 ;prepisi (0C,0D) v (1A,1B) MOVWF 1A MOVF 0D,0 MOVWF 1B RETURN ;*** Odstej OFFSET zakasnitve instalacije *** (14,15,25) NICLA MOVLW 3 ;naslov OFFSETa MOVWF 9 BTFSS 5,1 ;tipka za OFFSET? GOTO NICLA1 CLRF 25 GOTO NICLA4 NICLA1 INCF 25,1 ;stevec cakanja? BTFSS 3,2 GOTO NICLA3 MOVF 15,0 ;vpisi OFFSET 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 NICLA2 BTFSS 8,4 ;EECON1 EEIF test GOTO NICLA2 BCF 8,4 ;EECON1 EEIF reset BCF 8,2 ;EECON1 WREN reset BCF 3,5 ;postavi PAGE0 NICLA3 CLRF 14 ;pobrisi rezultat meritve CLRF 15 NICLA4 BSF 3,5 ;postavi PAGE1 - precitaj OFFSET iz EEPROMa BSF 8,0 ;EECON1 RD BCF 3,5 ;postavi PAGE0 MOVF 8,0 SUBWF 15,1 ;odstej OFFSET od (14,15) BTFSS 3,0 DECF 14,1 RETURN ;*** Preveri slabe podatke z monoflopom *** (14,15,1A,1B) SUMTST MOVF 14,0 ;visoki visoko >128ft? ANDLW 0FE BTFSC 3,2 GOTO SUMTST1 MOVLW 0D ;napaka monoflop? BTFSC 5,3 MOVWF 14 RETURN SUMTST1 BTFSS 5,3 ;monoflop zadosti nizko? RETURN MOVF 1A,0 ;nizki nizko <64ft? BTFSS 3,2 RETURN MOVF 1A,0 ;prepisi nizki rezultat MOVWF 14 MOVF 1B,0 MOVWF 15 RETURN ;*** Glavna zanka programa *** GLAVNI CALL FRQMET CALL AVGFRQ CALL AVGFRN CALL SUMTST CALL NICLA MOVF 0E,0 ;prikazi novo vsakih 8 zank = 5Hz ANDLW 7 BTFSC 3,2 CALL PRIKAZ CALL LCDDAT CALL GOVOR GOTO GLAVNI ;*** Zanka govornega cipa ISD2560P (zakasnitev 25ms) *** (20,21) GOVOR MOVF 20,0 ;stanje 0 reset impulz PD BTFSS 3,2 GOTO GOVOR1 BSF 6,6 INCF 20,1 ;naslednje stanje RETURN GOVOR1 ADDLW 0FF ;stanje 1 - cakanje PD in stevilka sporocila BTFSS 3,2 GOTO GOVOR2 BCF 6,6 CALL BESEDA ;izracunaj stevilko sporocila v (21) INCF 20,1 ;naslednje stanje RETURN GOVOR2 ADDLW 0FF ;stanje 2 - izbira sporocila /CE+M0 BTFSS 3,2 GOTO GOVOR3 MOVF 21,0 ;beseda 0 preskoci v naslednje stanje BTFSC 3,2 GOTO GOVOR4 BSF 6,4 CALL GOVOR6 ;impulz /CE z zakasnitvami BCF 6,4 DECF 21,1 ;odstevanje stevca sporocila BTFSC 3,2 INCF 20,1 ;naslednje stanje RETURN GOVOR3 ADDLW 0FF ;stanje 3 - zacetek sporocila /CE BTFSS 3,2 GOTO GOVOR5 GOVOR4 CALL GOVOR6 ;impulz /CE z zakasnitvami INCF 20,1 BCF 0B,0 ;pobrisi konec sporocila RBIF MOVLW 40 ;kuzapazi za RBIF!!!!!!!!!!!!!!!!!!!!!!!!!! MOVWF 21 RETURN GOVOR5 DECF 21,1 ;stanje 4 - oddaja sporocila + kuzapazi BTFSC 3,2 CLRF 20 ;zacetno stanje 0 iz kuzapazija BTFSC 0B,0 CLRF 20 ;zacetno stanje 0 iz RBIF RETURN GOVOR6 NOP ;impulz /CE z zakasnitvami NOP NOP BCF 6,7 NOP NOP NOP BSF 6,7 RETURN ;*** Izbira besede za odgovor *** (0C,0D,14,15,21) BESEDA CLRF 21 ;"minus" BTFSC 14,7 RETURN RRF 14,0 ;deli /2 v (0C,0D) MOVWF 0C BCF 0C,7 RRF 15,0 MOVWF 0D MOVF 0C,1 ;vecje od 8 bitov (128ft)? BTFSS 3,2 GOTO BESEDA1 INCF 21,1 ;"nula" ADDLW 0FF BTFSS 3,0 RETURN INCF 21,1 ;"pol" ADDLW 0FF BTFSS 3,0 RETURN INCF 21,1 ;"eden" ADDLW 0FE BTFSS 3,0 RETURN INCF 21,1 ;"dva" ADDLW 0FE BTFSS 3,0 RETURN INCF 21,1 ;"tri" ADDLW 0FE BTFSS 3,0 RETURN INCF 21,1 ;"stiri" ADDLW 0FE BTFSS 3,0 RETURN INCF 21,1 ;"pet" ADDLW 0FC BTFSS 3,0 RETURN INCF 21,1 ;"sedem" ADDLW 0FA BTFSS 3,0 RETURN INCF 21,1 ;"deset" ADDLW 0F6 BTFSS 3,0 RETURN INCF 21,1 ;"petnajst" ADDLW 0F6 BTFSS 3,0 RETURN INCF 21,1 ;"dvajset" ADDLW 0EC BTFSS 3,0 RETURN INCF 21,1 ;"trideset" ADDLW 0D8 BTFSS 3,0 RETURN INCF 21,1 ;"petdeset" ADDLW 0D8 BTFSS 3,0 RETURN INCF 21,1 ;"sedemdeset" ADDLW 0C4 BTFSS 3,0 RETURN INCF 21,1 ;"sto" RETURN BESEDA1 MOVLW 0F ;"sto" MOVWF 21 MOVLW 0C8 SUBWF 0D,1 BTFSS 3,0 DECF 0C,1 MOVLW 64 ;"stopetdeset" SUBWF 0D,1 BTFSS 3,0 DECF 0C,1 BTFSC 0C,7 RETURN INCF 21,1 MOVLW 64 ;"dvesto" in ostale stotice BESEDA2 SUBWF 0D,1 BTFSS 3,0 DECF 0C,1 BTFSC 0C,7 RETURN INCF 21,1 MOVLW 0C8 GOTO BESEDA2 ;*** Nabor besed: *** ;minus,nula,pol,eden,dva,tri,stiri,pet,sedem,deset,petnajst,dvajset ;trideset,petdeset,sedemdeset,sto,dvesto,tristo,stiristo,petsto ;*** Sledi vec kratkih praznin do konca cipa!!! *** ;*** Prikaz rezultata meritve (14,15) *** (0C,0D,10,11,12,13,14,15) PRIKAZ MOVF 14,0 ;prve tri cele stevilke MOVWF 0C MOVF 15,0 MOVWF 0D BTFSS 14,7 ;pretvori negativno v pozitivno? GOTO PRIKAZ1 COMF 0C,1 COMF 0D,1 INCF 0D,1 BTFSC 3,2 INCF 0C,1 PRIKAZ1 MOVLW 0F4 ;prevelik rezultat? ADDWF 0C,0 BTFSC 3,0 GOTO PRIKAZ4 RLF 0D,0 ;decimalka pomnozena z 2.5 v (13) ANDLW 6 BTFSC 0D,1 ADDLW 1 MOVWF 13 RRF 0C,1 ;celi del /4 in odstrani zadnja dva bita RRF 0D,1 RRF 0C,1 RRF 0D,1 MOVLW 3F ANDWF 0C,1 MOVLW 64 ;izracunaj stotice v (10) CLRF 10 PRIKAZ2 INCF 10,1 SUBWF 0D,1 BTFSC 3,0 GOTO PRIKAZ2 DECF 0C,1 BTFSS 0C,7 GOTO PRIKAZ2 ADDWF 0D,1 DECF 10,1 MOVLW 0A ;izracunaj desetice v (11) CLRF 11 PRIKAZ3 INCF 11,1 SUBWF 0D,1 BTFSC 3,0 GOTO PRIKAZ3 ADDWF 0D,1 DECF 11,1 MOVF 0D,0 ;prepisi enice v (12) MOVWF 12 CALL BRISI ;brisanje nesmiselnih pozitivnih stevilk MOVF 10,0 ;pretvori stotice v (10) BTFSS 3,2 CALL LCDDEK MOVWF 10 MOVWF 0C MOVF 11,0 ;pretvori desetice v (11) ADDWF 0C,1 BTFSS 3,2 CALL LCDDEK MOVWF 11 MOVF 12,0 ;pretvori enice v (12) CALL LCDDEK MOVWF 12 MOVF 13,0 ;pretvori decimalko v (13) CALL LCDDEK MOVWF 13 MOVLW 80 ;narisi minus v (10)? BTFSC 14,7 MOVWF 10 BSF 12,0 ;vkljuci decimalno piko v (12) RETURN PRIKAZ4 CLRF 10 ;preveliko: utripajoce dvopicje CLRF 11 CLRF 12 CLRF 13 BTFSC 0E,4 BSF 13,0 RETURN ;*** Brisanje nesmiselnih pozitivnih stevilk *** (10,11,12,13,14) BRISI BTFSC 14,7 ;pozitivno stevilo? RETURN MOVF 11,0 ;druga brise cetrto? BTFSS 3,2 CLRF 13 MOVF 10,0 ;prva brise cetrto in tretjo? BTFSC 3,2 RETURN CLRF 12 CLRF 13 RETURN ;*** Convert stevilko v 7-segment zapis *** (0C) LCDDEK MOVWF 0C INCF 0C,1 MOVLW 7E ;Numerial 0 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 12 ;Numerial 1 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0BC ;Numerial 2 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0B6 ;Numerial 3 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0D2 ;Numerial 4 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0E6 ;Numerial 5 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0EE ;Numerial 6 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 32 ;Numerial 7 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0FE ;Numerial 8 DECF 0C,1 BTFSC 3,2 RETURN MOVLW 0F6 ;Numerial 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 shift register *** (0D,0E) LCDDAT MOVF 13,0 ;(13) v shift register MOVWF 0D BTFSS 0E,0 COMF 0D,1 CALL LCDBIT MOVF 12,0 ;(12) v shift register MOVWF 0D BTFSS 0E,0 COMF 0D,1 CALL LCDBIT MOVF 11,0 ;(11) v shift register MOVWF 0D BTFSS 0E,0 COMF 0D,1 CALL LCDBIT MOVF 10,0 ;(10) v shift 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 NOP ;impulz STROBE=RB1 NOP NOP NOP BSF 6,1 NOP NOP NOP 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 NOP NOP NOP BSF 6,3 ;taktni impulz CLOCK=RB3 NOP NOP NOP NOP BCF 6,3 DECFSZ 0C,1 ;stevec zanke po 8 bitih GOTO LCDBIT1 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 2103 DW 0 ;OFFSET zakasnitve instalacije END ;*** Konec programa ***