| ??? 07/01/04 16:06 Read: times |
#73480 - RE: 4th solution :) Responding to: ???'s previous message |
Let me try...
This approach was extremely wasteful on ports because I had nothing else to attach to these ports anyway (would be unused otherwise) and wanted to save every cycle I could in software. For example there's no bitwise XOR command in '52 so I applied a hardware one instead of writing the few lines of code that would perform it, I abuse the port bits 2 and 3 as storage and use bits 4-7 to zero the readout values. Still it's almost 30us per count. The microcontroller polls -one- new interrupt meantime but anything more will be lost. Ok, now bash me for all the newbie mistakes I have made :)
ORG 0003h ; vector IE0 - INT0
PUSH ACC
PUSH PSW
SJMP EN1
;(...)
EN1:
MOV A,E1P ; P0 or P2 - pick current values
JB P,E1_L1 ; Sanity Check - odd number of bits set
INC EB1 ; error counter, diagnostics.
POP PSW
POP ACC
RETI ; False alarm
E1_L1:
MOV PSW,#098h ; bank 3, rest insignificant
JB E1DIR,INC_E1 ; B XOR A' i.e. on P3.0
;DEC_E1:
DEC R3
CJNE R3,#0FFh,E1_L2 ; Underflow, DEC16bit
DEC R2
SJMP E1_L2
INC_E1:
INC R3
CJNE R3,#00,E1_L2
INC R2
E1_L2: SETB TAINT1 ; Set Taint Bit
RL A ;
RL A ; B'=B, A'=A, B=0, A=0
ORL A,#03h ; allow read of A,B
MOV E1P,A
POP PSW
POP ACC
RETI
|



