CCS PCM C Compiler, Version 4.106, 47914 10-IX-13 13:59Filename: Z:\home\kaklik\svnMLAB\Designs\Measuring_instruments\GeoMet01A\SW\PIC16F887\main.lstROM used: 3809 words (46%)Largest free fragment is 2048RAM used: 35 (10%) at main() level72 (20%) worst caseStack: 5 locations*0000: MOVLW 0C0001: MOVWF 0A0002: GOTO 4E50003: NOP.................... #include "main.h".................... #include <16F887.h>.................... //////// Standard Header file for the PIC16F887 device ////////////////.................... #device PIC16F887.................... #list........................................ #device adc=10........................................ #FUSES NOWDT //No Watch Dog Timer.................... #FUSES INTRC //Internal RC Osc.................... #FUSES NOPUT //No Power Up Timer.................... #FUSES MCLR //Master Clear pin enabled.................... #FUSES NOPROTECT //Code not protected from reading.................... #FUSES NOCPD //No EE protection.................... #FUSES NOBROWNOUT //No brownout reset.................... #FUSES IESO //Internal External Switch Over mode enabled.................... #FUSES FCMEN //Fail-safe clock monitor enabled.................... #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O.................... #FUSES NODEBUG //No Debug mode for ICD.................... #FUSES NOWRT //Program memory not write protected.................... #FUSES BORV40 //Brownout reset at 4.0V........................................ #use delay(clock=8000000)*00FB: MOVLW 4B00FC: MOVWF 0400FD: BCF 03.700FE: MOVF 00,W00FF: BTFSC 03.20100: GOTO 10E0101: MOVLW 020102: MOVWF 780103: CLRF 770104: DECFSZ 77,F0105: GOTO 1040106: DECFSZ 78,F0107: GOTO 1030108: MOVLW 970109: MOVWF 77010A: DECFSZ 77,F010B: GOTO 10A010C: DECFSZ 00,F010D: GOTO 101010E: RETURN.................... #use i2c(master, sda=PIN_C4, scl=PIN_C3)*0078: MOVLW 080079: MOVWF 78007A: NOP007B: BCF 07.3007C: BCF 20.3007D: MOVF 20,W007E: BSF 03.5007F: MOVWF 070080: NOP0081: BCF 03.50082: RLF 4E,F0083: BCF 07.40084: BTFSS 03.00085: GOTO 08C0086: BSF 20.40087: MOVF 20,W0088: BSF 03.50089: MOVWF 07008A: GOTO 090008B: BCF 03.5008C: BCF 20.4008D: MOVF 20,W008E: BSF 03.5008F: MOVWF 070090: NOP0091: BCF 03.50092: BSF 20.30093: MOVF 20,W0094: BSF 03.50095: MOVWF 070096: BCF 03.50097: BTFSS 07.30098: GOTO 0970099: DECFSZ 78,F009A: GOTO 07A009B: NOP009C: BCF 07.3009D: BCF 20.3009E: MOVF 20,W009F: BSF 03.500A0: MOVWF 0700A1: NOP00A2: BCF 03.500A3: BSF 20.400A4: MOVF 20,W00A5: BSF 03.500A6: MOVWF 0700A7: NOP00A8: NOP00A9: BCF 03.500AA: BSF 20.300AB: MOVF 20,W00AC: BSF 03.500AD: MOVWF 0700AE: BCF 03.500AF: BTFSS 07.300B0: GOTO 0AF00B1: CLRF 7800B2: NOP00B3: BTFSC 07.400B4: BSF 78.000B5: BCF 07.300B6: BCF 20.300B7: MOVF 20,W00B8: BSF 03.500B9: MOVWF 0700BA: BCF 03.500BB: BCF 07.400BC: BCF 20.400BD: MOVF 20,W00BE: BSF 03.500BF: MOVWF 0700C0: BCF 03.500C1: RETURN*0285: MOVLW 080286: MOVWF 4F0287: MOVF 77,W0288: MOVWF 500289: BSF 20.4028A: MOVF 20,W028B: BSF 03.5028C: MOVWF 07028D: NOP028E: BCF 03.5028F: BSF 20.30290: MOVF 20,W0291: BSF 03.50292: MOVWF 070293: BCF 03.50294: BTFSS 07.30295: GOTO 2940296: BTFSC 07.40297: BSF 03.00298: BTFSS 07.40299: BCF 03.0029A: RLF 78,F029B: NOP029C: BCF 20.3029D: MOVF 20,W029E: BSF 03.5029F: MOVWF 0702A0: BCF 03.502A1: BCF 07.302A2: DECFSZ 4F,F02A3: GOTO 28902A4: BSF 20.402A5: MOVF 20,W02A6: BSF 03.502A7: MOVWF 0702A8: NOP02A9: BCF 03.502AA: BCF 07.402AB: MOVF 50,W02AC: BTFSC 03.202AD: GOTO 2B302AE: BCF 20.402AF: MOVF 20,W02B0: BSF 03.502B1: MOVWF 0702B2: BCF 03.502B3: NOP02B4: BSF 20.302B5: MOVF 20,W02B6: BSF 03.502B7: MOVWF 0702B8: BCF 03.502B9: BTFSS 07.302BA: GOTO 2B902BB: NOP02BC: BCF 07.302BD: BCF 20.302BE: MOVF 20,W02BF: BSF 03.502C0: MOVWF 0702C1: NOP02C2: BCF 03.502C3: BCF 07.402C4: BCF 20.402C5: MOVF 20,W02C6: BSF 03.502C7: MOVWF 0702C8: BCF 03.502C9: RETURN.................... #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)................................................................................ #define LCD_ENABLE_PIN PIN_E0 ////.................... #define LCD_RS_PIN PIN_E1 ////.................... #define LCD_RW_PIN PIN_E2 ////.................... #define LCD_DATA4 PIN_D4 ////.................... #define LCD_DATA5 PIN_D5 ////.................... #define LCD_DATA6 PIN_D6 ////.................... #define LCD_DATA7 PIN_D7.................... #include <lcd.c>.................... ///////////////////////////////////////////////////////////////////////////////.................... //// LCD.C ////.................... //// Driver for common LCD modules ////.................... //// ////.................... //// lcd_init() Must be called before any other function. ////.................... //// ////.................... //// lcd_putc(c) Will display c on the next position of the LCD. ////.................... //// \a Set cursor position to upper left ////.................... //// \f Clear display, set cursor to upper left ////.................... //// \n Go to start of second line ////.................... //// \b Move back one position ////.................... //// If LCD_EXTENDED_NEWLINE is defined, the \n character ////.................... //// will erase all remanining characters on the current ////.................... //// line, and move the cursor to the beginning of the next ////.................... //// line. ////.................... //// If LCD_EXTENDED_NEWLINE is defined, the \r character ////.................... //// will move the cursor to the start of the current ////.................... //// line. ////.................... //// ////.................... //// lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1) ////.................... //// ////.................... //// lcd_getc(x,y) Returns character at position x,y on LCD ////.................... //// ////.................... //// CONFIGURATION ////.................... //// The LCD can be configured in one of two ways: a.) port access or ////.................... //// b.) pin access. Port access requires the entire 7 bit interface ////.................... //// connected to one GPIO port, and the data bits (D4:D7 of the LCD) ////.................... //// connected to sequential pins on the GPIO. Pin access ////.................... //// has no requirements, all 7 bits of the control interface can ////.................... //// can be connected to any GPIO using several ports. ////.................... //// ////.................... //// To use port access, #define LCD_DATA_PORT to the SFR location of ////.................... //// of the GPIO port that holds the interface, -AND- edit LCD_PIN_MAP ////.................... //// of this file to configure the pin order. If you are using a ////.................... //// baseline PIC (PCB), then LCD_OUTPUT_MAP and LCD_INPUT_MAP also must ////.................... //// be defined. ////.................... //// ////.................... //// Example of port access: ////.................... //// #define LCD_DATA_PORT getenv("SFR:PORTD") ////.................... //// ////.................... //// To use pin access, the following pins must be defined: ////.................... //// LCD_ENABLE_PIN ////.................... //// LCD_RS_PIN ////.................... //// LCD_RW_PIN ////.................... //// LCD_DATA4 ////.................... //// LCD_DATA5 ////.................... //// LCD_DATA6 ////.................... //// LCD_DATA7 ////.................... //// ////.................... //// Example of pin access: ////.................... //// #define LCD_ENABLE_PIN PIN_E0 ////.................... //// #define LCD_RS_PIN PIN_E1 ////.................... //// #define LCD_RW_PIN PIN_E2 ////.................... //// #define LCD_DATA4 PIN_D4 ////.................... //// #define LCD_DATA5 PIN_D5 ////.................... //// #define LCD_DATA6 PIN_D6 ////.................... //// #define LCD_DATA7 PIN_D7 ////.................... //// ////.................... ///////////////////////////////////////////////////////////////////////////////.................... //// (C) Copyright 1996,2010 Custom Computer Services ////.................... //// This source code may only be used by licensed users of the CCS C ////.................... //// compiler. This source code may only be distributed to other ////.................... //// licensed users of the CCS C compiler. No other use, reproduction ////.................... //// or distribution is permitted without written permission. ////.................... //// Derivative programs created using this software in object code ////.................... //// form are not restricted in any way. ////.................... ///////////////////////////////////////////////////////////////////////////........................................ // define the pinout..................... // only required if port access is being used..................... typedef struct.................... { // This structure is overlayed.................... BOOLEAN enable; // on to an I/O port to gain.................... BOOLEAN rs; // access to the LCD pins..................... BOOLEAN rw; // The bits are allocated from.................... BOOLEAN unused; // low order up. ENABLE will.................... int data : 4; // be LSB pin of that port..................... #if defined(__PCD__) // The port used will be LCD_DATA_PORT..................... int reserved: 8;.................... #endif.................... } LCD_PIN_MAP;........................................ // this is to improve compatability with previous LCD drivers that accepted.................... // a define labeled 'use_portb_lcd' that configured the LCD onto port B..................... #if ((defined(use_portb_lcd)) && (use_portb_lcd==TRUE)).................... #define LCD_DATA_PORT getenv("SFR:PORTB").................... #endif........................................ #if defined(__PCB__).................... // these definitions only need to be modified for baseline PICs..................... // all other PICs use LCD_PIN_MAP or individual LCD_xxx pin definitions..................... /* EN, RS, RW, UNUSED, DATA */.................... const LCD_PIN_MAP LCD_OUTPUT_MAP = {0, 0, 0, 0, 0};.................... const LCD_PIN_MAP LCD_INPUT_MAP = {0, 0, 0, 0, 0xF};.................... #endif........................................ ////////////////////// END CONFIGURATION ///////////////////////////////////........................................ #ifndef LCD_ENABLE_PIN.................... #define lcd_output_enable(x) lcdlat.enable=x.................... #define lcd_enable_tris() lcdtris.enable=0.................... #else.................... #define lcd_output_enable(x) output_bit(LCD_ENABLE_PIN, x).................... #define lcd_enable_tris() output_drive(LCD_ENABLE_PIN).................... #endif........................................ #ifndef LCD_RS_PIN.................... #define lcd_output_rs(x) lcdlat.rs=x.................... #define lcd_rs_tris() lcdtris.rs=0.................... #else.................... #define lcd_output_rs(x) output_bit(LCD_RS_PIN, x).................... #define lcd_rs_tris() output_drive(LCD_RS_PIN).................... #endif........................................ #ifndef LCD_RW_PIN.................... #define lcd_output_rw(x) lcdlat.rw=x.................... #define lcd_rw_tris() lcdtris.rw=0.................... #else.................... #define lcd_output_rw(x) output_bit(LCD_RW_PIN, x).................... #define lcd_rw_tris() output_drive(LCD_RW_PIN).................... #endif........................................ // original version of this library incorrectly labeled LCD_DATA0 as LCD_DATA4,.................... // LCD_DATA1 as LCD_DATA5, and so on. this block of code makes the driver.................... // compatible with any code written for the original library.................... #if (defined(LCD_DATA0) && defined(LCD_DATA1) && defined(LCD_DATA2) && defined(LCD_DATA3) && !defined(LCD_DATA4) && !defined(LCD_DATA5) && !defined(LCD_DATA6) && !defined(LCD_DATA7)).................... #define LCD_DATA4 LCD_DATA0.................... #define LCD_DATA5 LCD_DATA1.................... #define LCD_DATA6 LCD_DATA2.................... #define LCD_DATA7 LCD_DATA3.................... #endif........................................ #ifndef LCD_DATA4.................... #ifndef LCD_DATA_PORT.................... #if defined(__PCB__).................... #define LCD_DATA_PORT 0x06 //portb.................... #define set_tris_lcd(x) set_tris_b(x).................... #else.................... #if defined(PIN_D0).................... #define LCD_DATA_PORT getenv("SFR:PORTD") //portd.................... #else.................... #define LCD_DATA_PORT getenv("SFR:PORTB") //portb.................... #endif.................... #endif.................... #endif........................................ #if defined(__PCB__).................... LCD_PIN_MAP lcd, lcdlat;.................... #byte lcd = LCD_DATA_PORT.................... #byte lcdlat = LCD_DATA_PORT.................... #elif defined(__PCM__).................... LCD_PIN_MAP lcd, lcdlat, lcdtris;.................... #byte lcd = LCD_DATA_PORT.................... #byte lcdlat = LCD_DATA_PORT.................... #byte lcdtris = LCD_DATA_PORT+0x80.................... #elif defined(__PCH__).................... LCD_PIN_MAP lcd, lcdlat, lcdtris;.................... #byte lcd = LCD_DATA_PORT.................... #byte lcdlat = LCD_DATA_PORT+9.................... #byte lcdtris = LCD_DATA_PORT+0x12.................... #elif defined(__PCD__).................... LCD_PIN_MAP lcd, lcdlat, lcdtris;.................... #word lcd = LCD_DATA_PORT.................... #word lcdlat = LCD_DATA_PORT+2.................... #word lcdtris = LCD_DATA_PORT-0x02.................... #endif.................... #endif //LCD_DATA4 not defined........................................ #ifndef LCD_TYPE.................... #define LCD_TYPE 2 // 0=5x7, 1=5x10, 2=2 lines.................... #endif........................................ #ifndef LCD_LINE_TWO.................... #define LCD_LINE_TWO 0x40 // LCD RAM address for the second line.................... #endif........................................ #ifndef LCD_LINE_LENGTH.................... #define LCD_LINE_LENGTH 20.................... #endif........................................ BYTE const LCD_INIT_STRING[4] = {0x20 | (LCD_TYPE << 2), 0xc, 1, 6};.................... // These bytes need to be sent to the LCD.................... // to start it up......................................... BYTE lcd_read_nibble(void);........................................ BYTE lcd_read_byte(void).................... {.................... BYTE low,high;........................................ #if defined(__PCB__).................... set_tris_lcd(LCD_INPUT_MAP);.................... #else.................... #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7)).................... output_float(LCD_DATA4);*0174: BSF 08.4.................... output_float(LCD_DATA5);0175: BSF 08.5.................... output_float(LCD_DATA6);0176: BSF 08.6.................... output_float(LCD_DATA7);0177: BSF 08.7.................... #else.................... lcdtris.data = 0xF;.................... #endif.................... #endif........................................ lcd_output_rw(1);0178: BCF 03.50179: BSF 09.2017A: BSF 03.5017B: BCF 09.2.................... delay_cycles(1);017C: NOP.................... lcd_output_enable(1);017D: BCF 03.5017E: BSF 09.0017F: BSF 03.50180: BCF 09.0.................... delay_cycles(1);0181: NOP.................... high = lcd_read_nibble();0182: BCF 03.50183: CALL 13B0184: MOVF 78,W0185: MOVWF 52........................................ lcd_output_enable(0);0186: BCF 09.00187: BSF 03.50188: BCF 09.0.................... delay_cycles(1);0189: NOP.................... lcd_output_enable(1);018A: BCF 03.5018B: BSF 09.0018C: BSF 03.5018D: BCF 09.0.................... delay_us(1);018E: GOTO 18F.................... low = lcd_read_nibble();018F: BCF 03.50190: CALL 13B0191: MOVF 78,W0192: MOVWF 51........................................ lcd_output_enable(0);0193: BCF 09.00194: BSF 03.50195: BCF 09.0........................................ #if defined(__PCB__).................... set_tris_lcd(LCD_OUTPUT_MAP);.................... #else.................... #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7)).................... output_drive(LCD_DATA4);0196: BCF 08.4.................... output_drive(LCD_DATA5);0197: BCF 08.5.................... output_drive(LCD_DATA6);0198: BCF 08.6.................... output_drive(LCD_DATA7);0199: BCF 08.7.................... #else.................... lcdtris.data = 0x0;.................... #endif.................... #endif........................................ return( (high<<4) | low);019A: BCF 03.5019B: SWAPF 52,W019C: MOVWF 77019D: MOVLW F0019E: ANDWF 77,F019F: MOVF 77,W01A0: IORWF 51,W01A1: MOVWF 78.................... }........................................ BYTE lcd_read_nibble(void).................... {.................... #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))*013B: CLRF 53.................... BYTE n = 0x00;........................................ /* Read the data port */.................... n |= input(LCD_DATA4);013C: BSF 03.5013D: BSF 08.4013E: MOVLW 00013F: BCF 03.50140: BTFSC 08.40141: MOVLW 010142: IORWF 53,F.................... n |= input(LCD_DATA5) << 1;0143: BSF 03.50144: BSF 08.50145: MOVLW 000146: BCF 03.50147: BTFSC 08.50148: MOVLW 010149: MOVWF 77014A: BCF 03.0014B: RLF 77,F014C: MOVF 77,W014D: IORWF 53,F.................... n |= input(LCD_DATA6) << 2;014E: BSF 03.5014F: BSF 08.60150: MOVLW 000151: BCF 03.50152: BTFSC 08.60153: MOVLW 010154: MOVWF 770155: RLF 77,F0156: RLF 77,F0157: MOVLW FC0158: ANDWF 77,F0159: MOVF 77,W015A: IORWF 53,F.................... n |= input(LCD_DATA7) << 3;015B: BSF 03.5015C: BSF 08.7015D: MOVLW 00015E: BCF 03.5015F: BTFSC 08.70160: MOVLW 010161: MOVWF 770162: RLF 77,F0163: RLF 77,F0164: RLF 77,F0165: MOVLW F80166: ANDWF 77,F0167: MOVF 77,W0168: IORWF 53,F........................................ return(n);0169: MOVF 53,W016A: MOVWF 78.................... #else.................... return(lcd.data);.................... #endif.................... }016B: RETURN........................................ void lcd_send_nibble(BYTE n).................... {.................... #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7)).................... /* Write to the data port */.................... output_bit(LCD_DATA4, bit_test(n, 0));*010F: BTFSC 52.00110: GOTO 1130111: BCF 08.40112: GOTO 1140113: BSF 08.40114: BSF 03.50115: BCF 08.4.................... output_bit(LCD_DATA5, bit_test(n, 1));0116: BCF 03.50117: BTFSC 52.10118: GOTO 11B0119: BCF 08.5011A: GOTO 11C011B: BSF 08.5011C: BSF 03.5011D: BCF 08.5.................... output_bit(LCD_DATA6, bit_test(n, 2));011E: BCF 03.5011F: BTFSC 52.20120: GOTO 1230121: BCF 08.60122: GOTO 1240123: BSF 08.60124: BSF 03.50125: BCF 08.6.................... output_bit(LCD_DATA7, bit_test(n, 3));0126: BCF 03.50127: BTFSC 52.30128: GOTO 12B0129: BCF 08.7012A: GOTO 12C012B: BSF 08.7012C: BSF 03.5012D: BCF 08.7.................... #else.................... lcdlat.data = n;.................... #endif........................................ delay_cycles(1);012E: NOP.................... lcd_output_enable(1);012F: BCF 03.50130: BSF 09.00131: BSF 03.50132: BCF 09.0.................... delay_us(2);0133: GOTO 1340134: GOTO 135.................... lcd_output_enable(0);0135: BCF 03.50136: BCF 09.00137: BSF 03.50138: BCF 09.0.................... }0139: BCF 03.5013A: RETURN........................................ void lcd_send_byte(BYTE address, BYTE n).................... {.................... #if defined(__PCB__).................... set_tris_lcd(LCD_OUTPUT_MAP);.................... #else.................... lcd_enable_tris();*016C: BSF 03.5016D: BCF 09.0.................... lcd_rs_tris();016E: BCF 09.1.................... lcd_rw_tris();016F: BCF 09.2.................... #endif........................................ lcd_output_rs(0);0170: BCF 03.50171: BCF 09.10172: BSF 03.50173: BCF 09.1.................... while ( bit_test(lcd_read_byte(),7) ) ;*01A2: MOVF 78,W01A3: MOVWF 5101A4: BTFSS 51.701A5: GOTO 1A801A6: BSF 03.501A7: GOTO 174.................... lcd_output_rs(address);01A8: MOVF 4F,F01A9: BTFSS 03.201AA: GOTO 1AD01AB: BCF 09.101AC: GOTO 1AE01AD: BSF 09.101AE: BSF 03.501AF: BCF 09.1.................... delay_cycles(1);01B0: NOP.................... lcd_output_rw(0);01B1: BCF 03.501B2: BCF 09.201B3: BSF 03.501B4: BCF 09.2.................... delay_cycles(1);01B5: NOP.................... lcd_output_enable(0);01B6: BCF 03.501B7: BCF 09.001B8: BSF 03.501B9: BCF 09.0.................... lcd_send_nibble(n >> 4);01BA: BCF 03.501BB: SWAPF 50,W01BC: MOVWF 5101BD: MOVLW 0F01BE: ANDWF 51,F01BF: MOVF 51,W01C0: MOVWF 5201C1: CALL 10F.................... lcd_send_nibble(n & 0xf);01C2: MOVF 50,W01C3: ANDLW 0F01C4: MOVWF 5101C5: MOVWF 5201C6: CALL 10F.................... }01C7: RETURN........................................ #if defined(LCD_EXTENDED_NEWLINE).................... unsigned int8 g_LcdX, g_LcdY;.................... #endif........................................ void lcd_init(void).................... {.................... BYTE i;........................................ #if defined(__PCB__).................... set_tris_lcd(LCD_OUTPUT_MAP);.................... #else.................... #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7)).................... output_drive(LCD_DATA4);01C8: BSF 03.501C9: BCF 08.4.................... output_drive(LCD_DATA5);01CA: BCF 08.5.................... output_drive(LCD_DATA6);01CB: BCF 08.6.................... output_drive(LCD_DATA7);01CC: BCF 08.7.................... #else.................... lcdtris.data = 0x0;.................... #endif.................... lcd_enable_tris();01CD: BCF 09.0.................... lcd_rs_tris();01CE: BCF 09.1.................... lcd_rw_tris();01CF: BCF 09.2.................... #endif........................................ lcd_output_rs(0);01D0: BCF 03.501D1: BCF 09.101D2: BSF 03.501D3: BCF 09.1.................... lcd_output_rw(0);01D4: BCF 03.501D5: BCF 09.201D6: BSF 03.501D7: BCF 09.2.................... lcd_output_enable(0);01D8: BCF 03.501D9: BCF 09.001DA: BSF 03.501DB: BCF 09.0........................................ delay_ms(15);01DC: MOVLW 0F01DD: BCF 03.501DE: MOVWF 4B01DF: CALL 0FB.................... for(i=1;i<=3;++i)01E0: MOVLW 0101E1: MOVWF 3D01E2: MOVF 3D,W01E3: SUBLW 0301E4: BTFSS 03.001E5: GOTO 1EE.................... {.................... lcd_send_nibble(3);01E6: MOVLW 0301E7: MOVWF 5201E8: CALL 10F.................... delay_ms(5);01E9: MOVLW 0501EA: MOVWF 4B01EB: CALL 0FB.................... }01EC: INCF 3D,F01ED: GOTO 1E2........................................ lcd_send_nibble(2);01EE: MOVLW 0201EF: MOVWF 5201F0: CALL 10F.................... for(i=0;i<=3;++i)01F1: CLRF 3D01F2: MOVF 3D,W01F3: SUBLW 0301F4: BTFSS 03.001F5: GOTO 1FF.................... lcd_send_byte(0,LCD_INIT_STRING[i]);01F6: MOVF 3D,W01F7: CALL 00401F8: MOVWF 3E01F9: CLRF 4F01FA: MOVF 3E,W01FB: MOVWF 5001FC: CALL 16C........................................ #if defined(LCD_EXTENDED_NEWLINE)01FD: INCF 3D,F01FE: GOTO 1F2.................... g_LcdX = 0;.................... g_LcdY = 0;.................... #endif.................... }01FF: RETURN........................................ void lcd_gotoxy(BYTE x, BYTE y).................... {.................... BYTE address;........................................ if(y!=1)0200: DECFSZ 4C,W0201: GOTO 2030202: GOTO 206.................... address=LCD_LINE_TWO;0203: MOVLW 400204: MOVWF 4D.................... else0205: GOTO 207.................... address=0;0206: CLRF 4D........................................ address+=x-1;0207: MOVLW 010208: SUBWF 4B,W0209: ADDWF 4D,F.................... lcd_send_byte(0,0x80|address);020A: MOVF 4D,W020B: IORLW 80020C: MOVWF 4E020D: CLRF 4F020E: MOVF 4E,W020F: MOVWF 500210: CALL 16C........................................ #if defined(LCD_EXTENDED_NEWLINE).................... g_LcdX = x - 1;.................... g_LcdY = y - 1;.................... #endif.................... }0211: RETURN........................................ void lcd_putc(char c).................... {.................... switch (c).................... {0212: MOVF 4A,W0213: XORLW 070214: BTFSC 03.20215: GOTO 2200216: XORLW 0B0217: BTFSC 03.20218: GOTO 2250219: XORLW 06021A: BTFSC 03.2021B: GOTO 22D021C: XORLW 02021D: BTFSC 03.2021E: GOTO 233021F: GOTO 238.................... case '\a' : lcd_gotoxy(1,1); break;0220: MOVLW 010221: MOVWF 4B0222: MOVWF 4C0223: CALL 2000224: GOTO 23E........................................ case '\f' : lcd_send_byte(0,1);0225: CLRF 4F0226: MOVLW 010227: MOVWF 500228: CALL 16C.................... delay_ms(2);0229: MOVLW 02022A: MOVWF 4B022B: CALL 0FB.................... #if defined(LCD_EXTENDED_NEWLINE).................... g_LcdX = 0;.................... g_LcdY = 0;.................... #endif.................... break;022C: GOTO 23E........................................ #if defined(LCD_EXTENDED_NEWLINE).................... case '\r' : lcd_gotoxy(1, g_LcdY+1); break;.................... case '\n' :.................... while (g_LcdX++ < LCD_LINE_LENGTH).................... {.................... lcd_send_byte(1, ' ');.................... }.................... lcd_gotoxy(1, g_LcdY+2);.................... break;.................... #else.................... case '\n' : lcd_gotoxy(1,2); break;022D: MOVLW 01022E: MOVWF 4B022F: MOVLW 020230: MOVWF 4C0231: CALL 2000232: GOTO 23E.................... #endif........................................ case '\b' : lcd_send_byte(0,0x10); break;0233: CLRF 4F0234: MOVLW 100235: MOVWF 500236: CALL 16C0237: GOTO 23E........................................ #if defined(LCD_EXTENDED_NEWLINE).................... default :.................... if (g_LcdX < LCD_LINE_LENGTH).................... {.................... lcd_send_byte(1, c);.................... g_LcdX++;.................... }.................... break;.................... #else.................... default : lcd_send_byte(1,c); break;0238: MOVLW 010239: MOVWF 4F023A: MOVF 4A,W023B: MOVWF 50023C: CALL 16C023D: GOTO 23E.................... #endif.................... }.................... }023E: RETURN........................................ char lcd_getc(BYTE x, BYTE y).................... {.................... char value;........................................ lcd_gotoxy(x,y);.................... while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low.................... lcd_output_rs(1);.................... value = lcd_read_byte();.................... lcd_output_rs(0);........................................ return(value);.................... }............................................................ #include "../SHT25.h"........................................ #define SHT25_HEATER_ON 0x04.................... #define SHT25_HEATER_OFF 0x00.................... #define SHT25_OTP_reload_off 0x02.................... #define SHT25_RH12_T14 0x00.................... #define SHT25_RH8_T12 0x01.................... #define SHT25_RH10_T13 0x80.................... #define SHT25_RH11_T11 0x81........................................ #define SHT25_ADDR 0x80........................................ #include "SHT25.c".................... void SHT25_soft_reset().................... {.................... i2c_start(); // Start condition.................... i2c_write(0x80); // Device address.................... i2c_write(0xFE); // Device command.................... i2c_stop(); // Stop condition.................... }........................................ unsigned int8 SHT25_setup(unsigned int8 setup_reg ) // writes to status register and returns its value.................... {.................... unsigned int8 reg;........................................ i2c_start(); // Start condition.................... i2c_write(SHT25_ADDR); // Device address.................... i2c_write(0xE7); // Device command........................................ i2c_start(); // Start condition.................... i2c_write(SHT25_ADDR+1); // Device address.................... reg=i2c_read(0); // Read status actual status register........................................ reg = (reg & 0x3A) | setup_reg;........................................ i2c_start(); // Start condition.................... i2c_write(SHT25_ADDR); // Device address.................... i2c_write(0xE6); // Write to status register.................... i2c_write(reg); // Device command.................... i2c_stop(); // Stop condition........................................ delay_ms(10);........................................ i2c_start(); // Start condition.................... i2c_write(SHT25_ADDR); // Device address.................... i2c_write(0xE7); // Device command........................................ i2c_start(); // Start condition.................... i2c_write(SHT25_ADDR+1); // Device address.................... reg=i2c_read(0); // Read status actual status register........................................ return (reg);.................... }............................................................ float SHT25_get_temp().................... {.................... unsigned int8 MSB, LSB, Check;.................... unsigned int16 data;........................................ i2c_start();*0567: BSF 20.40568: MOVF 20,W0569: BSF 03.5056A: MOVWF 07056B: NOP056C: BCF 03.5056D: BSF 20.3056E: MOVF 20,W056F: BSF 03.50570: MOVWF 070571: NOP0572: BCF 03.50573: BTFSS 07.30574: GOTO 5730575: BCF 07.40576: BCF 20.40577: MOVF 20,W0578: BSF 03.50579: MOVWF 07057A: NOP057B: BCF 03.5057C: BCF 07.3057D: BCF 20.3057E: MOVF 20,W057F: BSF 03.50580: MOVWF 07.................... I2C_Write(SHT25_ADDR);0581: MOVLW 800582: BCF 03.50583: MOVWF 4E0584: CALL 078.................... I2C_write(0xE3);0585: MOVLW E30586: MOVWF 4E0587: CALL 078.................... i2c_stop();0588: BCF 20.40589: MOVF 20,W058A: BSF 03.5058B: MOVWF 07058C: NOP058D: BCF 03.5058E: BSF 20.3058F: MOVF 20,W0590: BSF 03.50591: MOVWF 070592: BCF 03.50593: BTFSS 07.30594: GOTO 5930595: NOP0596: GOTO 5970597: NOP0598: BSF 20.40599: MOVF 20,W059A: BSF 03.5059B: MOVWF 07059C: NOP........................................ delay_ms(100);059D: MOVLW 64059E: BCF 03.5059F: MOVWF 4B05A0: CALL 0FB........................................ i2c_start();05A1: BSF 20.405A2: MOVF 20,W05A3: BSF 03.505A4: MOVWF 0705A5: NOP05A6: BCF 03.505A7: BSF 20.305A8: MOVF 20,W05A9: BSF 03.505AA: MOVWF 0705AB: NOP05AC: BCF 03.505AD: BCF 07.405AE: BCF 20.405AF: MOVF 20,W05B0: BSF 03.505B1: MOVWF 0705B2: NOP05B3: BCF 03.505B4: BCF 07.305B5: BCF 20.305B6: MOVF 20,W05B7: BSF 03.505B8: MOVWF 07.................... I2C_Write(SHT25_ADDR+1);05B9: MOVLW 8105BA: BCF 03.505BB: MOVWF 4E05BC: CALL 078.................... MSB=i2c_read(1);05BD: MOVLW 0105BE: MOVWF 7705BF: CALL 28505C0: MOVF 78,W05C1: MOVWF 3D.................... LSB=i2c_read(1);05C2: MOVLW 0105C3: MOVWF 7705C4: CALL 28505C5: MOVF 78,W05C6: MOVWF 3E.................... Check=i2c_read(0);05C7: CLRF 7705C8: CALL 28505C9: MOVF 78,W05CA: MOVWF 3F.................... i2c_stop();05CB: BCF 20.405CC: MOVF 20,W05CD: BSF 03.505CE: MOVWF 0705CF: NOP05D0: BCF 03.505D1: BSF 20.305D2: MOVF 20,W05D3: BSF 03.505D4: MOVWF 0705D5: BCF 03.505D6: BTFSS 07.305D7: GOTO 5D605D8: NOP05D9: GOTO 5DA05DA: NOP05DB: BSF 20.405DC: MOVF 20,W05DD: BSF 03.505DE: MOVWF 0705DF: NOP........................................ LSB = LSB >> 2; // trow out status bits05E0: BCF 03.505E1: RRF 3E,F05E2: RRF 3E,F05E3: MOVLW 3F05E4: ANDWF 3E,F........................................ data = (((unsigned int16) MSB << 8) + (LSB << 4));05E5: CLRF 4305E6: MOVF 3D,W05E7: MOVWF 4205E8: MOVWF 4305E9: CLRF 4205EA: SWAPF 3E,W05EB: MOVWF 7705EC: MOVLW F005ED: ANDWF 77,F05EE: MOVF 77,W05EF: ADDWF 42,W05F0: MOVWF 4005F1: MOVF 43,W05F2: MOVWF 4105F3: BTFSC 03.005F4: INCF 41,F.................... return(-46.85 + 175.72*((float)data/0xFFFF));05F5: MOVF 41,W05F6: MOVWF 4E05F7: MOVF 40,W05F8: MOVWF 4D05F9: CALL 2CA05FA: MOVF 77,W05FB: MOVWF 4205FC: MOVF 78,W05FD: MOVWF 4305FE: MOVF 79,W05FF: MOVWF 440600: MOVF 7A,W0601: MOVWF 450602: MOVWF 540603: MOVF 79,W0604: MOVWF 530605: MOVF 78,W0606: MOVWF 520607: MOVF 77,W0608: MOVWF 510609: CLRF 58060A: MOVLW FF060B: MOVWF 57060C: MOVLW 7F060D: MOVWF 56060E: MOVLW 8E060F: MOVWF 550610: CALL 2E70611: MOVLW 520612: MOVWF 4D0613: MOVLW B80614: MOVWF 4C0615: MOVLW 2F0616: MOVWF 4B0617: MOVLW 860618: MOVWF 4A0619: MOVF 7A,W061A: MOVWF 51061B: MOVF 79,W061C: MOVWF 50061D: MOVF 78,W061E: MOVWF 4F061F: MOVF 77,W0620: MOVWF 4E0621: CALL 3B10622: BCF 03.10623: MOVLW 660624: MOVWF 560625: MOVWF 550626: MOVLW BB0627: MOVWF 540628: MOVLW 840629: MOVWF 53062A: MOVF 7A,W062B: MOVWF 5A062C: MOVF 79,W062D: MOVWF 59062E: MOVF 78,W062F: MOVWF 580630: MOVF 77,W0631: MOVWF 570632: CALL 426.................... }0633: BSF 0A.30634: BCF 0A.40635: GOTO 5B9 (RETURN)........................................ float SHT25_get_hum().................... {.................... unsigned int8 MSB, LSB, Check;.................... unsigned int16 data;........................................ i2c_start(); //RH0636: BSF 20.40637: MOVF 20,W0638: BSF 03.50639: MOVWF 07063A: NOP063B: BCF 03.5063C: BSF 20.3063D: MOVF 20,W063E: BSF 03.5063F: MOVWF 070640: NOP0641: BCF 03.50642: BCF 07.40643: BCF 20.40644: MOVF 20,W0645: BSF 03.50646: MOVWF 070647: NOP0648: BCF 03.50649: BCF 07.3064A: BCF 20.3064B: MOVF 20,W064C: BSF 03.5064D: MOVWF 07.................... I2C_Write(SHT25_ADDR);064E: MOVLW 80064F: BCF 03.50650: MOVWF 4E0651: CALL 078.................... I2C_write(0xE5);0652: MOVLW E50653: MOVWF 4E0654: CALL 078........................................ delay_ms(100);0655: MOVLW 640656: MOVWF 4B0657: CALL 0FB........................................ i2c_start();0658: BSF 20.40659: MOVF 20,W065A: BSF 03.5065B: MOVWF 07065C: NOP065D: BCF 03.5065E: BSF 20.3065F: MOVF 20,W0660: BSF 03.50661: MOVWF 070662: NOP0663: BCF 03.50664: BTFSS 07.30665: GOTO 6640666: BCF 07.40667: BCF 20.40668: MOVF 20,W0669: BSF 03.5066A: MOVWF 07066B: NOP066C: BCF 03.5066D: BCF 07.3066E: BCF 20.3066F: MOVF 20,W0670: BSF 03.50671: MOVWF 07.................... I2C_Write(SHT25_ADDR+1);0672: MOVLW 810673: BCF 03.50674: MOVWF 4E0675: CALL 078.................... MSB=i2c_read(1);0676: MOVLW 010677: MOVWF 770678: CALL 2850679: MOVF 78,W067A: MOVWF 3D.................... LSB=i2c_read(1);067B: MOVLW 01067C: MOVWF 77067D: CALL 285067E: MOVF 78,W067F: MOVWF 3E.................... Check=i2c_read(0);0680: CLRF 770681: CALL 2850682: MOVF 78,W0683: MOVWF 3F.................... i2c_stop();0684: BCF 20.40685: MOVF 20,W0686: BSF 03.50687: MOVWF 070688: NOP0689: BCF 03.5068A: BSF 20.3068B: MOVF 20,W068C: BSF 03.5068D: MOVWF 07068E: BCF 03.5068F: BTFSS 07.30690: GOTO 68F0691: NOP0692: GOTO 6930693: NOP0694: BSF 20.40695: MOVF 20,W0696: BSF 03.50697: MOVWF 070698: NOP........................................ LSB = LSB >> 2; // trow out status bits0699: BCF 03.5069A: RRF 3E,F069B: RRF 3E,F069C: MOVLW 3F069D: ANDWF 3E,F........................................ data = (((unsigned int16) MSB << 8) + (LSB << 4) );069E: CLRF 43069F: MOVF 3D,W06A0: MOVWF 4206A1: MOVWF 4306A2: CLRF 4206A3: SWAPF 3E,W06A4: MOVWF 7706A5: MOVLW F006A6: ANDWF 77,F06A7: MOVF 77,W06A8: ADDWF 42,W06A9: MOVWF 4006AA: MOVF 43,W06AB: MOVWF 4106AC: BTFSC 03.006AD: INCF 41,F.................... return( -6.0 + 125.0*((float)data/0xFFFF));06AE: MOVF 41,W06AF: MOVWF 4E06B0: MOVF 40,W06B1: MOVWF 4D06B2: CALL 2CA06B3: MOVF 77,W06B4: MOVWF 4206B5: MOVF 78,W06B6: MOVWF 4306B7: MOVF 79,W06B8: MOVWF 4406B9: MOVF 7A,W06BA: MOVWF 4506BB: MOVWF 5406BC: MOVF 79,W06BD: MOVWF 5306BE: MOVF 78,W06BF: MOVWF 5206C0: MOVF 77,W06C1: MOVWF 5106C2: CLRF 5806C3: MOVLW FF06C4: MOVWF 5706C5: MOVLW 7F06C6: MOVWF 5606C7: MOVLW 8E06C8: MOVWF 5506C9: CALL 2E706CA: CLRF 4D06CB: CLRF 4C06CC: MOVLW 7A06CD: MOVWF 4B06CE: MOVLW 8506CF: MOVWF 4A06D0: MOVF 7A,W06D1: MOVWF 5106D2: MOVF 79,W06D3: MOVWF 5006D4: MOVF 78,W06D5: MOVWF 4F06D6: MOVF 77,W06D7: MOVWF 4E06D8: CALL 3B106D9: BCF 03.106DA: CLRF 5606DB: CLRF 5506DC: MOVLW C006DD: MOVWF 5406DE: MOVLW 8106DF: MOVWF 5306E0: MOVF 7A,W06E1: MOVWF 5A06E2: MOVF 79,W06E3: MOVWF 5906E4: MOVF 78,W06E5: MOVWF 5806E6: MOVF 77,W06E7: MOVWF 5706E8: CALL 426.................... }06E9: BSF 0A.306EA: BCF 0A.406EB: GOTO 5C4 (RETURN).................................................................................................... #include "../LTS01.h".................... //Adresa pro VDD, VDD, VDD W 0x9E R 0x9F.................... //Adresa pro GND GND GND W 0x90 R 0x91........................................ #define LTS01A_address 0x90........................................ #include "LTS01.c".................... float LTS01_get_temp().................... {.................... unsigned int8 MSB;.................... unsigned int8 LSB;.................... signed int16 data;........................................ i2c_start();06EC: BSF 20.406ED: MOVF 20,W06EE: BSF 03.506EF: MOVWF 0706F0: NOP06F1: BCF 03.506F2: BSF 20.306F3: MOVF 20,W06F4: BSF 03.506F5: MOVWF 0706F6: NOP06F7: BCF 03.506F8: BCF 07.406F9: BCF 20.406FA: MOVF 20,W06FB: BSF 03.506FC: MOVWF 0706FD: NOP06FE: BCF 03.506FF: BCF 07.30700: BCF 20.30701: MOVF 20,W0702: BSF 03.50703: MOVWF 07.................... I2C_Write(LTS01A_address);0704: MOVLW 900705: BCF 03.50706: MOVWF 4E0707: CALL 078.................... I2C_write(0x00);0708: CLRF 4E0709: CALL 078.................... i2c_stop();070A: BCF 20.4070B: MOVF 20,W070C: BSF 03.5070D: MOVWF 07070E: NOP070F: BCF 03.50710: BSF 20.30711: MOVF 20,W0712: BSF 03.50713: MOVWF 070714: BCF 03.50715: BTFSS 07.30716: GOTO 7150717: NOP0718: GOTO 7190719: NOP071A: BSF 20.4071B: MOVF 20,W071C: BSF 03.5071D: MOVWF 07071E: NOP.................... i2c_start();071F: BCF 03.50720: BSF 20.40721: MOVF 20,W0722: BSF 03.50723: MOVWF 070724: NOP0725: BCF 03.50726: BSF 20.30727: MOVF 20,W0728: BSF 03.50729: MOVWF 07072A: NOP072B: BCF 03.5072C: BCF 07.4072D: BCF 20.4072E: MOVF 20,W072F: BSF 03.50730: MOVWF 070731: NOP0732: BCF 03.50733: BCF 07.30734: BCF 20.30735: MOVF 20,W0736: BSF 03.50737: MOVWF 07.................... I2C_Write(LTS01A_address+1);0738: MOVLW 910739: BCF 03.5073A: MOVWF 4E073B: CALL 078.................... MSB=i2c_read(1);073C: MOVLW 01073D: MOVWF 77073E: CALL 285073F: MOVF 78,W0740: MOVWF 3D.................... LSB=i2c_read(0);0741: CLRF 770742: CALL 2850743: MOVF 78,W0744: MOVWF 3E.................... i2c_stop();0745: BCF 20.40746: MOVF 20,W0747: BSF 03.50748: MOVWF 070749: NOP074A: BCF 03.5074B: BSF 20.3074C: MOVF 20,W074D: BSF 03.5074E: MOVWF 07074F: BCF 03.50750: BTFSS 07.30751: GOTO 7500752: NOP0753: GOTO 7540754: NOP0755: BSF 20.40756: MOVF 20,W0757: BSF 03.50758: MOVWF 070759: NOP........................................ data = MAKE16(MSB,LSB);075A: BCF 03.5075B: MOVF 3D,W075C: MOVWF 40075D: MOVF 3E,W075E: MOVWF 3F........................................ return (data * 0.00390625 );075F: MOVF 40,W0760: MOVWF 420761: MOVF 3F,W0762: MOVWF 410763: MOVF 42,W0764: MOVWF 440765: MOVF 41,W0766: MOVWF 43*078B: MOVF 7A,W078C: MOVWF 4D078D: MOVF 79,W078E: MOVWF 4C078F: MOVF 78,W0790: MOVWF 4B0791: MOVF 77,W0792: MOVWF 4A0793: CLRF 510794: CLRF 500795: CLRF 4F0796: MOVLW 770797: MOVWF 4E0798: CALL 3B1........................................ }0799: BSF 0A.3079A: BCF 0A.4079B: GOTO 5CF (RETURN)................................................................................ #include "./HMC5883L.h".................... // i2c slave addresses.................... #define HMC5883L_WRT_ADDR 0x3C.................... #define HMC5883L_READ_ADDR 0x3D........................................ // Register addresses.................... #define HMC5883L_CFG_A_REG 0x00.................... #define HMC5883L_CFG_B_REG 0x01.................... #define HMC5883L_MODE_REG 0x02.................... #define HMC5883L_X_MSB_REG 0x03........................................ //Konstanty nastavujici rozsah.................... //pro void set_mag_roz (unsigned int8 h).................... #define MAG_ROZ088 0x00.................... #define MAG_ROZ130 0x20.................... #define MAG_ROZ190 0x40.................... #define MAG_ROZ250 0x60.................... #define MAG_ROZ400 0x80.................... #define MAG_ROZ470 0xA0.................... #define MAG_ROZ560 0xC0.................... #define MAG_ROZ810 0xE0............................................................ #include "HMC5883L.c".................... //------------------------------.................... // Low level routines.................... //------------------------------.................... void hmc5883l_write_reg(int8 reg, int8 data).................... {.................... i2c_start();*00C2: BSF 20.400C3: MOVF 20,W00C4: BSF 03.500C5: MOVWF 0700C6: NOP00C7: BCF 03.500C8: BSF 20.300C9: MOVF 20,W00CA: BSF 03.500CB: MOVWF 0700CC: NOP00CD: BCF 03.500CE: BCF 07.400CF: BCF 20.400D0: MOVF 20,W00D1: BSF 03.500D2: MOVWF 0700D3: NOP00D4: BCF 03.500D5: BCF 07.300D6: BCF 20.300D7: MOVF 20,W00D8: BSF 03.500D9: MOVWF 07.................... i2c_write(HMC5883L_WRT_ADDR);00DA: MOVLW 3C00DB: BCF 03.500DC: MOVWF 4E00DD: CALL 078.................... i2c_write(reg);00DE: MOVF 3D,W00DF: MOVWF 4E00E0: CALL 078.................... i2c_write(data);00E1: MOVF 3E,W00E2: MOVWF 4E00E3: CALL 078.................... i2c_stop();00E4: BCF 20.400E5: MOVF 20,W00E6: BSF 03.500E7: MOVWF 0700E8: NOP00E9: BCF 03.500EA: BSF 20.300EB: MOVF 20,W00EC: BSF 03.500ED: MOVWF 0700EE: BCF 03.500EF: BTFSS 07.300F0: GOTO 0EF00F1: NOP00F2: GOTO 0F300F3: NOP00F4: BSF 20.400F5: MOVF 20,W00F6: BSF 03.500F7: MOVWF 0700F8: NOP.................... }00F9: BCF 03.500FA: RETURN........................................ //------------------------------.................... int8 hmc5883l_read_reg(int8 reg).................... {.................... int8 retval;........................................ i2c_start();.................... i2c_write(HMC5883L_WRT_ADDR);.................... i2c_write(reg);.................... i2c_start();.................... i2c_write(HMC5883L_READ_ADDR);.................... retval = i2c_read(0);.................... i2c_stop();........................................ return(retval);.................... }........................................ //------------------------------.................... typedef struct.................... {.................... signed int16 x;.................... signed int16 y;.................... signed int16 z;.................... }hmc5883l_result;........................................ // This global structure holds the values read.................... // from the HMC5883L x,y,z registers..................... hmc5883l_result compass = {0,0,0};*0D09: CLRF 210D0A: CLRF 220D0B: CLRF 230D0C: CLRF 240D0D: CLRF 250D0E: CLRF 26........................................ //------------------------------.................... void hmc5883l_read_data(void).................... {.................... unsigned int8 x_lsb;.................... unsigned int8 x_msb;........................................ unsigned int8 y_lsb;.................... unsigned int8 y_msb;........................................ unsigned int8 z_lsb;.................... unsigned int8 z_msb;........................................ i2c_start();*0800: BSF 20.40801: MOVF 20,W0802: BSF 03.50803: MOVWF 070804: NOP0805: BCF 03.50806: BSF 20.30807: MOVF 20,W0808: BSF 03.50809: MOVWF 07080A: NOP080B: BCF 03.5080C: BCF 07.4080D: BCF 20.4080E: MOVF 20,W080F: BSF 03.50810: MOVWF 070811: NOP0812: BCF 03.50813: BCF 07.30814: BCF 20.30815: MOVF 20,W0816: BSF 03.50817: MOVWF 07.................... i2c_write(HMC5883L_WRT_ADDR);0818: MOVLW 3C0819: BCF 03.5081A: MOVWF 4E081B: BCF 0A.3081C: CALL 078081D: BSF 0A.3.................... i2c_write(HMC5883L_X_MSB_REG); // Point to X-msb register081E: MOVLW 03081F: MOVWF 4E0820: BCF 0A.30821: CALL 0780822: BSF 0A.3.................... i2c_start();0823: BSF 20.40824: MOVF 20,W0825: BSF 03.50826: MOVWF 070827: NOP0828: BCF 03.50829: BSF 20.3082A: MOVF 20,W082B: BSF 03.5082C: MOVWF 07082D: NOP082E: BCF 03.5082F: BTFSS 07.30830: GOTO 02F0831: BCF 07.40832: BCF 20.40833: MOVF 20,W0834: BSF 03.50835: MOVWF 070836: NOP0837: BCF 03.50838: BCF 07.30839: BCF 20.3083A: MOVF 20,W083B: BSF 03.5083C: MOVWF 07.................... i2c_write(HMC5883L_READ_ADDR);083D: MOVLW 3D083E: BCF 03.5083F: MOVWF 4E0840: BCF 0A.30841: CALL 0780842: BSF 0A.3........................................ x_msb = i2c_read();0843: MOVLW 010844: MOVWF 770845: BCF 0A.30846: CALL 2850847: BSF 0A.30848: MOVF 78,W0849: MOVWF 3E.................... x_lsb = i2c_read();084A: MOVLW 01084B: MOVWF 77084C: BCF 0A.3084D: CALL 285084E: BSF 0A.3084F: MOVF 78,W0850: MOVWF 3D........................................ z_msb = i2c_read();0851: MOVLW 010852: MOVWF 770853: BCF 0A.30854: CALL 2850855: BSF 0A.30856: MOVF 78,W0857: MOVWF 42.................... z_lsb = i2c_read();0858: MOVLW 010859: MOVWF 77085A: BCF 0A.3085B: CALL 285085C: BSF 0A.3085D: MOVF 78,W085E: MOVWF 41........................................ y_msb = i2c_read();085F: MOVLW 010860: MOVWF 770861: BCF 0A.30862: CALL 2850863: BSF 0A.30864: MOVF 78,W0865: MOVWF 40.................... y_lsb = i2c_read(0); // do a NACK on last read0866: CLRF 770867: BCF 0A.30868: CALL 2850869: BSF 0A.3086A: MOVF 78,W086B: MOVWF 3F........................................ i2c_stop();086C: BCF 20.4086D: MOVF 20,W086E: BSF 03.5086F: MOVWF 070870: NOP0871: BCF 03.50872: BSF 20.30873: MOVF 20,W0874: BSF 03.50875: MOVWF 070876: BCF 03.50877: BTFSS 07.30878: GOTO 0770879: NOP087A: GOTO 07B087B: NOP087C: BSF 20.4087D: MOVF 20,W087E: BSF 03.5087F: MOVWF 070880: NOP........................................ // Combine high and low bytes into 16-bit values..................... compass.x = make16(x_msb, x_lsb);0881: BCF 03.50882: MOVF 3E,W0883: MOVWF 220884: MOVF 3D,W0885: MOVWF 21.................... compass.y = make16(y_msb, y_lsb);0886: MOVF 40,W0887: MOVWF 240888: MOVF 3F,W0889: MOVWF 23.................... compass.z = make16(z_msb, z_lsb);088A: MOVF 42,W088B: MOVWF 26088C: MOVF 41,W088D: MOVWF 25.................... }088E: BSF 0A.3088F: BCF 0A.40890: GOTO 5D9 (RETURN).................................................................................................... #include <math.h>.................... ////////////////////////////////////////////////////////////////////////////.................... //// (C) Copyright 1996,2008 Custom Computer Services ////.................... //// This source code may only be used by licensed users of the CCS C ////.................... //// compiler. This source code may only be distributed to other ////.................... //// licensed users of the CCS C compiler. No other use, reproduction ////.................... //// or distribution is permitted without written permission. ////.................... //// Derivative programs created using this software in object code ////.................... //// form are not restricted in any way. ////.................... ////////////////////////////////////////////////////////////////////////////.................... //// ////.................... //// History: ////.................... //// * 9/20/2001 : Improvments are made to sin/cos code. ////.................... //// The code now is small, much faster, ////.................... //// and more accurate. ////.................... //// * 2/21/2007 : Compiler handles & operator differently and does.................... //// not return generic (int8 *) so type cast is done ////.................... //// ////.................... ////////////////////////////////////////////////////////////////////////////........................................ #ifndef MATH_H.................... #define MATH_H........................................ #ifdef PI.................... #undef PI.................... #endif.................... #define PI 3.1415926535897932............................................................ #define SQRT2 1.4142135623730950........................................ //float const ps[4] = {5.9304945, 21.125224, 8.9403076, 0.29730279};.................... //float const qs[4] = {1.0000000, 15.035723, 17.764134, 2.4934718};........................................ ///////////////////////////// Round Functions //////////////////////////////........................................ float32 CEIL_FLOOR(float32 x, unsigned int8 n).................... {.................... float32 y, res;.................... unsigned int16 l;.................... int1 s;........................................ s = 0;.................... y = x;........................................ if (x < 0).................... {.................... s = 1;.................... y = -y;.................... }........................................ if (y <= 32768.0).................... res = (float32)(unsigned int16)y;........................................ else if (y < 10000000.0).................... {.................... l = (unsigned int16)(y/32768.0);.................... y = 32768.0*(y/32768.0 - (float32)l);.................... res = 32768.0*(float32)l;.................... res += (float32)(unsigned int16)y;.................... }........................................ else.................... res = y;........................................ y = y - (float32)(unsigned int16)y;........................................ if (s).................... res = -res;........................................ if (y != 0).................... {.................... if (s == 1 && n == 0).................... res -= 1.0;........................................ if (s == 0 && n == 1).................... res += 1.0;.................... }.................... if (x == 0).................... res = 0;........................................ return (res);.................... }........................................ // Overloaded Functions to take care for new Data types in PCD.................... // Overloaded function CEIL_FLOOR() for data type - Float48.................... #if defined(__PCD__).................... float48 CEIL_FLOOR(float48 x, unsigned int8 n).................... {.................... float48 y, res;.................... unsigned int16 l;.................... int1 s;........................................ s = 0;.................... y = x;........................................ if (x < 0).................... {.................... s = 1;.................... y = -y;.................... }........................................ if (y <= 32768.0).................... res = (float48)(unsigned int16)y;........................................ else if (y < 10000000.0).................... {.................... l = (unsigned int16)(y/32768.0);.................... y = 32768.0*(y/32768.0 - (float48)l);.................... res = 32768.0*(float32)l;.................... res += (float48)(unsigned int16)y;.................... }........................................ else.................... res = y;........................................ y = y - (float48)(unsigned int16)y;........................................ if (s).................... res = -res;........................................ if (y != 0).................... {.................... if (s == 1 && n == 0).................... res -= 1.0;........................................ if (s == 0 && n == 1).................... res += 1.0;.................... }.................... if (x == 0).................... res = 0;........................................ return (res);.................... }............................................................ // Overloaded function CEIL_FLOOR() for data type - Float64.................... float64 CEIL_FLOOR(float64 x, unsigned int8 n).................... {.................... float64 y, res;.................... unsigned int16 l;.................... int1 s;........................................ s = 0;.................... y = x;........................................ if (x < 0).................... {.................... s = 1;.................... y = -y;.................... }........................................ if (y <= 32768.0).................... res = (float64)(unsigned int16)y;........................................ else if (y < 10000000.0).................... {.................... l = (unsigned int16)(y/32768.0);.................... y = 32768.0*(y/32768.0 - (float64)l);.................... res = 32768.0*(float64)l;.................... res += (float64)(unsigned int16)y;.................... }........................................ else.................... res = y;........................................ y = y - (float64)(unsigned int16)y;........................................ if (s).................... res = -res;........................................ if (y != 0).................... {.................... if (s == 1 && n == 0).................... res -= 1.0;........................................ if (s == 0 && n == 1).................... res += 1.0;.................... }.................... if (x == 0).................... res = 0;........................................ return (res);.................... }.................... #endif........................................ ////////////////////////////////////////////////////////////////////////////.................... // float floor(float x).................... ////////////////////////////////////////////////////////////////////////////.................... // Description : rounds down the number x..................... // Date : N/A.................... //.................... float32 floor(float32 x).................... {.................... return CEIL_FLOOR(x, 0);.................... }.................... // Following 2 functions are overloaded functions of floor() for PCD.................... // Overloaded function floor() for data type - Float48.................... #if defined(__PCD__).................... float48 floor(float48 x).................... {.................... return CEIL_FLOOR(x, 0);.................... }........................................ // Overloaded function floor() for data type - Float64.................... float64 floor(float64 x).................... {.................... return CEIL_FLOOR(x, 0);.................... }.................... #endif............................................................ ////////////////////////////////////////////////////////////////////////////.................... // float ceil(float x).................... ////////////////////////////////////////////////////////////////////////////.................... // Description : rounds up the number x..................... // Date : N/A.................... //.................... float32 ceil(float32 x).................... {.................... return CEIL_FLOOR(x, 1);.................... }.................... // Following 2 functions are overloaded functions of ceil() for PCD.................... // Overloaded function ceil() for data type - Float48.................... #if defined(__PCD__).................... float48 ceil(float48 x).................... {.................... return CEIL_FLOOR(x, 1);.................... }........................................ // Overloaded function ceil() for data type - Float64.................... float64 ceil(float64 x).................... {.................... return CEIL_FLOOR(x, 1);.................... }.................... #endif........................................ ////////////////////////////////////////////////////////////////////////////.................... // float fabs(float x).................... ////////////////////////////////////////////////////////////////////////////.................... // Description : Computes the absolute value of floating point number x.................... // Returns : returns the absolute value of x.................... // Date : N/A.................... //.................... #define fabs abs........................................ ////////////////////////////////////////////////////////////////////////////.................... // float fmod(float x).................... ////////////////////////////////////////////////////////////////////////////.................... // Description : Computes the floating point remainder of x/y.................... // Returns : returns the value of x= i*y, for some integer i such that, if y.................... // is non zero, the result has the same isgn of x na dmagnitude less than the.................... // magnitude of y. If y is zero then a domain error occurs..................... // Date : N/A.................... //........................................ float fmod(float32 x,float32 y).................... {.................... float32 i;.................... if (y!=0.0).................... {.................... i=(x/y < 0.0)? ceil(x/y): floor(x/y);.................... return(x-(i*y));.................... }.................... else.................... {.................... #ifdef _ERRNO.................... {.................... errno=EDOM;.................... }.................... #endif.................... }.................... }.................... //Overloaded function for fmod() for PCD.................... // Overloaded function fmod() for data type - Float48.................... #if defined(__PCD__).................... float48 fmod(float48 x,float48 y).................... {.................... float48 i;.................... if (y!=0.0).................... {.................... i=(x/y < 0.0)? ceil(x/y): floor(x/y);.................... return(x-(i*y));.................... }.................... else.................... {.................... #ifdef _ERRNO.................... {.................... errno=EDOM;.................... }.................... #endif.................... }.................... }.................... // Overloaded function fmod() for data type - Float64.................... float64 fmod(float64 x,float64 y).................... {.................... float64 i;.................... if (y!=0.0).................... {.................... i=(x/y < 0.0)? ceil(x/y): floor(x/y);.................... return(x-(i*y));.................... }.................... else.................... {.................... #ifdef _ERRNO.................... {.................... errno=EDOM;.................... }.................... #endif.................... }.................... }.................... #endif.................... //////////////////// Exponential and logarithmic functions ////////////////////.................... ////////////////////////////////////////////////////////////////////////////.................... // float exp(float x).................... ////////////////////////////////////////////////////////////////////////////.................... // Description : returns the value (e^x).................... // Date : N/A.................... //.................... #define LN2 0.6931471805599453........................................ float const pe[6] = {0.000207455774, 0.00127100575, 0.00965065093,.................... 0.0554965651, 0.240227138, 0.693147172};............................................................ float32 exp(float32 x).................... {.................... float32 y, res, r;.................... #if defined(__PCD__).................... int8 data1;.................... #endif.................... signed int8 n;.................... int1 s;.................... #ifdef _ERRNO.................... if(x > 88.722838).................... {.................... errno=ERANGE;.................... return(0);.................... }.................... #endif.................... n = (signed int16)(x/LN2);.................... s = 0;.................... y = x;........................................ if (x < 0).................... {.................... s = 1;.................... n = -n;.................... y = -y;.................... }........................................ res = 0.0;.................... #if !defined(__PCD__).................... *((unsigned int8 *)(&res)) = n + 0x7F;.................... #endif........................................ #if defined(__PCD__) // Takes care of IEEE format for PCD.................... data1 = n+0x7F;.................... if(bit_test(data1,0)).................... bit_set(*(((unsigned int8 *)(&res)+2)),7);.................... rotate_right(&data1,1);.................... bit_clear(data1,7);.................... *(((unsigned int8 *)(&res)+3)) = data1;.................... #endif........................................ y = y/LN2 - (float32)n;........................................ r = pe[0]*y + pe[1];.................... r = r*y + pe[2];.................... r = r*y + pe[3];.................... r = r*y + pe[4];.................... r = r*y + pe[5];........................................ res = res*(1.0 + y*r);........................................ if (s).................... res = 1.0/res;.................... return(res);.................... }............................................................ //Overloaded function for exp() for PCD.................... // Overloaded function exp() for data type - Float48.................... #if defined(__PCD__).................... float48 exp(float48 x).................... {.................... float48 y, res, r;.................... int8 data1;.................... signed int8 n;.................... int1 s;.................... #ifdef _ERRNO.................... if(x > 88.722838).................... {.................... errno=ERANGE;.................... return(0);.................... }.................... #endif.................... n = (signed int16)(x/LN2);.................... s = 0;.................... y = x;........................................ if (x < 0).................... {.................... s = 1;.................... n = -n;.................... y = -y;.................... }........................................ res = 0.0;........................................ data1 = n+0x7F;.................... if(bit_test(data1,0)).................... bit_set(*(((unsigned int8 *)(&res)+4)),7);.................... rotate_right(&data1,1);.................... bit_clear(data1,7);.................... *(((unsigned int8 *)(&res)+5)) = data1;........................................ y = y/LN2 - (float48)n;........................................ r = pe[0]*y + pe[1];.................... r = r*y + pe[2];.................... r = r*y + pe[3];.................... r = r*y + pe[4];.................... r = r*y + pe[5];........................................ res = res*(1.0 + y*r);........................................ if (s).................... res = 1.0/res;.................... return(res);.................... }........................................ // Overloaded function exp() for data type - Float64.................... float64 exp(float64 x).................... {.................... float64 y, res, r;.................... unsigned int16 data1, data2;.................... unsigned int16 *p;.................... signed int16 n;.................... int1 s;.................... #ifdef _ERRNO.................... if(x > 709.7827128).................... {.................... errno=ERANGE;.................... return(0);.................... }.................... #endif.................... n = (signed int16)(x/LN2);.................... s = 0;.................... y = x;........................................ if (x < 0).................... {.................... s = 1;.................... n = -n;.................... y = -y;.................... }........................................ res = 0.0;........................................ #if !defined(__PCD__).................... *((unsigned int16 *)(&res)) = n + 0x7F;.................... #endif.................... p= (((unsigned int16 *)(&res))+3);.................... data1 = *p;.................... data2 = *p;.................... data1 = n + 0x3FF;.................... data1 = data1 <<4;.................... if(bit_test(data2,15)).................... bit_set(data1,15);.................... data2 = data2 & 0x000F;.................... data1 ^= data2;........................................ *(((unsigned int16 *)(&res)+3)) = data1;............................................................ y = y/LN2 - (float64)n;........................................ r = pe[0]*y + pe[1];.................... r = r*y + pe[2];.................... r = r*y + pe[3];.................... r = r*y + pe[4];.................... r = r*y + pe[5];........................................ res = res*(1.0 + y*r);........................................ if (s).................... res = 1.0/res;.................... return(res);.................... }........................................ #ENDIF............................................................ /************************************************************/........................................ float32 const pl[4] = {0.45145214, -9.0558803, 26.940971, -19.860189};.................... float32 const ql[4] = {1.0000000, -8.1354259, 16.780517, -9.9300943};........................................ ////////////////////////////////////////////////////////////////////////////.................... // float log(float x).................... ////////////////////////////////////////////////////////////////////////////.................... // Description : returns the the natural log of x.................... // Date : N/A.................... //.................... float32 log(float32 x).................... {.................... float32 y, res, r, y2;.................... #if defined(__PCD__).................... unsigned int8 data1,data2;.................... #endif.................... signed int8 n;.................... #ifdef _ERRNO.................... if(x <0).................... {.................... errno=EDOM;.................... }.................... if(x ==0).................... {.................... errno=ERANGE;.................... return(0);.................... }.................... #endif.................... y = x;........................................ if (y != 1.0).................... {.................... #if !defined(__PCD__).................... *((unsigned int8 *)(&y)) = 0x7E;.................... #endif........................................ #if defined(__PCD__) // Takes care of IEEE format.................... data2 = *(((unsigned int8 *)(&y))+3);.................... *(((unsigned int8 *)(&y))+3) = 0x3F;.................... data1 = *(((unsigned int8 *)(&y))+2);.................... bit_clear(data1,7);.................... *(((unsigned int8 *)(&y))+2) = data1;.................... if(bit_test(data2,7)).................... bit_set(*(((unsigned int8 *)(&y))+3),7);.................... #endif........................................ y = (y - 1.0)/(y + 1.0);........................................ y2=y*y;........................................ res = pl[0]*y2 + pl[1];.................... res = res*y2 + pl[2];.................... res = res*y2 + pl[3];........................................ r = ql[0]*y2 + ql[1];.................... r = r*y2 + ql[2];.................... r = r*y2 + ql[3];........................................ res = y*res/r;.................... #if !defined(__PCD__).................... n = *((unsigned int8 *)(&x)) - 0x7E;.................... #endif.................... #if defined(__PCD__).................... data1 = *(((unsigned int8 *)(&x)+3));.................... rotate_left(&data1,1);.................... data2 = *(((unsigned int8 *)(&x)+2));.................... if(bit_test (data2,7)).................... bit_set(data1,0);.................... n = data1 - 0x7E;.................... #endif........................................ if (n<0).................... r = -(float32)-n;.................... else.................... r = (float32)n;........................................ res += r*LN2;.................... }........................................ else.................... res = 0.0;........................................ return(res);.................... }........................................ //Overloaded function for log() for PCD.................... // Overloaded function log() for data type - Float48.................... #if defined(__PCD__).................... float48 log(float48 x).................... {.................... float48 y, res, r, y2;.................... unsigned int8 data1,data2;.................... signed int8 n;.................... #ifdef _ERRNO.................... if(x <0).................... {.................... errno=EDOM;.................... }.................... if(x ==0).................... {.................... errno=ERANGE;.................... return(0);.................... }.................... #endif.................... y = x;........................................ if (y != 1.0).................... {........................................ #if !defined(__PCD__).................... *((unsigned int8 *)(&y)) = 0x7E;.................... #endif.................... data2 = *(((unsigned int8 *)(&y))+5);.................... *(((unsigned int8 *)(&y))+5) = 0x3F;.................... data1 = *(((unsigned int8 *)(&y))+4);.................... bit_clear(data1,7);.................... *(((unsigned int8 *)(&y))+4) = data1;........................................ if(bit_test(data2,7)).................... bit_set(*(((unsigned int8 *)(&y))+4),7);.................... y = (y - 1.0)/(y + 1.0);........................................ y2=y*y;........................................ res = pl[0]*y2 + pl[1];.................... res = res*y2 + pl[2];.................... res = res*y2 + pl[3];........................................ r = ql[0]*y2 + ql[1];.................... r = r*y2 + ql[2];.................... r = r*y2 + ql[3];........................................ res = y*res/r;........................................ data1 = *(((unsigned int8 *)(&x)+5));.................... rotate_left(&data1,1);.................... data2 = *(((unsigned int8 *)(&x)+4));.................... if(bit_test (data2,7)).................... bit_set(data1,0);........................................ n = data1 - 0x7E;........................................ if (n<0).................... r = -(float48)-n;.................... else.................... r = (float48)n;........................................ res += r*LN2;.................... }........................................ else.................... res = 0.0;........................................ return(res);.................... }........................................ // Overloaded function log() for data type - Float48.................... #if defined(__PCD__).................... float32 const pl_64[4] = {0.45145214, -9.0558803, 26.940971, -19.860189};.................... float32 const ql_64[4] = {1.0000000, -8.1354259, 16.780517, -9.9300943};.................... #endif.................... float64 log(float64 x).................... {.................... float64 y, res, r, y2;.................... unsigned int16 data1,data2;.................... unsigned int16 *p;.................... signed int16 n;.................... #ifdef _ERRNO.................... if(x <0).................... {.................... errno=EDOM;.................... }.................... if(x ==0).................... {.................... errno=ERANGE;.................... return(0);.................... }.................... #endif.................... y = x;........................................ if (y != 1.0).................... {.................... #if !defined(__PCD__).................... *((unsigned int8 *)(&y)) = 0x7E;.................... #endif.................... p= (((unsigned int16 *)(&y))+3);.................... data1 = *p;.................... data2 = *p;.................... data1 = 0x3FE;.................... data1 = data1 <<4;.................... if(bit_test (data2,15)).................... bit_set(data1,15);.................... data2 = data2 & 0x000F;.................... data1 ^=data2;........................................ *p = data1;........................................ y = (y - 1.0)/(y + 1.0);........................................ y2=y*y;........................................ res = pl_64[0]*y2 + pl_64[1];.................... res = res*y2 + pl_64[2];.................... res = res*y2 + pl_64[3];........................................ r = ql_64[0]*y2 + ql_64[1];.................... r = r*y2 + ql_64[2];.................... r = r*y2 + ql_64[3];........................................ res = y*res/r;........................................ p= (((unsigned int16 *)(&x))+3);.................... data1 = *p;.................... bit_clear(data1,15);.................... data1 = data1 >>4;.................... n = data1 - 0x3FE;............................................................ if (n<0).................... r = -(float64)-n;.................... else.................... r = (float64)n;........................................ res += r*LN2;.................... }........................................ else.................... res = 0.0;........................................ return(res);.................... }.................... #endif............................................................ #define LN10 2.3025850929940456........................................ ////////////////////////////////////////////////////////////////////////////.................... // float log10(float x).................... ////////////////////////////////////////////////////////////////////////////.................... // Description : returns the the log base 10 of x.................... // Date : N/A.................... //.................... float32 log10(float32 x).................... {.................... float32 r;........................................ r = log(x);.................... r = r/LN10;.................... return(r);.................... }........................................ //Overloaded functions for log10() for PCD.................... // Overloaded function log10() for data type - Float48.................... #if defined(__PCD__).................... float48 log10(float48 x).................... {.................... float48 r;........................................ r = log(x);.................... r = r/LN10;.................... return(r);.................... }........................................ // Overloaded function log10() for data type - Float64.................... float64 log10(float64 x).................... {.................... float64 r;........................................ r = log(x);.................... r = r/LN10;.................... return(r);.................... }.................... #endif.................... ////////////////////////////////////////////////////////////////////////////.................... // float modf(float x).................... ////////////////////////////////////////////////////////////////////////////.................... // Description :breaks the argument value int integral and fractional parts,.................... // ach of which have the same sign as the argument. It stores the integral part.................... // as a float in the object pointed to by the iptr.................... // Returns : returns the signed fractional part of value..................... // Date : N/A.................... //........................................ float32 modf(float32 value,float32 *iptr).................... {.................... *iptr=(value < 0.0)? ceil(value): floor(value);.................... return(value - *iptr);.................... }.................... //Overloaded functions for modf() for PCD.................... // Overloaded function modf() for data type - Float48.................... #if defined(__PCD__).................... float48 modf(float48 value,float48 *iptr).................... {.................... *iptr=(value < 0.0)? ceil(value): floor(value);.................... return(value - *iptr);.................... }.................... // Overloaded function modf() for data type - Float64.................... float64 modf(float64 value,float64 *iptr).................... {.................... *iptr=(value < 0.0)? ceil(value): floor(value);.................... return(value - *iptr);.................... }.................... #endif........................................ ////////////////////////////////////////////////////////////////////////////.................... // float pwr(float x,float y).................... ////////////////////////////////////////////////////////////////////////////.................... // Description : returns the value (x^y).................... // Date : N/A.................... // Note : 0 is returned when the function will generate an imaginary number.................... //.................... float32 pwr(float32 x,float32 y).................... {.................... if(0 > x && fmod(y, 1) == 0) {.................... if(fmod(y, 2) == 0) {.................... return (exp(log(-x) * y));.................... } else {.................... return (-exp(log(-x) * y));.................... }.................... } else if(0 > x && fmod(y, 1) != 0) {.................... return 0;.................... } else {.................... if(x != 0 || 0 >= y) {.................... return (exp(log(x) * y));.................... }.................... }.................... }.................... //Overloaded functions for pwr() for PCD.................... // Overloaded function pwr() for data type - Float48.................... #if defined(__PCD__).................... float48 pwr(float48 x,float48 y).................... {.................... if(0 > x && fmod(y, 1) == 0) {.................... if(fmod(y, 2) == 0) {.................... return (exp(log(-x) * y));.................... } else {.................... return (-exp(log(-x) * y));.................... }.................... } else if(0 > x && fmod(y, 1) != 0) {.................... return 0;.................... } else {.................... if(x != 0 || 0 >= y) {.................... return (exp(log(x) * y));.................... }.................... }.................... }.................... // Overloaded function pwr() for data type - Float64.................... float64 pwr(float64 x,float64 y).................... {.................... if(0 > x && fmod(y, 1) == 0) {.................... if(fmod(y, 2) == 0) {.................... return (exp(log(-x) * y));.................... } else {.................... return (-exp(log(-x) * y));.................... }.................... } else if(0 > x && fmod(y, 1) != 0) {.................... return 0;.................... } else {.................... if(x != 0 || 0 >= y) {.................... return (exp(log(x) * y));.................... }.................... }.................... }.................... #endif........................................ //////////////////// Power functions ////////////////////........................................ ////////////////////////////////////////////////////////////////////////////.................... // float pow(float x,float y).................... ////////////////////////////////////////////////////////////////////////////.................... // Description : returns the value (x^y).................... // Date : N/A.................... // Note : 0 is returned when the function will generate an imaginary number.................... //.................... float32 pow(float32 x,float32 y).................... {.................... if(0 > x && fmod(y, 1) == 0) {.................... if(fmod(y, 2) == 0) {.................... return (exp(log(-x) * y));.................... } else {.................... return (-exp(log(-x) * y));.................... }.................... } else if(0 > x && fmod(y, 1) != 0) {.................... return 0;.................... } else {.................... if(x != 0 || 0 >= y) {.................... return (exp(log(x) * y));.................... }.................... }.................... }.................... //Overloaded functions for pow() for PCD.................... // Overloaded function for pow() data type - Float48.................... #if defined(__PCD__).................... float48 pow(float48 x,float48 y).................... {.................... if(0 > x && fmod(y, 1) == 0) {.................... if(fmod(y, 2) == 0) {.................... return (exp(log(-x) * y));.................... } else {.................... return (-exp(log(-x) * y));.................... }.................... } else if(0 > x && fmod(y, 1) != 0) {.................... return 0;.................... } else {.................... if(x != 0 || 0 >= y) {.................... return (exp(log(x) * y));.................... }.................... }.................... }........................................ // Overloaded function pow() for data type - Float64.................... float64 pow(float64 x,float64 y).................... {.................... if(0 > x && fmod(y, 1) == 0) {.................... if(fmod(y, 2) == 0) {.................... return (exp(log(-x) * y));.................... } else {.................... return (-exp(log(-x) * y));.................... }.................... } else if(0 > x && fmod(y, 1) != 0) {.................... return 0;.................... } else {.................... if(x != 0 || 0 >= y) {.................... return (exp(log(x) * y));.................... }.................... }.................... }.................... #endif........................................ ////////////////////////////////////////////////////////////////////////////.................... // float sqrt(float x).................... ////////////////////////////////////////////////////////////////////////////.................... // Description : returns the square root of x.................... // Date : N/A.................... //.................... float32 sqrt(float32 x).................... {.................... float32 y, res;.................... #if defined(__PCD__).................... unsigned int16 data1,data2;.................... #endif.................... BYTE *p;........................................ #ifdef _ERRNO.................... if(x < 0).................... {.................... errno=EDOM;.................... }.................... #endif........................................ if( x<=0.0).................... return(0.0);........................................ y=x;........................................ #if !defined(__PCD__).................... p=&y;.................... (*p)=(BYTE)((((unsigned int16)(*p)) + 127) >> 1);.................... #endif........................................ #if defined(__PCD__).................... p = (((unsigned int8 *)(&y))+3);.................... data1 = *(((unsigned int8 *)(&y))+3);.................... data2 = *(((unsigned int8 *)(&y))+2);.................... rotate_left(&data1,1);.................... if(bit_test(data2,7)).................... bit_set(data1,0);.................... data1 = ((data1+127) >>1);.................... bit_clear(data2,7);.................... if(bit_test(data1,0)).................... bit_set(data2,7);.................... data1 = data1 >>1;.................... *(((unsigned int8 *)(&y))+3) = data1;.................... *(((unsigned int8 *)(&y))+2) = data2;........................................ #endif........................................ do {.................... res=y;.................... y+=(x/y);........................................ #if !defined(__PCD__).................... (*p)--;.................... #endif........................................ #if defined(__PCD__).................... data1 = *(((unsigned int8 *)(&y))+3);.................... data2 = *(((unsigned int8 *)(&y))+2);.................... rotate_left(&data1,1);.................... if(bit_test(data2,7)).................... bit_set(data1,0);.................... data1--;.................... bit_clear(data2,7);.................... if(bit_test(data1,0)).................... bit_set(data2,7);.................... data1 = data1 >>1;.................... *(((unsigned int8 *)(&y))+3) = data1;.................... *(((unsigned int8 *)(&y))+2) = data2;........................................ #endif.................... } while(res != y);........................................ return(res);.................... }.................... //Overloaded functions for sqrt() for PCD.................... // Overloaded function sqrt() for data type - Float48.................... #if defined(__PCD__).................... float48 sqrt(float48 x).................... {.................... float48 y, res;.................... unsigned int16 data1,data2;.................... BYTE *p;........................................ #ifdef _ERRNO.................... if(x < 0).................... {.................... errno=EDOM;.................... }.................... #endif........................................ if( x<=0.0).................... return(0.0);........................................ y=x;........................................ #if !defined(__PCD__).................... p=&y;.................... (*p)=(BYTE)((((unsigned int16)(*p)) + 127) >> 1);.................... #endif........................................ #if defined(__PCD__).................... p = (((unsigned int8 *)(&y))+5);.................... data1 = *(((unsigned int8 *)(&y))+5);.................... data2 = *(((unsigned int8 *)(&y))+4);.................... rotate_left(&data1,1);.................... if(bit_test(data2,7)).................... bit_set(data1,0);.................... data1 = ((data1+127) >>1);.................... bit_clear(data2,7);.................... if(bit_test(data1,0)).................... bit_set(data2,7);.................... data1 = data1 >>1;.................... *(((unsigned int8 *)(&y))+5) = data1;.................... *(((unsigned int8 *)(&y))+4) = data2;........................................ #endif........................................ do {.................... res=y;.................... y+=(x/y);........................................ #if !defined(__PCD__).................... (*p)--;.................... #endif........................................ data1 = *(((unsigned int8 *)(&y))+5);.................... data2 = *(((unsigned int8 *)(&y))+4);.................... rotate_left(&data1,1);.................... if(bit_test(data2,7)).................... bit_set(data1,0);.................... data1--;.................... bit_clear(data2,7);.................... if(bit_test(data1,0)).................... bit_set(data2,7);.................... data1 = data1 >>1;.................... *(((unsigned int8 *)(&y))+5) = data1;.................... *(((unsigned int8 *)(&y))+4) = data2;........................................ } while(res != y);........................................ return(res);.................... }........................................ // Overloaded function sqrt() for data type - Float64.................... float64 sqrt(float64 x).................... {.................... float64 y, res;.................... unsigned int16 *p;.................... unsigned int16 temp1,temp2;........................................ #ifdef _ERRNO.................... if(x < 0).................... {.................... errno=EDOM;.................... }.................... #endif........................................ if( x<=0.0).................... return(0.0);........................................ y=x;.................... p= (((unsigned int16 *)(&y))+3);.................... temp1 = *p;.................... temp2 = *p;.................... bit_clear(temp1,15);.................... temp1 = (temp1>>4)+1023;.................... temp1 = temp1 >> 1;.................... temp1 = (temp1<<4) & 0xFFF0;.................... if(bit_test(temp2,15)).................... bit_set(temp1,15);.................... temp2 = temp2 & 0x000F;.................... temp1 ^= temp2;........................................ (*p) = temp1;........................................ do {.................... res=y;.................... y+=(x/y);.................... temp1 = *p;.................... temp2 = *p;.................... bit_clear(temp1,15);.................... temp1 = (temp1>>4);.................... temp1--;.................... temp1 = (temp1<<4) & 0xFFF0;.................... if(bit_test(temp2,15)).................... bit_set(temp1,15);.................... temp2 = temp2 & 0x000F;.................... temp1 ^= temp2;.................... (*p) = temp1;........................................ } while(res != y);........................................ return(res);.................... }.................... #endif........................................ ////////////////////////////// Trig Functions //////////////////////////////.................... #ifdef PI_DIV_BY_TWO.................... #undef PI_DIV_BY_TWO.................... #endif.................... #define PI_DIV_BY_TWO 1.5707963267948966.................... #ifdef TWOBYPI.................... #undef TWOBYPI.................... #define TWOBYPI 0.6366197723675813.................... #endif.................... ////////////////////////////////////////////////////////////////////////////.................... // float cos(float x).................... ////////////////////////////////////////////////////////////////////////////.................... // Description : returns the cosine value of the angle x, which is in radian.................... // Date : 9/20/2001.................... //.................... float32 cos(float32 x).................... {.................... float32 y, t, t2 = 1.0;.................... unsigned int8 quad, i;.................... float32 frac;.................... float32 p[6] = { //by the series definition for cosine.................... -0.5, // sum ( ( (-1)^n * x^2n )/(2n)! ).................... 0.04166666666667,.................... -0.00138888888889,.................... 0.00002480158730,.................... -0.00000027557319,.................... 0.00000000208767,.................... //-0.00000000001147,.................... // 0.00000000000005.................... };........................................ if (x < 0) x = -x; // absolute value of input........................................ quad = (unsigned int8)(x / PI_DIV_BY_TWO); // quadrant.................... frac = (x / PI_DIV_BY_TWO) - quad; // fractional part of input.................... quad = quad % 4; // quadrant (0 to 3)........................................ if (quad == 0 || quad == 2).................... t = frac * PI_DIV_BY_TWO;.................... else if (quad == 1).................... t = (1-frac) * PI_DIV_BY_TWO;.................... else // should be 3.................... t = (frac-1) * PI_DIV_BY_TWO;........................................ y = 1.0;.................... t = t * t;.................... for (i = 0; i <= 5; i++).................... {.................... t2 = t2 * t;.................... y = y + p[i] * t2;.................... }........................................ if (quad == 2 || quad == 1).................... y = -y; // correct sign........................................ return (y);.................... }............................................................ //Overloaded functions for cos() for PCD.................... // Overloaded function cos() for data type - Float48.................... #if defined(__PCD__).................... float48 cos(float48 x).................... {.................... float48 y, t, t2 = 1.0;.................... unsigned int8 quad, i;.................... float48 frac;.................... float48 p[6] = { //by the series definition for cosine.................... -0.5, // sum ( ( (-1)^n * x^2n )/(2n)! ).................... 0.04166666666667,.................... -0.00138888888889,.................... 0.00002480158730,.................... -0.00000027557319,.................... 0.00000000208767,.................... //-0.00000000001147,.................... // 0.00000000000005.................... };........................................ if (x < 0) x = -x; // absolute value of input........................................ quad = (unsigned int8)(x / PI_DIV_BY_TWO); // quadrant.................... frac = (x / PI_DIV_BY_TWO) - quad; // fractional part of input.................... quad = quad % 4; // quadrant (0 to 3)........................................ if (quad == 0 || quad == 2).................... t = frac * PI_DIV_BY_TWO;.................... else if (quad == 1).................... t = (1-frac) * PI_DIV_BY_TWO;.................... else // should be 3.................... t = (frac-1) * PI_DIV_BY_TWO;........................................ y = 0.999999999781;.................... t = t * t;.................... for (i = 0; i <= 5; i++).................... {.................... t2 = t2 * t;.................... y = y + p[i] * t2;.................... }........................................ if (quad == 2 || quad == 1).................... y = -y; // correct sign........................................ return (y);.................... }........................................ // Overloaded function cos() for data type - Float48.................... float64 cos(float64 x).................... {.................... float64 y, t, t2 = 1.0;.................... unsigned int8 quad, i;.................... float64 frac;.................... float64 p[6] = { //by the series definition for cosine.................... -0.5, // sum ( ( (-1)^n * x^2n )/(2n)! ).................... 0.04166666666667,.................... -0.00138888888889,.................... 0.00002480158730,.................... -0.00000027557319,.................... 0.00000000208767,.................... //-0.00000000001147,.................... // 0.00000000000005.................... };........................................ if (x < 0) x = -x; // absolute value of input........................................ quad = (unsigned int8)(x / PI_DIV_BY_TWO); // quadrant.................... frac = (x / PI_DIV_BY_TWO) - quad; // fractional part of input.................... quad = quad % 4; // quadrant (0 to 3)........................................ if (quad == 0 || quad == 2).................... t = frac * PI_DIV_BY_TWO;.................... else if (quad == 1).................... t = (1-frac) * PI_DIV_BY_TWO;.................... else // should be 3.................... t = (frac-1) * PI_DIV_BY_TWO;........................................ y = 0.999999999781;.................... t = t * t;.................... for (i = 0; i <= 5; i++).................... {.................... t2 = t2 * t;.................... y = y + p[i] * t2;.................... }........................................ if (quad == 2 || quad == 1).................... y = -y; // correct sign........................................ return (y);.................... }........................................ #endif........................................ ////////////////////////////////////////////////////////////////////////////.................... // float sin(float x).................... ////////////////////////////////////////////////////////////////////////////.................... // Description : returns the sine value of the angle x, which is in radian.................... // Date : 9/20/2001.................... //.................... float32 sin(float32 x).................... {.................... return cos(x - PI_DIV_BY_TWO);.................... }........................................ //Overloaded functions for sin() for PCD.................... // Overloaded function sin() for data type - Float48.................... #if defined(__PCD__).................... float48 sin(float48 x).................... {.................... return cos(x - PI_DIV_BY_TWO);.................... }........................................ // Overloaded function sin() for data type - Float48.................... float64 sin(float64 x).................... {.................... return cos(x - PI_DIV_BY_TWO);.................... }.................... #endif........................................ ////////////////////////////////////////////////////////////////////////////.................... // float tan(float x).................... ////////////////////////////////////////////////////////////////////////////.................... // Description : returns the tangent value of the angle x, which is in radian.................... // Date : 9/20/2001.................... //.................... float32 tan(float32 x).................... {.................... float32 c, s;........................................ c = cos(x);.................... if (c == 0.0).................... return (1.0e+36);........................................ s = sin(x);.................... return(s/c);.................... }.................... //Overloaded functions for tan() for PCD.................... // Overloaded function tan() for data type - Float48.................... #if defined(__PCD__).................... float48 tan(float48 x).................... {.................... float48 c, s;........................................ c = cos(x);.................... if (c == 0.0).................... return (1.0e+36);........................................ s = sin(x);.................... return(s/c);.................... }........................................ // Overloaded function tan() for data type - Float48.................... float64 tan(float64 x).................... {.................... float64 c, s;........................................ c = cos(x);.................... if (c == 0.0).................... return (1.0e+36);........................................ s = sin(x);.................... return(s/c);.................... }.................... #endif........................................ float32 const pas[3] = {0.49559947, -4.6145309, 5.6036290};.................... float32 const qas[3] = {1.0000000, -5.5484666, 5.6036290};........................................ float32 ASIN_COS(float32 x, unsigned int8 n).................... {.................... float32 y, res, r, y2;.................... int1 s;.................... #ifdef _ERRNO.................... if(x <-1 || x > 1).................... {.................... errno=EDOM;.................... }.................... #endif.................... s = 0;.................... y = x;........................................ if (x < 0).................... {.................... s = 1;.................... y = -y;.................... }........................................ if (y > 0.5).................... {.................... y = sqrt((1.0 - y)/2.0);.................... n += 2;.................... }........................................ y2=y*y;........................................ res = pas[0]*y2 + pas[1];.................... res = res*y2 + pas[2];........................................ r = qas[0]*y2 + qas[1];.................... r = r*y2 + qas[2];........................................ res = y*res/r;........................................ if (n & 2) // |x| > 0.5.................... res = PI_DIV_BY_TWO - 2.0*res;.................... if (s).................... res = -res;.................... if (n & 1) // take arccos.................... res = PI_DIV_BY_TWO - res;........................................ return(res);.................... }........................................ //Overloaded functions for ASIN_COS() for PCD.................... // Overloaded function ASIN_COS() for data type - Float48.................... #if defined(__PCD__).................... float48 ASIN_COS(float48 x, unsigned int8 n).................... {.................... float48 y, res, r, y2;.................... int1 s;.................... #ifdef _ERRNO.................... if(x <-1 || x > 1).................... {.................... errno=EDOM;.................... }.................... #endif.................... s = 0;.................... y = x;........................................ if (x < 0).................... {.................... s = 1;.................... y = -y;.................... }........................................ if (y > 0.5).................... {.................... y = sqrt((1.0 - y)/2.0);.................... n += 2;.................... }........................................ y2=y*y;........................................ res = pas[0]*y2 + pas[1];.................... res = res*y2 + pas[2];........................................ r = qas[0]*y2 + qas[1];.................... r = r*y2 + qas[2];........................................ res = y*res/r;........................................ if (n & 2) // |x| > 0.5.................... res = PI_DIV_BY_TWO - 2.0*res;.................... if (s).................... res = -res;.................... if (n & 1) // take arccos.................... res = PI_DIV_BY_TWO - res;........................................ return(res);.................... }........................................ // Overloaded function ASIN_COS() for data type - Float64.................... float64 ASIN_COS(float64 x, unsigned int8 n).................... {.................... float64 y, res, r, y2;.................... int1 s;.................... #ifdef _ERRNO.................... if(x <-1 || x > 1).................... {.................... errno=EDOM;.................... }.................... #endif.................... s = 0;.................... y = x;........................................ if (x < 0).................... {.................... s = 1;.................... y = -y;.................... }........................................ if (y > 0.5).................... {.................... y = sqrt((1.0 - y)/2.0);.................... n += 2;.................... }........................................ y2=y*y;........................................ res = pas[0]*y2 + pas[1];.................... res = res*y2 + pas[2];........................................ r = qas[0]*y2 + qas[1];.................... r = r*y2 + qas[2];........................................ res = y*res/r;........................................ if (n & 2) // |x| > 0.5.................... res = PI_DIV_BY_TWO - 2.0*res;.................... if (s).................... res = -res;.................... if (n & 1) // take arccos.................... res = PI_DIV_BY_TWO - res;........................................ return(res);.................... }.................... #endif........................................ ////////////////////////////////////////////////////////////////////////////.................... // float asin(float x).................... ////////////////////////////////////////////////////////////////////////////.................... // Description : returns the arcsine value of the value x..................... // Date : N/A.................... //.................... float32 asin(float32 x).................... {.................... float32 r;........................................ r = ASIN_COS(x, 0);.................... return(r);.................... }.................... //Overloaded functions for asin() for PCD.................... // Overloaded function asin() for data type - Float48.................... #if defined(__PCD__).................... float48 asin(float48 x).................... {.................... float48 r;........................................ r = ASIN_COS(x, 0);.................... return(r);.................... }........................................ // Overloaded function asin() for data type - Float64.................... float64 asin(float64 x).................... {.................... float64 r;........................................ r = ASIN_COS(x, 0);.................... return(r);.................... }.................... #endif........................................ ////////////////////////////////////////////////////////////////////////////.................... // float acos(float x).................... ////////////////////////////////////////////////////////////////////////////.................... // Description : returns the arccosine value of the value x..................... // Date : N/A.................... //.................... float32 acos(float32 x).................... {.................... float32 r;........................................ r = ASIN_COS(x, 1);.................... return(r);.................... }.................... //Overloaded functions for acos() for PCD.................... // Overloaded function acos() for data type - Float48.................... #if defined(__PCD__).................... float48 acos(float48 x).................... {.................... float48 r;........................................ r = ASIN_COS(x, 1);.................... return(r);.................... }........................................ // Overloaded function acos() for data type - Float64.................... float64 acos(float64 x).................... {.................... float64 r;........................................ r = ASIN_COS(x, 1);.................... return(r);.................... }.................... #endif........................................ float32 const pat[4] = {0.17630401, 5.6710795, 22.376096, 19.818457};.................... float32 const qat[4] = {1.0000000, 11.368190, 28.982246, 19.818457};........................................ ////////////////////////////////////////////////////////////////////////////.................... // float atan(float x).................... ////////////////////////////////////////////////////////////////////////////.................... // Description : returns the arctangent value of the value x..................... // Date : N/A.................... //.................... float32 atan(float32 x).................... {.................... float32 y, res, r;.................... int1 s, flag;........................................ s = 0;.................... flag = 0;.................... y = x;........................................ if (x < 0).................... {.................... s = 1;.................... y = -y;.................... }........................................ if (y > 1.0).................... {.................... y = 1.0/y;.................... flag = 1;.................... }........................................ res = pat[0]*y*y + pat[1];.................... res = res*y*y + pat[2];.................... res = res*y*y + pat[3];........................................ r = qat[0]*y*y + qat[1];.................... r = r*y*y + qat[2];.................... r = r*y*y + qat[3];........................................ res = y*res/r;............................................................ if (flag) // for |x| > 1.................... res = PI_DIV_BY_TWO - res;.................... if (s).................... res = -res;........................................ return(res);.................... }.................... //Overloaded functions for atan() for PCD.................... // Overloaded function atan() for data type - Float48.................... #if defined(__PCD__).................... float48 atan(float48 x).................... {.................... float48 y, res, r;.................... int1 s, flag;........................................ s = 0;.................... flag = 0;.................... y = x;........................................ if (x < 0).................... {.................... s = 1;.................... y = -y;.................... }........................................ if (y > 1.0).................... {.................... y = 1.0/y;.................... flag = 1;.................... }........................................ res = pat[0]*y*y + pat[1];.................... res = res*y*y + pat[2];.................... res = res*y*y + pat[3];........................................ r = qat[0]*y*y + qat[1];.................... r = r*y*y + qat[2];.................... r = r*y*y + qat[3];........................................ res = y*res/r;............................................................ if (flag) // for |x| > 1.................... res = PI_DIV_BY_TWO - res;.................... if (s).................... res = -res;........................................ return(res);.................... }........................................ // Overloaded function atan() for data type - Float64.................... float64 atan(float64 x).................... {.................... float64 y, res, r;.................... int1 s, flag;........................................ s = 0;.................... flag = 0;.................... y = x;........................................ if (x < 0).................... {.................... s = 1;.................... y = -y;.................... }........................................ if (y > 1.0).................... {.................... y = 1.0/y;.................... flag = 1;.................... }........................................ res = pat[0]*y*y + pat[1];.................... res = res*y*y + pat[2];.................... res = res*y*y + pat[3];........................................ r = qat[0]*y*y + qat[1];.................... r = r*y*y + qat[2];.................... r = r*y*y + qat[3];........................................ res = y*res/r;............................................................ if (flag) // for |x| > 1.................... res = PI_DIV_BY_TWO - res;.................... if (s).................... res = -res;........................................ return(res);.................... }.................... #endif........................................ /////////////////////////////////////////////////////////////////////////////.................... // float atan2(float y, float x).................... /////////////////////////////////////////////////////////////////////////////.................... // Description :computes the principal value of arc tangent of y/x, using the.................... // signs of both the arguments to determine the quadrant of the return value.................... // Returns : returns the arc tangent of y/x..................... // Date : N/A.................... //........................................ float32 atan2(float32 y,float32 x).................... {.................... float32 z;.................... int1 sign;.................... unsigned int8 quad;.................... sign=0;.................... quad=0; //quadrant.................... quad=((y<=0.0)?((x<=0.0)?3:4):((x<0.0)?2:1));.................... if(y<0.0).................... {.................... sign=1;.................... y=-y;.................... }.................... if(x<0.0).................... {.................... x=-x;.................... }.................... if (x==0.0).................... {.................... if(y==0.0).................... {.................... #ifdef _ERRNO.................... {.................... errno=EDOM;.................... }.................... #endif.................... }.................... else.................... {.................... if(sign).................... {.................... return (-(PI_DIV_BY_TWO));.................... }.................... else.................... {.................... return (PI_DIV_BY_TWO);.................... }.................... }.................... }.................... else.................... {.................... z=y/x;.................... switch(quad).................... {.................... case 1:.................... {.................... return atan(z);.................... break;.................... }.................... case 2:.................... {.................... // return (atan(z)+PI_DIV_BY_TWO); //2L3122.................... return (PI-atan(z));.................... break;.................... }.................... case 3:.................... {.................... return (atan(z)-PI);.................... break;.................... }.................... case 4:.................... {.................... return (-atan(z));.................... break;.................... }.................... }.................... }.................... }........................................ //Overloaded functions for atan2() for PCD.................... // Overloaded function atan2() for data type - Float48.................... #if defined(__PCD__).................... float48 atan2(float48 y,float48 x).................... {.................... float48 z;.................... int1 sign;.................... unsigned int8 quad;.................... sign=0;.................... quad=0; //quadrant.................... quad=((y<=0.0)?((x<=0.0)?3:4):((x<0.0)?2:1));.................... if(y<0.0).................... {.................... sign=1;.................... y=-y;.................... }.................... if(x<0.0).................... {.................... x=-x;.................... }.................... if (x==0.0).................... {.................... if(y==0.0).................... {.................... #ifdef _ERRNO.................... {.................... errno=EDOM;.................... }.................... #endif.................... }.................... else.................... {.................... if(sign).................... {.................... return (-(PI_DIV_BY_TWO));.................... }.................... else.................... {.................... return (PI_DIV_BY_TWO);.................... }.................... }.................... }.................... else.................... {.................... z=y/x;.................... switch(quad).................... {.................... case 1:.................... {.................... return atan(z);.................... break;.................... }.................... case 2:.................... {.................... // return (atan(z)+PI_DIV_BY_TWO); //2L3122.................... return (PI-atan(z));.................... break;.................... }.................... case 3:.................... {.................... return (atan(z)-PI);.................... break;.................... }.................... case 4:.................... {.................... return (-atan(z));.................... break;.................... }.................... }.................... }.................... }........................................ // Overloaded function atan2() for data type - Float64.................... float64 atan2(float64 y,float64 x).................... {.................... float64 z;.................... int1 sign;.................... unsigned int8 quad;.................... sign=0;.................... quad=0; //quadrant.................... quad=((y<=0.0)?((x<=0.0)?3:4):((x<0.0)?2:1));.................... if(y<0.0).................... {.................... sign=1;.................... y=-y;.................... }.................... if(x<0.0).................... {.................... x=-x;.................... }.................... if (x==0.0).................... {.................... if(y==0.0).................... {.................... #ifdef _ERRNO.................... {.................... errno=EDOM;.................... }.................... #endif.................... }.................... else.................... {.................... if(sign).................... {.................... return (-(PI_DIV_BY_TWO));.................... }.................... else.................... {.................... return (PI_DIV_BY_TWO);.................... }.................... }.................... }.................... else.................... {.................... z=y/x;.................... switch(quad).................... {.................... case 1:.................... {.................... return atan(z);.................... break;.................... }.................... case 2:.................... {.................... // return (atan(z)+PI_DIV_BY_TWO); //2L3122.................... return (PI-atan(z));.................... break;.................... }.................... case 3:.................... {.................... return (atan(z)-PI);.................... break;.................... }.................... case 4:.................... {.................... return (-atan(z));.................... break;.................... }.................... }.................... }.................... }.................... #endif........................................ //////////////////// Hyperbolic functions ////////////////////........................................ ////////////////////////////////////////////////////////////////////////////.................... // float cosh(float x).................... ////////////////////////////////////////////////////////////////////////////.................... // Description : Computes the hyperbolic cosine value of x.................... // Returns : returns the hyperbolic cosine value of x.................... // Date : N/A.................... //........................................ float32 cosh(float32 x).................... {.................... return ((exp(x)+exp(-x))/2);.................... }.................... //Overloaded functions for cosh() for PCD.................... // Overloaded function cosh() for data type - Float48.................... #if defined(__PCD__).................... float48 cosh(float48 x).................... {.................... return ((exp(x)+exp(-x))/2);.................... }........................................ // Overloaded function cosh() for data type - Float64.................... float64 cosh(float64 x).................... {.................... return ((exp(x)+exp(-x))/2);.................... }.................... #endif........................................ ////////////////////////////////////////////////////////////////////////////.................... // float sinh(float x).................... ////////////////////////////////////////////////////////////////////////////.................... // Description : Computes the hyperbolic sine value of x.................... // Returns : returns the hyperbolic sine value of x.................... // Date : N/A.................... //........................................ float32 sinh(float32 x).................... {........................................ return ((exp(x) - exp(-x))/2);.................... }.................... //Overloaded functions for sinh() for PCD.................... // Overloaded function sinh() for data type - Float48.................... #if defined(__PCD__).................... float48 sinh(float48 x).................... {........................................ return ((exp(x) - exp(-x))/2);.................... }........................................ // Overloaded function sinh() for data type - Float48.................... float64 sinh(float64 x).................... {........................................ return ((exp(x) - exp(-x))/2);.................... }.................... #endif........................................ ////////////////////////////////////////////////////////////////////////////.................... // float tanh(float x).................... ////////////////////////////////////////////////////////////////////////////.................... // Description : Computes the hyperbolic tangent value of x.................... // Returns : returns the hyperbolic tangent value of x.................... // Date : N/A.................... //........................................ float32 tanh(float32 x).................... {.................... return(sinh(x)/cosh(x));.................... }.................... //Overloaded functions for tanh() for PCD.................... // Overloaded function tanh() for data type - Float48.................... #if defined(__PCD__).................... float48 tanh(float48 x).................... {.................... return(sinh(x)/cosh(x));.................... }........................................ // Overloaded function tanh() for data type - Float64.................... float64 tanh(float64 x).................... {.................... return(sinh(x)/cosh(x));.................... }.................... #endif........................................ ////////////////////////////////////////////////////////////////////////////.................... // float frexp(float x, signed int *exp).................... ////////////////////////////////////////////////////////////////////////////.................... // Description : breaks a floating point number into a normalized fraction and an integral.................... // power of 2. It stores the integer in the signed int object pointed to by exp..................... // Returns : returns the value x, such that x is a double with magnitude in the interval.................... // [1/2,1) or zero, and value equals x times 2 raised to the power *exp.If value is zero,.................... // both parts of the result are zero..................... // Date : N/A.................... //........................................ #define LOG2 .30102999566398119521.................... float32 frexp(float32 x, signed int8 *exp).................... {.................... float32 res;.................... int1 sign = 0;.................... if(x == 0.0).................... {.................... *exp=0;.................... return (0.0);.................... }.................... if(x < 0.0).................... {.................... x=-x;.................... sign=1;.................... }.................... if (x > 1.0).................... {.................... *exp=(ceil(log10(x)/LOG2));.................... res=x/(pow(2, *exp));.................... if (res == 1).................... {.................... *exp=*exp+1;.................... res=.5;.................... }.................... }.................... else.................... {.................... if(x < 0.5).................... {.................... *exp=-1;.................... res=x*2;.................... }.................... else.................... {.................... *exp=0;.................... res=x;.................... }.................... }.................... if(sign).................... {.................... res=-res;.................... }.................... return res;.................... }........................................ //Overloaded functions for frexp() for PCD.................... // Overloaded function frexp() for data type - Float48.................... #if defined(__PCD__).................... float48 frexp(float48 x, signed int8 *exp).................... {.................... float48 res;.................... int1 sign = 0;.................... if(x == 0.0).................... {.................... *exp=0;.................... return (0.0);.................... }.................... if(x < 0.0).................... {.................... x=-x;.................... sign=1;.................... }.................... if (x > 1.0).................... {.................... *exp=(ceil(log10(x)/LOG2));.................... res=x/(pow(2, *exp));.................... if (res == 1).................... {.................... *exp=*exp+1;.................... res=.5;.................... }.................... }.................... else.................... {.................... if(x < 0.5).................... {.................... *exp=-1;.................... res=x*2;.................... }.................... else.................... {.................... *exp=0;.................... res=x;.................... }.................... }.................... if(sign).................... {.................... res=-res;.................... }.................... return res;.................... }........................................ // Overloaded function frexp() for data type - Float64.................... float64 frexp(float64 x, signed int8 *exp).................... {.................... float64 res;.................... int1 sign = 0;.................... if(x == 0.0).................... {.................... *exp=0;.................... return (0.0);.................... }.................... if(x < 0.0).................... {.................... x=-x;.................... sign=1;.................... }.................... if (x > 1.0).................... {.................... *exp=(ceil(log10(x)/LOG2));.................... res=x/(pow(2, *exp));.................... if (res == 1).................... {.................... *exp=*exp+1;.................... res=.5;.................... }.................... }.................... else.................... {.................... if(x < 0.5).................... {.................... *exp=-1;.................... res=x*2;.................... }.................... else.................... {.................... *exp=0;.................... res=x;.................... }.................... }.................... if(sign).................... {.................... res=-res;.................... }.................... return res;.................... }.................... #endif........................................ //////////////////////////////////////////////////////////////////////////////.................... // float ldexp(float x, signed int *exp).................... //////////////////////////////////////////////////////////////////////////////.................... // Description : multiplies a floating point number by an integral power of 2..................... // Returns : returns the value of x times 2 raised to the power exp..................... // Date : N/A.................... //........................................ float32 ldexp(float32 value, signed int8 exp).................... {.................... return (value * pow(2,exp));.................... }.................... //Overloaded functions for ldexp() for PCD.................... // Overloaded function ldexp() for data type - Float48........................................ #if defined(__PCD__).................... float48 ldexp(float48 value, signed int8 exp).................... {.................... return (value * pow(2,exp));.................... }.................... // Overloaded function ldexp() for data type - Float64.................... float64 ldexp(float64 value, signed int8 exp).................... {.................... return (value * pow(2,exp));.................... }.................... #endif........................................ #endif............................................................ #define MPL3115_ADDR_R 0xC1 //addresa pro cteni.................... #define MPL3115_ADDR_W 0xC0........................................ #include "../MPL3115.h".................... //microchip pic library for Freescale MPL3115 I2C barometer sensor........................................ /*void mpl3115_setA (void) //setup sensor for altitude measurement.................... void mpl3115_setP (void) //setup sensor for preasure measurement.................... float mpl3115_T (void) //temperature in Celsius degrees.................... float mpl3115_A (void) //altitude in metres.................... float mpl3115_P (void) //preassure in pascals.................... */........................................ #include "MPL3115.c".................... void mpl3115_setA (void) //setup for altitude measurement.................... {............................................................ i2c_start(); //STANDBY mode.................... I2C_Write(MPL3115_ADDR_W);.................... I2C_write(0x26);.................... I2C_write(0xB8);.................... i2c_stop();........................................ i2c_start(); //PT_DATA_CFG set.................... I2C_Write(MPL3115_ADDR_W);.................... I2C_write(0x13);.................... I2C_write(0x07); //hodnota.................... i2c_stop();........................................ i2c_start(); //ACTIVE mode.................... I2C_Write(MPL3115_ADDR_W);.................... I2C_write(0x26);.................... I2C_write(0xB9);.................... i2c_stop();.................... }........................................ void mpl3115_setP (void) //nastavení pro tlak.................... {............................................................ i2c_start(); //STANDBY mode*09AD: BSF 20.409AE: MOVF 20,W09AF: BSF 03.509B0: MOVWF 0709B1: NOP09B2: BCF 03.509B3: BSF 20.309B4: MOVF 20,W09B5: BSF 03.509B6: MOVWF 0709B7: NOP09B8: BCF 03.509B9: BCF 07.409BA: BCF 20.409BB: MOVF 20,W09BC: BSF 03.509BD: MOVWF 0709BE: NOP09BF: BCF 03.509C0: BCF 07.309C1: BCF 20.309C2: MOVF 20,W09C3: BSF 03.509C4: MOVWF 07.................... I2C_Write(MPL3115_ADDR_W);09C5: MOVLW C009C6: BCF 03.509C7: MOVWF 4E09C8: BCF 0A.309C9: CALL 07809CA: BSF 0A.3.................... I2C_write(0x26);09CB: MOVLW 2609CC: MOVWF 4E09CD: BCF 0A.309CE: CALL 07809CF: BSF 0A.3.................... I2C_write(0xB8);09D0: MOVLW B809D1: MOVWF 4E09D2: BCF 0A.309D3: CALL 07809D4: BSF 0A.3.................... i2c_stop();09D5: BCF 20.409D6: MOVF 20,W09D7: BSF 03.509D8: MOVWF 0709D9: NOP09DA: BCF 03.509DB: BSF 20.309DC: MOVF 20,W09DD: BSF 03.509DE: MOVWF 0709DF: BCF 03.509E0: BTFSS 07.309E1: GOTO 1E009E2: NOP09E3: GOTO 1E409E4: NOP09E5: BSF 20.409E6: MOVF 20,W09E7: BSF 03.509E8: MOVWF 0709E9: NOP........................................ i2c_start(); //PT_DATA_CFG set09EA: BCF 03.509EB: BSF 20.409EC: MOVF 20,W09ED: BSF 03.509EE: MOVWF 0709EF: NOP09F0: BCF 03.509F1: BSF 20.309F2: MOVF 20,W09F3: BSF 03.509F4: MOVWF 0709F5: NOP09F6: BCF 03.509F7: BCF 07.409F8: BCF 20.409F9: MOVF 20,W09FA: BSF 03.509FB: MOVWF 0709FC: NOP09FD: BCF 03.509FE: BCF 07.309FF: BCF 20.30A00: MOVF 20,W0A01: BSF 03.50A02: MOVWF 07.................... I2C_Write(MPL3115_ADDR_W);0A03: MOVLW C00A04: BCF 03.50A05: MOVWF 4E0A06: BCF 0A.30A07: CALL 0780A08: BSF 0A.3.................... I2C_write(0x13);0A09: MOVLW 130A0A: MOVWF 4E0A0B: BCF 0A.30A0C: CALL 0780A0D: BSF 0A.3.................... I2C_write(0x07); //hodnota0A0E: MOVLW 070A0F: MOVWF 4E0A10: BCF 0A.30A11: CALL 0780A12: BSF 0A.3.................... i2c_stop();0A13: BCF 20.40A14: MOVF 20,W0A15: BSF 03.50A16: MOVWF 070A17: NOP0A18: BCF 03.50A19: BSF 20.30A1A: MOVF 20,W0A1B: BSF 03.50A1C: MOVWF 070A1D: BCF 03.50A1E: BTFSS 07.30A1F: GOTO 21E0A20: NOP0A21: GOTO 2220A22: NOP0A23: BSF 20.40A24: MOVF 20,W0A25: BSF 03.50A26: MOVWF 070A27: NOP........................................ i2c_start(); //ACTIVE mode0A28: BCF 03.50A29: BSF 20.40A2A: MOVF 20,W0A2B: BSF 03.50A2C: MOVWF 070A2D: NOP0A2E: BCF 03.50A2F: BSF 20.30A30: MOVF 20,W0A31: BSF 03.50A32: MOVWF 070A33: NOP0A34: BCF 03.50A35: BCF 07.40A36: BCF 20.40A37: MOVF 20,W0A38: BSF 03.50A39: MOVWF 070A3A: NOP0A3B: BCF 03.50A3C: BCF 07.30A3D: BCF 20.30A3E: MOVF 20,W0A3F: BSF 03.50A40: MOVWF 07.................... I2C_Write(MPL3115_ADDR_W);0A41: MOVLW C00A42: BCF 03.50A43: MOVWF 4E0A44: BCF 0A.30A45: CALL 0780A46: BSF 0A.3.................... I2C_write(0x26);0A47: MOVLW 260A48: MOVWF 4E0A49: BCF 0A.30A4A: CALL 0780A4B: BSF 0A.3.................... I2C_write(0x39);0A4C: MOVLW 390A4D: MOVWF 4E0A4E: BCF 0A.30A4F: CALL 0780A50: BSF 0A.3.................... i2c_stop();0A51: BCF 20.40A52: MOVF 20,W0A53: BSF 03.50A54: MOVWF 070A55: NOP0A56: BCF 03.50A57: BSF 20.30A58: MOVF 20,W0A59: BSF 03.50A5A: MOVWF 070A5B: BCF 03.50A5C: BTFSS 07.30A5D: GOTO 25C0A5E: NOP0A5F: GOTO 2600A60: NOP0A61: BSF 20.40A62: MOVF 20,W0A63: BSF 03.50A64: MOVWF 070A65: NOP.................... }0A66: BCF 03.50A67: BSF 0A.30A68: BCF 0A.40A69: GOTO 5EC (RETURN)............................................................ byte mpl3115_read (byte reg).................... {.................... byte i;........................................ i2c_start();*079C: BSF 20.4079D: MOVF 20,W079E: BSF 03.5079F: MOVWF 0707A0: NOP07A1: BCF 03.507A2: BSF 20.307A3: MOVF 20,W07A4: BSF 03.507A5: MOVWF 0707A6: NOP07A7: BCF 03.507A8: BCF 07.407A9: BCF 20.407AA: MOVF 20,W07AB: BSF 03.507AC: MOVWF 0707AD: NOP07AE: BCF 03.507AF: BCF 07.307B0: BCF 20.307B1: MOVF 20,W07B2: BSF 03.507B3: MOVWF 07.................... I2C_Write(MPL3115_ADDR_W);07B4: MOVLW C007B5: BCF 03.507B6: MOVWF 4E07B7: CALL 078.................... I2C_write(reg);07B8: MOVF 4C,W07B9: MOVWF 4E07BA: CALL 078.................... i2c_start();07BB: BSF 20.407BC: MOVF 20,W07BD: BSF 03.507BE: MOVWF 0707BF: NOP07C0: BCF 03.507C1: BSF 20.307C2: MOVF 20,W07C3: BSF 03.507C4: MOVWF 0707C5: NOP07C6: BCF 03.507C7: BTFSS 07.307C8: GOTO 7C707C9: BCF 07.407CA: BCF 20.407CB: MOVF 20,W07CC: BSF 03.507CD: MOVWF 0707CE: NOP07CF: BCF 03.507D0: BCF 07.307D1: BCF 20.307D2: MOVF 20,W07D3: BSF 03.507D4: MOVWF 07.................... I2C_Write(MPL3115_ADDR_R);07D5: MOVLW C107D6: BCF 03.507D7: MOVWF 4E07D8: CALL 078.................... i=i2c_read(0);07D9: CLRF 7707DA: CALL 28507DB: MOVF 78,W07DC: MOVWF 4D.................... i2c_stop();07DD: BCF 20.407DE: MOVF 20,W07DF: BSF 03.507E0: MOVWF 0707E1: NOP07E2: BCF 03.507E3: BSF 20.307E4: MOVF 20,W07E5: BSF 03.507E6: MOVWF 0707E7: BCF 03.507E8: BTFSS 07.307E9: GOTO 7E807EA: NOP07EB: GOTO 7EC07EC: NOP07ED: BSF 20.407EE: MOVF 20,W07EF: BSF 03.507F0: MOVWF 0707F1: NOP........................................ return i;07F2: BCF 03.507F3: MOVF 4D,W07F4: MOVWF 78.................... }07F5: RETURN............................................................ float mpl3115_T (void) //teplota ve stupnich.................... {.................... int m;.................... float l, t;........................................ m = mpl3115_read (0x04);*0891: MOVLW 040892: MOVWF 4C0893: BCF 0A.30894: CALL 79C0895: BSF 0A.30896: MOVF 78,W0897: MOVWF 3D.................... l = (float)(mpl3115_read(0x05)>>4)/16.0;0898: MOVLW 050899: MOVWF 4C089A: BCF 0A.3089B: CALL 79C089C: BSF 0A.3089D: SWAPF 78,W089E: MOVWF 77089F: MOVLW 0F08A0: ANDWF 77,F08A1: MOVF 77,W08A2: CLRF 4E08A3: MOVWF 4D08A4: BCF 0A.308A5: CALL 2CA08A6: BSF 0A.308A7: MOVF 77,W08A8: MOVWF 4608A9: MOVF 78,W08AA: MOVWF 4708AB: MOVF 79,W08AC: MOVWF 4808AD: MOVF 7A,W08AE: MOVWF 4908AF: MOVWF 5408B0: MOVF 48,W08B1: MOVWF 5308B2: MOVF 47,W08B3: MOVWF 5208B4: MOVF 46,W08B5: MOVWF 5108B6: CLRF 5808B7: CLRF 5708B8: CLRF 5608B9: MOVLW 8308BA: MOVWF 5508BB: BCF 0A.308BC: CALL 2E708BD: BSF 0A.308BE: MOVF 7A,W08BF: MOVWF 4108C0: MOVF 79,W08C1: MOVWF 4008C2: MOVF 78,W08C3: MOVWF 3F08C4: MOVF 77,W08C5: MOVWF 3E.................... t = (float)(M + L);08C6: CLRF 4E08C7: MOVF 3D,W08C8: MOVWF 4D08C9: BCF 0A.308CA: CALL 2CA08CB: BSF 0A.308CC: BCF 03.108CD: MOVF 7A,W08CE: MOVWF 5608CF: MOVF 79,W08D0: MOVWF 5508D1: MOVF 78,W08D2: MOVWF 5408D3: MOVF 77,W08D4: MOVWF 5308D5: MOVF 41,W08D6: MOVWF 5A08D7: MOVF 40,W08D8: MOVWF 5908D9: MOVF 3F,W08DA: MOVWF 5808DB: MOVF 3E,W08DC: MOVWF 5708DD: BCF 0A.308DE: CALL 42608DF: BSF 0A.308E0: MOVF 7A,W08E1: MOVWF 4508E2: MOVF 79,W08E3: MOVWF 4408E4: MOVF 78,W08E5: MOVWF 4308E6: MOVF 77,W08E7: MOVWF 42.................... return t;08E8: MOVF 42,W08E9: MOVWF 7708EA: MOVF 43,W08EB: MOVWF 7808EC: MOVF 44,W08ED: MOVWF 7908EE: MOVF 45,W08EF: MOVWF 7A.................... }08F0: BSF 0A.308F1: BCF 0A.408F2: GOTO 5DA (RETURN)........................................ float mpl3115_A (void) //vyska v m.................... {........................................ int16 m, c;.................... float l, a;........................................ m = mpl3115_read (0x01);.................... c = mpl3115_read (0x02);.................... l = (float)(mpl3115_read(0x03)>>4)/16.0;.................... a = (float)((m << 8)|c) + l;.................... return a;.................... }............................................................ float mpl3115_P (void) //tlak v Pa.................... {.................... unsigned int32 m;.................... unsigned int16 c;.................... unsigned int l;.................... float p, l1;........................................ m = mpl3115_read (0x01);08F3: MOVLW 0108F4: MOVWF 4C08F5: BCF 0A.308F6: CALL 79C08F7: BSF 0A.308F8: CLRF 4008F9: CLRF 3F08FA: CLRF 3E08FB: MOVF 78,W08FC: MOVWF 3D.................... c = mpl3115_read (0x02);08FD: MOVLW 0208FE: MOVWF 4C08FF: BCF 0A.30900: CALL 79C0901: BSF 0A.30902: CLRF 420903: MOVF 78,W0904: MOVWF 41.................... l = mpl3115_read(0x03);0905: MOVLW 030906: MOVWF 4C0907: BCF 0A.30908: CALL 79C0909: BSF 0A.3090A: MOVF 78,W090B: MOVWF 43........................................ l1= (float)(l>>4)/4.0;090C: SWAPF 43,W090D: MOVWF 77090E: MOVLW 0F090F: ANDWF 77,F0910: MOVF 77,W0911: CLRF 4E0912: MOVWF 4D0913: BCF 0A.30914: CALL 2CA0915: BSF 0A.30916: MOVF 77,W0917: MOVWF 4D0918: MOVF 78,W0919: MOVWF 4E091A: MOVF 79,W091B: MOVWF 4F091C: MOVF 7A,W091D: MOVWF 50091E: MOVWF 54091F: MOVF 79,W0920: MOVWF 530921: MOVF 78,W0922: MOVWF 520923: MOVF 77,W0924: MOVWF 510925: CLRF 580926: CLRF 570927: CLRF 560928: MOVLW 810929: MOVWF 55092A: BCF 0A.3092B: CALL 2E7092C: BSF 0A.3092D: MOVF 7A,W092E: MOVWF 4B092F: MOVF 79,W0930: MOVWF 4A0931: MOVF 78,W0932: MOVWF 490933: MOVF 77,W0934: MOVWF 48.................... p = (float)((m << 10)|(c<<2)|(l>>6)) + l1;0935: CLRF 4D0936: RLF 3D,W0937: MOVWF 4E0938: RLF 3E,W0939: MOVWF 4F093A: RLF 3F,W093B: MOVWF 50093C: RLF 4E,F093D: RLF 4F,F093E: RLF 50,F093F: MOVLW FC0940: ANDWF 4E,F0941: RLF 41,W0942: MOVWF 790943: RLF 42,W0944: MOVWF 7A0945: RLF 79,F0946: RLF 7A,F0947: MOVLW FC0948: ANDWF 79,F0949: MOVF 79,W094A: IORWF 4D,F094B: MOVF 7A,W094C: IORWF 4E,F094D: SWAPF 43,W094E: MOVWF 77094F: RRF 77,F0950: RRF 77,F0951: MOVLW 030952: ANDWF 77,F0953: MOVF 77,W0954: IORWF 4D,W0955: MOVWF 770956: MOVF 4E,W0957: MOVWF 780958: MOVF 4F,W0959: MOVWF 79095A: MOVF 50,W095B: MOVWF 7A095C: MOVF 7A,W095D: MOVWF 56095E: MOVF 79,W095F: MOVWF 550960: MOVF 78,W0961: MOVWF 540962: MOVF 77,W0963: MOVWF 53*097E: MOVF 77,W097F: MOVWF 4D0980: MOVF 78,W0981: MOVWF 4E0982: MOVF 79,W0983: MOVWF 4F0984: MOVF 7A,W0985: MOVWF 500986: BCF 03.10987: MOVF 7A,W0988: MOVWF 560989: MOVF 79,W098A: MOVWF 55098B: MOVF 78,W098C: MOVWF 54098D: MOVF 77,W098E: MOVWF 53098F: MOVF 4B,W0990: MOVWF 5A0991: MOVF 4A,W0992: MOVWF 590993: MOVF 49,W0994: MOVWF 580995: MOVF 48,W0996: MOVWF 570997: BCF 0A.30998: CALL 4260999: BSF 0A.3099A: MOVF 7A,W099B: MOVWF 47099C: MOVF 79,W099D: MOVWF 46099E: MOVF 78,W099F: MOVWF 4509A0: MOVF 77,W09A1: MOVWF 44........................................ return p;09A2: MOVF 44,W09A3: MOVWF 7709A4: MOVF 45,W09A5: MOVWF 7809A6: MOVF 46,W09A7: MOVWF 7909A8: MOVF 47,W09A9: MOVWF 7A.................... }09AA: BSF 0A.309AB: BCF 0A.409AC: GOTO 5E3 (RETURN)............................................................................................................................................ void main().................... {*0CE5: CLRF 040CE6: BCF 03.70CE7: MOVLW 1F0CE8: ANDWF 03,F0CE9: MOVLW 710CEA: BSF 03.50CEB: MOVWF 0F0CEC: MOVF 0F,W0CED: BSF 03.60CEE: BCF 07.30CEF: MOVLW 0C0CF0: BCF 03.60CF1: MOVWF 190CF2: MOVLW A20CF3: MOVWF 180CF4: MOVLW 900CF5: BCF 03.50CF6: MOVWF 180CF7: BSF 03.50CF8: BSF 03.60CF9: MOVF 09,W0CFA: ANDLW C00CFB: MOVWF 090CFC: BCF 03.60CFD: BCF 1F.40CFE: BCF 1F.50CFF: MOVLW 000D00: BSF 03.60D01: MOVWF 080D02: BCF 03.50D03: CLRF 070D04: CLRF 080D05: CLRF 09*0D0F: CLRF 3C0D10: CLRF 3B.................... float temp1, temp2, temp3, humidity, preasure;.................... int16 i=0;........................................ setup_adc_ports(NO_ANALOGS|VSS_VDD);0D11: BSF 03.50D12: BSF 03.60D13: MOVF 09,W0D14: ANDLW C00D15: MOVWF 090D16: BCF 03.60D17: BCF 1F.40D18: BCF 1F.50D19: MOVLW 000D1A: BSF 03.60D1B: MOVWF 08.................... setup_adc(ADC_CLOCK_DIV_2);0D1C: BCF 03.50D1D: BCF 03.60D1E: BCF 1F.60D1F: BCF 1F.70D20: BSF 03.50D21: BSF 1F.70D22: BCF 03.50D23: BSF 1F.0.................... setup_spi(SPI_SS_DISABLED);0D24: BCF 14.50D25: BCF 20.50D26: MOVF 20,W0D27: BSF 03.50D28: MOVWF 070D29: BCF 03.50D2A: BSF 20.40D2B: MOVF 20,W0D2C: BSF 03.50D2D: MOVWF 070D2E: BCF 03.50D2F: BCF 20.30D30: MOVF 20,W0D31: BSF 03.50D32: MOVWF 070D33: MOVLW 010D34: BCF 03.50D35: MOVWF 140D36: MOVLW 000D37: BSF 03.50D38: MOVWF 14.................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);0D39: MOVF 01,W0D3A: ANDLW C70D3B: IORLW 080D3C: MOVWF 01.................... setup_timer_1(T1_DISABLED);0D3D: BCF 03.50D3E: CLRF 10.................... setup_timer_2(T2_DISABLED,0,1);0D3F: MOVLW 000D40: MOVWF 780D41: MOVWF 120D42: MOVLW 000D43: BSF 03.50D44: MOVWF 12.................... setup_ccp1(CCP_OFF);0D45: BCF 03.50D46: BSF 20.20D47: MOVF 20,W0D48: BSF 03.50D49: MOVWF 070D4A: BCF 03.50D4B: CLRF 170D4C: BSF 03.50D4D: CLRF 1B0D4E: CLRF 1C0D4F: MOVLW 010D50: MOVWF 1D.................... setup_comparator(NC_NC_NC_NC); // This device COMP currently not supported by the PICWizard0D51: BCF 03.50D52: BSF 03.60D53: CLRF 070D54: CLRF 080D55: CLRF 09.................... setup_oscillator(OSC_8MHZ);0D56: MOVLW 710D57: BSF 03.50D58: BCF 03.60D59: MOVWF 0F0D5A: MOVF 0F,W............................................................ printf("GeoMet01A\r\n");0D5B: MOVLW 0C0D5C: BCF 03.50D5D: BSF 03.60D5E: MOVWF 0D0D5F: MOVLW 000D60: MOVWF 0F0D61: BCF 0A.30D62: BCF 03.60D63: CALL 0300D64: BSF 0A.3.................... printf("(c) Kaklik 2013\r\n");0D65: MOVLW 120D66: BSF 03.60D67: MOVWF 0D0D68: MOVLW 000D69: MOVWF 0F0D6A: BCF 0A.30D6B: BCF 03.60D6C: CALL 0300D6D: BSF 0A.3.................... printf("www.mlab.cz\r\n");0D6E: MOVLW 1B0D6F: BSF 03.60D70: MOVWF 0D0D71: MOVLW 000D72: MOVWF 0F0D73: BCF 0A.30D74: BCF 03.60D75: CALL 0300D76: BSF 0A.3........................................ // Init the HMC5883L. Set Mode register for.................... // continuous measurements..................... hmc5883l_write_reg(HMC5883L_CFG_A_REG, 0x18); // no average, maximal update range0D77: CLRF 3D0D78: MOVLW 180D79: MOVWF 3E0D7A: BCF 0A.30D7B: CALL 0C20D7C: BSF 0A.3.................... hmc5883l_write_reg(HMC5883L_CFG_B_REG, 0x00); // minimal range0D7D: MOVLW 010D7E: MOVWF 3D0D7F: CLRF 3E0D80: BCF 0A.30D81: CALL 0C20D82: BSF 0A.3.................... hmc5883l_write_reg(HMC5883L_MODE_REG, 0x00);0D83: MOVLW 020D84: MOVWF 3D0D85: CLRF 3E0D86: BCF 0A.30D87: CALL 0C20D88: BSF 0A.3........................................ lcd_init();0D89: BCF 0A.30D8A: CALL 1C80D8B: BSF 0A.3.................... lcd_putc("(c) Kaklik 2013");0D8C: MOVLW 220D8D: BSF 03.60D8E: MOVWF 0D0D8F: MOVLW 000D90: MOVWF 0F0D91: BCF 0A.30D92: BCF 03.60D93: CALL 23F0D94: BSF 0A.3.................... lcd_gotoxy(3,2);0D95: MOVLW 030D96: MOVWF 4B0D97: MOVLW 020D98: MOVWF 4C0D99: BCF 0A.30D9A: CALL 2000D9B: BSF 0A.3.................... lcd_putc("www.mlab.cz");0D9C: MOVLW 2A0D9D: BSF 03.60D9E: MOVWF 0D0D9F: MOVLW 000DA0: MOVWF 0F0DA1: BCF 0A.30DA2: BCF 03.60DA3: CALL 23F0DA4: BSF 0A.3.................... Delay_ms(2000);0DA5: MOVLW 080DA6: MOVWF 3D0DA7: MOVLW FA0DA8: MOVWF 4B0DA9: BCF 0A.30DAA: CALL 0FB0DAB: BSF 0A.30DAC: DECFSZ 3D,F0DAD: GOTO 5A7.................... lcd_init();0DAE: BCF 0A.30DAF: CALL 1C80DB0: BSF 0A.3........................................ while (TRUE).................... {.................... lcd_gotoxy(1,1);0DB1: MOVLW 010DB2: MOVWF 4B0DB3: MOVWF 4C0DB4: BCF 0A.30DB5: CALL 2000DB6: BSF 0A.3.................... temp1 = SHT25_get_temp();0DB7: BCF 0A.30DB8: GOTO 5670DB9: BSF 0A.30DBA: MOVF 7A,W0DBB: MOVWF 2A0DBC: MOVF 79,W0DBD: MOVWF 290DBE: MOVF 78,W0DBF: MOVWF 280DC0: MOVF 77,W0DC1: MOVWF 27.................... humidity = SHT25_get_hum();0DC2: BCF 0A.30DC3: GOTO 6360DC4: BSF 0A.30DC5: MOVF 7A,W0DC6: MOVWF 360DC7: MOVF 79,W0DC8: MOVWF 350DC9: MOVF 78,W0DCA: MOVWF 340DCB: MOVF 77,W0DCC: MOVWF 33.................... temp2= LTS01_get_temp();0DCD: BCF 0A.30DCE: GOTO 6EC0DCF: BSF 0A.30DD0: MOVF 7A,W0DD1: MOVWF 2E0DD2: MOVF 79,W0DD3: MOVWF 2D0DD4: MOVF 78,W0DD5: MOVWF 2C0DD6: MOVF 77,W0DD7: MOVWF 2B.................... hmc5883l_read_data();0DD8: GOTO 000........................................ temp3=mpl3115_T();0DD9: GOTO 0910DDA: MOVF 7A,W0DDB: MOVWF 320DDC: MOVF 79,W0DDD: MOVWF 310DDE: MOVF 78,W0DDF: MOVWF 300DE0: MOVF 77,W0DE1: MOVWF 2F.................... preasure=mpl3115_P();0DE2: GOTO 0F30DE3: MOVF 7A,W0DE4: MOVWF 3A0DE5: MOVF 79,W0DE6: MOVWF 390DE7: MOVF 78,W0DE8: MOVWF 380DE9: MOVF 77,W0DEA: MOVWF 37.................... mpl3115_setP(); //nastaveni pro tlak a teplotu0DEB: GOTO 1AD........................................ printf(lcd_putc,"%2.2f%cC %2.2f\%%",temp1, 0xb2, humidity);0DEC: MOVLW 890DED: MOVWF 040DEE: MOVF 2A,W0DEF: MOVWF 400DF0: MOVF 29,W0DF1: MOVWF 3F0DF2: MOVF 28,W0DF3: MOVWF 3E0DF4: MOVF 27,W0DF5: MOVWF 3D0DF6: MOVLW 020DF7: MOVWF 410DF8: CALL 2CB0DF9: MOVLW B20DFA: MOVWF 4A0DFB: BCF 0A.30DFC: CALL 2120DFD: BSF 0A.30DFE: MOVLW 430DFF: MOVWF 4A0E00: BCF 0A.30E01: CALL 2120E02: BSF 0A.30E03: MOVLW 200E04: MOVWF 4A0E05: BCF 0A.30E06: CALL 2120E07: BSF 0A.30E08: MOVLW 890E09: MOVWF 040E0A: MOVF 36,W0E0B: MOVWF 400E0C: MOVF 35,W0E0D: MOVWF 3F0E0E: MOVF 34,W0E0F: MOVWF 3E0E10: MOVF 33,W0E11: MOVWF 3D0E12: MOVLW 020E13: MOVWF 410E14: CALL 2CB0E15: MOVLW 250E16: MOVWF 4A0E17: BCF 0A.30E18: CALL 2120E19: BSF 0A.3.................... lcd_gotoxy(1,2);0E1A: MOVLW 010E1B: MOVWF 4B0E1C: MOVLW 020E1D: MOVWF 4C0E1E: BCF 0A.30E1F: CALL 2000E20: BSF 0A.3.................... printf(lcd_putc,"%2.2f%cC %6.0fPa ",temp2, 0xb2, preasure);0E21: MOVLW 890E22: MOVWF 040E23: MOVF 2E,W0E24: MOVWF 400E25: MOVF 2D,W0E26: MOVWF 3F0E27: MOVF 2C,W0E28: MOVWF 3E0E29: MOVF 2B,W0E2A: MOVWF 3D0E2B: MOVLW 020E2C: MOVWF 410E2D: CALL 2CB0E2E: MOVLW B20E2F: MOVWF 4A0E30: BCF 0A.30E31: CALL 2120E32: BSF 0A.30E33: MOVLW 430E34: MOVWF 4A0E35: BCF 0A.30E36: CALL 2120E37: BSF 0A.30E38: MOVLW 200E39: MOVWF 4A0E3A: BCF 0A.30E3B: CALL 2120E3C: BSF 0A.30E3D: MOVLW 050E3E: MOVWF 040E3F: MOVF 3A,W0E40: MOVWF 400E41: MOVF 39,W0E42: MOVWF 3F0E43: MOVF 38,W0E44: MOVWF 3E0E45: MOVF 37,W0E46: MOVWF 3D0E47: CLRF 410E48: CALL 2CB0E49: MOVLW 500E4A: MOVWF 4A0E4B: BCF 0A.30E4C: CALL 2120E4D: BSF 0A.30E4E: MOVLW 610E4F: MOVWF 4A0E50: BCF 0A.30E51: CALL 2120E52: BSF 0A.30E53: MOVLW 200E54: MOVWF 4A0E55: BCF 0A.30E56: CALL 2120E57: BSF 0A.3........................................ printf("%ld %f %f %f %6.2f %3.2f %Ld %Ld %Ld \n\r",i, temp1, humidity, temp2, preasure, temp3, compass.x, compass.y, compass.z);0E58: MOVLW 100E59: MOVWF 040E5A: MOVF 3C,W0E5B: MOVWF 3E0E5C: MOVF 3B,W0E5D: MOVWF 3D0E5E: CALL 39F0E5F: MOVLW 200E60: BTFSS 0C.40E61: GOTO 6600E62: MOVWF 190E63: MOVLW 890E64: MOVWF 040E65: MOVF 2A,W0E66: MOVWF 400E67: MOVF 29,W0E68: MOVWF 3F0E69: MOVF 28,W0E6A: MOVWF 3E0E6B: MOVF 27,W0E6C: MOVWF 3D0E6D: MOVLW 020E6E: MOVWF 410E6F: CALL 4150E70: MOVLW 200E71: BTFSS 0C.40E72: GOTO 6710E73: MOVWF 190E74: MOVLW 890E75: MOVWF 040E76: MOVF 36,W0E77: MOVWF 400E78: MOVF 35,W0E79: MOVWF 3F0E7A: MOVF 34,W0E7B: MOVWF 3E0E7C: MOVF 33,W0E7D: MOVWF 3D0E7E: MOVLW 020E7F: MOVWF 410E80: CALL 4150E81: MOVLW 200E82: BTFSS 0C.40E83: GOTO 6820E84: MOVWF 190E85: MOVLW 890E86: MOVWF 040E87: MOVF 2E,W0E88: MOVWF 400E89: MOVF 2D,W0E8A: MOVWF 3F0E8B: MOVF 2C,W0E8C: MOVWF 3E0E8D: MOVF 2B,W0E8E: MOVWF 3D0E8F: MOVLW 020E90: MOVWF 410E91: CALL 4150E92: MOVLW 200E93: BTFSS 0C.40E94: GOTO 6930E95: MOVWF 190E96: MOVLW 050E97: MOVWF 040E98: MOVF 3A,W0E99: MOVWF 400E9A: MOVF 39,W0E9B: MOVWF 3F0E9C: MOVF 38,W0E9D: MOVWF 3E0E9E: MOVF 37,W0E9F: MOVWF 3D0EA0: MOVLW 020EA1: MOVWF 410EA2: CALL 4150EA3: MOVLW 200EA4: BTFSS 0C.40EA5: GOTO 6A40EA6: MOVWF 190EA7: MOVLW 020EA8: MOVWF 040EA9: MOVF 32,W0EAA: MOVWF 400EAB: MOVF 31,W0EAC: MOVWF 3F0EAD: MOVF 30,W0EAE: MOVWF 3E0EAF: MOVF 2F,W0EB0: MOVWF 3D0EB1: MOVLW 020EB2: MOVWF 410EB3: CALL 4150EB4: MOVLW 200EB5: BTFSS 0C.40EB6: GOTO 6B50EB7: MOVWF 190EB8: MOVLW 100EB9: MOVWF 040EBA: MOVF 22,W0EBB: MOVWF 3E0EBC: MOVF 21,W0EBD: MOVWF 3D0EBE: CALL 39F0EBF: MOVLW 200EC0: BTFSS 0C.40EC1: GOTO 6C00EC2: MOVWF 190EC3: MOVLW 100EC4: MOVWF 040EC5: MOVF 24,W0EC6: MOVWF 3E0EC7: MOVF 23,W0EC8: MOVWF 3D0EC9: CALL 39F0ECA: MOVLW 200ECB: BTFSS 0C.40ECC: GOTO 6CB0ECD: MOVWF 190ECE: MOVLW 100ECF: MOVWF 040ED0: MOVF 26,W0ED1: MOVWF 3E0ED2: MOVF 25,W0ED3: MOVWF 3D0ED4: CALL 39F0ED5: MOVLW 200ED6: BTFSS 0C.40ED7: GOTO 6D60ED8: MOVWF 190ED9: MOVLW 0A0EDA: BTFSS 0C.40EDB: GOTO 6DA0EDC: MOVWF 190EDD: MOVLW 0D0EDE: BTFSS 0C.40EDF: GOTO 6DE0EE0: MOVWF 19.................... i++;0EE1: INCF 3B,F0EE2: BTFSC 03.20EE3: INCF 3C,F........................................ Delay_ms(100);0EE4: MOVLW 640EE5: MOVWF 4B0EE6: BCF 0A.30EE7: CALL 0FB0EE8: BSF 0A.3.................... }0EE9: GOTO 5B1........................................ }0EEA: SLEEPConfiguration Fuses:Word 1: 2CF5 INTRC NOWDT NOPUT MCLR NOPROTECT NOCPD NOBROWNOUT IESO FCMEN NOLVP NODEBUGWord 2: 3FFF NOWRT BORV40