X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=ROM2%2Fmotors.c;h=efed7cc73a85255be7cdacc015db394cc2b4c104;hb=77e73f29dba77e76df09c5b93f61a446e1fd8714;hp=3fd99a2bf5077081b4ef8517e1bc86c39b39737b;hpb=24ecd46fb709e0b5994f6c3fa77c400ae9b92efa;p=uccvend-snackrom.git diff --git a/ROM2/motors.c b/ROM2/motors.c index 3fd99a2..efed7cc 100644 --- a/ROM2/motors.c +++ b/ROM2/motors.c @@ -1,6 +1,20 @@ #include "motors.h" #include "vend.h" +const u8 motor_lookup[80] = +{ 1,12,23,34,46,57,68,79, + 11,22,33,44,56,67,78,89, + 21,32,43,54,66,77,88,99, + 31,42,53,64,76,87,98, + 9,41,52,63,74,86,97, + 8,19,51,62,73,84,96, + 7,18,29,61,72,83,94, + 6,17,28,39,71,82,93, + 4,16,27,38,49,81,92, + 3,14,26,37,48,59,91, + 2,13,24,36,47,58,69, +}; + void motor_shift_send(u8 data) { u8 i; /* load it in, MSB first */ @@ -10,15 +24,19 @@ void motor_shift_send(u8 data) { else bclr_misc_output(A3800_MOTOR_DATA); + delay(1); + /* clock pulse */ bset((void*)&_io_ports[M6811_PORTA], PORTA_MOTOR_CLOCK); + delay(1); bclr((void*)&_io_ports[M6811_PORTA], PORTA_MOTOR_CLOCK); + delay(1); data = data << 1; } } -void motor_on(u8 slot) { +void set_motor(u8 slot) { u8 row, col; row = slot%10; col = slot/10; @@ -37,36 +55,44 @@ void motor_on(u8 slot) { break; default: /* < 8 */ motor_shift_send(1 << col); /* cols from 0..7 */ + bclr((void*)&_io_ports[M6811_PORTA], PORTA_MOTOR_COL_DISABLE); } motor_shift_send(1 << (row-1)); /* rows from 1..8 here */ bclr((void*)&_io_ports[M6811_PORTA], PORTA_MOTOR_CLOCK); +} + +void motor_start() { bclr_changer_output(A3000_MOTOR_ROW_DISABLE); } -void motors_off() { +void motor_pause() { + bset_changer_output(A3000_MOTOR_ROW_DISABLE); +} + +void motor_stop() { bset_changer_output(A3000_MOTOR_ROW_DISABLE); - delay(10); /* XXX cf motors_off */ bset((void*)&_io_ports[M6811_PORTA], PORTA_MOTOR_COL_DISABLE); bclr_misc_output(A3800_MOTOR_COL8_ENABLE | A3800_MOTOR_COL9_ENABLE); } bool motor_here(u8 slot) { u8 i, c = 0; - motor_on(slot); + set_motor(slot); for (i=0; i < 8; i++) { + motor_start(); delay(5); - if (_io_ports[M6811_PORTE] & PORTE_MOTOR_OVERVOLTAGE) { + if ((_io_ports[M6811_PORTE] & PORTE_MOTOR_OVERVOLTAGE) == 0) { c++; - if (c == 0xff) { - motors_off(); + if (c == 3) { + motor_stop(); return 1; - } else - continue; + } } + motor_pause(); } - motors_off(); + motor_stop(); return 0; } @@ -75,62 +101,62 @@ bool is_motor(u8 slot) { return motor_here(slot); } -bool left_home(u8 slot) { - u8 i, r = slot%10; +bool start_motor(u8 slot) { + u16 i; + u8 r = slot%10; if (r >= 5) r--; - r = 1 << r; - - for (i = 0; i < 5; i++) - if ((home_sensors & r) == 0) return 1; - + r = 1 << (r-1); + set_motor(slot); + motor_start(); + delay(50); + for (i = 0; i < 1000; i++) { + if ((home_sensors & r) != 0) return 1; + delay(1); + } /* it never left */ + motor_stop(); return 0; } bool back_home(u8 slot) { u8 i, r = slot%10; if (r >= 5) r--; - r = 1 << r; + r = 1 << (r-1); for (i = 0; i < 5; i++) { - if (home_sensors & r) return 1; - if ((_io_ports[M6811_PORTE] & PORTE_MOTOR_OVERCURRENT) == 0) return 1; + if ((home_sensors & r) == 0) return 1; + delay(1); } - /* it never left */ + /* it never arrived */ return 0; } +#define is_overcurrent() ((_io_ports[M6811_PORTE] & PORTE_MOTOR_NOT_OVERCURRENT)==0) bool motor_overcurrent() { - u8 t = 0, i = 0; - while(1) { - t++; - if (7 == t) return 1; - if (_io_ports[M6811_PORTE] & PORTE_MOTOR_OVERCURRENT) continue; + u8 good_passes = 0, t; + for (t = 0; t < 8; t++) { + delay(1); + if (is_overcurrent()) continue; t = 0; - i++; - if (5 == i) return 0; + good_passes++; + if (good_passes == 5) return 0; } + return 1; } u8 dispense_motor(u8 slot) { if (!is_motor(slot)) return MOTOR_NOSLOT; - - motor_on(slot); - - if (!left_home(slot)) { - motors_off(); - return MOTOR_HOME_FAIL; - } + if (!start_motor(slot)) return MOTOR_HOME_FAIL; + delay(100); while (1) { if (motor_overcurrent()) { - motors_off(); + motor_stop(); return MOTOR_CURRENT_FAIL; } - /* something should call motor_here? */ if (back_home(slot)) { - motors_off(); + motor_stop(); return MOTOR_SUCCESS; } }