Mercurial > public > hwos_code
view src/hwos.asm @ 632:0347acdf6d8e
changelog updates
author | heinrichsweikamp |
---|---|
date | Sat, 29 Feb 2020 16:57:45 +0100 |
parents | 185ba2f91f59 |
children | 4050675965ea |
line wrap: on
line source
;============================================================================= ; ; File hwos.asm combined next generation V3.08.8 ; ; Definition of the hwOS dive computer platform. ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; HISTORY ; 2011-05-24 : [jDG] Cleanups from initial Matthias code ; 2011-06-24 : [MH] Added clock speeds ;============================================================================= #DEFINE ACCESS_RAM_VARS ; the access RAM variables are declared in this file #include "hwos.inc" #include "eeprom_rs232.inc" ;----------------------------- CONFIG ---------------------------------------- CONFIG RETEN = OFF ; disabled - controlled by SRETEN bit CONFIG SOSCSEL = HIGH ; High Power SOSC circuit selected CONFIG XINST = OFF ; code won't execute in extended mode CONFIG FOSC = INTIO2 ; internal RC oscillator, no clock-out CONFIG PLLCFG = OFF ; CONFIG IESO = OFF ; disabled CONFIG PWRTEN = OFF ; disabled, because incompatible with ICD3 (Ri-400) CONFIG BOREN = ON ; controlled with SBOREN bit CONFIG BORV = 2 ; 2.0V CONFIG BORPWR = MEDIUM ; BORMV set to medium power level CONFIG WDTEN = ON ; WDT controlled by SWDTEN bit setting CONFIG WDTPS = 128 ; 1:128 CONFIG RTCOSC = SOSCREF ; RTCC uses SOSC CONFIG MCLRE = ON ; MCLR Enabled, RG5 Disabled CONFIG CCP2MX = PORTBE ; RE7 micro-controller mode/RB3-all other modes ;---------------------------- Bank0 ACCESS RAM ------------------------------- ac_ram equ 0x000 ac_ram udata_acs ac_ram ; access RAM data ;---- 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) ;---- Flags - Hardware States HW_flags_state1 res 1 ; hardware - states 1 HW_flags_state2 res 1 ; hardware - states 2 ;--- Flags - Operating System OS_flags_persist res 1 ; system - persistent settings (NOT cleared in restart) OS_flags_ISR1 res 1 ; system - ISR control 1 OS_flags_ISR2 res 1 ; system - ISR control 2 ;---- Flags - Operating Modes OM_flags_mode res 1 ; operating modes ;---- Flags - Dive Modes DM_flags_deco res 1 ; dive mode - main dive & deco mode ;---- CPU Speed cpu_speed_request res 1 ; requested CPU speed: =1: eco, =2: normal, =3: fastest cpu_speed_state res 1 ; current CPU speed: =1: eco, =2: normal, =3: fastest ;---- Timebase & Eventbase timebase res 1 ; timed trigger flags and running timebase eventbase res 1 ; event trigger flags ;---- Timeout-Timer Service isr_timeout_timer res 1 ; timeout timer isr_timeout_reload res 1 ; timeout reload value ;---- Dive Times total_divetime_secs res 2 ; total dive time, seconds counted_divetime_mins res 2 ; counted dive time, minutes | Attention: do not change the position of counted_divetime_secs res 1 ; counted dive time, seconds | these 2 Variables relative to each other! ;---- Dive Times / Apnoe apnoe_surface_mins res 1 ; surface time minutes | Attention: do not change the position of apnoe_surface_secs res 1 ; surface time seconds | these 2 Variables relative to each other! apnoe_dive_mins res 1 ; dive time minutes | Attention: do not change the position of apnoe_dive_secs res 1 ; dive time seconds | these 2 Variables relative to each other! ;---- Profile Recording sampling_rate res 1 ; configured sampling rate sampling_timer res 1 ; sampling timer ;---- Simulator Mode simulatormode_depth res 1 ; depth in simulator mode ;---- HUD / Sensor Data hud_status_byte res 1 ; HUD status byte, see definition of flags | Attention: keep relative position hud_battery_mv res 2 ; hud/ppo2 monitor battery voltage in mV | between these two variables! ; 28 byte user data ; 32 byte tmp data placed by C compiler ; 20 byte variables placed by math library ; == ; 80 byte used, 16 byte free (96 byte total available) global HW_descriptor global HW_variants global HW_flags_state1 global HW_flags_state2 global OS_flags_persist global OS_flags_ISR1 global OS_flags_ISR2 global OM_flags_mode global DM_flags_deco global cpu_speed_request global cpu_speed_state global timebase global eventbase global isr_timeout_timer global isr_timeout_reload global total_divetime_secs global counted_divetime_mins global counted_divetime_secs global apnoe_surface_secs global apnoe_surface_mins global apnoe_dive_secs global apnoe_dive_mins global sampling_rate global sampling_timer global simulatormode_depth global hud_status_byte global hud_battery_mv ;----------------------------------------------------------------------------- hwos CODE ;============================================================================= global init_ostc init_ostc: ; Oscillator banksel common ; select bank common movlw b'01110010' movwf OSCCON ; 16 MHz INTOSC movlw b'00001000' movwf OSCCON2 ; secondary oscillator running movlw b'00000000' movwf OSCTUNE ; 4x PLL disable (Bit 6) - only works with 8 or 16MHz (=32 or 64MHz) movlw coding_speed_normal ; coding for normal CPU speed movwf cpu_speed_request ; store CPU shall run with normal speed movwf cpu_speed_state ; store CPU does run with normal speed ;bcf RCON,SBOREN ; brown-out off (not needed here, is handled in bootloader) bcf RCON,IPEN ; priority interrupts off banksel WDTCON movlw b'10000000' movwf WDTCON ; setup watchdog ; I/O Ports banksel 0xF16 ; addresses, F16h through F5Fh, are also used by SFRs, but are not part of the access RAM clrf REFOCON ; no reference oscillator active on REFO pin clrf ODCON1 ; disable open drain capability clrf ODCON2 ; disable open drain capability clrf ODCON3 ; disable open drain capability clrf CM1CON ; disable clrf CM2CON ; disable clrf CM3CON ; disable movlw b'11000000' ; ANSEL, AN7 and AN6 -> Analog inputs, PORTA is digital movwf ANCON0 movlw b'00000111' ; ANSEL, AN8, AN9, AN10 -> Analog input movwf ANCON1 movlw b'00000010' ; ANSEL, AN17 -> Analog input movwf ANCON2 banksel common ; movlw b'00000000' ; 1= input -> Data TFT_high clrf TRISA ; movlw b'00000000' ; init port clrf PORTA movlw b'00000011' ; 1= input, (RB0, RB1) -> switches, RB2 -> Power_MCP, RB3 -> s8_npower, RB4 -> LED_green/rx_nreset, RB5 -> /TFT_POWER movwf TRISB movlw b'00111000' ; init port, rx_nreset=1 -> hard reset RX movwf PORTB movlw b'10011010' ; 1= input, (RC0, RC1) -> SOSC, RC2 -> TFT_LED_PWM, (RC3,RC4) -> I²C, RC5 -> MOSI_MS5541, (RC6, RC7) -> UART1 movwf TRISC ; movlw b'00000000' ; init port clrf PORTC movlw b'00100000' ; 1= input, RD0 -> TFT_NCS, RD1 -> TFT_RS, RD2 -> TFT_NWR, RD3 -> TFT_RD, RD4 -> MOSI_Flash, RD5 -> MISO_Flash, RD6 -> CLK_Flash, RD7 -> TFT_NRESET movwf TRISD ; movlw b'00000000' ; init port clrf PORTD movlw b'00100000' ; 1= input, RE0 -> not_Power_BLE, RE1 -> Power_IR, RE2 -> CS_MCP, RE3 -> LED_blue, RE4 -> power_sw1, RE5 -> leave as input movwf TRISE movlw b'00010001' ; init port movwf PORTE movlw b'01111110' ; 1= input, (RF1, RF2, RF3, RF4, RF5) -> Analog movwf TRISF ; movlw b'00000000' ; init port clrf PORTF movlw b'00001110' ; 1= input, <7:6> not implemented, RG0 -> TX3_PIEZO_CFG, , RG1 -> TX2, RG2 -> RX2, RG3 -> AN17_RSSI, RG4 -> SOSC_OUT, RG5 -> /RESET movwf TRISG movlw b'00000001' ; init port movwf PORTG ; movlw b'00000000' ; 1= input -> Data TFT_low clrf TRISH ; movlw b'00000000' ; init port clrf PORTH movlw b'10011011' ; 1= input, RJ4 -> vusb_in, RJ5 -> power_sw2, RJ6 -> CLK_MS5541, RJ7 -> MISO_MS5541 movwf TRISJ movlw b'00100000' ; init port movwf PORTJ ; disable Charger by default bsf charge_disable ; set charging-inhibit signal bcf charge_enable ; activate charging-inhibit signal ; Timer 0 movlw b'00000001' ; timer0 with 1:4 prescaler movwf T0CON ; Timer 1 - Button hold-down timer movlw b'10001100' ; 32768 Hz clock source, 1:1 prescaler -> ; 30.51757813 µs/bit in TMR1L:TMR1H movwf T1CON ; RTCC banksel 0xF16 ; addresses, F16h through F5Fh, are also used by SFRs, but are not part of the access RAM movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf RTCCFG,RTCWREN ; unlock sequence for RTCWREN bsf RTCCFG,RTCPTR1 bsf RTCCFG,RTCPTR0 bsf RTCCFG,RTCEN ; module enable bsf RTCCFG,RTCOE ; output enable movlw b'00000100' ; 32768 Hz SOCS on RTCC pin (PORTG,4) Bit7-5: pull-ups for Port D, E and J movwf PADCFG1 movlw b'11000000' movwf ALRMCFG ; 1/2 second alarm movlw d'1' movwf ALRMRPT ; alarm repeat counter movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bcf RTCCFG,RTCWREN ; lock sequence for RTCWREN banksel common ; A/D Converter movlw b'00011000' ; power off ADC, select AN6 movwf ADCON0 movlw b'00100000' ; 2.048V Vref+ movwf ADCON1 movlw b'10111010' ; right aligned, 20 x T_AD acquisition time, FOSC/32 -> max. 40 MHz device clock speed movwf ADCON2 ; serial Port 1 (TRISC6/7) movlw b'00001000' ; switch baud generator to 16 bit mode (BRG16=1) movwf BAUDCON1 ; ... ; SPBRGH:SPBRG = .34 : 114285 BAUD @ 16MHz (+0.79% error at 115200 baud) ; SPBRGH:SPBRG = .207 : 19230 BAUD @ 16MHz (-0.16% error at 19200 baud) movlw .34 ; select 114285 baud (low byte) movwf SPBRG1 ; ... clrf SPBRGH1 ; ... (high byte) clrf RCSTA1 ; disable UART RX clrf TXSTA1 ; disable UART TX bcf PORTC,6 ; tie TX output hard to GND ; serial Port 2 (TRISG2) for IR/S8 digital interface ; ; - will be initialized by enable_ir_s8 (eeprom_rs232.asm) in case IR/S8 shall be available ; Timer 3 for IR-RX Timeout IFDEF _external_sensor clrf T3GCON ; reset Timer3 gate control register movlw b'10001101' ; not synced, 1:1 prescaler -> 2 seconds till overrun @ 32768 Hz, ; incrementing by 1 bit each 30.51757813 µs movwf T3CON ENDIF ; SPI Module(s) ; SPI2: External Flash movlw b'00110000' movwf SSP2CON1 ; movlw b'00000000' clrf SSP2STAT ; -> 0.25 MHz Bit clock @ 1 MHz mode (Eco) ; -> 4 MHz Bit clock @ 16 MHz mode (Normal) ; -> 16 MHz Bit clock @ 64 MHz mode (Fastest) ; MSSP1 Module: I2C Master movlw b'00101000' ; I2C master mode movwf SSP1CON1 ; movlw b'00000000' clrf SSP1CON2 movlw 0x9C movwf SSP1ADD ; 100kHz @ 64MHz Fosc ; PWM Module(s) ; PWM 1 for LED dimming movlw b'00001100' movwf CCP1CON movlw b'00000001' movwf PSTR1CON ; pulse steering disabled movlw d'254' movwf PR2 ; period ; 255 is max brightness (300 mW) clrf CCPR1L ; duty cycle clrf CCPR1H ; duty cycle movlw T2CON_NORMAL movwf T2CON ; Timer 5 for ISR-independent wait routines clrf T5GCON ; reset Timer5 gate control register movlw b'10001111' ; not synced, 16 bit mode, 1:1 prescaler -> 2 seconds till overrun @ 32768 Hz, movwf T5CON ; incrementing by 1 bit each 30.51757813 µs banksel 0xF16 ; addresses F16h through F5Fh are also used by SFRs, but are not part of the access RAM ; Timer 7 for 62.5 ms Interrupt (sensor states) clrf T7GCON ; reset Timer7 gate control register movlw b'10001101' ; 1:1 prescaler -> 2 seconds @ 32768 Hz, not synced movwf T7CON clrf TMR7L movlw .248 movwf TMR7H ; -> rollover after 2048 cycles -> 62.5 ms ; turn off unused timers movlw b'11000000' movwf PMD0 IFDEF _external_sensor movlw b'11010001' ELSE movlw b'11011001' ; includes turning off timer 3 ENDIF movwf PMD1 movlw b'11010111' movwf PMD2 movlw b'11111111' movwf PMD3 ; turn off unused CTMU clrf CTMUCONH clrf CTMUCONL clrf CTMUICON banksel common ; Interrupts movlw b'11010000' movwf INTCON movlw b'00001000' ; Bit7=1: pull-up for PORTB disabled movwf INTCON2 movlw b'00000000' movwf INTCON3 movlw b'00000001' ; Bit0: TMR1 movwf PIE1 movlw b'00000010' ; Bit1: TMR3 movwf PIE2 movlw b'00000000' ; Bit1: TMR5 movwf PIE5 movlw b'00000001' ; Bit0: RTCC, Bit5: UART2 (Default OFF) movwf PIE3 movlw b'00001000' ; Bit3: TMR7 movwf PIE5 bcf active_reset_ostc_rx ; release RESET from RX circuitry ;bra power_up_switches global power_up_switches power_up_switches: bsf power_sw1 ; switch on power supply for switch 1 btfss power_sw1 ; power established? bra $-4 ; NO - wait bsf power_sw2 ; switch on power supply for switch 2 btfss power_sw2 ; power established? bra $-4 ; NO - wait return ;============================================================================= ; CPU speed change request functions global request_speed_eco request_speed_eco: movlw coding_speed_eco ; load coding for eco speed movwf cpu_speed_request ; request ISR to change the CPU speed return ; done global request_speed_normal request_speed_normal: movlw coding_speed_normal ; load coding for normal speed movwf cpu_speed_request ; request ISR to change the CPU speed return ; done global request_speed_fastest request_speed_fastest: movlw coding_speed_fastest ; load coding for fastest speed movwf cpu_speed_request ; request ISR to change the CPU speed return ; done ;============================================================================= ; Backup the first 128 bytes from program memory to EEPROM ; global backup_flash_page backup_flash_page: banksel common ; set start address in internal program memory movlw 0x00 ; set 0x000000 movwf TBLPTRL ; ... movwf TBLPTRH ; ... movwf TBLPTRU ; ... TBLRD*- ; dummy read to be in 128 byte block ; set start address in EEPROM EEPROM_SET_ADDRESS eeprom_prog_page0_backup movlw .128 ; copy 1 block = 128 byte movwf eeprom_loop ; initialize loop counter backup_flash_loop: tblrd+* ; read one byte from program memory (with pre-increment) movff TABLAT,EEDATA ; transfer byte from program memory read to EEPROM write call write_eeprom ; execute EEPROM write incf EEADR,F ; increment EEPROM address decfsz eeprom_loop,F ; all 128 byte done? bra backup_flash_loop ; NO - loop return ; YES - done ;============================================================================= ; Restore the first 128 bytes from EEPROM to program memory ; global restore_flash restore_flash: banksel common ;set start address in internal program memory movlw 0x00 ; set 0x000000 movwf TBLPTRL ; ... movwf TBLPTRH ; ... movwf TBLPTRU ; ... TBLRD*- ; dummy read to be in 128 byte block movlw b'10010100' ; setup block erase rcall restore_write ; execute block erase ; set start address in EEPROM EEPROM_SET_ADDRESS eeprom_prog_page0_backup movlw .128 ; copy 1 block = 128 byte movwf eeprom_loop ; initialize loop counter restore_flash_loop: call read_eeprom ; execute EEPROM read incf EEADR,F ; increment EEPROM address movff EEDATA,TABLAT ; transfer byte from EEPROM read to program memory write tblwt+* ; execute program memory write (with pre-increment) decfsz eeprom_loop,F ; all 128 bytes done? bra restore_flash_loop ; NO - loop movlw b'10000100' ; YES - setup block write rcall restore_write ; - execute block write reset ; - done, reset CPU restore_write: movwf EECON1 ; configure operation movlw 0x55 ; unlock sequence movwf EECON2 ; ... movlw 0xAA ; ... movwf EECON2 ; ... bsf EECON1,WR ; execute operation nop ; wait for operation to complete nop ; ... return ; done ;============================================================================= ; Memory clear and move functions, to be used through macros ; global memory_clear memory_clear: clrf POSTINC1 ; clear address decfsz WREG ; decrement loop counter, became zero? bra memory_clear ; NO - loop return ; YES - done global memory_move memory_move: movff POSTINC1,POSTINC2 ; copy from-to decfsz WREG ; decrement loop counter, became zero? bra memory_move ; NO - loop return ; YES - done END