home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 15 / 15.iso / s / s199 / 1.img / ALARM.ABL < prev    next >
Encoding:
Text File  |  1986-02-04  |  5.8 KB  |  147 lines

  1. module     AUTO_ALARM  flag '-r3'
  2.  
  3. title      
  4. 'Automobile intrusion alarm         29 Sep. 1983
  5. ABEL design example, Data I/O Corp.'
  6.  
  7.      U1    device      'P16R4';           " Declare our target device
  8.  
  9. " Constants:
  10.  
  11.      ON          =     1;
  12.      OFF         =     0;
  13.      H           =     1;
  14.      L           =     0;
  15.      x           =     .X.;              " ABEL 'don't care' symbol
  16.      c           =     .C.;              " ABEL 'clocking input' symbol
  17.  
  18. " State definitions (i.e. binary value of output register STATES):
  19.  
  20.      DISARMED    =     ^b1111;           " These are arbitrary binary state
  21.      READY       =     ^b1110;           "   numbers.  See text.
  22.      WARNING     =     ^b1100;
  23.      ARMED       =     ^b1101;
  24.      ALERT       =     ^b1001;
  25.      ALARM       =     ^b1011;
  26.  
  27. " Pin names:
  28.  
  29.      ACCESSORY   pin   2;                " Input pins
  30.      IGNITION    pin   3;
  31.      TRIP_HIGH   pin   4;
  32.      TRIP_LOW    pin   5;
  33.      TIMER_IN    pin   6;
  34.  
  35.      CLK         pin   1;                " Clock pin
  36.  
  37.      TONE        pin   19;               " Output pins
  38.      HORN        pin   18;
  39.      START_TIMER pin   13;
  40.      STATES3,                            " STATES, set of output pins
  41.      STATES2,
  42.      STATES1,
  43.      STATES0     pin   17, 16, 15, 14;
  44.      STATES      =     [STATES3, STATES2, STATES1, STATES0];
  45.  
  46. " Macros:
  47.  
  48.      TRIP        macro
  49.            { (TRIP_HIGH # !TRIP_LOW) & !IGNITION };  " true if switch tripped
  50.  
  51.      UNTRIPPED   macro 
  52.            { !TRIP_HIGH & TRIP_LOW & !IGNITION };    " true when all switches
  53.                                                      "   untripped
  54.  
  55.      WAIT_FOR_TIMEOUT  macro
  56.            { TIMER_IN & !IGNITION };                 " true waiting for timeout
  57.  
  58.      TIMEOUT     macro
  59.            { !TIMER_IN & !IGNITION };                " true on timeout
  60.  
  61.  
  62. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  63.                         
  64. state_diagram  STATES
  65.  
  66.      state DISARMED:   !TONE       = OFF;
  67.                        !HORN       = OFF;
  68.                        START_TIMER = OFF;
  69.                        if ACCESSORY then READY
  70.                                     else DISARMED;         " wait for arming
  71.  
  72.      state READY:      !TONE       = OFF;
  73.                        !HORN       = OFF;
  74.                        START_TIMER = OFF;
  75.                        case  TRIP        :     WARNING;    " go to WARNING when
  76.                              UNTRIPPED   :     READY;      "   switch tripped
  77.                              IGNITION    :     DISARMED;   "   (driver exits)
  78.                        endcase;
  79.  
  80.      state WARNING:    !TONE       = ON;                   " warning tone ON
  81.                        !HORN       = OFF;
  82.                        START_TIMER = OFF;
  83.                        case  TRIP        :     WARNING;
  84.                              UNTRIPPED   :     ARMED;      " arm when all
  85.                              IGNITION    :     DISARMED;   " switches untripped
  86.                        endcase;
  87.  
  88.      state ARMED:      !TONE       = OFF;
  89.                        !HORN       = OFF;
  90.                        START_TIMER = OFF;
  91.                        case  TRIP        :     ALERT;      " ALERT on tripped
  92.                              UNTRIPPED   :     ARMED;      "   switch
  93.                              IGNITION    :     DISARMED;
  94.                        endcase;
  95.  
  96.      state ALERT:      !TONE       = ON;                   " warning tone ON
  97.                        !HORN       = OFF;
  98.                        START_TIMER = ON;                   " start timeout
  99.                        case  WAIT_FOR_TIMEOUT : ALERT;
  100.                              TIMEOUT          : ALARM;
  101.                              IGNITION         : DISARMED;
  102.                        endcase;
  103.  
  104.      state ALARM:      !TONE       = OFF;                  " howl until key is
  105.                        !HORN       = ON;                   "   switched to
  106.                        START_TIMER = OFF;                  "   IGNITION
  107.                        if IGNITION then DISARMED
  108.                                    else ALARM;
  109.  
  110. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  111.  
  112. test_vectors    ( [ACCESSORY, IGNITION, TRIP_HIGH, TRIP_LOW, TIMER_IN, CLK] ->
  113.                   [STATES, TONE, HORN, START_TIMER] )
  114.  
  115.                 " specify [inputs] -> [outputs]
  116.  
  117. "     A  I  T  T  T  C                  T  H  S      <-- Column labels
  118. "     C  G  R  R  I  L                  O  O  T
  119. "     C  N  P  P  M  K                  N  R  R
  120. "           H  L  E           STATES    E  N  T
  121.  
  122.      [x, H, x, x, x, c]  ->  [DISARMED, 1, 1, 0];    " IGNITION initializes
  123.      [H, L, x, x, x, c]  ->  [READY,    1, 1, 0];
  124.      [x, L, H, H, x, c]  ->  [WARNING,  0, 1, 0];    " WARNING via TRIP_HIGH
  125.      
  126.      [x, H, x, x, x, c]  ->  [DISARMED, 1, 1, 0];
  127.      [H, L, x, x, x, c]  ->  [READY,    1, 1, 0];
  128.      [x, L, L, L, x, c]  ->  [WARNING,  0, 1, 0];    " WARNING via TRIP_LOW
  129.      [x, L, L, L, x, c]  ->  [WARNING,  0, 1, 0];
  130.      [x, L, L, H, x, c]  ->  [ARMED,    1, 1, 0];    " ARMED when untripped
  131.      [x, L, H, H, x, c]  ->  [ALERT,    0, 1, 1];    " ALERT via TRIP_HIGH
  132.                                                   
  133.      [x, H, x, x, x, c]  ->  [DISARMED, 1, 1, 0];
  134.      [H, L, x, x, x, c]  ->  [READY,    1, 1, 0];
  135.      [x, L, L, L, x, c]  ->  [WARNING,  0, 1, 0];
  136.      [x, L, L, H, x, c]  ->  [ARMED,    1, 1, 0];
  137.      [x, L, L, H, x, c]  ->  [ARMED,    1, 1, 0];    " wait till tripped
  138.      [x, L, L, L, x, c]  ->  [ALERT,    0, 1, 1];    " ALERT via TRIP_LOW
  139.  
  140.      [x, L, x, x, H, c]  ->  [ALERT,    0, 1, 1];    " wait for timeout
  141.      [x, L, x, x, L, c]  ->  [ALARM,    1, 0, 0];    " ALARM when timeout
  142.      [x, L, x, x, x, c]  ->  [ALARM,    1, 0, 0];    " Honk till IGNITION
  143.      [x, H, x, x, x, c]  ->  [DISARMED, 1, 1, 0];
  144.  
  145. end  AUTO_ALARM;
  146.  
  147.