Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
05/11/04 13:31
Read: times


 
#70172 - RE: managing different states & timer
Responding to: ???'s previous message
hi,

First of all, the new thread is not required to be started, anyway...
Some words about debouncing. You said:

this high and low does not require any debouncing checks further this high and low comes from Human action on a device so the time of this low and high will be not be too fast.

The matter of debouncing is not the speed produced with people fingers when (s)he manupulates with button but the multiple pulses which come from contacts of button. When button is pressed/realized, it produces not single edge but a couple ones.

Now about lookup table. If you still wish to use State Machine then you need with structure which describes the each bit in. Collect all things related for a bit:
- mask of bit related to input port;
- one flag to hold the bit process status (there are two states: initial_scan/repeat_scan);
- one byte to hold scan delay counter;
- three bytes of data to be sent (first_low_state detected, back_to_high_state detected; continue_low_state detected).

Now, you need to write one subroutine which accepts actual pointer to the structure of currently processed bit. Simple example (not optimized and absolute addresses are used to be clean):
 

; some global variables 
BITS_STATUS EQU 0x20 ; bits` process statuses 
; delay counters 
BIT0_DELAY  EQU 0x21 
BIT1_DELAY  EQU 0x22 
BIT2_DELAY  EQU 0x23 
BIT3_DELAY  EQU 0x24 
BIT4_DELAY  EQU 0x25 
BIT5_DELAY  EQU 0x26 
BIT6_DELAY  EQU 0x27 
BIT7_DELAY  EQU 0x28 

START: 
; initialize all delays to base scan values (BITx_DELAY) 
; clear all bits` statuses (BITS_STATUS) 
  CALL INIT_BIT_PROC
;
MAIN_LOOP: 
; wait for timer quanta (via timer or simple DJNZ loops for needed time)
  CALL WAIT_QUANTA
;
  MOV R7,#0           ; process bits from 0... 
NEXT_BIT: 
  CALL PROCESS_BIT 
  INC  R7 
  CJNE R7,#8,NEXT_BIT ; ...to 7 
; ... 

; bit processor 
; R7 - bit number 
PROCESS_BIT: 
; locate corresponded structure 
  MOV DPTR,#BITS_LOOKUP 
  MOV  A,R7 
  ADD  A,R7 
  ADD  A,DPL 
  MOV  DPL,A 
  JNC  PROCESS_BIT_0 
  INC  DPH 
PROCESS_BIT_0: 
; get descriptor pointer into DPTR 
  MOV  A,#1 
  MOVC A,@A+DPTR ; low byte of its address 
  PUSH ACC 
  CLR  A 
  MOVC A,@A+DPTR ; high byte 
  MOV  DPH,A 
  POP  DPL 
; now DPTR contains the address of bit process descriptor - let start to process 
; a) check if delay done 
  MOV  A,#1 
  MOVC A,@A+DPTR ; delay holder address 
  MOV  R0,A 
  MOV  A,@R0 ; delay value 
  DEC  A 
  JZ   PROCESS_BIT_1 
; still need to wait: 
  MOV  @R0,A 
  RET 
PROCESS_BIT_1: 
b) check real bit state in port 
  CLR  A 
  MOVC A,@A+DPTR 
  MOV  R1,A ; bit mask 
  ANL  A,P2 ; check bit state in port 
  MOV  C,P ; c is equ bit state 
; c) process bit state depending on process status 
  MOV  A,R1 
  ANL  A,BITS_STATUS 
  JNZ  PROCESS_BIT_R ; state: repeat_scan... 
; state: initial_scan 
  JNC  PROCESS_BIT_L ; low level detected... 
; still in high state: reload initial scan delay 
  MOV  @R0,#1 ; check bit again at next cycle 
  RET 

PROCESS_BIT_L: 
; first_low_state detected
; - change process status
  MOV  A,R1
  ORL  BITS_STATUS,A ; set status (repeat scan)
; - change delay value
  MOV  @R0,#DELAY_5_SEC ; depends on time quanta
; - send data byte via P1
  MOV  A,#2
  MOVC A,@A+DPTR  ; first_low_state
  MOV  P1,A  
  RET

PROCESS_BIT_R: 
; state: repeat_scan
  JNC  PROCESS_BIT_H ; back-to-high level detected...
; continue_low_state detected:
; - keep delay value
  MOV  @R0,#DELAY_5_SEC
; - send data byte via P1
  MOV  A,#3
  MOVC A,@A+DPTR  ; continue_low_state
  MOV  P1,A
  RET

PROCESS_BIT_H:
; back-to-high level detected:
; - restore process status
  MOV  A,R1
  CPL  A
  ANL  BITS_STATUS,A ; reset status (initial scan)
; - restore delay value
  MOV  @R0,#1
; - send data byte via P1
  MOV  A,#4
  MOVC A,@A+DPTR  ; back_to_high_state
  MOV  P1,A
  RET

; ...
; ...
; ...

; structure for process bit 0: 
BIT0_DESCRIPTOR: 
    DB 00000001b      ; mask for both input port and process status 
    DB BIT0_TIMER     ; delay holder address
    DB 0xA0,0xB0,0xC0 ; data to be sent

; structure for process bit 1: 
BIT1_DESCRIPTOR: 
    DB 00000010b
    DB BIT1_TIMER
    DB 0xA1,0xB1,0xC1  

; etc  for rest bits you need to control
; .... 

; common table of all descriptors` addresses
BITS_LOOKUP: 
    DW BIT0_DESCRIPTOR 
    DW BIT1_DESCRIPTOR 
    DW BIT2_DESCRIPTOR 
    DW BIT3_DESCRIPTOR 
    DW BIT4_DESCRIPTOR 
    DW BIT5_DESCRIPTOR 
    DW BIT6_DESCRIPTOR 
    DW BIT7_DESCRIPTOR 

Sorry if mistakes/errors - no time for tests...

Regards,
Oleg

List of 24 messages in thread
TopicAuthorDate
managing different states & timer            01/01/70 00:00      
   RE: managing different states & timer            01/01/70 00:00      
      Thanks            01/01/70 00:00      
      Understanding your code            01/01/70 00:00      
         RE: Understanding your code            01/01/70 00:00      
      Please only show for two bits            01/01/70 00:00      
         he amazing Waqar with his many names            01/01/70 00:00      
            Two Bits expalin if possible            01/01/70 00:00      
               Warning: Waqar Zaka is back.            01/01/70 00:00      
                  RE: Warning: Waqar Zaka is back.            01/01/70 00:00      
                     RE: Warning: Waqar Zaka is back.            01/01/70 00:00      
                     RE: Warning: Waqar Zaka is back.            01/01/70 00:00      
                        How to close Posts            01/01/70 00:00      
         RE: Please only show for two bits            01/01/70 00:00      
            Few Questions about the working of code            01/01/70 00:00      
   Ya waqar zaka is back SO            01/01/70 00:00      
      RE: Ya waqar zaka is back SO            01/01/70 00:00      
      RE: Ya waqar zaka is back SO            01/01/70 00:00      
   Please Oleg Sergeev            01/01/70 00:00      
      RE: Please Oleg Sergeev            01/01/70 00:00      
      RE: Please Oleg Sergeev            01/01/70 00:00      
         RE: Please Oleg Sergeev            01/01/70 00:00      
            RE: no please anymore            01/01/70 00:00      
               Thankyou ALL            01/01/70 00:00      

Back to Subject List