;*** Zirokompas s PIC 16F88 - S53MV - 14.07.2006 *** ;*** Uporaba portov, notranji takt 8MHz, brez prekinitev *** ;analogni vhod RA0 - kompas VZHOD(RA4=1) ZAHOD(RA4=0) ;analogni vhod RA1 - kompas SEVER(RA4=1) JUG(RA4=0) ;analogni izhod RA2 - zaga za 14-bitni A/D ;analogni vhod RA3 - ziroskop ;digitalni izhod RA4 - preklopnik ;digitalni vhod RA5 - tipka s pullup ;LCD.E=RA6 ;LCD.RS=RA7 ;LCD.D0-7=RB0-7 ;*** Uporaba RAMa *** ;20,21,22,23 ADKOMP A/D kompasa (vzhod,sever) ;24,25,26,27 KOFLIP, POVPRE, KOMPK komponente (vzhod,sever) ;28,29,2A KOFLIP, ADGYRO A/D in povprecenje ziroskopa ;2B CAKAJ40, RMEM, WMEM ;2C,2D,2E,2F NAKLJUC notranje stanje ;30,31 ARCTAN rezultat ;32,33,34,35 ARCTAN, CORDIC racunanje ;36,37,38,39 STOPIN, STEVIL azimut ;3A,3B,3C STOPIN, CRTA, IZPIS vhodni podatki ;3D STEVIL, CRTA, IZPIS racunanje ;3E,3F TIPKA, INIGYR spomin izbrane smeri ;40,41,42 KOMPK racunanje ;43,44,45 POVPRE povprecenje ziroskopa ;46 POVPRE stevec povprecenja s 64 ;47,48,49 GYRINT racunanje ;4A,4B,4C GYRINT, TIPKA, INIGYR azimut ziroskopa ;4D,4E,4F OFFSET, TIPKA, INIGYR offset ziroskopa iz EEPROMa ;50,51,52,53 KOMPK, EPARAM konstante za umerjanje kompasa iz EEPROMa ;54 TIPKA, INIGYR stevec cakanja ukaza ;55 CAKAJP, TIPKA, INIGYR pritisk tipke ;56,57 HEXB izpis bajta W heksadecimalno ;58,59,5A EPARAM racunanje ;*** Zacetek programa *** LIST P=16F88 ORG 0 ZACETEK CALL INIPIC ;inicializacija PIC 16F88 CALL RMEM ;prepisi konstante iz EEPROMa CALL INILCD ;inicializacija HD44780 CALL CGRAM ;posebni znaki v HD44780 CALL INIGYR ;zacetno stanje ziroskopa GOTO ZANKA ;*** Inicializacija PIC 16F88 *** INIPIC CLRF 5 ;zacetno stanje PORTA in PORTB CLRF 6 MOVLW 81 ;ADCON0 FOSC/32 in ADON MOVWF 1F BSF 3,5 ;postavi PAGE1 MOVLW 2F ;port A: vhodi RA0-3,5 in izhodi RA4,6-7 MOVWF 5 ;vpisi TRISA MOVLW 0 ;port B: izhodi RB0-7 MOVWF 6 ;vpisi TRISB MOVLW 0F ;ANSEL 00001111 analogni RA0-3, digitalni RA4-7 MOVWF 1B BSF 1F,7 ;ADCON1 desno poravnano ADFM MOVLW 70 ;nastavi RC oscilator na 111 v OSCCON - takt 8MHz IORWF 0F,1 BCF 3,5 ;postavi PAGE0 RETURN ;*** Glavna zanka *** ZANKA CALL POVPRE CALL KOMPK CALL ARCTAN CALL GYRINT CALL TIPKA CALL IZPIS GOTO ZANKA ;*** Kompenzacija kompasa *** (24,25,26,27,40,41,42,50,51,52,53) KOMPK MOVF 50,0 ;offset E ADDWF 24,1 MOVF 24,0 ;mnozenje E MOVWF 40 MOVF 25,0 MOVWF 41 MOVF 51,0 MOVWF 42 CLRF 24 CLRF 25 KOMPK1 RRF 40,1 ;predznaceno/2 RRF 41,1 BCF 40,7 BTFSC 40,6 BSF 40,7 BTFSS 42,7 ;pristevanje 16-bitno? GOTO KOMPK2 MOVF 40,0 ADDWF 24,1 MOVF 41,0 ADDWF 25,1 BTFSC 3,0 INCF 24,1 KOMPK2 MOVF 42,0 ;konec zanke mnozenja? ADDWF 42,1 BTFSS 3,2 GOTO KOMPK1 MOVF 52,0 ;offset N ADDWF 26,1 MOVF 26,0 ;mnozenje N MOVWF 40 MOVF 27,0 MOVWF 41 MOVF 53,0 MOVWF 42 CLRF 26 CLRF 27 KOMPK3 RRF 40,1 ;predznaceno/2 RRF 41,1 BCF 40,7 BTFSC 40,6 BSF 40,7 BTFSS 42,7 ;pristevanje 16-bitno? GOTO KOMPK4 MOVF 40,0 ADDWF 26,1 MOVF 41,0 ADDWF 27,1 BTFSC 3,0 INCF 26,1 KOMPK4 MOVF 42,0 ;konec zanke mnozenja? ADDWF 42,1 BTFSS 3,2 GOTO KOMPK3 RETURN ;*** Tipka za reset ziroskopa *** (3E,3F,4A,4B,4C,4D,4E,4F,54,55) TIPKA MOVF 55,0 ;preveri pritisnjena tipka? BTFSS 3,2 GOTO TIPKA1 MOVLW 10 MOVWF 54 RETURN TIPKA1 CLRF 55 ;pobrisi pritisk tipke MOVF 30,0 ;prepisi kompas v ziroskop MOVWF 4A MOVF 31,0 MOVWF 4B CLRF 4C MOVF 4A,0 ;prepisi ziroskop v CDI spomin MOVWF 3E MOVF 4B,0 MOVWF 3F DECFSZ 54,1 RETURN MOVLW 80 ;naslov LCD zacetek prve vrstice CALL UKAZ MOVLW 4F ;"O" - OFFSET>>>EEPROM CALL ZNAK MOVLW 46 ;"F" CALL ZNAK MOVLW 46 ;"F" CALL ZNAK MOVLW 53 ;"S" CALL ZNAK MOVLW 45 ;"E" CALL ZNAK MOVLW 54 ;"T" CALL ZNAK MOVLW 3E ;">" CALL ZNAK MOVLW 3E ;">" CALL ZNAK MOVLW 3E ;">" CALL ZNAK MOVLW 45 ;"E" CALL ZNAK MOVLW 45 ;"E" CALL ZNAK MOVLW 50 ;"P" CALL ZNAK MOVLW 52 ;"R" CALL ZNAK MOVLW 4F ;"O" CALL ZNAK MOVLW 4D ;"M" CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 0C0 ;naslov LCD zacetek druge vrstice CALL UKAZ MOVLW 4F ;"O" - OFFSET CALL ZNAK MOVLW 46 ;"F" CALL ZNAK MOVLW 46 ;"F" CALL ZNAK MOVLW 53 ;"S" CALL ZNAK MOVLW 45 ;"E" CALL ZNAK MOVLW 54 ;"T" CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVF 4D,0 CALL HEXB MOVF 4E,0 CALL HEXB MOVF 4F,0 CALL HEXB MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK CALL WMEM ;prepisi offset ziroskopa v EEPROM CALL POVPRE ;zakasnitev za prikaz na LCDju CALL POVPRE CALL POVPRE GOTO ZACETEK ;*** Izpis podatkov na LCD zaslon *** (3A,3B,3C,3D) IZPIS MOVLW 80 ;naslov za LCD prva vrstica CALL UKAZ MOVF 4A,0 ;razlika ziroskop(4A,4B)-spomin(3E,3F) MOVWF 3A MOVF 4B,0 MOVWF 3B MOVF 3E,0 SUBWF 3A,1 MOVF 3F,0 SUBWF 3B,1 BTFSS 3,0 DECF 3A,1 MOVLW 4 ;polni diamant za izpis CDI CALL CRTA MOVF 4A,0 ;pretvori integracijo ziroskopa v stopinje MOVWF 3A MOVF 4B,0 MOVWF 3B CALL STOPIN CALL STEVIL MOVLW 0C0 ;naslov za LCD druga vrstica CALL UKAZ MOVF 4D,0 ;offset(4D,4E)/2 v (3A,3B) MOVWF 3A MOVF 4E,0 MOVWF 3B RRF 3A,1 RRF 3B,1 BCF 3A,7 MOVF 43,0 MOVWF 3C MOVF 44,0 ;ziroskop(43,44))/2 v (3C,3D) MOVWF 3D RRF 3C,1 RRF 3D,1 BCF 3C,7 MOVF 3C,0 ;razlika (3A,3B)-(3C,3D) SUBWF 3A,1 MOVF 3D,0 SUBWF 3B,1 BTFSS 3,0 DECF 3A,1 CALL IZPIS1 ;pogojno mnozenje s 4 CALL IZPIS1 MOVLW 7 ;votli diamant za izpis hitrosti sukanja CALL CRTA MOVF 30,0 ;pretvori azimut kompasa v stopinje MOVWF 3A MOVF 31,0 MOVWF 3B CALL STOPIN CALL STEVIL RETURN IZPIS1 CLRF 3C ;pogojno mnozenje z 2 BTFSC 3A,7 INCF 3C,1 BTFSC 3A,6 INCF 3C,1 BTFSC 3C,0 RETURN RLF 3B,1 RLF 3A,1 BCF 3B,0 RETURN ;*** Izpis stanja kompasa *** SKOMP CALL POVPRE MOVLW 80 ;naslov LCD zacetek prve vrstice CALL UKAZ MOVLW 4E ;"N" CALL ZNAK MOVF 26,0 CALL HEXB MOVF 27,0 CALL HEXB MOVLW 2B ;"+" CALL ZNAK MOVF 52,0 CALL HEXB MOVLW 2A ;"*" CALL ZNAK MOVF 53,0 CALL HEXB MOVLW 3D ;"=" CALL ZNAK MOVLW 0C0 ;naslov LCD zacetek druge vrstice CALL UKAZ MOVLW 45 ;"E" CALL ZNAK MOVF 24,0 CALL HEXB MOVF 25,0 CALL HEXB MOVLW 2B ;"+" CALL ZNAK MOVF 50,0 CALL HEXB MOVLW 2A ;"*" CALL ZNAK MOVF 51,0 CALL HEXB MOVLW 3D ;"=" CALL ZNAK CALL KOMPK MOVLW 8C ;naslov LCD 12.znak prve vrstice CALL UKAZ MOVF 26,0 CALL HEXB MOVF 27,0 CALL HEXB MOVLW 0CC ;naslov LCD 12.znak druge vrstice CALL UKAZ MOVF 24,0 CALL HEXB MOVF 25,0 CALL HEXB RETURN ;*** Stalni izpis stanja kompasa *** SSKOMP CALL SKOMP GOTO SSKOMP ;*** Izpis stanja ziroskopa *** SGYRO CALL POVPRE MOVLW 80 ;naslov LCD zacetek prve vrstice CALL UKAZ MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 47 ;"G" - GYRO CALL ZNAK MOVLW 59 ;"Y" CALL ZNAK MOVLW 52 ;"R" CALL ZNAK MOVLW 4F ;"O" CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVF 43,0 CALL HEXB MOVF 44,0 CALL HEXB MOVF 45,0 CALL HEXB MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 0C0 ;naslov LCD zacetek druge vrstice CALL UKAZ MOVLW 45 ;"E" - EEPROM CALL ZNAK MOVLW 45 ;"E" CALL ZNAK MOVLW 50 ;"P" CALL ZNAK MOVLW 52 ;"R" CALL ZNAK MOVLW 4F ;"O" CALL ZNAK MOVLW 4D ;"M" CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVF 4D,0 CALL HEXB MOVF 4E,0 CALL HEXB MOVF 4F,0 CALL HEXB MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK RETURN ;*** Nastavljanje EEPROM parametrov kompasa *** (50,51,52,53,58,59,5A) EPARAM CLRF 5A ;kazalec v parametrih MOVLW 80 ;stevec v zanki 128 MOVWF 58 EPARAM1 INCF 5A,0 ;izpis kazalca MOVWF 59 MOVLW 80 ;naslov LCD zacetek prve vrstice CALL UKAZ MOVLW 65 ;"e" CALL ZNAK MOVF 50,0 ;offset E kompasa CALL HEXB CALL EPARAM3 MOVLW 2A ;"*" CALL ZNAK MOVF 51,0 ;mnozenje E kompasa CALL HEXB CALL EPARAM3 MOVLW 6E ;"n" CALL ZNAK MOVF 52,0 ;offset N kompasa CALL HEXB CALL EPARAM3 MOVLW 2A ;"*" CALL ZNAK MOVF 53,0 ;mnozenje N kompasa CALL HEXB CALL EPARAM3 MOVLW 0C0 ;naslov LCD zacetek druge vrstice CALL UKAZ MOVLW 67 ;"g" CALL ZNAK MOVF 4D,0 CALL HEXB ;offset ziroskopa MOVF 4E,0 CALL HEXB MOVF 4F,0 CALL HEXB MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK CALL CAKAJ40 ;pocakaj 20ms CALL CAKAJ40 CALL CAKAJ40 CALL CAKAJ40 CALL CAKAJ40 BTFSC 5,5 ;preveri pritisnjena tipka? GOTO EPARAM2 BTFSC 58,7 ;pritisnjena >127 cakaj GOTO EPARAM1 INCF 58,1 ;pritisnjena <128 poveca stevec BTFSS 58,6 ;stevec >63? GOTO EPARAM1 BSF 58,7 ;postavi stevec >192 INCF 5A,1 ;poveca in omeji kazalec MOVLW 7 ANDWF 5A,1 CALL WMEM ;osvezi rezultat v EEPROM CALL RMEM GOTO EPARAM1 EPARAM2 MOVLW 3F ;odpuscena omeji stevec <64 ANDWF 58,1 MOVLW 0FD ;stevec >3 za kratek pritisk? ADDWF 58,0 CLRF 58 BTFSS 3,0 GOTO EPARAM1 RRF 5A,0 ;poveca/zmanjsa parameter ANDLW 3 ADDLW 50 MOVWF 4 MOVLW 1 BTFSC 5A,0 MOVLW 0FF ADDWF 0,1 GOTO EPARAM1 EPARAM3 MOVLW 20 ;izpisi presledek ali parameter +/- DECF 59,1 BTFSC 3,2 MOVLW 2B ;"+" DECF 59,1 BTFSC 3,2 MOVLW 2D ;"-" CALL ZNAK RETURN ;*** Zacetno stanje ziroskopa *** (3E,3F,4A,4B,4C,4D,4E,4F,54,55) INIGYR MOVLW 80 ;naslov LCD zacetek prve vrstice CALL UKAZ MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 47 ;"G" - GYROCOMPASS CALL ZNAK MOVLW 59 ;"Y" CALL ZNAK MOVLW 52 ;"R" CALL ZNAK MOVLW 4F ;"O" CALL ZNAK MOVLW 43 ;"C" CALL ZNAK MOVLW 4F ;"O" CALL ZNAK MOVLW 4D ;"M" CALL ZNAK MOVLW 50 ;"P" CALL ZNAK MOVLW 41 ;"A" CALL ZNAK MOVLW 53 ;"S" CALL ZNAK MOVLW 53 ;"S" CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 0C0 ;naslov LCD zacetek druge vrstice CALL UKAZ MOVLW 53 ;"S" - S53MV CALL ZNAK MOVLW 35 ;"5" CALL ZNAK MOVLW 33 ;"3" CALL ZNAK MOVLW 4D ;"M" CALL ZNAK MOVLW 56 ;"V" CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 31 ;"1" - 14.07.2006 CALL ZNAK MOVLW 34 ;"4" CALL ZNAK MOVLW 2E ;"." CALL ZNAK MOVLW 30 ;"0" CALL ZNAK MOVLW 37 ;"7" CALL ZNAK MOVLW 2E ;"." CALL ZNAK MOVLW 32 ;"2" CALL ZNAK MOVLW 30 ;"0" CALL ZNAK MOVLW 30 ;"0" CALL ZNAK MOVLW 36 ;"6" CALL ZNAK CALL POVPRE ;zacetno povprecenje 3-krat CALL POVPRE CALL POVPRE BTFSS 5,5 ;preveri pritisnjena tipka? GOTO EPARAM ;nastavljanje EEPROM parametrov CALL SKOMP ;izpis stanja kompasa 5-krat CALL SKOMP CALL SKOMP CALL SKOMP CALL SKOMP BTFSS 5,5 ;preveri pritisnjena tipka? GOTO SSKOMP ;stalni izpis stanja kompasa CALL SGYRO ;izpis stanja ziroskopa 5-krat CALL SGYRO CALL SGYRO CALL SGYRO CALL SGYRO CALL KOMPK ;izracunaj azimut kompasa CALL ARCTAN MOVF 30,0 ;prepisi kompas v ziroskop MOVWF 4A MOVF 31,0 MOVWF 4B CLRF 4C MOVF 4A,0 ;prepisi ziroskop v CDI spomin MOVWF 3E MOVF 4B,0 MOVWF 3F MOVLW 10 ;stevec TIPKA zakasnitev WMEM MOVWF 54 CLRF 55 ;pobrisi pritisk tipke BTFSC 5,5 ;preveri pritisnjena tipka? RETURN MOVLW 80 ;naslov LCD zacetek prve vrstice CALL UKAZ MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 47 ;"G" - GYRO-OFFSET CALL ZNAK MOVLW 59 ;"Y" CALL ZNAK MOVLW 52 ;"R" CALL ZNAK MOVLW 4F ;"O" CALL ZNAK MOVLW 2D ;"-" CALL ZNAK MOVLW 4F ;"O" CALL ZNAK MOVLW 46 ;"F" CALL ZNAK MOVLW 46 ;"F" CALL ZNAK MOVLW 53 ;"S" CALL ZNAK MOVLW 45 ;"E" CALL ZNAK MOVLW 54 ;"T" CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 0C0 ;naslov LCD zacetek druge vrstice CALL UKAZ MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK CALL POVPRE ;zacetno povprecenje cakaj 5-krat CALL POVPRE CALL POVPRE CALL POVPRE CALL POVPRE MOVLW 0C0 ;naslov LCD zacetek druge vrstice CALL UKAZ MOVLW 47 ;"G" - GYRO CALL ZNAK MOVLW 59 ;"Y" CALL ZNAK MOVLW 52 ;"R" CALL ZNAK MOVLW 4F ;"O" CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVF 43,0 CALL HEXB MOVF 44,0 CALL HEXB MOVF 45,0 CALL HEXB MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVLW 20 ;" " CALL ZNAK MOVF 43,0 ;resetiraj offset ziroskopa MOVWF 4D MOVF 44,0 MOVWF 4E MOVF 45,0 MOVWF 4F CLRF 55 ;pobrisi pritisk tipke RETURN ;*** Precitaj OFFSET iz EEPROMa *** (2B,4D,4E,4F,50,51,52,53) RMEM MOVLW 4D ;kazalec v RAMu MOVWF 4 BSF 3,6 ;postavi PAGE2 MOVLW 1 ;kazalec v EEPROMu MOVWF 0D MOVLW 7 ;precitaj 7 bajtov MOVWF 2B RMEM4 CALL RMEM1 DECFSZ 2B,1 GOTO RMEM4 BCF 3,6 ;postavi PAGE0 RETURN RMEM1 BSF 3,5 ;postavi PAGE3 - precitaj bajt in povecaj stevca BCF 0C,7 ;EECON1 EEPGD BSF 0C,0 ;EECON1 RD BCF 3,5 ;postavi PAGE2 MOVF 0C,0 MOVWF 0 INCF 4,1 ;povecaj stevca INCF 0D,1 RETURN ;*** Vpisi OFFSET v EEPROM *** (2B,4D,4E,4F,50,51,52,53) WMEM MOVLW 4D ;kazalec v RAMu MOVWF 4 BSF 3,6 ;postavi PAGE2 MOVLW 1 ;kazalec v EEPROMu MOVWF 0D MOVLW 7 ;vpisi 7 bajtov MOVWF 2B WMEM4 CALL WMEM1 DECFSZ 2B,1 GOTO WMEM4 BCF 3,6 ;postavi PAGE0 RETURN WMEM1 BSF 3,5 ;postavi PAGE3 - primerjaj vsebino EEPROMa BCF 0C,7 ;EECON1 EEPGD BSF 0C,0 ;EECON1 RD BCF 3,5 ;postavi PAGE2 MOVF 0C,0 SUBWF 0,0 BTFSC 3,2 GOTO WMEM3 MOVF 0,0 ;razlika - vpisi novo vsebino v EEPROM MOVWF 0C BSF 3,5 ;postavi PAGE3 BCF 0C,7 ;EECON1 EEPGD BSF 0C,2 ;EECON1 WREN set MOVLW 55 MOVWF 0D ;EECON2 55 MOVLW 0AA MOVWF 0D ;EECON2 0AA BSF 0C,1 ;EECON1 WR WMEM2 BTFSC 0C,1 ;EECON1 WR test GOTO WMEM2 BCF 0C,2 ;EECON1 WREN reset BCF 3,5 ;postavi PAGE2 WMEM3 INCF 4,1 ;povecaj stevca INCF 0D,1 RETURN ;*** Izrisi odstopanje stopinje=crtice *** (3A,3B,3C,3D) CRTA MOVWF 3D ;sredinski znak BTFSS 3A,7 ;predznak rezultata? GOTO CRTA4 COMF 3B,1 ;negativni rezultat COMF 3A,1 INCF 3B,1 BTFSC 3,2 INCF 3A,1 MOVLW 0 ;praznina na levi CALL ZNAK MOVLW 0 CALL ZNAK MOVLW 0 CALL ZNAK MOVLW 0 CALL ZNAK MOVLW 0 CALL ZNAK MOVLW 0 CALL ZNAK MOVF 3D,0 ;sredinski znak CALL ZNAK CALL STOPIN ;stopinje do 180 v (37) za negativno MOVLW 6 MOVWF 3C CRTA1 MOVLW 3 ;po tri crtice v desno SUBWF 37,1 BTFSS 3,0 GOTO CRTA2 MOVLW 3 CALL ZNAK DECFSZ 3C,1 GOTO CRTA1 RETURN CRTA2 ADDWF 37,0 ;delne crtice 0-2 v desno CALL ZNAK DECF 3C,1 BTFSC 3,2 RETURN CRTA3 MOVLW 0 ;ostanek praznine v desno CALL ZNAK DECFSZ 3C,1 GOTO CRTA3 RETURN CRTA4 CALL STOPIN ;stopinje do 180 v (37) za pozitivno MOVLW 6 MOVWF 3C BTFSC 37,7 GOTO CRTA7 MOVLW 12 SUBWF 37,1 BTFSC 3,0 GOTO CRTA7 CRTA5 MOVLW 3 ;praznine na levi ADDWF 37,1 BTFSC 3,0 GOTO CRTA6 MOVLW 0 CALL ZNAK DECFSZ 3C,1 GOTO CRTA5 GOTO CRTA8 CRTA6 MOVLW 4 ;delne crtice 0-2 v levo BTFSS 3,2 IORWF 37,1 MOVF 37,0 CALL ZNAK DECF 3C,1 BTFSC 3,2 GOTO CRTA8 CRTA7 MOVLW 3 ;ostanek polnine v levo CALL ZNAK DECFSZ 3C,1 GOTO CRTA7 CRTA8 MOVF 3D,0 ;sredinski znak CALL ZNAK MOVLW 0 ;praznina na desni CALL ZNAK MOVLW 0 CALL ZNAK MOVLW 0 CALL ZNAK MOVLW 0 CALL ZNAK MOVLW 0 CALL ZNAK MOVLW 0 CALL ZNAK RETURN ;*** Integracija ziroskopa *** (47,48,49,4A,4B,4C) GYRINT CLRF 47 ;razlika (kompas-ziroskop)/256 MOVF 30,0 MOVWF 48 MOVF 4A,0 SUBWF 48,1 MOVF 31,0 MOVWF 49 MOVF 4B,0 SUBWF 49,1 BTFSS 3,0 DECF 48,1 BTFSC 48,7 DECF 47,1 CALL GYRINT4 ;pomnozi *4 CALL GYRINT4 CALL GYRINT2 ;pristej azimutu ziroskopa CALL GYRINT5 ;deljenje /256 CALL GYRINT5 CALL GYRINT5 CALL GYRINT5 CALL GYRINT5 CALL GYRINT5 CALL GYRINT5 CALL GYRINT5 CALL GYRINT6 ;odstej od offseta ziroskopa MOVF 43,0 ;pristej izhod ziroskopa MOVWF 47 MOVF 44,0 MOVWF 48 MOVF 45,0 MOVWF 49 CALL GYRINT1 CALL GYRINT2 MOVF 4D,0 ;odstej offset ziroskopa MOVWF 47 MOVF 4E,0 MOVWF 48 MOVF 4F,0 MOVWF 49 CALL GYRINT1 CALL GYRINT3 RETURN GYRINT1 RRF 47,1 ;deli nepredznaceno (47,48,49) z 2 RRF 48,1 RRF 49,1 BCF 47,7 RETURN GYRINT2 MOVF 47,0 ;pristej (47,48,49) vsoti (4A,4B,4C) ADDWF 4A,1 MOVF 48,0 ADDWF 4B,1 BTFSC 3,0 INCF 4A,1 MOVF 49,0 ADDWF 4C,1 BTFSS 3,0 RETURN INCF 4B,1 BTFSC 3,2 INCF 4A,1 RETURN GYRINT3 MOVF 47,0 ;odstej (47,48,49) od vsote (4A,4B,4C) SUBWF 4A,1 MOVF 48,0 SUBWF 4B,1 BTFSS 3,0 DECF 4A,1 MOVF 49,0 SUBWF 4C,1 BTFSC 3,0 RETURN MOVLW 1 SUBWF 4B,1 BTFSS 3,0 DECF 4A,1 RETURN GYRINT4 RLF 49,1 ;pomnozi (47,48,49) z 2 RLF 48,1 RLF 47,1 BCF 49,0 RETURN GYRINT5 RRF 47,1 ;deli predznaceno (47,48,49) z 2 RRF 48,1 RRF 49,1 BCF 47,7 BTFSC 47,6 BSF 47,7 RETURN GYRINT6 MOVF 47,0 ;odstej (47,48,49) od offseta (4D,4E,4F) SUBWF 4D,1 MOVF 48,0 SUBWF 4E,1 BTFSS 3,0 DECF 4D,1 MOVF 49,0 SUBWF 4F,1 BTFSC 3,0 RETURN MOVLW 1 SUBWF 4E,1 BTFSS 3,0 DECF 4D,1 RETURN ;*** Povprecenje kompasa in ziroskopa *** (24,25,26,27,43,44,45,46) POVPRE CLRF 24 ;reset kompasa CLRF 25 CLRF 26 CLRF 27 CLRF 43 ;reset ziroskopa CLRF 44 CLRF 45 MOVLW 40 ;povprecenje 64-krat MOVWF 46 POVPRE1 CALL KOFLIP ;meritev komponent in ziroskopa MOVF 28,0 ;povprecenje ziroskopa ADDWF 44,1 BTFSC 3,0 INCF 43,1 MOVF 29,0 ADDWF 45,1 BTFSS 3,0 GOTO POVPRE2 INCF 44,1 BTFSC 3,2 INCF 43,1 POVPRE2 DECFSZ 46,1 GOTO POVPRE1 RLF 45,1 ;ziroskop*4 RLF 44,1 RLF 43,1 BCF 45,0 RLF 45,1 RLF 44,1 RLF 43,1 BCF 45,0 RETURN ;*** Izpis trimestnega decimalnega stevila *** (36,37,3D) STEVIL INCF 36,1 MOVLW 2F MOVWF 3D MOVF 37,0 STEVIL1 INCF 3D,1 ADDLW 9C BTFSC 3,0 GOTO STEVIL1 DECF 36,1 BTFSS 3,2 GOTO STEVIL1 ADDLW 64 MOVWF 37 MOVF 3D,0 CALL ZNAK MOVLW 2F MOVWF 3D MOVF 37,0 STEVIL2 INCF 3D,1 ADDLW 0F6 BTFSC 3,0 GOTO STEVIL2 ADDLW 0A MOVWF 37 MOVF 3D,0 CALL ZNAK MOVLW 30 ADDWF 37,0 CALL ZNAK RETURN ;*** Pretvorba kota v stopinje *** (36,37,38,39,3A,3B,3C) STOPIN CLRF 36 ;reset rezultata (36,37,38,39) CLRF 37 CLRF 38 CLRF 39 CLRF 3C ;podatek v (3A,3B,3C) CALL STOPIN2 ;360=$168=B101101000 CALL STOPIN1 CALL STOPIN1 CALL STOPIN2 CALL STOPIN1 CALL STOPIN2 CALL STOPIN1 CALL STOPIN1 CALL STOPIN2 RETURN STOPIN1 RRF 3A,1 ;pomik (3A,3B,3C) v desno RRF 3B,1 RRF 3C,1 BCF 3A,7 RETURN STOPIN2 MOVF 3A,0 ;pristej (3A,3B,3C) vsoti (36,37,38,39) ADDWF 37,1 BTFSC 3,0 INCF 36,1 MOVF 3B,0 ADDWF 38,1 BTFSS 3,0 GOTO STOPIN3 INCF 37,1 BTFSC 3,2 INCF 36,1 STOPIN3 MOVF 3C,0 ADDWF 39,1 BTFSS 3,0 RETURN INCF 38,1 BTFSS 3,2 RETURN INCF 37,1 BTFSC 3,2 INCF 36,1 RETURN ;*** Izracunaj azimut iz komponent *** (24,25,26,27,30,31,32,33) ARCTAN CLRF 30 ;rezultat CLRF 31 CLRF 34 ;stevec CORDIC zanke BTFSS 26,7 ;komponenta X=SEVER negativna? GOTO ARCTAN1 COMF 24,1 ;obrni predznak Y COMF 25,1 INCF 25,1 BTFSC 3,2 INCF 24,1 COMF 26,1 ;obrni predznak X COMF 27,1 INCF 27,1 BTFSC 3,2 INCF 26,1 MOVLW 80 ;pristej 180 stopinj rezultatu ADDWF 30,1 ARCTAN1 BTFSS 24,7 ;komponenta Y=VZHOD negativna? GOTO ARCTAN2 COMF 24,0 ;-Y=>spomin MOVWF 32 COMF 25,0 MOVWF 33 INCF 33,1 BTFSC 3,2 INCF 32,1 MOVF 26,0 ;X=>Y MOVWF 24 MOVF 27,0 MOVWF 25 MOVF 32,0 ;spomin=>X MOVWF 26 MOVF 33,0 MOVWF 27 MOVLW 40 ;odstej 90 stopinj od rezultata SUBWF 30,1 ARCTAN2 MOVF 26,0 ;X*tg(fi) - zacetek CORDIC zanke MOVWF 32 MOVF 27,0 MOVWF 33 CALL RSHIFT MOVF 32,0 ;Y-X*tg(fi) SUBWF 24,1 MOVF 33,0 SUBWF 25,1 BTFSS 3,0 DECF 24,1 BTFSS 24,7 GOTO ARCTAN3 MOVF 32,0 ;negativno >>> vrni stari Y ADDWF 24,1 MOVF 33,0 ADDWF 25,1 BTFSC 3,0 INCF 24,1 GOTO ARCTAN4 ARCTAN3 MOVF 24,0 ;stari Y*tg(fi) ADDWF 32,1 MOVF 25,0 ADDWF 33,1 BTFSC 3,0 INCF 32,1 CALL RSHIFT MOVF 32,0 ;X+Y*tg(fi) ADDWF 26,1 MOVF 33,0 ADDWF 27,1 BTFSC 3,0 INCF 26,1 CALL CORDIC ;pristej fi rezultatu MOVF 32,0 ADDWF 30,1 MOVF 33,0 ADDWF 31,1 BTFSC 3,0 INCF 30,1 ARCTAN4 INCF 34,1 ;CORDIC zanka MOVLW 0F8 ADDWF 34,0 BTFSS 3,0 GOTO ARCTAN2 RETURN ;*** Deljenje z 2^N *** (32,33,35) RSHIFT MOVF 34,0 ;trenutni stevec (35) MOVWF 35 INCF 35,1 RSHIFT1 DECF 35,1 BTFSC 3,2 RETURN RRF 32,1 RRF 33,1 BCF 32,7 GOTO RSHIFT1 ;*** Tabela kotov za algoritem CORDIC *** (32,33,35) CORDIC MOVF 34,0 ;trenutni stevec (35) MOVWF 35 INCF 35,1 MOVLW 20 ;atan(1)=45stopinj=$2000 MOVWF 32 MOVLW 0 MOVWF 33 DECF 35,1 BTFSC 3,2 RETURN MOVLW 12 ;atan(0.5)=26.56stopinj=$12E4 MOVWF 32 MOVLW 0E4 MOVWF 33 DECF 35,1 BTFSC 3,2 RETURN MOVLW 9 ;atan(0.25)=14.04stopinj=$9FB MOVWF 32 MOVLW 0FB MOVWF 33 DECF 35,1 BTFSC 3,2 RETURN MOVLW 5 ;atan(0.125)=7.13stopinj=$511 MOVWF 32 MOVLW 11 MOVWF 33 DECF 35,1 BTFSC 3,2 RETURN MOVLW 2 ;atan(0.0625)=3.58stopinj=$28B MOVWF 32 MOVLW 8B MOVWF 33 DECF 35,1 BTFSC 3,2 RETURN MOVLW 1 ;atan(0.03125)=1.79stopinj=$146 MOVWF 32 MOVLW 46 MOVWF 33 DECF 35,1 BTFSC 3,2 RETURN MOVLW 0 ;atan(0.015625)=0.90stopinj=$A3 MOVWF 32 MOVLW 0A3 MOVWF 33 DECF 35,1 BTFSC 3,2 RETURN MOVLW 0 ;atan(0.0078125)=0.45stopinj=$52 MOVWF 32 MOVLW 52 MOVWF 33 RETURN ;*** Izmeri VZHOD, SEVER in GYRO *** (24,25,26,27,28,29) KOFLIP CLRF 28 ;zacni 2*32-kratno povprecenje ziroskopa CLRF 29 BSF 5,4 ;postavi RA4=1 CALL ADGYRO CALL ADKOMP MOVF 20,0 ;pristej vzhod ADDWF 24,1 MOVF 21,0 ADDWF 25,1 BTFSC 3,0 INCF 24,1 MOVF 22,0 ;pristej sever ADDWF 26,1 MOVF 23,0 ADDWF 27,1 BTFSC 3,0 INCF 26,1 BCF 5,4 ;podri RA4=0 CALL ADGYRO CALL ADKOMP MOVF 20,0 ;odstej zahod SUBWF 24,1 MOVF 21,0 SUBWF 25,1 BTFSS 3,0 DECF 24,1 MOVF 22,0 ;odstej jug SUBWF 26,1 MOVF 23,0 SUBWF 27,1 BTFSS 3,0 DECF 26,1 RETURN ;*** A/D kompasa *** (20,21,22,23) ADKOMP MOVLW 81 ;ADCON0 FOSC/32, ADON, vhod RA0 za smer VZHOD MOVWF 1F CALL CAKAJP BSF 1F,2 ;ADCON0 zacetek pretvorbe ADKOMP1 BTFSC 1F,2 ;ADCON0 pocakaj na konec pretvorbe GOTO ADKOMP1 MOVF 1E,0 ;ADRESH gornji rezultat MOVWF 20 BSF 3,5 ;postavi PAGE1 MOVF 1E,0 ;ADRESL spodnji rezultat BCF 3,5 ;postavi PAGE0 MOVWF 21 MOVLW 89 ;ADCON0 FOSC/32, ADON, vhod RA1 za smer SEVER MOVWF 1F CALL CAKAJP BSF 1F,2 ;ADCON0 zacetek pretvorbe ADKOMP2 BTFSC 1F,2 ;ADCON0 pocakaj na konec pretvorbe GOTO ADKOMP2 MOVF 1E,0 ;ADRESH gornji rezultat MOVWF 22 BSF 3,5 ;postavi PAGE1 MOVF 1E,0 ;ADRESL spodnji rezultat BCF 3,5 ;postavi PAGE0 MOVWF 23 RETURN ;*** A/D in 32-kratno povprecenje ziroskopa *** (28,2A,29) ADGYRO CALL CAKAJP CALL CAKAJP MOVLW 20 ;32 povprecenj MOVWF 2A ADGYRO1 MOVF 2C,0 ;psevdonakljucno stevilo ANDLW 0F ;izracunaj CVRCON za tresenje IORLW 0C0 BSF 3,5 ;postavi PAGE1 MOVWF 1D BCF 3,5 ;postavi PAGE0 MOVLW 99 ;ADCON0 FOSC/32, ADON, vhod RA3 za ziroskop MOVWF 1F CALL CAKAJP BSF 1F,2 ;ADCON0 zacetek pretvorbe ADGYRO2 BTFSC 1F,2 ;ADCON0 pocakaj na konec pretvorbe GOTO ADGYRO2 MOVF 1E,0 ;ADRESH gornji rezultat ADDWF 28,1 BSF 3,5 ;postavi PAGE1 MOVF 1E,0 ;ADRESL spodnji rezultat BCF 3,5 ;postavi PAGE0 ADDWF 29,1 BTFSC 3,0 INCF 28,1 DECFSZ 2A,1 GOTO ADGYRO1 RETURN ;*** Nakljucna FM taktnega oscilatorja *** FMTAKT MOVF 2E,0 ANDLW 1F BSF 3,5 ;postavi PAGE1 MOVWF 10 ;postavi OSCTUNE BCF 3,5 ;postavi PAGE0 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 ;*** Inicializacija HD44780 *** INILCD MOVLW 38 ;function set CALL UKAZ CALL CAKAJ40 MOVLW 38 ;function set CALL UKAZ MOVLW 38 ;function set CALL UKAZ MOVLW 8 ;display off CALL UKAZ MOVLW 1 ;display clear CALL UKAZ CALL CAKAJ40 MOVLW 6 ;entry mode set CALL UKAZ MOVLW 0C ;display on CALL UKAZ RETURN ;*** HEX izpis bajta iz W *** (56,57) HEXB MOVWF 56 MOVWF 57 RRF 56,1 RRF 56,1 RRF 56,1 RRF 56,0 CALL HEXB1 MOVF 57,0 CALL HEXB1 RETURN HEXB1 ANDLW 0F ADDLW 0F6 BTFSC 3,0 ADDLW 7 ADDLW 3A CALL ZNAK RETURN ;*** Cakaj priblizno 100us (takt 8MHz), FM takt in tipka *** (55) CAKAJP CALL NAKLUC ;psevdonakljucni izvor CALL FMTAKT ;modulacija takta proti motnjam MOVLW 3E ;nastaviti cas integracije ziroskopa!!!!! CAKAJP1 ADDLW 0FF ;zanka 4 ukazi BTFSS 3,2 GOTO CAKAJP1 BTFSS 5,5 ;pritisnjena tipka? BSF 55,7 RETURN ;*** Cakanje 4ms (takt 8MHz) *** (2B) CAKAJ40 MOVLW 28 MOVWF 2B CAKAJ41 CALL CAKAJP DECFSZ 2B,1 GOTO CAKAJ41 RETURN ;*** Znak ali ukaz iz W v HD44780 *** ZNAK BSF 5,7 ;postavi RS=1 za znak GOTO ZNUKAZ UKAZ BCF 5,7 ;postavi RS=0 za ukaz ZNUKAZ MOVWF 6 ;premakni bajt podatkov NOP BSF 5,6 ;impulz E NOP BCF 5,6 CALL CAKAJP ;cakanje 100us RETURN ;*** Vpisi posebne znake v CGRAM *** CGRAM MOVLW 40 ;naslov za CGRAM CALL UKAZ MOVLW 0 ;praznina s pikicami - 0 CALL ZNAK MOVLW 0 CALL ZNAK MOVLW 0 CALL ZNAK MOVLW 15 CALL ZNAK MOVLW 0 CALL ZNAK MOVLW 0 CALL ZNAK MOVLW 0 CALL ZNAK MOVLW 0 CALL ZNAK MOVLW 10 ;ena crtica v desno - 1 CALL ZNAK MOVLW 10 CALL ZNAK MOVLW 10 CALL ZNAK MOVLW 15 CALL ZNAK MOVLW 10 CALL ZNAK MOVLW 10 CALL ZNAK MOVLW 10 CALL ZNAK MOVLW 0 CALL ZNAK MOVLW 14 ;dve crtici v desno - 2 CALL ZNAK MOVLW 14 CALL ZNAK MOVLW 14 CALL ZNAK MOVLW 15 CALL ZNAK MOVLW 14 CALL ZNAK MOVLW 14 CALL ZNAK MOVLW 14 CALL ZNAK MOVLW 0 CALL ZNAK MOVLW 15 ;tri crtice - 3 CALL ZNAK MOVLW 15 CALL ZNAK MOVLW 15 CALL ZNAK MOVLW 15 CALL ZNAK MOVLW 15 CALL ZNAK MOVLW 15 CALL ZNAK MOVLW 15 CALL ZNAK MOVLW 0 CALL ZNAK MOVLW 4 ;polni diamant - 4 CALL ZNAK MOVLW 0E CALL ZNAK MOVLW 1F CALL ZNAK MOVLW 1F CALL ZNAK MOVLW 1F CALL ZNAK MOVLW 0E CALL ZNAK MOVLW 4 CALL ZNAK MOVLW 0 CALL ZNAK MOVLW 1 ;ena crtica v levo - 5 CALL ZNAK MOVLW 1 CALL ZNAK MOVLW 1 CALL ZNAK MOVLW 15 CALL ZNAK MOVLW 1 CALL ZNAK MOVLW 1 CALL ZNAK MOVLW 1 CALL ZNAK MOVLW 0 CALL ZNAK MOVLW 5 ;dve crtici v levo - 6 CALL ZNAK MOVLW 5 CALL ZNAK MOVLW 5 CALL ZNAK MOVLW 15 CALL ZNAK MOVLW 5 CALL ZNAK MOVLW 5 CALL ZNAK MOVLW 5 CALL ZNAK MOVLW 0 CALL ZNAK MOVLW 4 ;votli diamant - 7 CALL ZNAK MOVLW 0A CALL ZNAK MOVLW 11 CALL ZNAK MOVLW 11 CALL ZNAK MOVLW 11 CALL ZNAK MOVLW 0A CALL ZNAK MOVLW 4 CALL ZNAK MOVLW 0 CALL ZNAK RETURN ;*** Nastavi konfiguracijo PICa 16F88 *** ORG 2007 ;naslov konfiguracijske besede DW 2950 ;CP=OFF, CCPMX=RB3, DEBUG=OFF, WRT=0000-0FFF, ; CPD=OFF, LVP=OFF, BOREN=ON, MCLRE=OFF, PWRTEN=ON, OSC=INTRC ;*** Nastavi zacetne vrednosti EEPROMa *** ORG 2100 DW 0 ;praznina DW 80 ;offset ziroskopa DW 0 DW 0 DW 0 ;offset E kompasa DW 80 ;mnozenje E kompasa DW 0 ;offset N kompasa DW 80 ;mnozenje N kompasa END ;*** Konec programa ***