# HG changeset patch # User heinrichsweikamp # Date 1621874453 -7200 # Node ID 7d8a4c60ec1aeacb8540b4250af09bf36cdfcf98 # Parent a9a0188091e40389a904969974b3172b179c355a 3.15 release diff -r a9a0188091e4 -r 7d8a4c60ec1a src/P18F87K22.INC --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/P18F87K22.INC Mon May 24 18:40:53 2021 +0200 @@ -0,0 +1,2983 @@ + LIST + +;========================================================================== +; MPASM PIC18F87K22 processor include +; +; (c) Copyright 1999-2012 Microchip Technology, All rights reserved +;========================================================================== + + NOLIST + +;========================================================================== +; This header file defines configurations, registers, and other useful +; bits of information for the PIC18F87K22 microcontroller. These names +; are taken to match the data sheets as closely as possible. +; +; Note that the processor must be selected before this file is included. +; The processor may be selected the following ways: +; +; 1. Command line switch: +; C:\MPASM MYFILE.ASM /PIC18F87K22 +; 2. LIST directive in the source file +; LIST P=PIC18F87K22 +; 3. Processor Type entry in the MPASM full-screen interface +; 4. Setting the processor in the MPLAB Project Dialog +;========================================================================== + +;========================================================================== +; +; Verify Processor +; +;========================================================================== + IFNDEF __18F87K22 + MESSG "Processor-header file mismatch. Verify selected processor." + ENDIF + +;========================================================================== +; 18xxxx Family EQUates +;========================================================================== +FSR0 EQU 0 +FSR1 EQU 1 +FSR2 EQU 2 + +FAST EQU 1 + +W EQU 0 +A EQU 0 +ACCESS EQU 0 +BANKED EQU 1 +;========================================================================== + +;========================================================================== +; 16Cxxx/17Cxxx Substitutions +;========================================================================== + #define DDRA TRISA ; PIC17Cxxx SFR substitution + #define DDRB TRISB ; PIC17Cxxx SFR substitution + #define DDRC TRISC ; PIC17Cxxx SFR substitution + #define DDRD TRISD ; PIC17Cxxx SFR substitution + #define DDRE TRISE ; PIC17Cxxx SFR substitution + +;========================================================================== +; +; Register Definitions +; +;========================================================================== + +;----- Register Files ----------------------------------------------------- +PMD3 EQU H'0F16' +PMD2 EQU H'0F17' +PMD1 EQU H'0F18' +PMD0 EQU H'0F19' +PSTR3CON EQU H'0F1A' +PSTR2CON EQU H'0F1B' +TXREG2 EQU H'0F1C' +RCREG2 EQU H'0F1D' +SPBRG2 EQU H'0F1E' +SPBRGH2 EQU H'0F1F' +BAUDCON2 EQU H'0F20' +TXSTA2 EQU H'0F21' +RCSTA2 EQU H'0F22' +ANCON2 EQU H'0F23' +ANCON1 EQU H'0F24' +ANCON0 EQU H'0F25' +MEMCON EQU H'0F26' +ODCON3 EQU H'0F27' +ODCON2 EQU H'0F28' +ODCON1 EQU H'0F29' +REFOCON EQU H'0F2A' +CCPTMRS2 EQU H'0F2B' +CCPTMRS1 EQU H'0F2C' +CCPTMRS0 EQU H'0F2D' +CM3CON EQU H'0F2E' +CM3CON1 EQU H'0F2E' +CM2CON EQU H'0F2F' +CM2CON1 EQU H'0F2F' +T12CON EQU H'0F30' +PR12 EQU H'0F31' +TMR12 EQU H'0F32' +T10CON EQU H'0F33' +PR10 EQU H'0F34' +TMR10 EQU H'0F35' +T8CON EQU H'0F36' +PR8 EQU H'0F37' +TMR8 EQU H'0F38' +T6CON EQU H'0F39' +PR6 EQU H'0F3A' +TMR6 EQU H'0F3B' +T7GCON EQU H'0F3C' +T7CON EQU H'0F3D' +TMR7 EQU H'0F3E' +TMR7L EQU H'0F3E' +TMR7H EQU H'0F3F' +CCP10CON EQU H'0F40' +CCPR10 EQU H'0F41' +CCPR10L EQU H'0F41' +CCPR10H EQU H'0F42' +CCP9CON EQU H'0F43' +CCPR9 EQU H'0F44' +CCPR9L EQU H'0F44' +CCPR9H EQU H'0F45' +CCP8CON EQU H'0F46' +CCPR8 EQU H'0F47' +CCPR8L EQU H'0F47' +CCPR8H EQU H'0F48' +CCP3CON EQU H'0F49' +CCPR3 EQU H'0F4A' +CCPR3L EQU H'0F4A' +CCPR3H EQU H'0F4B' +ECCP3DEL EQU H'0F4C' +ECCP3AS EQU H'0F4D' +CCP2CON EQU H'0F4E' +ECCP2CON EQU H'0F4E' +CCPR2 EQU H'0F4F' +CCPR2L EQU H'0F4F' +CCPR2H EQU H'0F50' +ECCP2DEL EQU H'0F51' +PWM2CON EQU H'0F51' +ECCP2AS EQU H'0F52' +PADCFG1 EQU H'0F53' +CM1CON EQU H'0F54' +CM1CON1 EQU H'0F54' +CTMUICON EQU H'0F55' +CTMUCONL EQU H'0F56' +CTMUCONH EQU H'0F57' +ALRMVAL EQU H'0F58' +ALRMVALL EQU H'0F58' +ALRMVALH EQU H'0F59' +ALRMRPT EQU H'0F5A' +ALRMCFG EQU H'0F5B' +RTCVAL EQU H'0F5C' +RTCVALL EQU H'0F5C' +RTCVALH EQU H'0F5D' +RTCCAL EQU H'0F5E' +RTCCFG EQU H'0F5F' +PIE6 EQU H'0F60' +EEDATA EQU H'0F61' +EEADR EQU H'0F62' +EEADRH EQU H'0F63' +OSCCON2 EQU H'0F64' +BAUDCON EQU H'0F65' +BAUDCON1 EQU H'0F65' +BAUDCTL EQU H'0F65' +SSP2CON2 EQU H'0F66' +SSP2CON1 EQU H'0F67' +SSP2STAT EQU H'0F68' +SSP2ADD EQU H'0F69' +SSP2MSK EQU H'0F69' +SSP2BUF EQU H'0F6A' +T4CON EQU H'0F6B' +PR4 EQU H'0F6C' +TMR4 EQU H'0F6D' +CCP7CON EQU H'0F6E' +CCPR7 EQU H'0F6F' +CCPR7L EQU H'0F6F' +CCPR7H EQU H'0F70' +CCP6CON EQU H'0F71' +CCPR6 EQU H'0F72' +CCPR6L EQU H'0F72' +CCPR6H EQU H'0F73' +CCP5CON EQU H'0F74' +CCPR5 EQU H'0F75' +CCPR5L EQU H'0F75' +CCPR5H EQU H'0F76' +CCP4CON EQU H'0F77' +CCPR4 EQU H'0F78' +CCPR4L EQU H'0F78' +CCPR4H EQU H'0F79' +T5GCON EQU H'0F7A' +T5CON EQU H'0F7B' +TMR5 EQU H'0F7C' +TMR5L EQU H'0F7C' +TMR5H EQU H'0F7D' +EECON2 EQU H'0F7E' +EECON1 EQU H'0F7F' +PORTA EQU H'0F80' +PORTB EQU H'0F81' +PORTC EQU H'0F82' +PORTD EQU H'0F83' +PORTE EQU H'0F84' +PORTF EQU H'0F85' +PORTG EQU H'0F86' +PORTH EQU H'0F87' +PORTJ EQU H'0F88' +LATA EQU H'0F89' +LATB EQU H'0F8A' +LATC EQU H'0F8B' +LATD EQU H'0F8C' +LATE EQU H'0F8D' +LATF EQU H'0F8E' +LATG EQU H'0F8F' +LATH EQU H'0F90' +LATJ EQU H'0F91' +TRISA EQU H'0F92' +TRISB EQU H'0F93' +TRISC EQU H'0F94' +TRISD EQU H'0F95' +TRISE EQU H'0F96' +TRISF EQU H'0F97' +TRISG EQU H'0F98' +TRISH EQU H'0F99' +TRISJ EQU H'0F9A' +OSCTUNE EQU H'0F9B' +PSTR1CON EQU H'0F9C' +PIE1 EQU H'0F9D' +PIR1 EQU H'0F9E' +IPR1 EQU H'0F9F' +PIE2 EQU H'0FA0' +PIR2 EQU H'0FA1' +IPR2 EQU H'0FA2' +PIE3 EQU H'0FA3' +PIR3 EQU H'0FA4' +IPR3 EQU H'0FA5' +PIR6 EQU H'0FA6' +PSPCON EQU H'0FA7' +HLVDCON EQU H'0FA8' +IPR6 EQU H'0FA9' +T1GCON EQU H'0FAA' +RCSTA EQU H'0FAB' +RCSTA1 EQU H'0FAB' +TXSTA EQU H'0FAC' +TXSTA1 EQU H'0FAC' +TXREG EQU H'0FAD' +TXREG1 EQU H'0FAD' +RCREG EQU H'0FAE' +RCREG1 EQU H'0FAE' +SPBRG EQU H'0FAF' +SPBRG1 EQU H'0FAF' +T3GCON EQU H'0FB0' +T3CON EQU H'0FB1' +TMR3 EQU H'0FB2' +TMR3L EQU H'0FB2' +TMR3H EQU H'0FB3' +CMSTAT EQU H'0FB4' +CMSTATUS EQU H'0FB4' +CVRCON EQU H'0FB5' +PIE4 EQU H'0FB6' +PIR4 EQU H'0FB7' +IPR4 EQU H'0FB8' +PIE5 EQU H'0FB9' +PIR5 EQU H'0FBA' +CCP1CON EQU H'0FBB' +ECCP1CON EQU H'0FBB' +CCPR1 EQU H'0FBC' +CCPR1L EQU H'0FBC' +CCPR1H EQU H'0FBD' +ECCP1DEL EQU H'0FBE' +PWM1CON EQU H'0FBE' +ECCP1AS EQU H'0FBF' +ADCON2 EQU H'0FC0' +ADCON1 EQU H'0FC1' +ADCON0 EQU H'0FC2' +ADRES EQU H'0FC3' +ADRESL EQU H'0FC3' +ADRESH EQU H'0FC4' +SSP1CON2 EQU H'0FC5' +SSPCON2 EQU H'0FC5' +SSP1CON1 EQU H'0FC6' +SSPCON1 EQU H'0FC6' +SSP1STAT EQU H'0FC7' +SSPSTAT EQU H'0FC7' +SSP1ADD EQU H'0FC8' +SSP1MSK EQU H'0FC8' +SSPADD EQU H'0FC8' +SSP1BUF EQU H'0FC9' +SSPBUF EQU H'0FC9' +T2CON EQU H'0FCA' +PR2 EQU H'0FCB' +TMR2 EQU H'0FCC' +T1CON EQU H'0FCD' +TMR1 EQU H'0FCE' +TMR1L EQU H'0FCE' +TMR1H EQU H'0FCF' +RCON EQU H'0FD0' +WDTCON EQU H'0FD1' +IPR5 EQU H'0FD2' +OSCCON EQU H'0FD3' +SPBRGH1 EQU H'0FD4' +T0CON EQU H'0FD5' +TMR0 EQU H'0FD6' +TMR0L EQU H'0FD6' +TMR0H EQU H'0FD7' +STATUS EQU H'0FD8' +FSR2L EQU H'0FD9' +FSR2H EQU H'0FDA' +PLUSW2 EQU H'0FDB' +PREINC2 EQU H'0FDC' +POSTDEC2 EQU H'0FDD' +POSTINC2 EQU H'0FDE' +INDF2 EQU H'0FDF' +BSR EQU H'0FE0' +FSR1L EQU H'0FE1' +FSR1H EQU H'0FE2' +PLUSW1 EQU H'0FE3' +PREINC1 EQU H'0FE4' +POSTDEC1 EQU H'0FE5' +POSTINC1 EQU H'0FE6' +INDF1 EQU H'0FE7' +WREG EQU H'0FE8' +FSR0L EQU H'0FE9' +FSR0H EQU H'0FEA' +PLUSW0 EQU H'0FEB' +PREINC0 EQU H'0FEC' +POSTDEC0 EQU H'0FED' +POSTINC0 EQU H'0FEE' +INDF0 EQU H'0FEF' +INTCON3 EQU H'0FF0' +INTCON2 EQU H'0FF1' +INTCON EQU H'0FF2' +PROD EQU H'0FF3' +PRODL EQU H'0FF3' +PRODH EQU H'0FF4' +TABLAT EQU H'0FF5' +TBLPTR EQU H'0FF6' +TBLPTRL EQU H'0FF6' +TBLPTRH EQU H'0FF7' +TBLPTRU EQU H'0FF8' +PC EQU H'0FF9' +PCL EQU H'0FF9' +PCLATH EQU H'0FFA' +PCLATU EQU H'0FFB' +STKPTR EQU H'0FFC' +TOS EQU H'0FFD' +TOSL EQU H'0FFD' +TOSH EQU H'0FFE' +TOSU EQU H'0FFF' + +;----- PMD3 Bits ----------------------------------------------------- +TMR12MD EQU H'0000' +CCP4MD EQU H'0001' +CCP5MD EQU H'0002' +CCP6MD EQU H'0003' +CCP7MD EQU H'0004' +CCP8MD EQU H'0005' +CCP9MD EQU H'0006' +CCP10MD EQU H'0007' + + +;----- PMD2 Bits ----------------------------------------------------- +CMP1MD EQU H'0000' +CMP2MD EQU H'0001' +CMP3MD EQU H'0002' +TMR5MD EQU H'0003' +TMR6MD EQU H'0004' +TMR7MD EQU H'0005' +TMR8MD EQU H'0006' +TMR10MD EQU H'0007' + + +;----- PMD1 Bits ----------------------------------------------------- +EMBMD EQU H'0000' +TMR1MD EQU H'0001' +TMR2MD EQU H'0002' +TMR3MD EQU H'0003' +TMR4MD EQU H'0004' +RTCCMD EQU H'0005' +CTMUMD EQU H'0006' +PSPMD EQU H'0007' + + +;----- PMD0 Bits ----------------------------------------------------- +ADCMD EQU H'0000' +SSP1MD EQU H'0001' +SSP2MD EQU H'0002' +UART1MD EQU H'0003' +UART2MD EQU H'0004' +CCP1MD EQU H'0005' +CCP2MD EQU H'0006' +CCP3MD EQU H'0007' + + +;----- PSTR3CON Bits ----------------------------------------------------- +STRA EQU H'0000' +STRB EQU H'0001' +STRC EQU H'0002' +STRD EQU H'0003' +STRSYNC EQU H'0004' + +CMPL0 EQU H'0006' +CMPL1 EQU H'0007' + + +;----- PSTR2CON Bits ----------------------------------------------------- +STRA EQU H'0000' +STRB EQU H'0001' +STRC EQU H'0002' +STRD EQU H'0003' +STRSYNC EQU H'0004' + +CMPL0 EQU H'0006' +CMPL1 EQU H'0007' + + +;----- BAUDCON2 Bits ----------------------------------------------------- +ABDEN EQU H'0000' +WUE EQU H'0001' +BRG16 EQU H'0003' +TXCKP EQU H'0004' +RXDTP EQU H'0005' +RCIDL EQU H'0006' +ABDOVF EQU H'0007' + + +;----- TXSTA2 Bits ----------------------------------------------------- +TX9D EQU H'0000' +TRMT EQU H'0001' +BRGH EQU H'0002' +SENDB EQU H'0003' +SYNC EQU H'0004' +TXEN EQU H'0005' +TX9 EQU H'0006' +CSRC EQU H'0007' + +TX9D2 EQU H'0000' +TRMT2 EQU H'0001' +BRGH2 EQU H'0002' +SENDB2 EQU H'0003' +SYNC2 EQU H'0004' +TXEN2 EQU H'0005' +TX92 EQU H'0006' +CSRC2 EQU H'0007' + + +;----- RCSTA2 Bits ----------------------------------------------------- +RX9D EQU H'0000' +OERR EQU H'0001' +FERR EQU H'0002' +ADDEN EQU H'0003' +CREN EQU H'0004' +SREN EQU H'0005' +RX9 EQU H'0006' +SPEN EQU H'0007' + +RX9D2 EQU H'0000' +OERR2 EQU H'0001' +FERR2 EQU H'0002' +ADDEN2 EQU H'0003' +CREN2 EQU H'0004' +SREN2 EQU H'0005' +RX92 EQU H'0006' +SPEN2 EQU H'0007' + + +;----- ANCON2 Bits ----------------------------------------------------- +ANSEL16 EQU H'0000' +ANSEL17 EQU H'0001' +ANSEL18 EQU H'0002' +ANSEL19 EQU H'0003' +ANSEL20 EQU H'0004' +ANSEL21 EQU H'0005' +ANSEL22 EQU H'0006' +ANSEL23 EQU H'0007' + + +;----- ANCON1 Bits ----------------------------------------------------- +ANSEL8 EQU H'0000' +ANSEL9 EQU H'0001' +ANSEL10 EQU H'0002' +ANSEL11 EQU H'0003' +ANSEL12 EQU H'0004' +ANSEL13 EQU H'0005' +ANSEL14 EQU H'0006' +ANSEL15 EQU H'0007' + + +;----- ANCON0 Bits ----------------------------------------------------- +ANSEL0 EQU H'0000' +ANSEL1 EQU H'0001' +ANSEL2 EQU H'0002' +ANSEL3 EQU H'0003' +ANSEL4 EQU H'0004' +ANSEL5 EQU H'0005' +ANSEL6 EQU H'0006' +ANSEL7 EQU H'0007' + + +;----- MEMCON Bits ----------------------------------------------------- +EBDIS EQU H'0007' + +WM0 EQU H'0000' +WM1 EQU H'0001' +WAIT0 EQU H'0004' +WAIT1 EQU H'0005' + + +;----- ODCON3 Bits ----------------------------------------------------- +CTMUDS EQU H'0000' +U1OD EQU H'0006' +U2OD EQU H'0007' + + +;----- ODCON2 Bits ----------------------------------------------------- +CCP3OD EQU H'0000' +CCP4OD EQU H'0001' +CCP5OD EQU H'0002' +CCP6OD EQU H'0003' +CCP7OD EQU H'0004' +CCP8OD EQU H'0005' +CCP9OD EQU H'0006' +CCP10OD EQU H'0007' + + +;----- ODCON1 Bits ----------------------------------------------------- +SPI2OD EQU H'0000' +CCP1OD EQU H'0005' +CCP2OD EQU H'0006' +SPI1OD EQU H'0007' + + +;----- REFOCON Bits ----------------------------------------------------- +ROSEL EQU H'0004' +ROSSLP EQU H'0005' +ROON EQU H'0007' + +RODIV0 EQU H'0000' +RODIV1 EQU H'0001' +RODIV2 EQU H'0002' +RODIV3 EQU H'0003' + + +;----- CCPTMRS2 Bits ----------------------------------------------------- +C9TSEL0 EQU H'0002' +C10TSEL0 EQU H'0004' + +C8TSEL0 EQU H'0000' +C8TSEL1 EQU H'0001' + + +;----- CCPTMRS1 Bits ----------------------------------------------------- +C5TSEL0 EQU H'0002' +C6TSEL0 EQU H'0004' + +C4TSEL0 EQU H'0000' +C4TSEL1 EQU H'0001' +C7TSEL0 EQU H'0006' +C7TSEL1 EQU H'0007' + + +;----- CCPTMRS0 Bits ----------------------------------------------------- +C1TSEL0 EQU H'0000' +C1TSEL1 EQU H'0001' +C1TSEL2 EQU H'0002' +C2TSEL0 EQU H'0003' +C2TSEL1 EQU H'0004' +C2TSEL2 EQU H'0005' +C3TSEL0 EQU H'0006' +C3TSEL1 EQU H'0007' + + +;----- CM3CON Bits ----------------------------------------------------- +CREF EQU H'0002' +CPOL EQU H'0005' +COE EQU H'0006' +CON EQU H'0007' + +CCH0 EQU H'0000' +CCH1 EQU H'0001' +EVPOL0 EQU H'0003' +EVPOL1 EQU H'0004' + + +;----- CM3CON1 Bits ----------------------------------------------------- +CREF EQU H'0002' +CPOL EQU H'0005' +COE EQU H'0006' +CON EQU H'0007' + +CCH0 EQU H'0000' +CCH1 EQU H'0001' +EVPOL0 EQU H'0003' +EVPOL1 EQU H'0004' + + +;----- CM2CON Bits ----------------------------------------------------- +CREF EQU H'0002' +CPOL EQU H'0005' +COE EQU H'0006' +CON EQU H'0007' + +CCH0 EQU H'0000' +CCH1 EQU H'0001' +EVPOL0 EQU H'0003' +EVPOL1 EQU H'0004' + + +;----- CM2CON1 Bits ----------------------------------------------------- +CREF EQU H'0002' +CPOL EQU H'0005' +COE EQU H'0006' +CON EQU H'0007' + +CCH0 EQU H'0000' +CCH1 EQU H'0001' +EVPOL0 EQU H'0003' +EVPOL1 EQU H'0004' + + +;----- T12CON Bits ----------------------------------------------------- +TMR12ON EQU H'0002' + +T12CKPS0 EQU H'0000' +T12CKPS1 EQU H'0001' +T12OUTPS0 EQU H'0003' +T12OUTPS1 EQU H'0004' +T12OUTPS2 EQU H'0005' +T12OUTPS3 EQU H'0006' + + +;----- T10CON Bits ----------------------------------------------------- +TMR10ON EQU H'0002' + +T10CKPS0 EQU H'0000' +T10CKPS1 EQU H'0001' +T10OUTPS0 EQU H'0003' +T10OUTPS1 EQU H'0004' +T10OUTPS2 EQU H'0005' +T10OUTPS3 EQU H'0006' + + +;----- T8CON Bits ----------------------------------------------------- +TMR8ON EQU H'0002' + +T8CKPS0 EQU H'0000' +T8CKPS1 EQU H'0001' +T8OUTPS0 EQU H'0003' +T8OUTPS1 EQU H'0004' +T8OUTPS2 EQU H'0005' +T8OUTPS3 EQU H'0006' + + +;----- T6CON Bits ----------------------------------------------------- +TMR6ON EQU H'0002' + +T6CKPS0 EQU H'0000' +T6CKPS1 EQU H'0001' +T6OUTPS0 EQU H'0003' +T6OUTPS1 EQU H'0004' +T6OUTPS2 EQU H'0005' +T6OUTPS3 EQU H'0006' + + +;----- T7GCON Bits ----------------------------------------------------- +T7GVAL EQU H'0002' +T7GGO_NOT_T7DONE EQU H'0003' +T7GSPM EQU H'0004' +T7GTM EQU H'0005' +T7GPOL EQU H'0006' +TMR7GE EQU H'0007' + +T7GSS0 EQU H'0000' +T7GSS1 EQU H'0001' +T7GGO EQU H'0003' + +NOT_T7DONE EQU H'0003' + + +;----- T7CON Bits ----------------------------------------------------- +TMR7ON EQU H'0000' +RD16 EQU H'0001' +NOT_T7SYNC EQU H'0002' +SOSCEN EQU H'0003' + +T7CKPS0 EQU H'0004' +T7CKPS1 EQU H'0005' +TMR7CS0 EQU H'0006' +TMR7CS1 EQU H'0007' + + +;----- CCP10CON Bits ----------------------------------------------------- +CCP10M0 EQU H'0000' +CCP10M1 EQU H'0001' +CCP10M2 EQU H'0002' +CCP10M3 EQU H'0003' +DC10B0 EQU H'0004' +DC10B1 EQU H'0005' + +CCP10Y EQU H'0004' +CCP10X EQU H'0005' + + +;----- CCP9CON Bits ----------------------------------------------------- +CCP9M0 EQU H'0000' +CCP9M1 EQU H'0001' +CCP9M2 EQU H'0002' +CCP9M3 EQU H'0003' +DC9B0 EQU H'0004' +DC9B1 EQU H'0005' + +CCP9Y EQU H'0004' +CCP9X EQU H'0005' + + +;----- CCP8CON Bits ----------------------------------------------------- +CCP8M0 EQU H'0000' +CCP8M1 EQU H'0001' +CCP8M2 EQU H'0002' +CCP8M3 EQU H'0003' +DC8B0 EQU H'0004' +DC8B1 EQU H'0005' + +CCP8Y EQU H'0004' +CCP8X EQU H'0005' + + +;----- CCP3CON Bits ----------------------------------------------------- +CCP3M0 EQU H'0000' +CCP3M1 EQU H'0001' +CCP3M2 EQU H'0002' +CCP3M3 EQU H'0003' +DC3B0 EQU H'0004' +DC3B1 EQU H'0005' +P3M0 EQU H'0006' +P3M1 EQU H'0007' + + +;----- ECCP3DEL Bits ----------------------------------------------------- +P3RSEN EQU H'0007' + +P3DC0 EQU H'0000' +P3DC1 EQU H'0001' +P3DC2 EQU H'0002' +P3DC3 EQU H'0003' +P3DC4 EQU H'0004' +P3DC5 EQU H'0005' +P3DC6 EQU H'0006' + + +;----- ECCP3AS Bits ----------------------------------------------------- +ECCP3ASE EQU H'0007' + +PSS3BD0 EQU H'0000' +PSS3BD1 EQU H'0001' +PSS3AC0 EQU H'0002' +PSS3AC1 EQU H'0003' +ECCP3AS0 EQU H'0004' +ECCP3AS1 EQU H'0005' +ECCP3AS2 EQU H'0006' + + +;----- CCP2CON Bits ----------------------------------------------------- +CCP2M0 EQU H'0000' +CCP2M1 EQU H'0001' +CCP2M2 EQU H'0002' +CCP2M3 EQU H'0003' +DC2B0 EQU H'0004' +DC2B1 EQU H'0005' +P2M0 EQU H'0006' +P2M1 EQU H'0007' + +CCP2Y EQU H'0004' +CCP2X EQU H'0005' + + +;----- ECCP2CON Bits ----------------------------------------------------- +CCP2M0 EQU H'0000' +CCP2M1 EQU H'0001' +CCP2M2 EQU H'0002' +CCP2M3 EQU H'0003' +DC2B0 EQU H'0004' +DC2B1 EQU H'0005' +P2M0 EQU H'0006' +P2M1 EQU H'0007' + +CCP2Y EQU H'0004' +CCP2X EQU H'0005' + + +;----- ECCP2DEL Bits ----------------------------------------------------- +P2RSEN EQU H'0007' + +P2DC0 EQU H'0000' +P2DC1 EQU H'0001' +P2DC2 EQU H'0002' +P2DC3 EQU H'0003' +P2DC4 EQU H'0004' +P2DC5 EQU H'0005' +P2DC6 EQU H'0006' + + +;----- PWM2CON Bits ----------------------------------------------------- +P2RSEN EQU H'0007' + +P2DC0 EQU H'0000' +P2DC1 EQU H'0001' +P2DC2 EQU H'0002' +P2DC3 EQU H'0003' +P2DC4 EQU H'0004' +P2DC5 EQU H'0005' +P2DC6 EQU H'0006' + + +;----- ECCP2AS Bits ----------------------------------------------------- +ECCP2ASE EQU H'0007' + +PSS2BD0 EQU H'0000' +PSS2BD1 EQU H'0001' +PSS2AC0 EQU H'0002' +PSS2AC1 EQU H'0003' +ECCP2AS0 EQU H'0004' +ECCP2AS1 EQU H'0005' +ECCP2AS2 EQU H'0006' + + +;----- PADCFG1 Bits ----------------------------------------------------- +RJPU EQU H'0005' +REPU EQU H'0006' +RDPU EQU H'0007' + +RTSECSEL0 EQU H'0001' +RTSECSEL1 EQU H'0002' + + +;----- CM1CON Bits ----------------------------------------------------- +CREF EQU H'0002' +CPOL EQU H'0005' +COE EQU H'0006' +CON EQU H'0007' + +CCH0 EQU H'0000' +CCH1 EQU H'0001' +EVPOL0 EQU H'0003' +EVPOL1 EQU H'0004' + + +;----- CM1CON1 Bits ----------------------------------------------------- +CREF EQU H'0002' +CPOL EQU H'0005' +COE EQU H'0006' +CON EQU H'0007' + +CCH0 EQU H'0000' +CCH1 EQU H'0001' +EVPOL0 EQU H'0003' +EVPOL1 EQU H'0004' + + +;----- CTMUICON Bits ----------------------------------------------------- +IRNG0 EQU H'0000' +IRNG1 EQU H'0001' +ITRIM0 EQU H'0002' +ITRIM1 EQU H'0003' +ITRIM2 EQU H'0004' +ITRIM3 EQU H'0005' +ITRIM4 EQU H'0006' +ITRIM5 EQU H'0007' + + +;----- CTMUCONL Bits ----------------------------------------------------- +EDG1STAT EQU H'0000' +EDG2STAT EQU H'0001' +EDG1POL EQU H'0004' +EDG2POL EQU H'0007' + +EDG1SEL0 EQU H'0002' +EDG1SEL1 EQU H'0003' +EDG2SEL0 EQU H'0005' +EDG2SEL1 EQU H'0006' + + +;----- CTMUCONH Bits ----------------------------------------------------- +CTTRIG EQU H'0000' +IDISSEN EQU H'0001' +EDGSEQEN EQU H'0002' +EDGEN EQU H'0003' +TGEN EQU H'0004' +CTMUSIDL EQU H'0005' +CTMUEN EQU H'0007' + + +;----- ALRMRPT Bits ----------------------------------------------------- +ARPT0 EQU H'0000' +ARPT1 EQU H'0001' +ARPT2 EQU H'0002' +ARPT3 EQU H'0003' +ARPT4 EQU H'0004' +ARPT5 EQU H'0005' +ARPT6 EQU H'0006' +ARPT7 EQU H'0007' + + +;----- ALRMCFG Bits ----------------------------------------------------- +CHIME EQU H'0006' +ALRMEN EQU H'0007' + +ALRMPTR0 EQU H'0000' +ALRMPTR1 EQU H'0001' +AMASK0 EQU H'0002' +AMASK1 EQU H'0003' +AMASK2 EQU H'0004' +AMASK3 EQU H'0005' + + +;----- RTCCAL Bits ----------------------------------------------------- +CAL0 EQU H'0000' +CAL1 EQU H'0001' +CAL2 EQU H'0002' +CAL3 EQU H'0003' +CAL4 EQU H'0004' +CAL5 EQU H'0005' +CAL6 EQU H'0006' +CAL7 EQU H'0007' + + +;----- RTCCFG Bits ----------------------------------------------------- +RTCOE EQU H'0002' +HALFSEC EQU H'0003' +RTCSYNC EQU H'0004' +RTCWREN EQU H'0005' +RTCEN EQU H'0007' + +RTCPTR0 EQU H'0000' +RTCPTR1 EQU H'0001' + + +;----- PIE6 Bits ----------------------------------------------------- +CMP1IE EQU H'0000' +CMP2IE EQU H'0001' +CMP3IE EQU H'0002' +EEIE EQU H'0004' + + +;----- OSCCON2 Bits ----------------------------------------------------- +MFIOSEL EQU H'0000' +MFIOFS EQU H'0001' +SOSCGO EQU H'0003' +SOSCRUN EQU H'0006' + + +;----- BAUDCON Bits ----------------------------------------------------- +ABDEN EQU H'0000' +WUE EQU H'0001' +BRG16 EQU H'0003' +TXCKP EQU H'0004' +RXDTP EQU H'0005' +RCIDL EQU H'0006' +ABDOVF EQU H'0007' + + +;----- BAUDCON1 Bits ----------------------------------------------------- +ABDEN EQU H'0000' +WUE EQU H'0001' +BRG16 EQU H'0003' +TXCKP EQU H'0004' +RXDTP EQU H'0005' +RCIDL EQU H'0006' +ABDOVF EQU H'0007' + + +;----- BAUDCTL Bits ----------------------------------------------------- +ABDEN EQU H'0000' +WUE EQU H'0001' +BRG16 EQU H'0003' +TXCKP EQU H'0004' +RXDTP EQU H'0005' +RCIDL EQU H'0006' +ABDOVF EQU H'0007' + + +;----- SSP2CON2 Bits ----------------------------------------------------- +SEN EQU H'0000' +RSEN EQU H'0001' +PEN EQU H'0002' +RCEN EQU H'0003' +ACKEN EQU H'0004' +ACKDT EQU H'0005' +ACKSTAT EQU H'0006' +GCEN EQU H'0007' + +ADMSK1 EQU H'0001' +ADMSK2 EQU H'0002' +ADMSK3 EQU H'0003' +ADMSK4 EQU H'0004' +ADMSK5 EQU H'0005' + + +;----- SSP2CON1 Bits ----------------------------------------------------- +CKP EQU H'0004' +SSPEN EQU H'0005' +SSPOV EQU H'0006' +WCOL EQU H'0007' + +SSPM0 EQU H'0000' +SSPM1 EQU H'0001' +SSPM2 EQU H'0002' +SSPM3 EQU H'0003' + + +;----- SSP2STAT Bits ----------------------------------------------------- +BF EQU H'0000' +UA EQU H'0001' +R_NOT_W EQU H'0002' +S EQU H'0003' +P EQU H'0004' +D_NOT_A EQU H'0005' +CKE EQU H'0006' +SMP EQU H'0007' + +R EQU H'0002' +D EQU H'0005' + +R_W EQU H'0002' +D_A EQU H'0005' + +NOT_W EQU H'0002' +NOT_A EQU H'0005' + +NOT_WRITE EQU H'0002' +NOT_ADDRESS EQU H'0005' + +READ_WRITE EQU H'0002' +DATA_ADDRESS EQU H'0005' + +I2C_READ EQU H'0002' +I2C_START EQU H'0003' +I2C_STOP EQU H'0004' +I2C_DAT EQU H'0005' + + +;----- SSP2MSK Bits ----------------------------------------------------- +MSK0 EQU H'0000' +MSK1 EQU H'0001' +MSK2 EQU H'0002' +MSK3 EQU H'0003' +MSK4 EQU H'0004' +MSK5 EQU H'0005' +MSK6 EQU H'0006' +MSK7 EQU H'0007' + + +;----- T4CON Bits ----------------------------------------------------- +TMR4ON EQU H'0002' + +T4CKPS0 EQU H'0000' +T4CKPS1 EQU H'0001' +T4OUTPS0 EQU H'0003' +T4OUTPS1 EQU H'0004' +T4OUTPS2 EQU H'0005' +T4OUTPS3 EQU H'0006' + + +;----- CCP7CON Bits ----------------------------------------------------- +CCP7M0 EQU H'0000' +CCP7M1 EQU H'0001' +CCP7M2 EQU H'0002' +CCP7M3 EQU H'0003' +DC7B0 EQU H'0004' +DC7B1 EQU H'0005' + +CCP7Y EQU H'0004' +CCP7X EQU H'0005' + + +;----- CCP6CON Bits ----------------------------------------------------- +CCP6M0 EQU H'0000' +CCP6M1 EQU H'0001' +CCP6M2 EQU H'0002' +CCP6M3 EQU H'0003' +DC6B0 EQU H'0004' +DC6B1 EQU H'0005' + +CCP6Y EQU H'0004' +CCP6X EQU H'0005' + + +;----- CCP5CON Bits ----------------------------------------------------- +CCP5M0 EQU H'0000' +CCP5M1 EQU H'0001' +CCP5M2 EQU H'0002' +CCP5M3 EQU H'0003' +DC5B0 EQU H'0004' +DC5B1 EQU H'0005' + +CCP5Y EQU H'0004' +CCP5X EQU H'0005' + + +;----- CCP4CON Bits ----------------------------------------------------- +CCP4M0 EQU H'0000' +CCP4M1 EQU H'0001' +CCP4M2 EQU H'0002' +CCP4M3 EQU H'0003' +DC4B0 EQU H'0004' +DC4B1 EQU H'0005' + +CCP4Y EQU H'0004' +CCP4X EQU H'0005' + + +;----- T5GCON Bits ----------------------------------------------------- +T5GVAL EQU H'0002' +T5GGO_NOT_T5DONE EQU H'0003' +T5GSPM EQU H'0004' +T5GTM EQU H'0005' +T5GPOL EQU H'0006' +TMR5GE EQU H'0007' + +T5GSS0 EQU H'0000' +T5GSS1 EQU H'0001' +T5GGO EQU H'0003' + +NOT_T5DONE EQU H'0003' + + +;----- T5CON Bits ----------------------------------------------------- +TMR5ON EQU H'0000' +RD16 EQU H'0001' +NOT_T5SYNC EQU H'0002' +SOSCEN EQU H'0003' + +T5CKPS0 EQU H'0004' +T5CKPS1 EQU H'0005' +TMR5CS0 EQU H'0006' +TMR5CS1 EQU H'0007' + + +;----- EECON1 Bits ----------------------------------------------------- +RD EQU H'0000' +WR EQU H'0001' +WREN EQU H'0002' +WRERR EQU H'0003' +FREE EQU H'0004' +CFGS EQU H'0006' +EEPGD EQU H'0007' + + +;----- PORTA Bits ----------------------------------------------------- +RA0 EQU H'0000' +RA1 EQU H'0001' +RA2 EQU H'0002' +RA3 EQU H'0003' +RA4 EQU H'0004' +RA5 EQU H'0005' +RA6 EQU H'0006' +RA7 EQU H'0007' + +AN0 EQU H'0000' +AN1 EQU H'0001' +AN2 EQU H'0002' +AN3 EQU H'0003' +AN4 EQU H'0005' +OSC2 EQU H'0006' +OSC1 EQU H'0007' + +ULPWU EQU H'0000' +VREF_MINUS EQU H'0002' +VREF_PLUS EQU H'0003' +T0CKI EQU H'0004' +T1CKI EQU H'0005' +CLKO EQU H'0006' +CLKI EQU H'0007' + +T3G EQU H'0005' + +HLVDIN EQU H'0005' + + +;----- PORTB Bits ----------------------------------------------------- +RB0 EQU H'0000' +RB1 EQU H'0001' +RB2 EQU H'0002' +RB3 EQU H'0003' +RB4 EQU H'0004' +RB5 EQU H'0005' +RB6 EQU H'0006' +RB7 EQU H'0007' + +INT0 EQU H'0000' +INT1 EQU H'0001' +INT2 EQU H'0002' +INT3 EQU H'0003' +KBI0 EQU H'0004' +KBI1 EQU H'0005' +KBI2 EQU H'0006' +KBI3 EQU H'0007' + +FLT0 EQU H'0000' +CTED1 EQU H'0002' +CTED2 EQU H'0003' +T3CKI EQU H'0005' + +CCP2_P2A EQU H'0003' +T1G EQU H'0005' + +PGM EQU H'0005' +PGC EQU H'0006' +PGD EQU H'0007' + + +;----- PORTC Bits ----------------------------------------------------- +RC0 EQU H'0000' +RC1 EQU H'0001' +RC2 EQU H'0002' +RC3 EQU H'0003' +RC4 EQU H'0004' +RC5 EQU H'0005' +RC6 EQU H'0006' +RC7 EQU H'0007' + +SOSCO EQU H'0000' +SOSCI EQU H'0001' +SCK1 EQU H'0003' +SDI1 EQU H'0004' +SDO1 EQU H'0005' +TX1 EQU H'0006' +RX1 EQU H'0007' + +SCKLI EQU H'0000' +CCP2_PORTC EQU H'0001' +CCP1 EQU H'0002' +SCL1 EQU H'0003' +SDA1 EQU H'0004' +CK1 EQU H'0006' +DT1 EQU H'0007' + +P2A_PORTC EQU H'0001' +P1A EQU H'0002' + + +;----- PORTD Bits ----------------------------------------------------- +RD0 EQU H'0000' +RD1 EQU H'0001' +RD2 EQU H'0002' +RD3 EQU H'0003' +RD4 EQU H'0004' +RD5 EQU H'0005' +RD6 EQU H'0006' +RD7 EQU H'0007' + +AD0 EQU H'0000' +AD1 EQU H'0001' +AD2 EQU H'0002' +AD3 EQU H'0003' +AD4 EQU H'0004' +AD5 EQU H'0005' +AD6 EQU H'0006' +AD7 EQU H'0007' + +PSP0 EQU H'0000' +PSP1 EQU H'0001' +PSP2 EQU H'0002' +PSP3 EQU H'0003' +PSP4 EQU H'0004' +PSP5 EQU H'0005' +PSP6 EQU H'0006' +PSP7 EQU H'0007' + +CTPLS EQU H'0000' +T5CKI EQU H'0001' +SDO2 EQU H'0004' +SDI2 EQU H'0005' +SCK2 EQU H'0006' +NOT_SS2 EQU H'0007' + +T7G EQU H'0001' +SDA2 EQU H'0005' +SCL2 EQU H'0006' + + +;----- PORTE Bits ----------------------------------------------------- +RE0 EQU H'0000' +RE1 EQU H'0001' +RE2 EQU H'0002' +RE3 EQU H'0003' +RE4 EQU H'0004' +RE5 EQU H'0005' +RE6 EQU H'0006' +RE7 EQU H'0007' + +AD8 EQU H'0000' +AD9 EQU H'0001' +AD10 EQU H'0002' +AD11 EQU H'0003' +AD12 EQU H'0004' +AD13 EQU H'0005' +AD14 EQU H'0006' +AD15 EQU H'0007' + +P2D EQU H'0000' +P2C EQU H'0001' +P2B EQU H'0002' +P3C EQU H'0003' +P3B EQU H'0004' +P1C EQU H'0005' +P1B EQU H'0006' +P2A_PORTE EQU H'0007' + +CCP10 EQU H'0002' +CCP9_PORTE EQU H'0003' +CCP8_PORTE EQU H'0004' +CCP7_PORTE EQU H'0005' +CCP6_PORTE EQU H'0006' +CCP2_PORTE EQU H'0007' + +NOT_RD EQU H'0000' +NOT_WR EQU H'0001' +NOT_CS EQU H'0002' +REFO EQU H'0003' + + +;----- PORTF Bits ----------------------------------------------------- +RF1 EQU H'0001' +RF2 EQU H'0002' +RF3 EQU H'0003' +RF4 EQU H'0004' +RF5 EQU H'0005' +RF6 EQU H'0006' +RF7 EQU H'0007' + +AN6 EQU H'0001' +AN7 EQU H'0002' +AN8 EQU H'0003' +AN9 EQU H'0004' +AN10 EQU H'0005' +AN11 EQU H'0006' +AN5 EQU H'0007' + +C2OUT EQU H'0001' +C1OUT EQU H'0002' +C2INB EQU H'0003' +C2INA EQU H'0004' +C1INB EQU H'0005' +C1INA EQU H'0006' +SS1 EQU H'0007' + +CTDIN EQU H'0001' +CTMUI EQU H'0003' +CVREF EQU H'0005' + + +;----- PORTG Bits ----------------------------------------------------- +RG0 EQU H'0000' +RG1 EQU H'0001' +RG2 EQU H'0002' +RG3 EQU H'0003' +RG4 EQU H'0004' +RG5 EQU H'0005' + +CCP3 EQU H'0000' +C3OUT EQU H'0001' +C3INA EQU H'0002' +C3INB EQU H'0003' +C3INC EQU H'0004' + +PA3 EQU H'0000' +TX2 EQU H'0001' +RX2 EQU H'0002' +PD3 EQU H'0003' +PD1 EQU H'0004' + +AN19 EQU H'0001' +AN18 EQU H'0002' +AN17 EQU H'0003' +AN16 EQU H'0004' + +CK2 EQU H'0001' +DT2 EQU H'0002' +CCP4 EQU H'0003' +CCP5 EQU H'0004' + +T7CKI EQU H'0004' + +T5G EQU H'0004' + +RTCC EQU H'0004' + + +;----- PORTH Bits ----------------------------------------------------- +RH0 EQU H'0000' +RH1 EQU H'0001' +RH2 EQU H'0002' +RH3 EQU H'0003' +RH4 EQU H'0004' +RH5 EQU H'0005' +RH6 EQU H'0006' +RH7 EQU H'0007' + +AN23 EQU H'0000' +AN22 EQU H'0001' +AN21 EQU H'0002' +AN20 EQU H'0003' +AN12 EQU H'0004' +AN13 EQU H'0005' +AN14 EQU H'0006' +AN15 EQU H'0007' + +A16 EQU H'0000' +A17 EQU H'0001' +A18 EQU H'0002' +A19 EQU H'0003' +CCP9_PORTH EQU H'0004' +CCP8_PORTH EQU H'0005' +CCP7_PORTH EQU H'0006' +CCP6_PORTH EQU H'0007' + +PC3 EQU H'0004' +PB3 EQU H'0005' +PC1 EQU H'0006' +PB1 EQU H'0007' + +C2INC EQU H'0004' +C2IND EQU H'0005' +C1INC EQU H'0006' + + +;----- PORTJ Bits ----------------------------------------------------- +RJ0 EQU H'0000' +RJ1 EQU H'0001' +RJ2 EQU H'0002' +RJ3 EQU H'0003' +RJ4 EQU H'0004' +RJ5 EQU H'0005' +RJ6 EQU H'0006' +RJ7 EQU H'0007' + +ALE EQU H'0000' +OE EQU H'0001' +WRL EQU H'0002' +WRH EQU H'0003' +BA0 EQU H'0004' +CE EQU H'0005' +LB EQU H'0006' +UB EQU H'0007' + + +;----- LATA Bits ----------------------------------------------------- +LATA0 EQU H'0000' +LATA1 EQU H'0001' +LATA2 EQU H'0002' +LATA3 EQU H'0003' +LATA4 EQU H'0004' +LATA5 EQU H'0005' +LATA6 EQU H'0006' +LATA7 EQU H'0007' + + +;----- LATB Bits ----------------------------------------------------- +LATB0 EQU H'0000' +LATB1 EQU H'0001' +LATB2 EQU H'0002' +LATB3 EQU H'0003' +LATB4 EQU H'0004' +LATB5 EQU H'0005' +LATB6 EQU H'0006' +LATB7 EQU H'0007' + + +;----- LATC Bits ----------------------------------------------------- +LATC0 EQU H'0000' +LATC1 EQU H'0001' +LATC2 EQU H'0002' +LATC3 EQU H'0003' +LATC4 EQU H'0004' +LATC5 EQU H'0005' +LATC6 EQU H'0006' +LATC7 EQU H'0007' + + +;----- LATD Bits ----------------------------------------------------- +LATD0 EQU H'0000' +LATD1 EQU H'0001' +LATD2 EQU H'0002' +LATD3 EQU H'0003' +LATD4 EQU H'0004' +LATD5 EQU H'0005' +LATD6 EQU H'0006' +LATD7 EQU H'0007' + + +;----- LATE Bits ----------------------------------------------------- +LATE0 EQU H'0000' +LATE1 EQU H'0001' +LATE2 EQU H'0002' +LATE3 EQU H'0003' +LATE4 EQU H'0004' +LATE5 EQU H'0005' +LATE6 EQU H'0006' +LATE7 EQU H'0007' + + +;----- LATF Bits ----------------------------------------------------- +LATF1 EQU H'0001' +LATF2 EQU H'0002' +LATF3 EQU H'0003' +LATF4 EQU H'0004' +LATF5 EQU H'0005' +LATF6 EQU H'0006' +LATF7 EQU H'0007' + + +;----- LATG Bits ----------------------------------------------------- +LATG0 EQU H'0000' +LATG1 EQU H'0001' +LATG2 EQU H'0002' +LATG3 EQU H'0003' +LATG4 EQU H'0004' + + +;----- LATH Bits ----------------------------------------------------- +LATH0 EQU H'0000' +LATH1 EQU H'0001' +LATH2 EQU H'0002' +LATH3 EQU H'0003' +LATH4 EQU H'0004' +LATH5 EQU H'0005' +LATH6 EQU H'0006' +LATH7 EQU H'0007' + + +;----- LATJ Bits ----------------------------------------------------- +LATJ0 EQU H'0000' +LATJ1 EQU H'0001' +LATJ2 EQU H'0002' +LATJ3 EQU H'0003' +LATJ4 EQU H'0004' +LATJ5 EQU H'0005' +LATJ6 EQU H'0006' +LATJ7 EQU H'0007' + + +;----- TRISA Bits ----------------------------------------------------- +TRISA0 EQU H'0000' +TRISA1 EQU H'0001' +TRISA2 EQU H'0002' +TRISA3 EQU H'0003' +TRISA4 EQU H'0004' +TRISA5 EQU H'0005' +TRISA6 EQU H'0006' +TRISA7 EQU H'0007' + + +;----- TRISB Bits ----------------------------------------------------- +TRISB0 EQU H'0000' +TRISB1 EQU H'0001' +TRISB2 EQU H'0002' +TRISB3 EQU H'0003' +TRISB4 EQU H'0004' +TRISB5 EQU H'0005' +TRISB6 EQU H'0006' +TRISB7 EQU H'0007' + + +;----- TRISC Bits ----------------------------------------------------- +TRISC0 EQU H'0000' +TRISC1 EQU H'0001' +TRISC2 EQU H'0002' +TRISC3 EQU H'0003' +TRISC4 EQU H'0004' +TRISC5 EQU H'0005' +TRISC6 EQU H'0006' +TRISC7 EQU H'0007' + + +;----- TRISD Bits ----------------------------------------------------- +TRISD0 EQU H'0000' +TRISD1 EQU H'0001' +TRISD2 EQU H'0002' +TRISD3 EQU H'0003' +TRISD4 EQU H'0004' +TRISD5 EQU H'0005' +TRISD6 EQU H'0006' +TRISD7 EQU H'0007' + + +;----- TRISE Bits ----------------------------------------------------- +TRISE0 EQU H'0000' +TRISE1 EQU H'0001' +TRISE2 EQU H'0002' +TRISE3 EQU H'0003' +TRISE4 EQU H'0004' +TRISE5 EQU H'0005' +TRISE6 EQU H'0006' +TRISE7 EQU H'0007' + + +;----- TRISF Bits ----------------------------------------------------- +TRISF1 EQU H'0001' +TRISF2 EQU H'0002' +TRISF3 EQU H'0003' +TRISF4 EQU H'0004' +TRISF5 EQU H'0005' +TRISF6 EQU H'0006' +TRISF7 EQU H'0007' + + +;----- TRISG Bits ----------------------------------------------------- +TRISG0 EQU H'0000' +TRISG1 EQU H'0001' +TRISG2 EQU H'0002' +TRISG3 EQU H'0003' +TRISG4 EQU H'0004' + + +;----- TRISH Bits ----------------------------------------------------- +TRISH0 EQU H'0000' +TRISH1 EQU H'0001' +TRISH2 EQU H'0002' +TRISH3 EQU H'0003' +TRISH4 EQU H'0004' +TRISH5 EQU H'0005' +TRISH6 EQU H'0006' +TRISH7 EQU H'0007' + + +;----- TRISJ Bits ----------------------------------------------------- +TRISJ0 EQU H'0000' +TRISJ1 EQU H'0001' +TRISJ2 EQU H'0002' +TRISJ3 EQU H'0003' +TRISJ4 EQU H'0004' +TRISJ5 EQU H'0005' +TRISJ6 EQU H'0006' +TRISJ7 EQU H'0007' + + +;----- OSCTUNE Bits ----------------------------------------------------- +PLLEN EQU H'0006' +INTSRC EQU H'0007' + +TUN0 EQU H'0000' +TUN1 EQU H'0001' +TUN2 EQU H'0002' +TUN3 EQU H'0003' +TUN4 EQU H'0004' +TUN5 EQU H'0005' + + +;----- PSTR1CON Bits ----------------------------------------------------- +STRA EQU H'0000' +STRB EQU H'0001' +STRC EQU H'0002' +STRD EQU H'0003' +STRSYNC EQU H'0004' + +CMPL0 EQU H'0006' +CMPL1 EQU H'0007' + + +;----- PIE1 Bits ----------------------------------------------------- +TMR1IE EQU H'0000' +TMR2IE EQU H'0001' +TMR1GIE EQU H'0002' +SSP1IE EQU H'0003' +TX1IE EQU H'0004' +RC1IE EQU H'0005' +ADIE EQU H'0006' +PSPIE EQU H'0007' + +SSPIE EQU H'0003' +TXIE EQU H'0004' +RCIE EQU H'0005' + + +;----- PIR1 Bits ----------------------------------------------------- +TMR1IF EQU H'0000' +TMR2IF EQU H'0001' +TMR1GIF EQU H'0002' +SSP1IF EQU H'0003' +TX1IF EQU H'0004' +RC1IF EQU H'0005' +ADIF EQU H'0006' +PSPIF EQU H'0007' + +SSPIF EQU H'0003' +TXIF EQU H'0004' +RCIF EQU H'0005' + + +;----- IPR1 Bits ----------------------------------------------------- +TMR1IP EQU H'0000' +TMR2IP EQU H'0001' +TMR1GIP EQU H'0002' +SSP1IP EQU H'0003' +TX1IP EQU H'0004' +RC1IP EQU H'0005' +ADIP EQU H'0006' +PSPIP EQU H'0007' + +SSPIP EQU H'0003' +TXIP EQU H'0004' +RCIP EQU H'0005' + + +;----- PIE2 Bits ----------------------------------------------------- +TMR3GIE EQU H'0000' +TMR3IE EQU H'0001' +HLVDIE EQU H'0002' +BCL1IE EQU H'0003' +BCL2IE EQU H'0004' +SSP2IE EQU H'0005' +OSCFIE EQU H'0007' + +LVDIE EQU H'0002' +BCLIE EQU H'0003' + + +;----- PIR2 Bits ----------------------------------------------------- +TMR3GIF EQU H'0000' +TMR3IF EQU H'0001' +HLVDIF EQU H'0002' +BCL1IF EQU H'0003' +BCL2IF EQU H'0004' +SSP2IF EQU H'0005' +OSCFIF EQU H'0007' + +LVDIF EQU H'0002' +BCLIF EQU H'0003' + + +;----- IPR2 Bits ----------------------------------------------------- +TMR3GIP EQU H'0000' +TMR3IP EQU H'0001' +HLVDIP EQU H'0002' +BCL1IP EQU H'0003' +BCL2IP EQU H'0004' +SSP2IP EQU H'0005' +OSCFIP EQU H'0007' + +LVDIP EQU H'0002' +BCLIP EQU H'0003' + + +;----- PIE3 Bits ----------------------------------------------------- +RTCCIE EQU H'0000' +CCP1IE EQU H'0001' +CCP2IE EQU H'0002' +CTMUIE EQU H'0003' +TX2IE EQU H'0004' +RC2IE EQU H'0005' +TMR5GIE EQU H'0007' + + +;----- PIR3 Bits ----------------------------------------------------- +RTCCIF EQU H'0000' +CCP1IF EQU H'0001' +CCP2IF EQU H'0002' +CTMUIF EQU H'0003' +TX2IF EQU H'0004' +RC2IF EQU H'0005' +TMR5GIF EQU H'0007' + + +;----- IPR3 Bits ----------------------------------------------------- +RTCCIP EQU H'0000' +CCP1IP EQU H'0001' +CCP2IP EQU H'0002' +CTMUIP EQU H'0003' +TX2IP EQU H'0004' +RC2IP EQU H'0005' +TMR5GIP EQU H'0007' + + +;----- PIR6 Bits ----------------------------------------------------- +CMP1IF EQU H'0000' +CMP2IF EQU H'0001' +CMP3IF EQU H'0002' +EEIF EQU H'0004' + + +;----- PSPCON Bits ----------------------------------------------------- +PSPMODE EQU H'0004' +IBOV EQU H'0005' +OBF EQU H'0006' +IBF EQU H'0007' + + +;----- HLVDCON Bits ----------------------------------------------------- +HLVDEN EQU H'0004' +IRVST EQU H'0005' +BGVST EQU H'0006' +VDIRMAG EQU H'0007' + +HLVDL0 EQU H'0000' +HLVDL1 EQU H'0001' +HLVDL2 EQU H'0002' +HLVDL3 EQU H'0003' + + +;----- IPR6 Bits ----------------------------------------------------- +CMP1IP EQU H'0000' +CMP2IP EQU H'0001' +CMP3IP EQU H'0002' +EEIP EQU H'0004' + + +;----- T1GCON Bits ----------------------------------------------------- +T1GVAL EQU H'0002' +T1GGO_NOT_T1DONE EQU H'0003' +T1GSPM EQU H'0004' +T1GTM EQU H'0005' +T1GPOL EQU H'0006' +TMR1GE EQU H'0007' + +T1GSS0 EQU H'0000' +T1GSS1 EQU H'0001' +T1GGO EQU H'0003' + +NOT_T1DONE EQU H'0003' + + +;----- RCSTA Bits ----------------------------------------------------- +RX9D EQU H'0000' +OERR EQU H'0001' +FERR EQU H'0002' +ADDEN EQU H'0003' +CREN EQU H'0004' +SREN EQU H'0005' +RX9 EQU H'0006' +SPEN EQU H'0007' + +RCD8 EQU H'0000' +ADEN EQU H'0003' +RC9 EQU H'0006' + +NOT_RC8 EQU H'0006' + +RC8_9 EQU H'0006' + +RX9D1 EQU H'0000' +OERR1 EQU H'0001' +FERR1 EQU H'0002' +ADDEN1 EQU H'0003' +CREN1 EQU H'0004' +SREN1 EQU H'0005' +RX91 EQU H'0006' +SPEN1 EQU H'0007' + + +;----- RCSTA1 Bits ----------------------------------------------------- +RX9D EQU H'0000' +OERR EQU H'0001' +FERR EQU H'0002' +ADDEN EQU H'0003' +CREN EQU H'0004' +SREN EQU H'0005' +RX9 EQU H'0006' +SPEN EQU H'0007' + +RCD8 EQU H'0000' +ADEN EQU H'0003' +RC9 EQU H'0006' + +NOT_RC8 EQU H'0006' + +RC8_9 EQU H'0006' + +RX9D1 EQU H'0000' +OERR1 EQU H'0001' +FERR1 EQU H'0002' +ADDEN1 EQU H'0003' +CREN1 EQU H'0004' +SREN1 EQU H'0005' +RX91 EQU H'0006' +SPEN1 EQU H'0007' + + +;----- TXSTA Bits ----------------------------------------------------- +TX9D EQU H'0000' +TRMT EQU H'0001' +BRGH EQU H'0002' +SENDB EQU H'0003' +SYNC EQU H'0004' +TXEN EQU H'0005' +TX9 EQU H'0006' +CSRC EQU H'0007' + +TXD8 EQU H'0000' +TX8_9 EQU H'0006' + +NOT_TX8 EQU H'0006' + +TX9D1 EQU H'0000' +TRMT1 EQU H'0001' +BRGH1 EQU H'0002' +SENDB1 EQU H'0003' +SYNC1 EQU H'0004' +TXEN1 EQU H'0005' +TX91 EQU H'0006' +CSRC1 EQU H'0007' + + +;----- TXSTA1 Bits ----------------------------------------------------- +TX9D EQU H'0000' +TRMT EQU H'0001' +BRGH EQU H'0002' +SENDB EQU H'0003' +SYNC EQU H'0004' +TXEN EQU H'0005' +TX9 EQU H'0006' +CSRC EQU H'0007' + +TXD8 EQU H'0000' +TX8_9 EQU H'0006' + +NOT_TX8 EQU H'0006' + +TX9D1 EQU H'0000' +TRMT1 EQU H'0001' +BRGH1 EQU H'0002' +SENDB1 EQU H'0003' +SYNC1 EQU H'0004' +TXEN1 EQU H'0005' +TX91 EQU H'0006' +CSRC1 EQU H'0007' + + +;----- T3GCON Bits ----------------------------------------------------- +T3GVAL EQU H'0002' +T3GGO_NOT_T3DONE EQU H'0003' +T3GSPM EQU H'0004' +T3GTM EQU H'0005' +T3GPOL EQU H'0006' +TMR3GE EQU H'0007' + +T3GSS0 EQU H'0000' +T3GSS1 EQU H'0001' +T3GGO EQU H'0003' + +NOT_T3DONE EQU H'0003' + + +;----- T3CON Bits ----------------------------------------------------- +TMR3ON EQU H'0000' +RD16 EQU H'0001' +NOT_T3SYNC EQU H'0002' +SOSCEN EQU H'0003' + +T3CKPS0 EQU H'0004' +T3CKPS1 EQU H'0005' +TMR3CS0 EQU H'0006' +TMR3CS1 EQU H'0007' + + +;----- CMSTAT Bits ----------------------------------------------------- +CMP1OUT EQU H'0005' +CMP2OUT EQU H'0006' +CMP3OUT EQU H'0007' + + +;----- CMSTATUS Bits ----------------------------------------------------- +CMP1OUT EQU H'0005' +CMP2OUT EQU H'0006' +CMP3OUT EQU H'0007' + + +;----- CVRCON Bits ----------------------------------------------------- +CVRSS EQU H'0005' +CVROE EQU H'0006' +CVREN EQU H'0007' + +CVR0 EQU H'0000' +CVR1 EQU H'0001' +CVR2 EQU H'0002' +CVR3 EQU H'0003' +CVR4 EQU H'0004' + + +;----- PIE4 Bits ----------------------------------------------------- +CCP3IE EQU H'0000' +CCP4IE EQU H'0001' +CCP5IE EQU H'0002' +CCP6IE EQU H'0003' +CCP7IE EQU H'0004' +CCP8IE EQU H'0005' +CCP9IE EQU H'0006' +CCP10IE EQU H'0007' + + +;----- PIR4 Bits ----------------------------------------------------- +CCP3IF EQU H'0000' +CCP4IF EQU H'0001' +CCP5IF EQU H'0002' +CCP6IF EQU H'0003' +CCP7IF EQU H'0004' +CCP8IF EQU H'0005' +CCP9IF EQU H'0006' +CCP10IF EQU H'0007' + + +;----- IPR4 Bits ----------------------------------------------------- +CCP3IP EQU H'0000' +CCP4IP EQU H'0001' +CCP5IP EQU H'0002' +CCP6IP EQU H'0003' +CCP7IP EQU H'0004' +CCP8IP EQU H'0005' +CCP9IP EQU H'0006' +CCP10IP EQU H'0007' + + +;----- PIE5 Bits ----------------------------------------------------- +TMR4IE EQU H'0000' +TMR5IE EQU H'0001' +TMR6IE EQU H'0002' +TMR7IE EQU H'0003' +TMR8IE EQU H'0004' +TMR10IE EQU H'0005' +TMR12IE EQU H'0006' +TMR7GIE EQU H'0007' + + +;----- PIR5 Bits ----------------------------------------------------- +TMR4IF EQU H'0000' +TMR5IF EQU H'0001' +TMR6IF EQU H'0002' +TMR7IF EQU H'0003' +TMR8IF EQU H'0004' +TMR10IF EQU H'0005' +TMR12IF EQU H'0006' +TMR7GIF EQU H'0007' + + +;----- CCP1CON Bits ----------------------------------------------------- +CCP1M0 EQU H'0000' +CCP1M1 EQU H'0001' +CCP1M2 EQU H'0002' +CCP1M3 EQU H'0003' +DC1B0 EQU H'0004' +DC1B1 EQU H'0005' +P1M0 EQU H'0006' +P1M1 EQU H'0007' + +CCP1Y EQU H'0004' +CCP1X EQU H'0005' + + +;----- ECCP1CON Bits ----------------------------------------------------- +CCP1M0 EQU H'0000' +CCP1M1 EQU H'0001' +CCP1M2 EQU H'0002' +CCP1M3 EQU H'0003' +DC1B0 EQU H'0004' +DC1B1 EQU H'0005' +P1M0 EQU H'0006' +P1M1 EQU H'0007' + +CCP1Y EQU H'0004' +CCP1X EQU H'0005' + + +;----- ECCP1DEL Bits ----------------------------------------------------- +P1RSEN EQU H'0007' + +P1DC0 EQU H'0000' +P1DC1 EQU H'0001' +P1DC2 EQU H'0002' +P1DC3 EQU H'0003' +P1DC4 EQU H'0004' +P1DC5 EQU H'0005' +P1DC6 EQU H'0006' + + +;----- PWM1CON Bits ----------------------------------------------------- +P1RSEN EQU H'0007' + +P1DC0 EQU H'0000' +P1DC1 EQU H'0001' +P1DC2 EQU H'0002' +P1DC3 EQU H'0003' +P1DC4 EQU H'0004' +P1DC5 EQU H'0005' +P1DC6 EQU H'0006' + + +;----- ECCP1AS Bits ----------------------------------------------------- +ECCP1ASE EQU H'0007' + +PSS1BD0 EQU H'0000' +PSS1BD1 EQU H'0001' +PSS1AC0 EQU H'0002' +PSS1AC1 EQU H'0003' +ECCP1AS0 EQU H'0004' +ECCP1AS1 EQU H'0005' +ECCP1AS2 EQU H'0006' + + +;----- ADCON2 Bits ----------------------------------------------------- +ADFM EQU H'0007' + +ADCS0 EQU H'0000' +ADCS1 EQU H'0001' +ADCS2 EQU H'0002' +ACQT0 EQU H'0003' +ACQT1 EQU H'0004' +ACQT2 EQU H'0005' + + +;----- ADCON1 Bits ----------------------------------------------------- +VNCFG EQU H'0003' + +CHSN0 EQU H'0000' +CHSN1 EQU H'0001' +CHSN2 EQU H'0002' +VCFG0 EQU H'0004' +VCFG1 EQU H'0005' +TRIGSEL0 EQU H'0006' +TRIGSEL1 EQU H'0007' + + +;----- ADCON0 Bits ----------------------------------------------------- +ADON EQU H'0000' +GO_NOT_DONE EQU H'0001' + +DONE EQU H'0001' +CHS0 EQU H'0002' +CHS1 EQU H'0003' +CHS2 EQU H'0004' +CHS3 EQU H'0005' +CHS4 EQU H'0006' + +GO EQU H'0001' + +NOT_DONE EQU H'0001' + + +;----- SSP1CON2 Bits ----------------------------------------------------- +SEN EQU H'0000' +RSEN EQU H'0001' +PEN EQU H'0002' +RCEN EQU H'0003' +ACKEN EQU H'0004' +ACKDT EQU H'0005' +ACKSTAT EQU H'0006' +GCEN EQU H'0007' + +ADMSK1 EQU H'0001' +ADMSK2 EQU H'0002' +ADMSK3 EQU H'0003' +ADMSK4 EQU H'0004' +ADMSK5 EQU H'0005' + + +;----- SSPCON2 Bits ----------------------------------------------------- +SEN EQU H'0000' +RSEN EQU H'0001' +PEN EQU H'0002' +RCEN EQU H'0003' +ACKEN EQU H'0004' +ACKDT EQU H'0005' +ACKSTAT EQU H'0006' +GCEN EQU H'0007' + +ADMSK1 EQU H'0001' +ADMSK2 EQU H'0002' +ADMSK3 EQU H'0003' +ADMSK4 EQU H'0004' +ADMSK5 EQU H'0005' + + +;----- SSP1CON1 Bits ----------------------------------------------------- +CKP EQU H'0004' +SSPEN EQU H'0005' +SSPOV EQU H'0006' +WCOL EQU H'0007' + +SSPM0 EQU H'0000' +SSPM1 EQU H'0001' +SSPM2 EQU H'0002' +SSPM3 EQU H'0003' + + +;----- SSPCON1 Bits ----------------------------------------------------- +CKP EQU H'0004' +SSPEN EQU H'0005' +SSPOV EQU H'0006' +WCOL EQU H'0007' + +SSPM0 EQU H'0000' +SSPM1 EQU H'0001' +SSPM2 EQU H'0002' +SSPM3 EQU H'0003' + + +;----- SSP1STAT Bits ----------------------------------------------------- +BF EQU H'0000' +UA EQU H'0001' +R_NOT_W EQU H'0002' +S EQU H'0003' +P EQU H'0004' +D_NOT_A EQU H'0005' +CKE EQU H'0006' +SMP EQU H'0007' + +R EQU H'0002' +D EQU H'0005' + +R_W EQU H'0002' +D_A EQU H'0005' + +NOT_W EQU H'0002' +NOT_A EQU H'0005' + +NOT_WRITE EQU H'0002' +NOT_ADDRESS EQU H'0005' + +READ_WRITE EQU H'0002' +DATA_ADDRESS EQU H'0005' + +I2C_READ EQU H'0002' +I2C_START EQU H'0003' +I2C_STOP EQU H'0004' +I2C_DAT EQU H'0005' + + +;----- SSPSTAT Bits ----------------------------------------------------- +BF EQU H'0000' +UA EQU H'0001' +R_NOT_W EQU H'0002' +S EQU H'0003' +P EQU H'0004' +D_NOT_A EQU H'0005' +CKE EQU H'0006' +SMP EQU H'0007' + +R EQU H'0002' +D EQU H'0005' + +R_W EQU H'0002' +D_A EQU H'0005' + +NOT_W EQU H'0002' +NOT_A EQU H'0005' + +NOT_WRITE EQU H'0002' +NOT_ADDRESS EQU H'0005' + +READ_WRITE EQU H'0002' +DATA_ADDRESS EQU H'0005' + +I2C_READ EQU H'0002' +I2C_START EQU H'0003' +I2C_STOP EQU H'0004' +I2C_DAT EQU H'0005' + + +;----- SSP1MSK Bits ----------------------------------------------------- +MSK0 EQU H'0000' +MSK1 EQU H'0001' +MSK2 EQU H'0002' +MSK3 EQU H'0003' +MSK4 EQU H'0004' +MSK5 EQU H'0005' +MSK6 EQU H'0006' +MSK7 EQU H'0007' + + +;----- T2CON Bits ----------------------------------------------------- +TMR2ON EQU H'0002' + +T2CKPS0 EQU H'0000' +T2CKPS1 EQU H'0001' +T2OUTPS0 EQU H'0003' +T2OUTPS1 EQU H'0004' +T2OUTPS2 EQU H'0005' +T2OUTPS3 EQU H'0006' + + +;----- T1CON Bits ----------------------------------------------------- +TMR1ON EQU H'0000' +RD16 EQU H'0001' +NOT_T1SYNC EQU H'0002' +SOSCEN EQU H'0003' + +T1CKPS0 EQU H'0004' +T1CKPS1 EQU H'0005' +TMR1CS0 EQU H'0006' +TMR1CS1 EQU H'0007' + + +;----- RCON Bits ----------------------------------------------------- +NOT_BOR EQU H'0000' +NOT_POR EQU H'0001' +NOT_PD EQU H'0002' +NOT_TO EQU H'0003' +NOT_RI EQU H'0004' +NOT_CM EQU H'0005' +SBOREN EQU H'0006' +IPEN EQU H'0007' + +BOR EQU H'0000' +POR EQU H'0001' +PD EQU H'0002' +TO EQU H'0003' +RI EQU H'0004' +CM EQU H'0005' + + +;----- WDTCON Bits ----------------------------------------------------- +SWDTEN EQU H'0000' +ULPSINK EQU H'0001' +ULPEN EQU H'0002' +SRETEN EQU H'0004' +ULPLVL EQU H'0005' +REGSLP EQU H'0007' + +SWDTE EQU H'0000' + + +;----- IPR5 Bits ----------------------------------------------------- +TMR4IP EQU H'0000' +TMR5IP EQU H'0001' +TMR6IP EQU H'0002' +TMR7IP EQU H'0003' +TMR8IP EQU H'0004' +TMR10IP EQU H'0005' +TMR12IP EQU H'0006' +TMR7GIP EQU H'0007' + + +;----- OSCCON Bits ----------------------------------------------------- +HFIOFS EQU H'0002' +OSTS EQU H'0003' +IDLEN EQU H'0007' + +SCS0 EQU H'0000' +SCS1 EQU H'0001' +IRCF0 EQU H'0004' +IRCF1 EQU H'0005' +IRCF2 EQU H'0006' + + +;----- T0CON Bits ----------------------------------------------------- +PSA EQU H'0003' +T0SE EQU H'0004' +T0CS EQU H'0005' +T08BIT EQU H'0006' +TMR0ON EQU H'0007' + +T0PS0 EQU H'0000' +T0PS1 EQU H'0001' +T0PS2 EQU H'0002' + + +;----- STATUS Bits ----------------------------------------------------- +C EQU H'0000' +DC EQU H'0001' +Z EQU H'0002' +OV EQU H'0003' +N EQU H'0004' + + +;----- INTCON3 Bits ----------------------------------------------------- +INT1IF EQU H'0000' +INT2IF EQU H'0001' +INT3IF EQU H'0002' +INT1IE EQU H'0003' +INT2IE EQU H'0004' +INT3IE EQU H'0005' +INT1IP EQU H'0006' +INT2IP EQU H'0007' + +INT1F EQU H'0000' +INT2F EQU H'0001' +INT3F EQU H'0002' +INT1E EQU H'0003' +INT2E EQU H'0004' +INT3E EQU H'0005' +INT1P EQU H'0006' +INT2P EQU H'0007' + + +;----- INTCON2 Bits ----------------------------------------------------- +RBIP EQU H'0000' +INT3IP EQU H'0001' +TMR0IP EQU H'0002' +INTEDG3 EQU H'0003' +INTEDG2 EQU H'0004' +INTEDG1 EQU H'0005' +INTEDG0 EQU H'0006' +NOT_RBPU EQU H'0007' + +INT3P EQU H'0001' +T0IP EQU H'0002' +RBPU EQU H'0007' + + +;----- INTCON Bits ----------------------------------------------------- +RBIF EQU H'0000' +INT0IF EQU H'0001' +TMR0IF EQU H'0002' +RBIE EQU H'0003' +INT0IE EQU H'0004' +TMR0IE EQU H'0005' +PEIE_GIEL EQU H'0006' +GIE_GIEH EQU H'0007' + +INT0F EQU H'0001' +T0IF EQU H'0002' +INT0E EQU H'0004' +T0IE EQU H'0005' +PEIE EQU H'0006' +GIE EQU H'0007' + +GIEL EQU H'0006' +GIEH EQU H'0007' + + +;----- STKPTR Bits ----------------------------------------------------- +STKUNF EQU H'0006' +STKFUL EQU H'0007' + +SP0 EQU H'0000' +SP1 EQU H'0001' +SP2 EQU H'0002' +SP3 EQU H'0003' +SP4 EQU H'0004' +STKOVF EQU H'0007' + + + +;========================================================================== +; +; RAM Definitions +; +;========================================================================== + __MAXRAM H'0FFF' + +;========================================================================== +; +; IMPORTANT: For the PIC18 devices, the __CONFIG directive has been +; superseded by the CONFIG directive. The following settings +; are available for this device. +; +; VREG Sleep Enable bit: +; RETEN = OFF Disabled - Controlled by SRETEN bit +; RETEN = ON Enabled +; +; LF-INTOSC Low-power Enable bit: +; INTOSCSEL = LOW LF-INTOSC in Low-power mode during Sleep +; INTOSCSEL = HIGH LF-INTOSC in High-power mode during Sleep +; +; SOSC Power Selection and mode Configuration bits: +; SOSCSEL = LOW Low Power SOSC circuit selected +; SOSCSEL = DIG Digital (SCLKI) mode +; SOSCSEL = HIGH High Power SOSC circuit selected +; +; Extended Instruction Set: +; XINST = OFF Disabled +; XINST = ON Enabled +; +; Oscillator: +; FOSC = LP LP oscillator +; FOSC = XT XT oscillator +; FOSC = HS2 HS oscillator (High power, 16 MHz - 25 MHz) +; FOSC = HS1 HS oscillator (Medium power, 4 MHz - 16 MHz) +; FOSC = EC3IO EC oscillator, CLKOUT function on OSC2 (High power, 16 MHz - 64 MHz) +; FOSC = EC3 EC oscillator (High power, 16 MHz - 64 MHz) +; FOSC = RC External RC oscillator, CLKOUT function on OSC2 +; FOSC = RCIO External RC oscillator +; FOSC = INTIO2 Internal RC oscillator +; FOSC = INTIO1 Internal RC oscillator, CLKOUT function on OSC2 +; FOSC = EC2IO EC oscillator, CLKOUT function on OSC2 (Medium power, 160 kHz - 4 MHz) +; FOSC = EC2 EC oscillator (Medium power, 160 kHz - 4 MHz) +; FOSC = EC1IO EC oscillator, CLKOUT function on OSC2 (Low power, DC - 160 kHz) +; FOSC = EC1 EC oscillator (Low power, DC - 160 kHz) +; +; PLL x4 Enable bit: +; PLLCFG = OFF Disabled +; PLLCFG = ON Enabled +; +; Fail-Safe Clock Monitor: +; FCMEN = OFF Disabled +; FCMEN = ON Enabled +; +; Internal External Oscillator Switch Over Mode: +; IESO = OFF Disabled +; IESO = ON Enabled +; +; Power Up Timer: +; PWRTEN = ON Enabled +; PWRTEN = OFF Disabled +; +; Brown Out Detect: +; BOREN = OFF Disabled in hardware, SBOREN disabled +; BOREN = ON Controlled with SBOREN bit +; BOREN = NOSLP Enabled while active, disabled in SLEEP, SBOREN disabled +; BOREN = SBORDIS Enabled in hardware, SBOREN disabled +; +; Brown-out Reset Voltage bits: +; BORV = 0 3.0V +; BORV = 1 2.7V +; BORV = 2 2.0V +; BORV = 3 1.8V +; +; BORMV Power level: +; BORPWR = LOW BORMV set to low power level +; BORPWR = MEDIUM BORMV set to medium power level +; BORPWR = HIGH BORMV set to high power level +; BORPWR = ZPBORMV ZPBORMV instead of BORMV is selected +; +; Watchdog Timer: +; WDTEN = OFF WDT disabled in hardware; SWDTEN bit disabled +; WDTEN = NOSLP WDT enabled only while device is active and disabled in Sleep mode; SWDTEN bit disabled +; WDTEN = ON WDT controlled by SWDTEN bit setting +; WDTEN = SWDTDIS WDT enabled in hardware; SWDTEN bit disabled +; +; Watchdog Postscaler: +; WDTPS = 1 1:1 +; WDTPS = 2 1:2 +; WDTPS = 4 1:4 +; WDTPS = 8 1:8 +; WDTPS = 16 1:16 +; WDTPS = 32 1:32 +; WDTPS = 64 1:64 +; WDTPS = 128 1:128 +; WDTPS = 256 1:256 +; WDTPS = 512 1:512 +; WDTPS = 1024 1:1024 +; WDTPS = 2048 1:2048 +; WDTPS = 4096 1:4096 +; WDTPS = 8192 1:8192 +; WDTPS = 16384 1:16384 +; WDTPS = 32768 1:32768 +; WDTPS = 65536 1:65536 +; WDTPS = 131072 1:131072 +; WDTPS = 262144 1:262144 +; WDTPS = 524288 1:524288 +; WDTPS = 1048576 1:1048576 +; +; RTCC Clock Select: +; RTCOSC = INTOSCREF RTCC uses INTRC +; RTCOSC = SOSCREF RTCC uses SOSC +; +; External Address Shift bit: +; EASHFT = OFF Address Shifting disabled +; EASHFT = ON Address Shifting enabled +; +; Address Bus Width Select bits: +; ABW = XM20 20-bit address bus +; ABW = XM16 16-bit address bus +; ABW = XM12 12-bit address bus +; ABW = MM 8-bit address bus +; +; Data Bus Width: +; BW = 8 8-bit external bus mode +; BW = 16 16-bit external bus mode +; +; External Bus Wait: +; WAIT = ON Enabled +; WAIT = OFF Disabled +; +; CCP2 Mux: +; CCP2MX = PORTBE RE7-Microcontroller Mode/RB3-All other modes +; CCP2MX = PORTC RC1 +; +; ECCP Mux: +; ECCPMX = PORTH Enhanced CCP1/3 [P1B/P1C/P3B/P3C] muxed with RH7/RH6/RH5/RH4 +; ECCPMX = PORTE Enhanced CCP1/3 [P1B/P1C/P3B/P3C] muxed with RE6/RE5/RE4/RE3 +; +; MSSP address masking: +; MSSPMSK = MSK5 5 bit address masking mode +; MSSPMSK = MSK7 7 Bit address masking mode +; +; Master Clear Enable: +; MCLRE = OFF MCLR Disabled, RG5 Enabled +; MCLRE = ON MCLR Enabled, RG5 Disabled +; +; Stack Overflow Reset: +; STVREN = OFF Disabled +; STVREN = ON Enabled +; +; Boot Block Size: +; BBSIZ = BB1K 1K word Boot Block size +; BBSIZ = BB2K 2K word Boot Block size +; +; Background Debug: +; DEBUG = ON Enabled +; DEBUG = OFF Disabled +; +; Code Protect 00800-03FFF: +; CP0 = ON Enabled +; CP0 = OFF Disabled +; +; Code Protect 04000-07FFF: +; CP1 = ON Enabled +; CP1 = OFF Disabled +; +; Code Protect 08000-0BFFF: +; CP2 = ON Enabled +; CP2 = OFF Disabled +; +; Code Protect 0C000-0FFFF: +; CP3 = ON Enabled +; CP3 = OFF Disabled +; +; Code Protect 10000-13FFF: +; CP4 = ON Enabled +; CP4 = OFF Disabled +; +; Code Protect 14000-17FFF: +; CP5 = ON Enabled +; CP5 = OFF Disabled +; +; Code Protect 18000-1BFFF: +; CP6 = ON Enabled +; CP6 = OFF Disabled +; +; Code Protect 1C000-1FFFF: +; CP7 = ON Enabled +; CP7 = OFF Disabled +; +; Code Protect Boot: +; CPB = ON Enabled +; CPB = OFF Disabled +; +; Data EE Read Protect: +; CPD = ON Enabled +; CPD = OFF Disabled +; +; Table Write Protect 00800-03FFF: +; WRT0 = ON Enabled +; WRT0 = OFF Disabled +; +; Table Write Protect 04000-07FFF: +; WRT1 = ON Enabled +; WRT1 = OFF Disabled +; +; Table Write Protect 08000-0BFFF: +; WRT2 = ON Enabled +; WRT2 = OFF Disabled +; +; Table Write Protect 0C000-0FFFF: +; WRT3 = ON Enabled +; WRT3 = OFF Disabled +; +; Table Write Protect 10000-13FFF: +; WRT4 = ON Enabled +; WRT4 = OFF Disabled +; +; Table Write Protect 14000-17FFF: +; WRT5 = ON Enabled +; WRT5 = OFF Disabled +; +; Table Write Protect 18000-1BFFF: +; WRT6 = ON Enabled +; WRT6 = OFF Disabled +; +; Table Write Protect 1C000-1FFFF: +; WRT7 = ON Enabled +; WRT7 = OFF Disabled +; +; Config. Write Protect: +; WRTC = ON Enabled +; WRTC = OFF Disabled +; +; Table Write Protect Boot: +; WRTB = ON Enabled +; WRTB = OFF Disabled +; +; Data EE Write Protect: +; WRTD = ON Enabled +; WRTD = OFF Disabled +; +; Table Read Protect 00800-03FFF: +; EBRT0 = ON Enabled +; EBRT0 = OFF Disabled +; +; Table Read Protect 04000-07FFF: +; EBRT1 = ON Enabled +; EBRT1 = OFF Disabled +; +; Table Read Protect 08000-0BFFF: +; EBRT2 = ON Enabled +; EBRT2 = OFF Disabled +; +; Table Read Protect 0C000-0FFFF: +; EBRT3 = ON Enabled +; EBRT3 = OFF Disabled +; +; Table Read Protect 10000-13FFF: +; EBRT4 = ON Enabled +; EBRT4 = OFF Disabled +; +; Table Read Protect 14000-17FFF: +; EBRT5 = ON Enabled +; EBRT5 = OFF Disabled +; +; Table Read Protect 18000-1BFFF: +; EBRT6 = ON Enabled +; EBRT6 = OFF Disabled +; +; Table Read Protect 1C000-1FFFF: +; EBRT7 = ON Enabled +; EBRT7 = OFF Disabled +; +; Table Read Protect Boot: +; EBRTB = ON Enabled +; EBRTB = OFF Disabled +; +;========================================================================== +;========================================================================== +; +; Configuration Bits +; +; NAME Address +; CONFIG1L 300000h +; CONFIG1H 300001h +; CONFIG2L 300002h +; CONFIG2H 300003h +; CONFIG3L 300004h +; CONFIG3H 300005h +; CONFIG4L 300006h +; CONFIG5L 300008h +; CONFIG5H 300009h +; CONFIG6L 30000Ah +; CONFIG6H 30000Bh +; CONFIG7L 30000Ch +; CONFIG7H 30000Dh +; +;========================================================================== + +; The following is an assignment of address values for all of the +; configuration registers for the purpose of table reads +_CONFIG1L EQU H'300000' +_CONFIG1H EQU H'300001' +_CONFIG2L EQU H'300002' +_CONFIG2H EQU H'300003' +_CONFIG3L EQU H'300004' +_CONFIG3H EQU H'300005' +_CONFIG4L EQU H'300006' +_CONFIG5L EQU H'300008' +_CONFIG5H EQU H'300009' +_CONFIG6L EQU H'30000A' +_CONFIG6H EQU H'30000B' +_CONFIG7L EQU H'30000C' +_CONFIG7H EQU H'30000D' + +;----- CONFIG1L Options -------------------------------------------------- +_RETEN_OFF_1L EQU H'FE' ; Disabled - Controlled by SRETEN bit +_RETEN_ON_1L EQU H'FF' ; Enabled + +_INTOSCSEL_LOW_1L EQU H'FB' ; LF-INTOSC in Low-power mode during Sleep +_INTOSCSEL_HIGH_1L EQU H'FF' ; LF-INTOSC in High-power mode during Sleep + +_SOSCSEL_LOW_1L EQU H'EF' ; Low Power SOSC circuit selected +_SOSCSEL_DIG_1L EQU H'F7' ; Digital (SCLKI) mode +_SOSCSEL_HIGH_1L EQU H'FF' ; High Power SOSC circuit selected + +_XINST_OFF_1L EQU H'BF' ; Disabled +_XINST_ON_1L EQU H'FF' ; Enabled + +;----- CONFIG1H Options -------------------------------------------------- +_FOSC_LP_1H EQU H'F0' ; LP oscillator +_FOSC_XT_1H EQU H'F1' ; XT oscillator +_FOSC_HS2_1H EQU H'F2' ; HS oscillator (High power, 16 MHz - 25 MHz) +_FOSC_HS1_1H EQU H'F3' ; HS oscillator (Medium power, 4 MHz - 16 MHz) +_FOSC_EC3IO_1H EQU H'F4' ; EC oscillator, CLKOUT function on OSC2 (High power, 16 MHz - 64 MHz) +_FOSC_EC3_1H EQU H'F5' ; EC oscillator (High power, 16 MHz - 64 MHz) +_FOSC_RC_1H EQU H'F6' ; External RC oscillator, CLKOUT function on OSC2 +_FOSC_RCIO_1H EQU H'F7' ; External RC oscillator +_FOSC_INTIO2_1H EQU H'F8' ; Internal RC oscillator +_FOSC_INTIO1_1H EQU H'F9' ; Internal RC oscillator, CLKOUT function on OSC2 +_FOSC_EC2IO_1H EQU H'FA' ; EC oscillator, CLKOUT function on OSC2 (Medium power, 160 kHz - 4 MHz) +_FOSC_EC2_1H EQU H'FB' ; EC oscillator (Medium power, 160 kHz - 4 MHz) +_FOSC_EC1IO_1H EQU H'FC' ; EC oscillator, CLKOUT function on OSC2 (Low power, DC - 160 kHz) +_FOSC_EC1_1H EQU H'FD' ; EC oscillator (Low power, DC - 160 kHz) + +_PLLCFG_OFF_1H EQU H'EF' ; Disabled +_PLLCFG_ON_1H EQU H'FF' ; Enabled + +_FCMEN_OFF_1H EQU H'BF' ; Disabled +_FCMEN_ON_1H EQU H'FF' ; Enabled + +_IESO_OFF_1H EQU H'7F' ; Disabled +_IESO_ON_1H EQU H'FF' ; Enabled + +;----- CONFIG2L Options -------------------------------------------------- +_PWRTEN_ON_2L EQU H'FE' ; Enabled +_PWRTEN_OFF_2L EQU H'FF' ; Disabled + +_BOREN_OFF_2L EQU H'F9' ; Disabled in hardware, SBOREN disabled +_BOREN_ON_2L EQU H'FB' ; Controlled with SBOREN bit +_BOREN_NOSLP_2L EQU H'FD' ; Enabled while active, disabled in SLEEP, SBOREN disabled +_BOREN_SBORDIS_2L EQU H'FF' ; Enabled in hardware, SBOREN disabled + +_BORV_0_2L EQU H'E7' ; 3.0V +_BORV_1_2L EQU H'EF' ; 2.7V +_BORV_2_2L EQU H'F7' ; 2.0V +_BORV_3_2L EQU H'FF' ; 1.8V + +_BORPWR_LOW_2L EQU H'9F' ; BORMV set to low power level +_BORPWR_MEDIUM_2L EQU H'BF' ; BORMV set to medium power level +_BORPWR_HIGH_2L EQU H'DF' ; BORMV set to high power level +_BORPWR_ZPBORMV_2L EQU H'FF' ; ZPBORMV instead of BORMV is selected + +;----- CONFIG2H Options -------------------------------------------------- +_WDTEN_OFF_2H EQU H'FC' ; WDT disabled in hardware; SWDTEN bit disabled +_WDTEN_NOSLP_2H EQU H'FD' ; WDT enabled only while device is active and disabled in Sleep mode; SWDTEN bit disabled +_WDTEN_ON_2H EQU H'FE' ; WDT controlled by SWDTEN bit setting +_WDTEN_SWDTDIS_2H EQU H'FF' ; WDT enabled in hardware; SWDTEN bit disabled + +_WDTPS_1_2H EQU H'83' ; 1:1 +_WDTPS_2_2H EQU H'87' ; 1:2 +_WDTPS_4_2H EQU H'8B' ; 1:4 +_WDTPS_8_2H EQU H'8F' ; 1:8 +_WDTPS_16_2H EQU H'93' ; 1:16 +_WDTPS_32_2H EQU H'97' ; 1:32 +_WDTPS_64_2H EQU H'9B' ; 1:64 +_WDTPS_128_2H EQU H'9F' ; 1:128 +_WDTPS_256_2H EQU H'A3' ; 1:256 +_WDTPS_512_2H EQU H'A7' ; 1:512 +_WDTPS_1024_2H EQU H'AB' ; 1:1024 +_WDTPS_2048_2H EQU H'AF' ; 1:2048 +_WDTPS_4096_2H EQU H'B3' ; 1:4096 +_WDTPS_8192_2H EQU H'B7' ; 1:8192 +_WDTPS_16384_2H EQU H'BB' ; 1:16384 +_WDTPS_32768_2H EQU H'BF' ; 1:32768 +_WDTPS_65536_2H EQU H'C3' ; 1:65536 +_WDTPS_131072_2H EQU H'C7' ; 1:131072 +_WDTPS_262144_2H EQU H'CB' ; 1:262144 +_WDTPS_524288_2H EQU H'CF' ; 1:524288 +_WDTPS_1048576_2H EQU H'FF' ; 1:1048576 + +;----- CONFIG3L Options -------------------------------------------------- +_RTCOSC_INTOSCREF_3L EQU H'FE' ; RTCC uses INTRC +_RTCOSC_SOSCREF_3L EQU H'FF' ; RTCC uses SOSC + +_EASHFT_OFF_3L EQU H'F7' ; Address Shifting disabled +_EASHFT_ON_3L EQU H'FF' ; Address Shifting enabled + +_ABW_XM20_3L EQU H'CF' ; 20-bit address bus +_ABW_XM16_3L EQU H'DF' ; 16-bit address bus +_ABW_XM12_3L EQU H'EF' ; 12-bit address bus +_ABW_MM_3L EQU H'FF' ; 8-bit address bus + +_BW_8_3L EQU H'BF' ; 8-bit external bus mode +_BW_16_3L EQU H'FF' ; 16-bit external bus mode + +_WAIT_ON_3L EQU H'7F' ; Enabled +_WAIT_OFF_3L EQU H'FF' ; Disabled + +;----- CONFIG3H Options -------------------------------------------------- +_CCP2MX_PORTBE_3H EQU H'FE' ; RE7-Microcontroller Mode/RB3-All other modes +_CCP2MX_PORTC_3H EQU H'FF' ; RC1 + +_ECCPMX_PORTH_3H EQU H'FD' ; Enhanced CCP1/3 [P1B/P1C/P3B/P3C] muxed with RH7/RH6/RH5/RH4 +_ECCPMX_PORTE_3H EQU H'FF' ; Enhanced CCP1/3 [P1B/P1C/P3B/P3C] muxed with RE6/RE5/RE4/RE3 + +_MSSPMSK_MSK5_3H EQU H'F7' ; 5 bit address masking mode +_MSSPMSK_MSK7_3H EQU H'FF' ; 7 Bit address masking mode + +_MCLRE_OFF_3H EQU H'7F' ; MCLR Disabled, RG5 Enabled +_MCLRE_ON_3H EQU H'FF' ; MCLR Enabled, RG5 Disabled + +;----- CONFIG4L Options -------------------------------------------------- +_STVREN_OFF_4L EQU H'FE' ; Disabled +_STVREN_ON_4L EQU H'FF' ; Enabled + +_BBSIZ_BB1K_4L EQU H'EF' ; 1K word Boot Block size +_BBSIZ_BB2K_4L EQU H'FF' ; 2K word Boot Block size + +_DEBUG_ON_4L EQU H'7F' ; Enabled +_DEBUG_OFF_4L EQU H'FF' ; Disabled + +;----- CONFIG5L Options -------------------------------------------------- +_CP0_ON_5L EQU H'FE' ; Enabled +_CP0_OFF_5L EQU H'FF' ; Disabled + +_CP1_ON_5L EQU H'FD' ; Enabled +_CP1_OFF_5L EQU H'FF' ; Disabled + +_CP2_ON_5L EQU H'FB' ; Enabled +_CP2_OFF_5L EQU H'FF' ; Disabled + +_CP3_ON_5L EQU H'F7' ; Enabled +_CP3_OFF_5L EQU H'FF' ; Disabled + +_CP4_ON_5L EQU H'EF' ; Enabled +_CP4_OFF_5L EQU H'FF' ; Disabled + +_CP5_ON_5L EQU H'DF' ; Enabled +_CP5_OFF_5L EQU H'FF' ; Disabled + +_CP6_ON_5L EQU H'BF' ; Enabled +_CP6_OFF_5L EQU H'FF' ; Disabled + +_CP7_ON_5L EQU H'7F' ; Enabled +_CP7_OFF_5L EQU H'FF' ; Disabled + +;----- CONFIG5H Options -------------------------------------------------- +_CPB_ON_5H EQU H'BF' ; Enabled +_CPB_OFF_5H EQU H'FF' ; Disabled + +_CPD_ON_5H EQU H'7F' ; Enabled +_CPD_OFF_5H EQU H'FF' ; Disabled + +;----- CONFIG6L Options -------------------------------------------------- +_WRT0_ON_6L EQU H'FE' ; Enabled +_WRT0_OFF_6L EQU H'FF' ; Disabled + +_WRT1_ON_6L EQU H'FD' ; Enabled +_WRT1_OFF_6L EQU H'FF' ; Disabled + +_WRT2_ON_6L EQU H'FB' ; Enabled +_WRT2_OFF_6L EQU H'FF' ; Disabled + +_WRT3_ON_6L EQU H'F7' ; Enabled +_WRT3_OFF_6L EQU H'FF' ; Disabled + +_WRT4_ON_6L EQU H'EF' ; Enabled +_WRT4_OFF_6L EQU H'FF' ; Disabled + +_WRT5_ON_6L EQU H'DF' ; Enabled +_WRT5_OFF_6L EQU H'FF' ; Disabled + +_WRT6_ON_6L EQU H'BF' ; Enabled +_WRT6_OFF_6L EQU H'FF' ; Disabled + +_WRT7_ON_6L EQU H'7F' ; Enabled +_WRT7_OFF_6L EQU H'FF' ; Disabled + +;----- CONFIG6H Options -------------------------------------------------- +_WRTC_ON_6H EQU H'DF' ; Enabled +_WRTC_OFF_6H EQU H'FF' ; Disabled + +_WRTB_ON_6H EQU H'BF' ; Enabled +_WRTB_OFF_6H EQU H'FF' ; Disabled + +_WRTD_ON_6H EQU H'7F' ; Enabled +_WRTD_OFF_6H EQU H'FF' ; Disabled + +;----- CONFIG7L Options -------------------------------------------------- +_EBRT0_ON_7L EQU H'FE' ; Enabled +_EBRT0_OFF_7L EQU H'FF' ; Disabled + +_EBRT1_ON_7L EQU H'FD' ; Enabled +_EBRT1_OFF_7L EQU H'FF' ; Disabled + +_EBRT2_ON_7L EQU H'FB' ; Enabled +_EBRT2_OFF_7L EQU H'FF' ; Disabled + +_EBRT3_ON_7L EQU H'F7' ; Enabled +_EBRT3_OFF_7L EQU H'FF' ; Disabled + +_EBRT4_ON_7L EQU H'EF' ; Enabled +_EBRT4_OFF_7L EQU H'FF' ; Disabled + +_EBRT5_ON_7L EQU H'DF' ; Enabled +_EBRT5_OFF_7L EQU H'FF' ; Disabled + +_EBRT6_ON_7L EQU H'BF' ; Enabled +_EBRT6_OFF_7L EQU H'FF' ; Disabled + +_EBRT7_ON_7L EQU H'7F' ; Enabled +_EBRT7_OFF_7L EQU H'FF' ; Disabled + +;----- CONFIG7H Options -------------------------------------------------- +_EBRTB_ON_7H EQU H'BF' ; Enabled +_EBRTB_OFF_7H EQU H'FF' ; Disabled + + +;----- DEVID Equates -------------------------------------------------- +_DEVID1 EQU H'3FFFFE' +_DEVID2 EQU H'3FFFFF' + +;----- IDLOC Equates -------------------------------------------------- +_IDLOC0 EQU H'200000' +_IDLOC1 EQU H'200001' +_IDLOC2 EQU H'200002' +_IDLOC3 EQU H'200003' +_IDLOC4 EQU H'200004' +_IDLOC5 EQU H'200005' +_IDLOC6 EQU H'200006' +_IDLOC7 EQU H'200007' + + LIST diff -r a9a0188091e4 -r 7d8a4c60ec1a src/adc_lightsensor.asm --- a/src/adc_lightsensor.asm Thu Jan 14 16:24:07 2021 +0100 +++ b/src/adc_lightsensor.asm Mon May 24 18:40:53 2021 +0200 @@ -25,6 +25,7 @@ ; ; bank safe ; + global wait_adc wait_adc: movwf ADCON0 ; select ADC channel nop ; wait a short moment @@ -278,11 +279,12 @@ movlw b'00011101' ; power on ADC, select AN7 rcall wait_adc MOVII ADRESL,ambient_light - bcf ADCON0,0 ; power off ADC + bcf ADCON0,0 ; power off ADC + btfsc ambient_light+1,7 ; result negative? + return ; Yes, skip this measurement ; ambient_light:2 is between 4096 (direct sunlight) and about 200 (darkness) ; first: divide by 16 - movlw .4 ; divide by 2^4 = 16 get_ambient_level1_loop: bcf STATUS,C ; clear carry @@ -299,7 +301,7 @@ movwf ambient_light+0 ; YES - avoid ADC clipping incfsz ambient_light+0,W ; = 255 ? - bra get_ambient_level2 ; NO - continue + bra get_ambient_level2 ; NO - continue movlw .254 movwf ambient_light+0 ; avoid ADC clipping diff -r a9a0188091e4 -r 7d8a4c60ec1a src/compass_ops.asm --- a/src/compass_ops.asm Thu Jan 14 16:24:07 2021 +0100 +++ b/src/compass_ops.asm Mon May 24 18:40:53 2021 +0200 @@ -235,7 +235,7 @@ call request_speed_fastest ; request CPU speed change to fastest speed - movlw .7 ; initialize gain + movlw .5 ; initialize gain movff WREG,opt_compass_gain ; ... movlw .60 ; initialize timeout to 60 seconds diff -r a9a0188091e4 -r 7d8a4c60ec1a src/configuration.inc --- a/src/configuration.inc Thu Jan 14 16:24:07 2021 +0100 +++ b/src/configuration.inc Mon May 24 18:40:53 2021 +0200 @@ -24,7 +24,7 @@ #endif #define fw_version_major 0x03 -#define fw_version_minor 0x0D +#define fw_version_minor 0x0F #define fw_version_beta 0x00 @@ -42,11 +42,11 @@ ; #endif -#define firmware_creation_year 0x14 -#define firmware_creation_month 0x0A -#define firmware_creation_day 0x1C +#define firmware_creation_year 0x15 +#define firmware_creation_month 0x05 +#define firmware_creation_day 0x15 -#define firmware_expire_year 0x16 +#define firmware_expire_year 0x17 #define firmware_expire_month 0x0A #define firmware_expire_day 0x1C @@ -79,8 +79,8 @@ ; #endif -#define _language_1 de -#define _language_2 en +#define _language_1 en +#define _language_2 de #ifdef xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx @@ -146,7 +146,7 @@ #define _gas_contingency #define NOT_INCLUDED_external_sensor #define NOT_INCLUDED_cave_mode -#define NOT_INCLUDED_big_divemenu +#define _big_divemenu #define _firmware_recovery #define NOT_INCLUDED_min_depth_option #define NOT_INCLUDED_screendump @@ -166,7 +166,7 @@ #define _gas_contingency #define NOT_INCLUDED_external_sensor #define _cave_mode -#define NOT_INCLUDED_big_divemenu +#define _big_divemenu #define _firmware_recovery #define NOT_INCLUDED_min_depth_option #define NOT_INCLUDED_screendump @@ -186,7 +186,7 @@ #define _external_sensor #define _gas_contingency #define NOT_INCLUDED_cave_mode -#define NOT_INCLUDED_big_divemenu +#define _big_divemenu #define _firmware_recovery #define NOT_INCLUDED_min_depth_option #define _screendump @@ -206,7 +206,7 @@ #define _external_sensor #define _gas_contingency #define _cave_mode -#define NOT_INCLUDED_big_divemenu +#define _big_divemenu #define _firmware_recovery #define NOT_INCLUDED_min_depth_option #define NOT_INCLUDED_screendump @@ -226,7 +226,7 @@ #define _rx_update #define NOT_INCLUDED_external_sensor #define NOT_INCLUDED_cave_mode -#define NOT_INCLUDED_big_divemenu +#define _big_divemenu #define _firmware_recovery #define NOT_INCLUDED_min_depth_option #define NOT_INCLUDED_screendump diff -r a9a0188091e4 -r 7d8a4c60ec1a src/divemenu_tree.asm --- a/src/divemenu_tree.asm Thu Jan 14 16:24:07 2021 +0100 +++ b/src/divemenu_tree.asm Mon May 24 18:40:53 2021 +0200 @@ -90,7 +90,7 @@ ;bra main_divemenu_OC_cave ; YES - use version with cave mode entry main_divemenu_OC_cave: - MENU_BEGIN_DIVE .6 + MENU_BEGIN_DIVE tMainMenu, .6 MENU_CALL tDivemenu_Gaslist, do_divemode_gaslist MENU_CALL tDivemenu_ResetAvg, do_reset_average MENU_DYNAMIC dyn_toggle_gf, do_toggle_gf @@ -101,7 +101,7 @@ ENDIF ; _cave_mode main_divemenu_OC_nocave: - MENU_BEGIN_DIVE .5 + MENU_BEGIN_DIVE tMainMenu, .5 MENU_CALL tDivemenu_Gaslist, do_divemode_gaslist MENU_CALL tDivemenu_ResetAvg, do_reset_average MENU_DYNAMIC dyn_toggle_gf, do_toggle_gf @@ -117,7 +117,7 @@ btfsc FLAG_pscr_mode ; in pSCR mode? bra main_divemenu_pscr ; YES - show pSCR menu - MENU_BEGIN_DIVE .6 + MENU_BEGIN_DIVE tMainMenu, .6 MENU_CALL tDiveBailout, do_divemode_gaslist_bail MENU_CALL tDivemenu_Setpoint, do_divemode_splist MENU_CALL tDivemenu_Diluent, do_divemode_gaslist @@ -136,7 +136,7 @@ ENDIF ; _external_sensor main_divemenu_pscr_no_sensors: - MENU_BEGIN_DIVE .6 + MENU_BEGIN_DIVE tMainMenu, .6 MENU_CALL tDiveBailout, do_divemode_gaslist_bail MENU_CALL tDivemenu_Premix, do_divemode_gaslist MENU_CALL tBackToLoop, do_switch_sp_calc @@ -147,7 +147,7 @@ IFDEF _external_sensor main_divemenu_pscr_sensors: - MENU_BEGIN_DIVE .6 + MENU_BEGIN_DIVE tMainMenu, .6 MENU_CALL tDiveBailout, do_divemode_gaslist_bail MENU_CALL tCCRModeSensor, do_divemode_setpoint_pscr MENU_CALL tDivemenu_Premix, do_divemode_gaslist @@ -214,7 +214,7 @@ movlw .1 ; set to first option in dive mode menu movwf menu_pos_cur ; ... - MENU_BEGIN_DIVE .2 + MENU_BEGIN_DIVE tDivemenu_ToggleGF, .2 MENU_CALL tDivemenu_ToggleGF, do_toggle_gf_toggle MENU_CALL tExit, do_exit_divemode_menu MENU_END @@ -254,7 +254,7 @@ movlw .1 ; set to first option in dive mode menu movwf menu_pos_cur ; ... - MENU_BEGIN_DIVE .3 + MENU_BEGIN_DIVE tDivemenu_Marker, .3 MENU_CALL tDivemenu_ResetAvg, do_reset_average MENU_CALL tDivemenu_Marker, do_set_marker MENU_CALL tBack, do_return_main_divemenu ; return to main menu @@ -303,7 +303,7 @@ do_divemode_gaslist_1: movwf menu_pos_cur ; position cursor to best gas/dil (or first option if none avail) - MENU_BEGIN_DIVE .6 + MENU_BEGIN_DIVE tDivemenu_Gaslist, .6 MENU_DYNAMIC dyn_strcat_gas_prodl, do_switch_gas MENU_DYNAMIC dyn_strcat_gas_prodl, do_switch_gas MENU_DYNAMIC dyn_strcat_gas_prodl, do_switch_gas @@ -367,7 +367,7 @@ bcf better_gas_hint ; do not mark the best gas/diluent bcf color_code_gases ; do not color-code the gases/diluents by their ppO2 - MENU_BEGIN_DIVE .6 + MENU_BEGIN_DIVE tDivemenu_LostGas, .6 MENU_DYNAMIC dyn_strcat_gas_prodl, do_toggle_staged_lost MENU_DYNAMIC dyn_strcat_gas_prodl, do_toggle_staged_lost MENU_DYNAMIC dyn_strcat_gas_prodl, do_toggle_staged_lost @@ -473,7 +473,7 @@ IFDEF _helium - MENU_BEGIN_DIVE .6 + MENU_BEGIN_DIVE tGas6, .6 MENU_OPT_INCS tO2Plus, oGas6O2 MENU_OPT_DECS tO2Minus, oGas6O2 MENU_OPT_INCS tHePlus, oGas6He @@ -482,7 +482,7 @@ MENU_CALL tExit, do_exit_divemode_menu MENU_END ELSE - MENU_BEGIN_DIVE .4 + MENU_BEGIN_DIVE tGas6, .4 MENU_OPT_INCS tO2Plus, oGas6O2 MENU_OPT_DECS tO2Minus, oGas6O2 MENU_DYNAMIC dyn_show_gas6, do_gas6_switch @@ -541,7 +541,7 @@ ENDIF ; _external_sensor do_divemode_splist_no_sensor: - MENU_BEGIN_DIVE .6 + MENU_BEGIN_DIVE tFixedSetpoints, .6 MENU_DYNAMIC dyn_strcat_setpoint_prodl, do_switch_sp MENU_DYNAMIC dyn_strcat_setpoint_prodl, do_switch_sp MENU_DYNAMIC dyn_strcat_setpoint_prodl, do_switch_sp @@ -554,7 +554,7 @@ IFDEF _external_sensor do_divemode_splist_sensor: - MENU_BEGIN_DIVE .6 + MENU_BEGIN_DIVE tFixedSetpoints, .6 MENU_DYNAMIC dyn_strcat_setpoint_prodl, do_switch_sp MENU_DYNAMIC dyn_strcat_setpoint_prodl, do_switch_sp MENU_DYNAMIC dyn_strcat_setpoint_prodl, do_switch_sp @@ -642,7 +642,7 @@ movwf menu_pos_cur ; ... do_return_divemode_common: - MENU_BEGIN_DIVE .6 + MENU_BEGIN_DIVE tDivemenu_UseSensor,.6 MENU_CALL tDivemenu_UseSensor, do_switch_sensor MENU_CALL tBack, do_divemode_splist MENU_CALL tExit, do_exit_divemode_menu @@ -655,7 +655,7 @@ movlw .1 movwf menu_pos_cur ; set to 1st option: use calculated ppO2 - MENU_BEGIN_DIVE .6 + MENU_BEGIN_DIVE tDivemenu_UseSensor,.6 MENU_CALL tCalculated, do_switch_sp_calc MENU_CALL tDivemenu_UseSensor, do_switch_sensor MENU_CALL tExit, do_exit_divemode_menu @@ -735,7 +735,7 @@ movwf active_customview ; set custom view number call dive_customview_callup ; draw custom view - MENU_BEGIN_DIVE .6 + MENU_BEGIN_DIVE tCaveMode, .6 MENU_DYNAMIC dyn_waypoint_set, do_waypoint_set ; 1 MENU_DYNAMIC dyn_turndive_toggle, do_turndive_toggle ; 2 MENU_CALL tDivemenu_off_on, do_cavemode_toggle ; 3 diff -r a9a0188091e4 -r 7d8a4c60ec1a src/divemode.asm --- a/src/divemode.asm Thu Jan 14 16:24:07 2021 +0100 +++ b/src/divemode.asm Mon May 24 18:40:53 2021 +0200 @@ -233,7 +233,29 @@ ; Dive Mode Mail Loop ; diveloop_loop: - btfsc trigger_full_second ; new 1/1 second? + btfss trigger_quarter_second ; new 1/4 second? + bra diveloop_loop_0 ; No - continue + + ;---- tasks any new 1/4 second ----- + bcf trigger_quarter_second ; YES - clear flag + + movlw .4 ; 62,5ms * 4 = 1/4 second + movff WREG,isr_tmr7_helper ; to make sure at least 1/4 will pass before trigger_quarter_second is re-set + + btfss press_sensor_type ; New sensor found? + bra diveloop_loop_0 ; No - continue + + ; Handle new pressure sensor every 1/4 second + btfsc ms5837_state ; =0: result of temperature is in the ADC + bra diveloop_loop_quarter_2 + call I2C_get_temp_val_MS5837 ; (Will set ms5837_state) + bra diveloop_loop_0 ; Done. +diveloop_loop_quarter_2: + call I2C_get_press_val_MS5837 ; (Will clear ms5837_state) + ;---- tasks any new 1/4 second done ----- + +diveloop_loop_0: + btfsc trigger_full_second ; new 1/1 second? bra diveloop_loop_2 ; YES - continue with tasks every 1/1 second btfsc trigger_half_second ; NO - new 1/2 second? bra diveloop_loop_1 ; YES - continue with tasks every 1/2 second @@ -465,7 +487,7 @@ diveloop_loop_12: - bsf FLAG_TFT_active_gas_divemode; redraw gas and setpoint (eventually needed to restore the "Bailout" text) + bsf FLAG_TFT_active_gas_divemode; redraw gas and setpoint (eventually needed to restore the "Bailout" text) btfsc request_next_custview ; shall show next custom view? call dive_customview_toggle ; YES - show next custom view diff -r a9a0188091e4 -r 7d8a4c60ec1a src/hwos.asm --- a/src/hwos.asm Thu Jan 14 16:24:07 2021 +0100 +++ b/src/hwos.asm Mon May 24 18:40:53 2021 +0200 @@ -44,11 +44,13 @@ ;---- Flags - Hardware Descriptors HW_descriptor res 1 ; OSTC - model descriptor (cleared & rebuilt in restart) -HW_variants res 1 ; OSTC - model variants (NOT cleared in restart) - +HW_variants res 1 ; OSTC - model variants (NOT cleared in restart) +HW_variants2 res 1 ; OSTC - more model variants (NOT cleared in restart) + ;---- Flags - Hardware States HW_flags_state1 res 1 ; hardware - states 1 HW_flags_state2 res 1 ; hardware - states 2 +HW_flags_state3 res 1 ; hardware - states 3 ;--- Flags - Operating System OS_flags_persist res 1 ; system - persistent settings (NOT cleared in restart) @@ -107,17 +109,19 @@ -; 40 byte user data +; 44 byte user data ; 32 byte tmp data placed by C compiler ; 20 byte variables placed by math library ; == -; 92 byte used, 4 byte free (96 byte total available) +; 96 byte used, 0 byte free (96 byte total available) global HW_descriptor global HW_variants + global HW_variants2 global HW_flags_state1 global HW_flags_state2 + global HW_flags_state3 global OS_flags_persist global OS_flags_ISR1 global OS_flags_ISR2 @@ -366,7 +370,7 @@ movlw b'00101000' ; set up I2C to master mode movwf SSP1CON1 ; ... clrf SSP1CON2 ; ... - movlw 0x9C ; select speed 100kHz @ 64MHz Fosc + movlw i2c_speed_value movwf SSP1ADD ; ... @@ -441,8 +445,6 @@ movwf PIE1 ; ... movlw b'00000010' ; enable timer 3 IRQ movwf PIE2 ; ... - movlw b'00000000' ; enable timer 5 IRQ - movwf PIE5 ; ... movlw b'00000001' ; enable RTCC IRQ movwf PIE3 ; ... movlw b'00001001' ; enable timer 7 and timer 4 IRQ diff -r a9a0188091e4 -r 7d8a4c60ec1a src/hwos.inc --- a/src/hwos.inc Thu Jan 14 16:24:07 2021 +0100 +++ b/src/hwos.inc Mon May 24 18:40:53 2021 +0200 @@ -12,7 +12,7 @@ ; ---- Hardware Configuration - LIST P=18F87K22 ; compiler settings, if changed change also: Configure -> SelectDevice in MPLAB + LIST P=18F87K22 ; compiler settings, if changed change also: Configure -> SelectDevice in MPLAB #include "p18f87k22.inc" ; processor definitions #include "ports.inc" ; port map definitions @@ -70,6 +70,8 @@ #DEFINE speed_is_normal cpu_speed_state,1 ; =1: CPU is running at normal speed #DEFINE speed_is_fastest cpu_speed_state,2 ; =1: CPU is running at fastest speed +; ---- I2C speed +#DEFINE i2c_speed_value 0x27 ;0x9C = 100kHz @ 64MHz Fosc, 0x27 = 100kHz @ 16MHz Fosc ; ---- Divemode Custom View Indexes - Attention: these numbers need to be in line with the jump tables in customview.asm! #DEFINE index_blank .0 ; blank view @@ -444,7 +446,7 @@ #DEFINE timebase_0sec timebase,0 ; counting timebase, 1/2 sec bit #DEFINE timebase_1sec timebase,1 ; counting timebase, 1 sec bit #DEFINE timebase_2sec timebase,2 ; counting timebase, 2 sec bit -#DEFINE trigger_quarter_second timebase,3 ; =1: a new 1/4 second has begun (not synced with the other time flags, not generated while block_sensor_interrupt is set) +#DEFINE trigger_quarter_second timebase,3 ; =1: a new 1/4 second has begun (not synced with the other time flags) #DEFINE trigger_half_second timebase,4 ; =1: a new 1/2 second has begun #DEFINE trigger_full_second timebase,5 ; =1: a new 1/1 second has begun #DEFINE trigger_full_minute timebase,6 ; =1: a new minute has begun @@ -484,6 +486,15 @@ #DEFINE analog_switches HW_variants,6 ; =1: analog switches available #DEFINE battery_is_36v HW_variants,7 ; =1: a 3.6 Volt battery is detected + ;---- Hardware - OSTC Model Variants2 (stored in access RAM, NOT cleared in restart) +#DEFINE press_sensor_type HW_variants2,0 ; =1: pressure sensor MS5837, =0: Pressure sensor MS5541 +; HW_variants2,1 ; --- unused +; HW_variants2,2 ; --- unused +; HW_variants2,3 ; --- unused +; HW_variants2,4 ; --- unused +; HW_variants2,5 ; --- unused +; HW_variants2,6 ; --- unused +; HW_variants2,7 ; --- unused ;---- Hardware - States 1 (stored in access RAM, cleared on restart) #DEFINE analog_sw1_pressed HW_flags_state1,0 ; =1: analog switch 1 pressed @@ -503,9 +514,18 @@ #DEFINE battery_low_condition HW_flags_state2,4 ; =1: low battery condition detected #DEFINE flash_wrap_around HW_flags_state2,5 ; =1: address wrap-around control / signalling #DEFINE flash_wait HW_flags_state2,6 ; =1: wait for flash write operation to complete -; HW_flags_state2,7 ; --- unused +#DEFINE i2c_busy_temperature HW_flags_state2,7 ; =1: Currently updating temperature from MS5837 - + ;---- Hardware - States 3 (stored in access RAM, NOT cleared on restart) +#DEFINE ms5837_state HW_flags_state3,0 ; =1: result of pressure is in the ADC +#DEFINE i2c_busy_pressure HW_flags_state3,1 ; =1: Currently updating pressure from MS5837 +; HW_flags_state3,2 ; --- unused +; HW_flags_state3,3 ; --- unused +; HW_flags_state3,4 ; --- unused +; HW_flags_state3,5 ; --- unused +; HW_flags_state3,6 ; --- unused +; HW_flags_state3,7 ; --- unused + ;---- Operating System - persistent Settings (stored in access RAM, NOT cleared in restart) #DEFINE sensor1_calibrated_ok OS_flags_persist,0 ; =1: sensor 1 calibration ok #DEFINE sensor2_calibrated_ok OS_flags_persist,1 ; =1: sensor 2 calibration ok @@ -840,13 +860,13 @@ TSTOSS macro opt_reg ; TeST Option Skip next instruction if Set (not zero) movff opt_reg,EEDATA ; Attention: destroys EEDATA! - tstfsz EEDATA,A ; Attention: must be followed by a plain machine + tstfsz EEDATA ; Attention: must be followed by a plain machine bra $+4 ; command, do not let follow a macro! endm ; TSTOSC macro opt_reg ; TeST Option Skip next instruction if Clear (zero) movff opt_reg,EEDATA ; Attention: destroys EEDATA! - tstfsz EEDATA,A ; Attention: must be followed by a plain machine + tstfsz EEDATA ; Attention: must be followed by a plain machine endm ; command, do not let follow a macro! @@ -1013,9 +1033,11 @@ extern HW_descriptor extern HW_variants + extern HW_variants2 extern HW_flags_state1 extern HW_flags_state2 + extern HW_flags_state3 extern OS_flags_persist extern OS_flags_ISR1 @@ -1116,18 +1138,18 @@ dMSB res 1 ; pressure sensor interface, MSB dbuffer res 1 ; pressure sensor interface, RX/TX buffer -C1 res 2 ; decoded calibration data -C2 res 2 ; decoded calibration data -C3 res 2 ; decoded calibration data -C4 res 2 ; decoded calibration data, here C4-250 -C5 res 2 ; decoded calibration data, here reference temperature UT1 = 8*C5 + 10000 (u16 range 10.000 .. +42.760) -C6 res 2 ; decoded calibration data -D1 res 2 ; raw pressure -D2 res 2 ; raw temperature -xdT res 2 +C1 res 2 ; decoded calibration data +C2 res 2 ; decoded calibration data +C3 res 2 ; decoded calibration data +C4 res 2 ; decoded calibration data, here C4-250 +C5 res 2 ; decoded calibration data, here reference temperature UT1 = 8*C5 + 10000 (u16 range 10.000 .. +42.760) +C6 res 2 ; decoded calibration data +D1 res 3 ; raw pressure +D2 res 3 ; raw temperature +xdT res 3 xdT2 res 2 -OFF res 2 -SENS res 2 +OFF res 4 +SENS res 4 temperature_cur res 2 ; current temperature temperature_min res 2 ; minimum temperature (operated by divemode.asm) @@ -1135,7 +1157,7 @@ temperature_last res 2 ; internal register used for detecting changes pressure_abs res 2 ; current absolute pressure -pressure_abs_avg res 2 ; internal register used for averaging +pressure_abs_avg res 3 ; internal register used for averaging pressure_abs_last res 2 ; internal register used for detecting pressure changes pressure_abs_sampled res 2 ; sampled surface pressure, sampled in sleep mode every 15 minutes @@ -1147,9 +1169,10 @@ pressure_rel_sim res 2 ; simulated relative pressure (simulator mode) ;---- Data for ISR Math Subroutines -isr_xA res 2 ; multiplicand 1 -isr_xB res 2 ; multiplicand 2 -isr_xC res 4 ; resulting product +isr_xA res 4 ; multiplicand 1 +isr_xB res 3 ; multiplicand 2 +isr_xC res 7 ; resulting product +isr_math_loop res 1 ; loop counter ;---- Display Brightness ambient_light res 2 ; ambient light level @@ -1190,8 +1213,9 @@ ENDIF debounce_counter res 1 ; multiples of 16ms - -; 144 byte used, 16 byte free +isr_tmr7_helper res 1 ; used for 1/4 second trigger + +; 158 byte used, 2 byte free ;----------------------------------------------------------------------------- @@ -1567,7 +1591,11 @@ time_last_2nd res 2 ; last pressure reading time in seconds | ENDIF -; 156 byte used, 100 byte free +i2c_error_vault res 2 ; Store last used device ID and data byte +D1_buffer res 3 ; Buffer of D1 (Sensor raw data) +D2_buffer res 3 ; Buffer of D2 (Sensor raw data) + +; 156 byte used, 93 byte free ;----------------------------------------------------------------------------- diff -r a9a0188091e4 -r 7d8a4c60ec1a src/i2c.asm --- a/src/i2c.asm Thu Jan 14 16:24:07 2021 +0100 +++ b/src/i2c.asm Mon May 24 18:40:53 2021 +0200 @@ -37,6 +37,16 @@ ; ----------- ; RX Circuity read address (8-Bit): 0x51 ; RX Circuity write address (8-Bit): 0x50 +; +; Battery gauge +; ------------- +; LTC2942 read address (8-Bit): 0xC9 +; LTC2942 write address (8-Bit): 0xC8 +; +; Alternative pressure sensor +; ----------- +; MS5837 read address (8-Bit): 0xED +; MS5837 write address (8-Bit): 0xEC ; ; @@ -49,21 +59,13 @@ #include "wait.inc" #include "math.inc" #include "eeprom_rs232.inc" - + ;============================================================================= i2c CODE ;============================================================================= -;----------------------------------------------------------------------------- -; Helper Function - send 1 Byte, wait for end of transmission and check ackn -; -I2C_TX: - movwf SSP1BUF ; put byte to be sent into TX buffer - rcall WaitMSSP ; wait for TX to complete - bra I2C_Check_ACK ; check for acknowledge by receiver and return - ;----------------------------------------------------------------------------- ; Helper Function - get two Bytes and divide hi:lo/16 (signed) @@ -117,10 +119,11 @@ bra I2C_RX_accelerometer_compass1 ; YES ;bra I2C_RX_accelerometer_compass0 ; NO - compass0 then -I2C_RX_accelerometer_compass0: +;I2C_RX_accelerometer_compass0: bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x38 ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw 0x00 ; ?? rcall I2C_TX ; send byte @@ -178,13 +181,15 @@ incf hi,F ; YES - do it MOVII mpr,accel_DZ ; copy result to accel_DZ bsf SSP1CON2,PEN ; stop condition - bra WaitMSSP ; wait for TX to complete and return + rcall WaitMSSP ; wait for TX to complete + return I2C_RX_accelerometer_compass1: bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x3C ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw b'10101000' ; 0x28 with auto-increment (MSB=1) rcall I2C_TX ; send byte @@ -274,6 +279,7 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x32 ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw b'10101000' ; 0x28 with auto-increment (MSB=1) rcall I2C_TX ; send byte @@ -286,6 +292,7 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x3A ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw 0x28 ; 0x28 (OUT_X_L_A) rcall I2C_TX ; send byte @@ -320,10 +327,11 @@ bra I2C_RX_compass1 ; YES ;bra I2C_RX_compass0 ; NO - compass 0 then -I2C_RX_compass0: +;I2C_RX_compass0: bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x3C ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw 0x03 ; ?? rcall I2C_TX ; send byte @@ -395,6 +403,7 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x3C ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw b'10001000' ; 0x08 with auto-increment (MSB=1) rcall I2C_TX ; send byte @@ -440,14 +449,17 @@ movff SSP1BUF,hi ; data byte rcall I2C_TwoBytesRX_div8 ; divide hi, lo by 8 (signed) MOVII mpr,compass_DZ ; copy result - bsf SSP1CON2,PEN ; stop condition - bra WaitMSSP ; ... and return + bsf SSP1CON2,PEN ; stop condition + rcall WaitMSSP + return ; done + I2C_RX_compass2: ; compass type 2 bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x3C ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw 0xE8 ; 0x68 with auto-increment (MSB=1) rcall I2C_TX ; send byte @@ -492,13 +504,16 @@ ; rcall I2C_TwoBytesRX_div8 ; divide hi, lo by 8 (signed) MOVII mpr,compass_DZ ; copy result bsf SSP1CON2,PEN ; stop condition - bra WaitMSSP ; ...and return + rcall WaitMSSP + return ; done + I2C_RX_compass3: ; compass type 3 bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x3C ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw 0xA8 ; 0x28 with auto-increment (MSB=1) rcall I2C_TX ; send byte @@ -524,6 +539,7 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x3A ; address byte + write bit + movff WREG,i2c_error_vault+0 ; Store address movwf SSP1BUF ; control byte rcall WaitMSSP ; wait for TX to complete btfss SSP1CON2,ACKSTAT ; ACK received? @@ -538,6 +554,7 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x32 ; address byte + write bit + movff WREG,i2c_error_vault+0 ; Store address movwf SSP1BUF ; control byte rcall WaitMSSP ; wait for TX to complete btfss SSP1CON2,ACKSTAT ; ACK received? @@ -553,6 +570,7 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x3C ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw 0x0F ; ?? rcall I2C_TX ; send byte @@ -579,6 +597,7 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x3C ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw 0x00 ; ?? rcall I2C_TX ; send byte @@ -602,6 +621,7 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x38 ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw 0x0E ; XYZ_DATA_CFG rcall I2C_TX ; send byte @@ -633,13 +653,16 @@ movlw b'00110101' ; CTRL_REG1: 160 ms data rate, standby mode, reduced noise mode, active Mode rcall I2C_TX ; send byte bsf SSP1CON2,PEN ; stop condition - bra WaitMSSP ; wait for TX to complete and return + rcall WaitMSSP ; wait for TX to complete + return ; done + I2C_init_compass1: bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x3C ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw 0x9F ; 1F with auto-increment (MSB=1) rcall I2C_TX ; send byte @@ -675,7 +698,8 @@ movlw b'00000000' ; CTRL7 Continuous Mode rcall I2C_TX ; send byte bsf SSP1CON2,PEN ; stop condition - bra WaitMSSP ; wait for TX to complete and return + rcall WaitMSSP ; wait for TX to complete + return ; done ; accelerometer initializes along with magnetic sensor @@ -685,6 +709,7 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x3C ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw 0xE0 ; 0x60 with auto-increment (MSB=1) rcall I2C_TX ; send byte @@ -701,6 +726,7 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x32 ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw 0x9F ; 1F with auto-increment (MSB=1) rcall I2C_TX ; send byte @@ -717,7 +743,8 @@ ; movlw b'00000000' ; CTRL_REG5_A ; rcall I2C_TX ; send byte bsf SSP1CON2,PEN ; stop condition - bra WaitMSSP ; wait for TX to complete and return + rcall WaitMSSP ; wait for TX to complete + return ; done I2C_init_compass3: @@ -725,6 +752,7 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x3C ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw 0xA0 ; 0x20 with auto-increment (MSB=1) rcall I2C_TX ; send byte @@ -747,6 +775,7 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x3A ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw 0x20 rcall I2C_TX ; send byte @@ -759,8 +788,16 @@ movlw b'11001100' ; CTRL_REG4_A 0x23 rcall I2C_TX ; send byte bsf SSP1CON2,PEN ; stop condition - bra WaitMSSP ; wait for TX to complete and return + rcall WaitMSSP ; wait for TX to complete + return ; done +;----------------------------------------------------------------------------- +; Helper Function - send 1 Byte, wait for end of transmission and check ackn +; +I2C_TX: + movwf SSP1BUF ; put byte to be sent into TX buffer + rcall WaitMSSP ; wait for TX to complete + bra I2C_Check_ACK ; check for acknowledge by receiver and return ;----------------------------------------------------------------------------- ; Deactivate Compass / Accelerometer @@ -784,6 +821,7 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x3C ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw 0x00 ; ?? rcall I2C_TX ; send byte @@ -801,19 +839,22 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x38 ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw 0x2A ; CTRL_REG1 rcall I2C_TX ; send byte movlw b'00000000' ; standby mode rcall I2C_TX ; send byte bsf SSP1CON2,PEN ; stop condition - bra WaitMSSP ; wait for TX to complete and return + rcall WaitMSSP ; wait for TX to complete + return ; done I2C_sleep_compass1: bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x3C ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw 0x20 ; CTRL_REG1 rcall I2C_TX ; send byte @@ -830,7 +871,8 @@ movlw b'00000010' ; data for CTRL_REG7: magnetic sensor power-down mode rcall I2C_TX ; send byte bsf SSP1CON2,PEN ; stop condition - bra WaitMSSP ; wait for TX to complete and return + rcall WaitMSSP ; wait for TX to complete + return ; done ; accelerometer sleeps with magnetic sensor @@ -840,6 +882,7 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x3C ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw 0xE0 ; 0x60 with auto-increment (MSB=1) rcall I2C_TX ; send byte @@ -858,6 +901,7 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x32 ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw 0x9F ; 1F with auto-increment (MSB=1) rcall I2C_TX ; send byte @@ -866,7 +910,8 @@ movlw b'00000000' ; CTRL_REG1_A 0x20 (all off) rcall I2C_TX ; send byte bsf SSP1CON2,PEN ; stop condition - bra WaitMSSP ; wait for TX to complete and return + rcall WaitMSSP ; wait for TX to complete + return ; done I2C_sleep_compass3: @@ -874,6 +919,7 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x3C ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw 0xA2 ; 0x22 with auto-increment (MSB=1) rcall I2C_TX ; send byte @@ -886,19 +932,22 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x3A ; address + movff WREG,i2c_error_vault+0 ; Store address rcall I2C_TX ; send byte movlw 0x20 rcall I2C_TX ; send byte movlw b'00000000' ; CTRL_REG1_A (100Hz, x,y,z = OFF) 0x20 rcall I2C_TX ; send byte bsf SSP1CON2,PEN ; stop condition - bra WaitMSSP ; wait for TX to complete and return + rcall WaitMSSP ; wait for TX to complete + return ; done ;----------------------------------------------------------------------------- ; Helper Function - wait for TX to complete ; WaitMSSP: + movff SSP1BUF,i2c_error_vault+1 clrf i2c_temp1 ; wait for max 256 loops WaitMSSP_loop: decfsz i2c_temp1,F ; decrement loop counter, timeout? @@ -929,6 +978,8 @@ bcf PIR1,SSP1IF ; clear TX completion flag bsf i2c_error_flag ; set error flag bcf active_reset_ostc_rx ; release reset from RX circuitry +; bcf i2c_busy_temperature +; bcf i2c_busy_pressure return ; done @@ -972,7 +1023,7 @@ movwf SSP1CON1 ; ... movlw b'00000000' ; ... movwf SSP1CON2 ; ... - movlw 0x9C ; ... + movlw i2c_speed_value movwf SSP1ADD ; ... return ; done @@ -1007,7 +1058,8 @@ rcall WaitMSSP ; wait for TX to complete rcall I2C_Check_ACK ; check for acknowledge by receiver bsf SSP1CON2,PEN ; stop condition - bra WaitMSSP ; wait for TX to complete and return + rcall WaitMSSP ; wait for TX to complete + return ; done ;----------------------------------------------------------------------------- ; Sleep Gauge IC @@ -1021,7 +1073,8 @@ rcall WaitMSSP ; wait for TX to complete rcall I2C_Check_ACK ; check for acknowledge by receiver bsf SSP1CON2,PEN ; stop condition - bra WaitMSSP ; wait for TX to complete and return + rcall WaitMSSP ; wait for TX to complete + return ; done ;----------------------------------------------------------------------------- ; Read Gauge IC - Status Register @@ -1032,11 +1085,18 @@ movlw 0x00 ; point to status register rcall I2C_TX_GAUGE ; send byte to the LT2942 gauge IC rcall I2C_RX_GAUGE ; receive byte from the LT2942 Gauge IC + + bsf SSP1CON2,ACKDT ; set ACKDT flag + bsf SSP1CON2,ACKEN ; master NOT acknowledge + rcall WaitMSSP ; wait for TX to complete + bcf SSP1CON2,ACKDT ; reset ACKDT flag + movff SSP1BUF,WREG ; copy received byte to WREG btfss WREG,7 ; 2942 found? bsf battery_gauge_available ; YES - set flag bsf SSP1CON2,PEN ; stop condition - bra WaitMSSP ; wait for TX to complete and return + rcall WaitMSSP ; wait for TX to complete + return ; done ;----------------------------------------------------------------------------- @@ -1053,9 +1113,14 @@ bsf SSP1CON2,RCEN ; enable receive mode rcall WaitMSSP ; wait for TX to complete movff SSP1BUF,xA+0 ; copy received byte to xA+0 + bsf SSP1CON2,ACKDT ; set ACKDT flag + bsf SSP1CON2,ACKEN ; master NOT acknowledge + rcall WaitMSSP ; wait for TX to complete + bcf SSP1CON2,ACKDT ; reset ACKDT flag + bsf SSP1CON2,PEN ; stop condition rcall WaitMSSP ; wait for TX to complete - + ; convert voltage from raw value to Volt MOVLI .6000,xB ; load conversion multiplicand into xB call mult16x16 ; xC = xA * xB -> multiply raw value in xA with conversion multiplicand @@ -1074,14 +1139,19 @@ global lt2942_get_temperature lt2942_get_temperature: ; read battery temperature movlw 0x0C ; point to temperature register - call I2C_TX_GAUGE ; send byte to the LT2942 gauge IC - call I2C_RX_GAUGE ; receive byte from the LT2942 Gauge IC + rcall I2C_TX_GAUGE ; send byte to the LT2942 gauge IC + rcall I2C_RX_GAUGE ; receive byte from the LT2942 Gauge IC bsf SSP1CON2,ACKEN ; master acknowledge rcall WaitMSSP ; wait for TX to complete movff SSP1BUF,xA+1 ; store raw temperature, high byte bsf SSP1CON2,RCEN ; enable receive mode rcall WaitMSSP ; wait for TX to complete movff SSP1BUF,xA+0 ; store raw temperature, low byte + bsf SSP1CON2,ACKDT ; set ACKDT flag + bsf SSP1CON2,ACKEN ; master NOT acknowledge + rcall WaitMSSP ; wait for TX to complete + bcf SSP1CON2,ACKDT ; reset ACKDT flag + bsf SSP1CON2,PEN ; stop condition rcall WaitMSSP ; wait for TX to complete @@ -1147,12 +1217,16 @@ bsf SSP1CON2,RCEN ; enable receive mode rcall WaitMSSP ; wait for TX to complete movff SSP1BUF,sub_a+0 ; copy received byte to sub_a+0 + bsf SSP1CON2,ACKDT ; set ACKDT flag + bsf SSP1CON2,ACKEN ; master NOT acknowledge + rcall WaitMSSP ; wait for TX to complete + bcf SSP1CON2,ACKDT ; reset ACKDT flag + bsf SSP1CON2,PEN ; stop condition rcall WaitMSSP ; wait for TX to complete btfsc gauge_status_byte,0 ; UVLO event ? rcall lt2942_init_again ; YES - do an re-initialization - MOVII sub_a,battery_accumulated_charge ; save raw value ; Compute batt_percent = (charge - battery_offset) / 365 @@ -1182,7 +1256,8 @@ rcall WaitMSSP ; wait for TX to complete rcall I2C_Check_ACK ; check for acknowledge by receiver bsf SSP1CON2,PEN ; stop condition - bra WaitMSSP ; wait for TX to complete and return + rcall WaitMSSP ; wait for TX to complete + return ; done ;----------------------------------------------------------------------------- @@ -1199,7 +1274,8 @@ rcall WaitMSSP ; wait for TX to complete rcall I2C_Check_ACK ; check for acknowledge by receiver bsf SSP1CON2,PEN ; stop condition - bra WaitMSSP ; wait for TX to complete and return + rcall WaitMSSP ; wait for TX to complete + return ; done ;----------------------------------------------------------------------------- @@ -1209,7 +1285,8 @@ movwf i2c_temp2 ; save data byte to be sent bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete - movlw b'11001000' ; address byte + Write bit + movlw 0xC8 ; address byte + Write bit + movff WREG,i2c_error_vault+0 ; Store address movwf SSP1BUF ; control byte rcall WaitMSSP ; wait for TX to complete rcall I2C_Check_ACK ; check for acknowledge by receiver @@ -1221,9 +1298,10 @@ ; Helper Function - receive 1 Byte from the LT2942 Gauge IC ; I2C_RX_GAUGE: - bsf SSP1CON2,SEN ; start condition + bsf SSP1CON2,RSEN ; repeated start condition rcall WaitMSSP ; wait for TX to complete - movlw b'11001001' ; address byte + Read bit + movlw 0xC9 ; address byte + Read bit + movff WREG,i2c_error_vault+0 ; Store address movwf SSP1BUF ; control byte rcall WaitMSSP ; wait for TX to complete rcall I2C_Check_ACK ; check for acknowledge by receiver @@ -1280,6 +1358,7 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x50 ; address byte + write bit + movff WREG,i2c_error_vault+0 ; Store address movwf SSP1BUF ; control byte rcall WaitMSSP ; wait for TX to complete btfss SSP1CON2,ACKSTAT ; ACK received? @@ -1290,7 +1369,6 @@ return ; NO - done WAITMS .1 ; wait 1 ms - bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x50 ; address byte + write bit @@ -1327,7 +1405,7 @@ bcf SSP1CON2,ACKDT ; reset ACKDT flag bsf SSP1CON2,PEN ; stop condition rcall WaitMSSP ; wait for TX to complete - + ; wait for TR module becoming ready movff rx_firmware_cur_minor,i2c_temp1 ; copy minor firmware version to bank common movlw .147 ; code for not ready, minor @@ -1356,6 +1434,7 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x50 ; address byte + write bit + movff WREG,i2c_error_vault+0 ; Store address movwf SSP1BUF ; control byte rcall WaitMSSP ; wait for TX to complete rcall I2C_Check_ACK ; check for acknowledge by receiver @@ -1396,7 +1475,9 @@ rcall WaitMSSP ; wait for TX to complete bcf SSP1CON2,ACKDT ; reset ACKDT flag bsf SSP1CON2,PEN ; stop condition - bra WaitMSSP ; wait for TX to complete and return + rcall WaitMSSP ; wait for TX to complete + return ; done + ;----------------------------------------------------------------------------- @@ -1415,6 +1496,7 @@ bsf SSP1CON2,SEN ; start condition rcall WaitMSSP ; wait for TX to complete movlw 0x50 ; address byte + write bit + movff WREG,i2c_error_vault+0 ; Store address movwf SSP1BUF ; control byte rcall WaitMSSP ; wait for TX to complete rcall I2C_Check_ACK ; check for acknowledge by receiver @@ -1489,7 +1571,224 @@ ENDIF ; _rx_update ENDIF ; _rx_functions - + ;----------------------------------------------------------------------------- +; Probe for MS5837 sensor +; + global I2C_probe_pressure_sensor ; Do not call from ISR! +I2C_probe_pressure_sensor: ; Probe the type of sensor, set/clear press_sensor_type + bcf press_sensor_type ; MS5541 as default + bsf SSP1CON2,SEN ; start condition + rcall WaitMSSP ; wait for TX to complete + movlw 0xEC ; address byte + write bit + movff WREG,i2c_error_vault+0 ; Store address + movwf SSP1BUF ; control byte + rcall WaitMSSP ; wait for TX to complete + btfss SSP1CON2,ACKSTAT ; ACK received? + bsf press_sensor_type ; MS5837 sensor found + bsf SSP1CON2,PEN ; stop condition + rcall WaitMSSP ; wait for TX to complete + return + +;-------------------------------------------------------------------- +; Helper Function - get the calibration parameter from # WREG address +; Do not call from ISR! +I2C_get_calib_parameter: + movwf lo ; store address + bsf SSP1CON2,SEN ; start condition + rcall WaitMSSP ; wait for TX to complete + movlw 0xEC ; address byte + write bit + movff WREG,i2c_error_vault+0 ; Store address + rcall I2C_TX ; send byte + movf lo,W ; Point to calibration register + rcall I2C_TX ; send byte + bsf SSP1CON2,PEN ; stop condition + rcall WaitMSSP ; wait for TX to complete + + bsf SSP1CON2,SEN ; start condition + rcall WaitMSSP ; wait for TX to complete + movlw 0xED ; address byte + read bit + movff WREG,i2c_error_vault+0 ; Store address + movwf SSP1BUF ; control byte + rcall WaitMSSP ; wait for TX to complete + rcall I2C_Check_ACK ; check for acknowledge by receiver + bsf SSP1CON2,RCEN ; enable receive mode + rcall WaitMSSP ; wait for reception and return + movff SSP1BUF,dMSB ; High byte + bsf SSP1CON2,ACKEN ; master acknowledge + rcall WaitMSSP ; wait for TX to complete + + bsf SSP1CON2,RCEN ; enable receive mode + rcall WaitMSSP ; wait for reception + movff SSP1BUF,dLSB ; Low byte +; bsf SSP1CON2,ACKDT ; set ACKDT flag + bsf SSP1CON2,ACKEN ; master acknowledge + rcall WaitMSSP ; wait for TX to complete +; bcf SSP1CON2,ACKDT ; reset ACKDT flag + bsf SSP1CON2,PEN ; stop condition + bra WaitMSSP ; wait for TX to complete (And return) + + + global I2C_get_calib_MS5837 ; Do not call from ISR! +I2C_get_calib_MS5837: + banksel common + ; first, send a reset + bsf SSP1CON2,SEN ; start condition + rcall WaitMSSP ; wait for TX to complete + movlw 0xEC ; address byte + write bit + movff WREG,i2c_error_vault+0 ; Store address + rcall I2C_TX ; send byte + movlw 0x1E + rcall I2C_TX ; send byte + bsf SSP1CON2,PEN ; stop condition + rcall WaitMSSP ; wait for TX to complete + WAITMS .5 ; 2.8ms according to datasheet + + movlw 0xA2 ; Point to C1 + rcall I2C_get_calib_parameter ; returns calibration value in lo and hi + movff dLSB,C1+0 ; store calib + movff dMSB,C1+1 ; store calib + movlw 0xA4 ; Point to C2 + rcall I2C_get_calib_parameter ; returns calibration value in lo and hi + movff dLSB,C2+0 ; store calib + movff dMSB,C2+1 ; store calib + + movlw 0xA6 ; Point to C3 + rcall I2C_get_calib_parameter ; returns calibration value in lo and hi + movff dLSB,C3+0 ; store calib + movff dMSB,C3+1 ; store calib + + movlw 0xA8 ; Point to C4 + rcall I2C_get_calib_parameter ; returns calibration value in lo and hi + movff dLSB,C4+0 ; store calib + movff dMSB,C4+1 ; store calib + + movlw 0xAA ; Point to C5 + rcall I2C_get_calib_parameter ; returns calibration value in lo and hi + movff dLSB,C5+0 ; store calib + movff dMSB,C5+1 ; store calib + + movlw 0xAC ; Point to C6 + rcall I2C_get_calib_parameter ; returns calibration value in lo and hi + movff dLSB,C6+0 ; store calib + movff dMSB,C6+1 ; store calib + + return + + global I2C_get_press_val_MS5837 +I2C_get_press_val_MS5837: + bsf i2c_busy_pressure ; reading new pressure + + bsf SSP1CON2,SEN ; start condition + rcall WaitMSSP ; wait for TX to complete + movlw 0xEC ; address byte + write bit + movff WREG,i2c_error_vault+0 ; Store address + rcall I2C_TX ; send byte + movlw 0x00 ; command byte (0x00, read ADC) + rcall I2C_TX ; send byte + + bsf SSP1CON2,RSEN ; repeated start condition + rcall WaitMSSP ; wait for TX to complete + movlw 0xED ; address byte + read bit + movff WREG,i2c_error_vault+0 ; Store address + movwf SSP1BUF ; control byte + rcall WaitMSSP ; wait for TX to complete + rcall I2C_Check_ACK ; check for acknowledge by receiver + + bsf SSP1CON2,RCEN ; enable receive mode + rcall WaitMSSP ; wait for reception and return + movff SSP1BUF,D1_buffer+2 ; Upper byte + bsf SSP1CON2,ACKEN ; master acknowledge + rcall WaitMSSP ; wait for TX to complete + bsf SSP1CON2,RCEN ; enable receive mode + rcall WaitMSSP ; wait for reception + movff SSP1BUF,D1_buffer+1 ; high byte + bsf SSP1CON2,ACKEN ; master acknowledge + rcall WaitMSSP ; wait for TX to complete + bsf SSP1CON2,RCEN ; enable receive mode + rcall WaitMSSP ; wait for reception + movff SSP1BUF,D1_buffer+0 ; Low byte + bsf SSP1CON2,ACKEN ; master acknowledge + rcall WaitMSSP ; wait for TX to complete + bsf SSP1CON2,PEN ; stop condition + rcall WaitMSSP ; wait for TX to complete + + ; Start temperature measurement + bsf SSP1CON2,SEN ; start condition + rcall WaitMSSP ; wait for TX to complete + movlw 0xEC ; address byte + write bit + rcall I2C_TX ; send byte + movlw 0x58 ; OSR=4096, type=D2 + rcall I2C_TX ; send byte + bsf SSP1CON2,PEN ; stop condition + rcall WaitMSSP ; wait for TX to complete + bcf ms5837_state ; =0: result of temperature will be in the ADC + bcf i2c_busy_pressure ; reading new pressure + return + + global I2C_get_temp_val_MS5837 +I2C_get_temp_val_MS5837: + bsf i2c_busy_temperature ; reading new temperature + + bsf SSP1CON2,SEN ; start condition + rcall WaitMSSP ; wait for TX to complete + movlw 0xEC ; address byte + write bit + movff WREG,i2c_error_vault+0 ; Store address + rcall I2C_TX ; send byte + movlw 0x00 ; command byte (0x00, read ADC) + rcall I2C_TX ; send byte + + bsf SSP1CON2,RSEN ; repeated start condition + rcall WaitMSSP ; wait for TX to complete + movlw 0xED ; address byte + read bit + movff WREG,i2c_error_vault+0 ; Store address + movwf SSP1BUF ; control byte + rcall WaitMSSP ; wait for TX to complete + rcall I2C_Check_ACK ; check for acknowledge by receiver + + bsf SSP1CON2,RCEN ; enable receive mode + rcall WaitMSSP ; wait for reception and return + movff SSP1BUF,D2_buffer+2 ; Upper byte + bsf SSP1CON2,ACKEN ; master acknowledge + rcall WaitMSSP ; wait for TX to complete + bsf SSP1CON2,RCEN ; enable receive mode + rcall WaitMSSP ; wait for reception + movff SSP1BUF,D2_buffer+1 ; high byte + bsf SSP1CON2,ACKEN ; master acknowledge + rcall WaitMSSP ; wait for TX to complete + bsf SSP1CON2,RCEN ; enable receive mode + rcall WaitMSSP ; wait for reception + movff SSP1BUF,D2_buffer+0 ; Low byte + bsf SSP1CON2,ACKEN ; master acknowledge + rcall WaitMSSP ; wait for TX to complete + bsf SSP1CON2,PEN ; stop condition + rcall WaitMSSP ; wait for TX to complete + + ; Start pressure measurement + bsf SSP1CON2,SEN ; start condition + rcall WaitMSSP ; wait for TX to complete + movlw 0xEC ; address byte + write bit + rcall I2C_TX ; send byte + movlw 0x48 ; OSR=4096, type=D1 + rcall I2C_TX ; send byte + bsf SSP1CON2,PEN ; stop condition + rcall WaitMSSP ; wait for TX to complete + bsf ms5837_state ; =0: result of pressure will be in the ADC + bcf i2c_busy_temperature ; reading new temperature + return + + +;----------------------------------------------------------------------------- +; I2C Bus error checker +; + global check_i2c_error + extern TFT_message_i2c_error +check_i2c_error: + btfss i2c_error_flag + return + incf message_counter,F ; increase message counter + goto TFT_message_i2c_error ; show message for battery low (battery percent) and return + +;----------------------------------------------------------------------------- END diff -r a9a0188091e4 -r 7d8a4c60ec1a src/i2c.inc --- a/src/i2c.inc Thu Jan 14 16:24:07 2021 +0100 +++ b/src/i2c.inc Mon May 24 18:40:53 2021 +0200 @@ -34,4 +34,10 @@ IFDEF _compass extern I2C_RX_compass - ENDIF \ No newline at end of file + ENDIF + + extern I2C_probe_pressure_sensor ; Probe the type of sensor, set/clear press_sensor_type + extern I2C_get_calib_MS5837 ; Read C1 to C6 + extern I2C_get_press_val_MS5837 + extern I2C_get_temp_val_MS5837 + extern check_i2c_error \ No newline at end of file diff -r a9a0188091e4 -r 7d8a4c60ec1a src/isr.asm --- a/src/isr.asm Thu Jan 14 16:24:07 2021 +0100 +++ b/src/isr.asm Mon May 24 18:40:53 2021 +0200 @@ -323,6 +323,15 @@ movlw .248 ; reload timer 7, high byte (8x256 ticks -> 62.5 ms) movwf TMR7H ; ... (keep low byte running ) + banksel isr_backup ; back to ISR default bank + decfsz isr_tmr7_helper,F ; decreased every 62,5ms + bra isr_tmr7_0 + movlw .4 ; 62,5ms * 4 = 1/4 second + movwf isr_tmr7_helper + bsf trigger_quarter_second ; set flag (In access RAM) + + +isr_tmr7_0: btfss update_surface_pressure ; shall update the surface pressure? bra isr_tmr7_1 ; NO - skip bcf update_surface_pressure ; YES - clear request flag @@ -390,9 +399,6 @@ ENDIF ; _external_sensor isr_sensor_state2: - btfss sensor_state_counter,0 ; every 1/4 second - bsf trigger_quarter_second ; set flag - btfss speed_is_normal ; CPU running on normal speed? rcall isr_set_speed_to_normal ; NO - set CPU speed to normal @@ -429,15 +435,17 @@ call calculate_compensation ; calculate temperature compensated pressure (27 us) ; build average for pressure - bcf STATUS,C ; clear carry bit - rrcf pressure_abs_avg+1 ; divide by 2 + ;bcf STATUS,C ; clear carry bit - not needed since we don't use the +2 register later + rrcf pressure_abs_avg+2 ; divide by 2 + rrcf pressure_abs_avg+1 ; ... rrcf pressure_abs_avg+0 ; ... - bcf STATUS,C ; clear carry bit - rrcf pressure_abs_avg+1 ; divide by 2, again + ;bcf STATUS,C ; clear carry bit - not needed since we don't use the +2 register later + rrcf pressure_abs_avg+2 ; divide by 2, again + rrcf pressure_abs_avg+1 ; ... rrcf pressure_abs_avg+0 ; ... ; export averaged pressure - MOVII pressure_abs_avg,pressure_abs ; export result + MOVII pressure_abs_avg,pressure_abs ; export result (Which is 16 bit for all depths < 262m) ; build average for temperature bcf STATUS,C ; clear carry bit by default @@ -541,11 +549,13 @@ bra sensor_int_state_exit ; done sensor_int_state1_plus_restart: - CLRI pressure_abs_avg ; clear average register for pressure + clrf pressure_abs_avg+0 ; clear pressure average register + clrf pressure_abs_avg+1 + clrf pressure_abs_avg+2 CLRI temperature_avg ; clear average register for temperature sensor_int_state1: - call get_temperature_value ; state 1: get temperature... + call get_temperature_value ; state 1: get temperature... call get_pressure_start ; ...and start pressure integration bra sensor_int_state_exit @@ -891,7 +901,7 @@ isr_switch_right: bcf INTCON,INT0IE ; disable external interrupt 0 - btfsc button_hold_down_allowed,A ; ignore for mechanical push buttons + btfsc button_hold_down_allowed ; ignore for mechanical push buttons bra isr_switch_right2 btfsc T4CON,TMR4ON ; Timer4 running? bra timer4_restart ; Yes, restart @@ -906,7 +916,7 @@ isr_switch_left: bcf INTCON3,INT1IE ; disable external interrupt 1 - btfsc button_hold_down_allowed,A ; ignore for mechanical push buttons + btfsc button_hold_down_allowed ; ignore for mechanical push buttons bra isr_switch_left2 btfsc T4CON,TMR4ON ; Timer4 running? bra timer4_restart ; Yes, restart @@ -919,7 +929,7 @@ ;bra isr_switch_common ; continue with common part isr_switch_common: - btfss button_hold_down_allowed,A ; ignore for mechanical push buttons + btfss button_hold_down_allowed ; ignore for mechanical push buttons bsf T4CON,TMR4ON ; Start timer 4 btfsc tmr5_preemtion_allowed ; timer 5 preemption allowed? diff -r a9a0188091e4 -r 7d8a4c60ec1a src/math.asm --- a/src/math.asm Thu Jan 14 16:24:07 2021 +0100 +++ b/src/math.asm Mon May 24 18:40:53 2021 +0200 @@ -346,6 +346,9 @@ addwfc isr_xC+3,F ; ... return ; done +;============================================================================= +math12 CODE +;============================================================================= ;----------------------------------------------------------------------------- ; Multiply two SIGNED 16 Bit Integers: isr_xC = isr_xA * isr_xB @@ -355,7 +358,7 @@ global isr_signed_mult16x16 isr_signed_mult16x16: ; do an unsigned multiplication first - rcall isr_unsigned_mult16x16 + call isr_unsigned_mult16x16 ; manage sign extension of operand B btfss isr_xB+1,7 ; is B negative ? @@ -364,7 +367,7 @@ subwf isr_xC+2,F ; - ... movf isr_xA+1,W ; - ... subwfb isr_xC+3,F ; - ... -isr_signed_mult_checkA ; manage sign extension of operand B +isr_signed_mult_checkA: ; manage sign extension of operand B btfss isr_xA+1,7 ; is A negative ? return ; NO - done movf isr_xB+0,W ; YES - add -65536 * B @@ -373,6 +376,237 @@ subwfb isr_xC+3,F ; - ... return ; - done +;============================================================================= +math13 CODE +;============================================================================= + +;----------------------------------------------------------------------------- +; Multiply two UNSIGNED 24 Bit Integers: isr_xC = isr_xA * isr_xB +; +; trashes PRODL, PRODH, WREG +; + global isr_unsigned_mult24x24 +isr_unsigned_mult24x24: + call isr_unsigned_mult16x16 ; Do the 16x16 first + clrf isr_xC+4 + clrf isr_xC+5 ; clear upper 16 bit + ; do the remaining three multiplications + movf isr_xA+0,W ; multiply a[0] * b[2] + mulwf isr_xB+2 ; ... + movf PRODL,W ; add cross product to c[4]:c[3]:c[2] + addwf isr_xC+2,F ; ... + movf PRODH,W ; ... + addwfc isr_xC+3,F ; propagate carry + clrf WREG ; ... + addwfc isr_xC+4,F ; ... + addwfc isr_xC+5,F ; ... + + movf isr_xA+2,W ; multiply a[2] * b[0] + mulwf isr_xB+0 ; ... + movf PRODL,W ; add cross product to c[4]:c[3]:c[2] + addwf isr_xC+2,F ; ... + movf PRODH,W ; ... + addwfc isr_xC+3,F ; propagate carry + clrf WREG ; ... + addwfc isr_xC+4,F ; ... + addwfc isr_xC+5,F ; ... + ; isr_xC[2] done. + + movf isr_xA+2,W ; multiply a[2] * b[1] + mulwf isr_xB+1 ; ... + movf PRODL,W ; add cross product to c[5]:c[4]:c[3] + addwf isr_xC+3,F ; ... + movf PRODH,W ; ... + addwfc isr_xC+4,F ; propagate carry + clrf WREG ; ... + addwfc isr_xC+5,F ; ... + + movf isr_xA+1,W ; multiply a[1] * b[2] + mulwf isr_xB+2 ; ... + movf PRODL,W ; add cross product to c[5]:c[4]:c[3] + addwf isr_xC+3,F ; ... + movf PRODH,W ; ... + addwfc isr_xC+4,F ; propagate carry + clrf WREG ; ... + addwfc isr_xC+5,F ; ... + ; isr_xC[3] done. + + movf isr_xA+2,W ; multiply a[2] * b[2] + mulwf isr_xB+2 ; ... + movf PRODL,W ; add cross product to c[5]:c[4] + addwf isr_xC+4,F ; ... + movf PRODH,W ; ... + addwfc isr_xC+5,F ; propagate carry + ; isr_xC[4] done. + ; isr_xC[5] done. + + return ; done + +;============================================================================= +math14 CODE +;============================================================================= + +;----------------------------------------------------------------------------- +; Multiply two UNSIGNED Integers (32 and 24 Bit): isr_xC = isr_xA * isr_xB +; +; trashes PRODL, PRODH, WREG +; + global isr_unsigned_mult32x24 +isr_unsigned_mult32x24: + call isr_unsigned_mult24x24 ; Do the 24x24 first + clrf isr_xC+6 ; clear upper 8 bit + ; do the remaining three multiplications + movf isr_xA+3,W ; multiply a[3] * b[0] + mulwf isr_xB+0 ; ... + movf PRODL,W ; add cross product to c[5]:c[4]:c[3] + addwf isr_xC+3,F ; ... + movf PRODH,W ; ... + addwfc isr_xC+4,F ; propagate carry + clrf WREG ; ... + addwfc isr_xC+5,F ; ... + addwfc isr_xC+6,F ; ... + ; isr_xC[3] done. + + movf isr_xA+3,W ; multiply a[3] * b[1] + mulwf isr_xB+1 ; ... + movf PRODL,W ; add cross product to c[5]:c[4] + addwf isr_xC+4,F ; ... + movf PRODH,W ; ... + addwfc isr_xC+5,F ; propagate carry + clrf WREG ; ... + addwfc isr_xC+6,F ; ... + ; isr_xC[4] done. + + movf isr_xA+3,W ; multiply a[3] * b[2] + mulwf isr_xB+2 ; ... + movf PRODL,W ; add cross product to c[5]:c[4] + addwf isr_xC+5,F ; ... + movf PRODH,W ; ... + addwfc isr_xC+6,F ; propagate carry + ; isr_xC[5] done. + ; isr_xC[6] done. + return ; done + + +;============================================================================= +math15 CODE +;============================================================================= + +;----------------------------------------------------------------------------- +; Multiply two SIGNED 24 Bit Integers: isr_xC = isr_xA * isr_xB +; +; trashes PRODL, PRODH, WREG +; + global isr_signed_mult24x24 +isr_signed_mult24x24: + ; do an unsigned multiplication first + call isr_unsigned_mult24x24 + + ; manage sign extension of operand B + btfss isr_xB+2,7 ; is B negative ? + bra isr_signed24_mult_checkA ; NO - continue checking operand A + movf isr_xA+0,W ; YES - add -16777216 * A + subwf isr_xC+3,F ; - ... + movf isr_xA+1,W ; - ... + subwfb isr_xC+4,F ; - ... + movf isr_xA+2,W ; - ... + subwfb isr_xC+5,F ; - ... +isr_signed24_mult_checkA: ; manage sign extension of operand B + btfss isr_xA+2,7 ; is A negative ? + return ; NO - done + movf isr_xB+0,W ; YES - add -16777216 * B + subwf isr_xC+3,F ; - ... + movf isr_xB+1,W ; - ... + subwfb isr_xC+4,F ; - ... + movf isr_xB+2,W ; - ... + subwfb isr_xC+5,F ; - ... + return + +;============================================================================= +math16 CODE +;============================================================================= + +;----------------------------------------------------------------------------- +; Divide two UNSIGNED 16 Bit Integers: isr_xC:2 = isr_xA:2 / isr_xB:2 with xA as remainder +; +; trashes WREG +; + global isr_div16x16 +isr_div16x16: + movlw .16 ; process 16 bits ... + movwf isr_math_loop ; ... initialize loop counter + movff isr_xA+0,isr_xC+0 ; copy isr_xA to isr_xC + movff isr_xA+1,isr_xC+1 ; ... + clrf isr_xA+0 ; clear isr_xA, will now be used to hold the remainder + clrf isr_xA+1 ; ... +isr_div16x16_1: + bcf STATUS,C ; clear carry flag to shift in a zero bit + rlcf isr_xC+0,F ; shift left isr_xC + rlcf isr_xC+1,F ; ... shifting MSB out of isr_xC... + rlcf isr_xA+0,F ; ... and into LSB of isr_xA + rlcf isr_xA+1,F ; ... + btfsc STATUS,C ; did the remainder overflow (carry set)? + bra isr_div16x16_2 ; YES - directly generate a result bit = 1 + movf isr_xB+0,W ; NO - compute remainder - divisor = isr_xA - isr_xB, trash result to WREG + subwf isr_xA+0,W ; - ... + movf isr_xB+1,W ; - ... + subwfb isr_xA+1,W ; - ... + btfss STATUS,C ; - remainder < divisor (-> borrow flag set, equals carry flag cleared) ? + bra isr_div16x16_3 ; YES - result bit = 0, keep LSB of isr_xC+0 being 0 +isr_div16x16_2: + bsf isr_xC+0,0 ; NO - result bit = 1, set LSB of isr_xC+0 to 1 + movf isr_xB+0,W ; - subtract divisor from remainder "for real": isr_xA = isr_xA - isr_xB + subwf isr_xA+0,F ; - ... + movf isr_xB+1,W ; - ... + subwfb isr_xA+1,F ; - ... +isr_div16x16_3: + decfsz isr_math_loop,F ; decrement loop counter, all bits done? + bra isr_div16x16_1 ; NO - loop + return ; YES - done + +;============================================================================= +math17 CODE +;============================================================================= + +;----------------------------------------------------------------------------- +; Divide a 32 Bit Integer by a 16 Bit Integer: isr_xC:4 = isr_xC:4 / isr_xB:2 with isr_xA as remainder +; +; trashes WREG +; + global isr_div32x16 +isr_div32x16: + movlw .32 ; process 32 bits ... + movwf isr_math_loop ; ... initialize loop counter + clrf isr_xA+0 ; clear isr_xA, will be used to hold the remainder + clrf isr_xA+1 ; ... +isr_div32x16_1: + bcf STATUS,C ; clear carry flag to shift in a zero bit + rlcf isr_xC+0,F ; shift left isr_xC + rlcf isr_xC+1,F ; ... + rlcf isr_xC+2,F ; ... + rlcf isr_xC+3,F ; ... shifting MSB out of isr_xC... + rlcf isr_xA+0,F ; ... and into LSB of isr_xA + rlcf isr_xA+1,F ; ... + btfsc STATUS,C ; did the remainder overflow (carry set)? + bra isr_div32x16_2 ; YES - directly generate a result bit = 1 + movf isr_xB+0,W ; NO - compute remainder - divisor = isr_xA - isr_xB, trash result to WREG + subwf isr_xA+0,W ; - ... + movf isr_xB+1,W ; - ... + subwfb isr_xA+1,W ; - ... + btfss STATUS,C ; - remainder < divisor (-> borrow flag set, equals carry flag cleared) ? + bra isr_div32x16_3 ; YES - result bit = 0, keep LSB of isr_xC+0 being 0 +isr_div32x16_2: + bsf isr_xC+0,0 ; NO - result bit = 1, set LSB of isr_xC+0 to 1 + movf isr_xB+0,W ; - subtract divisor from remainder "for real": isr_xA = isr_xA - isr_xB + subwf isr_xA+0,F ; - ... + movf isr_xB+1,W ; - ... + subwfb isr_xA+1,F ; - ... +isr_div32x16_3: + decfsz isr_math_loop,F ; decrement loop counter, all bits done? + bra isr_div32x16_1 ; NO - loop + return ; YES - done + + ;----------------------------------------------------------------------------- END \ No newline at end of file diff -r a9a0188091e4 -r 7d8a4c60ec1a src/math.inc --- a/src/math.inc Thu Jan 14 16:24:07 2021 +0100 +++ b/src/math.inc Mon May 24 18:40:53 2021 +0200 @@ -90,12 +90,31 @@ ; extern isr_unsigned_mult16x16 ; isr_xC = isr_xA * isr_xB ; trashes PRODL, PRODH, WREG - - +;----------------------------------------------------------------------------- +; MULTIPLICATION with UNSIGNED values +; + extern isr_unsigned_mult24x24 ; isr_xC = isr_xA * isr_xB + ; trashes PRODL, PRODH, WREG + extern isr_unsigned_mult32x24 ; isr_xC = isr_xA * isr_xB + ; trashes PRODL, PRODH, WREG + ;----------------------------------------------------------------------------- ; MULTIPLICATION with SIGNED values ; extern isr_signed_mult16x16 ; isr_xC = isr_xA * isr_xB ; trashes PRODL, PRODH, WREG + + extern isr_signed_mult24x24 -;----------------------------------------------------------------------------- \ No newline at end of file +;----------------------------------------------------------------------------- + +; DIVISION with UNSIGNED values +; + extern isr_div16x16 ; isr_xC:2 = isr_xA:2 / isr_xB:2 with isr_xA as remainder + ; trashes xB, WREG + +;----------------------------------------------------------------------------- +; DIVISION with UNSIGNED values +; + + extern isr_div32x16 ; isr_xC:4 = isr_xC:4 / isr_xB:2 with isr_xA as remainder diff -r a9a0188091e4 -r 7d8a4c60ec1a src/menu_processor.asm --- a/src/menu_processor.asm Thu Jan 14 16:24:07 2021 +0100 +++ b/src/menu_processor.asm Mon May 24 18:40:53 2021 +0200 @@ -69,12 +69,12 @@ VARARGS_GET8 menu_item_count ; get number of items VARARGS_GET8 menu_vertical_start ; get vertical start position of 1st menu item - movf menu_vertical_start,W ; excite flags, vertical start = 0, i.e. no menu title text? - bz menu_processor_no_title ; YES - skip reading menu title text address - +; movf menu_vertical_start,W ; excite flags, vertical start = 0, i.e. no menu title text? +; bz menu_processor_no_title ; YES - skip reading menu title text address +; VARARGS_GET16 menu_title_addr ; get address of menu title text -menu_processor_no_title: +;menu_processor_no_title: movff TBLPTRL, menu_item_data_start+0 ; store base address of menu items for menu_read_menu_item_data movff TBLPTRH, menu_item_data_start+1 ; ... @@ -91,7 +91,30 @@ ; draw a frame around the dive mode menu movf pallet_color_mask,W ; get mask color into WREG WIN_FRAME_COLOR dm_menu_row, dm_menu_lower, dm_menu_left ,dm_menu_right ; top, bottom, left, right - bra menu_processor_menu_body ; the dive mode menu has no menu title and footer + + btfss alt_layout_active ; big menu selected? + bra menu_processor_menu_body ; No, the normal dive mode menu has no title and footer + + ; draw menu title + WIN_BOX_BLACK dm_menu_row+.2,dm_menu_row+.26,dm_menu_left+.2,dm_menu_right-.2 ; clear menu title area + WIN_SMALL .2, dm_menu_row+.2 ; set menu title font and position + FONT_COLOR color_greenish ; set menu title font color + movff menu_title_addr+0,FSR1L ; point to multi-lingual menu title text + movff menu_title_addr+1,FSR1H ; ... + call strcpy_text_FSR ; copy translated text into the buffer + movf FSR2L,W ; get title text length + mullw .7 ; compute title length in pixels_x2 + bcf STATUS,C ; divide by 2 + rrcf PRODL ; ... + movf PRODL,W ; get result into WREG + sublw .80 ; compute 80 (screen center position) - half title width in pixel_x2 + movwf win_leftx2 ; set result as horizontal start position + movlw MAX_LINE_LENGTH_TITLE ; load max allowed length of a menu title + movwf FSR2L ; set buffer pointer to end of max length + clrf INDF2 ; terminate string at max length + PRINT ; output menu title + + bra menu_processor_menu_body ; the dive mode menu has no footer menu_processor_menu_title: ; prepare screen @@ -348,7 +371,7 @@ ;bra menu_draw_lines_divemode_big ; YES menu_draw_lines_divemode_big: - WIN_STD dm_menu_item1_column+.16,dm_menu_item1_row+.22 + WIN_STD dm_menu_item1_column+.16,dm_menu_item1_row+.28 decf menu_pos_cur,W ; get selected item as 0..5 into WREG movwf menu_item_start ; set first item to draw = selected item bra menu_draw_menu_items_common ; continue with common part @@ -523,7 +546,7 @@ ;bra menu_draw_cursor_dive_big ; YES menu_draw_cursor_dive_big: - WIN_STD dm_menu_item1_column,dm_menu_item1_row+.20 + WIN_STD dm_menu_item1_column,dm_menu_item1_row+.26 bra menu_draw_cursor_common ; print cursor ENDIF ; _big_divemenu diff -r a9a0188091e4 -r 7d8a4c60ec1a src/menu_processor.inc --- a/src/menu_processor.inc Thu Jan 14 16:24:07 2021 +0100 +++ b/src/menu_processor.inc Mon May 24 18:40:53 2021 +0200 @@ -53,7 +53,7 @@ ; ; nb_items number of menu items that will follow ; -MENU_BEGIN_DIVE MACRO nb_items +MENU_BEGIN_DIVE MACRO title_text_addr, nb_items items_target set nb_items items_count set 0 @@ -67,12 +67,13 @@ ENDIF ; store code for menu execution + extern title_text_addr ; 2 byte address of multi-lingual title text extern menu_processor call menu_processor ; store menu header data db nb_items, 0x00 ; number of items, encoding for no menu titel - + db low(title_text_addr), high(title_text_addr) ; address of multi-lingual title text ENDM diff -r a9a0188091e4 -r 7d8a4c60ec1a src/menu_tree.asm --- a/src/menu_tree.asm Thu Jan 14 16:24:07 2021 +0100 +++ b/src/menu_tree.asm Mon May 24 18:40:53 2021 +0200 @@ -1338,7 +1338,11 @@ output_hex ; print C5, high byte movff C5+0,WREG ; get C5, low byte output_hex ; print C5, low byte - return ; done + btfss press_sensor_type ; =1: pressure sensor MS5837, =0: Pressure sensor MS5541 + return ; MS5541, done + PUTC "*" + return ; MS5837, done + ;----------------------------------------------------------------------------- diff -r a9a0188091e4 -r 7d8a4c60ec1a src/ms5541.asm --- a/src/ms5541.asm Thu Jan 14 16:24:07 2021 +0100 +++ b/src/ms5541.asm Mon May 24 18:40:53 2021 +0200 @@ -11,7 +11,8 @@ #include "hwos.inc" ; Mandatory header #include "math.inc" ; Math routines - +#include "i2c.inc" +#include "shared_definitions.h" ; mailbox from/to p2_deco.c ms5541 CODE @@ -31,6 +32,9 @@ calculate_compensation: banksel isr_backup ; select bank ISR data + btfsc press_sensor_type ; New sensor found? + bra press_comp_ms5837 ; Yes, use MS5837 + ;---- pressure sensor compensation ; xdT = D2 - C5 (s16 range -11.400 .. +12.350) @@ -131,7 +135,7 @@ MOVII SENS,isr_xB ; sens --> B call isr_signed_mult16x16 ; C = A*B - movlw .13 ; 12 * 256 = 3328 + movlw .15 ; 15 * 256 = 3840 cpfslt C1+1 ; C1 > 3328 ? bra isr_shift_ms5541_30 ; YES - MS5541-30 movlw .12-.8 ; NO - MS5541: 12 bit shift = 1 byte + 4 bits @@ -144,7 +148,150 @@ addwf isr_xC+1,F ; ... movlw HIGH .1000 ; ... addwfc isr_xC+2,F ; ... + bra press_comp_done_common +press_comp_ms5837: + ; xdT = D2 - C5*2^8 + movlw .0 ; Low + subwf D2+0,W + movwf xdT+0 + movf C5+0,W ; High + subwfb D2+1,W + movwf xdT+1 + movf C5+1,W ; Upper + subwfb D2+2,W + movwf xdT+2 + ; xdT equals D2 - (C5*2^8) + + ; Calculate OFF = C2*2^16+(C4*xdT)/2^7 + movff C4+0,isr_xA+0 + movff C4+1,isr_xA+1 + clrf isr_xA+2 + movff xdT+0,isr_xB+0 + movff xdT+1,isr_xB+1 + movff xdT+2,isr_xB+2 + call isr_signed_mult24x24 ; C = A*B + ; isr_xC:6 equals (C4*xdT) + rlcf isr_xC+0,F + rlcf isr_xC+1,F + rlcf isr_xC+2,F + rlcf isr_xC+3,F + rlcf isr_xC+4,F + rlcf isr_xC+5,F + movff isr_xC+1,OFF+0 + movff isr_xC+2,OFF+1 + movff isr_xC+3,OFF+2 + movff isr_xC+4,OFF+3 + ; OFF equals (C4*xdT)/2^7 + movf C2+0,W + addwf OFF+2,F + movf C2+1,W + addwfc OFF+3,F + ; OFF equals C2*2^16+((C4*xdT)/2^7) + + ; Calculate SENS = C1*2^15 + (C3*xdT)/2^8 + MOVII C1,isr_xA + movlw LOW (.32768) + movwf isr_xB+0 + movlw HIGH (.32768) + movwf isr_xB+1 + call isr_unsigned_mult16x16 ; C = A*B + movff isr_xC+0,SENS+0 + movff isr_xC+1,SENS+1 + movff isr_xC+2,SENS+2 + movff isr_xC+3,SENS+3 ; 32bit copy + ; SENS equals C1*2^15 + movff C3+0,isr_xA+0 + movff C3+1,isr_xA+1 + clrf isr_xA+2 + movff xdT+0,isr_xB+0 + movff xdT+1,isr_xB+1 + movff xdT+2,isr_xB+2 + call isr_signed_mult24x24 ; C = A*B + ; isr_xC:6 equals (C3*xdT) + movf isr_xC+1,W + addwf SENS+0,F + movf isr_xC+2,W + addwfc SENS+1,F + movf isr_xC+3,W + addwfc SENS+2,F + movf isr_xC+4,W + addwfc SENS+3,F + ; SENS equals C1*2^15 + (C3*xdT)/2^8 + + ; Calculate PRESSURE = ((D1 * SENS) / 2^21) - OFF) / 2^13 + movff SENS+0,isr_xA+0 + movff SENS+1,isr_xA+1 + movff SENS+2,isr_xA+2 + movff SENS+3,isr_xA+3 + movff D1+0,isr_xB+0 + movff D1+1,isr_xB+1 + movff D1+2,isr_xB+2 + call isr_unsigned_mult32x24 ; C = A*B + ; isr_xC:7 equals D1*SENS + + ; devide isr_xC:7 / 2^21 -> shift right 21 times + movlw .21 +press_comp_ms5837_2: + bcf STATUS,C ; clear carry, needed for MS5837 use + rrcf isr_xC+6,F + rrcf isr_xC+5,F + rrcf isr_xC+4,F + rrcf isr_xC+3,F + rrcf isr_xC+2,F + rrcf isr_xC+1,F + rrcf isr_xC+0,F + decfsz WREG ; decrement loop counter, done? + bra press_comp_ms5837_2 ; NO - loop + ; isr_xC:6 equals (D1*SENS)/2^21 + + ; Calculate isr_xC:6-OFF + movf OFF+0,W ; Low + subwf isr_xC+0,F + movf OFF+1,W ; High + subwfb isr_xC+1,F + movf OFF+2,W ; Upper + subwfb isr_xC+2,F + movf OFF+3,W ; Extra + subwfb isr_xC+3,F + movlw .0 ; ultra + subwfb isr_xC+4,F + movlw .0 ; Hyper + subwfb isr_xC+5,F + ; isr_xC:5 is now isr_xC:4-OFF + + ; devide by 2^13 + ; devide isr_xC:6 / 2^13 -> shift right 13 times + movlw .13 +press_comp_ms5837_3: + bcf STATUS,C ; clear carry + rrcf isr_xC+5,F + rrcf isr_xC+4,F + rrcf isr_xC+3,F + rrcf isr_xC+2,F + rrcf isr_xC+1,F + rrcf isr_xC+0,F + decfsz WREG ; decrement loop counter, done? + bra press_comp_ms5837_3 ; NO - loop + ; isr_xC:4 equals pressure in .1 mbar + + movlw .10 + movwf isr_xB+0 + clrf isr_xB+1 + call isr_div32x16 ; isr_xC:4 = isr_xC:4 / isr_xB:2 with isr_xA as remainder + ; isr_xC:2 equals pressure in 1mbar + + ; subtract 20mbar from the final result + movlw .20 + subwf isr_xC+0,F + movlw .0 + subwfb isr_xC+1,F + + ; copy for compatibility of the next routines + movff isr_xC+1,isr_xC+2 + movff isr_xC+0,isr_xC+1 + +press_comp_done_common: ; continue here even with MS5837 ; add opt_pressure_adjust to result (SIGNED!) clrf isr_xC+0 ; prepare high byte for adjustment movff opt_pressure_adjust,WREG ; get low byte for adjustment (signed) @@ -256,9 +403,14 @@ addwf pressure_abs_avg+0,F ; pressure_abs_avg += current pressure, low byte movf isr_xC+2,W ; copy current absolute pressure to WREG, high byte addwfc pressure_abs_avg+1,F ; pressure_abs_avg += current pressure, high byte + movlw .0 + addwfc pressure_abs_avg+2,F ; pressure_abs_avg += current pressure, upper byte ;---- temperature sensor compensation + btfsc press_sensor_type ; New sensor found? + bra temp_comp_ms5837 ; Yes, use MS5837 + ; calculate temp = 200 + dT*(C6+100)/2^11 movlw LOW(.100) ; C6 + 100 --> A addwf C6+0,W ; ... @@ -276,7 +428,71 @@ addwf isr_xC+1,F ; ... movlw HIGH(.200) ; ... addwfc isr_xC+2,F ; ... + bra temp_comp_done_common +temp_comp_ms5837: + ; TEMP = 2000+((xdT * C6) / 2^23) + + ; xdT * C6 -> isr_xC:6 + movff C6+0,isr_xA+0 + movff C6+1,isr_xA+1 + clrf isr_xA+2 + movff xdT+0,isr_xB+0 + movff xdT+1,isr_xB+1 + movff xdT+2,isr_xB+2 + call isr_signed_mult24x24 ; A*B + + ; devide isr_xC:6 / 2^23 -> shift right 23 times + ; a special variant (again): We loose isr_xC+0 and isr_xC+1 anyway + ; and do not care about the inserted carry since we won't use isr_xC+5 + ; and we shift less then 8 bytes + movlw .23-.16 +temp_comp_ms5837_2: + rrcf isr_xC+5,F ; + rrcf isr_xC+4,F ; + rrcf isr_xC+3,F ; + rrcf isr_xC+2,F ; ... + decfsz WREG ; decrement loop counter, done? + bra temp_comp_ms5837_2 ; NO - loop + + ; only use +2 and +3 + movlw LOW(.2000) ; add 2000 + addwf isr_xC+2,F ; ... + movlw HIGH(.2000) ; ... + addwfc isr_xC+3,F ; ... + + ; devide by 10 for .1°C resolution + movlw .10 + movwf isr_xB+0 + clrf isr_xB+1 + movff isr_xC+2,isr_xA+0 + movff isr_xC+3,isr_xA+1 + + btfss isr_xC+3,7 ; check sign bit + bra temp_comp_ms5837_3 ; not negative... + ; negate isr_xA:2 to make it positive + comf isr_xA+1 ; 16 bit sign change + negf isr_xA+0 + btfsc STATUS,C ; - carry to propagate? + incf isr_xA+1,F ; YES - do it + +temp_comp_ms5837_3: + call isr_div16x16 ; isr_xC:2 = isr_xA:2 / isr_xB:2 + + btfss isr_xC+3,7 ; check sign bit again + bra temp_comp_ms5837_4 ; not negative... + ; negate result isr_xC:2 to make it negative again + comf isr_xC+1 ; 16 bit sign change + negf isr_xC+0 + btfsc STATUS,C ;- carry to propagate? + incf isr_xC+1,F ; YES - do it + +temp_comp_ms5837_4: + ; copy for compatibility of the next routines + movff isr_xC+1,isr_xC+2 + movff isr_xC+0,isr_xC+1 + +temp_comp_done_common: ; continue here even with MS5837 ; add opt_temperature_adjust to result (SIGNED!) clrf isr_xC+0 ; prepare high byte for adjustment movff opt_temperature_adjust,WREG ; get low byte for adjustment (signed) @@ -309,12 +525,13 @@ ; global get_pressure_start get_pressure_start: + btfsc press_sensor_type ; New sensor found? + return ; Yes, ignore routine rcall reset_MS5541 ; reset the chip movlw b'10100000' ; +3*high as start and 1+low as stop movwf dbuffer ; .... movlw d'12' ; send start command - rcall send_data_MS5541 ; ... - return ; done + bra send_data_MS5541 ; ... (And return) ;----------------------------------------------------------------------------- @@ -324,6 +541,8 @@ ; global get_pressure_value get_pressure_value: + btfsc press_sensor_type ; New sensor found? + bra get_pressure_value2 btfsc MS5541_miso ; conversion done? return ; NO - abort rcall get_2bytes_MS5541 ; YES - read result @@ -331,6 +550,14 @@ movff dLSB,D1+0 ; ... low byte second return ; done +get_pressure_value2: + btfsc i2c_busy_pressure ; currently updating pressure? + return ; Yes, skip update... + movff D1_buffer+0,D1+0 + movff D1_buffer+1,D1+1 + movff D1_buffer+2,D1+2 + return + ;----------------------------------------------------------------------------- ; Start Temperature Measurement @@ -339,12 +566,13 @@ ; global get_temperature_start get_temperature_start: + btfsc press_sensor_type ; New sensor found? + return ; Yes, ignore routine rcall reset_MS5541 ; reset chip movlw b'10010000' ; +3*high as start and 1+low as stop movwf dbuffer ; ... movlw d'12' ; send start command - rcall send_data_MS5541 ; ... - return ; done + bra send_data_MS5541 ; ... (And return) ;----------------------------------------------------------------------------- @@ -354,6 +582,8 @@ ; global get_temperature_value get_temperature_value: + btfsc press_sensor_type ; New sensor found? + bra get_temperature_value2 btfsc MS5541_miso ; conversion done? return ; NO - done rcall get_2bytes_MS5541 ; YES - read result @@ -361,6 +591,14 @@ movff dLSB,D2+0 ; ... low byte second return ; done +get_temperature_value2: + btfsc i2c_busy_temperature ; currently updating temperature? + return ; Yes, skip update... + movff D2_buffer+0,D2+0 + movff D2_buffer+1,D2+1 + movff D2_buffer+2,D2+2 + return + ;----------------------------------------------------------------------------- ; Retrieve Calibration Data @@ -370,8 +608,15 @@ global get_calibration_data get_calibration_data: banksel isr_backup ; select bank ISR data - bsf block_sensor_interrupt ; disable sensor interrupts + bsf block_sensor_interrupt ; disable sensor interrupts + btfsc press_sensor_type ; New sensor found? + call I2C_get_calib_MS5837 ; Yes, read C1 to C6 + banksel isr_backup ; select bank ISR data + + btfsc press_sensor_type ; New sensor found? + bra get_calibration_data2 ; Yes, skip to the end + rcall reset_MS5541 ; reset chip movlw b'01010100' ; +3*high as start and 1+low as stop @@ -545,6 +790,7 @@ movff ir_s8_buffer+6,C6+0 bcf C6+0,7 +get_calibration_data2: clrf sensor_state_counter ; reset state counter bcf block_sensor_interrupt ; re-enable sensor interrupts banksel common ; back to bank common diff -r a9a0188091e4 -r 7d8a4c60ec1a src/option_table.asm --- a/src/option_table.asm Thu Jan 14 16:24:07 2021 +0100 +++ b/src/option_table.asm Mon May 24 18:40:53 2021 +0200 @@ -147,7 +147,7 @@ OPTION_UINT8 oaGF_low, .10, .100, .30, tPercent, 0x023, 0x27, opt_aGF_low ; alternative GF low OPTION_UINT8 oaGF_high, .45, .110, .85, tPercent, 0x024, 0x28, opt_aGF_high ; alternative GF high OPTION_BOOL oEnable_aGF, .0, 0x025, 0x29, opt_enable_aGF ; =1: aGF can be selected underwater - OPTION_UINT8 oCompassGain, .0, .7, .6, tMinutes, 0x026, 0x34, opt_compass_gain ; 0-7 (230 LSB/Gauss to 1370LSB/Gauss) + OPTION_UINT8 oCompassGain, .0, .5, .5, tMinutes, 0x026, 0x34, opt_compass_gain ; 0-7 (230 LSB/Gauss to 1370LSB/Gauss) OPTION_ENUM8 oSamplingRate, .2, .0, tSetSeconds, 0x027, 0x2F, opt_sampling_rate ; =1: 10s, =0: 2s ; Managing Settings @@ -318,8 +318,8 @@ OPTION_ENUM8 oTissueGraphics, tissue_graphics_options, .0, tTissuePresSat, 0x0FB, 0x88, opt_tissue_graphics ; =0: show pressures and saturations, =1: show N2 and He pressures OPTION_ENUM8 oLayout, .2, .0, tLayoutNormal, 0x0FC, 0x8A, opt_layout ; initial layout of dive mode screen =0: normal, =1: big OPTION_BOOL oExtendedStops, .1, 0x0FD, 0x8B, opt_ext_stops ; =1: place gas switches also below 1st stop depth - OPTION_UINT8 oGasDensityAtt, .40, .80, .60, nounit, 0x0FE, 0x8C, char_I_gas_density_att ; threshold for gas density attention [0.1 grams/l] - OPTION_UINT8 oGasDensityWarn, .40, .80, .65, nounit, 0x0FF, 0x8D, char_I_gas_density_warn ; threshold for gas density warning [0.1 grams/l] + OPTION_UINT8 oGasDensityAtt, .40, .80, .52, nounit, 0x0FE, 0x8C, char_I_gas_density_att ; threshold for gas density attention [0.1 grams/l] + OPTION_UINT8 oGasDensityWarn, .40, .80, .63, nounit, 0x0FF, 0x8D, char_I_gas_density_warn ; threshold for gas density warning [0.1 grams/l] OPTION_BOOL oDilppO2Check, .1, 0x100, 0x8E, char_I_dil_check ; =1: check ppO2 of the pure diluent against current setpoint OPTION_UINT8 oFirmwareMajor, fw_version_major, fw_version_major, fw_version_major, nounit, 0x101, nocomm, opt_fw_version_major ; firmware version, major | use as read-only, OPTION_UINT8 oFirmwareMinor, fw_version_minor, fw_version_minor, fw_version_minor, nounit, 0x102, nocomm, opt_fw_version_minor ; firmware version, minor | do not change eeprom index number! diff -r a9a0188091e4 -r 7d8a4c60ec1a src/p2_deco.c --- a/src/p2_deco.c Thu Jan 14 16:24:07 2021 +0100 +++ b/src/p2_deco.c Mon May 24 18:40:53 2021 +0200 @@ -128,6 +128,9 @@ #define BAR_TO_METER 10.19716 // conversion factor (1 bar = 10.19716 m ) #define SURFACE_DESAT_FACTOR 0.70420 // surface desaturation safety factor #define HYST 1.0E-06 // threshold for tissue graphics on-gassing / off-gassing visualization +#define GAS_DENSITY_He_FACTOR 17.64 // in multiples of 0.01 grams per liter +#define GAS_DENSITY_N2_FACTOR 123.46 // in multiples of 0.01 grams per liter +#define GAS_DENSITY_O2_FACTOR 141.02 // in multiples of 0.01 grams per liter // thresholds #define CNS_LIMIT_WARNING 100 // threshold for CNS warning @@ -136,11 +139,12 @@ #define PRESSURE_LIMIT_ATTENTION 500 // threshold for pressure reading attention: 50.0 bar #define GAS_NEEDS_ATTENTION 0.7 // threshold for gas needs attention [1 = 100%] #define O2_CONSUMPTION_LIMIT_ATTENTION 20 // threshold for O2 "SAC" attention: 2.0 l/min -#define ppO2_GAP_TO_SETPOINT 10 // gap between setpoint and max. ppO2 of the pure diluent [cbar] +#define ppO2_GAP_TO_SETPOINT 20 // gap between setpoint and max. ppO2 of the pure diluent [cbar] #define ppO2_MARGIN_ON_MAX 3 // [cbar] margin on ppO2 max to compensate for surface pressures > 1.000 mbar #define STOP_CHAINING_LIMIT 3 // max. number of chained stop table entries before deco calculation is aborted + // deco engine states and modes - (char_O_)main_status: controls current tissue and deco status calculation (as-is situation) #define CALC_VOLUME 0x01 // =1: calculate gas needs #define CALCULATE_BOTTOM 0x02 // =1: calculate gas needs in deco calculator mode, =0: in dive mode @@ -1575,7 +1579,7 @@ // static unsigned char gas_find_best(void) { - overlay unsigned char switch_depth = 255; + overlay unsigned char switch_depth = sim_gas_current_depth; overlay unsigned char switch_gas = 0; @@ -1943,7 +1947,7 @@ overlay unsigned char temp; // compute gas density of current mix in multiples of 0.01 grams per liter - int_O_gas_density = (unsigned int)( 17.9 * ppHe + 125.1 * ppN2 + 142.8 * ppO2 ); + int_O_gas_density = (unsigned int)( GAS_DENSITY_He_FACTOR * ppHe + GAS_DENSITY_N2_FACTOR * ppN2 + GAS_DENSITY_O2_FACTOR * ppO2 ); // convert gas density into an 8 bit integer, scaling 0.1 grams per liter temp = (unsigned char)( (int_O_gas_density + 9) / 10 ); diff -r a9a0188091e4 -r 7d8a4c60ec1a src/rx_firmware-1-41.inc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/rx_firmware-1-41.inc Mon May 24 18:40:53 2021 +0200 @@ -0,0 +1,172 @@ +;============================================================================= +; +; File rx_firmware.inc combined next generation V3.09.4f +; +; Firmware for the RX Co-Processor +; +; Copyright (c) 2019, HeinrichsWeikamp, all rights reserved. +;============================================================================= + + +; version of the RX firmware below +#define rx_firmware_major .1 +#define rx_firmware_minor .41 + +; http://srecord.sourceforge.net/ + DB 0xF7,0xEF,0x05,0xF0,0x00,0x00,0x00,0x00,0x03,0xD0,0x00,0x00 + DB 0x00,0x00,0x00,0x00,0x01,0x01,0xF3,0xCF,0x60,0xF0,0xF4,0xCF + DB 0x61,0xF0,0x7E,0xB0,0x87,0xD8,0xF0,0xB2,0xC8,0xD8,0x7B,0xB0 + DB 0x0E,0xD8,0x01,0x01,0x9E,0xB0,0xBF,0xD8,0x9E,0xB2,0xB0,0xD8 + DB 0xA1,0xB2,0xB7,0xD8,0xF2,0xB2,0xF2,0x92,0x61,0xC0,0xF4,0xFF + DB 0x60,0xC0,0xF3,0xFF,0x11,0x00,0x0F,0x01,0x4F,0x6B,0x50,0x6B + DB 0x01,0x01,0x7B,0x90,0x5E,0xCF,0x3D,0xF1,0x5E,0xCF,0x40,0xF1 + DB 0xD8,0x90,0x40,0x33,0x3F,0x51,0x40,0x27,0x02,0x8D,0xA0,0x0E + DB 0x7D,0xB0,0x06,0x51,0x40,0x61,0x02,0x9D,0xD8,0x90,0x3D,0x31 + DB 0x3F,0x6F,0x02,0xAD,0x82,0x94,0x02,0xBD,0x82,0x84,0x40,0xC1 + DB 0x73,0xFF,0x0F,0x01,0x51,0xB5,0x12,0x00,0x01,0x01,0x02,0xAD + DB 0x06,0xD0,0x41,0x2B,0x40,0x51,0x45,0x27,0x00,0x0E,0x46,0x23 + DB 0x12,0x00,0x42,0x2B,0x2B,0x0E,0x41,0x61,0x12,0xD0,0x0A,0x0E + DB 0x42,0x61,0x03,0xD0,0x05,0x0E,0x41,0x61,0x05,0xD0,0x41,0x6B + DB 0x42,0x6B,0x45,0x6B,0x46,0x6B,0x12,0x00,0x42,0x51,0x41,0x27 + DB 0x2B,0x0E,0x41,0x61,0x02,0xD0,0x42,0x6B,0x12,0x00,0x41,0xC1 + DB 0x06,0xF1,0x70,0x0E,0x4E,0x6F,0x17,0x0E,0x4F,0x6F,0x45,0xC1 + DB 0x4C,0xF1,0x46,0xC1,0x4D,0xF1,0x92,0xEC,0x07,0xF0,0x49,0xB1 + DB 0xE6,0xD7,0x45,0xC1,0x47,0xF1,0x46,0xC1,0x48,0xF1,0x45,0x6B + DB 0x46,0x6B,0x0F,0x01,0x53,0x6B,0xAF,0x0E,0x52,0x6F,0x26,0x0E + DB 0x51,0x6F,0x01,0x01,0x7E,0x90,0x02,0xEE,0x00,0xF0,0x7D,0x80 + DB 0x0C,0x6B,0x0F,0x6B,0x08,0x0E,0x0D,0x6F,0x10,0x0E,0x10,0x6F + DB 0x05,0x0E,0x11,0x6F,0x41,0x6B,0x42,0x6B,0x47,0xC1,0x19,0xF1 + DB 0x48,0xC1,0x1A,0xF1,0x06,0xC1,0x1B,0xF1,0x1C,0x6B,0x6B,0xEC + DB 0x07,0xF0,0x05,0x0E,0x15,0x27,0x15,0xC1,0x06,0xF1,0x12,0x00 + DB 0x0F,0x01,0xFB,0x0E,0x52,0x6F,0x05,0x0E,0x51,0x6F,0x01,0x01 + DB 0x7E,0x90,0x05,0x0E,0x10,0x65,0x06,0xD0,0x0D,0x0E,0x10,0x61 + DB 0x03,0xD0,0x80,0x7C,0x02,0xBD,0x0F,0x2B,0x10,0x2F,0x12,0x00 + DB 0x10,0x0E,0x10,0x6F,0x02,0x0E,0xD8,0x80,0x0F,0x65,0xD8,0x90 + DB 0x0E,0x37,0x0C,0x67,0x07,0xD0,0x0E,0xB1,0x05,0xD0,0x0F,0x01 + DB 0x51,0x95,0x01,0x01,0x7D,0x90,0x12,0x00,0x0F,0x6B,0x0C,0x2B + DB 0x0D,0x2F,0x12,0x00,0x08,0x0E,0x0D,0x6F,0x0E,0xC1,0xEE,0xFF + DB 0x11,0x2F,0x12,0x00,0x0F,0x01,0x51,0x95,0x01,0x01,0x7D,0x90 + DB 0x02,0x85,0x12,0x00,0x9E,0x92,0x01,0x01,0x2B,0x2B,0x3E,0x0E + DB 0x2B,0x65,0x12,0x00,0x2B,0x6B,0x02,0x87,0x12,0x00,0x01,0x01 + DB 0xA0,0x92,0xA1,0x92,0x12,0x00,0x01,0x01,0x9E,0x90,0x9D,0x90 + DB 0x12,0x00,0x01,0x01,0xF0,0x92,0x12,0x00,0x12,0xEE,0x10,0xF0 + DB 0x00,0xC3,0xE6,0xFF,0x10,0xC3,0xE6,0xFF,0x20,0xC3,0xE6,0xFF + DB 0x30,0xC3,0xE6,0xFF,0x40,0xC3,0xE6,0xFF,0x50,0xC3,0xE6,0xFF + DB 0x01,0xC3,0xE6,0xFF,0x11,0xC3,0xE6,0xFF,0x21,0xC3,0xE6,0xFF + DB 0x31,0xC3,0xE6,0xFF,0x41,0xC3,0xE6,0xFF,0x51,0xC3,0xE6,0xFF + DB 0x02,0xC3,0xE6,0xFF,0x12,0xC3,0xE6,0xFF,0x22,0xC3,0xE6,0xFF + DB 0x32,0xC3,0xE6,0xFF,0x42,0xC3,0xE6,0xFF,0x52,0xC3,0xE6,0xFF + DB 0x02,0x99,0x12,0x00,0x03,0x01,0x50,0x67,0x50,0x2B,0x51,0x67 + DB 0x51,0x2B,0x52,0x67,0x52,0x2B,0x53,0x67,0x53,0x2B,0x54,0x67 + DB 0x54,0x2B,0x55,0x67,0x55,0x2B,0x56,0x67,0x56,0x2B,0x13,0xEE + DB 0x00,0xF0,0x00,0x0E,0x0F,0xD8,0x01,0x0E,0x0D,0xD8,0x02,0x0E + DB 0x0B,0xD8,0x03,0x0E,0x09,0xD8,0x04,0x0E,0x07,0xD8,0x05,0x0E + DB 0x05,0xD8,0x06,0x0E,0x03,0xD8,0x01,0x01,0x02,0x89,0x12,0x00 + DB 0x60,0x6F,0x50,0x0F,0xE3,0xCF,0x61,0xF3,0xF0,0x0E,0x61,0x63 + DB 0x12,0x00,0x60,0x51,0xE3,0x6A,0x10,0x0E,0x60,0x25,0xE3,0x6A + DB 0x20,0x0E,0x60,0x25,0xE3,0x6A,0x30,0x0E,0x60,0x25,0xE3,0x6A + DB 0x40,0x0E,0x60,0x25,0xE3,0x6A,0x50,0x0E,0x60,0x25,0xE3,0x6A + DB 0x12,0x00,0x01,0x01,0x00,0xC2,0x2D,0xF1,0x01,0xC2,0x2E,0xF1 + DB 0x02,0xC2,0x2F,0xF1,0x03,0xC2,0x30,0xF1,0x04,0xC2,0x31,0xF1 + DB 0x02,0x95,0x32,0x6B,0x33,0x6B,0x34,0x6B,0x35,0x6B,0x36,0x6B + DB 0x37,0x6B,0x2D,0xBF,0x33,0x8B,0x2D,0xBD,0x33,0x89,0x2D,0xBB + DB 0x33,0x87,0x2D,0xB9,0x33,0x85,0x2D,0xB7,0x33,0x83,0x2D,0xB5 + DB 0x33,0x81,0x2D,0xB3,0x34,0x8F,0x2D,0xB1,0x34,0x8D,0x2E,0xBF + DB 0x34,0x8B,0x2E,0xBD,0x34,0x89,0x2E,0xBB,0x34,0x87,0x2E,0xB9 + DB 0x34,0x85,0x2E,0xB7,0x34,0x83,0x2E,0xB5,0x34,0x81,0x33,0xC1 + DB 0x38,0xF1,0x38,0x9B,0x38,0x67,0x01,0xD0,0x00,0xD0,0x04,0x0E + DB 0x38,0x6F,0x11,0xEE,0x2D,0xF0,0x50,0x6B,0xE6,0x50,0x50,0x1B + DB 0x08,0x0E,0x51,0x6F,0xD8,0x90,0x50,0x37,0x85,0x0E,0xD8,0xB0 + DB 0x50,0x1B,0x51,0x2F,0xF9,0xD7,0x38,0x2F,0xF3,0xD7,0x31,0x51 + DB 0x50,0x63,0x12,0x00,0x2E,0xB3,0x35,0x87,0x2E,0xB1,0x35,0x85 + DB 0x2F,0xBF,0x35,0x83,0x2F,0xBD,0x35,0x81,0x2F,0xBB,0x36,0x8F + DB 0x2F,0xB9,0x36,0x8D,0x2F,0xB7,0x36,0x8B,0x2F,0xB5,0x36,0x89 + DB 0x2F,0xB3,0x36,0x87,0x2F,0xB1,0x36,0x85,0x30,0xBF,0x36,0x83 + DB 0x30,0xBD,0x36,0x81,0x00,0x0E,0x36,0x63,0x05,0xD0,0x0C,0x0E + DB 0x35,0x63,0x02,0xD0,0x36,0x6B,0x35,0x6B,0xE4,0x0E,0x21,0x6F + DB 0x0C,0x0E,0x22,0x6F,0x36,0xC1,0x1F,0xF1,0x35,0xC1,0x20,0xF1 + DB 0x5C,0xEC,0x07,0xF0,0x02,0xB1,0x01,0xD0,0x12,0x00,0x30,0xBB + DB 0x37,0x8B,0x30,0xB9,0x37,0x89,0x30,0xB7,0x37,0x87,0x30,0xB5 + DB 0x37,0x85,0x30,0xB3,0x37,0x83,0x30,0xB1,0x37,0x81,0x38,0x6B + DB 0x13,0xEE,0x00,0xF0,0x23,0xEE,0x10,0xF0,0x33,0x51,0xE6,0x62 + DB 0x1E,0xD0,0x34,0x51,0xDE,0x62,0x1C,0xD0,0x13,0xEE,0x00,0xF0 + DB 0x38,0x51,0x33,0xC1,0xE3,0xFF,0x13,0xEE,0x10,0xF0,0x34,0xC1 + DB 0xE3,0xFF,0x13,0xEE,0x20,0xF0,0x35,0xC1,0xE3,0xFF,0x13,0xEE + DB 0x30,0xF0,0x36,0xC1,0xE3,0xFF,0x13,0xEE,0x40,0xF0,0x37,0xC1 + DB 0xE3,0xFF,0x13,0xEE,0x50,0xF0,0xE3,0x6A,0xE3,0x2A,0x02,0x89 + DB 0x12,0x00,0xDE,0x50,0x38,0x2B,0x04,0x0E,0x38,0x63,0xDA,0xD7 + DB 0x38,0x6B,0x13,0xEE,0x50,0xF0,0xE6,0x66,0x01,0xD0,0xDA,0xD7 + DB 0x38,0x2B,0x04,0x0E,0x38,0x63,0xF9,0xD7,0x12,0x00,0x95,0xD8 + DB 0x5C,0xD8,0x27,0x6B,0x80,0x88,0x80,0xA8,0xFD,0xD7,0x02,0x9B + DB 0x2B,0x6B,0x12,0xEE,0x00,0xF0,0xE6,0x6A,0x0F,0x0E,0xE2,0x62 + DB 0xFC,0xD7,0x01,0x01,0x9E,0xB6,0xF1,0xD8,0x02,0xBB,0xED,0xD7 + DB 0x02,0xB9,0xD0,0xDE,0x02,0xB5,0x31,0xDF,0x02,0xB7,0x02,0xD8 + DB 0x04,0x00,0xF4,0xD7,0x02,0x97,0x29,0x4B,0x2A,0x2B,0xEE,0xDE + DB 0x81,0xB0,0x06,0xD8,0x81,0xA0,0x3B,0x6B,0x28,0x2F,0x12,0x00 + DB 0x06,0xD8,0x12,0x00,0x01,0x01,0x3B,0x2B,0x1E,0x0E,0x3B,0x63 + DB 0x12,0x00,0x3B,0x6B,0xF2,0x6A,0xF0,0x6A,0x9D,0x6A,0x80,0x0E + DB 0xF1,0x6E,0xCD,0x6A,0xB1,0x6A,0x0F,0x01,0x42,0x6B,0x41,0x6B + DB 0x01,0x01,0x00,0x00,0x00,0x00,0x80,0x98,0x80,0xB8,0xFD,0xD7 + DB 0x2A,0x6B,0x29,0x6B,0x9E,0x96,0x03,0x00,0x00,0x00,0x81,0xB0 + DB 0xFB,0xD7,0x00,0x00,0x80,0x88,0x80,0xA8,0xFD,0xD7,0xCD,0x6A + DB 0x82,0x0E,0xB1,0x6E,0x13,0xEE,0x00,0xF0,0xE6,0x6A,0x04,0x0E + DB 0xE2,0x62,0xFC,0xD7,0x0F,0x01,0x42,0x6B,0xE0,0x0E,0x41,0x6F + DB 0x01,0x01,0xC0,0x0E,0xF2,0x6E,0xF1,0x6A,0x10,0x0E,0xF0,0x6E + DB 0x02,0x0E,0x9D,0x6E,0x12,0x00,0xF2,0x9E,0x23,0x97,0x06,0x69 + DB 0x04,0x6B,0x06,0x2F,0x02,0xD0,0x9B,0x6A,0x1C,0xD0,0xB2,0x6A + DB 0xB1,0x80,0x03,0x6B,0xA1,0x92,0xB3,0x68,0xFC,0x0E,0xB2,0x6E + DB 0x03,0x2B,0xA1,0xA2,0xFD,0xD7,0x03,0x51,0x7A,0x08,0xD8,0xA0 + DB 0x01,0xD0,0x07,0xD0,0xFF,0x08,0x01,0x08,0xD8,0xB0,0x09,0xD0 + DB 0x04,0x07,0x0D,0xD8,0xE6,0xD7,0x01,0x08,0xD8,0xB0,0x03,0xD0 + DB 0x04,0x2B,0x07,0xD8,0xE0,0xD7,0x04,0xC1,0x3C,0xF1,0x82,0x0E + DB 0xB1,0x6E,0xF2,0x8E,0x12,0x00,0x04,0xC1,0x05,0xF1,0x05,0x9F + DB 0x05,0x9D,0x05,0xC1,0x9B,0xFF,0x14,0x0E,0x05,0x6F,0x04,0x00 + DB 0xFF,0xEC,0x02,0xF0,0x05,0x2F,0xFB,0xD7,0x12,0x00,0x0F,0x01 + DB 0x72,0x0E,0xD3,0x6E,0xD2,0x6A,0x9B,0x6A,0xD1,0x80,0x0C,0x0E + DB 0x92,0x6E,0x05,0x0E,0x93,0x6E,0x59,0x0E,0x94,0x6E,0x0F,0x01 + DB 0x04,0x0E,0x38,0x6F,0x39,0x6B,0x3A,0x6B,0x0F,0x01,0x3F,0x6B + DB 0x9B,0x0E,0x3E,0x6F,0x0E,0x0E,0x3D,0x6F,0x0F,0x01,0x04,0x0E + DB 0x61,0x6E,0x0F,0x01,0x80,0x6A,0x81,0x6A,0x82,0x6A,0xD5,0x6A + DB 0xCD,0x6A,0xCC,0x6A,0x7F,0x0E,0xBA,0x6E,0x82,0x0E,0xB1,0x6E + DB 0xB4,0x6A,0x0F,0x01,0x51,0x6B,0x0F,0x01,0x01,0x0E,0x4E,0x6F + DB 0x4D,0x6B,0x0F,0x01,0x04,0x0E,0x4A,0x6F,0x0F,0x01,0x42,0x6B + DB 0xE0,0x0E,0x41,0x6F,0x16,0x0E,0x40,0x6F,0x01,0x01,0xC2,0x6A + DB 0xAC,0x6A,0xAB,0x6A,0xB8,0x6A,0xAF,0x6A,0xB0,0x6A,0x24,0x0E + DB 0x72,0x6E,0x80,0x0E,0x71,0x6E,0x08,0x0E,0x70,0x6E,0x22,0x0E + DB 0x75,0x6E,0x76,0x6A,0x50,0x0E,0xC8,0x6E,0xC7,0x6A,0x26,0x0E + DB 0xC6,0x6E,0x08,0x0E,0xC5,0x6E,0xCB,0x6A,0xCA,0x68,0xC6,0x88 + DB 0x23,0x6B,0x26,0x6B,0x9E,0x96,0x0F,0x01,0x92,0x0E,0x49,0x6F + DB 0x0F,0x01,0x07,0x0E,0x5D,0x6F,0x0F,0x01,0x01,0x0E,0x5A,0x6F + DB 0x0F,0x01,0x5C,0x6B,0x0F,0x01,0x5B,0x6B,0x0F,0x01,0xC0,0x0E + DB 0xF2,0x6E,0xF1,0x6A,0xF0,0x6A,0x02,0x0E,0x9D,0x6E,0xA0,0x6A + DB 0xA3,0x6A,0x01,0x0E,0x7A,0x6E,0x01,0x01,0x12,0x00,0x9E,0x96 + DB 0x0F,0x0E,0x28,0x6F,0xC9,0xCF,0x24,0xF1,0xC7,0xB4,0x16,0xD0 + DB 0xC7,0xAA,0x11,0xD0,0x23,0x6B,0x1B,0x0E,0x24,0x63,0x02,0xD0 + DB 0x23,0x81,0x0B,0xD0,0x1E,0x0E,0x24,0x63,0x02,0xD0,0x23,0x83 + DB 0x06,0xD0,0x2E,0x0E,0x24,0x63,0x02,0xD0,0x23,0x85,0x01,0xD0 + DB 0x00,0xD0,0x9E,0x96,0xC6,0x88,0x12,0x00,0x23,0xB1,0x1C,0xD0 + DB 0x23,0xB3,0x08,0xD0,0x23,0xB5,0x14,0xD0,0xFF,0x0E,0x24,0xD8 + DB 0x00,0xD0,0x9E,0x96,0xC6,0x88,0x12,0x00,0x23,0x93,0x12,0xEE + DB 0x10,0xF0,0x30,0x0E,0x03,0x6F,0xE6,0x50,0x19,0xD8,0x02,0xBB + DB 0x15,0xD0,0xC5,0xBC,0xF2,0xD7,0x03,0x2F,0xF8,0xD7,0xEF,0xD7 + DB 0x23,0x95,0x12,0xEE,0x40,0xF0,0xF1,0xD7,0x23,0x91,0x01,0x0E + DB 0x0B,0xD8,0x02,0xBB,0x07,0xD0,0xC5,0xBC,0xE4,0xD7,0x29,0x0E + DB 0x05,0xD8,0x02,0xBB,0x01,0xD0,0xDF,0xD7,0x23,0x6B,0xDD,0xD7 + DB 0xC9,0x6E,0xC6,0x88,0x04,0xD0,0xC6,0x88,0x02,0xD8,0xC9,0x50 + DB 0x12,0x00,0x27,0x6B,0x9E,0xB6,0x0B,0xD0,0x9E,0xB6,0x09,0xD0 + DB 0x9E,0xB6,0x07,0xD0,0x9E,0xB6,0x05,0xD0,0x27,0x2F,0x01,0xD0 + DB 0x04,0xD0,0x9E,0xA6,0xFE,0xD7,0x9E,0x96,0x12,0x00,0x02,0x8B + DB 0x9E,0x96,0x12,0x00,0x02,0x91,0x21,0x51,0x1F,0x5D,0x1D,0x6F + DB 0x22,0x51,0x20,0x59,0x1E,0x6F,0xD8,0xB0,0x12,0x00,0x02,0x81 + DB 0x1E,0x1F,0x1D,0x6D,0xD8,0xB0,0x1E,0x2B,0x12,0x00,0x15,0x6B + DB 0x16,0x6B,0x1B,0x51,0x1C,0x11,0xD8,0xB4,0xFF,0x0C,0x01,0x0E + DB 0x14,0x6F,0x1C,0xBF,0x05,0xD0,0x14,0x2B,0xD8,0x90,0x1B,0x37 + DB 0x1C,0x37,0xF9,0xD7,0xD8,0x90,0x15,0x37,0x16,0x37,0x1B,0x51 + DB 0x19,0x5F,0x1C,0x51,0xD8,0xA0,0x1C,0x29,0x1A,0x5F,0xD8,0xB0 + DB 0x05,0xD0,0x1B,0x51,0x19,0x27,0x1C,0x51,0x1A,0x23,0x01,0xD0 + DB 0x15,0x81,0x14,0x07,0xD8,0xB4,0x12,0x00,0xD8,0x90,0x1C,0x33 + DB 0x1B,0x33,0xE8,0xD7,0x49,0x91,0x4E,0x51,0x4C,0x5D,0x4A,0x6F + DB 0x4F,0x51,0x4D,0x59,0x4B,0x6F,0xD8,0xB0,0x12,0x00,0x49,0x81 + DB 0x4B,0x1F,0x4A,0x6D,0xD8,0xB0,0x4B,0x2B,0x12,0x00,0xFF,0xFF + + diff -r a9a0188091e4 -r 7d8a4c60ec1a src/rx_firmware.asm --- a/src/rx_firmware.asm Thu Jan 14 16:24:07 2021 +0100 +++ b/src/rx_firmware.asm Mon May 24 18:40:53 2021 +0200 @@ -21,7 +21,7 @@ global rx_firmware_storage rx_firmware_storage: -#include "rx_firmware-1-40.inc" +#include "rx_firmware-1-41.inc" global rx_firmware_new_major rx_firmware_new_major: diff -r a9a0188091e4 -r 7d8a4c60ec1a src/sleepmode.asm --- a/src/sleepmode.asm Thu Jan 14 16:24:07 2021 +0100 +++ b/src/sleepmode.asm Mon May 24 18:40:53 2021 +0200 @@ -79,6 +79,8 @@ bsf sleepmode ; flag being in sleep mode bsf block_sensor_interrupt ; suspend ISR from executing sensor interrupts + bcf i2c_error_flag ; clear any I2C errors + call disable_ir_s8_analog ; power-down IR/S8/analog interface call mcp_sleep ; power-down RX power supply @@ -233,6 +235,16 @@ btfsc trigger_full_hour ; one hour in sleep? rcall one_hour_sleep ; YES - do the every hour tasks + ; sleepmode pressure sampling for new sensor is done here + btfss press_sensor_type ; New sensor found? + return ; No, done. + + btfsc ms5837_state ; =0: result of temperature is in the ADC + bra one_sec_sleep_3 + call I2C_get_temp_val_MS5837 ; (Will set ms5837_state) + return +one_sec_sleep_3: + call I2C_get_press_val_MS5837 ; (Will clear ms5837_state) return ; done @@ -394,7 +406,10 @@ pressuretest_sleep_fast: banksel isr_backup ; select bank ISR data - CLRI pressure_abs_avg ; clear pressure average register + clrf pressure_abs_avg+0 ; clear pressure average register + clrf pressure_abs_avg+1 + clrf pressure_abs_avg+2 + CLRI temperature_avg ; clear temperature average register call get_temperature_start ; start temperature integration (73.5 us) @@ -402,13 +417,15 @@ rcall sleepmode_sleep ; sleep for 62.5...125 ms rcall sleepmode_sleep ; sleep for 62.5...125 ms - call get_temperature_value ; state 1: get temperature + call get_temperature_value ; get temperature... (May return in bank common) + banksel isr_backup ; select bank ISR data call get_pressure_start ; start pressure integration rcall sleepmode_sleep ; sleep for 62.5...125 ms rcall sleepmode_sleep ; sleep for 62.5...125 ms - call get_pressure_value ; state2: get pressure (51 us) + call get_pressure_value ; state2: get pressure (51 us)(May return in bank common) + banksel isr_backup ; select bank ISR data call calculate_compensation ; calculate temperature compensated pressure (27 us) MOVII pressure_abs_avg,pressure_abs ; get result, bypassing the averaging diff -r a9a0188091e4 -r 7d8a4c60ec1a src/start.asm --- a/src/start.asm Thu Jan 14 16:24:07 2021 +0100 +++ b/src/start.asm Mon May 24 18:40:53 2021 +0200 @@ -114,6 +114,10 @@ movlw .16 ; set averaging span movff WREG,analog_counter ; write to counter (in bank isr_backup) + ; initialize 1/4 second counting register + movlw .4 ; 62,5ms * 4 = 1/4 second + movff WREG,isr_tmr7_helper + ; initialize hardware (ports, timers) and start interrupts call init_ostc ; also selects bank common and sets CPU to normal speed @@ -154,13 +158,25 @@ EEPROM_CC_READ eeprom_button_polarity,button_polarity ; initialize pressure sensor calibration + call I2C_probe_pressure_sensor ; Probe the type of sensor, set/clear press_sensor_type call get_calibration_data ; get calibration data from pressure sensor call TFT_DisplayOff ; turn off display bsf LEDr ; turn on red LED ; wait for valid temperature and pressure - WAITS .3 ; wait 3 seconds + btfsc press_sensor_type ; New sensor found? + call I2C_get_temp_val_MS5837 ; (Will set ms5837_state) + WAITMS .250 + btfsc press_sensor_type ; New sensor found? + call I2C_get_press_val_MS5837 ; (Will clear ms5837_state) + WAITMS .250 + btfsc press_sensor_type ; New sensor found? + call I2C_get_temp_val_MS5837 ; (Will set ms5837_state) + WAITMS .250 + btfsc press_sensor_type ; New sensor found? + call I2C_get_press_val_MS5837 ; (Will clear ms5837_state) + WAITMS .250 ; sensor calibration completed, first valid pressure value is available bcf LEDr ; turn off red LED @@ -325,6 +341,7 @@ clrf HW_descriptor ; hardware - OSTC model descriptor clrf HW_flags_state1 ; hardware - states ; ; DO NOT clear HW_flags_state2 ! + ; ; DO NOT clear HW_flags_state3 ! clrf DM_flags_sensor ; hardware - O2 sensors clrf OS_flags_ISR1 ; operating system - ISR control 1 clrf OS_flags_ISR2 ; operating system - ISR control 2 @@ -384,6 +401,9 @@ ; Do the check for BLE-cR IFDEF _external_sensor bsf mcp_power ; power-up instrumentation amp (used by S8 and analog input) + btfss mcp_power ; power-up completed? + bra $-4 ; NO - loop + WAITMS .1 banksel BAUDCON2 ; select bank for IO register access movlw b'00000000' ; speed generator configuration: BRG16=0, normal for S8 movwf BAUDCON2 ; ... @@ -394,13 +414,21 @@ movlw b'10010000' ; RX configuration movwf RCSTA2 ; ... banksel common ; back to bank common - call get_analog_inputs - movff sensor1_mv+1,lo - movlw .58 ; ~ >1,500V - cpfslt lo ; >58 on the high byte -> confident that there is cR circuity + WAITMS .1 + ; Check sensor 1 input with no limits + movlw b'00000000' ; AVDD Vref+ + movwf ADCON1 ; ... + ; set to read Sensor 1 + extern wait_adc + movlw b'00100001' ; power on ADC, select AN8 + call wait_adc ; wait for ADC + movlw .10 ; ~ >1,900V + cpfslt ADRESH ; >10 on the high byte -> confident that there is cR circuity bsf ext_input_s8_ana ; YES - it's a cR, S8/analog sensor input available call disable_ir_s8_analog ; power-down circuity again ENDIF + + bsf lv_core ; default to low voltage core movlw 0x80 ; point to 0x1F780 movwf TBLPTRL ; ... @@ -502,9 +530,9 @@ restart5: ; configure button_hold_down_allowed flag btfsc lv_core - bsf button_hold_down_allowed,A ; OSTC sport mod. 2019 + bsf button_hold_down_allowed ; OSTC sport mod. 2019 btfsc ext_input_optical - bsf button_hold_down_allowed,A ; OSTC3/old sport + bsf button_hold_down_allowed ; OSTC3/old sport ; manage hardware btfss ext_input_s8_ana ; OSTC with S8/analog input? diff -r a9a0188091e4 -r 7d8a4c60ec1a src/surfmode.asm --- a/src/surfmode.asm Thu Jan 14 16:24:07 2021 +0100 +++ b/src/surfmode.asm Mon May 24 18:40:53 2021 +0200 @@ -322,6 +322,10 @@ ; warnings for all modes call check_battery ; check if the battery level should be displayed/warned + IFDEF _debug_output + call check_i2c_error ; check for an I2C error (For debugging purposes only) + ENDIF + btfsc FLAG_apnoe_mode ; done for Apnoe or Gauge mode bra surfmode_check_warnings2 btfsc FLAG_gauge_mode ; done for Apnoe or Gauge mode @@ -426,6 +430,15 @@ call TFT_surfmode_batt ; - update displayed battery voltage btfss timebase_1sec,0 ; - on even second? call surfmode_check_warnings ; YES - check for warnings and display/update them + + btfsc trigger_temp_changed ; - temperature changed? + call TFT_surfmode_temp ; YES - display temperature + bcf trigger_temp_changed ; - clear flag (anyhow) + + btfsc trigger_pres_cur_changed ; YES - pressure changed? + call TFT_surfmode_pres_fast ; YES - display surface pressure, but only if change > threshold + bcf trigger_pres_cur_changed ; - clear flag (anyhow) + IFDEF _rx_functions btfss tr_functions_activated ; - TR functions activated? @@ -442,11 +455,12 @@ housekeeping_0: bsf restart_fast ; default to doing a fast restart (no logos) + btfsc divemode ; NO - need to enter dive mode? + bra housekeeping_0b ; YES - but check again, to filter potential glitches (New sensor) +housekeeping_0a: call check_dive_modes_surf ; check if dive mode needs to be entered, will set dive mode flag if yes btfsc simulatormode ; in simulator mode? bra housekeeping_1 ; YES - can't restart or go to sleep without prior cleanup - btfsc divemode ; NO - need to enter dive mode? - goto restart ; YES - restart, will proceed to dive mode btfss trigger_timeout ; NO - timeout? bra housekeeping_1 ; NO btfsc surfmode_menu ; YES - in surface menus? @@ -454,22 +468,36 @@ bcf restart_fast ; NO - set next restart to be done slow, i.e. with logos goto sleeploop ; - goto sleep mode +housekeeping_0b: + call check_dive_modes_surf ; check if dive mode needs to be entered, will set dive mode flag if yes + btfsc divemode ; NO - really need to enter dive mode? + goto restart ; YES + bra housekeeping_0a ; No, continue above + housekeeping_1: btfss trigger_quarter_second ; new 1/4 second begun? bra housekeeping_2 ; NO ;---- tasks any new 1/4 second ----- - bcf trigger_quarter_second ; YES - clear flag + + btfss press_sensor_type ; New sensor found? + bra housekeeping_1aa ; No + + btfsc ms5837_state ; =0: result of temperature is in the ADC + bra housekeeping_1ab + call I2C_get_temp_val_MS5837 ; (Will set ms5837_state) + bra housekeeping_1aa ; Done. +housekeeping_1ab: + call I2C_get_press_val_MS5837 ; (Will clear ms5837_state) +housekeeping_1aa: IFDEF _external_sensor btfsc imprint_sensor_mv ; - shall imprint sensor mV data? call TFT_imprint_menu_mV ; YES - imprint sensor mV data ENDIF ; _external_sensor btfss imprint_surfmode_data ; - shall imprint all surface mode data? bra housekeeping_2 ; NO - btfsc trigger_pres_cur_changed ; YES - pressure changed? - call TFT_surfmode_pres_fast ; YES - display surface pressure, but only if change > threshold - bcf trigger_pres_cur_changed ; - clear flag (anyhow) + IFDEF _compass movf active_customview,W ; - get current custom view xorlw .6 ; - coding of compass custom view @@ -522,10 +550,6 @@ bra housekeeping_3 ; NO call TFT_surfmode_date ; YES - update displayed date - btfsc trigger_temp_changed ; - temperature changed? - call TFT_surfmode_temp ; YES - display temperature - bcf trigger_temp_changed ; - clear flag (anyhow) - movf active_customview,W ; - get current custom view xorlw .5 ; - coding of tissue custom view btfsc STATUS,Z ; - equal? diff -r a9a0188091e4 -r 7d8a4c60ec1a src/text_italian.inc --- a/src/text_italian.inc Thu Jan 14 16:24:07 2021 +0100 +++ b/src/text_italian.inc Mon May 24 18:40:53 2021 +0200 @@ -26,9 +26,9 @@ TCODE tHeading, "Direzione:" ; Heading: TCODE tLastDive, "UltimaImm." ; Last Dive (Max 10 chars) - TCODE tFTTSSurf, "TTS Futuro :" ; Future TTS - TCODE tLastDecostopSurf, "Ultima Tappa:" ; last deco stop surface custom view - TCODE tDvSalinitySurf, "Salinita' :" ; Salinity + TCODE tFTTSSurf, "TTS Futuro:" ; Future TTS + TCODE tLastDecostopSurf, "UltimaTappa:" ; last deco stop surface custom view + TCODE tDvSalinitySurf, "Salinita':" ; Salinity IFDEF _external_sensor TCODE tSensorMilliVolt, "Sensori mV" ; Sensors mV @@ -228,9 +228,9 @@ TCODE taGFenable, "aGF Selezionabile:" ; aGF Selectable TCODE tDiveaGF_active, "Usa aGF" ; using aGF TCODE tSafetyStop, "Tappa Sicurezza:" ; Safety Stop: (max. 16 chars) - TCODE tExtendedStops, "Anticipa Tappa :" ; Extended Stops - TCODE tLastDecostop, "Ultima Tappa : " ; last Deco Stop Depth - TCODE tDvSalinity, "Salinita' : " ; Salinity + TCODE tExtendedStops, "Anticipa Tappa:" ; Extended Stops + TCODE tLastDecostop, "Ultima Tappa: " ; last Deco Stop Depth + TCODE tDvSalinity, "Salinita': " ; Salinity TCODE tDepthWarn, "Depth Warning :" ; Depth Warning (no space after ':' on purpose) TCODE tGasUsage, "Utilizzo" ; Gas Usage TCODE tSetWorkSAC, "SAC Fondo: " ; SAC Work: (space) diff -r a9a0188091e4 -r 7d8a4c60ec1a src/tft_outputs.asm --- a/src/tft_outputs.asm Thu Jan 14 16:24:07 2021 +0100 +++ b/src/tft_outputs.asm Mon May 24 18:40:53 2021 +0200 @@ -1571,6 +1571,10 @@ ; depth in meters and decimeters btfsc cur_depth_greater_100m ; was the depth >= 100 meter during last call? rcall TFT_depth_box_black ; YES - clear depth area + + btfsc cur_depth_greater_100m ; was the depth >= 100 meter during last call? + rcall TFT_depth_position_m_ft ; re-set output position for full meters/feet + bcf cur_depth_greater_100m ; current depth is now < 100 meter PRINT ; dump full meters to screen @@ -1596,6 +1600,10 @@ ; full meters only btfss cur_depth_greater_100m ; was the depth >= 100 meter during last call? rcall TFT_depth_box_black ; NO - clear depth area + + btfss cur_depth_greater_100m ; was the depth >= 100 meter during last call? + rcall TFT_depth_position_m_ft ; re-set output position for full meters/feet + bsf cur_depth_greater_100m ; depth is >= 100 meter now REINIT_BUFFER ; re-initialize the output buffer bsf omit_digit_2 ; print depth in full meters, i.e. do not print 1st and 2nd digit @@ -2833,6 +2841,21 @@ WIN_BOX_BLACK surf_warning2_row, surf_warning2_row+.24, surf_warning2_column, surf_warning2_column+.76 ; top, bottom, left, right return ; done +;----------------------------------------------------------------------------- +; Surface Mode - Message - when "I2CFail" was triggered +; + global TFT_message_i2c_error +TFT_message_i2c_error: + rcall TFT_message_open ; set row and column for the message + tstfsz WREG ; is there room for the message? + return ; NO - skip message in this cycle + STRCPY "I2C " ; print "I2C Error:" + movff i2c_error_vault+0,WREG ; last device adress + output_hex + PUTC " " + movff i2c_error_vault+1,WREG ; last data byte + output_hex + bra TFT_message_close ; finalize message output ;----------------------------------------------------------------------------- ; Surface Mode - Message - Desaturation @@ -6030,7 +6053,6 @@ tft_out16 CODE ;============================================================================= - global TFT_debug_output TFT_debug_output: @@ -6048,14 +6070,33 @@ ; WIN_TINY .0, . 0 ; dive mode: overwrites depth label FONT_COLOR_MEMO ; set color + movff D1+2,lo + output_256 + PUTC "," + movff D1+0,lo + movff D1+1,hi + output_65535 + PRINT + WIN_TINY .100,.45 ; surface mode: fits under the textual logo in the upper right corner + movff D2+2,lo + output_256 + PUTC "," + movff D2+0,lo + movff D2+1,hi + output_65535 + PRINT + WIN_TINY .100,.60 ; surface mode: fits under the textual logo in the upper right corner +; movf HW_flags_state3,W +; output_hex +; PUTC "," movff max_CCPR1L,lo output_256 PUTC "," - movff analog_sw2,lo; left - output_256 - PUTC "," - movff analog_sw1,lo; right - output_256 + movff divesecs_avg_trip+0,lo + movff divesecs_avg_trip+1,hi + output_65535 + + ; ; deco engine scheduling performance ; MOVII int_O_profiling_overrun,mpr ; runtime +/- versus target