From a1bfc34c1c294bd975cf5d216ed2db7662cf990d Mon Sep 17 00:00:00 2001 From: ceb Date: Wed, 16 Nov 2005 22:41:35 +0000 Subject: [PATCH] updated panic.asm with new instruction types, cleaned up loops, might work now maybe? --- detpic/panic.asm | 278 +++++++++++++++++++++++++++++++++++------------ detpic/panic.inc | 9 ++ 2 files changed, 220 insertions(+), 67 deletions(-) create mode 100644 detpic/panic.inc diff --git a/detpic/panic.asm b/detpic/panic.asm index 69ff7a7..aefd81f 100644 --- a/detpic/panic.asm +++ b/detpic/panic.asm @@ -9,101 +9,246 @@ ; 10 10 10 00 | 1110 1110 | 1110 00 10 | 10 10 include common.inc + include morse-auto.inc + include ../iwjpictest/insn-aliases.inc + + extern led_green + extern led_red + extern led_black ;--------------------------------------------------------------------------- ; reserved access bank locations -WREG2 equ 00h ; a 2nd working reg :-) -WREG3 equ 01h ; a 3rd working reg :-) -WREG4 equ 02h ; a 4th working reg :-) -BLANK equ 03h ; register full of zeros -TESTFLASH equ 04h ; test LED flash pattern +flash_pattern res 1 +morse_counter res 1 +register_counter res 1 +bit_counter res 1 +BLANK res 1 ; register full of zeros +TESTFLASH res 1 ; test LED flash pattern +; used in panic macro for temporary storage +PANIC_ADDRESS res 1 ; stores condensed form of message start addr. +PANIC_MORSE res 1 ; stores # bytes of morse msg in panic readout +PANIC_REGS res 1 ; stores # registers in panic readout ;--------------------------------------------------------------------------- ; memory location definitions ERROR_BUF_PAGE equ 3 ; error codes on flash p3 -F_ERROR_U equ 30h ; upper part of error memory locations -F_SOS_H equ 00h ; high (middle) part of SOS error memory loc. +F_ERROR_U equ 00h ; upper part of error memory locations +F_SOS_H equ 40h ; high (middle) part of SOS error memory loc. F_SOS_L equ 00h ; lower part of SOS error memory loc. -;--------------------------------------------------------------------------- -; error messages +;**************************************************************************** -err_SOS equ 0 ; msg 0 = SOS + code ;**************************************************************************** - code +; first, copy the panic message address out of WREG + + mov_wf panic_address + +panic_routine +; switch off interrupts and power +; reconfigure timer0 for writing diagnostic msg to the LED + + clr_f INTCON ; disable all interrupts EVER + bc_f PORTC,1 ; switch off booster + + +; re-initialise timer0 config + bc_f T0CON,6 ; p107 Timer0 -> 16bit mode + bc_f T0CON,5 ; timer0 use internal clock + bc_f T0CON,3 ; use prescaler + bc_f T0CON,2 ; } + bs_f T0CON,1 ; } prescale value 1:16 (13ms x 16) + bs_f T0CON,0 ; } + +; get # bytes of morse msg, # registers in panic readout, message start addr. +; back from condensed message start addr. stored in PANIC_ADDRESS + +panic_loop + mov_lw 4 + mul_wf PANIC_ADDRESS + mov_ff PRODL,TBLPTRL + mov_ff PRODH,WREG + add_lw (morse_messages_start)/256 + mov_wf TBLPTRH + clr_f TBLPTRU + + tblrd *+ ; read 1st byte of error message + ; (gives # bytes morse, # bytes registers) + + mov_ff TABLAT,PANIC_MORSE + mov_lw 00001111b + and_wff PANIC_MORSE ; PANIC_MORSE now contains # bytes of morse msgs + + mov_ff TABLAT,PANIC_REGS + mov_lw 01110000b + and_wff PANIC_REGS + swap_f PANIC_REGS ; PANIC_REGS now contains # registers to read + + call led_black + call waiting + call waiting + call waiting + call waiting + call morsemsg ; transmit SOS in red + call led_black + call waiting + call waiting + call waiting + call waiting + call registermsg ; transmit contents of TESTFLASH in + ; red(=low) and blue(=high) + goto panic_loop + ;**************************************************************************** +; PANIC SUBROUTINES -;---------------------------------------- -readout -; Flashes the per-pic led red and black in a specified pattern. +morsemsg +; wrapper round readout to flash the per-pic led red for a +; (currently 4-byte) morse msg + +morse_msg_start + clr_f morse_counter ; clear loop counter + +morse_loop + mov_fw PANIC_MORSE + cmp_fw_ifge morse_counter ; if loop counter >=PANIC_MORSE + return ; return to panic + + tblrd *+ + mov_ff TABLAT,flash_pattern + call morse_readout + inc_f morse_counter + goto morse_loop + + +;-------------------------- +morse_readout + +; Flashes the per-pic led red(0) in a specified pattern. +; ; The pattern is specified as the state for 8 identically-long time ; periods each as long as a morse `dot', encoded into a byte with ; most significant bit first. -; On entry On exit -; W any undefined -; WREG2 flash pattern preserved -; WREG4 any undefined -; - clrf WREG4,0 ; clear loop counter (WREG4) - rrncf WREG2,1 +; On entry On exit +; W any undefined +; flash_pattern flash pattern preserved +; bit_counter any undefined -readout_loop - movlw 8 - cpfslt WREG4,0 ; if loop counter >=8, return + clr_f bit_counter ; clear loop counter + rr_f flash_pattern + +morse_readout_loop + mov_fw PANIC_REGS + cmp_fw_ifge bit_counter ; if loop counter >=PANIC_REGS, return return - rlncf WREG2,1 ; top bit goes into N flag, ie Negative if 1 - bn readout_if_led_on -readout_if_led_off - call led_black - bra readout_endif_led + rl_f flash_pattern ; top bit goes into N, + ;ie Negative if 1 + bra_n morse_readout_if_led_1 -readout_if_led_on - call led_red -readout_endif_led - incf WREG4,1,0 ; increment loop counter - call waiting - bra readout_loop +morse_readout_if_led_0 + call led_black + bra morse_readout_endif_led +morse_readout_if_led_1 + call led_red -;**************************************************************************** -; this is what happens when we panic +morse_readout_endif_led + inc_f bit_counter ; increment loop counter + call waiting + bra morse_readout_loop -informative_panic -; switch off interrupts and power -; reconfigure timer0 for writing diagnostic msg to the LED +;-------------------------- +;-------------------------- +registermsg - clrf INTCON,0 ; disable all interrupts EVER - bcf PORTC,1,0 ; switch off booster +register_msg_start + clr_f register_counter ; clear loop counter - movlw 10101100b - movwf TESTFLASH +register_loop + mov_fw PANIC_REGS + cmp_fw_ifge register_counter ; if loop counter >=PANIC_REGS + return ; return to panic + tblrd *+ + + mov_fw TABLAT ; TABLAT has the 8-bit version + mov_wf FSR0L ; of the address. So, 8 bits + ; go straight into FSR0L. + + mov_lw 0x0f ; For FSR0H, we see if the + mov_fw FSR0H ; address XX is >=0x60. + ; If it is then we meant 0xfXX; + mov_lw 0x5f ; if not then we meant 0x0XX. + cmp_fw_ifle FSR0L ; (This is just like PIC does + clr_f FSR0H ; for insns using Access Bank) + + mov_ff INDF0,flash_pattern + call register_readout + + inc_f register_counter ;increment loop counter + + call waiting + call waiting + goto register_loop + +;-------------------------- + +register_readout + +; Flashes the per-pic led red(0) and green(1) in a specified pattern. +; (black gap between each bit) +; +; The pattern is specified as the state for 8 identically-long time +; periods each as long as a morse `dot', encoded into a byte with +; most significant bit first. +; On entry On exit +; W any undefined +; flash_pattern flash pattern preserved +; bit_counter any undefined + + clr_f bit ; clear loop counter + rr_f flash_pattern + + +register_readout_loop + movlw 8 + cmp_fw_ifge bit_counter ; if loop counter >=8 (register + ; length), return + return + + movlw 4 + cmp_fw_ifne bit_counter ; if loop counter !=4 (nybble length), + ; skip insertion of extra black space + goto not_nybble_boundary + call waiting + +not_nybble_boundary + rlncf flash_pattern,1 ; top bit goes into N flag, + ; ie Negative if 1 + bn register_readout_if_led_1 + +register_readout_if_led_0 + call led_red + bra register_readout_endif_led + +register_readout_if_led_1 + call led_green + +register_readout_endif_led + inc_f bit_counter,1 ; increment loop counter + call waiting + call led_black + call waiting + bra register_readout_loop -; re-initialise timer0 config - bcf T0CON,6,0 ; p107 Timer0 -> 16bit mode - bcf T0CON,5,0 ; timer0 use internal clock - bcf T0CON,3,0 ; use prescaler - bsf T0CON,2,0 ; } - bcf T0CON,1,0 ; } prescale value 1:32 (13ms x 32) - bcf T0CON,0,0 ; } - - clrf BLANK,0 -panic_loop -; errmsg err_SOS,0 ; transmit SOS in red - movff TESTFLASH,WREG2 - rcall readout -; readout BLANK,0 ; transmit blank buffer - call led_green - call waiting - goto panic_loop ;**************************************************************************** ; GENERAL SUBROUTINES @@ -112,14 +257,13 @@ panic_loop waiting ; waits for a fixed interval, depending on the configuration of TMR0 - bcf INTCON,2,0 ; clear timer0 interrupt bit (p109) - clrf TMR0H,0 ; p107 set high byte of timer0 to 0 (buffered, + bc_f INTCON,2 ; clear timer0 interrupt bit (p109) + clr_f TMR0H ; p107 set high byte of timer0 to 0 (buffered, ; only actually set when write to tmr0l occurs) - clrf TMR0L,0 ; set timer0 low byte - timer now set to 0000h + clr_f TMR0L ; set timer0 low byte - timer now set to 0000h loop - btfss INTCON,2,0 ; check whether timer0 interrupt has been set - - ; skip next instruction if so - bra loop + bt_f_if0 INTCON,TMR0IF + bra loop ; wait for timer0 interrupt return diff --git a/detpic/panic.inc b/detpic/panic.inc new file mode 100644 index 0000000..27fb6d4 --- /dev/null +++ b/detpic/panic.inc @@ -0,0 +1,9 @@ +;--------------------------------------------------------------------------- +; macro is passed a message code morse_XY and panics displaying this message +; by flashing the perpic LED + +panic macro message + movlw (message - morse_messages_start)/4 + goto panic_routine + endm + -- 2.30.2