home *** CD-ROM | disk | FTP | other *** search
- module AUTO_ALARM flag '-r3'
-
- title
- 'Automobile intrusion alarm 29 Sep. 1983
- ABEL design example, Data I/O Corp.'
-
- U1 device 'P16R4'; " Declare our target device
-
- " Constants:
-
- ON = 1;
- OFF = 0;
- H = 1;
- L = 0;
- x = .X.; " ABEL 'don't care' symbol
- c = .C.; " ABEL 'clocking input' symbol
-
- " State definitions (i.e. binary value of output register STATES):
-
- DISARMED = ^b1111; " These are arbitrary binary state
- READY = ^b1110; " numbers. See text.
- WARNING = ^b1100;
- ARMED = ^b1101;
- ALERT = ^b1001;
- ALARM = ^b1011;
-
- " Pin names:
-
- ACCESSORY pin 2; " Input pins
- IGNITION pin 3;
- TRIP_HIGH pin 4;
- TRIP_LOW pin 5;
- TIMER_IN pin 6;
-
- CLK pin 1; " Clock pin
-
- TONE pin 19; " Output pins
- HORN pin 18;
- START_TIMER pin 13;
- STATES3, " STATES, set of output pins
- STATES2,
- STATES1,
- STATES0 pin 17, 16, 15, 14;
- STATES = [STATES3, STATES2, STATES1, STATES0];
-
- " Macros:
-
- TRIP macro
- { (TRIP_HIGH # !TRIP_LOW) & !IGNITION }; " true if switch tripped
-
- UNTRIPPED macro
- { !TRIP_HIGH & TRIP_LOW & !IGNITION }; " true when all switches
- " untripped
-
- WAIT_FOR_TIMEOUT macro
- { TIMER_IN & !IGNITION }; " true waiting for timeout
-
- TIMEOUT macro
- { !TIMER_IN & !IGNITION }; " true on timeout
-
-
- """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
-
- state_diagram STATES
-
- state DISARMED: !TONE = OFF;
- !HORN = OFF;
- START_TIMER = OFF;
- if ACCESSORY then READY
- else DISARMED; " wait for arming
-
- state READY: !TONE = OFF;
- !HORN = OFF;
- START_TIMER = OFF;
- case TRIP : WARNING; " go to WARNING when
- UNTRIPPED : READY; " switch tripped
- IGNITION : DISARMED; " (driver exits)
- endcase;
-
- state WARNING: !TONE = ON; " warning tone ON
- !HORN = OFF;
- START_TIMER = OFF;
- case TRIP : WARNING;
- UNTRIPPED : ARMED; " arm when all
- IGNITION : DISARMED; " switches untripped
- endcase;
-
- state ARMED: !TONE = OFF;
- !HORN = OFF;
- START_TIMER = OFF;
- case TRIP : ALERT; " ALERT on tripped
- UNTRIPPED : ARMED; " switch
- IGNITION : DISARMED;
- endcase;
-
- state ALERT: !TONE = ON; " warning tone ON
- !HORN = OFF;
- START_TIMER = ON; " start timeout
- case WAIT_FOR_TIMEOUT : ALERT;
- TIMEOUT : ALARM;
- IGNITION : DISARMED;
- endcase;
-
- state ALARM: !TONE = OFF; " howl until key is
- !HORN = ON; " switched to
- START_TIMER = OFF; " IGNITION
- if IGNITION then DISARMED
- else ALARM;
-
- """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
-
- test_vectors ( [ACCESSORY, IGNITION, TRIP_HIGH, TRIP_LOW, TIMER_IN, CLK] ->
- [STATES, TONE, HORN, START_TIMER] )
-
- " specify [inputs] -> [outputs]
-
- " A I T T T C T H S <-- Column labels
- " C G R R I L O O T
- " C N P P M K N R R
- " H L E STATES E N T
-
- [x, H, x, x, x, c] -> [DISARMED, 1, 1, 0]; " IGNITION initializes
- [H, L, x, x, x, c] -> [READY, 1, 1, 0];
- [x, L, H, H, x, c] -> [WARNING, 0, 1, 0]; " WARNING via TRIP_HIGH
-
- [x, H, x, x, x, c] -> [DISARMED, 1, 1, 0];
- [H, L, x, x, x, c] -> [READY, 1, 1, 0];
- [x, L, L, L, x, c] -> [WARNING, 0, 1, 0]; " WARNING via TRIP_LOW
- [x, L, L, L, x, c] -> [WARNING, 0, 1, 0];
- [x, L, L, H, x, c] -> [ARMED, 1, 1, 0]; " ARMED when untripped
- [x, L, H, H, x, c] -> [ALERT, 0, 1, 1]; " ALERT via TRIP_HIGH
-
- [x, H, x, x, x, c] -> [DISARMED, 1, 1, 0];
- [H, L, x, x, x, c] -> [READY, 1, 1, 0];
- [x, L, L, L, x, c] -> [WARNING, 0, 1, 0];
- [x, L, L, H, x, c] -> [ARMED, 1, 1, 0];
- [x, L, L, H, x, c] -> [ARMED, 1, 1, 0]; " wait till tripped
- [x, L, L, L, x, c] -> [ALERT, 0, 1, 1]; " ALERT via TRIP_LOW
-
- [x, L, x, x, H, c] -> [ALERT, 0, 1, 1]; " wait for timeout
- [x, L, x, x, L, c] -> [ALARM, 1, 0, 0]; " ALARM when timeout
- [x, L, x, x, x, c] -> [ALARM, 1, 0, 0]; " Honk till IGNITION
- [x, H, x, x, x, c] -> [DISARMED, 1, 1, 0];
-
- end AUTO_ALARM;
-
-