diff --git a/PROJECT/services/coin.c b/PROJECT/services/coin.c index 767a60c..2e49c13 100644 --- a/PROJECT/services/coin.c +++ b/PROJECT/services/coin.c @@ -8,19 +8,57 @@ #include "modem.h" #include - OS_STK CoinTaskStk[COIN_TASK_STK_SIZE]; void InitImpInput(void); -CPU_INT32U CoinImpCounter; -CPU_INT32U CashImpCounter; +static CPU_INT32U CoinImpCounter; +static CPU_INT32U CashImpCounter; +static CPU_INT32U BankImpCounter; +static CPU_INT32U HopperImpCounter; -static CPU_INT32U cash_pulse = 5000; -static CPU_INT32U cash_pause = 2000; +static CPU_INT32U coin_pulse = 50; +static CPU_INT32U coin_pause = 20; +static char pend_coin_counter = 0; +static CPU_INT32U pend_coin_timestamp; + +static CPU_INT32U cash_pulse = 50; +static CPU_INT32U cash_pause = 20; static char pend_cash_counter = 0; static CPU_INT32U pend_cash_timestamp; +static CPU_INT32U bank_pulse = 50; +static CPU_INT32U bank_pause = 20; +static char pend_bank_counter = 0; +static CPU_INT32U pend_bank_timestamp; + +static CPU_INT32U hopper_pulse = 50; +static CPU_INT32U hopper_pause = 20; +static char pend_hopper_counter = 0; +static CPU_INT32U pend_hopper_timestamp; + +static CPU_INT32U signal_error_hopper_pulse = 1000; +static char pend_upsignal_error_hopper_counter; +static char pend_downsignal_error_hopper_counter; +static CPU_INT32U pend_signal_error_hopper_timestamp; + +static CPU_INT32U signal_nomoney_hopper_pulse = 1000; +static char pend_upsignal_nomoney_hopper_counter; +static char pend_downsignal_nomoney_hopper_counter; +static CPU_INT32U pend_signal_nomoney_hopper_timestamp; + +static CPU_INT32U cashLevel; +static CPU_INT32U coinLevel; +static CPU_INT32U bankLevel; +static CPU_INT32U hopperLevel; +static CPU_INT32U SignalHopperLevel; + +CPU_INT32U period; +CPU_INT32U period_cash; +CPU_INT32U period_bank; +CPU_INT32U period_signal; +CPU_INT32U period_hopper; + void SetCashPulseParam(CPU_INT32U pulse, CPU_INT32U pause) { #if OS_CRITICAL_METHOD == 3 @@ -178,6 +216,56 @@ CPU_INT32U GetResetCashCount(void) return ctr; } +// получить число импульсов от банковского терминала +CPU_INT32U GetbankCount() +{ + #if OS_CRITICAL_METHOD == 3 + OS_CPU_SR cpu_sr = 0; + #endif + OS_ENTER_CRITICAL(); + CPU_INT32U ctr = BankImpCounter; + OS_EXIT_CRITICAL(); + return ctr; +} + +// получить число импульсов от банковского терминала и сбросить счетчик +CPU_INT32U GetResetbankCount() +{ + #if OS_CRITICAL_METHOD == 3 + OS_CPU_SR cpu_sr = 0; + #endif + OS_ENTER_CRITICAL(); + CPU_INT32U ctr = BankImpCounter; + BankImpCounter = 0; + OS_EXIT_CRITICAL(); + return ctr; +} + +// получить число импульсов от хоппера +CPU_INT32U GetHopperCount() +{ + #if OS_CRITICAL_METHOD == 3 + OS_CPU_SR cpu_sr = 0; + #endif + OS_ENTER_CRITICAL(); + CPU_INT32U ctr = HopperImpCounter; + OS_EXIT_CRITICAL(); + return ctr; +} + +// получить число импульсов от хоппера и сбросить счетчик +CPU_INT32U GetHopperbankCount() +{ + #if OS_CRITICAL_METHOD == 3 + OS_CPU_SR cpu_sr = 0; + #endif + OS_ENTER_CRITICAL(); + CPU_INT32U ctr = HopperImpCounter; + HopperImpCounter = 0; + OS_EXIT_CRITICAL(); + return ctr; +} + // инициализация монетоприемника void InitCoin(void) { @@ -187,64 +275,206 @@ void InitCoin(void) OSTaskCreate(CoinTask, (void *)0, (OS_STK *)&CoinTaskStk[COIN_TASK_STK_SIZE-1], COIN_TASK_PRIO); } +CPU_INT32U input_register() +{ + CPU_INT32U input = 0; + + // 0 бит монетоприемник + if (FIO0PIN_bit.P0_23) + { + SETBIT(input, 0); + } + // 1 бит + if (FIO0PIN_bit.P0_26) + { + SETBIT(input, 1); + } + // 2 бит + if (FIO1PIN_bit.P1_25) + { + SETBIT(input, 2); + } + // 3 бит + if (FIO1PIN_bit.P1_24) + { + SETBIT(input, 2); + } + // 4 бит + if (FIO1PIN_bit.P1_23) + { + SETBIT(input, 3); + } + + return input; +} + +static CPU_INT32U input_event = 0; +static CPU_INT32U prev_input = 0; +static CPU_INT32U curr_input = 0; + +CPU_INT32U T3CR = 0; void InputCapture_ISR(void) { - CPU_INT08U ir = T3IR; - static CPU_INT32U period = 0; - static CPU_INT32U period_cash = 0; T3IR = 0xFF; - if (ir & 0x10) - {// CR0 interrupt - - if (FIO0PIN_bit.P0_23) - {// пришел задний фронт - CPU_INT32U cr=T3CR0; - if (((cr-period) > COIN_IMP_MIN_LEN) - && ((cr-period) < COIN_IMP_MAX_LEN)) - CoinImpCounter++; - } - else - {// пришел передний фронт - period = T3CR0; - } - } + // наращиваем тики + T3CR++; - if (ir & 0x20) - {// CR1 interrupt + curr_input = input_register(); + input_event = curr_input^prev_input; + prev_input = curr_input; + + // монетоприемник + if(TSTBIT(input_event, 0)) + { + if ((!FIO0PIN_bit.P0_23 && cashLevel) || (FIO0PIN_bit.P0_23 && !cashLevel)) + { // пришел задний фронт + CPU_INT32U cr=T3CR; + cr -= period_cash; + + if (cr > (cash_pulse - COIN_IMP_SPAN)) + { + pend_cash_counter = 1; + pend_cash_timestamp = OSTimeGet(); + } + } + else + { // пришел передний фронт + period_cash = T3CR; + pend_cash_counter = 0; + } + } + + // банковский терминал + if(TSTBIT(input_event, 1)) + { + if ((!FIO0PIN_bit.P0_26 && bankLevel) || (FIO0PIN_bit.P0_26 && !bankLevel)) + { // пришел задний фронт + CPU_INT32U cr=T3CR; + cr -= period_bank; + + if (cr > (bank_pulse - COIN_IMP_SPAN)) + { + pend_bank_counter = 1; + pend_bank_timestamp = OSTimeGet(); + } + } + else + { // пришел передний фронт + period_bank = T3CR; + pend_bank_counter = 0; + } + } + + // хоппер в режиме импульсов + if(TSTBIT(input_event, 2)) + { + if ((!FIO1PIN_bit.P1_25 && hopperLevel) || (FIO1PIN_bit.P1_25 && !hopperLevel)) + { // пришел задний фронт + CPU_INT32U cr=T3CR; + cr -= period_hopper; + + if (cr > (hopper_pulse - COIN_IMP_SPAN)) + { + pend_hopper_counter = 1; + pend_hopper_timestamp = OSTimeGet(); + } + } + else + { // пришел передний фронт + period_hopper = T3CR; + pend_hopper_counter = 0; + } + } - if (FIO0PIN_bit.P0_24) - {// пришел задний фронт - CPU_INT32U cr=T3CR1; - cr -= period_cash; - if ((cr > (cash_pulse - COIN_IMP_SPAN)) - && (cr < (cash_pulse + COIN_IMP_SPAN))) - { - pend_cash_counter = 1; - pend_cash_timestamp = OSTimeGet(); - } - } - else - {// пришел передний фронт - period_cash = T3CR1; - pend_cash_counter = 0; - } - } + // сигнал ошибки хоппера + if(TSTBIT(input_event, 3)) + { + pend_signal_error_hopper_timestamp = OSTimeGet(); + + if ((FIO1PIN_bit.P1_23 && SignalHopperLevel) || (!FIO1PIN_bit.P1_23 && !SignalHopperLevel)) + { + pend_upsignal_error_hopper_counter = 1; + pend_downsignal_error_hopper_counter = 0; + } + else + { + pend_upsignal_error_hopper_counter = 0; + pend_downsignal_error_hopper_counter = 1; + } + } + + // сигнал отсутствия денег в хоппере + if(TSTBIT(input_event, 4)) + { + pend_signal_nomoney_hopper_timestamp = OSTimeGet(); + + if ((FIO1PIN_bit.P1_24 && SignalHopperLevel) || (!FIO1PIN_bit.P1_24 && !SignalHopperLevel)) + { + pend_upsignal_nomoney_hopper_counter = 1; + pend_downsignal_nomoney_hopper_counter = 0; + } + else + { + pend_upsignal_nomoney_hopper_counter = 0; + pend_downsignal_nomoney_hopper_counter = 1; + } + } } - extern CPU_INT32U BSP_CPU_PclkFreq (CPU_INT08U pclk); +void InitInputPorts() +{ + // монетоприемник + PINSEL1_bit.P0_23 = 0; + if(cashLevel)PINMODE1_bit.P0_23 = 3; + else PINMODE1_bit.P0_23 = 0; + FIO0DIR_bit.P0_23 = 0; + FIO0MASK_bit.P0_23 = 0; + + // банковский терминал + PINSEL1_bit.P0_26 = 0; + if(cashLevel)PINMODE1_bit.P0_26 = 3; + else PINMODE1_bit.P0_26 = 0; + FIO0DIR_bit.P0_26 = 0; + FIO0MASK_bit.P0_26 = 0; + + // хоппер в режиме импульсов + PINSEL3_bit.P1_25 = 0; + if(bankLevel)PINMODE3_bit.P1_25 = 3; + else PINMODE3_bit.P1_25 = 0; + FIO1DIR_bit.P1_25 = 0; + FIO1MASK_bit.P1_25 = 0; + + // сигнал состояния хоппера + PINSEL3_bit.P1_23 = 0; + PINMODE3_bit.P1_23 = 0; + FIO1DIR_bit.P1_23 = 0; + FIO1MASK_bit.P1_23 = 0; + + // сигнал наличия монет в хоппере + PINSEL3_bit.P1_24 = 0; + PINMODE3_bit.P1_24 = 0; + FIO1DIR_bit.P1_24 = 0; + FIO1MASK_bit.P1_24 = 0; +} + /* -P0.23 MK_P9 IMPULSE OUTPUT (импульсный выход монетоприемника) -P0.24 MK_P8 INHIBIT (блокировка) +P0.23 MK_P9 импульсный выход монетоприемника +P0.26 MK_P6 импульсный выход банковского терминала +P1.25 MK_P39 импульсный выход хоппера + +P1.23 MK_P37 Security Output с хоппером все в порядке - LOW +P1.24 MK_P38 Низкий уровень монет. Есть монеты - сигнал LOW. */ + // инициализация импульсного входа // используется CAP3.0 void InitImpInput (void) { - #define INPUT_CAPTURE_FREQ 100000 // частота тактирования частотных входов + #define INPUT_CAPTURE_FREQ 1000 // частота тактирования частотных входов CPU_INT32U pclk_freq; CPU_INT32U rld_cnts; @@ -253,31 +483,30 @@ void InitImpInput (void) OS_CPU_SR cpu_sr = 0; #endif + OnChangeCoinPulseLen(); OnChangeCashPulseLen(); - + OnChangeBankPulseLen(); + OnChangeHopperPulseLen(); + OS_ENTER_CRITICAL(); - + + // назначим все ножки + InitInputPorts(); + PCONP_bit.PCTIM3 = 1; PCLKSEL1_bit.PCLK_TIMER3 = 2; - - PINSEL1_bit.P0_23 = 0x3; - PINMODE1_bit.P0_23 = 0; - FIO0DIR_bit.P0_23 = 0; - FIO0MASK_bit.P0_23 = 0; - PINSEL1_bit.P0_24 = 0x3; - PINMODE1_bit.P0_24 = 0; - FIO0DIR_bit.P0_24 = 0; - FIO0MASK_bit.P0_24 = 0; - pclk_freq = BSP_CPU_PclkFreq(23); - rld_cnts = pclk_freq / INPUT_CAPTURE_FREQ; + rld_cnts = pclk_freq / INPUT_CAPTURE_FREQ / 2; T3CTCR_bit.CTM = 0; T3CTCR_bit.CIS = 0; // select CAP3.0 input T3PR = rld_cnts-1; - T3MCR = 0; - T3CCR = 0x3F; + + T3MR0 = 1; + T3MCR = 3; + + T3CCR = 0x00; T3EMR = 0; T3TCR = 0x03; T3TCR = 0x01; @@ -288,7 +517,7 @@ void InitImpInput (void) VICINTENABLE = (1 << VIC_TIMER3); T3IR = 0xFF; - + OS_EXIT_CRITICAL(); } diff --git a/PROJECT/services/coin.h b/PROJECT/services/coin.h index 38df10c..32846a1 100644 --- a/PROJECT/services/coin.h +++ b/PROJECT/services/coin.h @@ -19,6 +19,13 @@ extern CPU_INT32U GetCashCount(void); extern CPU_INT32U GetResetCashCount(void); extern void SetCashPulseParam(CPU_INT32U pulse, CPU_INT32U pause); +#define BIT(bit) (1UL << (bit)) + +#define SETBIT(Val,bit) ((Val) |= BIT(bit)) +#define CLRBIT(Val,bit) ((Val) &= ~BIT(bit)) +#define XORBIT(Val,bit) ((Val) ^= BIT(bit)) +#define TSTBIT(Val,bit) ((Val) & BIT(bit)) + #endif //#ifndef _COIN_H_ diff --git a/settings/sk-mlpc2368.wsdt b/settings/sk-mlpc2368.wsdt index 2d38caa..9ddccac 100644 --- a/settings/sk-mlpc2368.wsdt +++ b/settings/sk-mlpc2368.wsdt @@ -10,7 +10,7 @@ - 210 + 177 27 27 27 @@ -76,75 +76,83 @@ TextEditor $WS_DIR$\PROJECT\app\app_serv.c 0 - 292 - 17841 - 17858 - - - TextEditor - $WS_DIR$\PROJECT\services\ftp_client.c - 0 - 735 - 21346 - 21346 - - - TextEditor - $WS_DIR$\PROJECT\app\host_app.c - 0 - 272 - 7189 - 7189 - - - TextEditor - $WS_DIR$\PROJECT\app\ftp_app.c - 0 - 3 - 55 - 55 - - - TextEditor - $WS_DIR$\PROJECT\app\host_app.h - 0 - 0 - 776 - 776 - - - TextEditor - $WS_DIR$\PROJECT\drivers\lcd\lcd.c - 0 - 457 - 11064 - 11064 + 566 + 18843 + 18843 TextEditor $WS_DIR$\PROJECT\services\validator.c 0 - 285 - 10320 - 10336 + 338 + 8384 + 8384 TextEditor - $WS_DIR$\OS\app\app.c + $WS_DIR$\PROJECT\services\coin.c 0 - 33 - 1131 - 1131 + 221 + 5327 + 5327 + 2 TextEditor - $WS_DIR$\PROJECT\menu\menu.h + $WS_DIR$\PROJECT\services\coin.h 0 0 - 314 - 314 + 741 + 741 + + + TextEditor + $WS_DIR$\PROJECT\services\time.c + 0 + 55 + 1532 + 1532 + + + TextEditor + $WS_DIR$\PROJECT\drivers\ccnet\CCRSProtocol.h + 0 + 0 + 434 + 434 + + + TextEditor + $WS_DIR$\PROJECT\app\app_serv.h + 0 + 27 + 1127 + 1127 + + + TextEditor + $WS_DIR$\PROJECT\data\datadesc.h + 0 + 201 + 7402 + 7402 + + + TextEditor + $WS_DIR$\PROJECT\data\datadesc.c + 0 + 136 + 6348 + 6348 + + + TextEditor + $WS_DIR$\OS\bsp\iolpc2368.h + 0 + 797 + 17962 + 17962 - 8 0 @@ -175,16 +183,16 @@ -2 -2 - 498 - 301 + 517 + 268 -2 -2 200 200 146413 275862 - 221816 - 689655 + 197657 + 715862 @@ -202,14 +210,14 @@ -2 -2 - 182 + 163 1368 -2 -2 1370 - 184 + 165 1002928 - 253793 + 227586 146413 275862 diff --git a/sk-mlpc2368.dep b/sk-mlpc2368.dep index 24d93d2..63272a3 100644 --- a/sk-mlpc2368.dep +++ b/sk-mlpc2368.dep @@ -1734,6 +1734,10 @@ + + BICOMP + 100 299 295 300 296 297 298 242 243 311 314 313 304 308 301 306 315 302 305 303 316 312 88 309 104 98 85 107 94 97 99 115 106 307 317 86 206 230 1 84 192 227 220 222 209 225 199 219 233 92 205 112 116 195 118 232 212 226 223 197 191 218 213 271 273 279 246 255 290 288 266 291 258 252 272 210 253 236 + ICCARM 100 299 295 300 296 338 297 298 242 243 311 314 313 304 308 301 306 315 302 305 303 316 312 88 309 104 98 85 107 94 97 99 115 106 307 317 86 206 230 1 84 192 227 220 222 209 225 199 219 233 92 205 112 116 195 118 232 212 226 223 197 191 218 213 271 273 279 246 255 290 288 266 291 258 252 272 210 253 236