Mercurial > public > hwos_code
comparison src/isr.asm @ 640:8c1f1f334275
3.13 release
author | heinrichsweikamp |
---|---|
date | Thu, 29 Oct 2020 09:29:15 +0100 |
parents | 2737ddc643bb |
children | 7d8a4c60ec1a 5b7fe7777425 |
comparison
equal
deleted
inserted
replaced
639:0ff82370991d | 640:8c1f1f334275 |
---|---|
1 ;============================================================================= | 1 ;============================================================================= |
2 ; | 2 ; |
3 ; File isr.asm * combined next generation V3.09.5 | 3 ; File isr.asm * combined next generation V3.11.1 |
4 ; | 4 ; |
5 ; INTERUPT subroutines | 5 ; INTERUPT subroutines |
6 ; | 6 ; |
7 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. | 7 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. |
8 ;============================================================================= | 8 ;============================================================================= |
38 movff PRODL,PROD_backup+0 ; back-up PRODL | 38 movff PRODL,PROD_backup+0 ; back-up PRODL |
39 movff PRODH,PROD_backup+1 ; back-up PRODH | 39 movff PRODH,PROD_backup+1 ; back-up PRODH |
40 ; serve buttons | 40 ; serve buttons |
41 btfsc PIR1,TMR1IF ; timer 1 interrupt (button hold-down timer)? | 41 btfsc PIR1,TMR1IF ; timer 1 interrupt (button hold-down timer)? |
42 rcall timer1int ; YES - reset timer | 42 rcall timer1int ; YES - reset timer |
43 btfsc PIR5,TMR4IF ; timer 4 interrupt (button debounce) | |
44 rcall timer4int ; YES, serve the interrupt | |
43 btfsc INTCON,INT0IF ; right button activity? | 45 btfsc INTCON,INT0IF ; right button activity? |
44 rcall isr_switch_right ; YES - check right switch | 46 rcall isr_switch_right ; YES - check right switch |
45 btfsc INTCON3,INT1IF ; left button activity? | 47 btfsc INTCON3,INT1IF ; left button activity? |
46 rcall isr_switch_left ; YES - check left switch | 48 rcall isr_switch_left ; YES - check left switch |
47 | 49 |
105 btfsc lv_core ; on OSTC with low voltage core? | 107 btfsc lv_core ; on OSTC with low voltage core? |
106 movlw b'01100010' ; YES - reduce to 8 MHz | 108 movlw b'01100010' ; YES - reduce to 8 MHz |
107 movwf OSCCON ; set prescaler | 109 movwf OSCCON ; set prescaler |
108 bsf OSCTUNE,6 ; switch on x4 PLL -> 64 MHz on high voltage core, 32 MHz on low voltage core | 110 bsf OSCTUNE,6 ; switch on x4 PLL -> 64 MHz on high voltage core, 32 MHz on low voltage core |
109 movlw T2CON_FASTEST ; PWM1 dimming factor for speed 'fastest' | 111 movlw T2CON_FASTEST ; PWM1 dimming factor for speed 'fastest' |
110 ;bra isr_adjust_speed_exit | 112 bra isr_adjust_speed_exit |
113 | |
114 ; Attention: fill-up the gap between the end of this section | |
115 ; and the next section which starts at 0x00080 !! | |
116 nop | |
117 | |
118 block_0_code_end: ; marker to find end of code in block 0 in linker report file | |
119 | |
120 | |
121 ;============================================================================= | |
122 ; Code to be placed at a fixed Position: Jump-Vector for the Bootloader | |
123 ; | |
124 restore CODE 0x00080 ; restore first flash page from EEPROM | |
125 | |
126 restore_flash_0x00080: | |
127 goto restore_flash | |
128 ; | |
129 ;============================================================================= | |
130 | |
131 | |
132 ;============================================================================= | |
133 isr_handler CODE 0x00084 | |
134 ;============================================================================= | |
111 | 135 |
112 isr_adjust_speed_exit: | 136 isr_adjust_speed_exit: |
113 movwf T2CON ; adjust PWM1 for LED dimming | 137 movwf T2CON ; adjust PWM1 for LED dimming |
114 btfss OSCCON,HFIOFS ; PLL stabilized? | 138 btfss OSCCON,HFIOFS ; PLL stabilized? |
115 bra isr_adjust_speed_exit ; NO - loop to give it some more time | 139 bra isr_adjust_speed_exit ; NO - loop to give it some more time |
116 return ; YES - done | 140 return ; YES - done |
117 | 141 |
118 ; Attention: fill-up the gap between the end of this section | |
119 ; and the next section which starts at 0x00080 !! | |
120 ;nop | |
121 | |
122 block_0_code_end: ; marker to find end of code in block 0 in linker report file | |
123 | |
124 | |
125 ;============================================================================= | |
126 ; Code to be placed at a fixed Position: Jump-Vector for the Bootloader | |
127 ; | |
128 restore CODE 0x00080 ; restore first flash page from EEPROM | |
129 | |
130 restore_flash_0x00080: | |
131 goto restore_flash | |
132 ; | |
133 ;============================================================================= | |
134 | |
135 | |
136 ;============================================================================= | |
137 isr_handler CODE 0x00084 | |
138 ;============================================================================= | |
139 | |
140 ;----------------------------------------------------------------------------- | 142 ;----------------------------------------------------------------------------- |
141 ; Handle digitally-attached external Sensors | 143 ; Handle digitally-attached external Sensors |
142 ; | 144 ; |
143 ; take a byte received on IR/S8 link and slot it into the RX buffer | 145 ; take a byte received on IR/S8 link and slot it into the RX buffer |
144 ; | 146 ; |
275 MOVII FSR0_backup,FSR0L ; - restore FSR0 | 277 MOVII FSR0_backup,FSR0L ; - restore FSR0 |
276 return ; - done | 278 return ; - done |
277 | 279 |
278 ENDIF ; _external_sensor | 280 ENDIF ; _external_sensor |
279 | 281 |
282 | |
283 ;----------------------------------------------------------------------------- | |
284 ; Timer 4 - Button debounce (For new digital piezo circuit) | |
285 | |
286 timer4int: | |
287 bcf PIR5,TMR4IF | |
288 decfsz debounce_counter,F | |
289 return | |
290 bcf T4CON,TMR4ON ; Stop timer 4 | |
291 clrf TMR4 ; reset | |
292 | |
293 movff opt_cR_button_right,WREG ; 20-100; mH: opt_cR_button_right will also affect left button | |
294 bcf STATUS,C ; clear carry bit | |
295 rrcf WREG ; /2 -> 10-50 | |
296 bcf STATUS,C ; clear carry bit | |
297 rrcf WREG ; /2 -> 5-25 | |
298 decf WREG,W ; -1 | |
299 decf WREG,W ; -1 | |
300 decf WREG,W ; -1 -> 2-22 | |
301 | |
302 ; movlw .5 ; initial delay | |
303 movwf debounce_counter ; multiples of 16ms | |
304 return | |
305 | |
306 timer4_restart: | |
307 movlw .5 ; extra delay | |
308 movwf debounce_counter | |
309 clrf TMR4 ; reset | |
310 bcf INTCON3,INT1IF ; clear ext. int 1 request | |
311 bcf INTCON,INT0IF ; clear ext. int 0 request | |
312 bsf INTCON,INT0IE ; enable INT0 IRQ | |
313 bsf INTCON3,INT1IE ; enable INT1 IRQ | |
314 return | |
280 | 315 |
281 ;----------------------------------------------------------------------------- | 316 ;----------------------------------------------------------------------------- |
282 ; Tasks every 62.5 ms: Buttons, Dimming, Pressure/Temperature Sensor and CPU Speed | 317 ; Tasks every 62.5 ms: Buttons, Dimming, Pressure/Temperature Sensor and CPU Speed |
283 ; | 318 ; |
284 isr_tmr7: | 319 isr_tmr7: |
286 | 321 |
287 banksel 0xF16 ; TMR7H/L are not part of the access RAM | 322 banksel 0xF16 ; TMR7H/L are not part of the access RAM |
288 movlw .248 ; reload timer 7, high byte (8x256 ticks -> 62.5 ms) | 323 movlw .248 ; reload timer 7, high byte (8x256 ticks -> 62.5 ms) |
289 movwf TMR7H ; ... (keep low byte running ) | 324 movwf TMR7H ; ... (keep low byte running ) |
290 | 325 |
291 btfss update_surface_pressure ; shall update the surface pressure? | 326 btfss update_surface_pressure ; shall update the surface pressure? |
292 bra isr_tmr7_0 ; NO - skip | 327 bra isr_tmr7_1 ; NO - skip |
293 bcf update_surface_pressure ; YES - clear request flag | 328 bcf update_surface_pressure ; YES - clear request flag |
294 MOVII pressure_abs_ref,pressure_surf ; - update surface pressure | 329 MOVII pressure_abs_ref,pressure_surf ; - update surface pressure |
295 | 330 |
296 isr_tmr7_0: | 331 isr_tmr7_1: |
297 call get_analog_switches ; get analog readings - bank-safe, but CAUTION: returns in bank common | 332 call get_analog_switches ; get analog readings - bank-safe, but CAUTION: returns in bank common |
298 banksel isr_backup ; back to ISR default bank | 333 banksel isr_backup ; back to ISR default bank |
299 | 334 |
300 btfss INTCON3,INT1IE ; external IRQ 1 enabled? | 335 btfss INTCON3,INT1IE ; external IRQ 1 enabled? |
301 bra isr_tmr7_a ; NO - skip next | 336 bra isr_tmr7_2 ; NO - skip next |
302 btfsc analog_sw2_pressed ; YES - analog switch 2 pressed? | 337 btfsc analog_sw2_pressed ; YES - analog switch 2 pressed? |
303 rcall isr_switch_left ; NO - get digital readings of left switch | 338 rcall isr_switch_left ; NO - get digital readings of left switch |
304 isr_tmr7_a: | 339 |
340 isr_tmr7_2: | |
305 btfss INTCON,INT0IE ; external IRQ 0 enabled? | 341 btfss INTCON,INT0IE ; external IRQ 0 enabled? |
306 bra isr_tmr7_b ; NO - skip next | 342 bra isr_tmr7_3 ; NO - skip next |
307 btfsc analog_sw1_pressed ; YES - analog switch 1 pressed? | 343 btfsc analog_sw1_pressed ; YES - analog switch 1 pressed? |
308 rcall isr_switch_right ; NO - get digital readings of right switch | 344 rcall isr_switch_right ; NO - get digital readings of right switch |
309 isr_tmr7_b: | 345 |
310 btfss block_sensor_interrupt ; sensor interrupts disabled? | 346 isr_tmr7_3: |
311 bra isr_tmr7_c ; NO - continue | 347 btfsc block_sensor_interrupt ; sensor interrupts disabled? |
312 bra sensor_int_state_exit ; YES - goto exit | 348 bra sensor_int_state_exit ; YES - goto exit |
313 isr_tmr7_c: | 349 ;bra isr_tmr7_4 ; NO - continue |
350 | |
351 isr_tmr7_4: | |
314 movf max_CCPR1L,W ; dim value | 352 movf max_CCPR1L,W ; dim value |
315 cpfseq CCPR1L ; = current PWM value? | 353 cpfseq CCPR1L ; = current PWM value? |
316 rcall isr_dimm_tft ; NO - adjust until max_CCPR1L = CCPR1L | 354 rcall isr_dimm_tft ; NO - adjust until max_CCPR1L = CCPR1L |
317 | 355 |
318 IFDEF _external_sensor | 356 IFDEF _external_sensor |
357 | |
319 decfsz ir_s8_timeout,F ; decrement IR/S8 timeout counter, became zero? | 358 decfsz ir_s8_timeout,F ; decrement IR/S8 timeout counter, became zero? |
320 bra isr_tmr7_2 ; NO - continue | 359 bra isr_sensor_state2 ; NO - continue with sensor |
321 movlw ir_timeout_value ; YES - get timeout value (in multiples of 62.5 ms) | 360 movlw ir_timeout_value ; YES - get timeout value (in multiples of 62.5 ms) |
322 movwf ir_s8_timeout ; - reload timeout timer | 361 movwf ir_s8_timeout ; - reload timeout timer |
323 btfsc ext_input_optical ; - optical input in use? | 362 btfsc ext_input_optical ; - optical input in use? |
324 bra isr_tmr7_1a ; YES - clear data | 363 bra isr_tmr7_5 ; YES - clear data |
325 TSTOSS opt_s8_mode ; NO - S8 input in use? | 364 TSTOSS opt_s8_mode ; NO - S8 input in use? |
326 bra isr_tmr7_2 ; NO - must be analog interface in use, keep data | 365 bra isr_sensor_state2 ; NO - must be analog interface in use, keep data |
327 ;bra isr_tmr7_1a ; YES - clear data | 366 ;bra isr_tmr7_5 ; YES - clear data |
328 | 367 |
329 isr_tmr7_1a: | 368 isr_tmr7_5: |
330 clrf hud_status_byte ; S8/IR timeout clears all analog input readings to zero -> fallback will be triggered when in sensor mode | 369 clrf hud_status_byte ; S8/IR timeout clears all analog input readings to zero -> fallback will be triggered when in sensor mode |
331 CLRI hud_battery_mv ; clear battery voltage | 370 CLRI hud_battery_mv ; clear battery voltage |
332 | 371 |
333 banksel sensor1_mv ; select bank where sensor data are stored | 372 banksel sensor1_mv ; select bank where sensor data are stored |
334 CLRI sensor1_mv ; clear all sensor data | 373 CLRI sensor1_mv ; clear all sensor data |
345 CLRI s8_rawdata_sensor3 ; clear all sensor data (raw data) | 384 CLRI s8_rawdata_sensor3 ; clear all sensor data (raw data) |
346 clrf s8_rawdata_sensor3+2 | 385 clrf s8_rawdata_sensor3+2 |
347 banksel isr_backup ; back to ISR default bank | 386 banksel isr_backup ; back to ISR default bank |
348 | 387 |
349 bsf trigger_S8_data_update ; signal a data update | 388 bsf trigger_S8_data_update ; signal a data update |
350 ENDIF | 389 |
351 | 390 ENDIF ; _external_sensor |
352 isr_tmr7_2: | 391 |
353 | 392 isr_sensor_state2: |
354 ;isr_sensor_state2: | |
355 btfss sensor_state_counter,0 ; every 1/4 second | 393 btfss sensor_state_counter,0 ; every 1/4 second |
356 bsf trigger_quarter_second ; set flag | 394 bsf trigger_quarter_second ; set flag |
357 | 395 |
358 btfss speed_is_normal ; CPU running on normal speed? | 396 btfss speed_is_normal ; CPU running on normal speed? |
359 rcall isr_set_speed_to_normal ; NO - set CPU speed to normal | 397 rcall isr_set_speed_to_normal ; NO - set CPU speed to normal |
849 | 887 |
850 ;----------------------------------------------------------------------------- | 888 ;----------------------------------------------------------------------------- |
851 ; Check Buttons | 889 ; Check Buttons |
852 ; | 890 ; |
853 isr_switch_right: | 891 isr_switch_right: |
854 bcf INTCON,INT0IE ; clear external interrupt 0 | 892 bcf INTCON,INT0IE ; disable external interrupt 0 |
893 | |
894 btfsc button_hold_down_allowed,A ; ignore for mechanical push buttons | |
895 bra isr_switch_right2 | |
896 btfsc T4CON,TMR4ON ; Timer4 running? | |
897 bra timer4_restart ; Yes, restart | |
898 isr_switch_right2: | |
899 | |
855 btfss flip_screen ; 180° flipped? | 900 btfss flip_screen ; 180° flipped? |
856 bsf switch_right ; NO - set flag for right button | 901 bsf switch_right ; NO - set flag for right button |
857 btfsc flip_screen ; 180° flipped? | 902 btfsc flip_screen ; 180° flipped? |
858 bsf switch_left ; YES - set flag for left button | 903 bsf switch_left ; YES - set flag for left button |
859 bra isr_switch_common ; continue with common part | 904 bra isr_switch_common ; continue with common part |
860 | 905 |
861 isr_switch_left: | 906 isr_switch_left: |
862 bcf INTCON3,INT1IE ; clear external interrupt 1 | 907 bcf INTCON3,INT1IE ; disable external interrupt 1 |
908 | |
909 btfsc button_hold_down_allowed,A ; ignore for mechanical push buttons | |
910 bra isr_switch_left2 | |
911 btfsc T4CON,TMR4ON ; Timer4 running? | |
912 bra timer4_restart ; Yes, restart | |
913 isr_switch_left2: | |
914 | |
863 btfss flip_screen ; 180° flipped? | 915 btfss flip_screen ; 180° flipped? |
864 bsf switch_left ; NO - set flag for left button | 916 bsf switch_left ; NO - set flag for left button |
865 btfsc flip_screen ; 180° flipped? | 917 btfsc flip_screen ; 180° flipped? |
866 bsf switch_right ; YES - set flag for right button | 918 bsf switch_right ; YES - set flag for right button |
867 ;bra isr_switch_common ; continue with common part | 919 ;bra isr_switch_common ; continue with common part |
868 | 920 |
869 isr_switch_common: | 921 isr_switch_common: |
922 btfss button_hold_down_allowed,A ; ignore for mechanical push buttons | |
923 bsf T4CON,TMR4ON ; Start timer 4 | |
924 | |
870 btfsc tmr5_preemtion_allowed ; timer 5 preemption allowed? | 925 btfsc tmr5_preemtion_allowed ; timer 5 preemption allowed? |
871 bsf PIR5,TMR5IF ; YES - preempt timer 5 | 926 bsf PIR5,TMR5IF ; YES - preempt timer 5 |
872 movlw TMR1H_VALUE_FIRST ; load timer 1 (in steps of 7.8125 ms) | 927 movlw TMR1H_VALUE_FIRST ; load timer 1 (in steps of 7.8125 ms) |
873 movwf TMR1H ; ... | 928 movwf TMR1H ; ... |
874 clrf TMR1L ; ... | 929 clrf TMR1L ; ... |
875 bsf T1CON,TMR1ON ; start timer 1 | 930 bsf T1CON,TMR1ON ; start timer 1 |
876 bcf INTCON3,INT1IF ; clear timer 1 IRQ request | 931 bcf INTCON3,INT1IF ; clear ext. int 1 request |
877 bcf INTCON,INT0IF ; clear timer 0 IRQ request | 932 bcf INTCON,INT0IF ; clear ext. int 0 request |
878 return ; done | 933 return ; done |
879 | 934 |
880 | 935 |
881 ;----------------------------------------------------------------------------- | 936 ;----------------------------------------------------------------------------- |
882 ; Button hold-down Interrupt | 937 ; Button hold-down Interrupt |
883 ; | 938 ; |
884 timer1int: | 939 timer1int: |
885 bcf PIR1,TMR1IF ; clear timer 1 IRQ request | 940 bcf PIR1,TMR1IF ; clear timer 1 IRQ request |
886 bcf INTCON,INT0IF ; clear timer 0 IRQ request | 941 bcf INTCON,INT0IF ; clear ext. int 0 request |
887 bcf INTCON3,INT1IF ; clear timer 1 IRQ request | 942 bcf INTCON3,INT1IF ; clear ext. int 1 request |
888 | 943 |
889 ; digital | 944 ; digital |
890 btfss switch_left1 ; left button hold-down? | 945 btfss switch_left1 ; left button hold-down? |
891 bra timer1int_left ; YES | 946 bra timer1int_left ; YES |
892 btfss switch_right2 ; right button hold-down? | 947 btfss switch_right2 ; right button hold-down? |