??? 03/12/10 20:56 Read: times |
#174083 - Code in Interrupt Responding to: ???'s previous message |
void ext_int_0(void) interrupt 0 ;external interrupt 0 { #pragma asm ;SRC directive must be active to use this. clr EA ;disable interrupts jb PS2_DATA, the_end ;start bit must be 0 mov R0, #08 ;bits in a byte counter clr A getbyte: ; look for +ve edge wait_till_clk_high: jnb PS2_CLK, wait_till_clk_high ;==> while(clock == low); ; look for -ve edge wait_till_clk_low: jb PS2_CLK, wait_till_clk_low ;==> while(clock == high); ; little delay mov R1, #8 djnz r1, $ ;reading LSB 20us after -ve edge ; okay go on... mov c, PS2_DATA rrc a ;LSB is clokced in first djnz R0,getbyte ;repeat for whole byte /*----now byte is in ACC----*/ ;we have only 900 us to waste finally: mov R0, write_counter ;i.e. #0x00 movx @R0, A ;save ACC to external RAM (8-bit addr) inc write_counter mov A, write_counter xrl A, #200 ;write_counter: 0-199 are valid jz pwned ;clear write_counter if = 200 ajmp wait ;else exit ISR pwned: mov write_counter,#0 ;clear write_counter wait: mov R1, #200 ;waste ~400us to allow the parity & stop bits to pass... djnz R1, $ ;MUST WASTE MIN 224us mov R1, #200 djnz R1, $ the_end: setb EA #pragma endasm /*===========================================================*/ ;end of inline ASM };ISR ends some registers do need to be pushed: ACC, R0, R1, PSW, DPTR etc but almost half are redundant. Optimization level: 8:reuse common entry code does memory model & assigning a particular register bank to ISR have an effect on this? |
Topic | Author | Date |
How to control PUSHes & POPs in interrupt? | 01/01/70 00:00 | |
Don't know in Keil but | 01/01/70 00:00 | |
What is the Code in the interupt? | 01/01/70 00:00 | |
Code in Interrupt | 01/01/70 00:00 | |
Once you use ASM, the optimiser gives up | 01/01/70 00:00 | |
OR | 01/01/70 00:00 | |
Questions![]() | 01/01/70 00:00 | |
Use alternate register set... | 01/01/70 00:00 | |
Yes, That's it. | 01/01/70 00:00 | |
Using X | 01/01/70 00:00 | |
Just Remember | 01/01/70 00:00 | |
The cost... | 01/01/70 00:00 |