From 287acc8b71c9e299c05b12ebe12f71d53dbcd29e Mon Sep 17 00:00:00 2001 From: zhangsan Date: Thu, 7 Oct 2021 15:32:12 +0800 Subject: [PATCH] =?UTF-8?q?stc8h3ks48=20=E4=BF=AE=E6=94=B9ttss=E6=A1=86?= =?UTF-8?q?=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- keilp/cc_as_stc02_ps5ws.uvprojx | 117 +- si4/ps5ws.si4project/soft_ps5ws.sip_sym | Bin 380132 -> 754532 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xab | Bin 110592 -> 184320 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xad | Bin 1408 -> 2128 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xc | Bin 81472 -> 99688 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xf | Bin 81472 -> 99688 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xm | Bin 136 -> 196 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xr | Bin 81472 -> 99688 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xsb | Bin 49152 -> 102400 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xsd | Bin 808 -> 1328 bytes si4/ps5ws.si4project/soft_ps5ws.siproj | Bin 15272 -> 16584 bytes source/33.txt | 141 --- source/app/app_algorithm.c | 1005 ----------------- source/app/app_algorithm.h | 168 --- source/app/app_calibration.c | 149 --- source/app/app_calibration.h | 71 -- source/app/app_config.c | 107 ++ source/app/app_config.h | 85 ++ source/app/app_flow.c | 95 -- source/app/app_flow.h | 84 -- source/app/app_paraid.c | 124 -- source/app/app_paraid.h | 15 - source/app/app_task_adc.c | 352 ------ source/app/app_task_adc.h | 144 --- source/app/app_task_uart0.c | 24 - source/app/app_task_uart0.h | 12 - source/app/app_ws.c | 131 --- source/app/app_ws.h | 72 -- source/app/common.c | 287 ----- source/app/common.h | 238 ---- source/app/main.c | 112 +- source/app/main.h | 58 +- source/app/task_adc.c | 418 +++++++ source/app/task_adc.h | 119 ++ source/app/task_debug.c | 51 + source/{bsp/bsp_debug.h => app/task_debug.h} | 30 +- source/app/task_encrypt.c | 78 ++ source/app/task_encrypt.h | 52 + source/app/task_modbus.c | 196 ++++ source/app/task_modbus.h | 9 + source/app/task_register.c | 63 ++ source/app/task_register.h | 32 + ...p2019低功耗采样line版本 20200301073727.rar | Bin 8904 -> 0 bytes source/bsp/backu/bsp_433.c | 34 - source/bsp/backu/bsp_433.h | 19 - source/bsp/backu/bsp_cam - 副本 (2).c | 574 ---------- source/bsp/backu/bsp_cam - 副本.c | 574 ---------- source/bsp/backu/bsp_cam.c | 706 ------------ source/bsp/backu/bsp_cam.h | 189 ---- source/bsp/backu/bsp_cam_isr.c | 218 ---- source/bsp/backu/bsp_cam_isr.h | 62 - source/bsp/backu/bsp_func.c | 53 - source/bsp/backu/bsp_func.h | 52 - source/bsp/backu/bsp_gc032a.c | 773 ------------- source/bsp/backu/bsp_gc032a.h | 19 - source/bsp/backu/bsp_msa300.c | 261 ----- source/bsp/backu/bsp_msa300.h | 473 -------- source/bsp/backu/cw63xx.c | 191 ---- source/bsp/backu/cw63xx.h | 123 -- source/bsp/board support/msa300.c | 75 -- source/bsp/board support/msa300.h | 63 -- source/bsp/bsp_485.h | 17 - source/bsp/bsp_config.c | 84 ++ source/bsp/bsp_config.h | 431 +++---- source/bsp/bsp_config0.h | 203 ---- source/bsp/bsp_config_const.h | 156 +++ source/bsp/bsp_debug.c | 14 - source/bsp/bsp_power.c | 128 --- source/bsp/bsp_power.h | 132 --- source/{msp/msp_id.c => bsp/chipid.c} | 5 +- source/{msp/msp_id.h => bsp/chipid.h} | 6 +- source/bsp/{bsp_cs1232.c => cs1232.c} | 55 +- source/bsp/{bsp_cs1232.h => cs1232.h} | 113 +- source/bsp/{bsp_485.c => rs485.c} | 4 +- source/bsp/rs485.h | 13 + source/clib/clib.c | 105 +- source/clib/clib.h | 10 +- source/clib/type.h | 5 +- source/cpu/STARTUP.A51 | 2 +- source/cpu/STC_stc8a8k.H | 210 ++-- source/cpu/{c51_macro.H => stc_macro.h} | 89 +- source/cpu/stc_stc15w.h | 466 ++++++++ source/cpu/stc_stc8f.h | 593 ++++++++++ source/cpu/stc_stc8g1k.h | 746 ++++++++++++ source/cpu/stc_stc8hxx.h | 640 +++++++++++ source/ctask/task.c | 86 +- source/ctask/task.h | 302 ++--- source/ctask/tick.c | 127 +-- source/ctask/tick.h | 218 +--- source/debug/cc_as_stc01_main.ini | 7 - source/debug/cc_ls_03_debug.ini | 6 - source/debug/debug.ini | 123 -- source/debug/debug2.ini | 45 - source/debug/debug_M3sfy.ini | 83 -- source/debug/debug_M3sfy2.ini | 54 - source/debug/debug_app.c | 130 --- source/debug/debug_app.h | 44 - source/debug/debug_drv.c | 48 - source/debug/debug_drv.h | 85 -- source/debug/debug_led.c | 37 - source/debug/debug_led.h | 138 --- source/debug/testiic.uvla | Bin 1187 -> 0 bytes source/debug/复制 2debug_M3sfy.ini | 66 -- source/debug/复制 debug_M3sfy.ini | 129 --- source/msp/UART0.C | 463 ++------ source/msp/UART0.h | 110 +- source/msp/eeprom.c | 223 ++++ source/msp/{msp_eeprom.h => eeprom.h} | 29 +- source/msp/iic_sim.h | 2 - source/msp/msp_eeprom.c | 153 --- source/msp/time.c | 218 +--- source/msp/time.h | 4 +- source/msp/uart2.c | 156 +++ source/msp/uart2.h | 86 ++ source/msp/uart3.c | 170 +++ source/msp/uart3.h | 93 ++ source/msp/uart4.C | 169 +++ source/msp/uart4.h | 88 ++ source/msp/uart_x.c | 211 ++++ source/msp/uart_x.h | 105 ++ source/tpc/0d0a.c | 47 + source/tpc/0d0a.h | 33 + source/tpc/ccmodbus.c | 182 +++ source/tpc/ccmodbus.h | 98 ++ source/tpc/debug.c | 88 ++ source/tpc/{tpc_modbus.h => debug.h} | 42 +- source/tpc/{tpc_modbus.c => modbus.c} | 43 +- source/tpc/modbus.h | 114 ++ source/tpc/tpc_uart.c | 191 ---- source/tpc/tpc_uart.h | 408 ------- source/tpc/tpc_x.h | 24 + .../协议Transfer Protocol Conversion/.keep | 0 132 files changed, 6830 insertions(+), 11773 deletions(-) delete mode 100644 source/33.txt delete mode 100644 source/app/app_algorithm.c delete mode 100644 source/app/app_algorithm.h delete mode 100644 source/app/app_calibration.c delete mode 100644 source/app/app_calibration.h create mode 100644 source/app/app_config.c create mode 100644 source/app/app_config.h delete mode 100644 source/app/app_flow.c delete mode 100644 source/app/app_flow.h delete mode 100644 source/app/app_paraid.c delete mode 100644 source/app/app_paraid.h delete mode 100644 source/app/app_task_adc.c delete mode 100644 source/app/app_task_adc.h delete mode 100644 source/app/app_task_uart0.c delete mode 100644 source/app/app_task_uart0.h delete mode 100644 source/app/app_ws.c delete mode 100644 source/app/app_ws.h delete mode 100644 source/app/common.c delete mode 100644 source/app/common.h create mode 100644 source/app/task_adc.c create mode 100644 source/app/task_adc.h create mode 100644 source/app/task_debug.c rename source/{bsp/bsp_debug.h => app/task_debug.h} (50%) create mode 100644 source/app/task_encrypt.c create mode 100644 source/app/task_encrypt.h create mode 100644 source/app/task_modbus.c create mode 100644 source/app/task_modbus.h create mode 100644 source/app/task_register.c create mode 100644 source/app/task_register.h delete mode 100644 source/bsp/backu/bsp2019低功耗采样line版本 20200301073727.rar delete mode 100644 source/bsp/backu/bsp_433.c delete mode 100644 source/bsp/backu/bsp_433.h delete mode 100644 source/bsp/backu/bsp_cam - 副本 (2).c delete mode 100644 source/bsp/backu/bsp_cam - 副本.c delete mode 100644 source/bsp/backu/bsp_cam.c delete mode 100644 source/bsp/backu/bsp_cam.h delete mode 100644 source/bsp/backu/bsp_cam_isr.c delete mode 100644 source/bsp/backu/bsp_cam_isr.h delete mode 100644 source/bsp/backu/bsp_func.c delete mode 100644 source/bsp/backu/bsp_func.h delete mode 100644 source/bsp/backu/bsp_gc032a.c delete mode 100644 source/bsp/backu/bsp_gc032a.h delete mode 100644 source/bsp/backu/bsp_msa300.c delete mode 100644 source/bsp/backu/bsp_msa300.h delete mode 100644 source/bsp/backu/cw63xx.c delete mode 100644 source/bsp/backu/cw63xx.h delete mode 100644 source/bsp/board support/msa300.c delete mode 100644 source/bsp/board support/msa300.h delete mode 100644 source/bsp/bsp_485.h create mode 100644 source/bsp/bsp_config.c delete mode 100644 source/bsp/bsp_config0.h create mode 100644 source/bsp/bsp_config_const.h delete mode 100644 source/bsp/bsp_debug.c delete mode 100644 source/bsp/bsp_power.c delete mode 100644 source/bsp/bsp_power.h rename source/{msp/msp_id.c => bsp/chipid.c} (90%) rename source/{msp/msp_id.h => bsp/chipid.h} (91%) rename source/bsp/{bsp_cs1232.c => cs1232.c} (91%) rename source/bsp/{bsp_cs1232.h => cs1232.h} (76%) rename source/bsp/{bsp_485.c => rs485.c} (63%) create mode 100644 source/bsp/rs485.h rename source/cpu/{c51_macro.H => stc_macro.h} (59%) create mode 100644 source/cpu/stc_stc15w.h create mode 100644 source/cpu/stc_stc8f.h create mode 100644 source/cpu/stc_stc8g1k.h create mode 100644 source/cpu/stc_stc8hxx.h delete mode 100644 source/debug/cc_as_stc01_main.ini delete mode 100644 source/debug/cc_ls_03_debug.ini delete mode 100644 source/debug/debug.ini delete mode 100644 source/debug/debug2.ini delete mode 100644 source/debug/debug_M3sfy.ini delete mode 100644 source/debug/debug_M3sfy2.ini delete mode 100644 source/debug/debug_app.c delete mode 100644 source/debug/debug_app.h delete mode 100644 source/debug/debug_drv.c delete mode 100644 source/debug/debug_drv.h delete mode 100644 source/debug/debug_led.c delete mode 100644 source/debug/debug_led.h delete mode 100644 source/debug/testiic.uvla delete mode 100644 source/debug/复制 2debug_M3sfy.ini delete mode 100644 source/debug/复制 debug_M3sfy.ini create mode 100644 source/msp/eeprom.c rename source/msp/{msp_eeprom.h => eeprom.h} (61%) delete mode 100644 source/msp/msp_eeprom.c create mode 100644 source/msp/uart2.c create mode 100644 source/msp/uart2.h create mode 100644 source/msp/uart3.c create mode 100644 source/msp/uart3.h create mode 100644 source/msp/uart4.C create mode 100644 source/msp/uart4.h create mode 100644 source/msp/uart_x.c create mode 100644 source/msp/uart_x.h create mode 100644 source/tpc/0d0a.c create mode 100644 source/tpc/0d0a.h create mode 100644 source/tpc/ccmodbus.c create mode 100644 source/tpc/ccmodbus.h create mode 100644 source/tpc/debug.c rename source/tpc/{tpc_modbus.h => debug.h} (65%) rename source/tpc/{tpc_modbus.c => modbus.c} (81%) create mode 100644 source/tpc/modbus.h delete mode 100644 source/tpc/tpc_uart.c delete mode 100644 source/tpc/tpc_uart.h create mode 100644 source/tpc/tpc_x.h delete mode 100644 source/tpc/协议Transfer Protocol Conversion/.keep diff --git a/keilp/cc_as_stc02_ps5ws.uvprojx b/keilp/cc_as_stc02_ps5ws.uvprojx index 646f75d..2c8a7a6 100644 --- a/keilp/cc_as_stc02_ps5ws.uvprojx +++ b/keilp/cc_as_stc02_ps5ws.uvprojx @@ -13,14 +13,14 @@ 0 - STC8F2K64S4 - STC - IRAM(0-0xFF) XRAM(0-0x07FF) IROM(0-0xFFF8) CLOCK(35000000) MODP2 + stc8a8k64s4a12 + stc + - "LIB\STARTUP.A51" ("Standard 8051 Startup Code") + - 63032 - STC8.H + 0 + @@ -36,8 +36,8 @@ d:\Keil\C51\BIN\ - STC\ - STC\ + + 0 0 @@ -107,14 +107,14 @@ 65535 - S8051.DLL + - DP51.DLL - -pDP8051 - S8051.DLL + + + - TP51.DLL - -p51 + + @@ -136,7 +136,7 @@ 0 - "" () + @@ -154,12 +154,12 @@ 0 0 0 - 1 - 1 - 1 + 0 + 0 + 0 0 0 - 1 + 0 0 0 0 @@ -232,17 +232,17 @@ 1 0x0 - 0xfff9 + 0x0 0 0x0 - 0x100 + 0x0 0 0x0 - 0x800 + 0x0 0 @@ -277,7 +277,7 @@ 2 0 1 - 0 + 1 0 @@ -341,19 +341,34 @@ ..\source\app\main.c - common.c + task_adc.c + 1 + ..\source\app\task_adc.c + + + task_debug.c + 1 + ..\source\app\task_debug.c + + + task_register.c + 1 + ..\source\app\task_register.c + + + task_modbus.c 1 - ..\source\app\common.c + ..\source\app\task_modbus.c - app_task_uart0.c + app_config.c 1 - ..\source\app\app_task_uart0.c + ..\source\app\app_config.c - app_task_adc.c + task_encrypt.c 1 - ..\source\app\app_task_adc.c + ..\source\app\task_encrypt.c @@ -381,19 +396,14 @@ ..\source\msp\UART0.C - iic_sim.c + eeprom.c 1 - ..\source\msp\iic_sim.c + ..\source\msp\eeprom.c - msp_eeprom.c + uart_x.c 1 - ..\source\msp\msp_eeprom.c - - - msp_id.c - 1 - ..\source\msp\msp_id.c + ..\source\msp\uart_x.c @@ -401,19 +411,24 @@ bsp - bsp_power.c + bsp_config.c + 1 + ..\source\bsp\bsp_config.c + + + chipid.c 1 - ..\source\bsp\bsp_power.c + ..\source\bsp\chipid.c - bsp_cs1232.c + cs1232.c 1 - ..\source\bsp\bsp_cs1232.c + ..\source\bsp\cs1232.c - bsp_485.c + rs485.c 1 - ..\source\bsp\bsp_485.c + ..\source\bsp\rs485.c @@ -436,9 +451,9 @@ tpc - tpc_modbus.c + modbus.c 1 - ..\source\tpc\tpc_modbus.c + ..\source\tpc\modbus.c @@ -452,16 +467,6 @@ - - debug - - - cc_as_stc01_main.ini - 5 - ..\source\debug\cc_as_stc01_main.ini - - - diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_sym b/si4/ps5ws.si4project/soft_ps5ws.sip_sym index 754f6e3f971187769b594d21118a3e53034720d9..0af0e0d1489efe6691d34456153030607fb74308 100644 GIT binary patch literal 754532 zcmeFa2YejW)rY;VxED+(6w^B@wjmu^l5K$`3rWV5z#!YQEs!lok|{|@NF(h{@4fd% zLVE9o^xhNFdwbLKCgD5JnS15y!z%3VJ^7LE_kI7LXP@2C?#!d3J9qBR&a4kUpi;TK zQklJQnNX$^W>zY1sr>)>|4Ie^dHe0R&uZH;;raWXDhrz}6C_PC&Cp32Tgbm;y>Xfs zX9{QV#5)Pj2W%bNyL+F((wVvYQq6g0jn2n(6q7>}R~Ky^ z?M3^B>xy+<-GiO|McYN|i}sD1dI$HdrM7#&lBZESNR+Y-r$Nm+&*cdGdf)CTHUM?cXD%g`8m#zD2?-|%#Y4Z`m9Q&p0;tq zG|p>^p^2WMk=@0vHAClw<<^3G$dhn}L}{Go$ow4V6^V0qUwiX8*IifW${M`k_rp2< zo=W3PO>>-&t-cLPTb6F5t#^HAo$j5o?c)rI(m2z9M`xZ(>S-I(^mXdoNMF|xoFP#f zXFPM9r|Ii(Zm6$o56+M%jq`k&{~vO0sIOZWoFP#fXZDCW&MT|8=Yb7f>!d~3-#QKs z&X6dL^Fo=Q<2+4!E}a`_9R~$xNR-BTk<9;(IXBQc4hhbXD2?-CnV;i)xM>>$Z9RS6 zokat-s#tl5fPMiIrEy*&^K+b!sP5d~+18=!toP=@@&cS8Q5xr^GC#-p=<3d!+qwpe z?v0yuz4hGOAWy~_5~XqGVUF_(>%5@>QMD^?9va#+BueAFT;}IEAJN@f4*G|-Z7sI$ z9NN8mc(j-pVkoEUtoP!Y}NZv0K`m-yi@KAH0+*)UTQ0sfELsIAMBcqeUT9pmAmO->+E0C+}c|7G_|dnT18!V?jz5p zJwu{2ZG-oT(YZ;VRo@t?TAj!CPKG7bkM&Yi>I}&ZQ+1AZvY(Op(V5>brq;G`Se3Rh zv2$d5qt=H8XGqSQaz3t{A-9Lfl;eD8Rp+s5r&dtsoreWyNS+>?XH@7d${Z@labA%+ zOSiFYba*^2yAeJ!I79M+;9MTlRT%I!-?LWdLzDh_{XkFA)7I5nT-2m*msw1`xv#u{{tFVN z>7P5~KvHy$JzzcWVfU+ZPRCp->ffC@^Y@Rmb!Lwkon!x8Po0;iZ6l{+4$f>}^uHL5Q|`uuLgW3_puFM(*S|9}=ARAJWCGKCY#9Qe)ah%69Ye zW94y<^I_$I=eFM7&hBDhux)VDK*5`oOU!y|eTXY<6cVM`2BR-zyhQ5R29K!Xys5Ww zYuW|QkSL8aBai6ai1X5-t*@^bY#X>h5A|=*6=mG;{uF0Ol*ajZnV;jlVxMzoZ+rhG zeS<}ocP-A*7oM%ZS$%C|k?gy7ZQWapY%9jD4zJI_S@L3z6G8s&kk5nCTq+0pqjz-X zm`APq!G+>HKD@(Wq)}RJ5wL%NWJIQNyb)V&rLs2J5Ar^1D&-TW9#*@sQ%1!HXNWVjbv{Gps-%xW5vL}9rxPqP5SA)uB^cu`Utw&*6?~BGxkrzeg@|zA%6?P=Wn&Pjf0Abea9Fb z-W1}xRHn%IJD?PU@7eMIMrRrS&G>J2j=txLcXXCrW6gD*D+fWZ8DdNE$=zi!w9S-@ z%%Z6;ANZ$r)}u@{?z?Ah-D#GX_i&B8obg7=Sj)I%j@M*4kI;kqg}*m-P8rAlaV@m< z9OqfPhOUdt@*oFBsB=pCzBG)Pa-3)QmRZl&z?tI%k=pkr(yKF_XE_{)Npvdrlm|Gb z)c3K;lW6NXb)L;xU&-=v?@~j~8%Vj>ER=SW<9vtxU{69XjT>A%zdS=vv=e(*o<9DUb{cdT{Scx?BBv0bpkjs0NWelTy)ge&{O$oMwH)42QL&4`i+#)OJ-}RZ>QW#>s-%%aE9;O!OEbx;GEL-b?fBk zInFbk_uc*CgJa5t@;J?Ud647my-&GVe5i9uTjvd#&U1GUU%PwnE?J6CE|SIIoYL00 zOMaeHXPonTiv54r&GL}CrnKXYjk(TaquV^|yh(hhb4pw1^D~_f)blrb+BX$zyViI1 zc67DHJ(w)Gfm|i8VeAQs(j3dZhjhmDb4gDYdC$oMV%@jw$W20>*qf&fa4r#`DxUrL8mj z$Q)&@1QoLiG z>ltq>8Xw!cV`p*g@W_sxlW8#;ykE%c*alM`XqH8NuaJ3Zo$DEIcyEKaunnfP+aSMB zj`QKkHpoTjdP=cgt0@a^AjivVXuq5TO?Vvd>kPSxzFXveY#a4#gGZ#>;Ql9W$5qrt z{MZH~^*)yPJD1oDcje6*)ETA zoM-PD8ynqkiFpr>m6zk3a)CTfvqK)_IM1D!9GcuakuEapKIg&HHd5MSj63D$InLhu z!MlkM`@xiUKRA-i0RHe_3)Z-p-wJ z0KNKCYo6OG&*azuBuev!kamMFQEngjQ9&cE#HAXzugkQ^pc>8$TWbl$k!R&%bo&hdSUQ=J(H zv)@Y@+ldOx4I>5X%X2IElrXGoO)rhkrOzIw(R@%z3ucXqAc(9kynmTvKuaVXA^D2?+CGM^eV zHR3#VZK-_RHaapfIlMbuT&ioV|0X?t#H;TvQ~4*4Barg@;jA;yt#zL=^*vPkoU^_N zhi#9s10;N&Svv0K`MW8Ges?wn6Xq%$SHer(>jh2d{{S$(>l|=uDmOs`kv72xl0_NT&&$Fkyi=QCy6^_>voE24OBwsKxVT5i9qYWBAJ*8Om&Y-ZlXM&#MOGUl zJu)~yN*LS5{~N{|HwEwLT+etTe%>ve#zk%2MR(W0U}vu^uhGQ1QfI>B*jMWexrx4y zk^9lPp7HZt(Kcwyj}~7To$DDtPwfYHjcwbqcOvs!Au5$y#D)DJBp;NCO>5@VyIT1! zd3j?Sw?Tcs%@ZZH_I1mqzG`SwTmN8F_D%&q#z?UXP?|AP^o55aE2(Fn;$3IfP5%t( zpP}|+!kEX&o#-8%7t6d_>%3rXlceA#E;5Vf%B!g}B+7qNXWrA0dg{E-xw(9C<}G7S zoFP#f=f}(ZSm!L~W}iCWLwsHq@xd7qrEz|u%=d6^c52V}5+9r) zQ5xqb$$TGYpE@({#5s;XmB#tWUd~SK`98rJ5~Xo|ip+PZbF)vK?<+pk84{&&eyYrO zaF*uWr0dANIZqaVGbHD6W1OERvwWO=>f9ziI76Z|&QF*5F3wKvd9C>142jY>KSSpG zIQ!JOU3_qcL}{F#Df2y?z53@4@xd7qrEz|i%=dBjsdK0J;0%eZyVTif{M;u#)EN?`aek@HcW`zaKVK+5I76Z| z&M%YsKF&VvxnF#6hD2$cUoP`qoSoY9fcW4HiPAW~LgxE8`_y?*d~k+DX`Ejv^F5rs z`sYpJgEJ&bEIv3x zqBPF0mHD~O&5p;PFBKo0AyFFV*U5YzXP-J>CO$YrqBPF0m-#NvPVM=A;)63JO5^+n zneXH5Q|HUY2WLo>#`%ph-^1Cff4)L|aE3%_oNt!-KF&UMF2o0CNR-C;O)}rb*{MBW zDLyzuawRv$`OPxR$JwXOL*j!oBue9ai_CX$b{ju$5g(i(Q5xsB$b27XpE_?9ADkgk z8t1pld>3b@_PkAeaE3%_oZlw%eVl#jJS;vqL!va!Z#`#?`-^baf&LiT3GbBpm{BD__?d*8``D*dO z84{&&evi!earUY6sQBOviPAW~SLVAoJGJLs;)63JO5^-KneXH5Q|H~{gEJ&bzasH&tcX4)V z&)16&&X6dL^Q|)9$JwXO4-g-mAyFFVPs#jDXKBiQ=Wjend~k+DX`DYT^L?Cs>U@Lv z;0%e&R+fVjpBndBsX$n zoIfwKe4Ksi{7~`184{&&{({VRadv9Y4-+4pAyFFVFUou$XP-JhTzqhbL}{GAB=a4d z-Nw(45FeZ&Q5xqj%X}YapE^HMd~k+DX`H_z^Ie>s+Vf4~gEJ&b#`!xk-^JOf zJwH)=aE3%_oWCpceVl#j{3P+g84{&&{+`VDaQ5n-pDaE&L!va!x5<1TXP-JhMSO6E zL}{GAFY{fTo!awL#Rq3dl*ai7GT+D9r_N6kADkgk8s{I%d#`#Aw z-^baf&d(4ZoFP#f=O4>_7iXvT{7mt|84{&&{)x=@arUY6v&08yNR-C;r!wEe*{gqk zw)o%-iPAX#Oy>JI`_%b4;)63JO5^-zasHLe_i^^A^9#iXXGoOB`PVYv#o4Jnzes#=hU7)u80X)} zEFWi|I=@(aaE3%_oPR6xJ)FJz=a+~N&X6dL^Y3K7kF!smUn)L0L!va!znA$g&Q9(5 zW#WS~BueA_zcSy)*{9Ag7ayD3b@_WUaG!5I>zasIQ+_i^^A^Q*-NXGoOB`7bix!`Z8UevSCx42jY>|5fJu zIQ!K3wc>*_BueA_H<|C^?9`rLCq6hsqBPEbm-#- z-!Ah#oW1(zTf_%vNR-BzFU9n6_Nnt*#1m&ol*XCww{&rKYR_*KPn;o98t0jA&OUX1 zn|R_3iPAXF@^N+>Kfhf(afU=`oM*c^`_%az;)ydPO5;4o%h{I4}2dc52Tb z6HlBWQ5xq1-JE^u{BiNb84{&&Ug6{HHh%tuc;XC+(l{UF=Im4FPl_kbkSLAw!CuZz z?fF*m#2FH$aX!S&*{9B*5>K2VQ5xq%ot(Y;=TD0#&X6dL^I>kzK6U<#c;XC+(l{UP zik9V#2FH$ zaX!k+*{MB$Nj!0eL}{Flc60Wr^OwaFXGoOB`4}f>um1Tf;)ydPO5=R2o3l@yzbc+M zL!va!E4`eZ+Vj`M6K6=2#`!omXP-KMT|9AyL}{Fl_i=U`KYv3!afU=`oKJ9b_NntX z#S>>pl*ai)FK4Ir{4Mds84{&&KFQ75r_SFNPn;o98t0RpoW1(z?}#VPkSLAwDQ?a_ zb^fk+;tYw>IG^g}?9`sWC!RP%qBPE@xjFmP`8M&y8Is$$G0vwuID4M|`~y+M84{&& zKEut~r_MhVPn;o98s{^;oSoY9kHiyaNR-C;EH`JLI{#QaafU=`oX>W0_UfO1BAz%y zqBPD;Zq7b+{;7E442jY>H+wldwdbFSC(e*4jdP2evrnCWE}l3;qBPE}KF)6A=U<2? z&X6dL^C~xIpF00iJaL9ZX`EMkIXkuIUx_EqkSLAw8aHR3I{#WcafU=`oX>G`_UfOx z#s_Cel*aj7H)o$Z|5iM4hD2$c@9yR7)SiDQo;X9IG|u;MbM~q8@5K{mNR-C;o*vGQ z$DjWoo;X9IG|u;ObM~q8AH@@ANR-C;-d@g5?fFmQi8CZh<9r`CXP-L%Sv+xuL}{Gw z>*Va!KmSEMafU=`oX>M}_Nnt<#S>>pl*YNu%h{^6S>Kk>vF5~XqOaC7#l^FPEBXGoOBxzo$psXhNwJaL9ZX`I)&Is4T4U*d@~ zBueAF-pSdkf984_oFP#f=M8SoK6U1L8JwX88s{!AXQ%ee^)fg^qBPFuyE*&Rnd@b6 zhD2$cFUWV6rtEkAGuNKr42jY>ce^?J)R}8faE3%_oO`^So!ax<;0%eO5=P#H)o$Za~%iHkSLAwE`THXRhPG84{&&9`bT_YR_E9fiomZO5?oM$JuTC%yk?%L!va!+uWRe>dbWdL!va!d%c{U+H+HIhD2$cuW@tssdIC1hD2$c zuXS?v>YrPJGbBpme4U%KPn}zXGbBpme7%>mQ+wu`2*%HlD2?+2+?;*tygE2TqBPDA z^l)}O{(MewhD2$cALQojQ|EJoGbBpme1n&>Q+vL9aE3%_oFDAw>{I7^1ZPN;#`z&m z&R+fVJ%ckOO5=Q^o3l@y?-iUOQ5xrmdO16_=X(cdNR-C;VQ$Vob-qt{I9Sf-@va>}+wBO>kSLAw(_EbWdb^#$84{&&e!7dZUvD=O zoFP#f=V!P$`}KBL1!qW<#`&2p&VIe!)xjAOrEz|ii?d&EHyWHFQ5xrGyEyyxcDsTz zBueA_92e(v%N01>?hek7D2?-TGo9y1|J>VDF5lyJFgQb^G|tcSaQ54!R5k@?NR-C; z`5w-GyOhdB!5I>zaeje^v)?YIvNzr@4YZk!Rk+`d+ua#hD2$cUo(w!t=r%dt+O~60~@;5<(pq0oFP#f=hsf- zTx*@@7ll|C8;YV_NAB%mvH!{_*k( zoFP#f=hwS9`}G?qh$qgFD2?+QT%7#|{U?ei&X6dL^BY~9{RaIfi6_pGD2?;YF3x^~ z{*%QMXGoOB`Asg)euMr~#1m&ol*akZF3x^~{!_&hXGoOB`4$&vzd`?L;)ydPO5^;N zZ0CXDNyq;A2=T-j5~Xo|tBbQ=|9qr);tYw>IKR!s*{^@Tn|R_3iPAW~-No6je?Ce) zafU=`oZsQ%?AJdZEuJ_-qBPF$baD3UpN|nwoFP#f=Xbd{`}NPqiYLyH9LtSyez%LW zU;n&P6mf<`X`J7a>3qP}!QlzV4*Cr7#2FH$ael9lvs(v!rg-8EiPAW~&&S!VgFZ_< zafU=`oZs)`?AAe_EuJ_-qBPDQ@NstQpqs=KXGoOB`GY>rZXGlm2F`HmcT2JA+||X%?vY7ZRd!~|66VMR$pJEnqJ+6+;xT@x$GqYX z$|uH0Rmrih`D+LIRC+_zr_?=@)l%oUdZnpz>Kw<}>KrZqBPE*6u0OdomIC!=Rq%LeB*>O_w88p)=X#b_PkIO7s&)^%P`hb?rJ_&#d$G5 zsj<$>1~2LBEY9y*x2~&mpjh2AP%gIN+biUi)D{w@X&ZN!4K%imrt)c(dfM~S?xteP z*wFa4V(ZxM?ISzFA{qwA$mt>USh?^*nac8=BKOKfU#Q0*;}2@A^P=w7VtjaqOcTQ% zon4=-pSA&M8&KcJ3S%BBccS-!VP-vT1Lu*UJw*%VaiJO9D6hpC;tZ{G+pK(N>fD04 zEI&8BvH+YR&d@r4UfMuToez{c5AWVOe*K=wV&~BAZKK2EvX;hkZ+R*08Itp5qM6Rp z9)vk^{d7`ieIHZKjtxIPs!H}L2TV>Bdxyq7nzF9rBDpM?7n{UPm(eIG;t+I`BWm+W(vl56Ve>kh5r zJkWJ%XINC-7?W4v3~`3m`OETy*q$44UQs%i1zy+HJ=obF-xjg9y2I9hGsIc94rvQ% z?vb?TMx5sl5AP|qjE-%+I$dhx_t{6VuTHt&enWnCMdBQfQ`gg;S9CWQXb+DMO$-+k z!&@iEvO11a#c6>|kiHJ?+XKo2$=8y$5uMqm%-|1mC!yb1u(p4&Xl`EJ($sV(&#vvq z*T~ZtZ$P3nZ6mg27}r|QHaK6M@9w2sxmG-JhD2$czme3r5$Ab0uR7PM%5v_5c;XC+ z(l~$9!};!O+?=lyPn;o98s~3iIxjAGL)gBtcU{-|Vnex}oZBW?=HFT9Hx3NW*N%@&4m(JnA}hri;tWS+ zO7q=moaff+T{~)Pz zBhCjW&J&Zx#Hb8Dn&N@jac+HjMLza!rljULY^U84{&&{&8lVmn3zT)?BVAgTVuC$JUGV= zNNJpZmN++s)ztGo<*pcuemm1yj>)ud?C30Hz|nt6-(c6q-h!>Nu_DW>Zjp)c1{5`= z9dG<9)A>Mg?%T9|XxGT-^+ofVEhCc?vZlr}ATOnDK%z8l-P+ot7`a` zzYukX)LH*x#`!ymb0g!rgUa!9Ut51$kH-jlZ*Ybn&H4b=xJcrfopl2DEMC_la{O+u%}h-Y9QJ21L7UZMSabtftWn%L{RaI793F z$4qDGH-dA2=lY_j?c%JX{PG?)Pxk{a>VU{#(*E8gVY)!*X^{PuqZe02J5V zC?78`#2FH$asGRz^Qhd}?yS&0;i6@&B*O@0Y@DNw&7StKW-yvPp%;3CC>K~nD)_=7# zZ6kU|XL&y}qt-evlq>%^PsZsKs>)y}S8pgRj~9je5vPUz`2Z=dwh8$`J#AxYIKIfa z1rtNp=ny?FyAd8IFPbA$%7e^;4wE+Vr{Epm57x6ETvYfLn)=d?BV*lDZQ8~hsWFUo zuBUA*njD)P8ZE9J9@(*TGF@EzBzSXTsl9%OPX`(a84Qj{!x2g zrt|Cv43Ce+g*kAgECc71>=)C_&vZWEfkV5;cJH|%U1rXG`Yv`2k!Q($QQR*Jg7b;e z@Z;Y=X4Tx+EgIUkRX&>EJ6;T3qwkUTTYCKuPM4RkUr8Cg;?mgm7K$W{KdYY$-S{vo$jdr;InEGgXq}gaw%n-m;ro3) zcwKp1v{)-|wpdyHSs^cB{0xcGjGzCI)H$|wwgLSm;lBxE(Ip+lrndgUCa4;bzWAb&OEnP=Y<_bpPbaA-n=X~n`8kvLp-2${%ca_M%uHyAKX{x@^C@X_|dvb z<#JKP8R87B^NK2UuBUArQ`Nax+rLp7x*S^j=?YQA z8R87B^TAb|d9Jd)9h0Y z%XAKPZqS9`ul6sa@B8CvHfGMz)6S9#TWizwm@afa6U z$V}%@=T@&eZx%(IAyx51{^-5=Y25F@%^yUIIqlfEK3QHnYhv%N`pu?)#fIRV(jGJC@7rjdPm$Noo*bIEdU}Prf6^wepnp!e z*er#=Z==qq%4-iAC??_xKo|sl`>fsT=^TP&b1!rKm9Ip zj=rh0sNC_FW1h(w^29~sV|#b(^!sdrV=(j^DdVxCxO!aq8>h~-_H}2<>%6x?-e9i2iR$NO?u6MfS<*SZa! zEzU=z+u&CD#)93$qw+!Fu05l1?;F=t8}Vb?i;TZR`f6PH8>h~-Zi7vCk#qD-okgXl zZLn3II9K{Ozdd*Posn#V$H)|E_k-$c>RjtK$oTm%9Y4ow@xnD?tBQuM!=qHIWMW(g ziP8*`ek2VZZ>Fa5X?2bH4^Ny2yIR&1J%dfnMNjiN@nX8L%vy0zc_Pk`D2;P-sBt6C zN6NBhZrxcf-0AjcSq@{-ln0n)vmLShYa0natEX+0*VL44V{>QM`VB?XTC<9}9`a)9 z92cTAb#9rN*ESB-wvk+&lKB>EPjH4rX`EMOIv--4Gv8v3i6?c2L}{E?XFAVQ=dO;< zauwOPua_mT?}qFTp*_B_Ceyh*k5Qb9uC{)bpP5VL_0$;>rK$5dna<0#&hh)cTC%_J z>q_y&8ImixG0rWs^0vXUZOCyXmhF(&$uejgkhTG>^Jg;mDc;}r#W6qn=XmVzO1Y1F zdS>9s@+j^HSLn~eP5H!h&K>UWJNCu#y6(RA=5wygJuPsftcA7#iPE%5HF=ZG(D1Ck46;!i$9tIr(yuHvN5jkJx} zp1r~u;N8TLej}xQKX|mXl}5)%=Zo`F`ChfDLmLjK zQ4Ndlkus&cw>(Z0ebaH>YMxMIzcIsO=a&fa-ejpvDa|HWxo?%WL3^szx!ezyW6@Qu ztwmECFK#@%oPHxNMrowaOt!(MuquAXTAkDPR&5;}ZE|UioPu&uQ%hJ@y*N)^fHNfL zabuj@lR7uz?EPJxw}~R}SsxAqK9C3orHAg<8%8=XmemQ6}i&v*mp=I}ZX@cAgt z5NBweH)cBT_uVY5E!p4ALJv=$9D91D*{A$Qewnxp#=mhrb(Zf8+4p@i=VmKc7>?r% ziPAVdF$-F^4X&aEX0d3pp&vdTxy~OcXXKi)ooAL^rAs`ag0>YHt2nQ_m9Pu zIz#FVZJjqI&aolZ<1Bq0-)GJ>=`P*#M2MVukd&^lj|>FoX9iqHAj1|d<%&;b9p(W^9_~e!=;V@`G6CddAP;|3N6fvd7`uEWRgl zv}cGroGLo^C6^|3ZYpQh^%=eQcfoyE9B_s>L+gA+rt^ONhV;<6-=_Q>QN$VI46SpK z>FoV~WPC#uafUcU>wIOVv-kgz@pVze8R87B^H8R<_xA*TO%!p4I792aCDYma`|I8; zia0}@p>^Jx>Aax)j%1+~+53Cd-XV%OL!6;?9?o?3{+__k ziXzSsXK0|) zTIZ2W=Wy-6+xHdREQ&ZooS}8T%E#I5`wHGDia0}@p>@7G(|NyZr5*l<%1?+Q&Jbs4 zoky!U^IUxa{5RoPuJ?8HACvXr4Do>0c~=$ZdX5!%Uq}B@QN$VI46XC-Oy~XDhQoFA z9~VWOA_CjGslh%>|)TIcah=g>CXuKoX{DB=uphSqr^(>b&aw`)e+(H}Y9qXd7oT3gHn_^``wBiNia0}@p>@7K)7ks`3f?4&I76JF zb$&pmv-i1bT_Vc4YCn?+XCAKl$=X%anJ3#*fP>-`9N-K^hbIwUh&Ua1oMfpAA z=iO(8AIyRLl6Mlu&)(y$6ca&U$?L+kv|Oy`B+D1rQ6yge*FHxHHt&^91Znzr#UFXxsP7w3nF zC(e*4jq}6ZoL9Lx-zc6qLvkZG#`zI$&gZx|KU5TPhD2$cADQXAAhze#F3Ob~#1m&o zl*aj{Oy~02CBN?);`~~i^*q~1<3$$%6)gkUG^izfjUE?G|rF7be=Wj^*_;y~sk6)o}=&>b5$$vORlck+rm|1tZJxiZCl%G2aNDsz%=m5Jj}c$oYwrq**#76#{m z_U;SfYjZdvFQ(3rJV+*-=TCiuZl&@+N!v)BXVzF}-lw#63^cbix5|lM`CrL+nfT!h z$#$7a6-FUt9zTt9t!-nZt}H2M z$nBG+ajvy(956Y-MUN9x3(UMjpS3`yl-iFa%YAYcXMWFGoy-4gb?ZcPi~L{XneBqr zu8;|5NR(!ulJ<4+{4n~*TAkLm*Ka=cguh&T?)k*O7b6u?(E! zF%6}0ewvqaYp!ki`lEs~BueA_bT8*sUR)=#+>-?Om&LUi+vwSvD)|oOp4D2o!U)lyF zO4Bx;Tg6#*YjmEfvo?)&>&i7Xe#^iR=Qu!A8t3O_I?H(l`|6zEob|iFaUKf4w$eC1 z|G&(cZI90;IOmeSna6RTD0ek4sN%es#$03D@UAo49?qP`<+C=v zeq-D4=+O1D`0Vgm1Z_hAdR3L9y z@^|1@h$nT1L}{E~lIa}!=hE4sf4)pSafU=`oL`#h9QxnOd#`zVQ&PjW2@fdH624_f=#`%?*&PjW2 zDID7Kn0QiWNR-C;RhiC7dlu*H;d5oDc;XC+(m21`&$-p3Jx_`!&X6dL^J_AlllJU# zV02tOafU=`oL`&ioV4dwkM?}6c;XC+(m1~^(>ZC+;+)@}_lhUZkSLAw>;0Tpd9>#T zi6_pGD2?+QGM$t5yvn10et>x542jY>zcJG}Y0s-X+B2WY;|z(?INzMBS zbAH=+u6W`MiPAW~CDS=+8_gd5#?!?UXGoOB`K_7GN!w`l=r^7vo;X9IG|q3!bWYla zIOn&G=ZGiHkSLAw+cTX*o%=dA_j)vq%HzcoXGoOB`5l?gq0Z{;&}~$nD4sY&qBPF$ z%ygFP2RX)AI_Ecy%9F$sXGoOB`CXaLq2J(C2$z22e&UHUBueA_?o8*p7O|UFUa+9M12Q31=Q#=l4~0mYFpk z7Y+SJXdC$(;g#Y@+koUsZcN*Fe--C?j^!rXpvy6tU80CHBueA_flTM5ZMYnh*(07f zL!va!AN((KW}7=krj$*{C;3nn=LWYympZe};hfSsf4Hi%%&dPKbUF5QmH5&&AW@pO z@sTRd4Q_)j$B`z)6K6=2#`&X}&dE0DavbS8@x&PtrE&gPrgPFiyBtTlMm%wbL}{Eq zp6Q(Q&o0Mg9w?qTL!va!pU8Ah+J?(9nH$9uXGm`3#yEd6(>ZAyF2`gZEQ&ZoqBPF8 zW;%yD4|ewSxxBZk<=psBWjcpCtFy!Kx$;=4Ep>)OY3lsx|1#${izj2zn-P}q_$a-% z@8&aAoa@1#2Jz|aATamSk+mqYi!Tn*Qb0;6xjyh0f8q9(|oClGq0)j8U*j_Q$8x| zUL+I58J;dvnlDe|TR!42MjpS%udh%>a#Uz^6c?m9bN2lNSX#2MlYkCQ3Q z*E5~HuLJtH$l(leh9}FE<{O#L-q!(rOXP5dI78buzB!F^t?k+SI-qZeBiH?;JWL*^ z`BoL@)jVNF`mE~rInR9l;J`q!u6yI=qWW{{o%?lp0js_>ypYEW!u^PE2j}k!4-YeE z!y28JK5%IF*zPIu8{%>sC9dqdBjfLoE{|)Mz7xEo^C1}j7duDapC)ydyEQw{8y(xd zqu4nznHD1B{uku6b7V@%SRxH|{+_9`Ui(&KoxT6h#7~Rde3?>O=i9_L$N7NCVq#MM z`}wpEIrl#!FQ(2Z>HE@rKht?$aBfK#nsNWL@> zB@dUPu8_HrPnXBG&Ogs|o+a(#4lB->@dl|Y{c*~J%<_Jb={#ra_}1n%W}z7mpCv`5 zZ9;NOsPn9;E50k0UsiGExwGsagqbF^XK&}5rOr4*a;p%PS;_Z8{Hm(+j7qJ?H|BP4 zErzz}r+B)K+?%h6AmevPzAfbL41K4ivns!?>RhSWc`?r8<3raM6Jz5J1JdOpNSz@$ zIXKU*$f!Q#H<`{$#Cgl!?ZwuyJ=Yg|x5mXb%n!&bafXCr1-8z=oyNJ=_PkJ>_2R)| zmrDbAqd4LW3CCn`o~iG~nNz9!ZW`xWkI5{Wa^5}WF^GPVIN=P*D`m2E{(YwNzB=!9 zsq-_$5obtVAXDkgJKHk7O3bo()gE5XX<>-RH4I)GO$_%afal=sXE`SoFTV=oyNJ= zwn1Na%_eEkL)Yw>T4=_d!Qc$ZP;j29pJtWw{+8)HUz{f<$49gO6YNr_^5@_T$v>u? zd3RW5y^Qtj`xJgs>wfTn-a}8TRDZ z*0E7tPtHxJy!c?5AjkRP`7))6HHL9dvsj)`b9;7vKgj#2BVMk*}#|C!V|I@fcY ze_qkv-L&ZNT$nN^^S^ zXWB-s`;<95C&zZ@H{&TKI!tN{afb2p2f15Dw$Iq6|)u9PXw%xRppQ%s*&<-Q*K>TWIejucx) z_#-;xVp#_58R86&mMP7wX`E|q8}o6V@N?cQayUbr;ZZWBnVsqEeSG68k)v%uoZ+!D zrI|C0bFKRn@8cWv^VAvQ3{R6O&D>09@8cVnh#bxkXQ=x)Vax&3IM>=g?>kn|?DEEY zortj?ghXlfgY&95>n^ay{ouZ11wO}Q&KFPW45>3bMy53Lt2o!QPuW*zpJOr?h#bxk zXK4Gn1)0wK>g>`qDqZ4;GsGF%Ixoz0_C6+awK(DoafaP8rCBtM^IdgJW{b$-3~`3` z{ruu-oNMhjXd9lN0kO|pAQQwH+VRGcX`E}_ch3{&k=>ImL$Yj-oF@yR4}dts`^c1L z=`_x@);T(NqzlcszgAvL+kiO3b7e}i%)xojxKuh_XvY11c`eQmXLy24X_impe0z=i z6#8d%<`ar^!42LYl-J=5afYYJl;*%pXSTu8xwk!CZlm`HN7 zOb};ynoMa9$#muz<6ixEB3)|Z_czK*sWZeG9xYRvL#J`Bb)TZn6MUqSF17LdeezPA zAv9BXNoF`<#PT48T!5QKVt@BZt&U59% z6!|Ah_6g%d#-b2sc#ceIj-JN3)@^X{;6Nd#1a2F|MJPkV+$X$t)>+1BFcDNW_m^lww^Hn>!s zd)hY@1B30wx$D9r8V1LWaE3%_oNtuE=Qz*j|KZ&-I=1!daviz1v;)qhOKJDr_Y8do z-tlaMIjp$GzV0xs^V*GV{T;=?2KnH-yY1qOFYIk?w0+!LR!yBDQJOl_59ZYQ$ke%~ zr>E#yTU@lENluPv>eQ9id9y~Ik254n<9td|=SJG|jP>QRy>9s%Gv-gpzC2B=F7%nD; zw@!|Y^ZG{fHF+VplKk;eJ#q|S{v z&)qy&H2eJb%wkxc(}VLt`Y6yik0s8r->9d~%XJ$(ziZvPuFip?xv6I$tgJ!sRtM+! zmPcuv*Gtom?V~BIryl1e{EshNM)!^v6FWz?Pc~?}?`3DmUDltHacP>x;=C|;$F@<| z_*qVVmM&vE$9p_NKfriD<*{bLtCO~IR`^*x`@u!h*X`Q6SI*Zi#yp00v`^lT#&&v7 zxli9QE7=dmb^)WaJY`>JqYtXzaGuPH&d$F6jXgzYZ+p?vHrQ75v|U{N*|p83#$?B{HZRAKO(9>5BY*1J|W8MaJI&uNd0#xxqU+ z%RavL;~O1?RJzbI7iHs!U1nTGUA(_Md%jGNdPDnNLyu0{v#4w8>7Ne_W6^8JM<$0I z2GH*o13V!4icGfOI6c&uddL2S=g#GccM|%I0~qj2AAKiJt@+2N$TRUsdAxb`If--J z23PZ(8l7kPeEd3Pb)4K|drC>0PP0XvuL$0;J=e1z^nO3c`A2x9O#lA4HzjqB`|f(` zym0;K*p{KuK8F1)FE<>6;ZM9SEQrUvr%iLJbS$*x^Ta(m*VET6+M&+ndzEy-4c^C< zzAiHU4(a0Xy>F;>bgrkbyDOZdZ+lW_>Hcco2Iny5?@6nWcfXeLMsw1hV_UDMf1Y{W zb$OEJ)f?n7Z8N3%B+sL5w3)V1Prt!?tCl9eLNjijCle$}Ge%mQS!Z=#<>$;cg>&4t zl*YLu)0y_{_!d@=^Wz-fPbrOaXQnfs9q$_6H8Gq&q!Ux=ccpWtJwq~AIt1>{(CX`~ z%0FZtZJLR5@nUK{=fvB2j|lL&4&*aUXwNyhTT*A9OBTyitMh?+tborZy1NEDdpo+? zdUY9%-teB1wgHLKv<&@nPwHIHxb6U{ zadGwV^=Tb)?jJ8N=I@*`_6>2l^cfpXo$DDREeLJH>crrjl50)V^oehd^W5?P zW4g$!`}AwnIVGQ|q`5HDc?r9~u8!h@&P$5!&b)mfUW|$EY>X6ZOdE;YU_JYk1;N?F z7iVgUbF8h>><0%zTW-{u@pG%=n4fJ4XWgbEjq|$1xsmr)jGtTCSvjSaI&X4tUgPM@ zc@ESW5~Zp0MH$YQ$ZMBPP87+RhigY)!tW=(InH;*XF&1upL>gY{2SEM zo)0eH!}hiHxAn+>u2Yn6W@AO_Cx=Pq%LLi>^stHPpMNJmi0xUlHT8@)X36(4hL^eE zcv%WRUWvDb-DZn|U zt@BW(GyiwPuA!0LPNz^+E)-wRYk-7(xHMl$9D(d>%d`>wQM@Ui7#~$7{qt;utNygH znY-j=I79LznNXQEb!18Q>r&^q4f33+)aZPGocti&#fGWZW!~X^AZ-B>rRg`KFN~V? z^c%E|uAx0eC+9JitI4|UkXO%<2@>9|m0tT=b?O|){5*F?`~`S0O=uh5&JU7x;S9;6 zWGYqSQCqn-C}|t}oaMBF8lCySb*OWf99`6vWZtk}!#VEXj+6VP3PPoI*oI^{f3wGrQ(P)Bv;8)Ixo@3-0Z6ATzg-~|6#;7 zh;w$s5TB>Xgfk@1mC3e^-Bq1yZyVnGlrzPVtqszC&XE0gn(=9z zYi%3e+hDWE;S6zx=g5?1VjAb#>)fpUhS$))MdWaXIK%ikvfR~7PU9Rp#rU+U)Z=x0 zc3ht3x_$5Ns!ywHCi@VaAI|tfv~45ppHG&blY07R{%^|CxscPK%h%`Ja!eFw zh%;O%Q=03NIyd6Hpmg@y1S`ji9L^ADxbOXwJdj*JjdQKr-~w&WQfY^_j884?`2kg& z@5=Vf=EfK)Zg!m4I7274%ra?vJ|)f+*4l4)w`V?+z!{SG9yUGi>p@AK8*%n-&nJl| z&XBaoM4e~p5nkq0DmP5yTyuNw8R+BlZm-XdmxvRs01{Op&%{`a+`4Gt2w`?v{P`!stA>vG3nKx7MHCJ3KM+K2=_LV^Zfv zoac3Mm6cb^*tgG%`#$!AHV@5p?(=OM-9a$2#|q2ihh;i1jLuGNBQ~%|j)mDgJkxnz zpKseZGYCeWWrgMOBQl*AsI&AO{exAOUjHmUGbWLzl@Is3ePpKdoW8!c^_}}IGV8&W z;nk5tRhD*Brt?B|?(A(_+wEe0zu*{oc@^hJWjfEh*tg$k4~~%?Rh%E4>AWyHJM|mu zf@9?RD$b9|be?yyZ@+P3aEv^uit}SLofoLHU%#<3I7ZszG5q*(na&6FZSHAqZtt&B zj)rDkDg#g6TS1~U+g8Hj>cVBg84{&&etc5rWA#~$ zI1e^&2(Qh>MZp;orEz|OlXD!?lxu4Ic5`rsL}{F#=;PetRp*O?GbBpm{3Iu5uR326 zoFP#f=O<@6YroOr*Kb@IoFP#f=ci;kYroOr*KZ63XGoOB`Kd0>e*MP%f-@vazaejWLv-TUS{Q8a2;0%eCu8(m21^$JwplxGFe9qBPDgadP&m^VPu_5~Xo|X{NLG z8>{{Ljq%_NiPAW~EYn&0jn#hr#zb(2L}{E~?&9p%Z|n}vkSLAwE1aCY+Vfa&hD2$c zU+LrQ)^F?y&X6dL^Q)Ykz3P1b;0%ezaehsvv-TTn{Q8aS zgEJ&bzsbefuitn;aE3%_oZsx^ z?A4wh7@Q$d8s}SloZb432L)$Hl*aijPR?F+z9Be6qBPEL&2*m2XPWI^pIXWPZycN< zQ5xsBWjbqL*M7l3xrY4Pp5P3L(m208)48m(SIdz9+c-EwqBPF$$aL2Jd0mIwPGw_o zhD2$c-zasEK2v-TT~=TJR4I76Z|&L7Nl)_$Yeuitn|aE3%_oIm8^?ALERJ~%_7G|nG( za`tM^PYBMCD2?++e4O3-jVA_YNR-C;qfX9Vb$(KChD2$cKbGmN{f6T?RL=~~kSLAw z$1|O^-*7yK>RG`V5~Xqegp0FZzwy-I42jY>f6~d>t35w0I76Z|&bRtFyY(AS56+M% zjq|6RoW1J&jNlB3(l~!Q(^>ls$8)HjADkgk8t2bsI%~h-cn;MIf-@vahD2$czm(~${f6T?R4)t8kSLAwmtCCw`i&O`XGoOB`72J&UhVls!5I>zasH~0 zvs=IM;@}L4(l~$3$=R#UFA2_&D2?;iGo7{Ha6E_V)xjAOrE&g7rnB}Nj^|LlCOAW) zG|u02arWysULKqwQ5xrOIXQc^=T`)0NR-C;+dj^2{l+VUGbBpm{2eD}uR6afI76Z| z&fm>+)_%kB9I7`4XGoOB`Fokp+HW|XLv?d-hD2$cZ*y_>>o;B-oFP#f=kGf?d$s4+ z1!qW<#`y<6&Tjq2>w_~SO5^-PCugrZzacn7qBPDw%5>I#!|@!dw+3fOl*akTnag4Rzp5GjtAyFFVpZPeu^&7VYXGoOB`R7i~ zUUhy;aE3%_oPUw&%sD45j^|L_7@Q$d8s}eTI%{9&cn;OWf-@va8$;;<2h6}1!qW<#`!my&RS>3bEqB}oFP#f=ig>J&u1GPZ0qpa3?Ckx zAyFFV-+4JZHR(qLXGoOB`S+R5^c$^?=c;`mI76Z|&i|X~%r@BSc&^$9gEJ&b{aLY2WLo>#`!Oq z&f0G{o~!n;;0%eFLZJC>o>j}oFP#f=S5D=UhVlS!5I>zabE1>?AC95 zH8?|}G|o$$oW1J&wcrei(l{^8bk=^u@m#g<24_f=#(7z$v-TT~=c;`#I76Z|&dXh# z{rZh>24_f=#`!=eXRr4Bt>6ra(m1d1adzuBz8#z)Q5xrioSePt{GH$oiPAV9oawCn zhU2+vKMKx}D2?+WnaAK~QeRp%cDXGoOB`N&LX?Kd3HRr^J7hD2$c@0RJT{f6VYYQGH5 zkSLAwQ7+DY{l-s%GbBpme6*9ZS9|_xaE3%_oR9HwcI!8O7Mvkb8s}r3oW1J&^WY4L z(m1cobmrWiR6FqBPDYWjfQIS2>ls$8)Iu8JrzaX!n%*{|RDTX2R% zX`Ih?a`tM^e-F-(D2;QIkF#69@qfV?5~Xo&c5?Qr^FM+!BueAllIg7dhT}O@v*iDj zUnH)OD2;P#rnB}Nj^|L#4$hD$jq@rOXTN^q_RuyUQ5xsfPR?HKxf1FOHPAS(@o{$R zH)aH9NR-C;94BY5I?oKwkSLAwxtY$|Z#bSqH9t5*qBPET&ve#)!|@!d1;H5-rE$K8 zi?d(9F()`fqBPF;baM7;&vSz_Bue9aFCS;Oe&c}P42jY>-`mOAtIqR+GbBpme4k8b z?Kd3Hp;{W8AyFFV`(`?8zu|Ze)w19WiPAWq=i=n{l?w>vp|)p<#9hD2$cJ2IWM-*7yK>fqoEiPAWCW;$!X;dlc&D=YxVXBue9a zex|eb8;<8t9T}VPR?F+J~lW* zqBPDIWjb@t$tuTlsD2fW^FyLE&YLrxwXbtLhw3-M84{&&zBtpltg~0ks8oI(oFP#f z=Swo3wSRUzhw6WWGbBpmd}*e$*4gnKs^14^NR-C;vP@^b?`xIg_kH~~I76Z|&iC_j zc52eU3(k-zjq~N1&h#6r9nV!eBlORZD2?+Kna*s3s~yi(J2N;#qBPEhi?iPt>6G9M ziPAV<>E!IxoGYgWXGoOBdC14vZH#nUaE3%_oVPeRd)4{$;0%eZ_9Mne#7xxwbtMaiPAU^yEyyx8)pS)NR-BTyOXn5dp?{sqZs&jL2hD2$cM>3tY-*7xv?cCrDiPAVTzuZ>$N&-V<@kSLAwgpadZ zzj3eN42jY>PdYh!)%o7R84{&&-ka&H{f6VYY8}BD5~XpzCevB_4aalUI)gJLO5=R3 zi?d(9ab9qSL}{F_b8_}-&uzgO5~Xpz-pARk-&h-*AyFFV2RJ!<)ww-5L!va!56pDd ze#7xxwey2BBueA_piF1&HyqDZyC672qBPDoxH$Xu8|#8IBueA_U?*p<_PjngL!va! z5Akt!>o+z8XGoOB`9>#auR3=HXGoOB`JtK4+HW|XtJW8sAyFFVhh;izzu|bU+J(Ux z5~Xo|xQnx2ztJ6>AyFFVM>siqwdbDT42jY>Khnq9t>5Sk&X6dL^G#09UUl9WoFP#f z=SO8aYro-muG&Sx84{&&esrd@_8X4ps%;L=kSLAwV_cm5`i=hJ42jY>Ki0|Ft33|{ zXGoOB`EfqZZvDn!aE3%_od3tk*{jZ*f-@varEz{zrnC0Xj_0bK9GoFh8s{fxI%}OB&s94q zI76Z|&QHm7rq1o_);BemtH{3niY#G~Oes$>OMPk;=Q%tloGWIYzTd-t-hTV-!MUY% zzn?Vz;H&adoKsror};RqTHUzjey{via87BRpPuPVdmiW<+;6=(4?Z89Q(EU|WIE64 zySORG(Z2Q(!8xUMerCS2*XF1C4-3vIt@E=oo#*rw1DhSKFAL5ot@E=zoLjU+E;ly? z=akm@IhoG0`q!T8A{!Rc6`WI^W>)arZ0F8iv&gK6>w|Mj>-@Y-=b8Of#4i`fqS&XT zw9e1Zbe`2e;M&){J~*d5)s*A~`Oc2LMy2w);GEJrzcABzZvVibjFC(w8h`lh;GEL- z8!yUqo-@$0cGJ4X9qlXGplQ!3t@DfXo!d7$_8dLIIi+=eNw#yVYn?}eb4u&{(tKyv zI`0h5DXsI%vYl7C*7>;LoYFeKJm1;1&MSj+O6&ZJZ0EL)j(%B@Q-);GEJrzdqA>=0KmU#V<$8qUh^V+V=d0Oy@ZReeHv6 zza==Qw9aqKc3$OL=QjoC zl-Bv}`OdC&esge6X`SDZ={#p})nF@c?45G6EQj`-(mKC0(|P7#o0Dz1n5%+wO6&Zt zOy^mHzQ><81m~1?T=(uw=h=h4?^8|)&M9r3-;?P)Yj9mt`B(M1Jvlh1v~_-OzO(E5 zloNw5ScE-UZH+mBRn zuIGJQT?d!{Ufwvp1d=Z{x$ zuJ8R|ziYpNAI>RlU-yZ8XV-q?q~M&=I)5_LdH&{(!9s?1gHE4MJT*9{v~A%LsYxt_jm=Ai2ksdAG@ z(r=_R%9XEFajvJYn>py(Jy#wXoKsrouVy;W8En3;*|CSdNoqWwI?F_qM*3@2oa<>D z-k$+|O*}=ZlG1L2U$5d^Pumb@#}QJc^7Y`H(mH=5-`Q_~B)*T9iM9cW(zK0lR&lPU zZOj>Lac$3!6;GTYQ5xrOWjfCuY$-UW#Ve1I1>p>d(l~!R(|OjQ@8^SD|07Cz9Z;lg z&)=!yT;Dd>>bebb{SU4wt@C#?o#za;4z6}UZ(S`LEq0bzZ9HPTIbvH zon70;mxFUk>-_ypXYbE6zYv^LTIU~RJGXVT_sNQ!vQfrJj71?)n!fIbRh;YDr+9y+ z`9txf-%4rU!~Up>b3J{X_h*_P7GF`Sq_l10$C=LFpJ{$9)H$WC^H1`fT?hRi3C=04 z^G~y#eLvIuTxc69ZQJ-+zO!qcKOdY^TIZiYUQn z`Iq_5u5IJ9!8xUM{#B;4_vcoh4$dj9^RNFO*6ss5uIl;%{a6~wHob@52_*?pvrPwC zlCiLC51KJH35n<>^iCiJ(ntd7z4t~csnmodKuGVs_uhK}-d=mQ!uhXv^`36_+TZ6{ zwqoD;v9ssgGgmXCq`9xNR{GrPsb^_cnBn(xRQENm)6#jq%kB&JUnZOXkT!1^pW{F2fBNz>;@Vf4G#ZURCe4f2jZSxF zRu5dU^nW7$zy8s+_7%)C66HzgKUJ9P%(MD?n%_33ks4+4y7A`(Q;_h6B`$NyI6G1xmgCPm|UAk1a%7p~d(XVK@~GAA7`UzvbD3NV}m`rM(=KaA5~|b7cB4o8`UkY#h}k+vUx$$+&?xp+8S7?BK!9= zVg5$gk!yfStn2fq!(1kt`xIv3+e`8M1br@( z&HWOyuFszdbD3;js4xpZX5qtOE|blRBxc=ZnU93IOg1l;m~qz9)E#yh%yXG+-Y98q z+Kzv~?n70#*@0j#^8h;d#saf$G8&Cr!(1ktHxZb1lhJ7066P}5ylLL7{J5{ihr(PY z&+}$UbI;fcnzq~@Zwhmn+~>{H=9M`l{cF6g4v)byxzAf9&3*P6+Y?iC$B94wFw97l zCq3`pvcg>Fd3Vp45NyUz+As9EOz!hm6=wU=yuUZmKQ^^$eDXN_3rYRRjsi0h&kstQkH=lf>TPx;%yXIh)6ut2ntR7vE9sD_Kkjb-8s;*2Hg-swn`Tz- z>+TM7nQY!MX|_I3+1oM~yEVV%>{eeER@p{XP#$`h0qrktk0x?=gqDexEgaj?2P~ zM0t{V&pFKV?ehb(G2FeArX)&kZvY1Zd-8)I%el*NTlqZ>oD$I4R z<=VOtX3aU}<6%akJjpyPGi%o8yTXh_d6IcVX4b6FcZV5?@+9*TnOU_f#m?QcW=Wq<3o{bsN#>*HFxT(1=G=X0n2{(? zGOwJ&Jl{UsxjXu-Id@+fW+cj!%#$*+=G^_nFe6c(WIje_)||Va5@saIlgz7RX3e?# z8DU1EJjpyIGi%P>&ki#Zzwl}7C?;?G>X_%2HPck2$G%s|s?gjGwVMd}n$@~b3xvjXg;l_nwMxs2){K%vk z^E@s5_^eIBj6`{o`Glky^W2^q9iQ&rMf!H5Fe6c(WPViAjCpQP>E?M+n2{(?GCx{k z*3I+cFe6c(WS&WyG0z?0JZ~IkB+8S_Cnn8{Cr4W|qvPY#E4%lRy?v1#0Oyo4dB1T| zh1tF|@8?$kHBaFmraz0bm*BlfZ|m&xW+ zljcR}v;B0PQM)fiz0eMV*(j6ErzOok8y(&IYQ7TYGTD53((HZiOiv!IXtEvSrC~0U z&1WRdJ(Ck6ZTB!Igt<&MpP4lGPEHIc(GLl8nfyM@v+`!?b67n0!(*^aHa{kB)_hYU z{?9r)%w_UyoSif;v=1n=x23O*yG#eZ!+}1R$>wvC=AOw`+F2gpabYf#&F3b~y^}5J zY&B>IBT=3-&yTGz`z4&Xj??{@)wg)>|0c8MwXKOY)qkzlS3ewPB+8S_S0>HT=RsAU zZx1sPZZ1Da=TeCz+p=G;h>Br;N;ucDi?xyuBgJNR%g;pPV$uJddd6`Q2egqCCm`6rEWz z&u!%t?L537Cs|($GZN)V=4+GY ztsgL-b@4^{ozl0$j6`{o`RPgXR{z(W-YI=E%t(|cnV*p~Z~lP!;!94t=#uU|{qMJ5 z4KotuN#bo(wl4rZfFetq4uE6jCfV}Z2GcCHR{ znQVSe(%d8Ze8AcNo3;&enfw@hZqnS_8W@C1viU`M^AZ`@4zyF4%VhJ5^X8>W z^Uh%|lg%&5o0logyM(z+Hor7!Zng$wuNB3A`@h4CM0wJF<7E}*I(sBDOJ6C2_gdmH zIQyPUPcpweZx;S!okrs*^TJ#v&&De%%=V>u@1L#DtCc6hBkitXE|bl#Oq%;z18c_G z_>a`o@9i)!BT=3-8?UM`*PQ3py6)j6x4*Qbz>GwBlKItnb6aqEzYDb6zuGUDktk0x zzb0w!5q;ieSJ-G^BLH)mJkPJKFx!{r{TS?R4G!S1t7?fI2<9@`{JOkZxokAB5rDZ& zHorb^mhPXi5rDZ&HoqZnmhPVq3Uirkeq-J&-9H~3<}%s*ro0&s7g-%*N5X8B$>ulb z&C>nzpHfJV_RmO^ zCz)@^o2C2bBg~1%V3|A{Z?7=hm*#!$w%L&GpAQdnnQVSX(%jb?lxlA_Sm^VxJ&z&%r$>#Uw&C>nzx-gf?=J(~z(*5&sVJ?%+@6Vg1 z`{(sxE|bk4$eX46=M7;llg%H@o0r<%$m)1I64s3}+5DlrS-O9IM3~ED^G!)}vo$2$ zKi?Z>B+8S{gEv>0>+Ls&quxrX6at^qA-`q=DYG{>0b2WFqg^ZyYpu0Ui6YMm&xW& zB+bp%uyikaUzm|7PdX3YQ(>;R-x!u&%k7P8xk!{JnLn8~OZU&0nG@&1GI=&WRbjR- z&HLPKvmxC-UmE5z+5G9Gxvw=W-9P^+%t(|c&BkXc%r)m(x_|zSIWZeZlqZ=#n>S1M z&;Kwd%t(|cnLn2__q3#^?#46C33Hh|&!4X_+n47380>A04B)S;>N-0R%w@9q3wg72 z|9pLz%VhHx^X4H{k8zx5g}F>Ne<^R4?w_9><}%s*<-A$?Abd`k%VhIc@@DD&`MF^( zlg(evo2C2b=Y_dUHh(Q|mhPXQALcUI{Pm={*&31VpYIPd66Hzf!EaQU>+Ls2q+Ls|NcW;|j6Rpief~v-*}n9^eWE`S&8TYD4SXyB}5UWe37Mm&xWorp?-)^Z0}?m&xWorOoyrR5jU-^Y}2A$>u*N%{{sw z>EZw7SBJSwHvc7Q?rpW#`<;ny-WujI+5FeES^HVaPY!dLZ2nu`tXi7=|EX)jTqc|U zo-{ASIdDMtd0)HP9v^ER66Hzzjek^_>+I_mxq0Q3>OJoN-MdKN z?i6Mu%9G6h5}BvEcagr`Im}3uCz=1PG0T2V#x7w-qCCm`ACXzr=Uu~$M0t|=-lW;r zjX~YIu}_$hC{Hrqmo)pjF{oQN9vo&Q%9G6ZOU$};V~;Q+QJ!RO*kXL2U8lgW-TiOb z&o@QJzlkqZ2Ci>(``j5+&GVjNMxs2)yg*}?ts8rV8Hw^FbC1ZZ>hs=VMxs2)+?zD} zx?w*ewtElx+lPc1iSi_KGimmD9@4EF4-GRC>Fkz%9G6fBC~3q_X{%; zue;h8cn2{(?GVdZW>(-4U!;D0El6hB= zSvAi`g&B$RB=c?>vuxcM4KotuN#@-}W>ue;hZ%|TB=a6gv#%S=bnC`sn2{(?GVhr* z`?|4Aw{9F0W+cj!%zH`9x^-hB%t(|cnfDf%Rr9h5njHzB#&}eKEW+cj!%=;zHzSfPcYIpA;f4g0nktk0x@1Hbx z`>dLbMq}GBBT=4YJ|JoK^?Aj(?4+_|n2{(?GCw3~_C8Op=-z?gc84${QJ!ReXwtkG zkHL<;23qtmd{CH?C{Hp!Ol200^!8y!qCClbVA70rV^H{7wN99kC{Hp!JZZ*baBx7k zM_LzVB+8S_0}``tkJJh?66HzeL6KQB&W&Tkj6`{oc}QcH?UAO#j6`{od01pt^|>8p zB+8S_BS~|!t$jWJXUy5OUuA9&d{KLC^1y4THjS^_OTp&-8miv5?5!z&@1M0>+<%!n z`v3C4&C;UJ|D##@`sdGuxlA@M%bQhiP4Py4KFnpZ`Jkk^r`>ws|1`nxcCuq&p3CHU zJ~(OaYq!Qaszt-Bo7s8+bD3;DByS!c?bw}&YV$Cc$>u|o=Kgl8-4UWU4Re`nJ}hb8 za%QI885>-(VrbRUf%eeM%9&ilaVlA4zmOykbzeLgW2xi|rQ@K2hGt`|!faof z_qx&78IsQPlkBcxMxs2)Jf1W+J3}*L-NQ?6ud$=Rj6`{oc_L}ht zOrGZz73O-6!C~oR@Xj!o$>yVz=DyBwXJmD^M~d4!!dxbsS0>H9oe}A5d^F5uvUxIZ zmd?h)%w@89RnpwsS$>e+jjX=9SVu-)?5iMwvVt zt-M*<=MRUuOg0~zH1~8S?Ot?+&o{w5m&vm+oiz7$rlhlRt9daSWpba}d9!pjZVPjn zZ0;n@&Ccqz<90u)y2TEJK9|YnbxCtyXRY*k3OF%=kC|z4(OR&r!IJWM=6+zt8Rq_g^NPH>AxQl;hmEY(dvtCXGhp z_@sI9y3y&*%<6$FM4u#y&nCk>BT=4&enf@YzBKRISiF9`Gh_Km{i=@Ybr5LPJz*}B%_k_#!e>{X2y>ZiepJ%jvtBe5XtLFX@fa+V#<}t6 zta(&<70F&RWp2!7nLFS=rl{G^u|Vz-U#~OIy`y7N^p!aP0Ej{l3&fzLyNxlA^noHQ>Avuf$U=OMvdCYw)5nwz8RHYit) zCz}`MGTD4;(%c8LaF_JFFqg^Z(~{-|%k55twUr$UeJ+#Drzg#em#=Hjv|AGs;~Mx2 z!(1kt&q$j4$Hqom1G>w(c#k9cTqc{(l$cekM)&>PFynpQv&rVO6lU3{*LB}t1uNcX zHJfaHjKr+#Gu}%IYng05TVWP{`xx&DgSkvLpCd8r`g};3%VhJp3bXJfc1yxsCY#Tb zm~|(@rC~0U&F4$ZLpFh$!sl&Zp37wO1xa&rY)tyii9s{tIY*g%P3A&@SvMKo&ticY zpUE-=Z<;W79M`-SqP$KVqx%=V>uuNytGcf#UMyPpe)#}hsua5nio_{0ixoyTC$ z*ztZ}s+(=>K)C-h`I`CFNptUbOM3F&#k`p3GI^e_$(yAo!kxohCYzs>G;cIMGufV= zIqSSj2JGJQwO3E~JcvYj(qr(+6=wU=ydQ%Pm^IH<_6ai* zyzfbiO~%!rg3kYdZ`@-dr>6HlV;;t z6=wU=yw8Kp3GL5odz0NY`dlXW`Pmg_{G0hc@9xokdmi`Nc#HkQ{g=t+=OoR&6K%~& z8(^#3?H6A6g+zJMY&^HZTxT}StT}0SiT*lKm~Scm%xP*X+YGeS>#cT+ z`!AEtFUp&x>jqvEkJ&(?JZUywTw%5^&3k>eK1F% zo@9P$+Pq<)dvwk1+wCxz=Q4SoUshqR_ZZwDeGI-W%w@9qoFsO}Af*O?i! zfkb)IY`mhvY+su9W3Wg1on!kfL%VDI|6C?tuX|;Mxz23#PY#XEv~}b0GV@~pj6``- zpI=pBuG8nPS+_*L+?+5YQJ!Reb<(_eaujG%$@1Uqm$Oze~zCihd!6d<~JtIJ(Cl&cPGg=*im3Elg)2R zntLZFq>m3CbD3;@OWv$I37Qq}b;N9x$+Pj+q`5h{ zM*1Z7>Gl{zpUb3EcjIjWvvN4D4Re`nz9DH|WPP5o*PX1j-YDu0I|yc@OrDLmC(S*R zExQL@y~7R#bD3;@N7CFo*^)j6%g;A~9e-x?JCo)`lhb2EBdcYvh`7S$8T)4>%995A zT@_~g(!8Hr!8|;)N@l(?%t(|cnctl>_fATey2hu?iM6gwKBv5=!i;}2-|PHlRxWk^ zeq-GKC+*j4viZiOdDE$Z8Jt#Zy<6L!z<+G6_K5EfB2k_+8}F?!`zXacb^m4cE#CXT z$*g&8Yhq3HU#s=i-NTGTd6M~kNptjhP}S$%!i+?DlKK5fbM$#|M%3qB!;D0ElKBHk zbM)ChcyDTAbh>*#ncJNe`p}WB0CPw-DR@*yGe7iH7MP0 zTomRq+5A0$S$R^qILu|T`TI$8kM^ZK4V<7b8)dTj2T5~pYe>4^zzGVE!7|zW!@OBJ z8V#JFU@nu*Kgyf&f1|8$f`YkBHvc$p#{Z47!U+oIGTHo-yji;6zzGWGGTHpoycz#D z%IY9H63k_?`Db~vbiZ+Mn9F4I&+}&Ke&diZm&xW|B+bp%ko4SriJ5UuDU;2=6quC@ z^rc}glg+S5jqxy-$>zT$ z&AqJ=>A8Et%s6+K$>zW3&C1betO#?NZ2m{yEIoJQy};;mnQZ=N-Yh+LuMBgUZ2ni? zEPW78hPg~O|2uD%p1Y3;bD3=ZPu?s&cdrU_nQXo{Z%v?nn-?d|&DIj>x%)~pP}e zl?(J$VJ?%+8z;>@E$KKnjtg^{Y~Cbk?rklVp1aqZ8Rx+=*}Q4qtQ?KThA@}O=FReE z>ACy(Fqg^Z>mIx%&}eE|bk$QGTFRi-Yh+LpAzOW*}PNU zEIoIh8s;+DymQ_xJ$IiL<}%s5OWrI!cb^{SGTFRq-Yi|9&j@pwY~C$tZnl<5&)rWj zGtS**vUzubS-C(zG0bJMd5^SN`*WAx9kWp;oA*qb7q!MlXIkrJ^Ks~c?rfCF=DkE_ z)qETl<}%s5x5%tIfgc{`GTFRO(%fv>hnd?9s_IF0Agmi@viZSjv-W3lz017ViYa8Vn9F4Ieo1pr3s>ZI^&UGE%w@89|D?IM)yCyOS#51c!aSGB<^$4Z z?Pt%v&%Ee!nQVSY-mF@hP1+9E^P|IzM0t|=;G`MzJS?2&nJ^Zk|sHGZN)V=A#7WCBk_=J`=BD)-?|E0%>M$cwo@8E~G-Ec#Rvg{E1HtXe zFqgSA9d}KI8Q&Y2@B7-^ysAw{{ont%Cd^2bC-r%4g}Kgk{yy}1x_f-Z?W!=B$$f5B znCtWzYu$=*o%)zCm&xX1lV`*Y5$>v8S&AroY>H3Vv8_Z?yV1F*_k$JOlrE4@EWH^}1Wb+AW^9JdI z@R{)#ER!FDk4l>R+Jo(maDBesdc4?vAyJ-$esqPo)?Tzdw0xa#k94m&oA#?rA~$9# z%$TS7?)m%LL(&&A{yEHLviZckS$Zb?rF%o@72FX|~5;XR>>E$?d=FC@>>Yo@72VZ`S=V zO*6jQe&O|^NR%g;&q|v6+QZUw_r|tI!nwOl>`TjfOoh4LxqDc8?p_e)GTD4~-Yh+L zFElge8Hw_w**K@dT<_dHEIoJkg&B$RB=fmRbF)1xJ$Ek-GZN)V=JS$fdkjj?-92GO zqCClbzQQa#cQ?a~M0t|=0)bh1?(PjU66Hze3-e~_xw}8iNR%g;FG`y2F(^HEFA6gf zz)Q zX6dzHRG%9Cc}@(OdkbN7h!+`VO(ktk0xUy(F7+auC*_qJh1qCCm`*reGWgVJ;N zW?@F6Jjr~e!Yn*@ZxLoB%9G4j3CzlK_vT?nqCCm`xV%|=kT*-u-LEt!&fQ3qCz+p^H21Yf$H%9;$5-6`!486RcbPI&reR8n{DZ~ zuJOGvm&yCOrzFk2(ld9X@qIJn@l+;%@A#=nbI+*q6@iV$CSfj*eg0p}{r0gv%GWXCy`(Ug$>ygg&5O-EV-LfQ=)8jW8N*yA zo1c+1FM@f+)acQ6KZ?TpxiJ_1zV6wi#qOCE<~q-nB8g#(Se-Mxs2)d|lGK z5PhDWkiEzi@7cv{l*zMkeTBKsy0KB1SFG-MU$Qszd9U=dD$I3e!{^!hJe9@9zsLKG z(dRO`&(E$f*Xgs*bGtJ-t!cA=4g}`;|Lb!ho>O72*XMN`Cf9UiFU|dxdC})GxzEq7 zFxTmGb9CJX(UM`(M&pI{3+6J}{Jf;O59T46&2yQ=OR-C)b!dxbsUn?=| z`g~iM%VhKG6y_mapFbMrGTHokiCNd@+rwNYo8O=?59|8;u`rj(<~K^rx;}q6%w@9q zO$xK{h32mabD3;@v&5`>`_dc2Tqc{}A~EZpc)vZ&WwQCL67#U&tld4t`@&o%o8P7| zuNjb;Uv1_^b~Gf)llDkARG8~LhxPr&8r?j_MIzeJ+#x z{Gqg2_goO}mq(w=iDwj;&rR`nItf zUu;&KQ_AFd{z!$n-aM~vjZN!zN!NtAOg7&kG3$0o_#7GZxlA^HG->V|TisH=X8TEI z#=3z-dD1+8tioJp-GEv7jjJbz8Hw^F^T!3|wG-XrD{h}2W+cj!%y%Zu{nlsUO9C6u z2s0ApN#?tf=H^&y7==LytT4>bj|Iyb{L$y%j9$SXDZBf=DBHR-43bI z!0f_YCYwK-G+UpQOI>4|Fqg^Z&n3;)=P6~M;X|LxWb@~fX6tj??m|}h97dSSWb+r2 z=AMaBnHL9okNv{qsZ2J1F==j2*qab=XQFzq9S7zz+5DxXxo={0!-{DU*bei0`-MFc z66Hzj^Oq~kwazIMW6LMIhnL*`AkHaBlqZ?Lk~H^CXumn}`YvAV77^KeghkAy^d zQlEcNVXn7FTC+mg=WoPpAW@!V{$bMGH?d}NNVtI>h(04xo@D+}-fTbhrF(qE?f0Y4 zNR%g;f1EV;PpnaXtF5tDn2{(?GXErLZca>ZP(B6^joCn=Jjwjiq`61;7J4_n&u+19 zmC0+}&nnDy*1Fz_w(!ht@1-#>o)02Xp48``SD5Rpb!HZxxf_k!%n36R7d6M~$Nps&sM|uJJ)3L8Z zqCCm`r=+<#(UI=!4vV!8iSi`#pOfa^3GL5J{E#`ZZk5UF#$PJT_13x#!mCL3`u#AM z$>zW2&C<2*XJ*D@5Q*}n+4x(9x!zj0LAuuc)SNIQQJ!S}d)_Qv>waQRn2{(?GXEoK z?w{DunI6?W@qUFlVMd}n$^6fxxkvi$ltyDyb7BoB6W^~d>t7XS{F_Fs>E++$-`{JW z;n*X6cZz)$xZMfvzf3m&J8AB-9~`{8#s4+``=7rZ=RqXOlV;;T73MnYM$<0kuIL_K za{JvdBT=4YzE@yg+daJG_B&xlqCClbU(&qLUO=^CYEs7jW|)yEPcq-1H1{5@T{xa+ zPONoElqZ?-7iK@pb>Yo@8E-H22%pXXWR(K0NlKNR%g; zdy?jbW?tRay#RA4%t(|cnR_MXcBgv}`P-2&BT=4YZYIr`jcMVJh&?9ENR%g;`;z8G zW^PZ7%04=NWtfpDPcru>&6wx*ly0664l@$vN#=zTvu>V`3^NktN#;dKGv>J?oaf0f zBT=4YUYs=dO^!<6pK@uOyOAhQGH;YLFE;ZGetg5q?tNr$&oOJ$4pJsR@7}n=TxZY! zU$f}dx#xztOg3+lG%rM-?frP!{?7jU^TJ#vn>S6Gz0bnWV80~HWwLp*qsBF9$82-iR@bLkIjjBE|ceZ*9vo;wa#YaIOR7dz82>cB+8Te zyjz92&OBS6VV3pzx-cVAo@CxVY3?(#?kazy@%1nxQJ!SpBWdoLY;_MVy8Wmf2lHGe z&-0!Y<~sA-JK2(+Q$7{uGTFRW(%dxjN>Pt-m~V%ops~C<|%JW`sS)Im&xY+ljeo!v+x?@2T<1L4TsIRu0Eo z!i+?Dl6gpAR&Jo*9cCoTlgz^cv+_l*9||)P& zNX)XQ-Hn67j6`{od1>BkKb`XU?i~njmxLLK@+9-Jq`7Ht?^dqQOT&yrd6M~{yjk{h zgJB#DGjjINd|mY5yjk_*#@%>YtQ$y_C-wP|q`7yE_8Tfs4KotuN#;ZI=63h!n%ir` zj6`{o`LLw9XRYq@s$m2Vd(krab>@dxnCm=;UC_ck>1r!G6z;!FHXo5R_XvO93;xS@ zv0u1WP$oZ5IWlSPZ4C_IzEri;4un3J$>yW-X6072u`JAGvUxObR>b2ZgyzHZRYc zm0Quq!C@|w&0~49^!-+cgt<&MkLS%x>~3Urs2vH9!7|xAkvHQZE~~@rNHCYl<`sD} z9^$e(+>QiunQT5fX>PU#lpm|s*vGs$r)PJfqrn9%VhIp(%jb?STiQv*pD_vptY_zUiP<-wFAJ6M0t{VRnpwkQcgyrv8y>T&t>v#OjVfi zxSj9&G<#cv(mm1P`XFj z*UUJll*#6G0<&^~-Y?8$viZ2Axvw=S-6K88%tmS;QJ%ElSYKhTw?`V3?vbuEC(KBc zCz&@S%{|(eeKmG7C+4|Ko{i%x%vc}izegI9?vYm5UE}`CWb-5PX5~Y$f%mztODX6YVjb(qU!^GQi_vo$2$BkgZyoKwnV^T`6Ua)CY|%w@9ql%%<@H6-05 zJ=x4gY9LXbwBINpOrUD2m07Bm&xYG1Wb@g1vviNt4s)4oJ|}OM?vXlSE|bmY=FQSQ628xYb)!r+pO-W@Tf@>l(nHLP zb4rv#TwGzUw?`ToKtEJjB`qvY<`@;tX!ZE40D-metgp0*BX)Tk)CR1BQ=mH zPug!hp~75mk2E6PBR$@nFe6c(WPW1O+|!aSb&WmEiFq!QXXEM$GxjL+zmBv-x<`7n z-8JsNOg3MWH!B~4jhQf)$>t~J&C)&6iD532%}>sorF*24!dxbspOQCA_edv)xlA@c zHE)(K9H)f2Og29)ZG3v-!letOc}Y%P)QksfYloKwnV^D_iy zJ<<~C9_b0@gc*tQB=hx2b5BdU zY&7;VCuXBeo{eW!nCtD4mSXf|b-Eo1_g^NPpPe@=AA*fD!dxbspOZIB_ef`kxlA@c zH*c2ik0)1x9BV82cGTHo^yji+Ox;V^b zviY@nvviMiNtnxI^Xu|v=>mOen9F4I>yzeYYngP9gab^`<6}6ksP44m zV82l&&&FFS%ysrieJwMu6oKt9U$tN8GZN)VeST|&xz7H1QEO~;rnO$Sc6@w6_c2%| z_xWuV<~n_zHLKQ+JHuQin{N=ARhzrJ!dxbs-!3xa9H6MX!(1kt-;p#oTgsp6(P(_e z{=<#ri5}q3yw<(5!d&Mu*a!1U99UD|wZp)SM0wJ>@vfxV`n+~c_wbV2>+C2^`&A~- z#=9%bb=HlZ*0{tvdywbbZ_sBX%9Hy1o(glF*=V-x2gG&{FS-4+9R+42%9G4DCe3{? zuk0RQar+%R2+T;7Cz;=yH21c&pD+3pTkBv(qCCm`zP!2JJ-X)hX<7d6N0oq;ds@=dVB;<$Vht#h*NqQXnCq+?y{)$D zsUSMq_@eznpOGj}>hnh`%=Old_Rz}i;U%{}vZKI^M0t|=j-=W8tRy$SW=@!qC{Hqf zG-+$^wS+-_ut z!E@L$dEL0P!d!3Nkp4KJ#y#f6{g=t+yOQQ+t240D?n71Iv;!Hbfkb)IY}{R8uCvzl zwmPcIi*CHzZqes5xzC@dFxQz4>+_(p&tEq$`iw+*QlIasFxTmGQ+Vwe#@8+Anvt`A z=KaPeljeSyWj~p+(fDJSktk2<^QV&Lg)pz2l5L>>6lNsKlgyt^n!V4$hvBcoj6`{o z`7=qg_gVNb{7smVC{HqfR%4#(-b4QOw_!%2JjwjIq`5mAx-InY!i+?DlKJyVb9Xj$ zTj<}18Hw^F^A|K`*=+nF%t(|cnZKAc49^PupY@~QJ!S}O496o7M@f79A+fSlgwXDn!V4$bIM=Bj6`{o`D+@pY~A>4 zn2{(?GJid3?#_npobtCYBT=4Y{zlT=oekYNgnlxjchlS^qjlzsXd6M~ONwfD^cuwgJGZN)V=AS3c-e=)Cr5R=<%9G5$ z(3oZGMqikbC{Hr~GHLG4hVGowA7&)Vlgz(Ln!B^1JEtrRGZN)V=3i^fve{S^W+cj! z%)d#RF&iVo^?A!MBT=4Y{%z8X*%%S7&s&8ViSi`#?~-Qkvv7UhILt_tCz*erG<%+>dIMxs2){0EI$_88nW%t(|cng5tHcV|PlK5rIgB+8S_e@dFWv!Pp`HxDxs+{xO zMxs2){P(2U`z&0aw+S;6+_yrMxs2) zd|%S+eHO0IJB1mE@+9;9NwfD^xIXV3W+cj!%#Fpl_x^`j_88nH%t(|cnHMC@-PzEs z&%1^hiSi_KPtx4&vu=IfEzC%iCz*RSX4!1)9%dxUlg!Pe8MCoWxIXV6W+cj!%za5S zW@DLfeLf(}NR%g;`;%txvv7UhE6hlgCz%%}&E99>`n-3Tktk0xFVdK0kHLMyj6`{o zd2!O*oekak{NOMnQJ!SpC~5A_hHib{H_S+sCz&_am}RrEUzm|7Pcm+^)i0XRWh7E8l|9_=Gvp=Q6p^52`TNc??>grSBj7 zhI!FvB+8TeynThaW}oqKkFxr#9SLS6%9G4HB+b_65#>C8&zvwLQJ!SpF=_5=&9v7G zC;GMK#5tu*p68t^%ys73&AO*4jn{>_Og8VFH1|#~KgjMzRtMTS1wAWsM>_g0Y4e2g zqu?434Re`n-Zg3NnVzIBx#55CdNSnJB{DT`bslUFNk6P}D9mND`N4U! z^h|h=nK2tklqb!`z7^(r^E@=IJQFSrGZN)V=KYf9W_w6_COjm}NR%g;_fMMp+Cy#G z2UeSLILt_tCz%gWn1yTIk}xAto@9QAz}yi&yBY~I66Hzehvv;43Q&|Fe6c(WFAVIo9$ugd2l?;NR%g;hm&S|3`);~hld%7 z@+9+!!Yn)w9vNmN%9G4X1ZL%V@Q5%YQJ!R8nm0?&gQH3MLiS#cgLlg}v!SD5Ra2S=pm!4+XHlg)?Z&C>JWRLlkv(~Xob1n zd2mE}9y}(@NR%g;4@;Vx?GfpDa7~zzC{HpUo;2HIPn1$!T$uJ{P zo@72!U{;<7SB4ph@+9+7d9(C9xGKy@lqZ=-lV*DiO3#CI6AJpUUzJm%VhI-(%fuIw;PSYFqg^ZiL_a|-DvC=<}%s5 zB5Ce#PmPYPnpBLkA7e#)KLv^Mq{raV73MnojjnlZ_YMTNM~4}S@+9-hym|S$_VL|2 z5ZoRWW+cj!%#%rTUwg{FL)bmO;`WFzBT=4YJ|=1ImF|%2eG>K<#9CV>f4_TGg}Ki9 zY-Z{Ajt>ZPnQWfQn}xf&M&lu2E|blxljdf7_1bZtJk8DZb{KrG4TwA8=J8SC`g~@X%VhI((%fvflv~lpDQ3nzBT=3-&+Q6xoyVY=rLQ@e2{RJqN#;({ z+~01sJHp|3v{~^OER$zrU4^;MW3bt7PwL*C(rBChohN%ypg*TAzhik?iy8qR(Y=pUFC(KBcCz;R9o2BQ$mzfi0B+8S_=OxYk zonh%(w`H7DkSI?wpPw}Mc7|7WkFL4hCLV)j@?-FV3Ui&uV6!tUUF&{t|LK?wB+8Te zd|`#T&STK}EM4oijXsyjeZHu|T&K@wmacW1#XKWXp48`yE6jEJ+}9bFu60|48Hw^F z^Cfw+bgkPw%t(|cnJ-P6`#U4jwQkceBT=4YzAS0(?MOdjp|O=&v9BwWAA^@ynCmJgLuDRG8~L2CdK1wQlR^bD7-d$5xo@^x4ePwQi%BXC%s#`g~=D zxlW(^IwPIo)!pMOZWl+N%j7;^Rbj5vXERIJ=S`x|NR%h_`EeEInthh8&l`ssiSi`# z}GqTB84IQ|^ANS=)+RG90{#_0H1O9ZyV{37~{M0rx5pIBk8GaLOKm~~s| zUxpcp@+9-s60>fJ{#BTfC{Hq9lQj2AU$Nb2Jj|?^%`*8lR8Oif*O}*LNBbJrKbsei z!7}+V_~fLyx3glv?m||7vm>ErWpbaNk~a&lirUY<4s)4oernphQrhQ*HqV%iGI=(h zmN!fLyeQ0NviaJ)S@@k}`#k&7l&E|bmA z&YPv{#!g`_lg-b`o2Bc<4q+~n&CgAmn;q?IhRfW0EV{q~M@y?80{_2RntFnh#(dRO`&#$g9*Xi>jm{&}Vs+NvD zqt8f`C-wO?73Mm9?pwdAqx_jKyG5VN{)m&589HiSi`#8Er{k2#3uQl-3XWzFFU#g6I?cZ+pfO%$gDnHo!g&B$RB=eh!K9^>PcmLU( zw=h4@XU&%MxG*D8o@9RW9On9c9+dPM-}}KlBT=4Ye#;!@`hC_sD|}>_ktk0xzjY3C z{XP##`i##6N1u@>Pcpx44s-oJYo5uT7-l5Olgu~FVXoijVM(8tg&B$RB=g(nFxT(1 z=Ca*sVMd}n$^4Ev%=P;`BIz?e+ZXeUM0t|=opYG$_jyV8PLj8e2{RJqN#=LWVXoij zC6Ydmh8cQ zox@ze&zk-7>0w5qJjs099On9c*6g40GXyZt{<8#TlgzizVXoh2&Hnl9Fe6c(Wd86R z=K6is?4Os18Hw^F^GD_|*YC4t|9nB1ktk0x-!X@|exEh_XM7eo=Gi|Jd^XAa(K*cZ z`>feNUm9j4%9G3=o5Nhc&zk)+K93)LMxs2){P8)=HTt~vg450$SM8tMVMd}n$$aM= z<{EvTHB0u-2ZR}k@+9+JbC~P*S+jrM5N0IGlgxL|VXoh2&Hfp$6U96uQJ!S}#2n`O zeb(%s9~EXK%9G6Z%wewIXU+b3B+N*ZCz(Gvhq->AHT&n2!;D0ElKE3}nCtghvwz0V zl*2sx&z74_GJkpwbNxPR_RnX88Hw^F^JnHT*YC4t|9nK4ktk0xe|8RY{XT2<&*y|0 ziSi`#=jJfi@3UtAJQijo%9G5WpTk_g&zk-7g<(dbJjwipIn4F@tl2-W3^NktN#-xk zVXoh2&HnkaFe6c(Wd70|=K6is?4MVM8Hw^F^Oxr^&$rKuuyeM{xSj4@q;Iin!8v7i z_u@(BuO!WjyXLhkR;0OpfCIveM0t|=t4VY8dF`6+U8HaKv?HL;NR%g;zm_ydpQk5| z>)uE9_7FP&%t(|cnZKSid!KE)ubO8(+ktuZS&t`~zmYV1p9g1T^SpnUktk0xe=}*0 zKFj8L4|Af=NR%g;zm+scpJnrWusLByqCCm`?WEcJY)`9H^E_Zqn2{(?GJhv&_C62k z=6OGJ!i+?DlKHzybM#p@&%2uwW+ZBN+>rTuNptjBHqQqc5oRRHlg!^wn!V5V^i?&_ z4>u>wNR%g;e~>hLpNDnxystT7Mxs2){KKR<`YfC0-OLFy66HzeA0^GvXW2aCnFGwT z&mcU>{NtqA`)rp9RP%gbn2{(?GXErL_CAm3=J~gku-asm+0nsA9JG5NR%g; zf0;B#pJnsBi#cINqCCm`tE4&lESqOssf2m!9DSC}^N2ZNMxs2){QIQY`)rpN zRrCB1bHa>7d6M}LNwfEPnQor({wbJe-$&(1=07IQ(P!B_?-XVv%9G50N}8k3vU$dL zM$zZl?~r3%(IUVPcr`{X-1#TEW2KZcOb%yM0t|=uSs+CSvJq( z=7brE@+9-$lIG~MY@SarC(KBcCz=1AG<%F%o@8!pWIx9(KC{60s`mF5;4k|PelvIBz5m{4;q~W9yE~YXC{HpkNSdS1vUwgg zC(KBcCz*Sa=IFC*o{u*t%t(|cnR}CF@3ZjwbIY7CBT=4YZYIs%XW{kdmF9#QiSi_K zU(y_Xmd*1~=7brEItn*r?oXPd&$4;mU__XaC{HpkOq#vV!t2j#%?UFSNilX9Y77&CzGsJg+w=%t(|cnKw?Fz0bny&v^Y9 z%t(|cnKwzAz0bny&v=<0%t(|cnKw!KMo0IB+8S_TO`fiXW{kd33I}XM0t{V%cME_ESu-U%?UFSF% zo@Cx3X^uY2=J`}}!i+?Dl6l9ZIr=P{=f{~7W+cj!%sVB`-e=+U=Znn=GZN)V=ADyf z@3Zjw^V#Nv8Hw^F^Daqq^jS8~rYPnx~Y!t2kEF(=GOlqZ?@NSdS1vUxt)oG>F%o@CxLX^uY2=J`rF%o@9P_((HW}UVlE%oG>F%o@5?K zn!V4$>(8f~6J{jJlgxujbM#p@&yO}I%t(|cnTL|*=(B8|FEc01NR%g;hm&UXd02S; z`6cFr8Hw^F^GMQ+KATx~{rNfOgc*tQB=eG_Ir=P{=WERgGZN)V=A}t<^jS8~uQ4ag zNR%g;mnF^KXW{kd7n>7iB+8S_2PMtkXW{kdXPXmdB+8S_2Pe(ZXW2YI&73eJQJ!Qz zBx#O5%jWsj=7brE@+9-2NwfD^c>VcB=7brE@+9+NNwfD^c>VcV=7brE@+9-&NptjB zHqTErC(KBcCz+2(nxoIMd482SVMd}n$$Vte?0ptqe}17kVMd}n$$V7O?0ptqf4<(F zFe6c(WFAeLqtCK=eu_C^Mxs2)ygX@+KFj9$mF9#QiSi`#Skml$7G8gTfjMDDqCCkw zo-})(h1Z|2GbhYQlqZ=dlIG~MY@VNNPMDD>PcpAanxoIMd47dCVMd}n$$WIu?0ptq ze}29>VMd}n$-FXY_C5=*KR?r)Fe6c(WS&f#qtCK=ev&z1Mxs2)d`!|DeU{Dh%gqTh z66HzeRY|k=S$O^VdFF%}iSi`#RMPBy7G8gThB;wIqCCmGI%$qR%jWqSbHa>7d6Ice z(j0x3&GXC52{RJqN#?alv-eqe{rS1(gc*tQBy%fi_C5=*KR?}^Fe6c(WIi@&jy}ug z`D$~*j6_|H8!}HP&CzGsJipY4Fe6c(WNs(T=<|s1`t!}^gc*tQBy%TeMxV_ryZ(Hm zIblYkJjuK+X^uY2=J{>rgc*tQB=d1ebM#p@&mT1>%t(|cnb#-H-e=+U=bOw4GZN)V z<_$@+_gQ%T`90=@8Hw^F^YKY@^jS8~Z#5^(NR%g;ACWXipJnrWhdE(JqVB*AnID-n zd!L2ZpFdXW{kd51JEZB+8S_Cnn9_XW{kdcbOArB+8S_Cne3%XW2Zz*_<#V zQJ!QzIcbhQ%jWsR=7brE@+9*qNwfD^c>VbU=7brE@+9-ANwfD^c>VdE=7brE@+9+V zNptjBHqUP|C(KBcCz(%AnxoIMdA{A8Fe6c(WIiKl_C5=*Kfm9cFe6c(WIi)#_C5=* zKflAAFe6c(WIiitjy}ug`Hkj;8Hw^F^J9|c=(B8|Z!;&%NR%g;&rX`X&%*1^?=vUN zNR%g;&qVdk=7brE@+9*GNwfD^c>VbXbHa>7d6N0Uq&fO5o9EY?6J{jJlgt+-&CzGs zJl|qYn2{(?GGClDqt8o(*Pp*-PMDD>PcmPUG^5XEmR*1Tk~v{UqCClbY0?~hmd*30 z%n36RPcmPgG<%PMDD>PcmPTG<% zPclC?X^uY2=J}K6gc*tQB=eO?bM#p@&p$LL%t(|cnXgKkz0bny&)+a7%t(|cnID%l zd!L2ZpTA&En2{(?GCw|Pjy}ug`5tq^j6`{o`3XsL^jS8~KQJfENYoE-L*^$Y&E99> z_2;h}5oRRHlgw8q&E99>_2F%o@9P@(j0x3&GUE62{RJqN#^Gy&E99>_2(~}6J{jJ zlg!Uen!V4$>(8GyC(KBcCz+p@G)JFh^Zaph!i+?DlKJ^bbM#p@&)+sD%t(|cnO~4J zqt8o)*Ps7wPMDD>PcpwSX-1#TEW7^vXLG`gM0t|=MM-n?SvJqVHYdzTlqZ>AoHR$D zW%Jy-ple2=Jjwi$q}lr{y#D+zbE3~klqZ>AnlyW#h1Z||WKNioC{HrKENPBD%jWr4 z=7brE@+9-ilji8NY@T~!o{=a|GQT2e_C5=*KmXI5=ra=KN#<83&E99>_2)mD6J{jJ zlgzJ5nxoIMdH$t2VMd}n$^7c1Ir=P{=LIp(NR%g;Uz0R@pM}?-|6xw_8Hw^F^J|l4 z@3Zjw^B>F!GZN)V=GP_7(P!B_|H7OwBT=4Yetps$eU{BLe!e8k|NS|Wm}@e>A!+tL z3$H)_-H0$FQJ!ReW76z>7G8h;y*XhF%o@9PY((HW}UVr|ZIblYkJjwjlq}lr{y#D+7d6M~UNptjBHqSpZC(KBc zCz)?ZnxoIMdA`q_Fe6c(WPW?n?0ptqfBvgEVMd}n$^4F_+50TK{`^~W!i+?DlKGuU zbM#p@&p$OM%t(|cnctN(N1tW$e6KlSMxs2){O+XL`z*Zv{1A9KQtM0t|=eMvL=yi9ogdFR;k zBT=4Yet*)8KATx~{dt=(BT=4Y{y@?keU{DhCSgXRJjwjQq&fO5o9Dg5j6`{o`9n#w z_gQ%Td8aTVQJ!SJDQWgT3$H(K9cCoTlgu|K&CzGsJZ~IkB+8S_w_2(VKj6`{o`L?9l`z*Zvyj7TyC{Hrqo-{|FW%ImIn2{(?GJiN}jy}ug zdCxE-QJ!S}NYd(5(;8Hw^F^GB2B=(B8|7l#>%@+9-e zlIG~MY@YWBGZN)V=8q@M-e=+U=k3FcM0t|=&ZODgiSi`#r;}#yv+(-!c40=MJjwi-q}lr{y#Bmdn2{(? zGJiH{jy}ugxj)QElqZ=#mo!J8W%Imin2{(?GJig4_C5=*KW`gmB+8S_Ur3t0&%*1^ zn}!*Q@+9*Ylji8NY@YkVj6`{o`AbQ2^jS8~yM!5u@+9+@lje=aXD+_v|6%Sd;Nv)t zxV;vc9cHM*oQMqJ$bv|*;G#RncIYD8G9;!-a-b=v+!T{?n=&&qGcz+Yb3@tXbi}6n>d3Arg8rE zEY8LA+>x%txvYvah+rD$@66&{JkN9hEFjOz#Ti5}jq`VBaW0)uli~~_ zn8x`hvp5&eGwomnJb{%X1+$MQgWEu29F(>VV;$GHVhmj4az&K8(IH*|H+_UpQSeh|H?nQod{ z&a(#Zq4j3B#qvYErdH?1uI^Cj{bA-jHLde+ozBg0j@jjA=f{h)rgi?E(|OJ+URBs)e{t5d&cAm$&tJ8sTrHP+dwXKE zZxv@v>--0&b4z!3SE;o>MwnW`@eI_nrgi>fh;vl0kt8RIv!-?aQ-pI{T%OMmXHDz; z=Md+(JmZ)mYD3dH|0Tk?Juc5@inFG5{%eSHT%J!BXHDz;w+QE<*06p9*DazpG_CXB zL!9FVLR>oxXHDz;j}Yhfusok2&YITwpHAnd?(V+0%1F=2W1j=(<})5{GV-qg=eWv9 z&%44E=U+2g=YIz{$5lppZVj$D$ClAL|Htnfc0Lm&fNO`b4QkqYzSHU4(A|esg$1tP zM}9SJp6_xy$Blvb!*Lxh@~mm|e7D;v*Xi8UJv7o2AuDYxl{{-&=VT$hw^xoO)pJayrF*E<9k>&V^MS~-rgfeZ;vCmQ zw~Mo;b#8DvH*}8%Rz~{XJM?vU4_-#w*EPDG*M~ae*ezT&?Qzj2r*mUZDYSz=ihNPe znzlBY{m!8s^pWDMX`Ne~&UDR5|F$h#2coX+c`4QLJn{w+Omm!nZjLjaUf>*1<{WYk z=-J{7BACW`-Ym|w9_OFQbIdIIRpJaHn8tbjEY8LA9CK~Y3&a^jFpcwqS)7aKIc8jW zy*Psirg2_4i*v1co~ezP>tx;{&LDzmoEL>Tccv?GF5fB6AcAR}7l%2=T)*)?aRw1g zfIr!klBSEBJ&sg9xT^-Z#d1G-@1tnK*+8rg7fS=}gzSVjP5X z$T;{MaRw1g>W%sBW~aRw1g<9u+KbIdsSE^!7COyhh=m~+fH_ z5l(07pEKu>aqzj~3?i7u`N&zE3-r(895W8SMw~$e(>NbBi*v30^Gu#&#=#egGl*as z=c8wFE}rL@aqx}e3?i7u`2n*y*P3S<2cK z&N1WQ2gDgfFpcxEVa_q*;77$7L@abeCeR~t zbf*3}a}F5?pC!&9f@z#joW;37|18cie7-n?2&Qp9 zc^2p5d5#$eUnkBWf@z#jnZ>!*JkvNRwGlH8zFC|>1k*U58s;1`4!%R2K?Kt{pBCmE zGY-C2oIwQBIG-No95W7nNSr|g(>R|I<{UE)eq5YE1k*U5>2z-B?MfRDT0WiH!MS5i zdrtGL9A~_y*1oQ(m)R~&c3u~{4L*lFu{~+pdOk158Lz2zj?~z@E_54wmN;u#=kuM;Exqe1 zqg_MzD?{QIY6Z0cBABK&F352%vJEzbzSDy~%aA%@f2xm>}yvpg!wGsH< z|3k!C(>ixMo#!FXJzbS9e<^bd`-`)tb?%99u8a;`9OQhkIBQzxUZ-=zKyQ$3+RW1k zsAo;<+~;&|9Ow-lyWd5==xa6Y_52t6okPd&cZjp5b?)~&ht8j0O3tVaO@LlgIPtjTf4Yif0# zQ_`*Z@1u{v`ZcZdWlraYpzB1lzji6z!Pu>7$CR~B=f+ZNE3G0dj-i&2XHDz8&hH%8 z(UI%1;;d<%*ZZAA=Nrd~v!->v-0vKE%=~z9*0j!7_?<(KnV%ren%4PBzjMsRCgh4Z zk#5)qHLdeie&^*_S5%xt4Z&H{I$!N~UJ>Psc21@noHea;)#=<+Y7PA4tR&e=z8F(9 zt@AYj&XFDTHgVRp&SOsJ1@ykbjk|Vku5Q~&YxBorX+AfPngJ0^Gq2l_ zzSi#?I^RGi1ZPd_e4W#|xzyHG?xU3i#gnKVj47JddArlOsnixaN4i#=HLdfG0O!a- zw3i$s7qpFwGokSB`VBIa25_n4mS(v!>1S?i}Z0bENjrIT8j{ ztY6bQKhWmW2 z;2haO?+|BA>--?6^MX=)=zQbxGT#6ZOf%oOImfxkd}C4OynENgRJt11@(JP$BACYc z!A|FfpwAde4e9#^=?>~y)7HjAa-7kp*M1zSBXo{*9<3Vd*R;+L^*cvyg30;ftZAJe z=64RABV8cQn%4Q@e&^6R(uLxzX`LV8cMhE+T_nz$*7=cs=g>J)mpE%$=Ue>Fp>rgB z^%VLIP3!z9zjNpusau>it@ERu&P}C`&^Z#$%3w^w2O^2Pc!t@9K8&XJp7f-_a#uQEKd|QBXWC#5~an`iXw>zB|lsZG_NKcpf28dvq`NlJHobmKp=SU5u&~76c zqIIJ-G;N-rnd6LcsP4Yg*@L`<+AQ8zphpw9e1* zJBQ9UE){1@>-=25bLf0yRGc-f^Yi@9p&dtAoHecU^Zm}D^Nor)Yg*?Q_?<)N8*9W_ z(>mYbbZ#mw3!QIFkTb>lM*@7zwS35)gA z67sBRonP*E?g$g6hAtOpP3!y$zjNq(;|g)sw9c>eJBQ9Ut`uiY>-;Leb7*IGl{jl! z=U4lkL+2Y;i?gP6evQ+)skA(FzA;747*jN@^J@c~BRl9l;;d<%U*~jgD20|rQWa-S z>->7Bb7N^m=-7P?Ib%%Gw9aqvJ4cpAGA7QN*7=Qo=g_fxgE(ti=QsJCL&xro;;d<% z-|Tk|9lJM)v!-=^i{CkP>>d|qP3!ztzjNr=y;+Oj7ID_J&Tn@*H->%Y=g1EF265K3&hK-=7)b5n^v5S9LyQSl&Z2(_VUo!{qnj{Uxg z=aVnyqMFwE{cdO42x%Qr@jPk>&YITw15W3LQaMVO+qpxWHLddpoz9J=^4du01E?|7 zv!-?aklQ)-a{^y1dDgVfAND&(bGKJ)kcpvg9xT^{#1-}SZ(x*Gl*as z=TAGGQ5zkBecg~ag9xT^{!D~(U|)B!ID-hLasI5+8TH&zX$!08esKm7Oym5y80WBh z9uQ{`!8FdFcRF)D2ljQBh%<;_8s{%KozvQg>+4pFGl*as=P$-Mht1N*vRaRw1gmj4y)&qID-hL zasHaqnd>>Que(&7K?Kt{f8FVv)<#@kH!98`f@z$;5#t#h`M5WzIgKXN*wo|gyqbytZqh+rD$AICU{)$`Tj3?i7u`6o_iuIIqM zt}4zTf@z$8>U2(PBd)KzMw~$e(>VVu#yPAu#>5#!FpcxiozAF@6@h)-HgN_KOym5E z2bk;xV~@14%5 z=k7jy!beOjBUfBkplQ!{{~^a2*L)=Mcm6LEoI7rYbJ&@QBspL53?i5&&wtEuE_%MZ zdv)A(Cl`t{h+rD$KRKN_&tY3&l3XCpAcAR}{~X~QcPT`&oLo`Qnzo+*lH**Yp3y(| z^~6n*R*JKxb^fc<8MQIc$N$EV#R_rOw9bEXIyaWqwT8$_BQGK1|Ey`9|L%7Vy&maB z;;d<%|KW6QE>+8G1FfGx&e#Sut@A%4oZ~JzNuDgun%4PWPUptaRV!&VVeu7e3H7Xb zxM}_0PUnWv9@C=l;cn_T;H+tel;l57=f=_A$V-WnFOe^tHEo{nbUHVT;?u<9;%n3t zoHecUT~6o5(Q;`2jO`81nupP29e4Yk1ADq8IfUfktZAL^aXYUI-3V`xZBWy0gZDa} zo6BwGz}@cTQIzBPbORAgE4?U5?xFn++!m)#ONz|-o6GI1)&$OxeoGEbbknrTb8?(f zPc`pbmD@w#IPqg~*0jzIe&^7U@R#I_+5izuBi)$eT(CAmN0pzGC!9e9(>OOdotw(- zp`*&L$rH{Xf@z$aozAokmc!m4MvgzB8=OG|(>S+8I0w!}e@32g1`$l-JU76(68O&J zpOPn>K?Kt{&+|K1B4^OQAWt}h2&QqK?{ubZuriP~AF})vwE|}l!8FbboX*YVj?i)N z-{gsLP}A;PEzEH)HV$@#j)Q*`XHDz8$nP9F4*s2-Q5ztFX=-C}j&rebup@LF{406F z8ALFR^Ae|XQ@JB_9Q-GF!Wl#`jq^TEXW9ls$H705C!9e9(>U)N;T$*){)If@3?i7u zdA|VX$Z_z`yr4aj-LV9K4f!;jC$$5B58Uj)QY3&!`O$!8EmTNRD%{aj-LV z9K4r2;S3^}#`#dEb5pr9bR2AyJc9_PaX!rHOxs}SICvL%BF`X#X`By_a1I;??;%e( zg9xT^J|e(5avZ#yJmCx?n8x`?zjNp~h+}SWo<8=5x;D;7Ih|=63>^m>#2G{|jq}k? z=jL)(PtR!De#G(z)Ck5DO{1JVAji4bIM~$_c^2sV;;d<%mpYxB%AwPZM=wWhXxcm<>vV4DioEJ8N$wzDQre5B&|@9hc?mH4U6Fcj?CK7c zej~}jS@UEqO!tphd9KH~g+8Jz@>;dmi?gP6J|V!lGJtP8iHYN>Uq+rm1k)7si8;0t4-Ld!!qFnzAc$ZZ=hFh5 z%e`@3^jvWU5lrKJy3-l8Q4W-zC(a;(X`Ih+IyZNXh92Ko+>maAAcAR}&vZJ^>sqsJ zV7L-?`Q>}alavxo+i#qe<6NYFZX)NfPJ>*J7iUfD-0F0mvx-&{81JRFkY`Qn+~#y{ zri;vb2jir_D9#{)Y3jK>$GK4d+&#FuXW+7Q1p&)1Q5(oJh+rD$4!84Ase3f;(yzCZ zC!95HZFJ^17ug0|y5Zc8l!U}Ps1-PCTIXd>=lR_uL#@@Gu4;dXa&nCH&me+nYGZkh zbCG(Ub{Sk;at_M#DdG$wn8x|+0Oz*AdOlX1 zK?Kt{pA+RAl;^|68ALFR^SLq3VfEZD&LDzmoX?AL4$AYX;tV2~#`*jJ=k~yQK2DrL z1k*TQ5ak?{=Oe@!L@g)z=y_1q!OAcAR}FN$&w%JXUB3?i7uxhufABe0&27iSQ` zG|sD{oP+Xwq&R~Jrg83$aSp5JPH_eiOyk@WfOBVHJ)a=XAcAR} z`=XqK@_dvyg9xT^zBtA?te%&NGl*as=l&??pgf-;&LDzmoCgA&mj%}IiQ)_*n8x{% zDCeL&A1%%xf@z#r$2f=8^Kx+p5lrJe808$4=QG6_L@P=NFDzG|ra>IIjq-=aa=5L@Xq0nM zo|lRvQ@0jaV~OhqOqqdRC<3ocMKw!CeQ0~oQoXiZ|o@ros|$r z0`k1SqCKCoKF7I8o}0)y?yOakyiHs+t@GthXUg*+ttKq?qn40oP3wGx)0y%-7@6m{ zinFG5zS8MTc@DdN3jeIPh_j}3zRKy`(A$Mog~bT9gxb)w&R08~n|kTOuP|f!-UD&g zw9ZwxbL@9hmc&`pI$z^-Ziu@akpEkw;;d<%$DGcMy|Le!xJH~ct@8%Ib7WVSpc5jc zy=a{`x}9S`3l3MWz**BeZ}K~b=D8xyn$~&T>D&-`F+cg@do+<}O*~;=KbMjJg z*0j!BoX#!%1Ebw>A0e51S)4%x)6Ac@<~SFbKQ~2QNKB3g$ebTUFpcvzr*q3dd+2)* z4i#q*!8Fd-I-Tc{^H7;Cz)V-+UM>}95WzIg*EyZ%vU6NPA12Nqf@z$$hd7tforc8W z;tV2~#(9U+8TC9G_;GL#5N8m`Uo{tu15WzIg6He#(16`#m-V)oNuEV>0EHyw% ziKd;`P3AZkIgT{#Jm|GeU;j99*0j!3PUpGEbN5hBjB%1YUYs?p^B$)&=Q;4bcuy2( zP3wHU(|I29+|yO*3QF{2#97li-{5rS+Ni`G|9ZbTYg*?Uoz9%+%ILtwL3zgKYm*Xx z&UQxYe3R3;VW2n2Hf;v)>VvDMb$*c3xpAPkHB$O0an?N5tl(z9bLdX&5#p?AogeIX zZZ~OgJ-kYsHEnG?#Od5JFgy@>>T03PH$Vi_%r_pI<6LCFdoDRg?s_j0XAr?O&JS}s zBhQiV;ax1wAcAR}AMSLX2WNU4eSf+N_i}+ag9xT^euUE*c@BIFZ?Z(3K?Kt{Kho)p zdX9YG@jl`VBACYcmH_AVyesqp= zk^Pj0fl`QT*2qqA*0j!#aXL2+ltRbB>%>{pIzQIw+(gb%{Ty<=U7R(o^W&V(l;;kt zD=OYV4Utl!X`LVMbf!FaMCSS3;;d<%pWt++JVz=gJH%PjIzQ3rJdaMNbhNJyJ7D)! zaRw1g(?8#u<6LZBH`=|bYdGxqMi+UKQle?|{G=S`BK>nS<+*1SG7=MCr)J;`BA6!6 zPtI{JlINCzQQGT{`%EWX3j$|No9CzGI2Xxt<3Q|n1xJgsrrjTWs^2+uANELb*0jz~ zb2_&S_Vz@6&*PzTy(oxantFbEj&qTEo(t#7=wP}A|MC!V1`$l-e4E=jb|YLxo}`p$ z+HLUm9Ook2;M^h1p2LO|{w^*!e~oSkrpfa&a-56QM&nRVYub9ua)Hzah+rD$XZoE( z`;GbH3?i7u`B{GF&^iA+aRw1g3QO;X`Nr-1N zL+2X{#aYujzufN}JKqpz(&B9qw9c>aJBQ9U7K^KHTc^njGgM`>^C3dezClNDQ?BBACYc zwNB?|a*q7o(qGA36httM^Xnp<14qI?i8F{`8t2zLom(i+!9Oxs{&IVYIBkkVeXechXKoQur);T%}b3EG0QrgeU^)0z5> z;qEf6Bq)AF?Z6pC{0IwE8*j;RF4#Yp)}Y;>_!hMTXAr?O&TsWQmq*j)LzcgyR^SXG zn8x{SPG{=t)~;R?*Vp|^`VA1lG|q2#IyaOew?O)QFY-j5HSIR|jvVJA{YGP{trhu* zij$}zIBQzxclw<}6AeE&Yg*@b`JF@eVR8Hg&YITw-G1lLeOR2ogtMk~evjWdbRYIK zan`iX@AW%}?!%rg&YITweSYWAeb_U^S<^bd-|rl{4|}FKYg*?IIGvkHZK3vD z!8GIG2XmZ@&5_zd_hJ7{o}`q32&QrVkkh%j)E2rA`)iqRfC#2>{&0kI;7IsqaRw1g z;a1Jcz=toB9hlg9xT^{*2SPA@*|q1Q++GztZALUi~}?;N@hJ1EYY*7>VW=cZD7=sxUU z#2G{|%{chA9Oq(lr1sE#*#D3xDJ39+X`H|AbZ#!Shwj7vM&=tJf@z$;5#by-68=S; zK?Kt{f79vQLV1qdhy9K?g9xT^{#J-HW(P6x6LAI+Oym4*r!(~%q5H5HR7ok(w0+%o za-56IMd2J+&Iu+jaMrZW-*q}uzY)3*`x9{n5lmAX-^+0>*guEv!+wW6k!KLWG|u1m zJBRMW{)Rl^3?i7u`3FvC>gz)HVgDoj28du9=N~$q8)Dxoom@?x$g`&127i>}T%_M< zEOoRZA5l@IhTyDeoqz0ij_m4^Ys6X8I{(D)9J&uXCeE7H`KNy8(0$kq;;d<%f97`% z-G|*M&YITw=YHqVeb`OntZAKp;dc(*haDGZP3!zizjNq5>}GM+w9dbBIyaR%Lib_+ zD$XE+X~w}{=QtOeBXxxC!`?}rq?CXNrg8p_)493S5xNiiTbXZw2&QrVZG>~+NcdNA z1`$l-{5z*}3*|X-ANITA3?i7u`S&5ted!7UmOm9|5WzIge{ecezY)3*yOlgiDbcij z-5+zDi_Asg99YiD7ID_J&VO<`Q@;_q5BpPb1`$kC8-LDmF4#YZ?!$hUJW(4Uf@z%p z;&%?+hy5*i!Wl#`jq_if&eYe1?!(?G{RW6&8t1<`of}G_)92*DXL_wv!-?ar{6hrANFD5tZAM9<#!IYg*@j z`<+8K!bga+rgi?0-#K(2_L1VOX`S!%JBRMW-XhML*7+{KbLc+oqr_R$I^XSdZYp(# z?!*2~oIwQBjDz>&I2W5Eb%yT4-bJ3Ilz<4PalY5-++6Am-G}|1%r`&;(>N#ehV^^y zz4u<+PD!7Z6v;C?2abe)6K4>?G|qFJ&MlPZ$bH!Fi8F{`8s~-(=eT{?pNTVwU>fH} zr!(~%q5H7ck|(x7P21Nsv~9uy;wn0V0^jdA`%Rp%gk5 zO>QMmvs;_hrLalHLdf0e&^7A z*xSWf(>m|(bZ#mw3*CqPyEuagrWpqh$Z;+o=B%&XN8h&LDzm^1L+1x!5+iJamq94|yWbAcAR}k8wITmzIal zk^Ug{3?i7u`Pc~Oz(M67;tV2~#`!p>a|`7;a*p%^aRw1g<9vLGbKD&17vc;en8x`8 zr*l(jdFUMJ+2o0BP}BBxC+0X8?CV13NY4^yP3wG;)0z5>&^gjC#2G{|O>LZ<5Amog@8#R)*RD5lrKJir+bOj`Roegfoa>8s}4;&eYe1&XMksegi}> zjq_o-<}&XN8p&LDzm@_a^)bFpo3Md%#qUh+hq zK?Kt{pXqdNF0BZiBmGh88ALFR^H~wjfpesPiZh5{8s}E0a|`7;a*p&vaRw1gvDI~|- zNJEv(COS*DzA-{e!e(sTIY-0&avM) zzDJxjt#g;(xh*o!lj5vtomV-X=atqDwN<-DM}x#y$=D4dn5M7m&T%f%KhMvc`_pxJ zm)+tFBACXxC(3y+U59tsBhDa#X`FkV&S`C|S{+pzqv8xAn8vx!>AZkzqr1CzG-gvg zN1QPxo=G>mH#JN0IoIwQBIQIuR4+Z6Uxj2Ierg0t!bB@XL3ULMzOyhh>m~%(E z66bQIID-hLab6wf9CNAb+2RZ$n8ta~>70%!-Q7Xuob-t^h+rD$A*XZJ*NwKt41^bp zGl*as=ixBtn1QfgoIwQBIFC4;r)wjo+eik)8ALFRbIIvET^sE&wQ-3!g9xT^zBJ4^ zrZ!fKGl*as=TWEgbZx|R&&i-Tg9xT^E<2s4YojBkHipC*L@ z8mIGgZNv=r&LDzm zoUaUW4w@n*XNfb2U>fJELY#Y|Ho>GU&LDzmoUaaX?!7pu+ens)Gl*as=W2}e@JPA} z_wpoh1`$l-d`*mVSZ%b4Gl*as=P{>q+CTSJMuW~#oG8v9f@z#LIGxkJZlE`+p4-J4 zL@MyGR{=Yf%~HS5xqIG3l0Gl*as=S@!MbiOe%5Or}uMVvtd(>RYio#*ng+@NA6 z$CJewL@W~XzS=Tf;lsGu(tXAr?O&Rd+$X+6U^W?pxZID-hLao!r{95b)$5@!&> zG|t73Scc_>P{Rh&Tt(>Pz}bWZbJjyjZ^bci#EU>fJ` zLC#V0=T3135lrK}Bfz;m@Z9k>aRw1gU*na*pZhlIz47 zL@Zl^Q0!S-t0x#OF}8ALFR^8=mE7zf*{ap#W5#2G{|jq^m9b4<^%L7YJZ(>PBC zIY*s4zDk@y1k*TAg*nIM`D$?n5lrK}C(JqKU%XAr?O&Nn)pv%W6s-0@Cv1`$l-d{dZn%s{wHoIwQBI6uhgJY5?x-A1xo zoIwQBIN$7ap016cbH@)9XAr?O&JPZAj;W0aaRw1gw_;tV2~#`zIW=jqxAI(K}7 zID-hLaeic&b4+dAD9#{)X`F9yI!kSYojcwr&LDzmoFC3(FpcvQW1Pdz9j_B-5WzIgw>q8E{yFa4@u}hr zBACYcNlxdquZuf(yk49^1k*S_+3B3-Iqux?8R85gn8x`jPUm#K5qIwRW^o1)Oym4i zr!&qSw^!rN9iJ}FAcAR}pXPK<^Bi~Xc(XWz2&QpOmj$~mU1 zOP(jrAcAR}pXYSOHrN$-?)cT>3?i7u`T0&~jDuZ)=Z>Ey&LDzmoL>;;9Mf|=U7SG# z(>UJ|fn%*lzTh%<;_8s`^>Ima9{f2ufx z2&Qp zID-hLaelSadAc@&&KT9A%sHkuUM0>Tf@z%J;B=PS2s?Ltn>d3Arg46w(^+aG?A-C~ z;tV2~#`#TQ&M~#|3~>e#Oym4!r*pdB9e3{d(c%mun8x`nLC!%_q~tN;3?i7u`K=+& zap#U-BhDa#X`J5{;v9GG_*QWS5lrL!_88}|bH@)AXAr?O&hLnE4m)@JIB^CMOym4c zr*qmr$DKQVh&Y1?rg46k(>d+y;?5mEUYtP$(>TA|>73>{?%eUi#Ti5}jq`h)&gpz3 z?%eTf#Ti5}jq`h*&Nz466?pFWVd4xTn8x{iPUkewap#VoDb65*X`J8hbWZCz?%eUS z#2G{|jq?Y>oMYy7&lYD8!8FbvbULSfUEI0j=ZiClU>fHSIi1sbjyre!SaAjsOym4v zr*oR;xO2x(5N8m9cZ)NKU>fI72RTQbJARuug9xT^{!Ey2OrGB^&LDzmoIe}p9CLEw9pVfk zn8x{YVa_oJ&EF}`AcAR}Kksx-#}qnuyewUZclj}K1`$l-`~|0T*4K?Lix~(%F3uo= zX`H_p<{UE+enOl<1k*Tw$>}^@8$n-}{z-8L5lrL!WvBCWZ7h$ejZcX)h+rD$uY@_r z)W)a98ALFR^H-hD)3vc8U59u18F2;?Oym4Dr}K1etcafJIhdIa8#^=Nt zL@H=NGXwXrf?hj;mTaRw1gdMmjyre! zI&lUOOym6hAm^Apt0Z~7ID-hLasEMwbKJS(FN-sXU>fHihB(KaJASJ;g9xT^{!xr` z*tz3JiZh5{8s{I!IES4(exo>p2&QrViPJglpX1IQKSG>A1k*VG)ajh|b#dp8-z3f; zf@z$8=5$W;9Cz;cQQ{0Dn8x|%PUm#K5qIwRE8+|yn8x`RPG_7uUKM!m_!e;n5lrL! zOQ&<1=eTpn?-yqf!8FdlayqB=9Cz;c1L6!Kn8x|nVa_r0x(|voh+rD$-#DGqzAoZ=KF*J;$9peuFrJ2&QrVozpqZbKJS(H;XffU>fJ&2RTR0pWhfJUyw2tJ zRcivBFCtHDgPL|5ygSFa$h@w(+}=GBI1*kc&YITw9=CHxXr8YSXHDyTuirT|&zFm{ zrgcu1B*{J0XW^EOH^pkBGc?Z!inFG5p5u28&GP}`tZAJa+|FG+J%MA&T5;C2&W!=i zfkR4igE(ti=O(9fQ#rJplMBRI(>gc1okPnx!DV_FQ#7q}i_^KW+}lm72#bSc>;@4` zGj`9-aV|2iYbp0$+&kQ#t{`A}a6_7B5WzIg^Fo{l(-j0P4-#h(!8FeEoz9Krq1LqZ zm?bVPL_KTTeb@y#&PB#Sat_@eTp`Yy)_I}dIq)b_lHdRj@~ml{7df39$|YJuT%dH} ztZDnY#ZKqua;du#w+SZC6=zNByu|O^(^ZMf^Yg@6(>m|tbZ#k^%9TLr=ZLeWb>7$M z+*FPo2oIKV5JWIh+$#3VaV|0rF05ARK+?+oYJat=nyvdTRIv?;a!TX8ztg#~67)e| z@>jk_oHcE29FXH&XiTZJ2lg8D9&~Zmw9W^*or69!OY;0Gan`iX2l<^t^ZaUY*0jzC zyPbnRfJ*ZG3USu7&WHG&L-YJfan`iXhdP~`E1i{&AxTmIUM|j>*7-1}b3>&oz;vdG zE5%vUIv?(IZmh(fA3R5#HSJvV2&Z#XC3e62U~$&8c|OwV+*s*ro%zrD?;R%2nl{fz z`JF@etqu`qP3wHL+qpk9&&P_hrmc+!_?<)Ze4IFITIZ!s=Z4AvttBqbqoyzy)wH#7 zjMKTXG8kGLOT}5!=J{B^b7*ZGBhH%E`8cO@b7iPK?wfUzZU&LDzmoKNsOcSbrNC(a;(X`D}VIyY5@MtaibLzWMqR!|$7ww_PQaW1w$ zI2zh-94^k9wy!(c?;P5194gM5*7+2tb4#U6mz>0DpC`x6K?Kv(^Qk$`Mf#1@Iqq=o z`Qi*Bn8x`ur}JFObARt}SfbAnXAr?O&ZoyXhb8)4aRw1g<9vqG8MRRvjobCUP@F*o z(>R~$bZ)McLytdqi!+E|8t1c|&Xi|z?oU?`uiLkCNxk#Kr1k*ToggA$FbxD^vg9xT^?({oX`deGm z6$C8%#2G{|jq@_6GmV3A4(m8B7H1H_G|tOooWnYfesKm7Oyj)5=}g-o73R^(1%`<;~H@W5lrLU<8)4IBj`gf$?-CA1`$l-+#BN@RvT-@ z8ALFRbDz^Wtqoj}8WZcp8ALFR^Tkf*v^Ii1^pYIci!+E|8t48P=djwiT%17!(>M<} zozvRDmA^4@g*bx73R^(1%`<_IF+6em4OLDA=Gl*as=iwOVu-dproIwQBIFC4;)7m&YT|vNdOq@Xk z(>Rx$&S`C&9d>+UgE)f-rg6SB#yPAuHi|QdU>fI9r!&_^TWh+4faNA}1`$l-Ty{Eh zZM4N57abR85WzIgl^Ex++Sn}4AcAR}*EpTi+K4+Yx<#Bp1k*TQ=5$VLBks89R&fRq zOyj&Z#yPAuwuv){U>fIjPUo~X;*N`6E6yN-X`I(PozvQgJ1%;iID-hLalSmpIjlCe zi!+E|8s{sV&S`DL9T(jp&LDzmoUe2`r?nAxTy&>6g9xT^zADB!tTuLuGl*as=c}F0 zX>G(E7u_w+AcAR}t4`;%HsX$pK2V%N1k*TQ6XP6K8x!ITBACW`%;}ugM%;1HNpS`d zOyj)4>73R^+;PzyRV~{!&%chZ;5aY{2;3LiL<74 z-WuQ>c_HJw#97liZ*w}&U)xiu(p%f2KA`{6;;d<%uXQ>%uU%c~?xz(6#d>N7^{i=~ zuZwUV3=*bh)`_#Gb>8lDZdupSzB=&34Zk7IAcAT7=N&oDg|3ZXH&TxLK*q0-Cu##k zFpcw0r*qT#-mcNK`H*=c!>#0}*(S zX{yiveg0YY*>xc4PX~WS=JccdJNT^5#XYHV_ongfV>jhLugFi&q$kg#8;D?UohkZ`{6Xa$H{T0p6bpXAr?O&J&c}%)1`vh2k7k8p-M831<+&G|rPj&JWxZ zQqD;$dBPb)Fpcw6kn`l!uHETce9N=w6~qYm7s0#4Dy6Ch+rD$>z&R^ zvc4{;O7t2pyI%M z4tWL<_&ise=bLhzi{-gJ9aJ{#nG6_G`19i7d^TJun5H%!Vr7@GQ=?*7Ksw zdGo}0#Mq6`H-R&VU>fI#IGv~Syk%Fq66X>}{@|P)0c0BIhdQ12sjM&cR)@OR;G@c_ zE4!S^NxwLQ2&Qqydt|dYQfvCOLi4))vf9|Ps~Rz^>?Q}~8ARNSg>in^EP3Y7#mDpi zM_?P&&YQ=kwmQ2F{@e{X(cVoaAL@BWH20 zC(jW>;YRX=Gl<|U80TA@&PQc=p1fh()W)sVP2-!#_H3W3ZmV;iw~9RB3?g{{*f>9G z7Ux=PW8Z1#Ds6@S>UbD=!Wl#`jq{^tac;z<<30l0;F7_PbiOfJ4ViH~lGX`l5WzIg zkD0}}_Hl69Ib`&H1bM<4L@V`p)$bsJQ94jH{~Ax}7i2&Qp<+$_#@6J~L)HO~jmY=cwVc8pgir^Y5c$G{#= zo^S>c568kdKXDf4TJt=wTInjUrcZH2+W~PPwXuM1AcAR}Z_RNoa_o!F!*XAjuED=N zhMJf|H+%*T0*{e*9ZwSHrx5p%Uo?Su;e7=9=Xuqs$w+Cq!Xsn$H)s{iL!T_(ne)Lg z{{PrH^L>WOa|8aU8l4+LMv|E<9!Yoir<-P0+u5^_=ck%H?}uO3=sag<)=~_YQZv|| zG;wT3$J5ByU0RX69pe-yQVJZsuKKi%m(cXDfW=lG3NZdqyIXmQp&%rt(R)47G5 zcTYqdB}l~{AkLbH8t2=c&WkJbK_}G;&H|0^++-TB6MmMO;NpK`TjpwR7*Wr?QRM!y^kmdCh&UOGy^=Z8XP`EC zob^BHWMe;)QlPG`Cn zV%phX8R@wnIRCG6KrfDSUKZiJl6>I|BABK&UgC6CwXrGUIvE@zhch25&uE-q>U5@S zPO{qAN~>@O&PBkP&q-u7&M$L1t2{?^8+<+x&gak#!8FbcOym42r}IpnJ3{i@N}g~A5lrL! zYNzu|o;yPF+)18r1`$l-{2Hh8OrASK@{D%_!x=;{jq_`r&NF%L49W8{@`N*pU>fJw zIh|+b8_Oc5NHtx@_-?5nXL>eXa36tlK+(=PCjn;=3ZQjfIlI-L*L+u50A`fPjhgfoa> z8s~R8ou`lGh8*Rm&p;(l91{g`UJ%T-N4m@L?i^=6(u<=*V$3-QWx& zn8x{ivpCm!%?V#;jyz{q$vBgJ33`)6^kwSV3h*Y?2KpJH|#rX`#~1k*Tw z!08-)J_YAcFvrk55%MZNnB&a*U^UkBqUy{^psH%O-n;wI3(;R>Jdo~Nl@E#Y$B6sM zifD%P-%pg^X`rv0d+oN(o41XJ?7yOIIJ6kfoMpo^(sMu`7VpfNY5%zN>3c2Vym+c@ zvbuGAY-+=}?;t!uqWUXwm6fBApI z8T(|&D2RR<9HyI&{>B;StnSet*6O^Vhu;J=+%?pzo2~o)5WN!n-5}Bi+Wqby(=W0- zlRih0ZIF)F?V*mjv$`tgYp&Lj0h~cNgVy3o2U-K}(;%uv}sf*(R!7`s6P^M8!p*f&5F z>FX8`3=dS&DMxEHV4{SaVr)xuD>TkuR(Y<+c}do91kE>~hpi1nHGoU$rsFF)&WrJc z><`sXHuo`h@4vTmwWIwy^Q>YIF(-mE2xstky6O0;(^=(t*Y1F8`!Ux?J!ktSOj8?Q z%W+1EYdu!5nDSiVF(ssX=6zS>IopQ??Xj<~=QtOsjp;nM#mt{EPlGdv+5nf*O~*H! z&d9Tj-Mcn#)-Bg}ANhha2xrjd`I}DXMap?6weJnmVP_D|pgorRE&5?L7tQ**BDJy4 zj5E!V#;0f%u0W2n8=P_f7}MgnozBtoI*cdq1mO%GM>iecaXPC!2h2p%xig$GhlVqV z_t)t7uG3ld8zJ*L^v!Sv;S4UNn~v`}otroA+OyML#WP0h>Fx=1(>!(N*L*MA{y@wD z5ljp$_YoMo7tm)7O}1~SmijyI^k#)x)0|jwGaDar}KV$JNuGMZkNyv&LE;pH#ny~2;WJ5GK+Jq$B~S4wY4K{x85b{ z6V6$k;@ElW%%d|m`_pLW?1C+Bz4!w22RLW*h~wzKb^ckfv-c}&P7r4hfzQr@^BmRJ z{d^YZmh_Lq%VrJq&-2qxV|&0Z3aQtR{P42^*YyoS(>t#xeM20=%#6p$^6dg zOxKyyj7}zY0q<)&gM2a12N6tjOh(V2vwpnDF~)sp{+!M0c5nB8mg`pX#C{5h{S?s7 z%>SVBoH;M1=hZrYj-K;lG-45IeN~I!#Z#V;S6STX}Zhtr&*luuQ~rX zSz+u3;S63%HywX=I!Dj>HoU5sU|_g!L^oa6{ZV=q zraA-iYCOiVQ5}C3=f4xPZII6p)i_5w@aD0dyLRp^{t&%_g7@KyzAj_-H|S>2*Zobr zGv|Zxr`G7aFm{T>`+->X3X#NqA+|{!neRXA%=13eBT8$BbC;X7;EGzv2xpr<%MfYu6nahJ(6)lbd+^S;`7w708AH(tm6bNJ(zfSuzCX6X%op2Y)^Bhhjz9K30{zDQu?;p*p5a@s z^Zl_6HaeZ}k8QBY>3n}|gUwFo`(ysxBF^)P*)~|@eG`ov_F#8DEY6{pFn7>A#uZj=c4n-*W;{e_nEM3`~Xiwz;z;3wTVs*?UD+7l)90R?ki7H2y#CH_*o&Ouo9WD{`Fw{x~<0`9479 znfkh#k9|eY`AbvGg2d#P!5F4);0-_s@eQ2WL&|e1y|E`kE6Q?1QtWt>+`1&Mh<-jhsRci?gO3Q;zaF z2akiR#aYujAMJEr%-=uQxpG-`cx1SjR_Kgd>Gh}u5WzI_=R0YA#b6)^B9nAg0c>UaK}|l$#D)V2)37VgCHqjE9)kPt0+~>uR0z&!-Gi zo+;a=;W{6lN3TPkK?Kv}`J^1@B6(f}XVk~4u5!ST!teWm^GY_(|J?YKbDXga)SBl5 z@ZD$lG>g{iBz++eeL>~ss;sUq;216`@v&SG^E&&^xIM_sq#WA0#7@&sWtchz3beu-M9_PlWj#;F7h}f6XT&#uZ{^?%l zuy0OD#kvV_*0j!NxSeC)>(NENs140U^jOE4PUnVQ*Xicm_xq>?IBVKD|5;Awrd{-& zLAU8l1L)&X8=CgmSF6)`&hDA@Mci9OjbKdCMBa6@Ih`B3R+V*o-us8rcmZb+!8Buc zHa`NhTF29Cz0SOGga3U8EGLW2L^y*8rg83|JZIjSa|@m;E$^8t=#d#$$tBoRgKAf+O&l7)0wu(Z8E9yC8 z_BZH8P|GXCJ992_%zR-_U-kO2iRz|ZH|*5y)_earN-~^5#HpYuj?CBg8@0agc)mFA z+0CnPFOCss5WzIgXXn&2o?ff-+@67Q*Q&vYT@-eFDJ?PXS@JJsaZZji*NFU``nmQ# z_jNthjoaztQ0?#PecVScL~VcwrpfcUInG7;=a!!8Ci?W*bOiy+TJ~Yjb2`)adTic4 zwx!xVwsXzoxL^8()CBSjBA6!6=R2M0dp+1WszB}_PdI}Jrg6T&=}ey?$#IC8ALFR^My|5=AN)ab?msDmT(3UOyhi!-+81j+sM<^xR%)8hBJs@8s{#jb5l=s zBy3Vgj{S6lGl*as=T%PUxjpn5onxDBO4s0D;+zDWK?Kt{cRQWuiF13p3iq;&T7WZ% zU>fHhr!#GX6MI5tN2%i}1UQ2Trg84|I|qC+S?Y)7MRbERh`0y~hif7`tvfU_y%XuW$wtOyk_|bf!5{$Y+zKhUxW1a6UnP zz%O$Kn8tZ9zP?U4lIi;(rdwGU9g9xT^ z9(FoYJqPu2spAj<{RW6&8t0K5=R*5~y~B~a-Mqhz>ou_7tqK1uN;%Gp@JspMWY5bZ zzo(|JYcS+wrmWx?BJvC(m?qDc<~SG0^MXFwgDnSLa6*nRp&PC@0TEy}$KxN+VpN{4gIyO_OS(zd{afhO zI1UOTKzlt>=Btm_70Gi`U#TN%z7Izn2gbDz+3{e|ITK7D(3Zk*b-YvDn8N$BIwq#K9;&*ytHi?!mso|x5hkvt!iZi9P^J2pf( zV%yWi-=G6^yiU9`=OWwSyuNDRz;Jn>UpMNweZW$P^v@MT2ef(hZL|+FYz@zxy%;KsX=OX<^>bz#ALFc`j>Gg01 z5ukOxI>5Q3Juc4=BS$!c2+%rLL!9ICjIJHdAOf_`*EpSu4fJgGZ znZ;Oyb6lDe92ACgc5oQ9&KsQ0O_b+A<>b-ico5w{1b7(Vn^|mhI?o%Z1n#AzbNvp| z)B7ps&gk;JP2#+nn9Vne^mX^we#*FbXU;|DNc_DXH|-v;;&KR+k9r<<$~Xujm}VTz zeDxd&Pp|cO-F*5C_C4FG8@6rXRk#=D(aMoKaIVmP7s-~KdR|P=E#y2I=X|a>gK!3I z|Gd@d+&DP0mYNQW#pH-gAVi; z+r>L`F4EUEmde@N1$47@-`_y5Jf3bK0z8TD%`7rs-PaY#b7N^usPomNhFSm-peg5M zXHGpAab7qvzA>_#=SwYQ->Hko+5eya2wLnC=LgnV&--ybD{)^r^Y{Ovp5Y8;e?#UA zq9%4b>bZHex7-`J4~x0c61rK!HH*ww*E9bw?8chCKoQ5x8_R9W)sNhFw^Iw4i-HL7 zP`)>_m~hr}V>$G&XtImc;0z)_>pbanZiwybl55EEIJ$v|Yv^_Y?x>h@IyZ(^b6UsP zFF`$PD&=HPj&qTEZmNu~>D3K7@0aNH=r2G7({#|+=QtOcBh8!IL-Xg(JsZvs z7O?rhSz5y5`EozQ4dQ$gk@HKxC^Duj;r=-jcXrOSZnz@P8MD8Eel#8E<8Bo1%=uva zsWtX>3+QvG=zFBA{nhGpo1Qy|(~IE@BABK&GGE<47paZLJ+b}sHuA*r4G;ll{`>=4 zJSeB0i_}Krnpo#+$qCLN0<_LI=Q>ki)L0vhYhuTg-Q);o5CK}}2j@D|6KiyCh@Fb^ z_W;rM#3V57IQS5+^PbS@Gk*^doYz5^0<_K#&2_H5Hs-EzegQq3%`9F{ckzBf5CQJb z_huFk%XOyT*H|0PYpQ*bTj4il)n5=rJm!8(9s>^-=SLE={<%oMv5?0U7WWS*^XizX80HXTnzEp<~j3ylsC^E?IC%FEApH%`y1p> zU?9)8`0^Y&s(gs7kmq-?U6SCj&2#4a7-ybIJS5L>MV>Rl*>(rW^P`=4j;!a;i{nR# z2t2lV&U_!|&2vya!xeeXnEeg(qv=4NAM40-)Ag}C-aE()`>-GawC8{_U$|#|U6KBo zoFhvk!5idoTpvV$$MU_I#p5N%^*T3RAG_l{Mrxt&K(m{YJkjagbbV;|oLonasAmuX+Iqg#?;Kjs4i5c#OR3c#1ebjaW}#m%b-GPrSaN z9IhBsGG>2+c19ofRPoN7i_AsmU%s9`A+S;%S*=^G|Nc|xrSJd|Ow(~>zPf+r@g4u5 z`v@F=K7gHZU0_eOZ_RLbWx)4#!l%(X;S3^}#`)=z<9eOJdOgNL&4s4T=aR3>d17~{^Pj|7(>g!T>wH73^B=`o(>g!j>3n}&UzgQ| z9=qv!tD3jL`{R8RcTk?;Td(u|ac$2F#rY+~tluco*Uh=nY}C$&_t5Ln*J&;=Z6d!f z67S5pNMASSCextv;l1>FIBQzx7n85Y`Tn?0Ci8t|owd=jl|M__ncbO}&!e#ndDbMg zy#lrIQb%nx->_}d)YiS4bUm0W&YDY1i!UQzk8|`k*euSPww_<^bq?MJTf|w@I={l{ ze1BXEk=4a($vx}q8Vihrb2gb`b3S}Ky}p@ln%E|FU>kfD`RZ}7Q2#usTl3$48#RGr z6`Hm-UQNCp=Y~Do{GzIbw~DhS=F>V}<8;11&ckLoep8+G+>FoaY}Z-v-Twx?9QCYe zYXf!sI!8S>gkABK{;gjYXHDz;dh+!-$8LmQB4_jynsz_s4Nm8@p1DBkJ9wL>cY661 zx<|uGk}<21=_k;gH;VIHh*|$!X#U)5-LQGPZq9xGm(&9K2~Ff(2WsN2 zj@pRs>wZOY=$|!hU-vfh^*Cp>@&EGrjm-Dmb=F4oIQT)yv!=~6YU3S_+GxUQHeGDa z`|qLGV@%Ps{l+`V*W(;Lro5MYaV3EkozgN{pp)qCabWmE~LySn59;;d<%-$TA0=jnbUXiWJCInSe8#?RAzJEml{{6SS4MaC5FH#(`| zp!giMgZ^1Fuito|qc)m1tqtusK1ROiH#F@rnfH^g$9bmT=nR>Qeu8|_Z)D8!O+T8B z4~X+eRc#dMH~4!?Tc?|I-}w}^u!wG&d>lZvjQ#?(TyMX@&TXne=iN`!>*1_voj*jr zZs)*#*w2Wwrgi>sgmZ^8x$5Pg6=zNB{1K<~{c&wi)@OW*+)+n}BHLi}x#NG(`q3Y2 z?h7du*!Dg~zV&W{(dUl;O>XF)HM3l1+8-xhmvivB<9~^>rgi>=*E#sy@jt~`(>j0B z>AYmHRldq^&-Sh3{*#3xWRg)`0}2f;2O2RMTW zrg8qX(^=(tG9u5z6@N6}pr>;S3^}#`&{O=Y`of zQ;x-aM@EG_QKOp2Kwib?a-5gp_jcz%y(YVhYcHpr>0=hMpLeJP-z8O3kPs*akdfsokf5tb%ZrkbomOS)r zaL)R=D&0?2mSkqhmsOtYab7&_?DvIK7v10tA_nP}I?tR{`HItd|7mA@4X?X<=J(LR zc?`l7Tj-WLW6w5?ug>CJ>vtwj_jN)2^M#~^D$qPkTr+$v#~FX8{BhaSa`}Iwf4+d$ zgkxQrhnls2-RZpF)V3Yt6K&OPlN0@8J2!3GK5kY}@ZqiWeB=y7JfCi;jfR9oCBBj4 z%)d&DD0^Bik>~y7Yo*g~m7d(XYj^HbYyKhno%!YJFZiIwPqW8y1KfS=-c27BACYc+bYl6xz=qkdQ9mf zPyC-j1b8Ihn^}A($C-~&*I3UpbN+#yQ=yHu zx!e2wiCyFgXAr?O&fjx7@0I6@KhGDDC!9gVMOYZ;?>n9M%5!DFo#$1g2xkz%G|oS8 zI!DhpE+$WGgCGJtmG8|gewgEoZLrq)#=g__j5!j04ew0Tb=@n`tB_|9!8CdPQI0b< zzdDX@gzOJui-2>sWiXBNkDbml+u$A?E1#>KF-aP(ZW*6audnxR zKfRF7sZM`4C1zdNzM7|x=+kGQs65x>ob`3XJQ?-xTWw;$Bmof*q8pqW_~;UTk|e*F z#kmnrypO>AIqU0EXMbP!5n3l|14MkBZm9~gpT;j|ajvz0o~ezPuY1H?AI=~G^SZP) z7Vu*%e&uw|`i)`wdc5gI9d{l~uZ1&+co^Mmo`3Ch&iZFKNA%BkkRzNy#LMWGI=Ap+ zEPms3&gMws?A{1JNltJE5nrMkoagY_Ec_%%emjeEt=pigjgT<~$LHV-B5tQ!n&+8% z{@pCjwQhr|HbTw;y@ed%3?e>6x72y&c-`-v&MMC#=YSqTj&KGMkE2`aJeMD1@du}~ z%5%s$pjVI+oI%8!=$1Oq)W#p3&e-q1VQkw}-^BQMI*9YC>Rwz%uY@y**g!WpH>gje z`qM1Vwaz!@%5fyL9}(wJBm2`$^DNWwpL3k?cgjD+JbUkle2lTDx@xpi?H*YZa1e=_ z$M}c2Xf_Tq&0JK^>#`%f_+Ql8*X^@q`>qXR+v!WZw``l7^1q=T$89N%{8>F<2i?+o zraKaFzN#TTe~kYL;$S?@J~92(UQ6Wp{&3EG7m|18On3kLkK4;OeE{c0=`qIP>V`d& zt`o4*KEB@twUK?#3)9rbUsXNp+Nd?p)6SczEoZJz(_ zbdKI1yn-Cz48j@YnkHuPpIMx1?VqFf2eGpQXAsWdnRL@}=Pb^(&P8YHIc9%wJ;}it zgfn;&-E`dLbXIdwq{JOpQVVbf;S5^myPeKzE*i2wcnvwi8H6)<8r^i<<8)Se-mcrN z_x{!NLO6qP22Y`zj(eTXD$gPNRvSnT&LEt@)9JQX(72e*?Xs~OV@j>tpvrT|zSUK< zZa9N*25p|_IGt6VL-wu4$PvyUoI#uC2B&j&eO=V?jZNeTXAsWdO1kN2oW;4;F{OFq z80A;D=(~?SRU9$WoHpGC`z*!S{ z*U?OQ_Bc0f9UsI0FDm9!LvYrdIZBYOrN!w?pC>c6soEN)%%7DD=Y@33X!ATb#JMfZ z8Gdlpw9fOK&W$_9ZVVHqhG>XmXHC?Jj`?2aoqKlZ_PqBop21Pm=6QkFdDq4XucvpHzk_kHxmaMr|rxQ<0m=SDh!q}%h}haa3ZZJrl9of{^1do}lZ zJ;pPP*_zgQiPO1pa(DY)D|J4=u`D=i+A(Dxr}M!*)!yDx`cbacRf8kltE=UK%X{lK zzn)%+yn>iMfcDxRIv71Ye{RI@DNs+f9{Xw@+jRZdcDx`aTB#WvOV&KfG>!TG-(_C~ z{|`iwInw-%TdOw&ejFS|R5)uM11S~zQ*C&h=j>LE1>D844EopeF^!Db|37Q~0H^c( ziSfztiR;HVAu$1QB(;G&Yufqqfl`)Y?BkfL=@ICf4>;s^v;o zWlh=Xi?%FeTA5Sav>tpHJaMYx8e|yCdwBCB1kEYi)?cTL3aOh5!k{z5i z?HmdJ-+G-dqW@3Jvdj=JP-EvwCV<(_g_h`$2JI} zJVCn+;{RLkHh7FU2Myb>OI}4cID>Eotuy+odYzA@*Df3y+qRP~-l(><4WW5&Y@i0_ z(G5f}X+1jd|E<^gIPKit9^#CHe{cp7Oyi9IZ@tdP@8#SX;*4W|aL$eaGL19-zx6tw zu$S|S5a)4m1`$l-jQ?-F&L`1p7i9IkEJT@)>m$!&Y%Da+`2W`HjN{MI`za-IJ)CZu zM~HuhC(^jEgl_O|k{{MOcArdt?;)juVSdMPYjyO-P1UyL)e5j8YriOQR0?^{j!rRY zJvvUL$Mxpc__Xl3V)y1VRcBnM{@!8FdO$$Fhn&2dii+);O)uO&}7g9xT^#{aio z=d=FXxwC`w+}W9~vG@}6EjVZME~atD|F>Re-UdTwqUmQ>(BT&T42z6LIYB+wyA8s5 z!PM^RR(kX9cK@Yy{7)H`JZm1uznNK_=5*e-l70Y3`W{|-|Nl(Wb=@1JS7B~+p}ZQ8 zxgV3qK$hb($vx}qn0VoR1oC`9RW2B9owmlMT6G6pQ4<-nzd<*MT0Vn(!OWTVWoo*P zv6WueQeHJssn*@KX%)VYYo@Rbg8!$rb8T(oh{7=amO}3r+R{SPkY3Zm>b7?8UTIg- z##+ho%CeId22%_P#Kw&RO`zY~pWXAE(JJe4TdcD_;CV&Jt9d-{?r3IrkttQ_r(TS& z^&D)inYkKqJ;k#;Fr$=ez|4GQWp0c2_4)n1%yqYWu1HGxCJx_|z5QLRFr$=ez)ZeY z=8kw@T{BN-)6DnNq&*ii%qXQQ{nU$mt;}8Vz8L3nk}R5!^AmxC8KqPMX7aT%_r&{( zj&o9G({k4Mzz{}m>cWgtssS_kTA5?bjkdixS_Lwf#nnFr$=ez)ZeY z=5NLOevLUv(?q5`*#s;i>+$imaKemIssS_kTA9BS?|U`oQCU>T=JoR(;e;8bR0C%6 zwK9J%-ZyH@4K5au=Z?>wKY4Wa z+$|rSo`b!JWp(n;a;g2`9`br5Z4k zua)^H@%p*W&l{7yL2K*TGv|A=wXE-9uGaag0Wx8Ctma1Zlg-d{vlnkYQly8S|4!HiO> z0W$dz?m{CeKU?yKHb1L3vP>a zZ^y2fM=e*hwzlbP^ZHyYFr$=ez)ZeY=8<^opDBk~J{r5I?|ZYg+`opox{s|IFq5y9 zc`V)=dOYW;X=3}AU+ZuAx0mGyeQBlPu|d98=3KmfKPb#DPp)G>NJxxx6_%>>Q!nzh zGT#-izg7VAZkBI0t<^EsuXp4X%qX=(6EKsnm3ddZFUGk@cX|JYm53i^lu`|t$=Av} z5wG75-pz-@T)ru=6%`F1JQ)io%qXQAFq5y9xwypK?loo3g%f6!QVp2N*UCH0DPa$5GVqsidK>!i-X?0WYVG(dtKl6yS#I+MmsaNj?X?bJF{9HFt1j- zxK^8e()?QOEV*r*S*zVv`+xbrr2_xHBipTR$E9y97S5QJKdSzHoR=i$-tn<5@KpnoFF%xAE6GOEQmA286G0H zJhSDCdd{^5dt=V|14aAVe2u>Q2gu^G3#vh)+`GJAP46#vDrfqg%w^J`^S;s>lOx-Q z$EDn(Ba=nz_6e4rcAhCq&XF4=FOnP2xms<3PMNfcVC8(T-E-wmgU)-4^UlHX$(CYb zcy#lootNe7n8y8Q$ujf?q&J{_4vxz=D(92r`-Jg%dd?G*<1FjQ6J%MOARt4&?pZa!N}A6uS%f-6 zqBPPk&-z*WSRN<(4Li>r+&px};5L>B$)U0qwx6@AWwinN;$-;(R^Qu)Z#Fn?9Jr>v zEcC?Iv0XaqO%&t96T{Q(?Wf45@qj!B;jwbd^SZ3gJeD*wZYk`8 z>3d{xJaXRCta2}Dp6WSxQ2HKYdZTsTYljTWBcof2p{-`k)BEy3S&Z%HTxwQ@@0(Mt zt2#H+8;jDo(Yd;4X*27d&X+haZdm5)`il5c-@KpY@iQ8&^K3?qe1*>Y7s~RCzd5V1 zp<4BA;#~Fgbn3jI?B~IlZm!kdCSptEmeck#z2fQTMQetNt;1Kg4NeS=j8uhi@C<1T z`WcdbA$Mo&-h0$)-<2_~a?X3b(bp;W%=RhOzOXpAdzyQcTI~k$W1j+v((F@Sk&Sg# z-!!vNSuD@NojZ!nW4lI+9Ywhv&-7qfn7UTS&wNd<B>#n1-${ zvad|(4M>z#G0R!Cw`R`OxY0~+?Auigbo8H>#5>ll>t2)AJUuYZQL~CX$I{br_X^qH z@Ep8eL@Q_cF&f?v&J5cBRYJTb!8xb;R1XmHyz?9*&6Y+U&DQ6=dz7pI=bY3$53d0| z&U1#x$H&I=HTv!!A&cXjb1$<>#uAV7jL0I3%h7VfIj26qWL}kf%N>vN>>Xoc+p3iX z@Gw~ijyY|eIY;Aho;9&^dw}ZhRU9t&aL#G_nb$BL=jh`)YKUXbYX2;=HT)lVobOfd zctc;qwxlgIha2VL>{B37ntclU_39X@`gyeH8+<*OzwYK3Y5j(QqN}^Jr>k2x+4SU7 zvINeMD2?+mGT-AY`@xB#clENOJdQ554_>L;n(m}W7Q`76rExw<=2y<_6G=05-g9qo z)YW`mB8%V*iPAVTc2~~R>5T(TKbO6+a>Kd0#pWlUl|^udL}{EEyFJbeC#tS!S)m(o zPA-+@IWDTWS?^{4ON49L8EG8y5k34K}a%5~YUwiZS zpD&BxT=9CjZ=Lb|S~?!BobSQI8XPxfjmGX%t`J9hBj-Z-IuFiA$b(?z+|2ong&n=U z#m4Tw{+{*g^7T&lKF1n3L!vbO{EbxO+_{-?WAXal?!Kb0yT7|{V|Q1%9nZ8)7M?9P z%Y2<%MesCJXF2w7xHpz`6`kuhtQ#oK@9sHw^|W7Z?^dD@sB_g1N>k@A*Qql--|#u} zu3~NHhGJ#Ux!vo!dOFhs*b> z*RV1^H{8#h`|59RE4B}B9vPH%cyodXGFCvcOvv3CyF0vA+h4w}dV{gNN~7;9Se!ez zS4&Tyzm`RDhGc1So|9cAJVoZ$b8hr}-F{VXOq~Fmeq)FW$Hw$VMS3KaT<(>@SN41A zT@5MC><8}-=gN0Xnz(XquAgJy+p|jQM{hvVE4Q-FQ?F#JzJSN;qsmF6<8$?%lb+4) z(~G)cUI*d~3CEqKvkY)4JZ&oP+_}-QF8cjQr-~2GkgSwj>0Ip@Wh{|-^_&|WH=^H< z)F(bTL&9|xoM-6OLgv(J>_6%`H#%-qy%F_(q+`VgXGriX>s-Bxs?}D=yn4=!_H*?6 zksd5QI76~YZnn%3s+WySEYoa*OAP(V26Iah8u^L-tgI8AQWnV+-K=ipp< zKT>PkT9ydOezF$!DUc|uLAab%J6&j<`8gYP<~>xcamuxO%BFFKL}{GQkog{G>fF{6 zC%v!u;0%ean%bB8P|uVGiMS$}@PSsA&e$tqo0FH7SLiPAV%zL4V)(&)IsvA_a( zui6fMKcFt^p4?Z~z*q~(D!G;W!KzzowR2=%J?TYn~o2l1AYF8IoZkcW3EOqO)rElfkg6GuLFx z$fFu`mh=4O+j7T;hpMGLJXIFvxG3k5W`*a<*Vehwex^6}NpCVAnHXO!1D*So>t1 zE~4aX^xc1vEY9|GPMz5(*NyM*(sOV+*CrOFYe3_Jqg#f3y1MiWWr}moYHX-hf1cd& zIL{dx+c_FI+R<9<@p3Zu<@uBx5Pd>!)O$L0UR+F$O%84=%5vvxp5Fb>$zs$wXZ4z; zTH~LkFMj3djeWA~u>Gs$ptQAG^Yl1V1__QuAyJxRQO3gRIk;FK)%dX}W8DGPxvP8n z7mj87vyw9;O5@Biwa0ls>+E>1D2_9dGpxSe{i3CurRPdL&U;ty=jRQWyr(~{ce;&$kFBjUk8R}mnci5K-Y*)U%VxEgIVPf~E7HGt`s54i%+J~A@y70J z^!(bywvp}LV}9Ptvs7*sUncic$>m-dd~Y@5hP?7>_`21sEBZNo7M4q8O&mKza;e-- z;ZBz7I28A4f1|Hr8a&=ulE&wU1r5-j7dQT&b5`f>Ds3+IddBDI_ty=G53l=k+Wp{L zNsH=VVOu66ab8rsF&l4;Vlb6bB=#8B9j_WRv$I#D} zb2D|0{(Y;BGDzSI$;CqM=GRmD)CI=hPJ|`G$n+Les7D z#j@<~>#(~|7!=pA-s$E9S&;on#i?sRQ){Hg^fEjq&2DsjzC<2>cQ{wRxwAY68``H7 z;yi!bnEX=PR`2dFRjXEOk$dz;&gyuxdJwMsALq`EJ_j$A<)Yt9%YTIMZ}5G>|L=62H_5W|lXDv@3kc_(*$?LA{9T?)<%{V$pCijI z+BJCju)Nbe%bVwx3sUs`K*-t`;A91CqzcjeSbl<$9+! zl#Vrc4&LdUX@kcbOQ$|#!Sn0JrHo8(mK)BH+$y)ySq_*}hJ^S|*SS1j*HT2Cuj>^b zoFSnPtn+4>=W&j%Gsi=W6OhWnBjlFn%&a#KPT$b+u)*F~EUyRUt&HPi+l%2*{?nW} zMwaKbRmJ6Xuak08>pb+u7MTGn=SKH~ zj2rW$y2a(gSLN&U+&@kh#yMy8|6i?ltK4xr2Y$%H@yR)-Jy$T|bY42u&mr&5JxF}$ z=Zc5PecR7fjXyeXn*Hqm2pO@O${})>-pG0A)VK8>eSEpxn{GevwX#K0FfnVM-j}Dz zVjS~BqTIW@UrlkXZq=~}`};;;TTMB)R;zUJbXgi_NR-BTyUY)9ZjGt)8RCO8Bue8v zD)VEUW9odS_}~nQ(m0RF{0QgPpnm4PMmR&FG|oF@evETWozD^gV&s2WLo>#`zI4KgKzx&TGU6XGoOB z`C6GD;T$zSuN5DhAyFFV>tue6b4;Dri4V?@D2?+YWqycrP(QC1ADkgk8s|sJ{21q$ zI`@hX&X6dL^P^>cfOFXK^8>{PXGoOB`7ts-#yO_Wyl)3*NR-C;u`)lzIjEnx{*E&w zO5^-EnIGdEQ)k|5f-@vagS8Z2WLo>#`$S7KgKzx&KHXh&X6dL^V4O1gmcvRe2Mtr42jY> zKSSonILFkv5FeZ&Q5xrG%KQ-Lpnkqod~k;3QYOavSu!ieIi}8o;)63JO5^-&nIGUB zcKp0ad~k+DX`G)U^JAQ2>O3SqI76Z|&d-(kAgEJ&bzaekT1k8zHv^SJon42jY>zg*@AIENiSPlylBkSLAwD`b9*b4;Bl z#Rq3dl*aj$GC#yQsGoO=56+M%jq|HyevETWov#odoFP#f=U2=82 zzeeWAILFlaO7X!N5~XpzS>}g02lX@WC&3vKrEz|(%#U%7sq@3c2WLo>#`$$J-{~x^ z9QXc>hl>x+kSLAw>t%k7b4;DD5g(i(Q5xqr$ovrJpniUY_}~nQ(m20S=Epe4)cIQR z!5I>zalS?7M>t1~&)10$&X8Qk#5mt7vtpcM>ikIY!5I>zaekA`4{;9a=SPVT&X6dL z^P6RUjB`w#A1yvOL!va!Z;|-{&SA&Tj}af7AyFFV+hl%>b4;BdD?T_wqBPELmH8pg zLH+zV@xd7qrEz|n%#U%7sq^E-2WLo>#`*0sKf*a`e13xX;0%ezaekl7k8zHv^E1Q;XGoOB`Ta6K!Z~Vu zex~@~42jY>-!AiGoMYF5~XqexXh1nj;ZsD#0O_cl*aiJGC#yQsGoVC z1I~~rjq@jEevETWonI_II76Z|&YzO`Ugya7Ki?=mI76Z|&Yza~G0rh{eu? ze@5nqI0yCfP2z(yBsVcJ&YzW8G0rh{eyRB242jY>e@^B{I7f}oFB2b}AyFFV&&&K6 z=a@RbTzqhbL}{GAAoD|h>@$;+1 z2WLo>#`()KKgKzx&aW09oFP#f=dZ~85a*zNevSCx42jY>e^utkILFlaX7Rxp5~Xqe zn#_-IjvAj|D?T_wqBPE5m-#WyF?D{O_}~nQ(l~!Z=7%^3^)v4oz!?&yasH;vk8zHv z^BcqmXGoOB`CBsI?HqXi`4;iP84{&&{S|-BueA_9ho2E9MsQm5+9r) zQ5xs(%KRATm^!~%d~k+DX`H_&^CO(2#^<+)56+M%jq~?qevETWoo^E#oFP#f=l_xU zA3a zh!4(?D2?-vWqycrP(Qy@d~k+DX`Fu|^JAQ2>ijP8!5I>zasH{yk8q9}pWiJ$I76Z| z&Oej+G0rh{evkOz42jY>|6JyWI0yAJ*WYo5L}{FVA@gILW9s}q@xd7qrE&hH%=bAn zG{?RF`F8Qa8Is$X80TNftQhB*I)6ZXaE3%_oPRCzL!5*9`GewvGbBpm{2Q4c;~Z1x z4~Y-XkSLAwZ)JXjbJY0!Ve!Ek5~Xqeoy?DMj;ZrU#0O_cl*ak@GC#yQsGmP7J~%_7 zG|qpJ`7zEhb^e(6;0%eAW1M5^{0Z^F84{&&{u{1E4$e&$*>&X6dL^FL&MjB`w#KPNsoL!va!|CIS|=fLyNUl1RhAyFFV zf64q9=a@QwQG9TQL}{G=E%QU1gZlYP;)63JO5^+=nIGdEQ|B*>56+M%jq@EcKf*a` zeEy2~;0%e47izm*I zD2+3Jqdven?D+W`;)ydPO5@DmeUEXDsq;6*6K6=2#(7SZb5K8jOFVIgL}{GohB?R7 z`P<@&GbBpmJTJ&OYJC2Vc;XC+(m2l#bB?L=cf}KDNR-BTL6mb)KXY9eXGoOBd9N_% zm^y!7JaLBP`%H}U!T{&U_dj!u6=z74#(7bgb4;DN#)>l}O5?mZ$~mZ?xyFh!BueAF zB+NOc&Rk=~84{&&UK->aH9r4DJaL9ZX`J^CbB?L=PsI~wNR-BTpD5>`e*T$w;tYw> zIPV+g98+hmvEmGg(m3xI;~aMU%r#b=AyFFV{llDN>dZA(oFP#f=L4dggZi0ktT;oW zG|u-3bB?Jq*I03eL}{Gw8RQ%_K68x~XGoOB`M@yem^yQf6=z74#`&Nq=b(Q6op|C5 ziPAXVE6h2j&c7E=oFP#f=Yu1h1J6Hmy%J|gl*akqVa_pi=6WU0kSLAwAyLjj{mk`B zoFP#f=R?DsW9rQHN}M548t21;oTJ8Pu29}(po)X!Y6 z#2FH$aXvE4Ii}8Buf!P=rExwg#yRZxnd_A}L!va!M~6Ab)S2s*I76Z|&c{SK2lX@8 zD{+QIX`GJ@bB?Jq*DG;`L}{Fl3v!McpSfO%GbBpme0-R5Or5!2i8Itd<9tGtb5K8X zy%J|gl*ai!Va_pi=6WU0kSLAwiGF8k<+%4hbL|gjNR-C;q%h~0I&^8t0S4oMY42jY>w}d&z)R}94I76Z|&aF|- zLH*3NKb#>^8t1k!=a@Qk?GI;2l*YL|#yRZxnQMPIL!va!%fg&v>ddu2oFP#f=jBn( zLH*3NKb#>^8s`;Z&M|f7+8@r4D2?-}LC#U*GuQrbhD2$cPYZL7sWaF9aE3%_oKKH( z4(eyF{oxFW(m0-#^GXYJBE88qSa?jq^ES&M|f7IvUQ9D2;PR zlygu&a~%z5NR-BTWtekJow<&NGbBpm+!^B>cKpnBG@Kz(8t1Ms=a@Qk9Svtll*YL` z$~mZ?xsHZ2BueAFD$F^i&Rj>s84{&&J~zlYYJ5H-IYXi}&a1uZ?mJ z>gVH=GbBpmye`Z+rp_lMXGoOBd3}&`)cAa#hJO5=QSlygu&pPrl{Q5xq< z!klC3d`5DHL}{FhAm^y@`OM@DiPAV<8s;2R=ldmRNR-BTFv>ZopU+CpkSLAwrZDH2 zI-i}KAyFFVp%~||=|e&S06HcfcPwsH9?{@&f5ZO-b$k~1Vq z<2)MR++MCeWV$vvL!va!V*$>~%GHNV*Cl62l*V~Sfb;Tl^&!*s$r%!*aeiok^NMoy zA=BRE42jY>j|VuPTCP51`oQE2iPAVvIGyLp_}p2zao!c;95>o={DU(jO5=QGh;!U%$MFx& zkSLAwRUyuCqaDXTI76Z|&JPQ5KCRq9z?9=3oFP#f=c}F0b7Xv8*HW%OVmgqVAyFFV zhetTa?NVwRk~1Vq<9tnobKEYa#$8t2El56K6=2#`)PH&T$9*_YqH=AyFFV=eV8w zhbIHa=X;4K&X6dL^K(O->pl*ajaAIKMQ;Ic$LDiGg$V1W_92m&G`T4bVI> zaIT&pO5^!@2s8QyS-2I-O@vj_(Xq zuJOdcxq5;qjq|IV&e7KB{4J?ACgSj;yYJ@=*8Q>tfqwbtqL z)a0DgI=?2X^K_gS7c2XFi_Z1yR`r})te(DWwIt^h_mbOxJI8o)9cOiKu+9f`^{p&+ zZ5=Ci4PHLHb4M{aG&wRhS{XFYW#U6WL!vbO{MumW$&u~D<1OX(rZeUDGI7@5&#Y*i zU*~k*-_-evv5_IqII=uBL!va!uXj2x>gp>-CdLcuJ5g@NHEl`GkSLAw8=TII#d)fo z%k6lkZOIuDrEz|v(|PHgoZG6ygmQz^n4XlJAyFFVTb#~wyNZ@8FB>d35HNkatb^wu zBue9atJ8ULSJAn7c-!DrMeFkI0S)~+@x&PtrEz}K|1#(Ai6_pGD2?-*>pIKK2KOn8 zrs^C~=Gx8Ti8CZhUI!~+4I|JIe_6qUD84{&&ersK4 zd2sV}4sm{sY#L`sl*ajOb)E0NI)7C>afU=`oZnv8dFI_#=WmH8&X6dL^E>J~OJg+H z8%uVN8*MEu0p0O(@x&PtrEz{|U1xdl-Q@gg*)-0OD2?;G>N?BJyUF=0;)ydPO5^)^(N#-%ZZnmrdgg z$@iHU=l9ihmYEGYPaSWB9M;udD~dQnqBPF$uj?!izMGuCE1Sj{5~Xpzy{>cPb>3UX z=iUvM4Q?OVc2zNX)eg_=R~#QDH=H3+8s`txb(RM=Sm$Wxwc@itHV@@r-QO+!U|naK z*|>Ah`eNB>%Zsk=qGw%?_Z@cs7EkI7iPF^hLv@__`5JXz+Eq+BuV1x_MLlWc?>v6k z=`8z{%z2$hSC^e3KGYc!rK$5roX*nE$+<72H~1TgI76Z|&L4F;PxXd42lU3@#1m&o zl*ajEPUorKz}ep$3>G-+pi$8{e>}u_O?Ovo#HdmJol>0tfv-eqoIl}omSZI8XLSzf zjPh><w(C zQ)ft&rp{k>I{j})cMO!XBnT@cCI;ZebLpk zv2{hc9nbU;vM|n&D2?-1>Nq!Zy<5iT-Ola{ZQ^*f+;E0OX`H|6bk6JC9w2?Kc;XC+ z(l~$3>73U&;tgvL7f+laQ5xs3JDu}7uLzL7PCRjjyw0bwerK+c<#C2Y zX`H|5bY56J2PcLn%dPmPx5?r-L!va!-*P%jZ;b629xWyYuNW>aE4SmBo-PaH42jY> zf7|aoan(ezc5q~L)wuU$ojBeoH=H3+8t3mgon=2bdFAG1#kR3sox8j>VMiyTrH#j@d?o)nH$GOR4q|&)x-h?UJ z@aD0y0?wI3N)4^^51r0Z=PQQCC*-}0#a34D&1zWz;|3&3(;GjEb6!(!#W(Gd#c_s2 zX`Fu?=X^!E72otwSsZ6bl*aidPUnNp?QCgp8!Xner03$q@aX1_@$tc{%563~eW5JC z`*NXN!B*OS{%IX&nbq)Tv+Qe~cMi$Y)6Y|7(S>q@3|-JV|7;J=Ga4N0qMe^BiqsiW zXK0;&Ue|d>tx@L#{?9sZ9lnwcO)t-r#c+l=L+kvDy3R5-PP@*&cYnP|6mf<)L+kuY zr}JWY@}>7)M!dDBc8e%7Za|_mtWg-3iGx5Y35~XqeU0r8+ zaD#Q;TY96Xr?cqqSz8Qk8*~5a)dKOs8IrxAasIv2d1>Yx@K%W0+~f?&ygJT*a60cL z&i$Qh!p@oRlbj(@nmYf{>AawF4mxMPcXEbAX`KHQ;oQ|xbVR&J5yz#;84{&&{8!nhb5L(APR@`hjq_if&U^yJdOC zI!KhpncsD+ZoJ+l&Ajeb=ZS4{hB4;%9^WI|#~Bi(asGQ&XP;t?tDPjfHNdYQdL*j`uBue9ahu2xohZe1^%jGvc%8fXuJS%Xno*hc# z%!^yk_`E=!PmfY==y(5TIGyL?yzI1~D$Cy~O?8GuY3e*P!uj+SVa`00>5b|ctu)TF zoX+#8v%IjPCK2IUF3#08U8QlJ?Q~v}eO^IJzy}r_BEFnQf<$SY=Qy1Y8XD>!9-SB) zFFMaHHny}C+gnbP6HA+RZYj6f>~usHpw5sejq_Zm^FF(s&+jjGOf28!J6%`XE}l3; zqBPF)oX+xo(V;>4ScSoDJ)@gFCqzrdhTao6-|4(>{`)DdD>jWx`U=f;D(bA)t16m0 zFNkz*Z*x08E;&P@G|qcDo%hM>e41NXuVqqau4xjbabDeM*t{k}F42jY>@9lIhdn4{WuDsg8xq8*3G|u}toul9PbwP55L}{G&t>ZkG2RC}2 zzpEG+=)EN?`ao+ELne$u46K6=2#(Dp`&N4zzr_OEu-#vc0 zc;XC+(l{Sb*I6EXH#xseHjOhRO5=Qwy3UQ)S$=jd*NZ34kSLAwQ6bJN*LU>EiMyfV+?I|O*Tv0k;)ydPO5=RA z)A?Yn^KR!gBU`pk7X3Shhc~yZEVtU+^da(aoFP#f=VP4CduPsDw~h{be@o@T;)ydP zO5=R2)A__ZITxLs#oDf7#o*{w<0GS26%!-dcWfIjwlA-SuTo|Y(?OY!GbBpm ze4Nwy=sh^EC7c`2?r)L0O%54DJ{nU(wp$E*Dh>^&(mG-du*kxw;&qG|u;lb}qJSN3^yy z@5>Tf<%TmPO5=Q@)A_)x&i$)9TUV^|fR3(}8`kI<80`*oFTcCiE%!~ z>3l%uJTX~JY#Scl;W^^CSQK%FL}{E`oX+`kaJTcaVp@HH<3)1A84{&&Zgo26iSr@wdqZtEsNm{iPAVPcRH8H&ucq3 z6zK@5+|;zEkCY{GhD2$cSA;pso_ocLX^$7BVflF*IA5D)D2?-}PUo^WsB`~7XSHDm zuajkQhU7XX#`!d-^HO~d;w*daVq}a>c=8lk7-vY7#`$!wbC;adkYA~h&%tSpcvJto z#dERT-X*tF!xH|jah;K2<#%V%{~&LN+=#}fkQ>WQH=&S%xB zb2H9aZ-jj6-gt6`L}{GQ_BzY&E_HPEx3;yn7URQ%)uDR1!D&q2D9g-|8zi5T8#P=| zJAyAY&&!^JM^-b1js6brKE}Cob+(de+banvlV+E#NKNwf&@^d&vzFr5T^A z-I})@OpNmyr*k^q=-~_ZIAhEaE?9c4M=WbVtV5@a$HgESE_xAd}>d_bxyCX zI{RsjfDeY?+8WM~D2?;_I&~J~hMjl!hPJc+Z)EU1#<_YvD~pW1`S!T|X z2j4~RCl9+joHx{U7U2e*Igcct6F9hesQf6ZyZ8|s`u0kB6wg6Ol%}8SIX5$I$i92G zbHw3jr+DHFiPAWqU#HH^IH%s|TEAhSHR1zWE)`FlA-R-^alXLmoc1ZDbHG03Vo}5y z5~Xpz(CM7^DW!A3FSl{>3};A`#`!@`=R5UAz&>SAJaL9ZX`CM%=PXB~1LcMs)5~R9 zoFP#f=Zl=qSwDxIe;yT2oFP#f=Zl@rSwDxIe}1TV;tYw>IA7v)&iXmzuf8<$KE@)> zxjmwvuaMeOXGoN$&X+o!vwjYFr7|g=I76Z|&Vx?pte@K>t`A-%o;X9IG|rox&RIW; z^SW|Fjw$bv#kqQ~tkO6S#W^pF=;ucyXGoOBd9%|w>*r+=uVEi9p41rAC;|1c0GbBpmyw&NP zdZTm>I2OHLJaL9ZX`Dx#&Z#$&v%fcP5Ko*TQ5xrmIGwZJ2>DBo&lgXeAyFFV%bm_y zZ-l&0=0)O(GbBpmyv^x6Z(Y&ZCvVj*x8R>XV^(=h6OtDTX9#ENnHrr{J5+wC>bxk| zYpcvm%T!<2Bj-2f@7z)B7#kU_j%n&Wu9H;40d_`@d0*&Lz5#{ z4CgDK#{HvZ8EOW}iE=BSgN)i`s&NkL`;e+{G&t7nv!=Be+_9tRU4MReU%)f*K-oUd zkZ@h1bY?Uuvn#9fbetDYP85@a6PL@*a96}fK;J{O*dOP_JI|GMoSW(AMf!P+WtCUw zE1u?ko^Ko@RnI$RwS!LU%zNY5G*3IH!QPnHB@KOk*Faj-4W7t2S5IiAaei1<=gL|8 z=WcQyOU{rejq}xYoyEFA=S8W`0Z%`5Y~&o{!|OWB;&+qtsBD_vfJABPd`(^F#_KGv z2jz1wi;j)*@$nJwlsQH`afU=`oF7rwSsvVAo#ivirktzd=+>q;VPArCwNFtR=WCtL zsm@(dbv`mVL!va!*EyY2olEC{Iv*jP)EN?`aek!J`GBrFA8r&Q6XWZufvVhWQ`5Eb zXpZY3Q5xq*)p2fSpCZ@0Wsf4i1H0V+*>yNxEjQ{6iPAVfI>@5WFN4?e}|ET5Nq{&@qP zvLo#0ztWxi%NnRNBuZ1~r$#w1k8wU*JaL9ZX`G)H<-8)s`7H6o84{&&e!A0Hey67F zjTmKp4I6uqj%vi^`vAm^a zZG?80c;XC+(l|fc>CAqxblx7JT<#;XIDvCHmqBPFWtK&R_2RC?rWB>odxu%5peE zqBPFWcRDXj&NOwo72ot+SsZ6bl*ai5dvI>_`rv+dI?wO_t?5DW=xab1C(oR=H*Tooyqq6!7L)%T{hX6KUAHR! z`vMJo_ab==|IfYYv3$KW-LG(Ca=uAeT~C?KHyd=`|LVcfvC%t=UsJ7o8pM^}s960B z`Kq{X^^)XWIZF>U{CNd;hjZn7b5>`$+pzPTplg{`9WRhO{6FVhSbZ~*I=|G^S+65D z*c)@zIpVjLN}&q{IOk-%&hs+y^*GP$>&aK=zRv+I&N=DtJTG@T&*{6e7nMqhHyX?x>UPUkrTvAr>n zoO9aVc(v1c_O7vUz4mYZ|EBxp#^jun&ppZW8mIG;qUc;MAI{m)*|)w}?caCrFLLw( zBuaCPl)ryt-|}Hi{mt?DT}5w;e0&!Fmk~KdR)RAmO5^-msdMFBIdhEC=<$ZU?#4Ob z9p-GbRy$5^I76Z|&aZPir#c7x_Ce`*m;h%;l*ak>PUlqTs6XY`(BBSzgVR~-9P%5- zWnE7eP-jS#rp|A4I%}On-W6Xuay*Q4bzH18&bK(7Q=P;5`OxGHiPAXV>U2(Z4(sO? z;z^w$Q5xqrIi0o6A-{24I^I`+GbBpm{AQ=K);Z+2cS}dk8R1-=J5n0ww>X_sox}S1 zkmL-B(m3DdbWU{+>u1hWP-i_~QPDWR)#%2Vf_27NP6K6=2#`%3tXRY({xYvV6iYLyHD2?;`ozAJwVf}nB@x&PtrE$L9 z>742u*3WI?i8CZhaotvFY|=c+W$A9gyYI*0XhBkzUyh|^i?d}>@jAD`+BiPF^hqfTe7^Qm$De7Jbh z8;~5%#5jM<>742u*3bN|BhJ2#*f;v9DVnJY>-L!va!pK>~cLpJaL9ZX`Danbk;fto_}5~o;X9IG|r!MI;T2^_47I6i8CbUFfq=bcRHs! zhxIe>+rSwTrE&g((^=~rc>a04c;XC+(l~$7>8y1QJpX*Ic;XC+(l~#~>742u*3b7B zPn;o98s{%Nol~8|`kD7_;0%ejzhxIe>1;iN=rE&g_(^=~rc>Z~f zc;XC+(l~$D>8y1QJpbG!o;X9IG|u01I;T2^_4ED26K6=2#`*hB=Tzsge&#)II76Z| z&i~_d);b5Ce?Cth3@Iq>}Rh(m4Ow>8y1QJpVi|J~`Vbq+lLJSv_zL!va!|8P2ModeH5UnZV7L!va!|8zR1 zI*0Z1CE|%QBueA_FQ;>=b67uLA)YuxqBPF`b~>pl*aiEr*o=vSU+DZo;X9IG|v2fvG@0m+m;t${k&5=afU=`ocZh~kF(Y}@ci>O z@x&PtrE%sng*?vM&w=NkH;X6EkSLAwET?m-b67uLB%U}!qBPF@t)hTBhxPNMc;XC+ z(m2m?I%}N+&p%%-o;X9IG|qFK&f3p`=bwkf6K6=2#(AF8In_C=pC2rqI76Z|&hwql zsm@{jJRzPqL!va!3!Ki>xjpdw^K--#XGoOBc`v6kbr$Ea^UqHaPn;o98s~*h=Tzsg zetwL2;tYw>I4^QKr#grA^NYn3XGoOBd9l-3>l}Fg`Pt%$GbBpmyu|6Obq+lL{ABUO z84{&&Ug~sCbq?$2M~f%UkSLAw-cILK=dgahUOaJzL}{G&aXM?A1J6G{OFVIgL}{G& zbvkRE1J6G{Nj!0eL}{G&b2_IwhxPNL#1m&ol*V~~r*o=vSU742u*3XX=Pn;o98s`I@&Z*8}{rp1l z#2FH$aX!fDtaT1N|NIQ`#2FH$alV(+S?e5l{`m>wi8CZh<9x8wIn_C=pRW^7oFTc6 ziE+NS(>c{Ste;;Xia0}}G|q=Oowd$^=bxW0o;X9IG|q=Qowd$^=bs-ho;X9IG|q=P zol~8|`uSS%#2FH$aX#GXoa!9b&(9Z6oFP#f=OdiXTIay?&rcIioFP#f=OdlYTIay? z&yN#NoFP#f=cAm?sm@{j{0Q;H84{&&KHBM=>KxY3&l69aAyFFVW1P-f=fLyNPZdv` zAyFFVW1Y@g=fLyNj}=dxAyFFV_;)ydPO5@z-bk;fto_~J5c;XC+ z(m1y}ol~8|`uP>&i8CZhe{Iq>}R zo5d4nNR-C;45zc!Iq>}RYsC|1NR-C;Os8|Ib67vWOgwRhL}{Gw=X6eW4(sQ4i6_pG zD2?-3PG_xi;Q8k_i6_pGD2?;kPG_xi;Q8m9#S>>pl*ak~PUlqTuzr52c;XC+(m0>v zbWU{+>*sfhC(e*4jdO?7S?e5l{`pq%#2FH$abD?k);b5Ce}0X4;tYw>ICnaoQ=P;5 z`6lti8Iqfr80RjhbEuX8$UodeH5e^xwkhD2$c*E^k4ox}S1qvDA(BueAl>vT?a4(sRd ziYLyHD2?+2oz7b4!1K>v5l@^UQ5xqyr?b{M@ci><#1m&ol*YN=>742u*3TaiPn;o9 z8s`D0bEKxY3-xg1tAyFFV3!Tnd=fLyNUlLE8AyFFV2RWU!&VlEj zKP8?xL!va!4|Y1II*0Z1hr|I1f3UQ=P;5`2*sKGbBpmyxHlT>KxY3 z-w;onAyFFVVW+d!Iq>}R=fx9eNR-C;GN-fFIq>}R$Hfz8NR-BTi_C(e*4 zjq~MB=Tzsge*T$w;tYw>IB#=0r#grAb8SZH3^mX=Z+ALtodeH5|5X&JGbBpmJnD4T zItQMA{;hc842jY>k2#%Fox}S1r{ak-BueAF!|9yr9M;cwh$qgFD2?+&oz7b4!1K?4 z5l@^UQ5xrQr?b{M@ci>{#1m&ol*W0&>742u*3Ul?Pn;o98s|x;bEsm@{j{A2ON84{&&zS8NO z>KxY3{}xZ2AyFFVtDMeS=fLyNe-cleAyFFVhdG_K&VlEjevT?a4(sP1iYLyHD2?-VPUlqTuzvohc;XC+(l|fT>8y1QJpcR$@x&PtrEz|g z(^=~rc>ehp;)ydPO5^-!r*o=vSU>+jJaL9ZX`CP9bWU{+>*s%nC(e*4jq_uj&RXZd z^UuE*Pn;o98t2D3owd$^=bwKro;X9IG|rEAI;T2^_4EITC(e*4jq?+n&Z*8}{rq?F z#2FH$aekuHnL3{uc>ehyIj4v-BueA_B&RcV7U!_@&-)~2NR-C;$xi1~=dgZWkene= z8t11tol~8|`uT|D42jY>Kh^21bq+lLd|+~hL}{F#=5*FN2cCc4J2^w5G|o?VI;T2^ z_4EAX42jY>Kf~#q>KxY3hbL!9l*aj)PG_xi;Q8l!CTB>L#`#%JXRUMK`RAp{84{&& zezwy&)j6!6=Ot%Il*aivPUlqTuzo%)IYXi}&d+r^Yn=nnKi?xcL!va!&vQC!odeH5 zFG8y1QJpa5nIYXi}&euDgQ=P;5c}{YML}{E~>~v0b4(sPbk~1Vq<9vhDS?e5l{(1l8 z42jY>-{^GKItQMAUX+|6Q5xr$IGt0S!}@u4a)v}{oNsbEr#grA^SzTZBueA_Qm3=l zIq>}Re#sdUrEz|l(^=~rc>Z}|a)v}{oL}yAPIV6J=UK@a5~Xo|h0{6JIjo-#PR@`h zjq@v=&RXZd^UwPxXGoOB`BhG5t#jb{=e?3MBueA_YNvCmb67vmOwN!fjq_`q&Z*8} z{d}+F42jY>-|TfB+&Q$hv#)dYNVyH~l;4Tq{BuR#6O;6Jue$o1rEqDQI|s^R?<)V6 zWfmmoHDh=6=*GU!`$=%F$oWL;{5qLec~8fA;n0?ytB0>_>)bjx-k8;Yf7C`1+)o}- zajSf7onP;Co+W+p-z}Q^?z!T#L>9@pzgfi_oX&HG#)n#0n3X!dyj+S(Z$k38ROeZ> zgUcB*ePbPGzBxU?*4vz{n|vt?08o{{Q2qc*RcA=6vyI?Gtzpz~s!$Hxb+DkjFpCwH%Q+IP54 zMV+hbR>vjh*|mG@Ugw*f&P&93)6UC^p|KrT6+4G^uXnn4ZkGjdhUDXNqvUy=-@FIs zM*Df8IBy=_CUxE((jd2pAI^}xPi{ERtS#b8&0F^1JVWN+Rp{qMyPZeJcHGqh4SfG5 zc?`~wyjpIy&bK+8r|P^jq|VP1N1P$KQEsI(d&e?wbviE@8k`*3TI?7fn;aV&+g7c1 z+U%Ak50D#Vq<{~QTb^p1gVo{FVtGKL<3{wpn|&T5an6%+VY&bItj?A5avsxQKhG~Z z*YvC`Ru^Wy)BSRxEJznXqO8QqS+#f6ah}Wf8g!1{4-Uzu86hCO0nd?Jo_C5{)gRT5 zLvJ)X*3H>EIX3EV2;OP4C&BNY<=*{AYGsGDlA-6p5*@JVV{k&jJd$Dt**fg>wU+eVmUm%Op z&k$#LsNC|rcMr~u_J%r7#5tcYayUbr;URL%^FF6@^sy)}h3O55Gdx^wdEUPV=SKG_ z(Z`~U^VAvQ4DTbiJhwZYqmM-|6giwB&QSMp!YUuwgL9+f^VD%&Ysf*;DiLEp2#K=V zag?)aAFSidaa5z@#?*0L%<(hFL(~~kXLy+0@_eX{GyB0t$Bn5v#~eSOC)>su;tcIr z_hF~=RGmXwqt+viI76JFt@B5m&WszwqeJ6Y?U*b^*l9WQ5Lq5)h%;Oxw>%%+gY#^e ze^;qqTWytdUxO1vBaEfqY?2k=3~`3-a?A6vJvcWyZqOT%=j+(#?IkyeGqlGWAK!y> zqtC(l;yf}s*)}Naj>tK(62<_CGdx>vc|NfR=SJ&XId|nNb=+Sm%hDSVXLy?2@_aJD zdB?a^I$x>dexEFhGsGDlEw?}!|(htQRF!Y88_fDa?A6T zI?m0!PFa|o`#ab0lER&j${HB!AkOeax#jul9-JE=pXC?CQbTvH&euG>`?t$tI76J_ z;d0CKwLLgDdMvtB>RdTTH1zvK4rhonJVI`HzP<PD zpA6q=^jyK-eOJ)luKafakpx#2u7JJa~ntj;`UcN%n_SFGiw>+0RhIq&c~iu2EqC`~_C`#@O!AIR?+ z^590DCnqL~!Oasa5|MpmB{=8gex842b*{!|{%`Is=WoiUam;xjK3Tq#IUkkgH}l?} z1q1#4#i}*y&o8o-I_`c$mgWEZQ)wN1P2KbSGCBWRSUJz;0rK@-MfcrT4~~wF?iQ~O z$L?y;J$@fo#^;LF&yX)bAO9+OSI+Xz%o+cioh#qJhOiT`L z-_eBDe|_j@<-623=OVMj@0`x_lXII{?{vTXoGi%xA?Fgavfn$M=j?1iF`j zvMhDZX~()hxSiz!(1=6QEc)f-oYOl0F~WJf*|6iwuO#Q3*7;9P=S8~)FCX5yqnI4o z?tVWYKkDb@MnC7=mv3bGv(tI6&11VpiydQ8SC2Wiz&WQmtkdIXp7V^;)%ThipXaad z?d~f&I?v1M;JM4O4#y6b`8shuO?L3GI)0Mzu;KmS?BIRMJw=XvN=~~^p|)>M=Qygd zyO}yKsm{q1{R3;;{iF1w#D`-fNR(9rl(TAWsm9cqpN}+i%s*#*^WfxQxm?8b*|HM$ zAvvjeo*&3_5MORbrf)QJ%)hixPLvm$u9_T{S1Ut3o%y<_bN>KYNR;&V5Lo_rxp6!_ zGdnT!&pOULw$WqJnH_FT-CQ-)7r*-Cs@;Ps~pl97c&nlPc)WV+;XU6B8_n!K;-kafcp53wGf}mDb zANC>iMowGjnNH_9IJfHNLMG2i&N;2~ET{8~l_9FTSHf`vbXFHu2tlZFF^!Ijm zckSM+>(29&b583#$LTz`v$LbOWwpyQUwBIzH*#9%xgpL`BVDaFn4EK3=Xnv%t#Nhc z^9e+$meV@V4{?sG^QPpS(>gDRaBhpM^GI^eX`S~9agM9=P;$;`ofk$puWiYn`mXzz zBWqF&N;2~;t*&5YuD;O=hEby(>gD4I?wLxTou|ef-V=@7k!kxmMed`Z=fV=Y5^dGdrVR zp_JZy#t{9S)7E)Ew{zS+5bKLmopahc@9%V;(|KNhcie8UcD*>y7k5aMob1SQKpp31 z&ezTC3=|fxi&C9)+B)B(j&n2Tk><*q0lRuOW>xUry(!fh5~Zp0J?l6(Q|Ec&Tm(u# zPdr6QKbxhZt@D9(oSUih?9R38yC_Id9-Mk3r*%Ha={&b{ZEt7b$%1XkIj42LSBP`m zo^X3|&S{+w4sc#ygq>p4&lX~=yD{~e(mV(6UB|hZ=itoF$TMH^*%eY}o=-XLe(;bw z&dodrXLeo~^z18F!?{_upVOY_Kh)_wtE)G3=gm1#QL5#%{d}0;Idn(Jrvc)e(>fpS zbl$70SUs|3YfsS|^J?Yi($72xAyJy=;1PA4d3dA0pCa$et(=RFHU5%+H#tM1G|orv z!MV|EZBuoQd4=_x_JhAo&X6dL^L_W=-01i`Rp*%f;E$3sBue9a@*bRsgMUxXkSL9FOPF)ae(*oZ84{&&ZVhve*$>W2<1-{m z;4{4{!7sNsdJ;=a6Im?{I@coFP#f=Z-Mv zn0?9}$r%!*ab6kb9COS+JB`nfD2;Pxm~+fA|AOQUiPAWCg*nF@^DjxxkSL9Fx6@gU zH~PE#Hg*>qI{F66&A6sr$r%!*ab8u&xyfVxiOJ19>!bGFKTFR+NR-C;+&a!YywR~v z_T80p$iDkK$r%!*abCR#=O*?k$vI}<{p;imiPAXt?7_MDI>+q0e~_FZQ5xq5?7_MD zI>+q0|B##^Q5xs-_Tb!Ton_yhdLw4v{nz9SiPAW)33HCwcmFFnL!va!Yr~vl_T4km z_za2CIIjzHj@ft5P0o-gjr002=a_x>!sHBz(m3}zofmc$8`pOZ^cDS`A-@;sr}Lcdjtf@x z#YtZ;tD-j`QJUV^SjV}U=iuz_H55Z9jzmBdy^J|lH zPV0Pu(|J~Rf17SBXmY!(htJf2eH!iH>+)QtXbIbu9Zj$%P4QEJ{#`!^h=a>V! zQnB_PAIA7{_ z4jnh%C7w7#qBPEfZs!X^pM!4{Po7UXZ9i|S)eo+PWGHy}}(-q>8nxtZtS%+TLDE-W!$K z;aih4BuZ1~ks#-&o#ES(GbBpm{E#5$sGZ@vlQSer<9vCLbIe&$ImS=UkSLAwHmCF4 zp0>`u3%be;1Wa#E&X6dL^Y#Gefk5Y1Cuc~M#(6Zrx#*ADqtt3I7EjK}K%z9xVFAX|V${{Qy4;3$x=wmRlxjKcaot1fI5%^=vD-OjH&|Pr zoO4>|ai{Y<>fE`u%Uj=S`QGH5(>hN$owd$^pL^MtoO4>|NvHFC>fF^a&`}l2$+gKj zr*+;L;XKgSbFS01TKs{@Ij42L!s$G-r@Pu*2wx>@5v5vA>%7b9JgcX>B}6u@@iRr**!{?;N)i6yICqMsMV_z40)o^KAJL*U0AhxI72xjhuVS z*LkiEaE@$_k0s}v*7@O1=ebhnwy;mjmA^eA&Kx5_qBPRi)NyX+TmjDQfzDq@&X6dL z^CJSBmjyb1J~>08G|tyLo##uP3;B$s_2nkq)1Sy1M5&h3jvLq2ac<^VbRN##7le&> zKNny684{(b^CRmxH`C9_IqLLA?PubNGbBpm{HPe`sM8y@pNc2WkSLAwqn*w(dwR>2 z2TgC4^@x)GZMllJpC41lxtV^R)zcf+%lz1%P0l&3^JAUPv&DHe8w<+UWj)k4r#)x> zIH&U*aV}!srlvnNe{YFv6ObrPKR>>Xb2H;cwDUK_6K6=2#`y_#onI?m1X2F~qm=Y=`H zJUK(6G|o?UI?w6}J>;+bQ9Sv7&S_s;J*AFwGrb|sk%#=X-zVps*7>PU=f(2(VdXHX zMUL&(_jk(%ow;9nUoIp{(;H8#L#`)<^=Tzs` zs5+mKoFP#f=Vv&bQ=MCjpgNzPoFP#f=Vv;dQ=QwS&fOh-<#s&Nlan(fO5^;jIOmY( z;AzPj5~Xo|w$nNFMq5;GoSK{=Q5xsxIGs~(v`6*EeUmdJO5^<8IOmYwSdp9|Q5xsx zIh|8)v`6*E^5hJO(l|fg>AY9DPgz!U43ryjPLE5@kSLAw3!KiWpO;1T^GV4W5~Xo| zVVrYFKOd8vAyFFV7df3%KQD{w=cAJ|Bue9az0;ZA80cBs-Pc+Sk8Uov{id8pCdU0oO6MnMNR-C;2B-7BcXoCkDQ!&7kSLAwjZWvKQ_k`?vBxLNElq#g zmz*I{8t0cdo#(IR;29#9|)nwwc4@CIj41ggWoyuN}IgSPR=>4^BbMcvwK?t z|1xE*HYU!ZbSGNpTLPRT2k0HiIj42L)#*Gl=yS|PRdc*dsdG;2{3fUKtlrkpefJ6C z%f36Ob$+woIkGis_estwKHvIdtEBQgY5|o!{zr4&8U(H#z6D z&TsQOhwi&iPR=>4^V|K-q5JMrl5NKjrN z>k*||PV4+Gr}OOI*3jdPhbHHo*7@B5&XGHn@#LJ-I={#1JTvy~bv1r|dLyTGey`Jc zR&QJA@di6po`X59^ZWeHk*!f->JdGbITNJ5`)>TIbvS&Y{N}>{M~iX`Mgd zcMd(?V5f?6PV4+ZzjNsE20K-pb6V#Q`JF?LH%?2=Ij!@D{m!As8>c7doYwgxPUqRZ zZK3<_32_#sT2AZy(E#Vj0eUhy=d{irb2`rq`ny)5syRcZ)H$bh{7sj%-hwi)YpPX}A z=g;_^L-*b1B7%YNs`)~IzS z=bYC0D}LwDeK)86sB=#1{8hhm=)U{h1nH>-=@UbLhUiCpqV| z&foAmhwi%{keqW`=WqI*L-*b1CFh*h`CCrs*}cm`_uae1S(Iuyt@F17oFfP5E0c3h z>--(3^UU7Rr(lhb4WrIEt@C%C&a--#hwi)i6kEo+oYwh!e&@*6sPTJ~IOnv^-}gI* z?z`6~=bYC0fBep&`|jT4oYOl0!0#No?|xu%&S{;0=ywhsIQo)vPV4+5zjNrmyFWSS zw9Y^FJBRMO2a--a^^X%T`q5JNu#95STIj!?g1DqoV=!YfeoYwhgPUo4uq3vAT zkeqW`=bt;BXZ5ZK-FI&kXZC|Rt@AJZ&XKKAJ3l$+w9dcuJBRMOFG$Wgt@E$^&Y}D6 z3zKtB>-=lKbLhVNLCHC%b^eXtIdtFs;N+asI{()196H!tl$>)~=im9AL-*YmC+D2j z`S(ue*}W@5_uW^EvnbVaTIW9mI7bf94^PfHt@9t9&NF*MTcdVKa?WX;|KxO@)q85_ zzPk`-_T4$H^Pm0Bk*!g?G&$$A&VTVchwi%vlXFh%{8zto=)QYXa?WX;|K@iN-FFWq z=bYC0?|$ddefQ?%{Qos~9`JQsRsMgrBv-k|b~;X+UR7+zAqhm5WJ_4Kg!CLIv_Y1h zZDCn5Ds~bGy(ILy>;k)#UAD2ibXe*xH6--TpU%>krEFno8~Fczckb0YK8$u}=G+hF zd_41;d78QNeaC0cEmNLU&HO7nbJV)K=9#5x=3m>HqbBHso>{79{vRWA+Uy#!kNA&XtaA^9ON^`3G zyexycNNh9?pdw6*k1~G)N}pPMt73;KCK?*WKq zpG84rrqY}$<`qWfMFVIc?d(bq5MllqltE@H&8cEuX=GlUGDnM!uY!}zRGL%8yvoSj zMCNG3mCDz^NoFd|sbXGjWL`KhlolRo{$`W|q>5CXH`Zh@bDzBVxnW=^Rx^}Gt$ZF6 z{Y<4fReoNZ!CWkF3`PBojBkLG%v9PpI8)5)jLh(J#AvQmJ_JNEQ)x~W^Jzxr#(|-M z-n95A^Ut9aGE-?z74v!{a}${(div|&Br}!fR55QbG9xy4X*!y%MM;gAr0Tq}F@qT& z704TLe{bS#I5dwhRWqM%WNsX&wnPk#%01v^Y*1-VRcxG*!CWNQH4Mc4jf}T|lYW+} z{d{HyGxy0`r@+sxG5vfu4oyE(X-<`&&&psf;^##i_low5FS!1SF_|S`rP7=#=Ch5= zi^<&67p*b+SkFwQIaSQ(7@3`)BZl;Co|#H>s+iA>!W^%ebh~G!(wr*h`$b@GjTq05 z_smq9Q^mZ=$jo?djTp~Q@XS=2Q^kCqk(u$_8Zn;l@XS=2Q^kCK6y|vG{5a1{r8!m1 zn6xiCr;7PfBQxW77re~(ooGRukjLeMZEfM4SS)Q3nbE=rHG%_=u zw?vHRyF4?M=2S6X6@@uoJU_!TQ)x~W^VJcUw?>TT=Xz!;&8cE;F)}lrw?>TT=Xqu- z&8cE;H8L}vw?>TTXM1KU&8cE;i^3c)o}c5HsWhjGxjh2&wutfkLeEU4IaSPCjLeMZ zZ4u-7MV^^TbE=rP8krf-+akvE^F1?_=2S6ni^3c)o?qaZsWhjG`I-pK*F=oxmw09> z&8cGEZe(UWUlTE&|JXBAX-*aMwMJ&f^EDCU`Nf`@N^`21?;nLZUOfMiXQtAeD(35q z%#HAK%zLPgduA%lsbap~$jsR2+_@_~K!o|DJ+suaRk=50Fyo`#*CrhE?s(VfPk3f3 z&8hP912UM4T$^a3p9jwLOh5PTjN#$5 zj4977RWo-OnHvUfZiz=+sr(}f>##RRy$<_f9GZTn(wr(kcV{pc^z)Xq^f>cRqZl$% zX-*aMP9rnoc}vWA{t7tBOr<$h%)5-tO#{i${)iF%VsP@F6RA3$doq~uQSNwl%x&Bu zj=dDckXfo`?lm$u4DQ$-hc+!`1?m*~OzN5H01q-UFC2_^OMxSMzh{=J!nv~B$lNg4 z9rLk?%5u*vRr|Tm$h>f{SN+e~R#$mushW9@k-1@TsKrKk^4=S<3Z#nEGfv*5ve(WW zG1FBl8$7dA&D?KhzB%eic(0EQsrnooFfum{wGLGy=I3X^&#VWjG^Yys!5Pd&+8a$n zZ9DcwZ1Z0PKeJAes*o##8O-=7e?2(V7WE;qvpus^%{*jhj#?9*4`#*&mF84IS2LIk z#zxdyWs_&7(wr*heMaWSp|+^C$_1X8N^`21Z!$9D92|=F&@mX#@yt}3Q^mYL26Mz* zcR$Zer8!m1H%DNuM(kak>zS!Er;7O&J99N=3;I0IOr<$h%nva#;~cEUY}sx0%v73F z#r#k^a}sYRKs$wI_U@lg7w@0nJuky@Pnp4I6NF#IOP-XQtAeD&|o;bJV)~YR^oi zIaSOxBQwsysC9R%XQtAeD&~WB=BRb|E5XUSn@W2nXNvidk-2GTOVqmiM);R?w^UsZ z9?oFKM+NHcEm7<4ZJt@GW*)OMN3FZB_wh`nIaRUos0`*}b@!I2b@%-}GnM94F&{B9 zHx6xyT6aIdGgE0!74x`}8RuZsy89Z>Or<$h%tvD|N36TA^~_Y7Q^hb#zzI}?vAdQR|rq{%u+S;jFGu(4={n)$JI=B|!vBw!TtAkQpSGv8rkUNkf?RE-GT^tn=L1}l(GQub%1Juicq`{ZpuH&)}0BmEGEW`35cW8?Wo=7ws_ z(Yi|I$Ka*Uq-sCEz|I_X9O>UYvsBIeLNjwu3l0;_evXnD8&Y*_yvWWR)z821%u+S; zi;c_+qh0~3R95=DAyvo59~qe&s(n#o<7eK_QnjC7VrPyT8~^Q@rE2CsHZnI>_w;w+ zII--%P!P{SshasujLc2d{-}Mcr+}CJ6e`WBs=HsB!Cb8F9*i2#KLIC@DpK`1__7RU z?vuCfZm14MjprYEW~rL_=NasTdW%rTh;F!TRe>S^?$uvZzGo5&n-RA!;~vsCTpSI1zE*z;cCnWbvxKQ}Tj z+#m4-#Q*;Xzzn35RHco|Ul^Ge-P}La8SfQ1l~;p#37DxgrwaNt8O%j;-O8?HW_bEY zGEm>uE`!;9qnykue6H&pt&I=grV1~ydIk1j z$|C4|gW znp4I6x=75Ao{f^~T)rT4$Qw=-^XnrqPtQyqbB;02F30|4rqY}$<~JCb!#P-ubPh7N zk(o+!s+iwsWM1myd3Gc{hIRf~6hLMw&8cF3Q!M7O^cdFp=THEdsWhjG`OQY=m7%>6 zDM9}eILS<t1{2b{dd^?U! zKT~P%`gyY zX-*aMJB`e9em*pr9>h4m2K$qlN^`21-(_T;>!%!=Ob!mu95#k?)06g?egHVhOr<$h%*v*T%t;ha-wi}EQ)x~W^FPnS+>q1HvBwHH?##NI%DS5x@*ckf z?Y$YyMe6R@%zS2vex}l#DnGw3gLwf)6!PZhxxC>98STA7UX!4osq`~-GvS53KZBWm z&Ku9MnfbgG{Y<4fRet_J1~dJfmw9DhdpamHokVFReVm+_s5GaF`Gc9v`P-t+b>=87 zj*ozo%v73F#r&apnDgdm;pZqVj!%G-%v73F#eDZX%z4j2;pZqVj(fpLW-868V*c_5N6!s-EmF842-!l($UO%5!kLQ`OqcuFlG(0tv97mdk6IXM-Mu0a1JFsm+_Fo&znpbRP+r^gsd}!+ zk9y{hL)ZIH7gBRFH}Xo`Txk&&0JxOJ2z7OwD4OHWAM@OSc@6)blX*!}?HJl^e+Dlg zoq>gAn5ZPFG3NF1$QkI%5|QT(mvsR{3#I|jocuopI1C) zcw%zGgWn-bF1JipG6oIbL6%1Uep1E827c9?%*(6Qp&?|r+OY^1jseEsJs>lc=2XQ- z;FYn#|C_w|Suoo#9OJlO#YAQ*&8cGkwD)lYX8VO>Fn$danW;3Viup6~n75=yvCY4Z z-N{U)IaSP`jmPY&qV!1R=ik7tWTw)-!I@(ITs-D5EXbpjwr^rjGE-?z74zrgF^A!* z^k60D|API}|Nyw>U{^mT)dE@z1^i%%DGk+Hv`mpGC=kBL0uwV9J2+Y}eSXzWh>f*V-rVDKA zf6H?R<~96N&c4;c>BFi-+v;ZQz7~_z(^Qe)2Cs#A@$}(jqIRogxa%aM3p}&bFm4bw z{Em^?-M=w5awLh8ozr_-f#mLOB_kVN3%KB}Sh$6``z{$H=x^68XKc(d&j7r>cj=`Y zuqTN3f z25u8`l$I#onFUTVQ)x~W^ABS&M;VbxuWyt2ZbzJbz5Cx{F-IAZNq-NP%pdm5PL-d3 z6pMMQKZsH8!Tw~X(wr*h9~+tROig-cUDDdpa&$U9kYV15ec7&~(wr*hpZtL_KNy^3 zrqY}$=AULVqvpw358__pIX_2mv#YDg90p6AD&~LBWX4XXh`9%cCNq`hR5AZYCUbs2 z;~9iGKii|ZQh5|O$xNj=Rm}gH$&8JQ`*}3RvmWe1kU4ZEoGRx3GBV@2iQwnMIF#9r zq69KiX-*aM&y39C96UM}oRc1|)O;L!k(o+!s+j-V$SnLEBb+P4;3PAZ=2S8N+{i4> z!RZ*yqyyk2GnM94G5;bWbByYH1e|21(wr*hUmBU~b$45oy89+@l9@_#s+fOeWUils zZ84e~x$ces^&c2>FMLZsQ)y0>pZ_P5Ie$G^&l_z~^2R7Q$xNj=Rm}HgGGpVM^uX-*aMZ;j0LbFe+iIhf}e1P%;X`rWaa zIc`KhQ)y0>pBH2@mpKR9qnv{W!AWK+&8cEun8}QdbDo3sc-|5vo^QsX$xNj=Rm=@W z=6Y;wi4xD(gOkiunp4Hx_y@+k8=PdO(wr*hrcCDi@m!CMtx;m*7I2c8N^`217iBVI zroUu`l=WS8q`Jp&8nW;3Vig}rlxgO8kqQvt9z)5B*&8cEu{s+dq2b^T4(wr*h z=1k`N@m!CMYof%)!@x;qD$S{4UXjU+jSI)~_9)B`$Dzqgr8!m1D~-(cc-|f*o^J#v znW?lJIaAE5{=k^~fk0#|tgCoGRusjLaJ(v)Rj)%9FuKW-868Vm{NzyzXRX zqn9g{CxMg9RGL%8e3p@U?jEX0_kFz;oXwc1i@lx;m3DRp^9pW|GjGIZeishSTt}rj zRenAvgSp5v>2u7H?)-WiIO%69{Y=&OeVv=ZT*}XpnBNUX`k6{|s{DMv4CW$!UcvWo z@IFSIeMgU_$FaV^QKH@Y@9Qm*9T_zq_nX@!C~*hL}n_@sbW5F9_GBy zO1pPD(a+)OZlkmB1SgrPG^dLB{CSx3-W#7X<6-mzwc(lMaLx8aditzC&%t{!@f@UX z!z68U1~bpWy!Xa$aItX`Gule!Z!q{Mj!kANnW?)lNxQ(vyqeGcGdAp@?697NIb(xL zbE;zF!VKmjZKT-ubWGpzTsmuw|E(NcJdGSQ78Zf200s! zGOw6von}=sgF40Zf)mfh7-MWmU8|U{FfuQhIhKq}&Q8pza?7rsg&pZ`#&kP?@ zbLP6(%siLL9M0+Mv8RPTd#__UHG{SbL@C# zUSs=$%C-`96DDa}GMHUmnbXf}PtF@jdzMrPsX$zu`TV8<|E zJcn>_8df~`whU&*Qr`aH3i!Fo{M;HPJ-ep_>1Y05)6Y~rCUZ>&bCKAX^K+zJ$C`u8 zR5DXHVUo7p$V@-GdayN_Ja|x+TyA+eb|W*D%v9~?YmLm!f_VbvTaCP7A~Touxaj?j z%&TUm@!0=JGCV$>92lRSvN8k5oqtlbpU=Wc8tN4n$JmGUecpO-8Qyh2-F6@u=wVOU zZkMA79-m6<#>AY^P^q^p0xwm5pS*cvRh>D?*rNTQXS|_@Pn&6 z_6hV-#5?EBzcadk#@^s%GA4WNyT`S9oTpe&q5?7kOr>dQ4`Qk-6dM@U7(ue|Jyzqk!c4 zQ$g8=meylso``UBi~wRiO;)Lzx!1_NaPo*aqJ8mV&n%VsTH1q*%nehuL$W;U@@5o3 zKTFkq-fd)FG(A3S{XHG|JumdkQrTvb)@Nj1IDJeOXI{PxC9pjwRr`65k$F{j_dqh# z-C6A)Oon)wwq7243D{l|F9+eX6s%#Tiv;wKQ2mN5Lvy-Qma zdvfe3D4(}lph_d}e|qlI{ojhTk(Tdq#4YU|QC{if?!zVHLp;kPpgNud?;xBTn2WSU zR|!8S!**`6($7K3oaN^SgO~me%tidX#QRy_uYg09GPVQA_(;Du*Y!CVc&jD-EaEu| zHd*QCpy4~Hhb3LBpV3U=84jR6L{|Zj%-~9$Z`*?0` zi4@N#Kt(@Kdq}S9cn-V|De32WJh!&Qh-b3W&q2d?@L$0R{d|kT&&_Fm?w*>8<7f_! z(9gGfNUn1%PFmo7SV=#xo~sAZnT_CRveM5%!*`I(^z%aveqQBA>beI9@z_L{xm|Z7 z;F>T6Wr6g&w7~mF;b*pA^S0|&O6I{%S#+somOw_WvM~Dj;mXfAPjinWN#?%py|U<1 z%R8_anYGHo9synp^BUpj{sDV*ba`g2k~uLlOFwu1o?;{Tm@yLCqArIw$ZwXtd>{6a z%)hVL81}JTmU-?PeR>@>*=l^e?P+ii^9GgnTuf=+sJA+pBgo6?Ol}k`r=OelSCegf z!cKNQ4MngIOQktgeOS18j+x_4G=7#h*R8<4#I@S7smY_J+n#wuXXj(i*rd{*)C(|4 zn_Eyr*$g;~U-+-OySFN%v@*efR7R)>bi+yox28BI>q#tt2x31yej zXJ9Ah4Jz$rnCRz*io4r^A62F^nE83$w&Z_sL7eR97>ZGQe+kDXGnM94F&`JP5%M$RKW{wO$DeO}|_6WnzbJt%V0yd6AKLS%) z4`RVv@bTly#&hKR>mCj+wuPl`@~lDV-^Uu_x#_@dGc{iPh-42#Ib@dV+Qy>%JHTsU zZbm#G9hptWMw2LaCS3_O*4jPB<%^p&t;g`2JfJxdDjm#o8#$~x>m!FOu$xJ0PbrU9OPckx#*cczJ*+cp{ zfFm=N%v6r&N_%od<{0t(RKSs$N@nV2OwyiWWEQazB}+dGaAc;EnYsy+w5J-GMQlvR z@bj|)M`kLSsh44r_OyAJ^FHgb2G0Sdxek?hgeQR>3ploss5I)?ZmB+d`aH~e+x$!W zM#qw4Q+P8=y-dr}_1KwLsHiljs-JRa1~co*ymbotDXE*MA|wqQw;L132BdDny0p78 zm^r?e*U#$`JdBr8Pvb|L6Gn(EzvwdiCv1ZT9mO(zDD4@Z`GwFc{2vPSts=KY`Gwg} zks6-i4%}>KJkxUr<|2KoMlkalQ!E=sL1dQ7zKXPGf!D$u`x%6X0gml9scf@Jd$yH% zV)BG6&$|3j6hLOFn)x|q=D5#I+yY+4hE(0}ey))@_Hz^LvyxdV{Vwf!M&`!Jm`@<2 zeOEHF4;yr)1jh37jm!&JZi`G_Kc2 zp4~@tdG5tv5Ba%~e`-ko{=dz6Z_lZy2U(}Q2)wcnyMfhZPUbbf>Q4PUeR$FsD~I5u z^Ds%}b!2IQS27oAZ!GbRjUHL3VVTEf{5po9s$KU--p7&|ALWjXQ*qD9gkTP1x$Gz8 zjg8a7bH^QBok?d;vZHU`;2qq*q+Npj=;xr@v8>y5f9aW9u%TncHfY!7j^}1P-|cau z4D_>}CZkq-G-u2sye`Pt2+Yt@%)EcWYOFuVtW}o#Qux`z%rWzs;pro>Uczw~;OILl z>lUi^Mc|cwcK|uO;pE*x+scJPh$%q@TiT$0xN@4+o>%(0NNlY1 zd4plmzpsiT*lZtmXDsyjVz{pTybZxa-dBM=__;`XTN;XC-R;Do%d zRIyPco>!y2!T0uz98RY3((3V=EWE_>6R;2KHmTdNE^UkVvy6?c{NKr$HyRntvOweV z4cMRKNKzTA(*6oQww!~j>-FH!{@!XQbCboGdl}E`eIZ=e?dMnfxOh#;c-|oMGuj&| zc=?DXE8{t6_zwOnIAKiug(03##W@(_f_<5gH;S~88c?4|A6S)?}!! z<0d?c(A%X-FTP4%<~l0Psp`Xy<3nDSs>c9Ad+1PCtjXsPA&iqDw7@ ze)c7PZ?5aM=s$So_d^47k+$eE_EU~cPL4iVd1U}rHvY`$XW8aIF*Y-D z7{{~Nk$H{mck@In-{p4y|2+3t4+ecCmU&J}V{E(?+%i9J;AS~<-5K+= zMU#?#{}|xNOr<$hb@$(UUNV=dyPIZPwnCAlDl>sl>J$0Yq9cLal`%V*?BGdO7|aVW9Ep;AK5Qg)5zIgGxIG!9yQQKQl)1 z-uLBxM=V@V!DZMJvhWhi&%{1trjnU@1tw{4#2=zDNBB+6rvZ-4R5DY~$0Y5a5F1&{ zdGki>_g)?V9P@@$eGZcMB5Xqq{q7>?;7MbQzo+Z4WPP3YHUCd&Me=iKKjZX^@p}Hs z6Vv0Lq?^h}|B0uvu>HREK`>f?gkff*m=&UK4-^!N95ckJaZF^uhI)@@W8b)8$P&pwvHTx5Ks zamOu@-pZ0P@qSz~Q)yJ?=E}#7%%|}=&1AebksKU5IEj}QOwEp1g5}@A$k_ZLCK}hn zwQu(UW}ooPpMr+iDB|ZcUB5dEyj%yItc>TN;X4FgD&zQ*o;xrXY1b|9+L;_5o=Qe1 zPed7QJm2RHD(zCL3XZ@l&p~e1m~*UPsb`)&#v|BmlV_&VoGRu|XT)<6=EYsTLmfN% zy3-@r=dVT)D=}%6C4VM^*|no{`gw6zGBS>zhLvSnmUm)j#xs@XRQdU{8O-=7cYa>f zmBhPnjKf}!iOf`*Q^ou_BlC)`#QjQh=kUb7=}>v4hbuMzGwelXD$S{4{=AX7*)zuq zkUs?{nW;3Viunsh=H;GweA51&dosQp6Pc+rr;7QDM&_ojB5(|ri(<%3r8!m1UotW`b|wAM8g*do!9->%&8cGkvXL42neR8bEj@yLekF<^ zGnM94F@MF#yu>r>v7YpZ#pkWqh0Ii%Q^ovMBQwsyso5y4qm=Pd2$`ugr;7P&cIN4t zrNNw{&CPGb5}B#A8#z%cs2zV_n)F>CeARGL%8{B0vM{XE_V?3VNx*7?<*nM!l2n7Nx;yF^5OBp$)%)CLRIaSQx z&tS$!`TK+2dt-LHU4Q#59G?AdsYD9)gAC?o{xN62yJ=@fUz8UydZ6>5^fQ&_RQdT| zGnk9`dD+hK;X^|+!!xtf=|PP1S7HB)F;QvM(8hBgVD>}L{3GZZ|6!5wy47yHt`1&q zlrGSujPx^EgYr8_;@P$6bYqN~7N3mg=*gdglLthIlR#8|l553fyoal9A`0RDK6(jER5u+=02sIk;qJ zva@&ZP;ZYc)UbTkf|Qv`bE@)l;Fa-=uaLV=Y2KOa@93@e?%lP!`xfqJv~xT&mF842 z|EKqHS>~l+?jPI@=JXiW`PrVCN^`21|I5hS)YH4Gr<#@@W4_!oQ)x~W^UsXTi+cA~ zTero#eEb-2GS^XQ)N|ZYefHlO%ti7>%Dk^$pmFJT>`!JYjjEY{9)Y>NEuNnr2Szee zX;jVpizv+T{QOujl9@`QYUW=WnVS&L+vB;p!U0w?hk;h=*_fpLDh6{rH&<>29GR&! zs%HMRk+~6mj)+`&3K-X8qSB~mxTX5+e~ipadaDt8DQR239eA(uh}7%qxNhk_&-`0x zXm1qBb*HMI@*B?`n2WTLn({847L-PeOunp0H|2430T;O2S9>z3j^ z^VzZFz}O*o2=nYZ9Gv}r>SC|w>QeCs@=E3v*rpKkbUfz!duA$`sX9L|Ffupvm4C)q zyN~P5U}T%0N^`1WV_^m}!aH~SxnWPo&D=bet@F%Onp4HxkipE&bKhULr#I#$&B`jz zOr<$h%#B9o#=ZOcA`OW;M#e54ai!Z!PR{A+;_ztol=D5Y4J1`fiQyK<_w#)LY%fl$( z0!&mI^hS(_L=k%FJ0d5Ot$I5snGc|k%f$Zw-<(@k*7m4Sl!S12%h+_q> z0^CYWS|xMfm9bIe+C;-p>o!@Qb@>PiV4I&xqn_@T>a!Kbcy1VqI{fVJ<0tckN2F@z zl}6@;aZ{apkNIYBCZ3rZuGjmIDyxjl4N;>xjbrxz7|&7zFLiYWbCGy%tPbw$mIWG@ z2e3c$1(oJhCFnI7%thK8OJ-)#PuUXZhjqaC7EDNUmDgjUaeb*an zD_wgdfE$xDu*gb32Myn$PMr3u)_Ly0TqHj)OOom>1Kmka63!Y~dhz8mu?v~0G^Z*y z0NOi}&qyiNhTr!t5_l#&S$l8g;E(s?W~MWX9if#zxb=WM|B?@bfq{>y(dq zM6SC$=GQ4_dFFGVAwL(%8_Qjt;=t_{3V6uM{2VlV2YfVV%*$tc?!b(A%Ke@b`Z;Fi z_yNf1=WlyLu4_LB-uqeo+};+&&t#>agNEA+RuUa zJfoih9>vdOrJsX_@8G|J6Z(0R(a$mC`JjcsE=994Vg3NQ(5O5bjJ$qArBTm!OZC|W-p6H` zn~w9URlPjx(rZuv>uxHIs+#%@*r3v=IyNq{Ge?b$V_+mRl}6Rf z7aN%yj>m04-wejnFi~mLjc%zvyTr(R+KI`j(TLB{{}O1-&;RKWxlX@JyVNsZ4lR>6 z(&y;2z{^#OWMzI18oq;MX1=)0a|h-k?YgB8xh2`#UrqXV%TmiPKL@)uW1`ZWs>Bg^ zWv+8|WzIJLI>*d=8M~65`}THLdu@+EJ`bE^rqY}$<|{Jdxd`(b!Q8*&LEW9k@$(mg zlgw0_Q^kCxk-0f#-qXFOfAE&{FsAwQu{W8iG^dLBDkF0fm}A8<8J~@b%v73F#eB7q zc{P{^ItDxTbXV~b_U^&K^iZYe&&8f(rqY}$<`yIKaxhnW_jE`3ks2_*027(1G^dKW z)yRA*-gDCCnXiF{{JfA=QO;bq2*0&@ur`%CCBpniC}SxmsjF1E%**YbJ1{%V$=om! z>z9sGu%AL$4@za*RN5BsnwY1K&B*es%RfN@WR|L#w_2G`#AW`mXO^m&w;7pF#XW%` zE@XQHUnBQ9cq*Rt*bYGQmSsK__sLxAnXiY2yip|AEx6Ts)}6fneOP6#le+BWO`MPK z@3{kWkzBXnHdUZ;^*7j`%u+S;b>OuypNe}<0&hpj*jRM9hG*#GrRc@z4ARe1v+BVc z46)I4Vr+EgurVOS?u$IL)Rp4zTzmj{EzGgc!A8$4RmbxKt;~_n!6wfvRWsjcWIh%5 z6@<9x27AbLXwv1b2N#U0U^A}18T&V3lFD;Z8tcCu;Fa}Yq5M28OS3P(2}Q8qFIC4z zCwMK)3unjdprV8~dSDdn)~|pY+U9HS;d;+L+^>gr5L2^Mq90Pw6o-r}69pq}fX8er?7--r4ls6 z$lL~4==IEf(2$=CwV!)rY4+vMpa_o1NL`_dWjyozE1jSFRDs6T&tiWvOV!M~!E0fj z%XN{i!-o3_g8l&fj1_6&{OcF7QKar(cyL@6XI}m;N?@LlO212EOzbhlM(kYoJ-{(P zOVzn$NsES zr0Tr!VDMU)W7jF~0B<9vpuykxXwC*b^F9$9h3b@u{Z~T03lsB%RPATR1Y@~uY%GYI z>MHN{%u+RT6}%Saxx5jnPI)hw*~Sn0Q7r2^CB*VAA~p)=jV&lRl6?f_Fh5Jp${RNs zVxwtvf7HbBe(*AHNY!I9`@w5ruIG&{QQD#(1TXVO(BN-;G-o$^=7)>eD3Ujt`22j! zTyf@wyHNu3hSX5kg~FLH7|UhzhGT9GrP=kvD1yvVHS=V0t>$G-p^ z^RrZ*lhP9KnwTSBJN`M~$ShSeKhns&3hz>`O^hbEy`U||oBH>Gm+cKI&8Z3w#zvT~ zNHwb>#BfMaI947jiN+-%=Z8d)fVQgk6S{rHIA`36E{5kAHKT~N=m7hazmCiN+l6h~GC* zP4;yR+S_%v;@})(q|#mr9nWOO)~ASh23WiwiOM*B zEGDw2XQo@IoXBJb@F`+uJC4j$GCv(t%Dfaysok2%j8W@T#C#X9$V?^k3ovQs+cKGv zZB7yMi@-=`Dw$u7Nyo*MqzaX+yD+6F^<4LuOy;=_u`s`J94U6) zeF)BFokFEeLDNN!mZtXDd6@Io-OK0N8*y#``#7-3Or?DaQ_5WbkH2Fc=Dgz@^|t8j zNQ}|1pMa6fRNBulrOb@-)E;MK7JeQNWm@$6*qO{!+K(}5=EobEg`dYqYa{MBmKpDR zCNq_`5}Gd7^YarTGRKIG`@l(NDy?CTxgHx&G%}0W2*W7p!Aj1*iT%h-rF{=m>gPK1 zlZ?#k`r4A2;prnur2O$LFfPYLWu~C&7eo94Um~>o!#Cmg%9}T0GqX>{$fc5ls+pf6 z{9I>Vkehi!hMz5Q&GrSEsbr>V=BH*d=lAmx_m;rku5Okc!Pq|`GnLF#&HS_sX6NsE zwZpwKjdgcy=5BzJnM!7=W`24mGd3*5yr*+t=C>;TVIOuOGnKeh&3tDjGq%gioFp@2 zBS&KWG^Km*8(VN|$qI9-#tJS$AcVZJG2P6yU-L5Knr25=XEM~;x4SKg@JrtB1jGF> zNp105L3W^#8kjfx4_C0|n#0eZ#x|#d`I#a%>db)2!R)WY3P0}+t|+bJ*psnAr8!lx zk;Tl|&&!OlufW`n3xvH@?rX4F>`P`U&8cF3c7~seFpJn|j}gzegOkiunp4I693wNX z!`A(5do7D&}>RNd@9b7IFsleE%1=1@p!;+x%^# zBS}~PzG~88jpj5K$Q)whd01wwHi@?+Jzw}aFk_S4Z6vmz$;<@J{j63)0rVM_#@Hb9 z(#krnI(xx9%z69Wyr$XFHPqVH+Maawgi_1vR_sbrMVP&x9dm?co$LRR+4Td1DnI|Rk$FX052noaCX(y_k=gYFgDU1fF*1ubQfrLh zcmz1fOr<$h%r7-Ei#8I@!JRwPBbA@CE+I3O=2S7i><^6jE#O>%>CKpU&6w-wVv_dq z4CWQgh&l7d^6EgcZ*Nb>-mboGS#H^7x|Gi#XqDyd6uItn|A%I3PUbVZ(xERlNIQFO zO?LF{8%#R;_m#apknIb`hHHZcRk85~(TC;#361Tlyv$8AV@GS#+#!x7D5eRM)R2S2 z5#EZ}c&(2Q=U@C`4gZ+a&l`lFJNo+gO1NZ~;Rk~5#i8kED$S|#Guxk`4PD01>jX1n zW3aoU%N?xbtQY%{nM!l2m|r8#!7|Jn6|;+HgQI7`NoFd|sbYSGkr{qYPrr`6d%OFb zn{P>vR&LJ!Br=EpET@V5@*|q(0#`9X`XT)K`d47K#76pFwd#=b_E1m% ze&f@c`@u&)2Yn=#!}*9sXJ=yr#_}t{9{h}EQ|@;j&WN$TaQv^V?nkL=<6nNG@*-A3vmuExo!G zdorG-2Ch)(m52>X-e}~7<4{-xWjA;!CaIeFZ;j{Rs{QUgfkTHUPxOr)9W%%EtHH~2 z?$0pMxUN!NyIF)=oz((lq|>*9AQT%R1Lxh0o~cU!olsa!Qe0hjtz7LDy{F)7zC;e;OMubj(zm zQxzP4gAd8fDKPW@CU0ykarrr3fIJk3=JBPjB#*Ga1G6PR`}PK+0YO+o4H3KXa^$^@CKM>)wO^2#cT3?rTp6IMN5jj!ur^fz9Ob@WkkNsmJoj z8zwBebCKuZLXq)8EK`?pBX4=f%vaC#Q+PXni~0Tn@-a3-u5hYiLo%P^d5fHbvHeV5 z<^n2n2K9PO(*9Azb6{rtj%B=U0b zb@(qJb3@L4_fjy=jwF`brX-H5|LAAdgJh=aanW}OKTGDkes;__>7qQ`4ZZ4KiE3JgA` zhW`WBLwVas&E4GtN%vliaCCJIs?Sn?<6&Oc4c6dvYHk@V2<(7A2w^f*eG8ct*X(%!H_#Ji@*U*1Iv4jpv4mc;n^7;`lz9r8195`>>I@aq?KiGcXX`_7CX?tRGL#& zr^xn3I0uW=DW@WDkognp94zuXkE{0dckS3Wl=Kfo`H8v84e%{c4)ny!&mkW(KhwCb$G$?I`xty3m>c;`b26WCQat0n0>*Q)qhqMs9kTH3 zGuVUiOr<$h@%%*}7cxH=iRY8g!8Y?b_&IQrnM!l2m_KS{UW#9(On}Kikhed$MxKNF2Yag}W5NMqc0G@sq2ce;FJ<_-$T^62!QnF7(cxQ@ zIFd=QV@3?EC`kNMz51^Sg}aFhkLM^Ox@2WM2Mymr zGBYN=VTkAT($5hh8t0OW4Jys4ijBZqHlD*dm<~bPBYGn^8P8OjQ^ou*#&}+^D=jUeE5MkfWV@Ab@5_4vk*;p2ZZ_<6&w z@yP?j<9lnh(Sh33^w{*wfaxOETfn>k(`zu%xE{_&_W@?#_PjrU20u6Qk2zyw!y(6< zUT#Boc6j2@@PYAKD88_gmH9bn_ztol#>V%RpNq6NmZyHUIadIE3d{8Kd;DiycWq<8 zP6@m}Ea~TF>1R=H*+sI_&q2d?kmb?O|7!5_sbCJgH{pwfcrJ1cXhHeVm9Cpx{s@*> z?MYoT_t$iRezxR|1;iqmYBlDVi z4>ro6%uB$_b1>-3u*^In?F(RLeDvYNGVwg;=XP0Y`Q;B|SNd71_VZ7Ser}$boEaYX z;|1kW=k|P`XO^nZ!GAY0FWKYn5N(O%X7_Gi#scqqr`?Q6-)H`59~%Sc1culsQg^RN z{d{{G*6uK-+553KV?*j%RpNgb{k$j^tmpc;XOs;0m`%u)H+W{Ln-ude5EB+Z&((u?5GWb9KMC|E@G&1tXz{MT2gG^c8Omdd`Cw1ttF zaYa)WTYCA;*pqD{saL7e8jQ@1x7Vg7RhgF6zs1hrMFqu3e3og0*ee6eODw(OepRx#k z*6j^VKL z$~$mqj@?Stb@vkC=Q7MoQs!1$%ZN@&?VS+%S*rH)QX_N2RPB&ITojo_DL``XMGDIJ zmUanN&hy-%{p`M1&Ujuu?H@l#YEx6musJ|(2M_Czpm$(dkJkm>72pocMf%-~fjTld zT0_xM?6D|?V?t83pLzZ@8~nT;xsK0zj7%OqIyqr@NZNnn??TB)Wv-)c$0TjB=PjF` z1GD?7Rrq{zDmiw<5aHhg9GR(Pre1+b+Daqya`+jiVG`#TKr5B+0FJqiN@nUgn53b7Guy%PuREsu8rj_2IlJS5k3yKc2-UJDK9AkTrk%&S>(<2g-2 z!`WtPvXU`q_zpx0#yDQ%xdU^NYnrEmIq+@}elC{lCPtDYwcCOZtjcx<|DUCvr3$5= z*C{_2sZ*Bu*of7+Vx3K9sb?zY)4*$CUX(UORjK7y*)}4xRK)5@w%*9R5d=OL${tYhk)uT-uTes+B-_xJq$!PSyELIut-BQjHI9hk`6P-)|;voq&m&RY*I z$Gw+yF|MDS2xVIIDcG4~ic%RT(%y>L2=N@^W-Gs0&Ne^C3S?|pUt)JB;K)H`8;M%? zFjio%$Y3ruRuK1nGWUXs`I$=lAtuH~(_AL0RM__newOX0yzi4)?S9{CAD+D%Om_5l z40fSBi(QAE5w7l81eU{fou9vn7zoVFF*K(+V&DfB3k7r(v|B%oYEz+)Aj^AtBvVCi`ehQDxT;~{| zJP%W5ewtc{3+hSz+nlknbjQ$ugYF3>+LU~Z=ipnXs_vG|m;1vNiRUF88fPB7BXRGL%e=U3y)gxCl%R3x4kjvP)4k2Gg|GDAqEzon7a z^d47Sf1Qv88keuY{$!TQv0Z7G;6K8`ydWkpz^=hWW~uJ~T|i%IWL`AX5#>5}Kx)AP z8Kt`15jKEcW@K&zb4*vadSwV$srGM}Sz-Tsc= zYSP!g9|H$Bb@v6&@aR$#alOyBm|MmqnZZ zstjgsoA;V#>~~gQhGR3gNe%S|xoCflgl)-n8(cqy12aQaz6@uib?dEdhBp`72`0GF z^#jSrb=^<7KN_kbHbU+$QV*V{nYSNoJ;LLZw7ak$nW;3VDxO=hfra_ptaGrZcUMoz zlW-R}$xNj=Rm>L)<`6eU{JgsUE(>e($T41sInTMX+*Vs*>y!@wkbb@f>>&@b zuU=|=BSJ^^lQ=Z<29@?(OljV@$gOjBb%vk$dEUIiXLvb|6d}#=u$3oa+NiWn%PrDt zaUq_ApNsUnf9DVW4yrMEjshcrLyDoz{Z@>Hh E1HZ23Qvd(} diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xab b/si4/ps5ws.si4project/soft_ps5ws.sip_xab index c8b4f42bd625c8e3e74393e6bf91f8d7776789a7..116536209ead95b53d309fbd77f0e96c332ddee5 100644 GIT binary patch literal 184320 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 Nl|ZQk{>w_>{{d1MUV;Ds literal 110592 zcmeF42YjVfxvv+~sUm{(KJ)?7rqF~;l9>sUnS>-WLv;wro=KQY5|f=N)QxljK}Dqs zc8a1PT~GumHbm*5f&x}7C@5gN?^=63`&-}toa;IF=<#0f$^P*h=9zc3Z+)x2>s{}+ zaGcxF*>6+lO7&IFwF)0L&aIQm+l4!XJ0<=i;a$eLNj|-)A-`I;SIRS7VUNfyUOv+e zlqQzLhw{yGvu+&ktU#0923~&Lh`VQex%}|%&b`&AAGmvkdwsnBt8?4<@D20bVUyg1 zRK7^~2;rk5hx{$Qfl1}`Li(28Nt4{TG`*82>90NA?jy0ikp5L7 zzdCKtR^E?Ia?>mIXYoHS@joHqKPBb=w1mGV?GKjzwZhj4UoY`*5c%gM|IbVKn}ok0 z&vT2&Zh3<`S$av$>sLX`~9@YuMxgB zhNr(=C-Unj=iBdRM1F(t=Y($*zDd&ig5-a*gug}Pw~GAnFto?{!P*l{``>0tzWr`H zCEp)*5c%%u_-N_vA-t#XUc%Fa_ZF@auA7n{4`)bu>^Z{x$Mb9^ym>laTmRfql;^-n$$Vk*&rZtcf1~it68l51hCq@3*$@%hbHN}s9J64`=Yvb{*roy{T$v@9N!uv}6T9Ho=@?9(G z?H72f3jcL{xjdBDT1%Lp;dO++8J`FFBf{SienR*u;XlOw7S==d{{Cd^sc|+-hw;Vu zfVf^Gzk}lX4t|I5!NRj8{z75am!!w~5@vk~v%Z8`U&5>};U#H#?0F6sJ|bls4~`T* zO898uV}#!+yj1vD;V$9hgu8`%gbTvUgqI8V3ik;gFT6syUwEbPcjEe+`hRqMzCS)E z{JiiB!Y>NHB>ZE^@4U(7@t^!Jkn!NX!WRl(B>Z9FON1{KzD)RX;VXo%l=9At>uD>$ zv-NF5v+$w9^MzZ47YMT+pXSr=>0Sla(rQ?Ge`t@YCu1V)EOCFN@

0K`T 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 diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xad b/si4/ps5ws.si4project/soft_ps5ws.sip_xad index 9911101603ae00dded9422267e69e51a1405c0f7..078121fb47cb2436553516c1e48c47bb70e4dfc0 100644 GIT binary patch literal 2128 zcmc(gO=uHQ5XYx6Hl}Ht6)IjlSPt?xBN7 zd-#`|oVbA4fh+Kg1!T2-aXFsciRQ27k$n#r;`u@dv^^qfMT8>yO;fGxAYn4+)`8n# zO9R)fxepkKFc(3ft%r1d*hl~L{0y?Ia29hG0&TB+v>y@Hjm4sBOjmRdLj~pvF2t90w?5`5mP!s{mV0&SZt zWeWue^TqQM>Tl05RAR1#K%4EC`i7#JII=(B%FLA!XlrwIhAzX`b#4il3Ud{G55MG- z`9=mw&G!HURpzP)v>E$!zd)Cf{9G8>6}TF6H3ZsL-M&H}jG5Gp>@r-PxjF)EH`S$! z6xTyZ+-|Gf7WbdD;30Qi=$Dw9ybMIuXE29@=9;fV_K}RGRaS8!=0d_P1%*qUp%lP3 za3*u6a6@ii9pQbX=I21r23&->h;Yk(T`Y95!gLA9TR4k3OSthi&0)V*uL(jwH=8+I zxQ$NqXb1Yhv2qhvz}4Ui%oT)7y8Bi0jVF}O3*a2)9N`w4IrZEea7E^d!X5T%U3fmS z#uI$3+~-zet|Z*{fgR3at`FQIT$#DDaKAfME7MUPIvbA;0Qm}6VXh+FasSS_bkeFi zqIck`%vFVZ+9~HeeTkGVuff%rs|oiqNIs;|FX_3QdT{Fe)|smdw-S&($aGUL{__xy z@TQda+N68lSQm#m)h|V026KjRpIlw=+%jR^_v)P6%-O>E<^AVmaX?O?3ki3u zQ*_QGv@lPwuF0G!+%-=Fcg|Ah_YSxSa}nXzf?8+Pm(9&6U2cIh_*@zYw0R8qE@Wp( zad$Cf@qCudhZNLgU6f+>x2!k9-xuT?>zm%CzRzGHH=63(ZQa}8Eav`Mmn+#>cWd;t dcer++Wo0Wj*Y~S|EA_<##nDp%#o7PI{Q+IM)P4W} literal 1408 zcmc(fv1=4j5XL8)&22!16D$H+93m1)vj$D0#cgs*4m4Sk)h^}&7c?Zf9CuNS7A|7p zfx>C0g`6O%Qy54iq_e#ywGr$@jFKXDe&5U{?@!3UeQ(~p-_Cn8`}W?R5t$M3rALm{ z^4P!HcdSRy&Cf#l8^muPXBrr4`SHg$J{KoEImHnzOQVpU$amG5K!;5J^+=8`9!jH9 zNu%GW`Fnw|(98xsSSte1}63T+!y#^Vz-^;FoTUl^Od%DPZ4%+jk&m=VM=P zK3patElP}hFUOZ!4@{ISJebLfKW+MGJ#8^=1zwNDs;>~WVe=mzNJ*Q z?;g0lLrUagzx74AVT)^@>)`5+TlcIls5ia6Qq_ge)D&E*QDh?B9=`*wTZ$1y}>9sEx@xYY6=Tx)SE{{i#BZ~FiM diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xc b/si4/ps5ws.si4project/soft_ps5ws.sip_xc index c159f36ea18b683795d73c8ab378c66a264122ac..56fe267d8f7613d10b06cc4b13cbc44d311cec7a 100644 GIT binary patch literal 99688 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 literal 81472 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 diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xf b/si4/ps5ws.si4project/soft_ps5ws.sip_xf index 50d7c65513aab225967455cd2899a8a61509cc8b..a0780f025c7b2848401053a217f01251924e2ebc 100644 GIT binary patch literal 99688 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⪚QP!cz45~eUX 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 AZU6uP diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xm b/si4/ps5ws.si4project/soft_ps5ws.sip_xm index b50bf1b4a362658e8b8e3559407405b034ffff65..4d477350b4e81c8290e24ae1663997574f537205 100644 GIT binary patch literal 196 zcmWl~2NJ;m6hOg`5Tc7-qeO4_Kb`evc3vJ4BU+rP@r_8Yej%gHoCRxE{Hsu QjW6GR>>d0%`*8I154j`)>;M1& diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xr b/si4/ps5ws.si4project/soft_ps5ws.sip_xr index 593a129efce6e48ea69d33fdd74811133fcf5597..a61a71fa6cb2c9f9bf72f3e11bb9f28809b299cd 100644 GIT binary patch literal 99688 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

*@Cys7$3&0%+SJFo~lK}Fu3vRy2`6hi2=X{dA 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 diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xsb b/si4/ps5ws.si4project/soft_ps5ws.sip_xsb index 704a36f15b3909ce14914fda93766dc8c949fcf2..e24423a6edb50b68f58390e9655c76e3b260cb71 100644 GIT binary patch literal 102400 zcmeI*b$AZRm&Q!gcLrd~=8HT6=mnyHtPKU{mM ztxu&6bNP{1clnY3>@Nf7tWW6D8VgvjEXL(k;LlwD!}jIB?DETFUH_x_;kG~JHEn;& zM+~ydI}-jJ%ljM4Ysd1A!t&O_@{UIRFHrv<)E|fX$Dsb&sDCW#f7ZvY-{VM+n#l?SnO!{82DKD zIQV$@1o%YwB=}_b6!=v5H28G*4ERj=Eck5r9Qa)LJotS00{BAsBKTtX68KX1GWc@% z3iwL+D(m2C_!{_H_&WG{_y+h!_$K&f_!jt9_%`@<_zw6^_%8Tv_#XIP_&)f4_yPDq z_#yaV_!0O~_%Zl#_zCz)_$lKc_B8wq{4D$&{5<>u{384k{4)Fs{3`q!{5t#w{3iSs z{5Jd!{4V?+{672v{2}}i{4x9q{3-ky{5kvu{3ZOAb?`O(4g4+q9sE7~1Nqtq4CmlH zycJx4i*N~UfwzWR;nDCIcpG?IcsqD|cn7!)?+CZSW8rpq96TQ03Eml=08fN>fp>)` z!IQ0nDezQy8oV1k9qxcT;VyUvygNJ-o(1m#?+Nb(?+xz*?+b?~<9%d4{a2)YYS)z2 zyw87qxwd|Fcnx?rD~ zycoPVyac=?ycE1NybQc7yd1ndyaK!;yb`=Jyb8Q3yc)bZyav1`ycWDRybioByqJ)DLc;E`}6oPoE5 zdyoI#cq|BFy~lsMJ$jG-W_tv4JN{S9=PL;IgZGCIfDeQZf)9odfe(cbgAa#~fRBWe z!+O@gGInC89OdGbx=bl{v~_Tdb^KWC#BtWiRe*xP6g!Y5cehS)O zi1ru37sEfJ{t(okiu#wJ{V!-gAKFht`%BUOSG1oW?RP`_%h3LE_zL&_i{4*X!dJmp z!`Hyq!q>sq!@s%psiaa3vFWb=k#BJQjr_aK4?1jqaHGu+{;>J+PMaUU$>zszwoY8_ z?Vs9Hlcrw-UkhIcUk~2^-w0pT*X{qq`Gl+CYv60)>)`9*8{iw^o8X(_Ti{#a+u+;b zJK#IvyWqRM{bjg4?t$+`{(bQM@B?W7Ap8*WABG=+AB7)-ABUfSpM;-+pGNx@lD)*K5ehuAd>ZNkq!Wnow_-k7) zzm@5KDqn!VL4FbOO-=vDP29-){=dGQPM1u6I{mV#mrl1J{tx1YXvE(`d<^0O zZv!th+~5A`^bUxBi~426%UJ&%5#JK=7g0|qD0{xo2)Ex$h>u15JH*=&-^{!|J5Aag z-U1#xzrR0hoVdaO>x+h14?+Hl$iEo*^C5pFn5RP_$nS?XN=q)$lO1UmfkQLH@PyaI{|o?XN@r_3%Pyzb4w>fczWbh0%U3 zw7&`Yiy(h(zZ2p= z*?4Ye8_)fW_yoj%L3|?Ob!L5X4JqeJeL2^>ta(4=rfp>254mX%nb$uzZ8_v`jQod@ zzdZ6cLH;AiUjg}>BL7k3uZaB3kpCF+ABR^$`_0k*3FJQsuZ;Fvp#4+Ge;Qr|?Q7Bg z8RS0;uZs3{X#X7YpNCgN`xM&0fczKXmyGkVm*H37SK-&-*WowdH{rM7x8auu`{SW} z)hqC;@N4kv@Eh=(@LTZP@H_Ck@O$w4@CWdR@JH~+u#Rtg=2Pp-`Q#|;swOxKH^VtN z4{rq*;38atZ}RqU;e5lNX8t1AJj~7a=zK`7xy#IF>#KM7>#J|`>#J{f^FftVroL%m?|79O zRZP$Hj#r`YaQPBC;a$%i`X9ePP13xG-=8K)&+_}DzSHlI`XBFjQcg8x7WMnnG^&0N zzd!1`{Qjtuet*<5zq@`s)ikQSr(3>+zT31fl<)DKtuOa+?JKElu6{9pebjrodQtpd ze|Mzoq5PQ zx39nbv-#Y^HeRUlw|_1h8v$$e_p@1II4-&p&o zajvPqd%ssw1xYRG-tUns?)@G*_n3RXhi>}9?LXBi`BE?V>L<%YyU_OO?ZH=(m+r9! z-SfzvG``~=_+I!v_Y`r0wFp+EoGP@b_7yzwwup!;}NpDETp z;ocvjZg|qUQlBf-5A^z5pKp|1=w)pC;Axv5Y-{s_L1y_) zvaD&}BnOz~H_0=mUXyHR>NUx7wteud%@4M>`N8rgzbMa{{G#k&@{97g_x*EyIXU79 z_(bn`9L{H-1fL9_0-p+>25$|Yj`{U7;4{tqb#47w@Y(P=Xn!tzp2=?;cRqZ9ac%vD z@I~;&@Fno2@MZAj@D=ctb1~=lzw|!O`h7tj-yh^T|IhjTxy|Qu{{CIFymXrL@Bd-G z9P{6t59fS0=f^qUJ+JfIoWJJ$H0Pf=zdX13T=Qh7MxA`~DmvMfK^I>zF|Kj`>=dU1$-rZ6?`>(4SX$p9eh1}1AHTVlXcC_@GbDI@NMwz z@E!1-@LllT@ICOo@O|+8@B{FJ@I&y!@FVb}@MG}f@DuQp@Kf;9@H6nU@N@9<@C)#Z z@FF<>*#(~0>kI3>`@`zX#q<&0{Yjzc_4>or&HbqzooRD_YDecwW_>z3*Fb&)@?S>& zn#doC{8x~_7V;aB|0?p=Mt%nQuOa_+cpbFg67AnW{+sZ+Xg><=-$MS|@Oo(9g!b{J(f$MEe+bX(^{cy@_y2#qo^=x9|LXOveBO1h{qxWN_&o6c z+uP?*?|z7MI$!v&_LJ`SuPXUOT%Iyc$kWD2dB(U(o;9wP=ZtIQdE;#C1?%8N-$@Bx zGLFg1#(}(I9G6#(6Y`pIQeHQ%k~fU2);*VRT8{w z9FzBq19{&#E*}^tE`~2&bAJCZ{&9(-UZKq zcZc^uy>m>wH11sZJotS00{BAsBKTtX68KX1GWc@%3iwL+D)?&n8u(gsKTB!cb?|dG zKl8ASXBIa1|FzUkh8H#Cg_hbW@M7>(cyZL51}}m9-QXpSyV|D1ule`)mb==PM!W-F z%DAPr6JFN1tE~%O#<-<+cX)Z@uC|%*a>gySv*0Jp>($k^hlzK!{fzbf1s-MH-UMf@ zCpBAl-U6X-u=qyTItMr-?xT7(z{<-oqpcCpI9wr?|$OYfvH!Y z%A0!isiRE2`qT@iUVUmuQ?EXCw0FEs*N$#@(cSMYpGyX^dwE;Gf9m)B_RS6T zA2>_8ITQcTIN$n_ak=$l=SsRTI+O6%uPF5efBn?Q`s=6u#9zOnWXAgIr}5|tzrEC7``b(1?r$&khNfO1B~veulTE!qzA^Oz8E5JR zvXQ^OrMR5pudn)Bw?37$dSjEHkW)>5LcTNk3E9NtC*?GgpOo)Seo}sLmUOAM{zqqB z{^-o6{`!xONsGV!>eK!8SO4U%zk0mC{_4$4y+F1$^#VD=)C=TiQ!kL6OuayU@%uYE zF25QlL+|YMH_ZRj zj|Wni;Ku`zhrQ<+?9?`?qu?E18)}=1e|i0Ds840D#QycFf6>2r>yy?W*#7Ts&KKzO z_Xf;4oJI2ohkCDHIG=FTf;P_i1$|zh*FGVKnf3`e+O+TWzx(!B%zOS^UdIoE2D$Oj zw5b!PO!7XD`F!oj$?)Iq^IXy4Ov69cxuW-bCJmF?c5d4EDc>#+PCrdFXe{Jw#Kcs+gax}bK{-LNSRh%+l`0R`EnoEpUOzx;q^5R zWOHwPI&#v~vDGw8{dZhX_y<|hF*BM8{dXr1YQ(g z3|<^w0$vgx*w-#^FgygF51zlT?f(LZF9;{FJysfKm%lQ+3cM=38oa&t`Zs1qHjehb z|7y$>QWM?twIuW|&XvYoOQDbVe6tCiQ>XNWuXpFOmBwvk+zs%J@EC9TnRqJI&%M7S z^sa9Ck+-q=*-18@-4^lwwqABJ^0!0&0OU_W{`NM%Fwo`~rrP|%4mQ6y$mSQP+5BP| z`Gb+a8}fHV{t)C(M}C{lFU@E3OC2`9bhbC1($}MW4m`i#zBZq(b;no9)aJ`$-S{f< zxo$iXd4a(_$LGkMZu}Iv4)xkm?>y975cRrHFNJ#JQ15)y8;W`}P_G{K#-rW^s5cDt zc1OK5>g|Mj7oy&9)SHQV3)$DFyfC~7yfcn|W{o4ce7Q^x@-tjb3 zmoM%I@9(?5wzRlwU(v_U$`a0^E{}Bmtz^cwO!Q!gfanR+qFn0kTiYU%}Ysi_yp(xzS@dz*TJY-#GnWs<2Em&;7OxGZDp z#bqB;FE0D~`-A38eZ{(QKkMxN@B!Av1L5c0@jx=onbJWvK4z4^KFy`r<$nLwO*S4} zVdKFL-uNifTnftYvi|#}xfI{g#uIJuayCD)ymfM{%^%SYPj;_|u5T%|g4_O)4|dx> z@^ktHPCr>TIt9}F^f*_qqHf8$^$+vQSGx6&yrSvf)~S`?m8~<)u3jaRm+}U7%itB&q%ptD-QGU+Ui_26~FD_S`dU09R)QiiZre0j8+4haA+5E=CY<}ZzCO;vE zn|MN|+j!#KmHa{iEC|sVojT$ILiM# zXnvRLkLd8M?r69C$TMvH`eSVS`rS?YQsG$BzEtSvjprtI)JPC_a4`V*MZlC z*MrxG^Zxro=jUd+{#EqnOXWKM{h{8#wU6S*x&BAq%G3*FmZ=xW^`>4RF;g#)<4wIl z#=Fm(WJ<-(o4ozimYIfzBX#zDfGie$KAU3Y_>122K|>#<@gcHEPy8jsU$(A2I-1Sb zZ-wP>is1>&okEg zW2brV4|QfI{lZ&BzqQuC&^t%gZ>{HeLgYa`o(S)Tdb^y>ZK#{aW@j+<|i*7{O;SMT}Nq0b%S&hJBS@7|BnI;xcN=D#9)*C#|i&#$lf zll=PX9Z=7k4~yD+*Ed8yAN3}q-UWVtN0rjYdY^~gr%oSNcFU`@>hrbz>m@=5-gvFG zR1WIkdh2)^Zh%{?6I;Wr*40zI*MD>(KI$+pK3d0@hr>ts*74<$uwJj!bG^mrTrs8B zgBV}vZLcss)nC4Pnsa4Ly0&nQ>^o+T9-z6^DBF{O__R{ zH@_14bZ@>O^cnD(@L6yP^>>2L9yaI0s(Xa6{usp1LHwtoZayf?UlRRY3d>&_UItzk zUJhO!UICtr{+^5eoQM4L;oZ>w0<^yn`4_<#!RpL? zS0Vpu_!{_Hyq?z~em#63mVX15en2yBG2M;QQeR;N#Gr2T}hana|e(TyoF8~z%QJe5j z$5UOI;qLiUp|^xb!A)>&RB!fA%!lo>SY9*ob8sHs3NFA!xCBqe^0$flH~SDB_HPQ} z+iHBkoS%pY<5Llz25+bN-MiQ@e>cRpkCr!kmlVdQBfdklyq@uLR|n!{wC_ZG$0+XB zr%l~Q&oH`Q&o1PTjq=^{W+2`k#r3LD{R{iMJL2P_c+dE{YbN63QGX|O_a$OlZ}-8v zDf-Kt`a!u?e^1MuPpE&j&glGxAD^t_39YABrH1_r${l(>=Epnq`P@CvYtwk=C()wj zY#;SELrs3?x5yu+^}}~S_!qX{z}D{^uJJx|N`&zk;w}FBFDQ4-^0$vV7oE?|sUI&V z_4kfl|JC35{fU=5zlVQ-e}r{>k-Vi%Z*~)1-n0oeK5cZ=6}_rk|H8PAXZ6qJ>-Vw7`hBdv zU~}Hjny=5B^!qdIYVCiY?)|gI&(zlaWzP9{qTG31cX9pyy1dS_^uK-Q%nyb>8$Ks; zO#hvof3E(wudEz0YJWZIou~i5&z!Fu!+JL$ety()&i+8-HzIyP6pu&$hV5@c{P!p_ zXMd#ezY(Y3^5)0F-wSvfe#g3Ntoy!Qe_xjU&}&ig?5Z@2++Y#R%@jDPd0P#B!KM?V|5I+dt(X*)!kP`GSA^jFmfIgkQ4lJ72c((xJBhrTc9EOHX5Yuh{mThoSxb zXn#234b(ZP4nGz3r|0w9`3B-|!bf2F4`TVxMD=>c$DMDXy&iAe@msg=>(*Uw z_{SR^pFJNPPokpHcW>@${)YI+8u!QZza#z!{E6oKum48;bF}{l z@h_sdTc0o0{&-&e@ua@~Uq$(Dd3_N7I*PmZM_{M(4Hqw)T-RJaq1^4~#xV~zLo;$8mn zEGTC%zMuS#uDXA|pyPcvzS8rDng0Gt$Md^Io64Op%(D5Ndm#VxD8FZYI&Vk*85-|i zh46gg4#c1I-`{$E(BI$w>PMr!fjeJ#vb$Kgee`@`PrpAp-rft|8{P-r7v2xvA3gv+ z5IzV#7`_v}3%(nk;lI8*zJFe~M?W_n9zP24XZ`JyC{Nr>-=BT-BFgCfq^|PcKYBi} zdiP)~+@9)p_4V@45A=M@y-m|9zprus{6Npw{P?sFG#*w6|8#lN zK8!p&CG(?2cS^4K5|K0455Av~c``mn|`@X!=n#wi(ySY`|^`_x`y54Wn zb3a*Vy*|NMuMaTR>jRAS`T%3SK4A8nSKl{bz2so~eT7~xVDhgXWUbH7HF5p^-gtfV zU*D`IuHTd!>o55l>yP>`|m>QOoPc^0bUWl9{tzpGSgn?LyUF2 zZ>;A}#(KVF`lIJBroVc9lgYmV%h&TE)Begqw*8IB*O?1bPtSLZ_58;8X0$&S*4>@S zPoY2cSf4cNH^3v|MmPg+36FxC;4It>ha0o6xcQbPBCj01gTnccwXpwOQX~F+%i4&~ z9vSuQuRGU4eD;+e`hWE=tiLYe)1!!+Z<&F3M--nkzSs7v;-DDLVXi1>Q&>|fTNGal3B9paA<)Q7@{!H2^~z(>OO!2Rv}uG z=#S?U<*u*w)7Nu7N_)9&pr5b)M&teGeB_$cgAo7LwjZnW=k9phULHHd`+XK|Kkhrt z@7w+Tg?c`lKkj>5Z`}Nd{}9FJj8C-v0*L<@#pj$~wwK2*XyfA_jm9f;-k%zO%pd=# ze~Q}AnNMghPZ(<3PZ(z1INW;TLhwi(|MZOS+RKw0ZG7^=*3%Y&7lnVe>sMUN#*4pb zd_ebnX?wZ2IO2b3yyyI=z1*>^jd%PSwO=Xv6zJ>KvV@JdENR`f6#QG%e)jdB+J45; zHa_F`X!*0>B4KjQ%wjZ3g4)%vnaN{A-_Nf!$Bi;3N(v&HbPIA}J zMc&0-e^P16wMyWwZ>;F;RSn~!@wpylwSSY_CQk9^W3%c5U4JC>LGZ!wA@F$b`kivN zHWT-jpRFy$64rr^M|!rG#^Y7i2_0W_$0b`kx?J#{_cd96@T3Tr;G?|jGqb6tQ73!b zGxS5=d~)cA;YZ-CcmGwky(``9U0*S|y{nw_uCEB4_r@2Yw}SQixt`;37%zI;FPmy9 zm*7)e|0~)0n4D@H$Z5uLIo&uRXBa2tOyeri@4IFnJoF8c)d~64z4Pa6I$J)=&(AcA ze*fk2r;Zz|-**}R4(s=Yvro3Q{$$P9@3&^}%);g6>g)a*I%nrP$A82B!1~qH?48}5 z{627BxF6gf9sm!7&vxst{cSGMn|SZvX1xJoQ{$qvxc6tJIhU7@-1F!nFX!z~rgTo7 zuspo0_xWyaX=?h^ZO_V-uF3Lew11ktNt(;4!Z}`lbNN(mYwvp9+}0wSdDr8HKG*F} zD(YOTm!H>dyt$Vj`aCaRog3}v>#%GKKVN;mpC6Ol7?U59T9Y4>3rv1YwlVpE)S3K1 zE;RXpY-{r4k}~;mxya`7voW`7ycG}J=WDw6=aqbrlwC}Il@v{W zmE2|Wt7KP`Uo9n*UoCf={A!tG@@u5U#O~(FWhIGN#F0R z`I+nk@PpRP55ZI1^0a<7wzcVBHukXTUp6+?<_E1dKX}CE2czBlS^L+VdekhxIW@+` zb@}<0$6P$}7!`Nxy$_88zMH$7EZRACsp{ zeoQ({ejwYK{6L;I`GItr{J2!R^_6U~HdO+%0+_kHGni}AoQ?))M={>!7@{RZk$^EzHQ)~gqe7asHKsYlK0 zc;Yy}o{lFT_v^)E)Vz*2jyLsU@`R~3@8gjZOuay!H1+0vymF$cr_XaW_2zv%bCRj2 z&x1Af=6$?#vZ<%flQs3`eLQrEsi)7QHTC9wymYFmr_ZxB_2zv%b(*QC&%-tK=04s! z-JOr>_@lnS@z)t9o=N{_kH^k5>!Z)}HS06)82zGZIXy>m@|vGA{s|IYK*SD#1qlE1!z1oJvRJm1vQ=OvqZ^FDsOz|_;{Et`7t zKEAxr)YIoRn|kv;{=CT4)8{>#dhv;TXxBj}lnp1NdpI_thwZHk6xsBJaHTlKDzdC-u&R^fS z6!iL9xBcQ0%L$`}x6*re0h=H1*=Lq4zw&d?F@q z`T6R%{qqsE{+@(eKlNzyJiC}|Wac!<9Q!g&> zntJhYKGCZemu*bFxNKtTCFEUGFCp)ldI|a1)Jw>=rd~oeHT9D6o~f6V_f5T|d}8V) zWjj+ZDVv#kRr0>6S0x{qdR6kNsaGZ2n|f8Uxv5tzADDX8@}a3$EuWcs)v|-BS1ntZ zdNuN)saGQ(nR+$yxv5tpWmB&v>`!zBnw}a-UhmH^>#x6`VCpBO-PBJ?%U6DVJ-q4s zwR`=OdVb~iHyM+U{Qjyx_WP^;+SH4Q&VPILVs`zLfqZQ01@eihr_XaW^#U1W>IG73 z`WKgjhq&#b_Xl(?xuEsNh;Q#NFCLd?%zQyyy3Bk*LT>W=8&AkbW`B^79ZbE1JZtJD zWQM7il$%YxqT=``k#%xVfvqq?P==;ciMWv7q(t7 z&ejXwwDp3!-1gA*Yfg=K^GT84GV9Zvy4&UJ_R6>HZ;$6x=1wBPHme?kgh`s<&NU}t~*6VmdYzy1jswXdlcllx4)n0#gG z#bko1r{fJ%FD4aJFOd69y+FP;^#Yk_>gjmH)C*)kQ!g$Ln0j&f#?*_;E~cK2H%z^_ z>~HENW#M3E9=u)BTmHmyiQYy`(&3>LuknQ!go#Og-ISnR-b%(A2AvhfTdI z`QFs4lF6o??ypR}Dmlp1tCmMhy=wWv)T@>$rk?JvOucG3*wm|$M@_vN`O(y?k*TJh z?ypR}8hOnBd?e}%pS#b4KL5DB@VJR*(qEW(CjF(e9=|i$ui&q(o4@- z8~e$uPc}BqtWP%fty!OJ%s#I<8$4<21wY$*!EUx*@SUv}JmuD3*RMG>-R*B8e{a^O zIrX&5*X@^Y>2Udxe{lJcpE3Ex!jC3iEd1oG%WEB_&yzOerNiMP{OzgZrDy&1*YVLW z{`%|qs?%S89Z&u2ufL9;jx_aR@|>v`lV44}m~@$X`g=yEUQCWM^#Xa`)Cc!=E)4#avZtCgpDVch4ImXmW$cv_4LjExI5;D`&OUUo0 zUP6vF^^)?Esh5;LO}(VdGWC-3hpCs8<4nCOdD+yflD|y7D%r!-tCBxWy(&50)T@?P zOucIP+tjO;Jx#r8`ODO+mJ>|98hO>!tC4?9y&Boe)T@!dO}!d<&HsEP>kI$5&qF1z z)~gk}ua8n^(tVsoo$U+vvu^GWpJ@7@jlFLApN;9&I^Ov}Hnz9ve>OJ2Kfg(4V<*{q z!5g+-(8tyb_ObPXfwo@orrRF6e$ALp~Dsh5y5O}(V(^X1+9w<;+IoAyZ= zZrUg1EYrS92AlR(a)@bPB@3DMRdTjzUoAsS`)WDVw6B(hP5Wv&$F#4J`Aqv7In1=L zkwr}V8d=o6Un}{l`odzyne^h$lCR2Smw@&ByZiGH#+#Rd&o%wa#^yKu%f=2j{maId zHvP-S&a>@<1#J7^2-`kb#+u|pV!{wfA8_%>@Rzd|7Jd2kN^Mb zc)-l3SN-eb12dmq^{W_zY{P2H!Jn@<7|Gz%I_}tc;=kdlDZhPo> zs5#Z@-T#u$G?#nr9e;YaNALULzuD(wjp6qFsrSRU^PARep!d5N>-{XodcTUX-j8Ce z_nR2&{UpYEzlgEk4`QtMdl>8e9L9P-g|Xf*VXXHn80-BC#(F=3vEFZBtoIWb>-_@8 zdOv`%Uhi+L*Yg|e_4>woJ-)GCFK?{Z!yD`M=*D_Iy0KnwZmidn8|(Gr#`=A*v3{Rx ztl!5P>-VX~`hBRee!pm}-wzt=_i4uZeVVa;pJuGzhZ*blS;qQ(l(BxFWUSu@8SD2s z#`}2B=hNr&2U~j2PYf$kv|Ig`hASauOPn(`B}Ib-Vg0_i09!W-F#kjJYLq! zPc)~#bjRyTzAE2xl*^C2oXd~=mB}v_mN)TYVFhPhUhAmy{rSJDa{C4Td`7jjFX+!_ zR7-HQKc7)8Ei3xt^J*D&p=lqJp{9LIjxp_Ha*@doWSGeh!_>!{?$mZq~AaF8Girt^3?VG{?*8+YfO9nJulNfCTE)VF}c>{>+f}${6Nk! z`GH(#^7Z$)OnzL>Hu-V6-sC4_S(BfTb4-3hZZP>tSYB zUnMu0{AyXj{i=8SlPA@F0$=|D%(D|*uB5C|IMjt)4%4_B`&V( zpKqyg@yH{Li-irHwO;F}+x-6N?>~R-pKq#H@%yX3)bFo)Bfr1u%UpjXuRg%LA1$xH zr*a^CyIa2GQ?=!9-0~x@>Xsk*a<}}*ccA^ZXulfTUxD^_qWyPhzdG7qiS}2)SG)DE z5kA@F?g{O|(sg78rIMgRS%rZ;Kku3;3eUu;HBYZ;AP?E;N{^J;1%JO;FaN3;8o$( z;ML(Z;5Fg3;I-j(;C12k;Pv4R;20dhahUtx+x_v7?(Y(qPvHLe4&*11Kd<}eDzxw2 zU)%jz@BZ3ukN?;9*LT{_Q~WOYZulPfUid!ve)s|SLHHr~VOW13$3Nc2_4ja$_4jU! z_4i|ppMal)pMsx;pMjr+pM#%=Uw~hPUxHtTUx8nRUxQzV-+4mKZ8Gqzkt7lzkf|VE7RD zQ1~$TaQF!LNcbrDX!scTSok>jc=!bPMEE55WcU>LRQNPl@AvI~e~0Hoi689yIq@U> z6Z|v$3#`8f*j+!|za;c|=*GXpf53mjf5Csl|G@gRP_w)~a9_9|+#enQ4}=H7gW)0Y zeDM760`P+HP;3JD_{7gJ`gR|t-H#%4H`aIxG z{QbLLAGaxd7_OH(9NrhMz&DxY73FS!`{)C}fAF`DdQE@(sBiYSk9sqI`>1bm^(C+V z%sqctre&v&`yBoPzSXs_f8MFQE%?AkNS4kAIYolaIWO_fOw~~##^&@!FR*=`u!_P?N5IH)NA|wQ{UtFuPE6q z{QhbDURS@8FUI9Q>&7W=`)PcH+;8HI@_=zZ^Pscji}}obroXN7v*~ZEtYiAyDi4|d zwo0w(Z>!wz*DLA$uYNuCx_&+N!+t$=onKG=i0f}9Uy3z8VCw7ru%><>>zVq2JZkC( zk}~xJdCb%g8mIc(vt@)l?#ElRvESVFLE(5Q_B;Fs{3rYu{5Sj$tb22Re;(@t_l5hx z{ow)dKzI;57#;%82hR^L051p+g@?hz;f3IZ;YHv@;l<#^;U(ZD;icfE;bq`u;pO1v z;T7N&;g#T(;Z@*O;nm>P;Wgkj;kDqk;dS8k?RX^ig!?>2pPzM+zX9@}ME-ink0Jjl z&%^7ZKO4X=xcu<^Er{885WsOb0Vm-q_$dE)smnVWJ_bG(J`O$} zJ^?-vJ_$Y1y zz6!n?z6QP)z7D<~z5%`wz6rh=z6HJ&z73As&u5^&N7sG-wiM&3+;;AH3XxA8V&fCt z^Aw`^(BU?InODCUFVt=CeV#&}=3Q?b`f{6}-ofUlPq+DL{r$J@<99{dXUZ-=@)<5a zvi=@icfR(wnBCFkM?TZ#N4^UAZOA_h`TF~Qe*Mx|n_oKH=9jK9`K7vclV7Sk$K;pl zu66mkKBde!mmm3Dmmm2$lV2|C{8#ty$5e_5z5ddFy%TjUZNi!nR=<*`KDefx2vg_$_+R5QaSy-KDRv+g}R;H`btrKfm`3mH`)C31e>3} z(B`N0_x!r+>-H#QCc6B{7rFe%x43*=UNO6i%a44q%a433@^?l4CCIH~=<^$qz0#3qJa5Y>5kAOFXH-a~Y zH-R^WH-k5aw}5NmIyeQ_!)dqy9tk(X8F)*06x;-7;bu4o=i#m30$hYka0|RO+zO9| z$H3db&)fO5q(0xX`|})*f0JLk@nPg`(O#e5Y4X28{&vWJ0n5|pm74b7qWz1={|@n& z5dR+Wml4?*>nYJK#>Z3!VY*4$p*V!F#}a!h6Ac!~4Md!WDQwcz^f+_(1p| z_+a=D_)z#T_;C0L_(=FD_-ObT_*nQj_%-`^tE#h~->RSO=dbE`v`-=b7v!IS{MWI( zdbIx)?cYHDZ-~E%_|`+s{->@L9u1Fyw}H2Xw}ZEbcYw?Aj&K`17H)^f!QVLa=NheIFajfX>*z43799pN^(*)2ajzNPf}&i?Tsb*AfY z6we|55aj0(KNRs^+wIHk@s9WV-{p>S=X>z`@a28o?~{i4A0YlA{1NO{2j#qLi}ADuWqo*tNz>OSC2&eAH?57y+-7V zJ>FHnkNiG}e}H&j#6LtlgXQ%@{zu5~kNC%k4?z4A8?V{YF0W>w&951S_#nhTMZG5E z4@UlH$RC3E=ZMdT_!o$0vAp?_|0VJlK>RDj7exGY|N4;DZ0#BFnebWg+3-2=x$t@L z`S1nsh44l2#qcHYrSN6&mU@!H>gFz)!+Y!B4}_z|X?Z!Oz1lz%Rlt z!7szFz^}ru!LP$_z;D8D!EeLw!0*EE!SBN#z#qaN!5_n)z@NgO!Jorlz+b{&!C%AQ zz+b!lZ*)G~?Dpr8hr0c7uSp@6zqs?z9*!+e?ZGOW~Ha}Ce`I*IRe&!UrJ&HfO z_LcnTn4Ie3kxQ;#*{#$QbRKu$CD^#|Qe{Xmv9^#l3N)DL7S zQ$J{2+Bhl8SU3LamM{5ovGsJf{K#9oTba?}zfZ?ace3JZ=Z?`khj-JWj7KTD<#QUHdcsg??_nFSOpT zx{x2&`&EtgepO?=-pJHj-tE7l{mYMT{}uTUfB#f3GREH@si(Q?eP#Oi_RcTe_3D-B z<9C)dhq>PyDx^o2*Ba*LS402l*H1UgS^oY{y^X&-^$LD})j#?DRZkx#3v_RfLb{m# z%dejiIoq$V-qx?LUeT|w{@Jgu{@brtjLA8EJ@s~eJ@ra{J@qesJ@r4PULfb1dVy?j z>IJg0si)U(n|gtq=h{o5SW2zp@+1G|@+1H5jpualmihz!(>n7PtXsSLda_DkbiM50 z_gB5Dcf2l)&NOtm_e-T1R7)TCdpuGMilwqQ9t*viYahk?y5;HhTXikxd+Qr|N4NYa zzPh*mVf=4z{X_RN^-{SDOubaD&D2Zf)-d%_xqnQ(RIb0jK6<^|Sbu%gYx?V>9$@p+ z?KVHXmd#HOboqMyS0OXb)HI$d?vqCH^JnW>ee^;rMmfDzOGLxGtuQo-oWKY-o?br#ZLeIrq{zQ;J@B_J==x; z>#g3^f4$W)|Mgaj+rR1cUv(`DntG|+MW$XVH_6mXhTCBM-Cr=_xipov``o;V!=tUJp0bx0uV<^(kdKU4G;ZU4G;)6E7DR_g~*+UCYJ( z>#LsOzrN~?{MT3A*MEK0OPG48+$E-7D!03-m&)ny^>*)HrI<|R`k8vE+>&nnG+wBi z>G~ge6Ssbmm$LckSvEhtsm)I>?eZ&HKeLC+kGz@7kGzb_*X0$nd%FC{o4fqT%OZa- zNdzuxNp{_Cw?$<|9>X6vQ*xAoF#TQ5Dp)=U4^ z$BoB|b(zxd@XBs^m112>!{u&ykq>aoi`?Lr7kQvtUgT9=Jqha_=-NlFcGpi-ih4ik z75?(n2f6$xKGI*F#s~S!QxA66cT|e$lnil}VtQnHKKPHJZhYKPo;-EIVQ#z~dgw4W zo(??>KGQ8;n*H5{BsH+$H0r)|91ALz!!}s|CzR!>2`}zc& zg!Sa7=X@c&o}e18f%PqJ@;5~PHbVb4M*lWJ`%U4^;LYJJ;99s2PN9E#3e$5w6s~U? z{cAw`k#HldrwC?yYzdEoo8V?R2j|iMtu*65IlB4Y$Ih;W6+w@V4-F=>PWU z{|@MX8SQt3+fZ*T>b0ZZIJ6%R?*#7*Pk<-FyTCKizfNyHAbh{gLVx!_fA{j{E5iIe zQNPK}C+hyDv+W=+KlH(Z}q|c{#&iTZ_s`Gs}$AqyZvY65vE=sSDAW&JOk_RBY5=!S-{i_WJ6Og zE?1lOad{Tj-&gSJ#brTLFD~BiD`d#`Bdpz*FN&|aKY7!;=^3M$eWmY^|jZT_Vu+dz(rH9zIM2&rw@2=@0Ut3pKfk3 z&NOUlmRBrYZ|WCIFTz`!d=lnlx zuh(~(`g(nr$=B<Ky+ z!0y+xzFZpT{l1%o*5|*OxIQ1u*!z9AC|{q?W#an$D`S0rm9ai=%GiJ2Q@DKpc}}4< z+vNMtXA0x~^O-{H?**BB{rw(e|9MMczW%;WAAfu3^WBVD-+%s7*xrBsQ)vJBPoe$i zKZW+6{}h`2@t^+`#{K6%h4!ES6xx6OQ)vJBPoe$iKZW+6{}lQV%qJX*`HH99^-DUx z(ADuJHLy(y?6doilv%%FrFEdjmxPWtw*+5XUD=@ z_{$HZ^oqZHb-SM*q?&5I_gg8L8NBM9--RA$@@EF)jmxQ>tVix_ot*$r^c_z%)%pF6 zH_DBEf7P$SySVe?N=f63y7S}6ySn=7Ohd}lZ<3o#y(W1bo@DAb$zrB{lhnKIrS%K) zhTC3|C!6ILB<=F06rUNq>GC5_aru!OT)x&Tr`~e;k*Avca%!6IM5<||zrKk^x!GSo z_1o}n{`zWsaesZ)(_Q^aDUoStH1(V07E`ZD-hn$z{U%w$)NhhbQ@rDUVr>gq*)51#4wSM!(j`>USi>TCNd)Xq{CXN+(XXd2n0kTSXW9qy zIee(87syJcULc2=cw7!QPRJ3)Nh$iv&xqXbFHijie5BuA<172iS3l&x-^!g6pB);G zh6Y7LqRxqv$GV2!AaKfldTi2?szJt+|1w`zyInZhq?11 zy}oqX5$<{hz23Q;Kg63a4&#Tyhrx%#{`Ew9KS$EPUMRGGJy2->dY{nI8?pDF-Yw9( z1$wtY?-ux%w?H3neyNmCm4|!R=a=O6T;h@w>a%uTmDlH_;~Mnmhk?mH~YHl=R&{bzaRDfscO@{ z)K~+LfH#CUf;WaYfj5OWgExn_fNSA8I0e_kX}AF%2{*zScuRN`+yrOgW;h4u;jQ2T zT!c$-3+z9ytW+#D`p+v1?LV(9wEw)a(EjtvLT`)u{`1Phxc|Je(EjtvLi^7v3%w)i zwZUWIc6b~-9^T2gwPjcD`Y#=yw=L^kZx(to;>#mG1@RRSpNja3h)+X&CB&P(6+5d*|?cs&I>sd5DZ3&#OEROS)g>n9|2)rn~7<}|l@Ay|NcOK(iUsKi& z9P3}tt3J-ZURQlQd;)wTd=mVEy`Qk_dvAVS%Xh8qZI7@&>ks#j#~tN$y!8p=>%!~7 z>%$wsF*tzZ@Bp*FE_V&`UjMS5P!9FS6Y3-U=cTDv_m9Wwb>Ma3^@e+|mu{a|vAtHb z_gi+IJk)*PQ_>r9Pk~Q`PlIQA@3+pba@RKg@m=qK``$mEt55UK$Mt@=)19R>I@5fH zaZ~dj?)WaHG5Pe0?)V=0FU0?bSM%>D)%NSbDS!N@@p^bUao?YX%bx`6WL?kqYhher ztTRc*i@|H6KWoA7V|_k=KZFDHKMp71D!3Zn!`t3E9v(9T@fvsp+yIY+<5=Gf5q}En zw-4eQ!C7qI4C-%!{7vDCe>~CGb9J=;2>tmO{sjIM{sLYR%Rdxe30@gq1>Vzr9xGjX zf9YPHThx2|*82hX@vS#A?CZHp{fz(mcePDl%DW$3zYd+gtv8?6Qd=nf;LWFnKGXX= zhkn+p*VWuLx#E^5EzRZ9&Tf1!EycRp3D&8J@GjQ%`}y_C4Z#7{iGz$=0-ew6-+dC< zQf^6n|DVSF^NC*}>G8=2-gqJ$k8pgV_ZRn!zr*o||9ffwtMSQ)UcKJ&$-IwG{@unCz3ba^ ze2d1P|I@dJ-k;gCzZjh>rY>~jZwamU@0<8k?|dY&wZLVKNk9QZ+mN}^s4YIY`;r~ zNx$xMwJ`rOY>&&~E8zW6?@H9W3i(&V*TC1}^}G)8>)`{j{2Q?R8~S2u{Y9>{y9qX)HN*GSK7LPU0CS_SjNjGN55*W@ct) zW@ct)=3A}U?s|Xsp0nScGxs~Yd!;{i_Q_jSU0vPkw^a>(JX>{9TR+L7;;8x~Q)PA9 zuhgHye)X4YRTS{ss%vNYl)J!>=cw%V_EPa@;1}VS;iutWx|r<+>|f#E;NRgt;6LHN zV3i@4_lnt{NW{Jnz8RjTjQYC#Wybi`ChFE+4riF-S5*_tbe$}!s;TViS~<>goh(*0 zmFtY<6?;6M^>8!X0`CU5!fkLIPQV-BjqoOTGrT*z1>OVR6W$Bn8&1Oe!281c!TZAp zzz4zy!3V>Kz=y(z!H2^~NLxq3N5MzK$H2$J$HB+LC%`AdC&4Gfr@*Jer@^PgXTWE| zXTfK~=fLN}=fUU07r+<77r__9m%x|8m%*3AR|s34E8(l)tKn){*V8{wPa zo8epFTjAT_+u=LlJK?+FyWxA_d*S=w`{4)R2jPd{hv7%yN8!id$KfZWtta89;HTkd z;Ai3I;OF5N;1}VS;FsZ7;8)?-;Md_d;5Xs7;J4v-;CJEo;P>GV;1A)C;E&-?;7{St z;LqVNOj{n$m+)8c*YG#+xA1rH_wWz!kMK|M&+sqsukdg1@9-b+pYUI>KKsp9?Vn;j zUR~e}I1}y)XTjNU4x9^jgS*2$;GS?VX{$Hf2kr~^gZsk+;DPWUcrZK!9tsbGhr=V_ zk?<&ZG&}|#3y*`x!xP|%@FaLLJO!Q#PlKn!GvJxxbJ~$7~hYR3B zcrH8-o)0g87s89+ZQ#Z5wr~+#4Ex~#TmqNEOW-m%2rq?~!R2sB+NyxVa611R$A6Dy zrSrcr9y%YU^S>OAbp99PVWsoG9FKJVH^;;Br1QTVkAJoNAHn&+c5o#eg=26Pyd18E zYv2{|N_cyC2Y5$#C)kE}hHK$fa2;F^H^8gmHSk)v5#9yf6>fr`$nMuh%HQzbMiR?hW^W`?^m0{iU9M(pGikWu zN5MzK$H2$J$HB+LC%^+lf5H{n#`Uzix@bcVJkTs(sw%E9u8-BNNtE53sq#C<)A1m) ze3_~k+_iK6SN>(uk|AciT$S9C>Ben;d2py%zI<6=m|I@?%a_^1T_^paaA1UMQ+QD^>VPcYU<|>Z(koGS%?ZD%G{tStpv~7j1~21fL9_0-p+>2A>X} z0iS6)*3fnqd^UUzd@g(*d_H^uJjNWa6)Ld@J;Z|@GbDI@NMwz@E!1-@LllT@ICPJ#`XGuUAOiHH-9SarWwlE z|7?G_yBKeOqzBv+zE>_Uav%JnSYCbOOTw$0UWQ+R$9FaRSJpTIo(NBZC&N?Vsqi#- zIy?iO3D1IO!*gH{Y{6dG2j{{0@cmuP@e76@fFFb(f**z-fggn*gCB>VfS-h)f(wj% z6R?BPLU=Ab51tP%fEU6~i{&>p^b*IDriNz_?~VAgi1$JKImG)S{ygIS5Pt#j{)oRS zzCY_~UliZRkpCt4W%w2NRroddb$F(6{V8CF{I7}rgiBv{oebFFibZ074YzCqFNU{; zi{N6|4+r29xD0CD_lZn;d1f5dY+dwo}d;@$Vd=q># zd<%Rld>ec_d4E-d=Gptd>?#2`~dtQ{1E&w{0RIg{Ft=$IQ#_sB>WWoH2e(w zEc_h&Jp2OuBK#8kGW-hsD*PJ!I{XIwCj1usHvA6!F8m(+KKudvA^Z{iG5iVqDg2qV z_jC9Q_)GXJ_-ptZ_*?ip_gZ_)qvRSpQgbe-GIaZx=WN z&V;+dS#UO-1Lwls;O=k_X42rq)SffvKu!bNZ~?1uwzI{%B~sg=(Eay-)cUyO%0o&V){r1QTR4_`X}%kfC( ze=#0;|7!Wa1m^>#@DjKT4#G>}WzzZOa0sq|!*B%N4z7fwa15@3m&4U?4ZH$g32zVY z0PhIz1l#b=a4ozFu7m6026#2R23`v{!n?q`N*6T2>)`cpGu#622Did(a2!s+8{m!b zCU`TvJG=$n1Ktzf3*H+}!u!Dc!u!Gd!w0|z!Uw?z!-v3!!iPy09u6M?9|<1?9}OP^ z9}6D`9}k}Zp9r4>pA4S@p9-G_pAMe^p9!A@pADY_p9`M{pATOEUkG0WUkqOYUkbnB zUeD0iQ(GI}gx``*tPwG>g zV8?4OK>S>IO0F#LgJ;8Gv>$=DgRjhz?Oz374POIa3ttCc1YZna0$&f`0DmeREB*}r z9R33S68;MQTDtxl_*?ip_gZ_)qvRSnmzS{u!(90%yRP za921B&W3Z~T(}$D9qs}5gnPlg;XZI*xF6gf9sm!72f>43pLB2tJW%A5SZokH7#;!- zg@?g!iTgX^o8E@sf!~GS6UX~RZG$+UNYt)|*TCQXwV#OPZ>-&4Y>(=|0q}wFLGZ!w zA@HH_VesMb5%6y!A8l-S4L(wqUv?CHG<*zvEPNb%JbVItB3xzMk6Kcs!pnsN{%T`; zl@!&KzMiAsxYYhBDT!3RX{?{)x8S!?{$0f1gMZI)@2_rXXtD3kao_Lc_#Ro_o~2~@ zdr|&Aln)#GlkTrwW3F%c^1!FY`ASJeQSk~h9#w&r?sz0iqF%MVuuttEoTqjajs$ly z+lzUWEo`Zs&GIp?sulLBRl<3y&a7YKQT4)>YH-V|lA2iMY9n6iQI#FrGX3B52&6|K zJp%u~N8m!^d|`EMQ`=|8@wv39JoPXBls)$8~9uJd-w;qLdoSXhd)98 ze?Yi_?U{SC-a;l`8NRr|R8cjETGvVD6$ zcz^f+w|+7hQTBntUUiUk*}-Q0h}S*@K2(%1Q-_)HO27ATY2O{j{@K`8+<1gpU!Ol8 zDQu}f-St<&STugD9-l0wXHoS>KfdRE(P+={aXQ{j4d{%&g!u6~o~=f7#EV{*@uCxS zykm+~w^#HE;wS2O7uC13{;P=V=jZhD^{lS`IQ3scyhz70-ToK7j`$Zw{?PU7zl6Vn zzlOhobvHVn7uM|seW{*xPyMgsywv|ot+dl${kkAoe(S@rJvz(l?u+&cbfioBl(JJ_ zKYl9Wg{hib|H+B#ADbdR7xllD{SSTzA7#uhIPDz`9|Io?9|s=~p8%f-p9G%_p8}r> zp9Y@}f20SnV~F(ntvkuMU)%A?@G0;xW4=e1Uq2ik0gr^gm*XA%0sayG3H}-0sCSr- zDRw)dFODeKW=~OP`(cF zGtvH8@O-qt0IpB9*ZF;mukP5``rn=LI2-NhuU6;%`A)nsM~qKm7a30^QcdTkmZHli zHb_@(OnK`iA1A&^#uJ-U?i`QA?(i0r-xdAY1Mw!r*GX5cNB^7Q7I-&!&(!idk7tQi z*?vNggn7J4=rt48HO=u&?3HRS^(Az+ME`jsvg^)(v&`|g?BHUvKbGCLNDpnt`wMjYZQCOLcbm)qS95B^{TuzyHmR>h z`|(F_zZQpzhwp&z zgztj)H;;dMc?ZA;!gr(oJ@93zRonW$5WRl!d(G{keILqSo+{rt9`XB8{sEL9XO6dS zZ#+B!o@kE0EJ-k5F1eRf?ubv)TRg;K8FV7BM88(LHQYy0`F z_7?37)o1Jepq(SzTer84cU7Z1;_F&c$HVsHx6f|rEz7s;mO5cx*-^fw58|z;-&e+4 z+jP8hfA-m}aqSE>p`*Rl)8+ca=cM-6_TL{qJAM}8`KkEij{5OYa(VH2sd)STpzGg- z`oq!wJ&2Fc@l56IZ2xY=oeLDXs;o1vGn1Q-_41sN>ij*S{h+x&X+H!%3_k)t3O@$l zr1NJ+$L~4a{w?PDgZ5-||J1(I%#S`h(M6U|+=X}s;@9YW+qr&qcJ19}dF^Xc`FQJ; zV7c}^h+ik`uew*pSKVjaFQ@C*U$4t&wBN$x_Kn2M)1x^n72i1?eS zc>DLK&Te=}#v2BvwrBhCyUt$wu#B&LM7r!z>Bh(4$E91IfS-itq?X^=zvxpk9`)#W zR{MO5Ucczmh>zB*p4IVtzRs??)!d%iw@D{%hYvCLpZZ2S)4hI~EDu+!kM;QFDCbwO zO0KJITtD2no*U900gr@7!K2|Z@F(W`szODnJ zwtqr(iIV=g?tJ#Tx`aI-SMPr9AIAfY`BTS(;KA?^NGzqx*uuJ86&djsO%8T0cY9nZ~`^}E5_8S_(4`R<5Ev)d;}bRYEVzKUbU z^=QXc@N&2su7Ov;E3v%o5#Isc5#9;5;ho{t#(b;2uC3*K_xEeEA{IPx2 zx>4AtZW7K@Hw)*hTZ9YLt-^)sHrFa*6-94%os3u^&mGd%ou<9Yx=Yxj?iRMxJ;Gjf zudq+uC!DA57tU7?2p6aag$va~!XeMY($*uUead=N*rOg3w$$UoUiE~qPdzD|r=Akd zS5FHUsAq%=)w9AO&vVk&^QQBZ^@6ZRy(ny{mxR6QWnrIsML18rDx9xg6E0A%3m2*u z<9HFto16cJh=)9HN?UK4&R5pk!XEXGu%+G=_Nw=Ued>MTJoSNazWPwOKz$@!s6G}B zc|MW0J~dsStj~l!>T_XBeIe{sUkdxwSHgMfYvFwLjc|ebR=7}oCmiy8FKzu`x=>j^ z3VYN~!j}43*sFdK_9^C1=3nMZ=3kvJMSf=f)%jAynU8h86mjNboi9aP|I!oZ2l~p9 zu+E>Nyv~=Y88_#Y!pYzNY`!$}nN#1)XO7K$=2+)5u{<-MIdT1c+L|oe`?DMTq;Y@0 zQ~p)>Irx7&pRYIi=j8K~;a%We;U+kp&pY>5onO=WJe|*t{UPsvKc8Qo&gUKZA{i<8 z&&%h(iu|6ZeiP3BZ~k4x3)CONh3Ze?kmoOHOYgnzcwB8z zb%%SI<+XdePDUctp+2sa9IQxTtu^Uf$ zTf~c`ON*t0e%Hx}etsk1w&%F4M8qvsD&khz65%{mCS4YE>+8Ffqt#2{Wv-Kz#dB4; z>3~wdxqmM}wbs|hf7kQR9oIi98*1x&xZfAm+E5qYV9Z}vmMqa1*i`C@ne+R{amZ}H zq(b#Feos`EL`y2ncu=XZX+8TM5w_HJrfUMKx7(j&)GAPw?s%xE6^%vR@+#^ru8Il! z!&PQ^Z)Ndv>5^*K$*8w7SmRo^7Y(g|S4zjW7mgM0;99pA3+^avNBfxTMd{ zt88I^cxSi1iux*xYo$w8xlZbMu+FtE9}U&R4brjI!m;8tu628{;96lj+GzGKuefR# zVShNC|K0h5bpB80|8)L$^M%f@`RV*`{JyD4=l^v6@7y1BzW(>m|GT>93o4pdS==OD zvd(o<$Ajx#>+;c1Gu$E_+f6uD-0E7l7Ynut+tI$}`If%TB5t0q6a@ka>5{R={Ss0A z2j<4X8{G2AXmM5PM%T*mCfCWRo=@oKo)0IZB{8+xjED5|Ov3tkCSkAI!?eCYy{Bsx zjre1G2?vVy7LLY}?szEMj>hgXuD`d%TiYVp?)@5V_PXXx+3x)sjyGq!&(}HL9j-+E zJy3s7l-~>1ccOLPAL6vH?~mAe^OOF4;rL#Ze*o6^ONjChV)+lD{KK%mpF-4s1ocD4 z^Nvn`9!34fV156EXm6Zx|BF+9D%$H|-0$MV_5B&5eoxfzh4P;m+q=zP-#jJTeSd=E zsmA))`X8nl{dGJYo&nER{I@=G|l+;#$|Y{fC(_flk8#TwFGLJe@*it8%*1zu$b?@iV z$D4R#gELXkK1CUCT-TtB=ncH}{#wT;oAt{*>J(v1ooZTNz&y=ZzgT#aRbwZGydMBN?{+*N%Rj(){!6FNic30fUe@F9_&~%D zf)AFC9s(Z<9|j)|AK`8vy+0NQpER!L7l*^;U5xx*Tp6=7;7qtHoCQxX?oTX^M(k`O zZtH)z)a;M;62y0hv)$_>s<TS$Z|CpN=E4Kb_4_~b_h+|0U+w(;*{k*Z za>w&rj&C*h$MoN)Z5w0mANudpK5NXk2TJV?&%w_d*XIJkXweqq`MUpvzh^r!S3e%n z{t4K5b0@)N#`nwld$;=U(RN;saJ&>=2A9Jj_!2jN>-X&y1+Ih7ckeGx#cx1-Xvf3O zdL5kl6~^GVF=JwO^N;nF~P`?VU7UgT}Yv2{aMS+#@_V5nyj_^*f4et!s!mHpq zxE^kRSHo-IwQwW63%o1b1h0cn!v1hFdVW@e1`FR-PwN@V0$k@f3|@a!^Nn7 z7}`Gq%Rdr63O*Ws%Xt3C>F?X{d+_`42k?hRzHr)m27V6ZpEsUwamv4dcm(6oO??0B zYWEiLy4obX54`W+Z1y*8Gavl-?fK7+Pe*P^|2I7X=@Iz*M_{4*K0W2kSDbD9K6U0Z z#$rC>dX&G|IKOquUjknWUkP7@<=t=04?6w1!hIiFs(*RL^MKCs&PDkl#(bkw|9rH6 z9m?N`_(-g86z#1s=D&6O4R09pEsob3^Tm!E;a%We(cU{~uLd8hqCl%EUFgXhDRF+c0H=Y@a8^2Q)O*xi4U34K4} z5W`j4Lrv@Z`-Yj;*Pn+QPH3NGUcX4xww`5N->538jLkE??}^oR!w9#&s;aPKBTd_- z)@W(pSm7#bytMCZcmG$*!~WPrH=f*}Z@8Q!?DJN+#}^%+t0uc~wIRN_Ws2+M20b8C zg?-*>!gJL*#`3EJG5cyauBsav*SrMBlzV-2qmI`Y`OfhQBfmM`9-e~wUmN+$DZdQm z%i(j~{wAxJ#r)^FR*uhyryKp>*xXuwfg4X&S1SK}W4@?5W?Kv3h0@+d@HX&bX`h}P z>zp6c?fdGD{Y|^zLSuic2}k`ijql&e6?Vlecs4u-_DF{<>4;Z4_KcBlo$EnEf-iW5K3g7VwJmFRC2@fbV-%d5ijmZN+%T!ZDUKzt>~ z^O4w}c0~I-p}Y<64A;VE;COzM@%zfz-)=U3-#ESnz7@V2J`=tcz6d@KJ_r4~5dFIW zCAqng&mYXTUSzS@4zU&&99@<@NDX9DfRp z_dPlN(=T%q#~=MBIbnTeSa>8n3f6Dh6XnOiW8n)he%E6E?u+uj;COi(>R*QX%qKdZ ziT*JkF`u1{@^@hWx)b)JKLPA7B`9ACFM-S8AiNY_2A9JjxB`AAOCE3DGw$zm_LujK z`}-V!0DlPotLJOW_SnQ9?*E&Co_WmF8 zvuID}XR$ua&pIEA^32ydKa1rvKkIxf>N8*K{4DDK5BXWt*ZEoWm-$)eV^N;@TIXl6 zy#FCTi~2f0i{<^Z`B~><(cTQ?Yn`7(`~PfyF2(WhKixdvNn0L||L*blyU!YeJoYF~x|8Sv9_vBG&7p=Tp z?EASmou%KQw86D$TwKK^*LwhSlj$n685Zs||Ri2Ld=VB()6(+Us5x65oRGww}nyGp1Ygy@n>nfu1b}ZAkvM|r& z0j2OW5PlfF_?SJfUe*7Vn*^L6Ns6JrUsJE@dwa|?B5;vE@6YM;rikoOVsNqN#z*~p zccyQVkT;YPxRU1{UXlw;Bkbbsnwm|j0cSk7E^=9mkhJCA+bbp-;2NF_a{fMQrjiml yp)|oYJ@?YjC-tPJ+#_$MM?L}x^bELy1?-oLT7(j%D78%&IC9y2~u zdYCBv87nM)*wroReg70C(uU&=^C&SPvgdQ(^*s0&z~P(&Bf7Jye&lz1C#V)c&bb^$ z^lUBqb;5%fRSh&b*Mt$h*B1RcVc??r1-P6uGfaqXYs>wz1hrS7&AB#==xJ%+i|8^# zbqWNW3t&Wh=56H)j=a$1?y=P8TwgNacb)&UQpbb%9QFoCIhVqSeif~kRtGyRV}C%+ zIc=r}yLOeM>nw~=d;>u*$56vfZjLTRfgsJxM4E7S+I15_(d38*N~YHJXRb$VyojyUagW-3K6Kupjm z5kUz;hyjBMsKIDLqNr#LAgBQYF{2-#ga98zq7Y(96mhM4&m}Xv$A7@%O4iJr*~5qX zW1rVPrBmJ*4h+ruCOjE zor*ncA4I?IbAwW60O(rnttMbPX5yFt$M#4v-OynlL-H73;OFBgaEzlpN_!UCCNVA* zjF0I^YEgrwo%{Hn0fP$;U|4v9V_l`^%rNUBFokbJURT6`4u@j&%_(+8{=skbCEp8eKGylsmn5SxfJU3+Lo4r5Dgc{JNkAUM4;G#Fwm^m^g<#FU9yq+(14v?oWbX=UbJ`;Kt z{rDFED$zcn3p;Y%&A61{XypKT_{FZGF#7dIaNGhw!?h2Z3OhQ6w;W}0j60U*q+Z{adl5<+mA^B1hK4VQcGV z)1LD8Gl!9UbpXVABYh7GXa>o8B!6PyXx+}R>w$YaCZYZ~9!1+lVA4l>3-Xb5+!1iL z7?&bP)*sXHM9j|FTB#W){C<51{W<|aW!kkmA30`bi*czOj#iG2O0B9}HE-~)Oz0Rm z-UmRpX>XSWGYyY%seohMlt*hT?OTF-IO6O4eEb3X8O}4@Q`3L4*kcf5Qo;C`T@SY{ zErWXaYQQOkaTUSy#}bxqGcHArJm+#!;n8D8+c`q+Sn1b$)?rdP2|!Fk`XCAtgYn)9 zXUmkPf}?Gz=-~;@6*|H36u!YQ>G}14sZ%g66^xJiywJKe4|xRVg%>bB9!2{u?E?e- zTH|y4QI;5&3OL4MZn7<5=R~vc%YOO1m-0xSQq=&2V?xib$^wOk$GDW>Xk|V+$E%M` z1jmu!*a<*9Yo)iMUvu8s1ZRsesbGBc&t0t?9@WOf{yg(N_Jy27inPy5Sh~%)RFIDx zA1m#guGP5snnC+fH~R_W;}!tAQ+pHYW?YI-hqJ}F6gfJmhd)+}g?QcEiYZlL`IG;A zdqmR;Z$Gmd{dzy17SoI8vjfbJ&bU;-QJ*VRH-{HlH`%;(f78#Gk&lP+Q4h!3XAmIK zHE&B=ew#5V$uUxGAIG`w2j2P2C2*Vtj$C`w;U^_6zs;DGJT7H``DRSg}T-es@ zkE*MGv3Cz354p&xrCd9Wwn>aj1swI&M=KYQdFTCmqyw<-NdnMF?I`NuCNVBWj^bXk zb$gofsgIwn!hYru`gAP-5g+{qH#3mTKNH@7qtg<1<53F-M{o-2W=pYtF z#JH5;Xk9LnN8YTm{?*9G<>1Dtg<~W=AL}6QXXLuuv^*zA?q`B^cuR+Um+eo@S?TR( zToe{pU~U-(cJwY5$PHpliX3@vnA0@9n#l;sx~*v% zH*mCW&JH*(1G5sC!y^3>UkoyRox?F1YmTSVv7}`wdF-^Gk28^IlfezcqUZU#jw{DQ z#-+?0?MlgjnwsctOw#(&&Q^r4mz7EP^0dbSoNzAc?J)cxwgI+W7zPnX{bpbwb}W{=+}B zlP~*leta|E%$bQ?s?-*xO6!$U%ivmgy@Ox>%L)SjPESwA(&^4*EYa8KTJgviJmkhF zPA@!Jal$!SqSP>=)!JWNsT78Xx>tOIaj6i;Z8B;}zwX_#v4OmE3LLlMk+0SsAw+{1 zmpYGp?8>G);iwx+TA7l&k51p#cjhaHEIzu#%RwUiutTXiXkQS}OnC7%7364RN{%jx zZ94y_$MFO3DA&Gcz5uAZj7uSvgB+uYY{t5r{H@_>_1zyH$8W%6uJ*SJlwzK7-4GPx zQlg-D7tjj|%DrouN@AvP`J8yy4 zewce|IyJ-kkuj+vN5Zsob}X(R`%qM#10>cJy8juaYS4}gXtM4w9Ok%9e8ZBit}{(| z+%$~Wjs-_e3vL}l6H<|5ZdW>P>%eaKbmG+)^G-X++=+2rhnBwU<`Al4hcT%F$8>+E zyK+S|8FMqK#`W@FW`AGj8)Ep0D zp_srN$+bA$`lzJk^%;{YaO6g&lfNu2G`e07fnzQ5@p?d_t2D4B0vcmdf}@>W)c_N%2wJ#mSxV|4x`!U9K16q18 z;+@reE+{Z2<_ zzwVBA_1k!zLcR7$@m>ng0y(znuL;p0#-wh=AHp2%OGkD5^rknPyn6sV>*6&EdL0j4 z4bs;vLJ^K@pQCH(eTtR?lU2Nr`xEl-N6_)_Qyjtp0{1oVgot@@@u$MMg5YRZtp<=o zN4lE!oy|KNk$>ap^SG7XXId!g7@CmE(c`|5>z)o-~Ouso?zR-P^Meq+UP1jzoJ3fLLp2 z&W|QBCPj{XPXR~c@pLAYw09legZ1O`0HE(n1D%U}G;nk;@|D>a*7?{CjtB5`+z!$s z$VbkFe0LEPV^Z8J`txHtmWd_0Evz(Wde8au<8JU^8q&j9D3;;}uPZ__r75ql2#)qm zkb(US&!)MprtdQ)o{pgjDOhKC|It2(z%g*FWo$>@SzPYjN8vSG`oS4Eny%^k^P~6v c(MpO+>Gu>bVSXG0zk2P5OczFV3{6P?0TL#g(f|Me diff --git a/source/33.txt b/source/33.txt deleted file mode 100644 index ad7917e..0000000 --- a/source/33.txt +++ /dev/null @@ -1,141 +0,0 @@ -#define, Keyword -#elif, Directive -#else, Directive -#endif, Directive -#if, Directive -#ifdef, Directive -#ifndef, Directive -#include, Keyword -#pragma, Keyword -#undef, Keyword -(, Delimiter -), Delimiter -",", Delimiter -;, Delimiter -abstract, Keyword -__abstract, Keyword -alignas, Keyword -alignof, Keyword -asm, Keyword -__asm, Keyword -assert, Debug -Assert, Debug -async, Keyword -auto, Keyword -bool, Keyword -break, Control -case, Control -catch, Control -cdecl, Keyword -__cdecl, Keyword -char, Keyword -class, Control -coclass, Control -const, Keyword -constexpr, Keyword -const_cast, Keyword -continue, Control -cout, Keyword -decltype, Keyword -default, Control -__delegate, Keyword -delete, Control -do, Control -double, Keyword -DWORD, Keyword -dynamic_cast, Keyword -each, Control -else, Control -enum, Control -__event, Keyword -except, Control -__except, Control -exception, Keyword -explicit, Keyword -export, Keyword -extern, Keyword -FALSE, Boolean -false, Boolean -FAR, Keyword -far, Keyword -final, Keyword -__finally, Control -float, Keyword -for, Control -fortran, Keyword -for_each, Control -friend, Keyword -__gc, Keyword -goto, Control -huge, Keyword -HUGE, Keyword -if, Control -inline, Keyword -INT, Keyword -int, Keyword -int16_t, Keyword -int32_t, Keyword -int64_t, Keyword -int8_t, Keyword -interface, Control -long, Keyword -LONG, Keyword -mutable, Keyword -namespace, Control -near, Keyword -NEAR, Keyword -new, Control -NULL, Null Value -nullptr, Null Value -__nullptr, Null Value -operator, Keyword -override, Keyword -PASCAL, Keyword -pascal, Keyword -private, Keyword -__property, Keyword -protected, Keyword -public, Keyword -ref, Keyword -register, Keyword -REGISTER, Keyword -reinterpret_cast, Keyword -return, Control -sealed, Keyword -short, Keyword -SHORT, Keyword -signed, Keyword -sizeof, Keyword -static, Keyword -static_cast, Keyword -struct, Control -__super, Keyword -switch, Control -template, Control -this, Keyword -thread_local, Keyword -throw, Control -TRUE, Boolean -true, Boolean -try, Control -__try, Control -ttss_task_init, Highlight -typedef, Control -typeid, Keyword -typename, Keyword -UINT, Keyword -union, Control -unsigned, Keyword -using, Keyword -value, Keyword -virtual, Keyword -VOID, Keyword -void, Keyword -volatile, Keyword -wchar_t, Keyword -while, Control -WORD, Keyword -[, Delimiter -{, Delimiter -], Delimiter -}, Delimiter diff --git a/source/app/app_algorithm.c b/source/app/app_algorithm.c deleted file mode 100644 index 8714b19..0000000 --- a/source/app/app_algorithm.c +++ /dev/null @@ -1,1005 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -/// COPYRIGHT NOTICE -/// Copyright (c) 2015, ؿƼ -/// All rights reserved. -/// -/// @file app_ALGOration.c -/// @brief app_ALGOration app -/// -///ļʵֵĹܵ -/// -/// @version 1.1 CCsens technology -/// @author CC -/// @date 20190105 -/// -/// -/// ޶˵汾 -/// Modified by: -/// Modified date: -/// Version: -/// Descriptions: -/// 㷨 -////////////////////////////////////////////////////////////////////////// -///#include "app_calibration.h" - -#include "app_algorithm.h" -#include "app_flow.h" -#include "app_paraid.h" - -////#include "app_rfSend.h" - -#include "../clib/Clib.h" -#include "../clib/bit.h" -/// - -#ifdef D_buf_test -U8 test_buf[]; -U8 test_buf2[660]; -#endif - -#include "../bsp/bsp_power.h" - -#if 0 -s1 һҪȥ -s2 ͨ˲ƽƽ,ֵ -s3 ܵʽ㷨 -s4 й - low=0 low=0 - ```````\ /````````````\ /`````` - \ / \ / - \ low++ / \ low++ / - 0 zero....\.low_zero=low....../..................\.................../........ - \ / \ / - \ ___/ \ ___/ - \___ / \___ / - \ /high++ \ / - \___/ \___/ - high=0 - low - - /`````````\ - / \ -__________________/ \______________ - -#endif - - -//>>>>>>>>>>>>>>>>>>>>>0task -///L2_task_C2_init(); -#if 0 -1 ֵ -2 -3 㼰 ֵ -4 - -1 ֵ -2 ֵ -4 - -ֵ ֽ -0 ,0 -sum, 100 - -x*k = Sum -100k = Sum100 -k=Sum100/100; -x=Sum/k - Sum -x=------- - k - - Sum -x=------------ - Sum100/100 - - Sum*100 -x = ---------- - Sum100 - -U8 L2_task_ALGO_at(void) -{ - - - -} - -#endif - -vU16 L2_line_algo_media(U8 *buf,vU16 len); -TS_task_ALGO_ ts_task_ALGO; -void L2_task_ALGO_init(void) -{ -/// ts_task_ALGO.status = 0; - L1_task_init(&ts_task_ALGO.task); -/// ts_task_ALGO.p_buf2 = s_task_GC032A.buf; -/// ts_task_ALGO.t = 0; - L3_task_s_go(ts_task_ALGO,D_task_init); -} - -//>>>>>>>>>>>>>>>>>>>>>0task -///L2_task_ALGO_init(); - - -///L2_task_ALGO_handle(&ts_task_ALGO); - -/// Ҫвɼɵı־, ֵ˲,Ȼ(ƽ ֵ), -void L2_task_ALGO_handle(TS_task_ALGO_ *s) -{ - TTSS_Task_init(): - s->ok = D_clear; - s->cali_mode = D_clear; - L2_task_go(D_task_ALGO_wait); - TTSS_Task_step(D_task_ALGO_wait): - - TTSS_Task_step(D_task_ALGO_median): - /// s->usSum = L2_line_algo_media(s_task_GC032A.buf,D_pclk_per_hs_570); - L2_task_go(D_task_ALGO_updown); - TTSS_Task_step(D_task_ALGO_updown): - s->usPaperNum = 0xAAAA; - if(s->usSum >= D_paper_EE)///ͷŻǿ - { - - } - else if(s->usSum > D_paper_MAX)////ֽŴ - { - s->usPaperSection = D_cam_top; - } - else if(s->usSum > D_paper_150at_bottom)///bottom --top - {/// - s->usPaperSection = D_cam_150at; - } - else if(s->usSum > D_paper_00)//// 0---max ֽŷ仯 С - { - s->usPaperSection = D_cam_00; - //s->usSum - - } - else - { - s->usPaperSection = D_cam_erro; - } - /*** - if(s_task_GC032A.buf[4] < D_F_low) - { - TS_paer_value.r123.work_mode = D_ready; - }else - { - TS_paer_value.r123.work_mode = D_clear; - } - ************/ - - /// 0----0 - /// x -----usSum - ///150----usPaper150 - /// 3000 - - s->usPaperNum = s->usSum*15; - s->ustMP = s->usPaper150 / 10; - s->usPaperNum /= s->ustMP; - /// - - #define D_debug_add_send - #ifdef D_debug_add_send - PrintAlgo_D_send_us(s->usSum);PrintAlgo_L0_uart0_uc(0x09); - PrintAlgo_D_send_us(s->usPaper150);PrintAlgo_L0_uart0_uc(0x09); - PrintAlgo_D_send_us(s->usPaperNum); - //PrintCam_L0_uart0_uc(0x0d);/PrintCam_L0_uart0_uc(0x0a); - #endif - L2_task_go(D_task_ALGO_wait); - /// L2_task_go(D_task_ALGO_cali_mode); - - - /************** - TTSS_Task_step(D_task_ALGO_cali_mode) - if(D_ON == s->cali_mode) - {///PrintFlow_L0_uart0_uc(0x30+s->cali_delay); - L2_task_go(D_task_ALGO_cali_save); - }else - { - /// ts_task_FLOW.t_stamp_set = 5;// 20s * = - /// LD_gsensor_power(D_PowerMode_suspend); - if(D_cam_EE == s->usPaperSection) - {PrintAlgo_L0_uart0_uc('a'); - LD_gsensor_power(D_PowerMode_low); - L3_task_s_go(ts_task_FLOW,0); - - L2_task_go(D_task_ALGO_cali_wait); - }else - { - L2_task_go(D_task_ALGO_cali_end); - } - } - - - - - - - - TTSS_Task_step(D_task_ALGO_cali_save) - if(s->cali_delay ++ > 8) - {///PrintFlow_L0_uart0_uc('c'); - L2_task_go(D_task_ALGO_cali_end); - }else - {///ʱδ - L2_task_go(D_task_ALGO_sa); - if(D_cam_150at == s->usPaperSection) - { - //PrintFlow_L0_uart0_uc('a'); - if(s->cali_timer ++ > 2) - { - s->usPaper150 = s->usSum; /// - L1_Iap_Write_us(D_paraAdd0_paper150,s->usPaper150); - L1_Iap_Write_us(D_paraAdd1_paper150,s->usPaper150); - PrintAlgo_L0_uart0_uc('f');///PrintFlow_str("flash", 5); - TS_paer_value.r123.cali_timer ++; - L2_task_go(D_task_ALGO_cali_end); - } - } - } - TTSS_Task_step(D_task_ALGO_cali_wait) - /// ֻûжϵٴεûſԵؽcali ģʽ - Lc_delay_ms(1); - L0_mcu_WKTC(D_WKTC_500MS); //ʱ - L0_mcu_mode_powerdown();//״̬ - if(BITN_G(DR_who_wakeup, DRB_who_wakeup_action)) - { - BITN_0(DR_who_wakeup, DRB_who_wakeup_action); - PrintAlgo_L0_uart0_uc(s->cali_hit+0x30); - // PrintCam_L0_uart0_uc('#'); - if(s->cali_hit++ > 22) - {s->cali_hit = 0; - s->hit_ok = D_ready; - PrintAlgo_L0_uart0_uc('L'); - s->cali_mode = D_ON;s->cali_timer = s->cali_mode; - TS_paer_value.r123.cali_mode = 1; - L2_task_go(D_task_ALGO_sa); - } - }else - { - s->cali_hit = 0; - if(s->cali_over ++ > 25)///500ms*25 = 50s - { - s->cali_over = 0; - L2_task_go(D_task_ALGO_cali_end); - } - } - - TTSS_Task_step(D_task_ALGO_cali_end) - // PrintFlow_str("cali end", 9);// - // PrintAlgo_L0_uart0_uc('E'); - s->cali_mode = D_clear; - TS_paer_value.r123.cali_mode = s->cali_mode; - s->cali_delay = 0; -/// L3_task_s_go(ts_task_FLOW,D_task_init); -// - L2_task_go(D_task_ALGO_wait); - TTSS_Task_step(D_task_ALGO_sa) - L3_task_s_go(ts_task_FLOW,D_task_FLOW_wakeup); - L2_task_go(D_task_ALGO_wait); - - - *****************/ - TTSS_Task_end(); -} - -/**************************** - - -TTSS_Task_step(D_task_ALGO_updown) - L0_uart0_sendArray("paper =", 7); - D_send_ushex(s->usSum);L0_uart0_uc('-'); - #define D_paper_max 0x0b10 - ///0x0b1d 2845 - - - L2_task_go(D_task_ALGO_cal) -//L1_task_Tdelay(D_Tdelay_10ms); -TTSS_Task_step(D_task_ALGO_cal) - #ifdef D_debug_add_send - // L2_line_send();/// ݷȥʹ s_task_GC032A.buf - // D_send_us(DR_pclk_n); - // - #endif - s->usSum *= 10; // sumֵܳ - s->usPaper = s->usSum/s->usSum100; - s->ok = D_ready; - L2_task_go(D_task_ALGO_wait); - -#define D_F_low 30 -#define D_F_high 40 -#define D_F_diff 10 //D_F_high - D_F_low -cam һݵǰһ -16 -16 -16 -16 -17 -18 -19 -22 -25 -26 -26 -27 -29 -28 -28 -27 -27 -26 -26 -26 -25 -25 -/// ȥ -/// ______/\___________ -/// / \ -/// / ...............................\--high -/// / \ -/// / \ -/// / low \---low -///-16 17-- \ -/// -***************************/ -///#define D_F_low 23 -///#define D_F_high 30 -///#define D_F_diff 5 //D_F_high - D_F_low -///#define D_F_diff (D_F_high - D_F_low) - - -vU16 L2_line_algo_media(U8 *buf,vU16 len) -{ - vU16 i,usV = 0;//,usi = 0; - U8 cache[3]; - U8 f1; - for(i = 1;i < len;i ++) - { - - cache[2] = cache[1]; - cache[1] = cache[0]; - cache[0] = buf[i]; - f1 = Lc_U8_media3(cache[2],cache[1],cache[0]); - ///-------------------------------------------------- - if(f1 > D_F_low)//> - { - if(f1 > D_F_high)//>40 - { - f1 = D_F_diff;// 10 - }else - { - f1 -= D_F_low;// 40 30 - } - }else - {// <=low - f1 = 0; - } - ///-------------------------------------------------- - /// buf[i] = f1; - usV += f1;///ֵ 570*7 640*10 =6,400 65,535 - - } - return usV; -} - - - -#if 0 - - /// // s->usSum = L2_line_algo_media(test_buf,639); - if(ts_task_ALGO.usSum_temp > D_line_sum) - { - ////L3_task_s_go(ts_task_CALIB,D_task_CALIB_wait); - } - if(s->usSum_temp != s->usSum) - { - s->t++; - }else - { - s->t = 0; - } - if(s->t > 5) - { - L0_uart0_uc('X'); - }else - { - L0_uart0_uc('F'); - } - D_send_ushex(s->t);L0_uart0_uc(0x09); - - - TTSS_Task_step(D_task_ALGO_updown); - /// // s->usSum = L2_line_algo_media(test_buf,639); - if(ts_task_ALGO.usSum_temp > D_line_sum) - { - ////L3_task_s_go(ts_task_CALIB,D_task_CALIB_wait); - } - if(s->usSum_temp >= s->usSum) - { - s->t = s->usSum_temp - s->usSum; - }else - { - s->t = s->usSum - s->usSum_temp; - } - /// L0_uart0_uc(0x09); - L0_uart0_sendArray("paper =", 9); - D_send_ushex(s->usSum);L0_uart0_uc('-'); - D_send_ushex(s->usSum_temp);L0_uart0_uc('='); - s->usSum_temp = s->usSum; - #define D_paper_max 2000 - ///0x0b1d 2845 - - if(s->usSum > 0x0b10) - { - s->paperMode = D_max; - }else - { - s->paperMode = D_diff; - } - - if(s->t > D_paper_max) - { - - L0_uart0_uc('X'); - - }else - { - L0_uart0_uc('F'); - - - } - D_send_ushex(s->t);L0_uart0_uc(0x09); - L2_task_go(D_task_ALGO_cal); - //L1_task_Tdelay(D_Tdelay_10ms); - - L2_task_go(D_task_ALGO_updown); -TTSS_Task_step(D_task_ALGO_updown); - s->usLong = L2_line_algo_updown(s->p_buf2,639); - -vU16 L2_line_algo_updown(U8 *p_buf,U8 len) -{ - vU16 us_i = 0,up_point = 0,down_point = 0; - down_point = DR_pclk_n; - for(us_i = 1;us_i < len ;us_i ++) - { - if((p_buf[us_i - 1] == 0)&& - (p_buf[us_i] == 1))//// _/`` - { - if(p_buf[us_i + 1] == 0) - {//_/`\_ Ҫ - gRccUs03 ++; - }else - {// ___/````ؿʼߵƽ - up_point = us_i; - } - }else if((p_buf[us_i - 1] == 1)&& - (p_buf[us_i] == 0))//// ``\_ ½ - { - down_point = gRccUs03; - }else - { - - } - } - us_i = down_point - up_point; - return us_i; -} - -#endif - - -#if 0 ///def D_buf_test -U8 test_buf[] -={ -19 ,// 0 -19 ,// 1 -19 ,// 2 -20 ,// 3 -20 ,// 4 -20 ,// 5 -20 ,// 6 -20 ,// 7 -20 ,// 8 -20 ,// 9 -19 ,// 10 -119 ,// 11 -19 ,// 12 -19 ,// 13 -19 ,// 14 -19 ,// 15 -19 ,// 16 -20 ,// 17 -20 ,// 18 -20 ,// 19 -20 ,// 20 -20 ,// 21 -20 ,// 22 -20 ,// 23 -20 ,// 24 -20 ,// 25 -19 ,// 26 -19 ,// 27 -19 ,// 28 -119 ,// 29 -19 ,// 30 -19 ,// 31 -19 ,// 32 -19 ,// 33 -19 ,// 34 -19 ,// 35 -19 ,// 36 -19 ,// 37 -19 ,// 38 -19 ,// 39 -19 ,// 40 -20 ,// 41 -20 ,// 42 -19 ,// 43 -19 ,// 44 -19 ,// 45 -19 ,// 46 -20 ,// 47 -20 ,// 48 -20 ,// 49 -19 ,// 50 -19 ,// 51 -19 ,// 52 -19 ,// 53 -19 ,// 54 -20 ,// 55 -20 ,// 56 -20 ,// 57 -19 ,// 58 -19 ,// 59 -19 ,// 60 -20 ,// 61 -20 ,// 62 -20 ,// 63 -20 ,// 64 -20 ,// 65 -20 ,// 66 -20 ,// 67 -20 ,// 68 -20 ,// 69 -120 ,// 70 -19 ,// 71 -19 ,// 72 -19 ,// 73 -20 ,// 74 -20 ,// 75 -20 ,// 76 -20 ,// 77 -20 ,// 78 -20 ,// 79 -20 ,// 80 -20 ,// 81 -20 ,// 82 -20 ,// 83 -20 ,// 84 -20 ,// 85 -20 ,// 86 -20 ,// 87 -20 ,// 88 -20 ,// 89 -20 ,// 90 -20 ,// 91 -20 ,// 92 -121 ,// 93 -20 ,// 94 -20 ,// 95 -20 ,// 96 -20 ,// 97 -20 ,// 98 -21 ,// 99 -21 ,// 100 -21 ,// 101 -22 ,// 102 -24 ,// 103 -26 ,// 104 -28 ,// 105 -30 ,// 106 -32 ,// 107 -35 ,// 108 -38 ,// 109 -40 ,// 110 -42 ,// 111 -44 ,// 112 -146 ,// 113 -50 ,// 114 -51 ,// 115 -52 ,// 116 -52 ,// 117 -53 ,// 118 -53 ,// 119 -54 ,// 120 -54 ,// 121 -55 ,// 122 -55 ,// 123 -55 ,// 124 -55 ,// 125 -55 ,// 126 -56 ,// 127 -55 ,// 128 -55 ,// 129 -55 ,// 130 -56 ,// 131 -55 ,// 132 -155 ,// 133 -54 ,// 134 -53 ,// 135 -53 ,// 136 -52 ,// 137 -52 ,// 138 -52 ,// 139 -51 ,// 140 -49 ,// 141 -45 ,// 142 -43 ,// 143 -41 ,// 144 -39 ,// 145 -38 ,// 146 -36 ,// 147 -34 ,// 148 -31 ,// 149 -129 ,// 150 -28 ,// 151 -28 ,// 152 -27 ,// 153 -27 ,// 154 -27 ,// 155 -27 ,// 156 -27 ,// 157 -27 ,// 158 -26 ,// 159 -26 ,// 160 -26 ,// 161 -25 ,// 162 -25 ,// 163 -24 ,// 164 -25 ,// 165 -25 ,// 166 -25 ,// 167 -25 ,// 168 -25 ,// 169 -24 ,// 170 -24 ,// 171 -24 ,// 172 -23 ,// 173 -23 ,// 174 -22 ,// 175 -23 ,// 176 -22 ,// 177 -22 ,// 178 -22 ,// 179 -22 ,// 180 -22 ,// 181 -22 ,// 182 -22 ,// 183 -21 ,// 184 -21 ,// 185 -21 ,// 186 -21 ,// 187 -21 ,// 188 -22 ,// 189 -21 ,// 190 -21 ,// 191 -21 ,// 192 -21 ,// 193 -21 ,// 194 -21 ,// 195 -21 ,// 196 -21 ,// 197 -21 ,// 198 -121 ,// 199 -21 ,// 200 -21 ,// 201 -21 ,// 202 -21 ,// 203 -21 ,// 204 -21 ,// 205 -21 ,// 206 -21 ,// 207 -21 ,// 208 -21 ,// 209 -20 ,// 210 -20 ,// 211 -20 ,// 212 -20 ,// 213 -20 ,// 214 -20 ,// 215 -21 ,// 216 -21 ,// 217 -21 ,// 218 -20 ,// 219 -21 ,// 220 -21 ,// 221 -20 ,// 222 -120 ,// 223 -20 ,// 224 -20 ,// 225 -20 ,// 226 -20 ,// 227 -20 ,// 228 -20 ,// 229 -20 ,// 230 -20 ,// 231 -20 ,// 232 -19 ,// 233 -19 ,// 234 -19 ,// 235 -19 ,// 236 -20 ,// 237 -21 ,// 238 -21 ,// 239 -21 ,// 240 -20 ,// 241 -20 ,// 242 -20 ,// 243 -20 ,// 244 -20 ,// 245 -20 ,// 246 -20 ,// 247 -20 ,// 248 -20 ,// 249 -20 ,// 250 -21 ,// 251 -21 ,// 252 -21 ,// 253 -21 ,// 254 -21 ,// 255 -20 ,// 256 -20 ,// 257 -20 ,// 258 -20 ,// 259 -20 ,// 260 -20 ,// 261 -20 ,// 262 -20 ,// 263 -20 ,// 264 -20 ,// 265 -19 ,// 266 -19 ,// 267 -19 ,// 268 -19 ,// 269 -19 ,// 270 -19 ,// 271 -19 ,// 272 -19 ,// 273 -19 ,// 274 -19 ,// 275 -19 ,// 276 -19 ,// 277 -19 ,// 278 -19 ,// 279 -19 ,// 280 -19 ,// 281 -19 ,// 282 -20 ,// 283 -20 ,// 284 -20 ,// 285 -20 ,// 286 -119 ,// 287 -19 ,// 288 -19 ,// 289 -19 ,// 290 -19 ,// 291 -19 ,// 292 -19 ,// 293 -19 ,// 294 -19 ,// 295 -19 ,// 296 -19 ,// 297 -19 ,// 298 -19 ,// 299 -19 ,// 300 -19 ,// 301 -19 ,// 302 -19 ,// 303 -19 ,// 304 -19 ,// 305 -19 ,// 306 -19 ,// 307 -49 ,// 308 -19 ,// 309 -20 ,// 310 -19 ,// 311 -19 ,// 312 -19 ,// 313 -19 ,// 314 -19 ,// 315 -20 ,// 316 -19 ,// 317 -19 ,// 318 -19 ,// 319 -19 ,// 320 -19 ,// 321 -19 ,// 322 -19 ,// 323 -19 ,// 324 -19 ,// 325 -19 ,// 326 -19 ,// 327 -19 ,// 328 -19 ,// 329 -20 ,// 330 -20 ,// 331 -20 ,// 332 -19 ,// 333 -20 ,// 334 -20 ,// 335 -20 ,// 336 -20 ,// 337 -20 ,// 338 -19 ,// 339 -19 ,// 340 -19 ,// 341 -19 ,// 342 -19 ,// 343 -19 ,// 344 -19 ,// 345 -19 ,// 346 -19 ,// 347 -20 ,// 348 -20 ,// 349 -20 ,// 350 -20 ,// 351 -20 ,// 352 -20 ,// 353 -20 ,// 354 -20 ,// 355 -19 ,// 356 -19 ,// 357 -19 ,// 358 -19 ,// 359 -19 ,// 360 -19 ,// 361 -19 ,// 362 -19 ,// 363 -19 ,// 364 -19 ,// 365 -19 ,// 366 -19 ,// 367 -19 ,// 368 -19 ,// 369 -19 ,// 370 -19 ,// 371 -19 ,// 372 -19 ,// 373 -19 ,// 374 -19 ,// 375 -19 ,// 376 -19 ,// 377 -19 ,// 378 -19 ,// 379 -19 ,// 380 -19 ,// 381 -19 ,// 382 -19 ,// 383 -19 ,// 384 -19 ,// 385 -19 ,// 386 -19 ,// 387 -20 ,// 388 -20 ,// 389 -19 ,// 390 -19 ,// 391 -19 ,// 392 -19 ,// 393 -19 ,// 394 -19 ,// 395 -19 ,// 396 -19 ,// 397 -19 ,// 398 -19 ,// 399 -19 ,// 400 -19 ,// 401 -19 ,// 402 -19 ,// 403 -19 ,// 404 -19 ,// 405 -19 ,// 406 -19 ,// 407 -19 ,// 408 -19 ,// 409 -19 ,// 410 -20 ,// 411 -19 ,// 412 -19 ,// 413 -19 ,// 414 -19 ,// 415 -19 ,// 416 -19 ,// 417 -19 ,// 418 -19 ,// 419 -19 ,// 420 -19 ,// 421 -19 ,// 422 -19 ,// 423 -19 ,// 424 -19 ,// 425 -19 ,// 426 -19 ,// 427 -19 ,// 428 -19 ,// 429 -19 ,// 430 -19 ,// 431 -19 ,// 432 -19 ,// 433 -19 ,// 434 -19 ,// 435 -19 ,// 436 -20 ,// 437 -19 ,// 438 -19 ,// 439 -19 ,// 440 -19 ,// 441 -19 ,// 442 -19 ,// 443 -19 ,// 444 -19 ,// 445 -19 ,// 446 -19 ,// 447 -19 ,// 448 -19 ,// 449 -19 ,// 450 -19 ,// 451 -19 ,// 452 -19 ,// 453 -19 ,// 454 -19 ,// 455 -19 ,// 456 -19 ,// 457 -19 ,// 458 -19 ,// 459 -19 ,// 460 -19 ,// 461 -19 ,// 462 -19 ,// 463 -19 ,// 464 -19 ,// 465 -19 ,// 466 -19 ,// 467 -19 ,// 468 -19 ,// 469 -19 ,// 470 -19 ,// 471 -19 ,// 472 -19 ,// 473 -19 ,// 474 -19 ,// 475 -19 ,// 476 -19 ,// 477 -19 ,// 478 -19 ,// 479 -19 ,// 480 -19 ,// 481 -19 ,// 482 -19 ,// 483 -19 ,// 484 -19 ,// 485 -19 ,// 486 -19 ,// 487 -19 ,// 488 -19 ,// 489 -19 ,// 490 -19 ,// 491 -19 ,// 492 -19 ,// 493 -19 ,// 494 -19 ,// 495 -19 ,// 496 -19 ,// 497 -18 ,// 498 -18 ,// 499 -18 ,// 500 -19 ,// 501 -19 ,// 502 -19 ,// 503 -19 ,// 504 -19 ,// 505 -19 ,// 506 -19 ,// 507 -19 ,// 508 -19 // 509 -}; -#endif diff --git a/source/app/app_algorithm.h b/source/app/app_algorithm.h deleted file mode 100644 index b855959..0000000 --- a/source/app/app_algorithm.h +++ /dev/null @@ -1,168 +0,0 @@ - -//////////////////////////////////////////////////////////////////////////// -///@copyright Copyright (c) 2018, ؿƼ All rights reserved. -///------------------------------------------------------------------------- -/// @file algorithm.h -/// @brief bsp @ driver config -///------------------------------------------------------------------------- -/// @version 1.0 -/// @author CC -/// @date 20180331 -/// @note cc_AS_stc02 -/// -/// -///algorithm///Ӣ [??lg?r?e?m] [??l???r?e?m] ///n.㷨;㷨; -/// -/// -/// -////////////////////////////////////////////////////////////////////////////// - - - - - - - - - - -#ifndef _APP_algorithm_H -#define _APP_algorithm_H - -#include "../clib/Type.h" -#include "../ctask/task.h" -#include "../msp/uart0.h" -#include "../clib/clib.h" -//#include "../debug/debug_drv.h"// -//#include "../msp/msp_plcd.h" - -//#include "../msp/SHC6601_rtc.h" -///#include "app_rf.h" -//#include "app_as.h" - -#include "../tpc/tpc_uart.h" - -//>>>>>>>>>>>>>>>>>>>>>0task - - -#define D_task_ALGO_median 0x51 -#define D_task_ALGO_wait 0x52 - -#define D_task_ALGO_cal 0x53 -#define D_task_ALGO_updown 0x54 -#define D_task_ALGO_section 0x57 - -#define D_task_ALGO_cali_mode 0x63 -#define D_task_ALGO_para 0x64 -#define D_task_ALGO_200in 0x66 - -#define D_task_ALGO_cali_end 0x69 - -#define D_task_ALGO_cali_wait 0x70 -#define D_task_ALGO_cali_save 0x73 - - -#define D_task_ALGO_sa 0x6b - -#define D_line_sum 1000 ///жķֵ - - - -typedef struct -{ - TS_task task; - vU16 usSum; - vU16 ustMP; - vU16 usPaper150; - vU16 usPaperNum; -// vU32 ul2; -// vU32 ul3; -// vU16 t; -/// vU16 usSum_temp; -// vU16 usSum100; -// vU16 usLong; /// -/// vU8 *p_buf2;// - vU8 usPaperSection; ///ֽŵĶ - vU8 cali_delay; - vU8 cali_timer; - vU8 cali_over; - vU8 cali_hit; - vU8 hit_ok:1; - vU8 ok:1; - vU8 cali_mode:1; //D_OK - vU8 ok2:1; - vU8 paperMode:3;// - -// vU8 buf3[520];// - -}TS_task_ALGO_; -extern TS_task_ALGO_ ts_task_ALGO; - -extern void L2_task_ALGO_handle(TS_task_ALGO_ *s); -extern void L2_task_ALGO_init(void); -extern void L2_task_ALGO_handle22(TS_task_ALGO_ *s); - -/*********************** -10 0.93 - -20 1.88mm --->0.094mm/paper -100 9.4 2.97mm-> 31.59574468 -150 14.1 15.9---> 169.1489362 2330 0x0924 -200 18.8 0 - - -****************/ - -#define D_paper_EE 0x0B10 ///0b1f - -#define D_paper_MAX 0x09AA ///2555 //170 - -#define D_paper_150LR 250 ///¸ֵ 150/15 =10ҳ -#define D_paper_150at 0x087f ///150У׼ 2330/150 = 15point/ֽ -#define D_paper_00 0x0015 -#define D_paper_150at_top (D_paper_150at + D_paper_150LR) -#define D_paper_150at_bottom (D_paper_150at - D_paper_150LR) - -#define D_cam_EE 0 -#define D_cam_top 1 -#define D_cam_150at 2 -#define D_cam_00 3 -#define D_cam_erro 4 -#define D_cam_noee 5 - -//<<<<<<<<<<<<<<<<<<<0task -#if 0 -#define PrintAlgo_L0_uart0_uchex(x) L0_uart0_uchex((x)) -#define PrintAlgo_L0_uart0_uc(x) L0_uart0_uc((x)) -#define PrintAlgo_D_send_us(x) D_send_ushex((x)) - -#define PrintAlgo_str(x,len) L0_uart0_sendArray((x),len) -#else - -#define PrintAlgo_L0_uart0_uchex(x) -#define PrintAlgo_L0_uart0_uc(x) -#define PrintAlgo_D_send_us(x) - -#define PrintAlgo_str(x,len) - -#endif -/************************************************************ -/// ȥ -/// ______/\___________ -/// / \ -/// / ...............................\--high -/// / \ -/// / \ -/// / low \---low -///-16 17-- \ -/// -*******************************************/ -#define D_F_low 23 -#define D_F_high 30 -#define D_F_diff 5 //D_F_high - D_F_low -///#define D_F_diff (D_F_high - D_F_low) - -#endif //_APP_algorithm_H ALGO - - - diff --git a/source/app/app_calibration.c b/source/app/app_calibration.c deleted file mode 100644 index 12ecec7..0000000 --- a/source/app/app_calibration.c +++ /dev/null @@ -1,149 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -/// COPYRIGHT NOTICE -/// Copyright (c) 2015, ؿƼ -/// All rights reserved. -/// -/// @file app_calibration.c -/// @brief app_calibration app -/// -///ļʵֵĹܵ -/// -/// @version 1.1 CCsens technology -/// @author CC -/// @date 20170101 -/// -/// -/// ޶˵汾 -/// Modified by: -/// Modified date: -/// Version: -/// Descriptions: -/// Ӧ һϵʱ -////////////////////////////////////////////////////////////////////////// - -#include "app_calibration.h" -#include "../clib/Clib.h" -#include "../clib/bit.h" -#include "../bsp/bsp_cam.h" -/// - -#include "../bsp/bsp_power.h" - -TS_task_CALIB_ ts_task_CALIB; - -void L2_task_CALIB_init(void) -{ - ts_task_CALIB.status = 0; - L1_task_init(&ts_task_CALIB.task); - L3_task_s_go(ts_task_CALIB,D_task_init); -} - -//>>>>>>>>>>>>>>>>>>>>>0task -///L2_task_CALIB_init(); - -///L2_task_CALIB_handle(&ts_task_CALIB); -void L2_task_CALIB_handle(TS_task_CALIB_ *s) -{ - TTSS_Task_init(); - if(D_ready == ts_task_power.power2) - { - ts_task_power.power2 = D_clear; - L1_as_readXYZ(0); - L1_as_readXYZ(0); - L1_as_readXYZ(0); - L1_as_readXYZ(0); - L1_as_readXYZ(0); - L1_as_readXYZ(0); - L1_as_readXYZ(0); - L1_as_readXYZ(0); - L1_as_readXYZ(0); - - L1_as_readXYZ(0); - L1_as_readXYZ(0); - L1_as_readXYZ(0); - L1_as_readXYZ(0); - L1_as_readXYZ(0); - L1_as_readXYZ(0); - L1_as_readXYZ(0); - L1_as_readXYZ(0); - L1_as_readXYZ(0); - - - } - - -#if 0 - L0_uart0_uc('a'); - - ts_task_power.power2 = D_clear; - ts_task_CALIB.calib_time = D_clear; - L1_task_Tdelay(D_Tdelay_1s); - - - L2_task_go(D_task_CALIB_wait); - #endif - TTSS_Task_step(D_task_CALIB_rr); - - - TTSS_Task_step(D_task_CALIB_wait); - - if(D_ready == ts_task_power.power2) - { - ts_task_power.power2 = D_clear; - L0_uart0_uc('#'); - ts_task_CALIB.status ++; - if(ts_task_CALIB.status <= 8) - { - }else - { - L0_uart0_uc('!'); - ts_task_CALIB.status = 0; - ts_task_CALIB.calib_time = D_ready; - } - }else - { - ts_task_CALIB.status = 0; - ts_task_CALIB.calib_time = D_clear; - L0_uart0_uc('0'); - } - L2_task_go(D_task_CALIB_wait); - //L1_task_Tdelay(D_Tdelay_1s); - L1_task_Tdelay(D_Tdelay_500ms);////̶ļǷյУ׼û - TTSS_Task_step(D_task_CALIB_sleep); - - L2_task_go(D_task_CALIB_init_sensor); - L1_task_Tdelay(D_Tdelay_10ms); - TTSS_Task_end(); -} - -/********* -if(D_ready == ts_task_power.power2) -{ - ts_task_power.power2 = D_clear; - L0_uart0_uc('#'); - ts_task_CALIB.status ++; - if(ts_task_CALIB.status <= 4) - { - }else - { - L0_uart0_uc('!'); - // L1_task_Tdelay(D_Tdelay_1s); - // L2_task_go(D_task_CALIB_wait); - - } - /// L1_task_Tdelay(D_Tdelay_1s); - L2_task_go(D_task_CALIB_wait); -}else -{ - ts_task_CALIB.status = 0; - L0_uart0_uc('0'); - L1_task_Tdelay(D_Tdelay_2s); -} - - - - - -*********/ - - diff --git a/source/app/app_calibration.h b/source/app/app_calibration.h deleted file mode 100644 index a7dae87..0000000 --- a/source/app/app_calibration.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef _APP_calibration_H -#define _APP_calibration_H - -#include "../clib/Type.h" -#include "../ctask/task.h" -#include "../msp/uart0.h" -#include "../clib/clib.h" -//#include "../debug/debug_drv.h"// -//#include "../msp/msp_plcd.h" - -//#include "../msp/SHC6601_rtc.h" -///#include "app_rf.h" -//#include "app_as.h" -#include "../bsp/cw63xx.h" -#include "../bsp/bsp_msa300.h" -#include "../tpc/tpc_uart.h" -#include "../bsp/bsp_cam_isr.h" - -//>>>>>>>>>>>>>>>>>>>>>0task - -///#define D_task_CALIB_ask 0x56 -///#define D_task_CALIB_enter 0x57 -///#define D_task_CALIB_init 0x10 - -///#define D_task_OSD_init_key 0x11 -///#define D_task_CALIB_STEP 0x30 -///#define D_task_CALIB_heratbeat 0x70 - - -#define D_task_CALIB_send 0x40 -#define D_task_CALIB_send2 0x41 -#define D_task_CALIB_send3 0x42 - -#define D_task_CALIB_PreSend 0x43 -#define D_task_CALIB_PreSend2 0x44 - - - -#define D_task_CALIB_wait 0x51 -#define D_task_CALIB_rr 0x52 - -#define D_task_CALIB_sleep 0x53 -#define D_task_CALIB_init_sensor 0x54 -#define D_task_CALIB_wait_sensor 0x55 -#define D_task_CALIB_wakeup 0x56 -#define D_task_CALIB_wakeup2 0x57 -#define D_task_CALIB_overtime 0x58 -#define D_task_CALIB_wakeup3 0x59 - -typedef struct -{ - TS_task task; -// vU8 t_stamp;// -// vU8 first_run;// - unsigned char calib_time;// - unsigned char status;// -// unsigned char key;// -}TS_task_CALIB_; -extern TS_task_CALIB_ ts_task_CALIB; - -extern void L2_task_CALIB_handle(TS_task_CALIB_ *s); -extern void L2_task_CALIB_init(void); -extern void L2_task_CALIB_handle22(TS_task_CALIB_ *s); - - -//<<<<<<<<<<<<<<<<<<<0task - -#endif //_APP_calibration_H calib - - - diff --git a/source/app/app_config.c b/source/app/app_config.c new file mode 100644 index 0000000..2489081 --- /dev/null +++ b/source/app/app_config.c @@ -0,0 +1,107 @@ +#include "app_config.h" +#include "../bsp/cs1232.h" +#include "../bsp/chipid.h" +#include "../msp/eeprom.h" + +GlobalParam G; +GlobalRegister R; + +void L3_param_init(void) +{ +#if 0 + int i; + for(i=0;i>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Register CONFIG +//寄存器编号从1开始 +//#define D_COUNT_WEIGHT(adc) (U32)(1000.0 * R.p.weight_max * (adc) / (2 * 0x7FFFFF / 1000 * D_ADS1213_GAIN_VAL * R.p.lmd)) +//#define D_blur_threshold_2_1(threshold) (U32) ( 1.0 * threshold *(2 * 0x7FFFFF / 1000 * D_ADS1213_GAIN_VAL * R.p.lmd) / (1000.0 * R.p.weight_max )) +#define D_COUNT_WEIGHT(adc) (U32)((adc) / D_ADS1213_GAIN_VAL / R.p.lmd * R.p.weight_max * 1000 / (2 * 0x7FFFFF / 1000 )) +#define D_COUNT_ADC(wInG) (U32)((wInG) * D_ADS1213_GAIN_VAL * R.p.lmd * (2 * 0x7FFFFF / 1000) / R.p.weight_max / 1000) + +#define ADC_status_chx_Ready_BASE 0x01 +#define ADC_status_ch1_Ready 0x01 +#define ADC_status_ch2_Ready 0x02 +#define ADC_status_ch3_Ready 0x04 +#define ADC_status_ch4_Ready 0x08 +#define D_ADC_CHANNEL_NUM 4 +typedef struct global_register +{ + //RO Register + U16 reserved1; + U32 total_weight; //净重(显示重量)*100 + U32 total_zweight; //皮重*100 + //RW Register + U16 reserved2; + U16 zero; //清0标志,写入任何值清0(去皮) + U16 status_eep_save; //eep写入寄存器,1则写入eep并清0 + //U16 reset; //reset标志,写入任何值,所有参数恢复初始值 + struct + { //需要持久化的参数,不能超过72字节,否则会导致eeprom溢出 + U16 slaver_id; + U16 adc_ch_status; + U16 weight_max; //量程 + U16 lmd; //2mv/v + U16 adc_blur_mid; //中值滤波 + U16 adc_blur_avg; //均值滤波 + U16 adc_blur_shift[3]; //移位滤波点数 + U16 adc_blur_threshold[2]; //移位滤波阀值 + }p; + U16 reserved3; + U32 adval[D_ADC_CHANNEL_NUM]; //4路重量 + U32 ch_weight[D_ADC_CHANNEL_NUM]; //4路重量 + U32 rough_weight; // 毛重 +}GlobalRegister; + +extern GlobalRegister R; + +//寄存器内存基地址 +#define REG_MEM_BASE ((U16*)(&R)) //寄存器基础地址(本文件外部不应该使用该宏定义) +//变量地址转寄存器 +#define MEM_2_REG(mem) (((U16*)(mem) - REG_MEM_BASE) + 1) +//寄存器转变量地址 +#define REG_2_MEM(reg) (REG_MEM_BASE + (U16)((reg) - 1)) +//STEP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Global Variables CONFIG +typedef struct global_param +{ + U8 xx; +}GlobalParam; +extern struct global_param G; +//STEP 2 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>0task -#define D_FLOW_t_stamp 10 - -void L2_task_FLOW_handle33(TS_task_FLOW_ *s) -{ - TTSS_Task_init(): -/// PrintFlow_L0_uart0_uc('F'); - ts_task_ALGO.paperMode = D_max; - - L2_task_go(D_task_FLOW_wakeup); - - TTSS_Task_end(); -} - - - - diff --git a/source/app/app_flow.h b/source/app/app_flow.h deleted file mode 100644 index 52a504f..0000000 --- a/source/app/app_flow.h +++ /dev/null @@ -1,84 +0,0 @@ -#ifndef _APP_FLOW_H -#define _APP_FLOW_H - - - -#include "../clib/Type.h" -#include "../ctask/task.h" -#include "../msp/uart0.h" -#include "../clib/clib.h" -//#include "../debug/debug_drv.h"// -//#include "../msp/msp_plcd.h" - -//#include "../msp/SHC6601_rtc.h" -///#include "app_rf.h" -//#include "app_as.h" -#include "../tpc/tpc_uart.h" - -//>>>>>>>>>>>>>>>>>>>>>0task - -///#define D_task_FLOW_ask 0x56 -///#define D_task_FLOW_enter 0x57 -///#define D_task_FLOW_init 0x10 - -///#define D_task_OSD_init_key 0x11 -///#define D_task_FLOW_STEP 0x30 -///#define D_task_FLOW_heratbeat 0x70 - -#define D_task_FLOW_wait_cam1 0x51 -#define D_task_FLOW_wait_cam 0x52 - -#define D_task_FLOW_lowPower 0x53 -#define D_task_FLOW_work 0x5b -#define D_task_FLOW_cali 0x5c - -#define D_task_FLOW_init_sensor 0x54 -#define D_task_FLOW_wait_sensor 0x55 -#define D_task_FLOW_wakeup 0x56 -#define D_task_FLOW_wakeup2 0x57 -#define D_task_FLOW_overtime 0x58 -#define D_task_FLOW_wakeup3 0x59 - -typedef struct -{ - TS_task task; - vU8 t_stamp; - vU16 t_stamp2; - vU16 wakeup_timer; - - vU8 long_hit; -// vU8 first_run;// -// unsigned char area;// -// unsigned char status;// -// unsigned char key;// -}TS_task_FLOW_; -extern TS_task_FLOW_ ts_task_FLOW; - -extern void L2_task_FLOW_handle(TS_task_FLOW_ *s); -extern void L2_task_FLOW_init(void); -extern void L2_task_FLOW_handle33(TS_task_FLOW_ *s); - - -extern TS_P_rf433 TS_paer_value; -#if 0 -#define PrintFlow_L0_uart0_uchex(x) L0_uart0_uchex((x)) -#define PrintFlow_L0_uart0_uc(x) L0_uart0_uc((x)) -#define PrintFlow_D_send_us(x) D_send_ushex((x)) - -#define PrintFlow_str(x,len) L0_uart0_sendArray((x),len) -#else - -#define PrintFlow_L0_uart0_uchex(x) -#define PrintFlow_L0_uart0_uc(x) -#define PrintFlow_D_send_us(x) - -#define PrintFlow_str(x,len) - -#endif - -//<<<<<<<<<<<<<<<<<<<0task - -#endif - - - diff --git a/source/app/app_paraid.c b/source/app/app_paraid.c deleted file mode 100644 index bd61ebb..0000000 --- a/source/app/app_paraid.c +++ /dev/null @@ -1,124 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -/// COPYRIGHT NOTICE -/// Copyright (c) 2015, ؿƼ -/// All rights reserved. -/// -/// @file app_paraid.c -/// @brief parameter & id app -/// -///ļʵֵĹܵ -/// -/// @version 1.1 CCsens technology -/// @author CC -/// @date 20190107 -/// -/// -/// ޶˵汾 -/// Modified by: -/// Modified date: -/// Version: -/// Descriptions: -/// -////////////////////////////////////////////////////////////////////////// - -#include "app_algorithm.h" -#include "app_paraid.h" -#include "../clib/Clib.h" -#include "../clib/bit.h" -#include "../msp/msp_eeprom.h" -// - -/// - -#define D_paraid_debug_print -/// id -/// ֽŵò - -void L1_paraid_init(void) -{ - vU16 pa[2]; - -/// char *ID; -/// ID = (char idata *)0xf1;/// for (i=0; i<7; i++) { UartSend(ID[i]); } - ///UartSend(ID[i]); - -// L1_Iap_Read_us(D_paraAdd_paper150,&ts_task_ALGO.usPaper150); -// L1_Iap_Read_us(D_paraAdd_paper150,&ts_task_ALGO.usPaper150); -// L1_Iap_main(); - - - L1_Iap_Read_us(D_paraAdd0_paper150,&pa[0]); - L1_Iap_Read_us(D_paraAdd1_paper150,&pa[1]); - #ifdef D_paraid_debug_print - L0_uart0_us(pa[0]);L0_uart0_us(pa[1]); L0_uart0_uc(0xAA); - #endif - if(pa[1] == pa[0]) - { - if(0xffff != pa[1]) - { - if(pa[0] < D_paper_150at_top) - { - if(pa[0] > D_paper_150at_bottom) - { - goto GOTO_PARA_OK; - } - } - } - } - - - -/// GOTO_PARA_ERRO: - L1_Iap_Write_us(D_paraAdd0_paper150,D_paper_150at); - L1_Iap_Write_us(D_paraAdd1_paper150,D_paper_150at); - pa[0] = D_paper_150at; - - GOTO_PARA_OK: - ts_task_ALGO.usPaper150 = pa[0]; - #ifdef D_paraid_debug_print - L0_uart0_us(ts_task_ALGO.usPaper150);L0_uart0_uc(0xBB); - #endif - ///nothing - -} - - - - -void L1_Iap_Write_us(vU16 addr,vU16 val) -{ - EA = 0; - /********* - IAP_CONTR = WT_12M; //ʹIAP - IAP_CMD = 3; //IAP - IAP_ADDRL = addr; //IAP͵ַ - IAP_ADDRH = addr >> 8; //IAPߵַ - IAP_TRIG = 0x5a; //д(0x5a) - IAP_TRIG = 0xa5; //д(0xa5) - _nop_(); // - _nop_(); - - - IAP_CMD = 2; //IAPд - IAP_DATA = dat; //дIAP - IAP_TRIG = 0x5a; //д(0x5a) - IAP_TRIG = 0xa5; //д(0xa5) - _nop_(); - L0_Iap_Idle(); //رIAP - ***************/ - L0_Iap_Erase(addr); - L0_Iap_Program(addr,val>>8); - L0_Iap_Program(addr+1,val&0x00ff); - EA = 1; -} - - -void L1_Iap_Read_us(vU16 addr,vU16 *val) -{ - EA = 0; - *val = L0_Iap_Read(addr); - *val <<= 8; - *val |= L0_Iap_Read(addr+1); - EA = 1; - -} diff --git a/source/app/app_paraid.h b/source/app/app_paraid.h deleted file mode 100644 index f17c65b..0000000 --- a/source/app/app_paraid.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef _app_paraid_H -#define _app_paraid_H - -#include "../clib/clib.h" -extern void L1_Iap_Read_us(vU16 addr,vU16 *val); - -extern void L1_Iap_Write_us(vU16 addr,vU16 val); -#define D_paraAdd0_paper150 0x0000 -#define D_paraAdd1_paper150 0x0200 -extern void L1_paraid_init(void); - -#endif //_app_paraid_H calib - - - diff --git a/source/app/app_task_adc.c b/source/app/app_task_adc.c deleted file mode 100644 index ca31cd5..0000000 --- a/source/app/app_task_adc.c +++ /dev/null @@ -1,352 +0,0 @@ -#include "app_task_adc.h" -#include "../msp/UART0.h" - -//TS_ADC_CH_SWITCH ts_adc_ch_switch; -TS_ADC_CH_SAMPLE ts_adc_ch_sample[D_ch_max_num]; -TS_ADC_CH_BLUR ts_adc_ch_blur[D_ch_max_num]; -TS_ADC_ALL_BLUR ts_adc_all_blur; -TS_ADC_ALL_OUT ts_adc_all_out; -TS_ADC_SHOW ts_adc_show; - -void L3_task_adc_init(void) -{ - U8 i = 0; - for(i=0;ich_n)) - { - L2_task_go(D_task_ADC_CHx_WAIT_LOW_LEVEL); - } - else - { - s->adcval = s->pool; - L2_task_go(D_task_ADC_CHx_OUT); - } - - TTSS_Task_step(D_task_ADC_CHx_WAIT_LOW_LEVEL): - if(0 == L0_2dc_DOUT_AT(s->ch)) - { - L2_task_go(D_task_ADC_CHx_READ); - } - - TTSS_Task_step(D_task_ADC_CHx_READ): - s->adcval = L0_ADS1231_readCH(s->ch); - L2_task_go(D_task_ADC_CHx_OUT); - - TTSS_Task_step(D_task_ADC_CHx_OUT): - s->pool = s->adcval; - s->sum += s->adcval; - ++s->n; - if(s->n >= D_ADC_CH_SAMPLE_BUF_MAX) - { - s->n = 0; - s->sum = 0; - } - L2_task_go(D_task_ADC_CHx_SAMPLE); - - TTSS_Task_end(); -} - -//单路滤波任务 -#define D_task_ADC_CHx_BLUR_GET 0x51 -#define D_task_ADC_CHx_BLUR_AVG 0x52 -#define D_task_ADC_CHx_BLUR_SHIFT 0x53 -#define D_task_ADC_CHx_BLUR_COUNT 0x54 - -void L3_task_adc_ch_blur(TS_ADC_CH_BLUR *s) -{ - TTSS_Task_init(): - L2_task_go(D_task_ADC_CHx_BLUR_GET); - - TTSS_Task_step(D_task_ADC_CHx_BLUR_GET): - if(ts_adc_ch_sample[s->ch_n].n >= G.p.cc_blur_ch_avg) - { - s->SA_sum = ts_adc_ch_sample[s->ch_n].sum; - s->SA_n = ts_adc_ch_sample[s->ch_n].n; - ts_adc_ch_sample[s->ch_n].sum = 0; - ts_adc_ch_sample[s->ch_n].n = 0; - L2_task_go(D_task_ADC_CHx_BLUR_AVG); - } - - TTSS_Task_step(D_task_ADC_CHx_BLUR_AVG): - s->SA_avg = s->SA_sum / s->SA_n; - L2_task_go(D_task_ADC_CHx_BLUR_SHIFT); - - TTSS_Task_step(D_task_ADC_CHx_BLUR_SHIFT): - s->SHA_sum -= s->SHA_avg; - s->SHA_sum += s->SA_avg; - s->SHA_avg = (S32)(s->SHA_sum >> G.p.cc_blur_ch_shift); - s->n++; - L2_task_go(D_task_ADC_CHx_BLUR_COUNT); - - TTSS_Task_step(D_task_ADC_CHx_BLUR_COUNT): - G.weight[s->ch_n] = D_COUNT_WEIGHT(s->SHA_avg); - L2_task_go(D_task_ADC_CHx_BLUR_GET); - - TTSS_Task_end(); -} - - -//单路滤波任务 -#define D_task_ADC_ALL_BLUR_GET 0x51 -#define D_task_ADC_ALL_BLUR_SHIFT0 0x52 -#define D_task_ADC_ALL_BLUR_SHIFT1 0x53 - -void L3_task_adc_all_blur(TS_ADC_ALL_BLUR *s) -{ - TTSS_Task_init(): - L2_task_go(D_task_ADC_CHx_BLUR_GET); - - TTSS_Task_step(D_task_ADC_CHx_BLUR_GET): - //if(ts_adc_ch_blur[D_ch_max_num-1].n >= 1) - if(ts_adc_ch_blur[0].n >= 1) - { - ts_adc_ch_blur[0].n = 0; - ts_adc_ch_blur[1].n = 0; - ts_adc_ch_blur[2].n = 0; - ts_adc_ch_blur[3].n = 0; - s->sum = G.weight[0] + G.weight[1] + G.weight[2] + G.weight[3]; - L2_task_go(D_task_ADC_ALL_BLUR_SHIFT0); - } - - TTSS_Task_step(D_task_ADC_ALL_BLUR_SHIFT0): - s->SHA_sum_0 -= s->SHA_avg_0; - s->SHA_sum_0 += s->sum; - s->SHA_avg_0 = (S32)(s->SHA_sum_0 >> G.p.cc_blur_all_shift0); - s->SHA_pool_0[0] = s->SHA_pool_0[1]; - s->SHA_pool_0[1] = s->SHA_pool_0[2]; - s->SHA_pool_0[2] = s->SHA_avg_0; - L2_task_go(D_task_ADC_ALL_BLUR_SHIFT1); - - TTSS_Task_step(D_task_ADC_ALL_BLUR_SHIFT1): - s->SHA_sum_1 -= s->SHA_avg_1; - s->SHA_sum_1 += s->sum; - s->SHA_avg_1 = (S32)(s->SHA_sum_1 >> G.p.cc_blur_all_shift1); - //s->SHA_pool_1[0] = s->SHA_pool_1[1]; - //s->SHA_pool_1[1] = s->SHA_pool_1[2]; - //s->SHA_pool_1[2] = s->SHA_avg_1; - - s->n++; - L2_task_go(D_task_ADC_CHx_BLUR_GET); - - TTSS_Task_end(); -} - - -#define D_task_ADC_ALL_OUT_GET 0x51 -#define D_task_ADC_ALL_OUT_DECIDE 0x52 -#define D_task_ADC_ALL_OUT_SHOW 0x53 -#define D_task_ADC_ALL_OUT_SHOW_1 0x54 -#define D_task_ADC_ALL_OUT_DEBUG 0x55 - -void L3_task_adc_all_out(TS_ADC_ALL_OUT *s) -{ - TTSS_Task_init(): - //s->diff_threshold = (G.p.cc_blur_all_out_threshold); - //s->diff_threshold1 = (G.p.cc_blur_all_out_threshold1); - //s->diff_threshold2 = (G.p.cc_blur_all_out_threshold2); - //s->should_show_times_threshold = (G.p.cc_blur_all_out_should_show_times_threshold); - L2_task_go(D_task_ADC_ALL_OUT_GET); - - TTSS_Task_step(D_task_ADC_ALL_OUT_GET): - if(ts_adc_all_blur.n >= 1) - { - ts_adc_all_blur.n = 0; - Lc_buf_copy_uc((U8*)s->SHA_pool, (U8*)ts_adc_all_blur.SHA_pool_0, D_ADC_CH_BLUE_POOL_NUM * sizeof(S32)); - s->SHA_diff[0] = Lc_abs(s->SHA_pool[1] , s->SHA_pool[0]); - s->SHA_diff[1] = Lc_abs(s->SHA_pool[2] , s->SHA_pool[1]); - s->SHA_ddiff[0] = Lc_abs(s->SHA_diff[1] , s->SHA_diff[0]); - L2_task_go(D_task_ADC_ALL_OUT_DECIDE); - } - - TTSS_Task_step(D_task_ADC_ALL_OUT_DECIDE): - if((s->SHA_diff[1] >= G.p.cc_blur_all_out_d_threshold) || (s->SHA_diff[0] >= G.p.cc_blur_all_out_d_threshold) || (s->SHA_ddiff[0] >= G.p.cc_blur_all_out_dd_threshold)) - { - #if 1 - s->sum = s->SHA_pool[2] + s->SHA_pool[1] + s->SHA_pool[0]; - ts_adc_all_blur.SHA_sum_1 = s->sum; - ts_adc_all_blur.SHA_sum_1 <<= G.p.cc_blur_all_shift1; - ts_adc_all_blur.SHA_sum_1 /= 3; - ts_adc_all_blur.SHA_avg_1 = (S32)(ts_adc_all_blur.SHA_sum_1 >> G.p.cc_blur_all_shift1); - //s->val = ts_adc_all_blur.SHA_avg_0; - s->val = s->sum / 3; - //s->t = 0; - #else - ts_adc_all_blur.SHA_sum_1 = ts_adc_all_blur.SHA_avg_0 << G.p.cc_blur_all_shift1; - ts_adc_all_blur.SHA_avg_1 = ts_adc_all_blur.SHA_avg_0; - s->val = ts_adc_all_blur.SHA_avg_0; - //s->t = 0; - #endif - } - else - { - s->val = ts_adc_all_blur.SHA_avg_1; - //s->t = 1; - } - s->n++; - L2_task_go(D_task_ADC_ALL_OUT_GET); - TTSS_Task_end(); -} - -#define D_task_ADC_SHOW_GET 0x53 -#define D_task_ADC_SHOW_1 0x54 -#define D_task_ADC_SHOW_DEBUG 0x55 -void L3_task_adc_show(TS_ADC_SHOW *s) -{ - U8 i = 0,find = 0,j = 0; - TTSS_Task_init(): - L2_task_go(D_task_ADC_SHOW_GET); - - TTSS_Task_step(D_task_ADC_SHOW_GET): - if(ts_adc_all_out.n >= 1) - { - ts_adc_all_out.n = 0; - s->val = ts_adc_all_out.val; - L2_task_go(D_task_ADC_SHOW_1); - } - - TTSS_Task_step(D_task_ADC_SHOW_1): - if((s->val - s->pool_val) * s->pool_gt < 0) - { - //符号改变,计数清0 - //L0_uart0_uc('-'); - L3_task_show_times_reset(); - } - s->pool_gt = (s->val >= s->pool_val) ? 1 : -1; - - s->diff_val = Lc_abs(s->val,s->pool_val); - for(i=0;idiff_val >= G.p.weight_show_limit[i].weight) - { - find = 1; - break; - } - } - if(find) - { - s->times[i]++; - for(j=0;jtimes[j] = 0; - } - } - } - else //小于显示分辨率(<0.02kg) - { - L3_task_show_times_reset(); - } - - for(i=0;itimes[i] >= G.p.weight_show_limit[i].times) - { - L3_task_show_times_reset(); - s->pool_val = s->val; - G._total_weight = s->pool_val; - G.total_weight = L3_count_std_weight(G._total_weight); - break; - } - } - - L2_task_go(D_task_ADC_SHOW_GET); - //L2_task_go(D_task_ADC_SHOW_DEBUG); - - TTSS_Task_step(D_task_ADC_SHOW_DEBUG): - //L0_uart0_uc(s->t == 0 ? '0' : '1'); - s->u16_v = (vU16)(s->pool_val >> 16); - L0_uart0_ushex(s->u16_v,16); - s->u16_v = (vU16)(s->pool_val & 0x0000ffff); - L0_uart0_ushex(s->u16_v,16);//Lc_delay_us(500); - //L0_uart0_uc(0x0d); L0_uart0_uc(0x0a); - //L0_uart0_uc(' '); - //L0_uart0_uc(' '); - L2_task_go(D_task_ADC_SHOW_GET); - - TTSS_Task_end(); -} - - -void L3_task_show_times_reset() -{ - U8 i = 0; - for(i=0;i 5ms - if(ph4->ok) - { - ph4->ok = 0; - crc16(ph4->crc,ph4->buf,ph4->num - 2); - if(ph4->crc[0] == ph4->buf[ph4->num-2] && ph4->crc[1] == ph4->buf[ph4->num-1]) - { - L3_ph4_common_handler((TS_PH4_modbus*)(ph4->buf)); - } - else - { - L3_ph4_send_error_pkg(MODBUS_ERR_CRC); - } - } -} - - diff --git a/source/app/app_task_uart0.h b/source/app/app_task_uart0.h deleted file mode 100644 index 550bb31..0000000 --- a/source/app/app_task_uart0.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef APP_TASK_UART0_H -#define APP_TASK_UART0_H - -#include "common.h" -#include "../ctask/task.h" -#include "../tpc/tpc_modbus.h" - -//extern void L3_task_uart0_handler(TS_Handle_PH3 *ph3); -extern void L3_task_uart0_modbus_handler(TS_Handle_PH4 *ph4); - - -#endif diff --git a/source/app/app_ws.c b/source/app/app_ws.c deleted file mode 100644 index b1dad17..0000000 --- a/source/app/app_ws.c +++ /dev/null @@ -1,131 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -/// COPYRIGHT NOTICE -/// Copyright (c) 2020, ؿƼ -/// All rights reserved. -/// -/// @file app_flow.c -/// @brief app_flow app -/// -///ļʵֵĹܵ -/// -/// @version 1.1 CCsens technology -/// @author CC -/// @date 20170101 -/// -/// -/// ޶˵汾 -/// Modified by: -/// Modified date: -/// Version: -/// Descriptions: -/// Ӧ һϵʱ -////////////////////////////////////////////////////////////////////////// - - -#include "app_ws.h" - - -TS_P_rf433 TS_paer_value= -{ - 0xaa,///vU8 ha; -// 0xaa,///vU8 hb; - 0xad, - 0x0123, -// 0x00,///U16 paperNum:12; //12bitֽ - ///U8 cameraIndex:2; //ͷ - ///U8 cameraWorking:1; //Ƿ - ///U8 reserved: 1; // - 0x56,///U8 cameraBoardPower; // - 0xcc//, 0xaa///vU8 hc; -}; - - -TS_task_FLOW_ ts_task_FLOW; -void L0_p_send(void) -{ - unsigned char *p; - - TS_paer_value.ha = 0xaa; -// TS_paer_value.hb = 0xaa; -/// TS_paer_value.hc = 0xaa; -/// TS_paer_value.r123.cameraBoardPower ++; - - TS_paer_value.filter1 = 0x0a; - -///TS_paer_value.r123.cameraBoardPower = s_task_GC032A.buf[2];; - TS_paer_value.r123.cameraIndex = D_cameralIndex; - TS_paer_value.r123.cameraWorking = 0; - TS_paer_value.r123.paperNum = ts_task_ALGO.usPaperNum; -//// L1_cw63xx_sta();///ֻеȳ Żᱻ - TS_paer_value.r123.LowPower = I2CTXD; -// TS_paer_value.r123.paperNum = 0x1234; - p = (unsigned char *)&TS_paer_value.r123; - TS_paer_value.ocr = *p; - p ++; - TS_paer_value.ocr += *p; - p ++; - TS_paer_value.ocr += *p; -// TS_paer_value.ocr = s_task_GC032A.buf[2]; -} - -void L2_task_FLOW_init(void) -{ - L1_task_init(&ts_task_FLOW.task); - L3_task_s_go(ts_task_FLOW,D_task_init); -} - -//>>>>>>>>>>>>>>>>>>>>>0task -#define D_FLOW_t_stamp 10 - -void L2_task_FLOW_handle33(TS_task_FLOW_ *s) -{ - TTSS_Task_init(): - PrintFlow_L0_uart0_uc('F'); - ts_task_ALGO.paperMode = D_max; - L0_nos_tick1s_start(s_nos_tick.n_stamp3); - L0_nos_tick1s_interval(s_nos_tick.n_stamp3) - - L2_task_go(D_task_FLOW_wakeup); - - TTSS_Task_step(D_task_WS_ch): - - - - - - TTSS_Task_step(D_task_WS_T):////һʱ ʼɼ¶ в - if(s_nos_tick.flag_1s2) - { - s_nos_tick.flag_1s2 = 0; - if(L0_nos_tick1s_interval(s_nos_tick.n_stamp3) > 60) - { - L0_nos_tick1s_start(s_nos_tick.n_stamp3); - - L0_ADS1213_CH(D_ADCCH_Toff); - L0_ADS1213_CH(D_ADCCH_1); - - L2_task_go(D_task_WS_T2); - - - }else - { - - L2_task_go(D_task_WS_ch); - } - - }else - { - L2_task_go(D_task_WS_ch); - - } - - TTSS_Task_step(D_task_WS_T2): -// L0_ADS1213_read(); - - - TTSS_Task_end(); -} - - - - diff --git a/source/app/app_ws.h b/source/app/app_ws.h deleted file mode 100644 index a449daa..0000000 --- a/source/app/app_ws.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef _APP_WS_H -#define _APP_WS_H - - - -#include "../clib/Type.h" -#include "../ctask/task.h" -#include "../msp/uart0.h" -#include "../clib/clib.h" -//#include "../debug/debug_drv.h"// -//#include "../msp/msp_plcd.h" - -//#include "../msp/SHC6601_rtc.h" -///#include "app_rf.h" -// -#include "../tpc/tpc_uart.h" -#include "../clib/bit.h" -#include "app_algorithm.h" - -//>>>>>>>>>>>>>>>>>>>>>0task - -///#define D_task_WS_ask 0x56 -///#define D_task_WS_enter 0x57 -///#define D_task_WS_init 0x10 - -///#define D_task_OSD_init_key 0x11 -///#define D_task_WS_STEP 0x30 -///#define D_task_WS_heratbeat 0x70 - -#define D_task_WS_wait_cam1 0x51 -#define D_task_WS_T 0x52 -#define D_task_WS_T2 0x62 - -#define D_task_WS_lowPower 0x53 -#define D_task_WS_work 0x5b -#define D_task_WS_cali 0x5c - -#define D_task_WS_ch 0x54 -#define D_task_WS_cal 0x55 - - - - -typedef struct -{ - TS_task task; - vU8 t_stamp; - vU16 t_stamp2; - vU16 wakeup_timer; - - vU8 long_hit; -// vU8 first_run;// -// unsigned char area;// -// unsigned char status;// -// unsigned char key;// -}TS_task_WS_; -extern TS_task_WS_ ts_task_WS; - -extern void L2_task_WS_handle(TS_task_WS_ *s); -extern void L2_task_WS_init(void); -extern void L2_task_WS_handle33(TS_task_WS_ *s); - - -extern TS_P_rf433 TS_paer_value; - - -//<<<<<<<<<<<<<<<<<<<0task - -#endif - - - diff --git a/source/app/common.c b/source/app/common.c deleted file mode 100644 index 67fc94f..0000000 --- a/source/app/common.c +++ /dev/null @@ -1,287 +0,0 @@ -#include "common.h" -//#include "../tpc/tpc_uart.h" -#include "../bsp/bsp_cs1232.h" -#include "../msp/msp_eeprom.h" -#include "../msp/msp_id.h" - -struct global_param G; -struct ts_eeprom_param eep_param; -struct ts_eeprom_enc eep_enc; - -#define EEP_SECTOR_SIZE 0x200 -#define EEP_PARAM_ADDR (EEP_SECTOR_SIZE * 1) -#define EEP_ENC_ADDR (EEP_SECTOR_SIZE * 0) - -void L3_eeprom_read_param() -{ - U8 dlen = 0; - L0_Iap_Read_array(EEP_PARAM_ADDR, (U8*)&eep_param, 2 + EEPROM_PARAM_DATA_MAX + 2); - if(eep_param.filter == EEPROM_PARAM_FILTER) - { - dlen = eep_param.len - 2; - crc16(eep_param.crc,(U8*)&eep_param,2+dlen); - if(eep_param.crc[0] == eep_param.buf[dlen] && eep_param.crc[1] == eep_param.buf[dlen+1]) - { - L0_uart0_uc('#'); - //Lc_buf_copy_uc((U8*)&G.p,(U8*)eep_param.buf,dlen); - Lc_buf_copy_uc((U8*)&G.p,(U8*)eep_param.buf,sizeof(G.p));//防止dlen>sizeof(G.P)引起的内存错误 - } - } -} - -void L3_eeprom_persist_param() -{ - U8 dlen = sizeof(G.p); - eep_param.filter = EEPROM_PARAM_FILTER; - eep_param.len = dlen + 2; - Lc_buf_copy_uc((U8*)eep_param.buf,(U8*)&G.p,dlen); - crc16(eep_param.crc, &eep_param, 2+dlen); - eep_param.buf[dlen] = eep_param.crc[0]; - eep_param.buf[dlen+1] = eep_param.crc[1]; - - L0_Iap_Erase(EEP_PARAM_ADDR); - L0_Iap_Program_array(EEP_PARAM_ADDR, (U8*)&eep_param, 2 + dlen + 2); -} - -int L3_mcu_id_ok(void) -{ - U8 i = 0,crc[2]; - U32 enc_key; - //1.获取MCU_ID - L0_id_get_rom(G.e.mcu_id); - for(i=0;i= weight) - { - break; - } - } - if(isalver = G.p.slaver_id; - pmodbus->oper = oper; - Lc_buf_copy_uc(pmodbus->buf,buf,bufsize); - crc16(pmodbus->crc,&pmodbus->salver,2 + bufsize); - pmodbus->buf[bufsize] = pmodbus->crc[0]; - pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; - - return bufsize + 2 + 2; -} - -int L3_ph4_send_error_pkg(U8 errcode) -{ - TS_PH4_modbus modbusack; - U8 modbuslen = 0; - ModbusErrAck modbusErrAck; - modbusErrAck.errcode = errcode; - - modbuslen = L3_pack_PH4(&modbusack, MODBUS_OPER_ERR, &modbusErrAck, sizeof(modbusErrAck)); - L0_uart0_sendArray((U8*)&modbusack, modbuslen); - return 0; -} - - -TS_PH4_modbus modbusack; -Modbus03 modbus03; -Modbus03Ack modbus03Ack; -Modbus06 modbus06; -Modbus06Ack modbus06Ack; -Modbus10 modbus10; -Modbus10Ack modbus10Ack; - - -int L3_ph4_common_handler(TS_PH4_modbus *pmodbus) -{ - U8 handlerStatus = TP_HANDLED, modbuslen = 0; - switch(pmodbus->oper) - { - case 0x03: - { - U16 i = 0,j = 0,regval = 0; - modbus03.reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); - modbus03.num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); - if((modbus03.num < 5) && (modbus03.reg < sizeof(G)/2)) //每次最多读取4个寄存器 8个字节,以防止越界 - { - for(i=0; i> 8 & 0xFF; - modbus03Ack.buf[j++] = regval & 0xFF; - } - modbus03Ack.bytes = modbus03.num * 2; - modbuslen = L3_pack_PH4(&modbusack, 0x03, &modbus03Ack, modbus03Ack.bytes + 1); - L0_uart0_sendArray((U8*)&modbusack, modbuslen); - } - break; - } - case 0x06: - { - modbus06.reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); - modbus06.val = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); - if(modbus06.reg < sizeof(G)/2) - { - if(modbus06.reg == MEM_2_REG(&G.p.zero)) - { - G._total_zweight = G._total_weight; - G.total_zweight = G._total_zweight/10; - G.total_weight = 0; - } - else if(modbus06.reg == MEM_2_REG(&G.p.reset)) - { - L3_reg_reset(); - } - else - { - *(REG_2_MEM(modbus06.reg)) = modbus06.val; - } - modbus06Ack.reg = modbus06.reg; - modbus06Ack.val = *(REG_2_MEM(modbus06.reg)); - modbuslen = L3_pack_PH4(&modbusack, 0x06, &modbus06Ack, 4); - L0_uart0_sendArray((U8*)&modbusack, modbuslen); - } - - //重新计算重量 - G.total_weight = L3_count_std_weight(G._total_weight); - - //持久化 - if(modbus06.reg > MEM_2_REG(&G.reserved2) && modbus06.reg < MEM_2_REG(&G.reserved3)) - { - L3_eeprom_persist_param(); - } - break; - } - case 0x10: - { - U16 i = 0,j = 0,regval = 0; - modbus10.reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); - modbus10.num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); - modbus10.count = pmodbus->buf[4]; - if((modbus10.num < 21) && (modbus10.reg < sizeof(G)/2)) //每次最多写入20个寄存器 40个字节,以防止越界 - { - for(i=0; ibuf[5+i*2]) << 8 | ((U16)pmodbus->buf[5+i*2+1]); - *(REG_2_MEM(modbus10.reg + i)) = regval; - } - modbus10Ack.reg = modbus10.reg; - modbus10Ack.num = modbus10.num; - modbuslen = L3_pack_PH4(&modbusack, 0x10, &modbus10Ack, 4); - L0_uart0_sendArray((U8*)&modbusack, modbuslen); - } - - //重新计算重量 - G.total_weight = L3_count_std_weight(G._total_weight); - - //持久化 - if(modbus10.reg > MEM_2_REG(&G.reserved2) && modbus10.reg < MEM_2_REG(&G.reserved3)) - { - L3_eeprom_persist_param(); - } - break; - } - default: - L3_ph4_send_error_pkg(MODBUS_ERR_OPCODE); - break; - } - return handlerStatus; -} - diff --git a/source/app/common.h b/source/app/common.h deleted file mode 100644 index 6eb44e8..0000000 --- a/source/app/common.h +++ /dev/null @@ -1,238 +0,0 @@ -#ifndef APP_COMMON_H -#define APP_COMMON_H - -#include "../clib/type.h" - -#define APP_VERSION 0x10 -#define P485_SLAVER_ID 0x01 - -#define D_MCU_BIGENDIAN 1 -// #define D_MCU_LITTLEENDIAN 1 - -#define D_COUNT_WEIGHT(adc) ((S32)((1000.0 * G.p.weight_max * (adc)) / (2 * 0x7FFFFF / 1000 * D_ADS1213_GAIN_VAL * G.p.lmd))) - -enum tp_handle -{ - TP_HANDLED, - TP_UNHANDLE -}; - -/** - * EEPROM 存储结构 - */ -#define EEPROM_PARAM_DATA_MAX 86 -#define EEPROM_PARAM_FILTER 0xAA - -typedef struct ts_eeprom_param -{ - U8 filter; - U8 len; - U8 buf[EEPROM_PARAM_DATA_MAX]; - U8 crc[2]; -}EEPROM_PARAM; - -#define MCU_ID_LEN 7 -#define MCU_ID_KEY_LEN 4 -#define EEPROM_ENC_DATA_MAX 64 -#define EEPROM_ENC_FILTER 0xAA -typedef struct ts_eeprom_enc -{ - U8 enc_key[MCU_ID_KEY_LEN]; - U8 enc_val[MCU_ID_LEN]; - U8 crc[2]; -}EEPROM_ENC; - - -/** - * 用户协议 - */ -enum PROTOCOL_OPER -{ - OPER_RESERVED = 0x00, - OPER_READ = 0x01, - OPER_WRITE = 0x02, - OPER_ACK = 0x03, - OPER_REPORT = 0x04, -}; - -enum MODBUS_OPER -{ - MODBUS_OPER_READ = 0x03, - MODBUS_OPER_WRITE = 0x06, - MODBUS_OPER_ERR = 0x8F, -}; - -enum MODBUS_ERR_CODE -{ - MODBUS_ERR_LEN = 0x01, - MODBUS_ERR_CRC = 0x02, - MODBUS_ERR_OPCODE = 0x03, -}; - -//协议类型: MODBUS RTU模式 -//#define D_s_PH4_modbus_max (16) -#define D_s_PH4_modbus_max (64) - -typedef struct ts_ph4_modbus -{ - U8 salver; //从机地址 - U8 oper; //功能码 - U8 buf[D_s_PH4_modbus_max]; - U8 crc[2]; - U8 num; -}TS_PH4_modbus; - -typedef struct s_modbus_03 -{ - U16 reg; - U16 num; -}Modbus03; - -typedef struct s_modbus_03_ack -{ - U8 bytes; - U8 buf[D_s_PH4_modbus_max-1]; -}Modbus03Ack; - -typedef struct s_modbus_06 -{ - U16 reg; - U16 val; -}Modbus06; - -typedef struct s_modbus_06_ack -{ - U16 reg; - U16 val; -}Modbus06Ack; - -typedef struct s_modbus_10 -{ - U16 reg; - U16 num; - U8 count; -}Modbus10; - -typedef struct s_modbus_10_ack -{ - U16 reg; - U16 num; -}Modbus10Ack; - - -typedef struct s_modbus_err_ack -{ - U8 errcode; -}ModbusErrAck; - - - - - -/** - * Register Map - */ - -#define D_ch_max_num 4 -#define D_weight_std_num 10 - -#if 0 -序号 量程 系数 -1 100kg 100% -2 200kg 100% -3 300kg 100% -4 400kg 100% -5 500kg 100% -6 600kg 100% -7 700kg 100% -8 800kg 100% -9 900kg 100% -10 1000kg 100% -#endif -typedef struct weight_stdization -{ - S16 weight_range; //量程 x 100 - S16 ratio; //重量计算系数,默认100,保留两位小数,相当于x1 -}WeightStdization; - -#define D_weight_show_limit_num 5 -typedef struct weight_show_limit -{ - S16 weight; - S16 times; -}WeightShowLimit; - -//需要持久化的参数,不能超过72字节,否则会导致eeprom溢出 -typedef struct global_param_changable -{ - U16 reset; //reset标志,写入任何值,所有参数恢复初始值 - U16 adc_ch_status; - S16 slaver_id; - S16 zero; //清0标志,写入任何值清0(去皮) - S16 weight_max; //量程 - S16 lmd; //2mv/v - S16 cc_blur_ch_avg; //均值滤波点数 - S16 cc_blur_ch_shift; //移位滤波点数 - S16 cc_blur_all_shift0; //和值移位滤波点数1 - S16 cc_blur_all_shift1; //和值移位滤波点数2 - S16 cc_blur_all_out_d_threshold; //移位阈值1 - S16 cc_blur_all_out_dd_threshold;//移位阈值2 - WeightShowLimit weight_show_limit[D_weight_show_limit_num]; - WeightStdization weight_std[D_weight_std_num]; -}GlobalNeedPersistParam; - -typedef struct mcu_encrypt_info -{ - U8 enc_key[MCU_ID_KEY_LEN]; - U8 mcu_id[MCU_ID_LEN]; - U8 mcu_enc_id[MCU_ID_LEN]; -}McuEncryptInfo; - -typedef struct global_param -{ - //RO Register - S16 reserved1; - S32 total_weight; //净重(显示重量)*100 - S32 total_zweight; //皮重*100 - - //RW Register - S16 reserved2; - GlobalNeedPersistParam p; - S16 reserved3; - - //EncryptInfo - McuEncryptInfo e; - - //Global Variables - S32 weight[D_ch_max_num]; //4路重量 - S32 _total_weight; //实际重量*1000 - S32 _total_zweight; //实际皮重*1000 -}GlobalParam; - -#define ADC_status_chx_Ready_BASE 0x01 -#define ADC_status_ch1_Ready 0x01 -#define ADC_status_ch2_Ready 0x02 -#define ADC_status_ch3_Ready 0x04 -#define ADC_status_ch4_Ready 0x08 - -//寄存器内存基地址 -#define REG_MEM_BASE ((U16*)(&G)) //寄存器基础地址(本文件外部不应该使用该宏定义) -//变量地址转寄存器 -#define MEM_2_REG(mem) (((U16*)(mem) - REG_MEM_BASE) + 1) -//寄存器转变量地址 -#define REG_2_MEM(reg) (REG_MEM_BASE + (U16)((reg) - 1)) - - -extern struct global_param G; -extern struct ts_eeprom_param eep_param; -extern struct ts_eeprom_enc eep_enc; - -extern void L3_reg_init(void); -extern int L3_ph4_common_handler(TS_PH4_modbus *pmodbus); -extern int L3_ph4_send_error_pkg(U8 errcode); -extern int L3_mcu_id_ok(); -extern S32 L3_count_std_weight(S32 weight); - - -#endif - diff --git a/source/app/main.c b/source/app/main.c index 4e60ae9..daf14a2 100644 --- a/source/app/main.c +++ b/source/app/main.c @@ -79,28 +79,29 @@ stc5ac32s #include "main.h" - -/// main init -/// @param a 被测试的变量(param描述参数) -/// @param s 指向描述测试信息的字符串 -/// @return 测试结果(return描述返回值) -/// @see Test() (本函数参考其它的相关的函数,这里作一个链接) -/// @note (note描述需要注意的问题) - void L0_main_init(void) { - Lc_delay_ms(200); - L0_I2C_INIT(1); - L1_app_POWER_init(); - L1_uart0_buf_init();//串口初始化 + //Lc_delay_ms(200); + L0_board_config(); + L0_uart0_buf_init();//串口初始化 EA = 1; - Lc_delay_ms(100); - + //Lc_delay_ms(100); L1_tick_init(); L0_timer0_Init(); - L0_timer1_Init(); - L0_I2C_INIT(1); - //L2_task_ALGO_init(); + + L3_reg_init(); + L3_param_init(); + L2_485_init(); + L0_ADS1213_INIT(); + + L3_task_adc_init(0); + L3_task_adc_init(1); + L3_task_adc_init(2); + L3_task_adc_init(3); + //L3_task_debug_init(); + L3_task_show_init(); + L3_task_reglisten_init(); + L0_uart0_sendArray("v2.7",4); } //=============================================== @@ -108,72 +109,39 @@ void L0_main_init(void) //=============================================== void main(void) { -//----------------------------------------------- -//系统初始化 -//---------------------------------------------- + //初始化 L0_main_init(); - L3_reg_init(); - L2_485_init(); - L0_ADS1213_INIT(); - L1_s2b_PH4_init(&s_uart0_rec,G.p.slaver_id); - L3_task_adc_init(); - - L0_uart0_sendArray("v2.6",4); - P35 = 0;//led on - -//----------------------------------------------- -//系统主循环 -//----------------------------------------------- -#if 1 //看门狗 - if(!L3_mcu_id_ok()) - { - P35 = 0; - P10 = 0; - while(1) - { - if(1 == s_nos_tick.t1s_heatbeart) - { - s_nos_tick.t1s_heatbeart = 0; - L0_uart0_uc('X'); - } - } - } -#endif - //L1_ADS1213_main(); - + //验证加密信息 + //L3_encrypt_handler(); + //主循环 while(1) { if(1 == s_nos_tick.t1s_heatbeart) { s_nos_tick.t1s_heatbeart = 0; - P35 ^= 1; + LED1 ^= 1; } - //单路采集 - L3_task_adc_ch_sample(&ts_adc_ch_sample[0]); - L3_task_adc_ch_sample(&ts_adc_ch_sample[1]); - L3_task_adc_ch_sample(&ts_adc_ch_sample[2]); - L3_task_adc_ch_sample(&ts_adc_ch_sample[3]); + //L1_ADS1213_main(); - //单路滤波 - L3_task_adc_ch_blur(&ts_adc_ch_blur[0]); - L3_task_adc_ch_blur(&ts_adc_ch_blur[1]); - L3_task_adc_ch_blur(&ts_adc_ch_blur[2]); - L3_task_adc_ch_blur(&ts_adc_ch_blur[3]); - - //和值滤波 - L3_task_adc_all_blur(&ts_adc_all_blur); - - //移位切换输出最终数据 - L3_task_adc_all_out(&ts_adc_all_out); - - //更新显示数据 - L3_task_adc_show(&ts_adc_show); + //单路采集滤波 + L3_task_adc_handler(0); + L3_task_adc_handler(1); + L3_task_adc_handler(2); + L3_task_adc_handler(3); + + //显示 + L3_task_adc_filter_show(&ts_adc_blur_show); + //寄存器值监控 + L3_task_reglisten_handle(&s_task_reglisten); + //输出,响应485协议 - L3_task_uart0_modbus_handler(&s_uart0_rec); - } - + L3_task_modbus_handler(&s_uart0_rec); + + //调试输出 + //L3_task_debug(&_s_task_debug); + } } //end main diff --git a/source/app/main.h b/source/app/main.h index dee4b58..ba525f9 100644 --- a/source/app/main.h +++ b/source/app/main.h @@ -36,61 +36,25 @@ #ifndef _MAIN_H #define _MAIN_H -#include "../bsp/bsp_config.h" -//#include "../bsp/adxl362.h" -//#include "../msp/stc_adc.h" #include "../msp/uart0.h" -//#include "../msp/uart2.h" -//#include "../msp/uart4.h" -//#include "../msp/uart3.h" -//#include "../msp/time.h" -//#include "../msp/msp_buzz.h" -//#include "../msp/msp_rtc.h" -//#include "../msp/msp_plcd.h" -#include "../msp/iic_sim.h" -#include "../msp/msp_eeprom.h" -#include "../msp/msp_id.h" - - -#include "../clib/Clib.h" -#include "../clib/bit.h" - -//#include "../debug/debug_drv.h" -//#include "../uartcom/uprotocol.h" -//#include "../uartcom/Uartcom0.h" -#include "../ctask/task.h" -#include "../ctask/tick.h" - -//#include "../bsp/bsp_led.h" - -#include "../bsp/bsp_power.h" - - -//#include "../bsp/Bsp_debug.h" - - -//#include "app_yeelink.h" -#include "app_flow.h" - -//#include "app_Gsensor.h" -//#include "app_io.h" -#include "../tpc/tpc_uart.h" - -#include "stdio.h" -#include "app_paraid.h" -#include "app_algorithm.h"/// +#include "../msp/eeprom.h" +#include "../bsp/bsp_config.h" +#include "../bsp/chipid.h" +#include "../bsp/cs1232.h" +#include "../bsp/rs485.h" -#include "../bsp/bsp_cs1232.h" -#include "../bsp/bsp_485.h" -#include "../app/app_task_uart0.h" -#include "../app/app_task_adc.h" +#include "../app/app_config.h" +#include "../app/task_modbus.h" +#include "../app/task_adc.h" +#include "../app/task_debug.h" +#include "../app/task_register.h" +#include "../app/task_encrypt.h" ////////////////////////////////////////////////////////////////// - #endif //#ifndef _MAIN_H diff --git a/source/app/task_adc.c b/source/app/task_adc.c new file mode 100644 index 0000000..ce38ace --- /dev/null +++ b/source/app/task_adc.c @@ -0,0 +1,418 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2018, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file bsp_drv.c +/// @brief bsp @ driver config +///------------------------------------------------------------------------- +/// @version 1.0 +/// @author CC +/// @date 20180331 +/// @note cc_AS_stc02 +////////////////////////////////////////////////////////////////////////////// + +#include "task_adc.h" +#include "../bsp/bsp_config.h" +#include "../bsp/cs1232.h" +#include "../msp/uart0.h" + +//============================================= + +//S_TASK_ADC_CHANNEL_BLUR ts_adc_channel_blurs[D_ADC_CHANNEL_NUM]; +//S_TASK_ADC_CHANNEL_SHOW ts_adc_channel_show; + +S_TASK_ADC_CHANNEL_SAMPLE ts_adc_channel_samples[D_ADC_CHANNEL_NUM]; +//S_TASK_ADC_BLUR_MID ts_adc_blur_mid[D_ADC_CHANNEL_NUM]; +S_TASK_ADC_BLUR_AVG ts_adc_blur_avg[D_ADC_CHANNEL_NUM]; +S_TASK_ADC_BLUR_SHIFT ts_adc_blur_shift[D_ADC_CHANNEL_NUM]; +S_TASK_ADC_BLUR_OUT ts_adc_blur_out[D_ADC_CHANNEL_NUM]; +S_TASK_ADC_BLUR_SHOW ts_adc_blur_show; + +static U8 count_n(u8 n,u8 d) +{ + if(n < d) + { + return MAX_OUT_NUM + n - d ; + } + else + { + return n-d; + } +} + +U32 Abs(S32 a) +{ + if(a < 0) + { + a = -a; + } + return a; +} +//ch是0123,代表4通道 +void L3_task_adc_init(U8 ch) +{ + //通道采集任务初始化 + L1_task_init(&ts_adc_channel_samples[ch].task); + L3_task_s_go(ts_adc_channel_samples[ch],D_task_init); + ts_adc_channel_samples[ch].status = (R.p.adc_ch_status >> ch) & 0x1; + ts_adc_channel_samples[ch].pool = 0; + ts_adc_channel_samples[ch].adcval = 0; + ts_adc_channel_samples[ch].n = 0; + ts_adc_channel_samples[ch].ch = D_ADCCH_1 + ch; + +#if 0 + //通道中值滤波任务初始化 + L1_task_init(&ts_adc_blur_mid[ch].task); + L3_task_s_go(ts_adc_blur_mid[ch],D_task_init); + ts_adc_blur_mid[ch].n = 0; + ts_adc_blur_mid[ch].max = R.p.adc_blur_mid; + ts_adc_blur_mid[ch].ch = D_ADCCH_1 + ch; +#endif + + //通道均值滤波任务初始化 + L1_task_init(&ts_adc_blur_avg[ch].task); + L3_task_s_go(ts_adc_blur_avg[ch],D_task_init); + ts_adc_blur_avg[ch].max = R.p.adc_blur_avg; + ts_adc_blur_avg[ch].avgval = 0; + ts_adc_blur_avg[ch].n = 0; + ts_adc_blur_avg[ch].ch = D_ADCCH_1 + ch; + + //通道移位滤波任务初始化 + L1_task_init(&ts_adc_blur_shift[ch].task); + L3_task_s_go(ts_adc_blur_shift[ch],D_task_init); + ts_adc_blur_shift[ch].n = 0; + ts_adc_blur_shift[ch].h = 0; + ts_adc_blur_shift[ch].shiftreg[0] = R.p.adc_blur_shift[0]; + ts_adc_blur_shift[ch].shiftreg[1] = R.p.adc_blur_shift[1]; + ts_adc_blur_shift[ch].shiftreg[2] = R.p.adc_blur_shift[2]; + ts_adc_blur_shift[ch].sum[0] = 0; + ts_adc_blur_shift[ch].sum[1] = 0; + ts_adc_blur_shift[ch].sum[2] = 0; + ts_adc_blur_shift[ch].shiftval[0] = 0; + ts_adc_blur_shift[ch].shiftval[1] = 0; + ts_adc_blur_shift[ch].shiftval[2] = 0; + ts_adc_blur_shift[ch].ch = D_ADCCH_1 + ch; + + //输出判定任务初始化 + L1_task_init(&ts_adc_blur_out[ch].task); + L3_task_s_go(ts_adc_blur_out[ch],D_task_init); + ts_adc_blur_out[ch].h= 0; + ts_adc_blur_out[ch].threshold[0] = D_COUNT_ADC(R.p.adc_blur_threshold[0]); //2KG + ts_adc_blur_out[ch].threshold[1] = D_COUNT_ADC(R.p.adc_blur_threshold[1]); //0.5KG + ts_adc_blur_out[ch].newnum = 0; + ts_adc_blur_out[ch].oldnum = 0; + ts_adc_blur_out[ch].newout = 0; + ts_adc_blur_out[ch].n = 0; + ts_adc_blur_out[ch].ch = D_ADCCH_1 + ch; + +#if 0 + //通道切换任务初始化 + //L1_task_init(&ts_adc_channel_switch.task); + L3_task_s_go(ts_adc_channel_switch,D_task_init); +#endif + +} + + +void L3_task_show_init(void) +{ + //显示任务初始化 + L1_task_init(&ts_adc_blur_show.task); + L3_task_s_go(ts_adc_blur_show,D_task_init); + ts_adc_blur_show.rough_weight = 0; +} + + +//ADC Channel 采样任务 +#define D_task_ADC_CHx_SAMPLE_WAIT_LOW 0x53 +#define D_task_ADC_CHx_SAMPLE_READ 0x54 +#define D_task_ADC_CHx_SAMPLE_OUT 0x55 +void L3_task_adc_channel_sample(S_TASK_ADC_CHANNEL_SAMPLE *s) +{ + TTSS_Task_init() + L2_task_go(D_task_ADC_CHx_SAMPLE_WAIT_LOW); + + TTSS_Task_step(D_task_ADC_CHx_SAMPLE_WAIT_LOW) + if(s->status == ADC_CHANNEL_STATUS_READY) //需要判断status是否ready,ready则读取,否则使用pool值 + { + if(0 == L0_2dc_DOUT_AT(s->ch)) + { + L2_task_go(D_task_ADC_CHx_SAMPLE_READ); + } + } + else + { + s->adcval = s->pool; + L2_task_go_Tdelay(D_task_ADC_CHx_SAMPLE_OUT,D_Tdelay_Msec(15)); //延时15ms,模拟一次采样过程 + } + + TTSS_Task_step(D_task_ADC_CHx_SAMPLE_READ) + if(s->status == ADC_CHANNEL_STATUS_READY) //需要重新判断status是否ready,因为channel_switch任务随时可能修改status状态 + { + s->adcval = Abs(L0_ADS1231_readCH(s->ch)); + L2_task_go(D_task_ADC_CHx_SAMPLE_OUT); + } + else + { + L2_task_go(D_task_ADC_CHx_SAMPLE_WAIT_LOW); + } + + TTSS_Task_step(D_task_ADC_CHx_SAMPLE_OUT) + //不判断ready,不管是采集到的真实数据还是pool数据,都继续执行 + s->pool = s->adcval; + s->out[s->n] = s->adcval; + //R.adval[s->ch] = s->out[s->n]; + //L0_uart0_ulhex(R.adval[s->ch]);L0_uart0_0d0a(); + s->n++; + #if 0 + L0_uart0_ulhex(s->out[count_n(s->n,1)]); + L0_uart0_uc(' '); + //L0_uart0_ulhex(ts_adc_blur_mid[s->ch].out[count_n(ts_adc_blur_mid[s->ch].n,1)]); + //L0_uart0_uc(' '); + L0_uart0_ulhex(ts_adc_blur_avg[s->ch].out[count_n(ts_adc_blur_avg[s->ch].n,1)]); + L0_uart0_uc(' '); + L0_uart0_ulhex(ts_adc_blur_shift[s->ch].shiftval[0]); + L0_uart0_uc(' '); + L0_uart0_ulhex(ts_adc_blur_shift[s->ch].shiftval[1]); + L0_uart0_uc(' '); + L0_uart0_ulhex(ts_adc_blur_shift[s->ch].shiftval[2]); + L0_uart0_uc(' '); + L0_uart0_ulhex(R.adval[s->ch]); + L0_uart0_uc(' '); + L0_uart0_ulhex(ts_adc_blur_out[s->ch].oldnum); + L0_uart0_0d0a(); + #endif + + if(s->n >= MAX_OUT_NUM) + { + s->n = 0; + } + L2_task_go(D_task_ADC_CHx_SAMPLE_WAIT_LOW); + + TTSS_Task_end(); +} + +#if 0 +//中值滤波任务 +#define D_task_ADC_CHx_FILTER_MID_GET 0x50 +#define D_task_ADC_CHx_FILTER_MID_COUNT 0x51 +#define D_task_ADC_CHx_FILTER_MID_OUT 0x52 +void L3_task_adc_filter_mid(S_TASK_ADC_BLUR_MID *s) +{ + TTSS_Task_init() + L2_task_go(D_task_ADC_CHx_FILTER_MID_GET); + + TTSS_Task_step(D_task_ADC_CHx_FILTER_MID_GET) + if(ts_adc_channel_samples[s->ch].n >= s->max) + { + U8 i = 0; + for(i=0;imax;i++) + { + s->in[i] = ts_adc_channel_samples[s->ch].out[i]; + } + ts_adc_channel_samples[s->ch].n = 0; + L2_task_go(D_task_ADC_CHx_FILTER_MID_COUNT); + } + + TTSS_Task_step(D_task_ADC_CHx_FILTER_MID_COUNT) + s->midval = Lc_vS32_media(s->in, s->max); + L2_task_go(D_task_ADC_CHx_FILTER_MID_OUT); + + TTSS_Task_step(D_task_ADC_CHx_FILTER_MID_OUT) + s->out[s->n] = s->midval; + //R.adval[s->ch] = s->out[s->n]; + s->n++; + if(s->n >= MAX_OUT_NUM) + { + s->n = 0; + } + L2_task_go(D_task_ADC_CHx_FILTER_MID_GET); + + TTSS_Task_end(); +} +#endif + + +//均值滤波任务 +#define D_task_ADC_CHx_FILTER_AVG_GET 0x50 +#define D_task_ADC_CHx_FILTER_AVG_COUNT 0x51 +#define D_task_ADC_CHx_FILTER_AVG_OUT 0x52 +void L3_task_adc_filter_avg(S_TASK_ADC_BLUR_AVG *s) +{ + TTSS_Task_init() + L2_task_go(D_task_ADC_CHx_FILTER_AVG_GET); + + TTSS_Task_step(D_task_ADC_CHx_FILTER_AVG_GET) + if(ts_adc_channel_samples[s->ch].n >= s->max) + { + U8 i = 0; + ts_adc_channel_samples[s->ch].n = 0; + for(i=0;imax;i++) + { + s->in[i] = ts_adc_channel_samples[s->ch].out[i]; + } + L2_task_go(D_task_ADC_CHx_FILTER_AVG_COUNT); + } + + TTSS_Task_step(D_task_ADC_CHx_FILTER_AVG_COUNT) + s->avgval = Lc_vU32_avg(s->in,s->max); + L2_task_go(D_task_ADC_CHx_FILTER_AVG_OUT); + + TTSS_Task_step(D_task_ADC_CHx_FILTER_AVG_OUT) + s->out[s->n] = s->avgval; + //R.adval[s->ch] = s->out[s->n]; + s->n++; + if(s->n >= MAX_OUT_NUM) + { + s->n = 0; + } + L2_task_go(D_task_ADC_CHx_FILTER_AVG_GET); + + TTSS_Task_end(); + + +} + + +//移位滤波任务 +#define D_task_ADC_CHx_FILTER_SHIFT_GET 0x50 +#define D_task_ADC_CHx_FILTER_SHIFT_COUNT 0x51 +#define D_task_ADC_CHx_FILTER_SHIFT_OUT 0x52 +void L3_task_adc_filter_shift(S_TASK_ADC_BLUR_SHIFT *s) +{ + TTSS_Task_init() + L2_task_go(D_task_ADC_CHx_FILTER_SHIFT_GET); + + TTSS_Task_step(D_task_ADC_CHx_FILTER_SHIFT_GET) + if(s->h != ts_adc_blur_avg[s->ch].n) + { + s->in = ts_adc_blur_avg[s->ch].out[count_n(ts_adc_blur_avg[s->ch].n,1)]; + s->h = ts_adc_blur_avg[s->ch].n; + L2_task_go(D_task_ADC_CHx_FILTER_SHIFT_COUNT); + } + + TTSS_Task_step(D_task_ADC_CHx_FILTER_SHIFT_COUNT) + s->sum[0] -= s->shiftval[0]; + s->sum[0] += s->in; + s->shiftval[0] = s->sum[0] >> s->shiftreg[0]; + s->sum[1] -= s->shiftval[1]; + s->sum[1] += s->in; + s->shiftval[1] = s->sum[1] >> s->shiftreg[1]; + s->sum[2] -= s->shiftval[2]; + s->sum[2] += s->in; + s->shiftval[2] = s->sum[2] >> s->shiftreg[2]; + L2_task_go(D_task_ADC_CHx_FILTER_SHIFT_OUT); + + TTSS_Task_step(D_task_ADC_CHx_FILTER_SHIFT_OUT) + s->out[0][s->n] = s->shiftval[0]; + s->out[1][s->n] = s->shiftval[1]; + s->out[2][s->n] = s->shiftval[2]; + + + //R.adval[s->ch] = s->out[0][s->n] = s->shiftval[0]; + s->n++; + if(s->n >= MAX_OUT_NUM) + { + s->n = 0; + } + L2_task_go(D_task_ADC_CHx_FILTER_SHIFT_GET); + + TTSS_Task_end(); + +} + +//输出判定任务 +#define D_task_ADC_CHx_FILTER_OUT_GET 0x50 +#define D_task_ADC_CHx_FILTER_OUT_COUNT 0x51 +#define D_task_ADC_CHx_FILTER_OUT_CHANGE 0x52 +#define D_task_ADC_CHx_FILTER_OUT_OUT 0x53 +void L3_task_adc_filter_out(S_TASK_ADC_BLUR_OUT *s) +{ + TTSS_Task_init() + L2_task_go(D_task_ADC_CHx_FILTER_OUT_GET); + + TTSS_Task_step(D_task_ADC_CHx_FILTER_OUT_GET) + if(s->h != ts_adc_blur_shift[s->ch].n) + { + s->h = ts_adc_blur_shift[s->ch].n; + s->in[0] = ts_adc_blur_avg[s->ch].out[count_n(ts_adc_blur_avg[s->ch].n, 1)]; + s->in[1] = ts_adc_blur_avg[s->ch].out[count_n(ts_adc_blur_avg[s->ch].n, 2)]; + //获取输出曲线val + s->newout = ts_adc_blur_shift[s->ch].out[s->oldnum][count_n(ts_adc_blur_shift[s->ch].n, 1)]; + L2_task_go(D_task_ADC_CHx_FILTER_OUT_COUNT); + } + + TTSS_Task_step(D_task_ADC_CHx_FILTER_OUT_COUNT) //根据阀值选择输出的曲线 + //判断选择新曲线 + if(Lc_abs(s->in[0] , s->in[1]) >= s->threshold[0])//2KG + { + s->newnum = 0; + } + else if(Lc_abs(s->in[0] , s->in[1]) >= s->threshold[1]) //0.5KG + { + s->newnum = 1; + } + else + { + s->newnum = 2; + } + //L2_task_go(D_task_ADC_CHx_FILTER_OUT_OUT); + L2_task_go(D_task_ADC_CHx_FILTER_OUT_CHANGE); + + TTSS_Task_step(D_task_ADC_CHx_FILTER_OUT_CHANGE) + if(s->newnum != s->oldnum)//切换移位滤波时调整其他滤波的SUM + { + s->oldnum = s->newnum; //不能只调整新值,所有曲线都要一起调整 + //ts_adc_blur_shift[s->ch].sum[1] = (ts_adc_blur_avg[s->ch].out[ts_adc_blur_avg[s->ch].n] * R.adc_blur_avg); + ts_adc_blur_shift[s->ch].sum[0] = s->newout << ts_adc_blur_shift[s->ch].shiftreg[0]; + ts_adc_blur_shift[s->ch].shiftval[0] = s->newout; + ts_adc_blur_shift[s->ch].sum[1] = s->newout << ts_adc_blur_shift[s->ch].shiftreg[1]; + ts_adc_blur_shift[s->ch].shiftval[1] = s->newout; + ts_adc_blur_shift[s->ch].sum[2] = s->newout << ts_adc_blur_shift[s->ch].shiftreg[2]; + ts_adc_blur_shift[s->ch].shiftval[2] = s->newout; + } + L2_task_go(D_task_ADC_CHx_FILTER_OUT_OUT); + + TTSS_Task_step(D_task_ADC_CHx_FILTER_OUT_OUT) + R.adval[s->ch] = s->newout; + //R.adval[s->ch] = ts_adc_channel_samples[s->ch].adcval; + L2_task_go(D_task_ADC_CHx_FILTER_OUT_GET); + + TTSS_Task_end(); + +} + + +//显示任务 +#define D_task_ADC_CHx_SHOW 0x50 +void L3_task_adc_filter_show(S_TASK_ADC_BLUR_SHOW *s) +{ + TTSS_Task_init() + L2_task_go(D_task_ADC_CHx_SHOW); + + TTSS_Task_step(D_task_ADC_CHx_SHOW) + R.ch_weight[0] = D_COUNT_WEIGHT(R.adval[0]); + R.ch_weight[1] = D_COUNT_WEIGHT(R.adval[1]); + R.ch_weight[2] = D_COUNT_WEIGHT(R.adval[2]); + R.ch_weight[3] = D_COUNT_WEIGHT(R.adval[3]); + s->rough_weight = R.ch_weight[0] + R.ch_weight[1] + R.ch_weight[2] + R.ch_weight[3]; //毛重 + if( ABS(R.rough_weight,s->rough_weight) >= 50) //变化超过0.05KG + { + R.rough_weight = s->rough_weight; + R.total_weight = (R.rough_weight > R.total_zweight) ? (R.rough_weight - R.total_zweight) : (0);//净重 + } + L2_task_go_Tdelay(D_task_ADC_CHx_SHOW,D_Tdelay_Msec(15)); //延时15ms + + TTSS_Task_end(); +} + +void L3_task_adc_handler(u8 ch) +{ + L3_task_adc_channel_sample(&ts_adc_channel_samples[ch]); + //L3_task_adc_filter_mid(&ts_adc_blur_mid[ch]); + L3_task_adc_filter_avg(&ts_adc_blur_avg[ch]); + L3_task_adc_filter_shift(&ts_adc_blur_shift[ch]); + L3_task_adc_filter_out(&ts_adc_blur_out[ch]); +} + + + diff --git a/source/app/task_adc.h b/source/app/task_adc.h new file mode 100644 index 0000000..327b972 --- /dev/null +++ b/source/app/task_adc.h @@ -0,0 +1,119 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2018, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file bsp_drv.h +/// @brief bsp @ driver config +///------------------------------------------------------------------------- +/// @version 1.0 +/// @author CC +/// @date 20180331 +/// @note cc_AS_stc02 + +////////////////////////////////////////////////////////////////////////////// + +#ifndef _APP_TASK_ADC_H +#define _APP_TASK_ADC_H + +#include "../app/app_config.h" +#include "../ctask/task.h" +#include "../clib/clib.h" + + +#define ADC_CHANNEL_STATUS_UNREADY 0 //UnReady状态,不能读取 +#define ADC_CHANNEL_STATUS_READY 1 //ready状态,可以读取 + +//AD_CHANNEL_SAMPLE 采样 +#define MAX_OUT_NUM 6 +typedef struct _s_task_adc_channel_sample +{ + TS_task task; + vU8 status; + vU8 ch; + vU32 adcval; + vU32 pool; + vU8 n; + vU32 out[MAX_OUT_NUM]; +}S_TASK_ADC_CHANNEL_SAMPLE; + +//AD_BLUR_MID 中值滤波 +typedef struct _s_task_adc_blur_mid + +{ + TS_task task; + vU8 ch; + vU8 max; + vU32 in[MAX_OUT_NUM]; + vU32 midval; + vU8 n; + vU32 out[MAX_OUT_NUM]; +}S_TASK_ADC_BLUR_MID; + +//AD_BLUR_AVG 均值滤波 +typedef struct _s_task_adc_blur_avg +{ + TS_task task; + vU8 ch; + vU8 max; + vU32 in[MAX_OUT_NUM]; + vU32 avgval; + vU8 n; + vU32 out[MAX_OUT_NUM]; +}S_TASK_ADC_BLUR_AVG; + +//AD_BLUR_SHIFT 移位滤波 +typedef struct _s_task_adc_blur_shift +{ + TS_task task; + vU8 ch; + vU8 n; + vU8 h; + vU8 shiftreg[3]; + //vU8 max; + vU32 in; + vU32 sum[3]; + vU32 shiftval[3]; + vU32 out[3][MAX_OUT_NUM]; +}S_TASK_ADC_BLUR_SHIFT; + +//AD_BLUR_DECIDE 输出判定 +typedef struct _s_task_adc_blur_out +{ + TS_task task; + vU8 ch; + vU32 in[2]; + U32 threshold[2]; + vU8 h; + vU8 oldnum; + vU8 newnum; + vU32 newout; + vU8 n; +}S_TASK_ADC_BLUR_OUT; + +//AD_BLUR_SHOW 显示 +typedef struct _s_task_adc_blur_show +{ + TS_task task; + vU32 rough_weight; +}S_TASK_ADC_BLUR_SHOW; + + +extern S_TASK_ADC_CHANNEL_SAMPLE ts_adc_channel_samples[D_ADC_CHANNEL_NUM]; +//extern S_TASK_ADC_BLUR_MID ts_adc_blur_mid[D_ADC_CHANNEL_NUM]; +extern S_TASK_ADC_BLUR_AVG ts_adc_blur_avg[D_ADC_CHANNEL_NUM]; +extern S_TASK_ADC_BLUR_SHIFT ts_adc_blur_shift[D_ADC_CHANNEL_NUM]; +extern S_TASK_ADC_BLUR_OUT ts_adc_blur_out[D_ADC_CHANNEL_NUM]; +extern S_TASK_ADC_BLUR_SHOW ts_adc_blur_show; + + +extern void L3_task_adc_init(U8 ch); +extern void L3_task_show_init(void); +extern void L3_task_adc_handler(U8 ch); +extern void L3_task_adc_init_handler(void); +extern void L3_task_adc_channel_switch_handler(void); +extern void L3_task_adc_filter_show(S_TASK_ADC_BLUR_SHOW *s); + + + + +#endif // #ifndef _APP_TASK_ADC_H + diff --git a/source/app/task_debug.c b/source/app/task_debug.c new file mode 100644 index 0000000..9380cda --- /dev/null +++ b/source/app/task_debug.c @@ -0,0 +1,51 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2018, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file bsp_drv.c +/// @brief bsp @ driver config +///------------------------------------------------------------------------- +/// @version 1.0 +/// @author CC +/// @date 20180331 +/// @note cc_AS_stc02 +////////////////////////////////////////////////////////////////////////////// + +#include "task_debug.h" +#include "../app/app_config.h" +#include "../bsp/bsp_config.h" +#include "../msp/uart0.h" + +S_TASK_DEBUG _s_task_debug; + +//============================================= +void L3_task_debug_init(void) +{ + L1_task_init(&_s_task_debug.task); + L3_task_s_go(_s_task_debug,D_task_init); +} + +#define D_task_ADC_CHx_DEBUG 0x53 +void L3_task_debug(S_TASK_DEBUG *s) +{ + TTSS_Task_init() + L2_task_go(D_task_ADC_CHx_DEBUG); + + TTSS_Task_step(D_task_ADC_CHx_DEBUG) + /* L0_uart0_ulhex(R.adval[0]); + L0_uart0_uc(' '); + L0_uart0_ulhex(R.adval[1]); + L0_uart0_uc(' '); + L0_uart0_ulhex(R.adval[2]); + L0_uart0_uc(' '); + L0_uart0_ulhex(R.adval[3]); + L0_uart0_uc(' ');*/ + L0_uart0_ulhex(R.total_weight); + L0_uart0_0d0a(); + L2_task_go_Tdelay(D_task_ADC_CHx_DEBUG,D_Tdelay_Msec(15)); //延时15ms + + TTSS_Task_end(); +} + + + + diff --git a/source/bsp/bsp_debug.h b/source/app/task_debug.h similarity index 50% rename from source/bsp/bsp_debug.h rename to source/app/task_debug.h index 6940097..7e96363 100644 --- a/source/bsp/bsp_debug.h +++ b/source/app/task_debug.h @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////// -///@copyright Copyright (c) 2018, ؿƼ All rights reserved. +///@copyright Copyright (c) 2018, 传控科技 All rights reserved. ///------------------------------------------------------------------------- /// @file bsp_drv.h /// @brief bsp @ driver config @@ -11,26 +11,22 @@ ////////////////////////////////////////////////////////////////////////////// -#ifndef _bsp_debug_H -#define _bsp_debug_H +#ifndef _APP_TASK_DEBUG_H +#define _APP_TASK_DEBUG_H -#include "../bsp/bsp_config.h" +#include "../ctask/task.h" +#include "../clib/clib.h" -#include "../tpc/tpc_uart.h" - -#include "../msp/uart0.h" - -#define TS_debug_MAX 6 -typedef struct +typedef struct _s_task_debug { - vU8 add; - void (*p2fun)(U8 *pPara); -}TS_debug_; + TS_task task; +}S_TASK_DEBUG; + +extern S_TASK_DEBUG _s_task_debug; -extern void L3_debug_exp_protocol(TS_Handle_PH1 *p); -//extern void L3_UARTcom0_exp_protocol(void); -extern TS_debug_ volatile ts_debug[TS_debug_MAX]; +extern void L3_task_debug_init(void); +extern void L3_task_debug(S_TASK_DEBUG *s); -#endif // #ifndef _bsp_drv_H +#endif // #ifndef _APP_TASK_ADC_H diff --git a/source/app/task_encrypt.c b/source/app/task_encrypt.c new file mode 100644 index 0000000..51c2e70 --- /dev/null +++ b/source/app/task_encrypt.c @@ -0,0 +1,78 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2018, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file bsp_drv.c +/// @brief bsp @ driver config +///------------------------------------------------------------------------- +/// @version 1.0 +/// @author CC +/// @date 20180331 +/// @note cc_AS_stc02 +////////////////////////////////////////////////////////////////////////////// + +#include "task_encrypt.h" +#include "../bsp/bsp_config.h" +#include "../msp/uart0.h" +#include "../msp/eeprom.h" +#include "../bsp/chipid.h" + +struct ts_eeprom_enc eep_enc; +struct mcu_encrypt_info enc_info; + +/** + * + * @brief: eeprom的D_EEP_ENC_IN_SECTOR、D_EEP_ENC_IN_BLOCK中提前存放了加密信息: enc_key, enc_val(enc_key+chipid计算所得) + * @param: void + * @return: 1 is ok , 0 is failed + * + */ +int L3_mcu_id_ok(void) +{ + U8 i = 0; + + //1. 获取eeprom中存储的enc信息 + if(L1_eep_read_block(D_EEP_ENC_IN_SECTOR, D_EEP_ENC_IN_BLOCK, D_EEP_ENC_BLOCK_SIZE, (U8*)&eep_enc,NULL) == 1) + { + //L0_uart0_sendstr("e2p read enc failed"); + return 0; + } + //L0_uart0_sendstr("e2p read enc success"); + + //2.获取MCU_ID + L0_id_get_rom(enc_info.mcu_id); + //L0_uart0_sendArray(enc_info.mcu_id,MCU_ID_LEN); + + //3.根据mcu_id和enc_key计算enc_val + //enc_key = ((U32)eep_enc.enc_key[0] << 24) | (eep_enc.enc_key[1] << 16) | (eep_enc.enc_key[2] << 8) |(eep_enc.enc_key[3] << 0); + Lc_encrypt_id1((U8*)enc_info.mcu_enc_id, (U8*)enc_info.mcu_id, eep_enc.enc_key, MCU_ID_LEN); + +#if 1 + //4.判断enc_val是否一致 + for(i=0;i>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Encryption CONFIG +#define MCU_ID_LEN 7 +#define MCU_ID_KEY_LEN 4 +#define EEPROM_ENC_DATA_MAX 64 +#define EEPROM_ENC_FILTER 0xAA +typedef struct ts_eeprom_enc +{ + U8 enc_key[MCU_ID_KEY_LEN]; + U8 enc_val[MCU_ID_LEN]; + //U8 crc[2]; +}EEPROM_ENC; + +typedef struct mcu_encrypt_info +{ + U8 enc_key[MCU_ID_KEY_LEN]; + U8 mcu_id[MCU_ID_LEN]; + U8 mcu_enc_id[MCU_ID_LEN]; +}McuEncryptInfo; + +extern struct ts_eeprom_enc eep_enc; +extern struct mcu_encrypt_info enc_info; +//STEP 2 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<slaver = slaverId; + pmodbus->oper = MODBUS_OPER_READ; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = num >> 8 * 0xFF; + pmodbus->buf[3] = num >> 0 & 0xFF; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +U8 L3_pack_modbus_06(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf) +{ + U8 bufsize = 4; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_WRITE; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = buf[0]; + pmodbus->buf[3] = buf[1]; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +U8 L3_pack_modbus_10(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U16 num, U8 bytes, U8 *buf) +{ + U8 bufsize = 5,i = 0; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_WRITE_M; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = num >> 8 * 0xFF; + pmodbus->buf[3] = num >> 0 & 0xFF; + pmodbus->buf[4] = bytes; + + for(i=0;ibuf[5+i] = buf[i]; + } + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize + bytes); + pmodbus->buf[bufsize + bytes] = pmodbus->crc[0]; + pmodbus->buf[bufsize + bytes + 1] = pmodbus->crc[1]; + + return bufsize + bytes + 2 + 2; +} + +U8 L3_pack_modbus(TS_PH4_modbus *pmodbus, MD_SLAVER_INFO *slaver_info) +{ + switch(slaver_info->oper) + { + case MODBUS_OPER_READ: + return L3_pack_modbus_03(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum); + case MODBUS_OPER_WRITE: + return L3_pack_modbus_06(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->buf); + case MODBUS_OPER_WRITE_M: + return L3_pack_modbus_10(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf); + default: + return 0; + } +} + +U8 L3_pack_modbusack(TS_PH4_modbus *pmodbus ,U8 slaver, U8 oper, U8 bufsize) +{ + pmodbus->slaver = slaver; + pmodbus->oper = oper; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +//MODBUS从设备数据处理函数 +static Modbus03Ack *pModbus03Ack; +static Modbus06Ack *pModbus06Ack; +static Modbus10Ack *pModbus10Ack; +static U16 modbuslen = 0,reg,num,val,count; +U16 L3_modbus_slaver_ack(TS_PH4_modbus *pmodbus,TS_PH4_modbus *pModbusAck) +{ + switch(pmodbus->oper) + { + case MODBUS_OPER_READ: + case MODBUS_OPER_READCONFIG: + { + U16 i = 0,j = 0,regval = 0; + pModbus03Ack = (Modbus03Ack *)pModbusAck->buf; + reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); + num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); + if((num <= D_MODBUS_REG_MAX_NUM) && (reg <= sizeof(R)/2)) //每次最多读取D_MODBUS_REG_MAX_NUM个寄存器.防止越界 + { + for(i=0; ibuf[j++] = regval >> 8 & 0xFF; + pModbus03Ack->buf[j++] = regval & 0xFF; + } + pModbus03Ack->bytes = num * 2; + modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, pModbus03Ack->bytes + 1); + } + break; + } +#if 0 + case MODBUS_OPER_WRITE: + { + pModbus06Ack = (Modbus06Ack *)pModbusAck->buf; + reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); + val = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); + if(reg <= sizeof(R)/2) + { + *(REG_2_MEM(reg)) = val; + pModbus06Ack->reg = reg; + pModbus06Ack->val = *(REG_2_MEM(reg)); + modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, 4); + } + break; + } +#endif + case MODBUS_OPER_WRITE_M: + { + U16 i = 0; + pModbus10Ack = (Modbus10Ack *)pModbusAck->buf; + reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); + num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); + count = pmodbus->buf[4]; + if((num <= D_MODBUS_REG_MAX_NUM) && (reg < sizeof(R)/2)) //每次最多写入20个寄存器 40个字节,以防止越界 + { + for(i=0; ibuf[5+i*2]) << 8 | ((U16)pmodbus->buf[5+i*2+1]); + } + pModbus10Ack->reg = reg; + pModbus10Ack->num = num; + modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, 4); + } + break; + } + default:break; + } + return modbuslen; +} + +//MODBUS主设备轮询时,从设备返回数据处理函数 +//MD_SLAVER_INFO需要被正确定义 +void L3_modbus_master_handler(TS_PH4_modbus *pmodbus,MD_SLAVER_INFO *p_slaver_info) +{ + switch(pmodbus->oper) + { + case MODBUS_OPER_READ: + case MODBUS_OPER_READCONFIG: + { + U8 i = 0; + for(i=0;ibuf[0];i++) + { + //此处假设字节序一致 + p_slaver_info->buf[i] = pmodbus->buf[i + 1]; + //TODO 字节序不一致时的处理 + } + break; + } + case MODBUS_OPER_WRITE: + case MODBUS_OPER_WRITE_M: + default: break; + } +} + + +void L3_task_modbus_handler(TP_Handler_X *ph4) +{ + if(ph4->ok) + { + TS_PH4_modbus *ts_modbus = (TS_PH4_modbus *)ph4->buf; + //L0_uart0_sendArray(ph4->buf, 8); + //L0_uart0_sendArray("abcdefgh", 8); + ph4->ok = 0; + if(ts_modbus->slaver == R.p.slaver_id || ts_modbus->slaver == D_UART0_485_SLAVER_ID_BROADCAST) //从机 + { + U16 acklen = L3_modbus_slaver_ack(ts_modbus,&s_uart0_ack); + L0_uart0_sendArray((U8*)&s_uart0_ack, acklen); + } + } +} + + diff --git a/source/app/task_modbus.h b/source/app/task_modbus.h new file mode 100644 index 0000000..98b32ef --- /dev/null +++ b/source/app/task_modbus.h @@ -0,0 +1,9 @@ +#ifndef APP_TASK_UART0_H +#define APP_TASK_UART0_H + +#include "../ctask/task.h" +#include "../tpc/modbus.h" + +extern void L3_task_modbus_handler(TP_Handler_X *ph4); + +#endif diff --git a/source/app/task_register.c b/source/app/task_register.c new file mode 100644 index 0000000..ac3b364 --- /dev/null +++ b/source/app/task_register.c @@ -0,0 +1,63 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2018, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file bsp_drv.c +/// @brief bsp @ driver config +///------------------------------------------------------------------------- +/// @version 1.0 +/// @author CC +/// @date 20180331 +/// @note cc_AS_stc02 +////////////////////////////////////////////////////////////////////////////// + +#include "task_register.h" +#include "../app/app_config.h" +#include "../bsp/bsp_config.h" +#include "../msp/uart0.h" + +//============================================= + +S_TASK_REGVAL_LISTEN s_task_reglisten; + +void L3_task_reglisten_init(void) +{ + L1_task_init(&s_task_reglisten.task); + L3_task_s_go(s_task_reglisten,D_task_init); +} + +//清零任务 +#define D_task_WEIGHT_COUNT 0x50 +#define D_task_IAP 0x51 +void L3_task_reglisten_handle(S_TASK_REGVAL_LISTEN *s) +{ + + TTSS_Task_init() + L2_task_go(D_task_WEIGHT_COUNT); + + TTSS_Task_step(D_task_WEIGHT_COUNT) + if(R.zero != 0) + { + R.total_zweight = R.rough_weight; //皮重 = 毛重 + R.total_weight = (R.rough_weight > R.total_zweight) ? (R.rough_weight - R.total_zweight) : (0);//净重 + R.zero = 0; + } + L2_task_go(D_task_IAP); //延时100ms + + + TTSS_Task_step(D_task_IAP) + if(R.status_eep_save != 0) + { + R.status_eep_save = 0; + L3_reg_2_iap();//写入IAP + } + L2_task_go_Tdelay(D_task_WEIGHT_COUNT,D_Tdelay_Msec(100)); //延时100ms + + + TTSS_Task_end(); + +} + + + + + diff --git a/source/app/task_register.h b/source/app/task_register.h new file mode 100644 index 0000000..d675a43 --- /dev/null +++ b/source/app/task_register.h @@ -0,0 +1,32 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2018, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file bsp_drv.h +/// @brief bsp @ driver config +///------------------------------------------------------------------------- +/// @version 1.0 +/// @author CC +/// @date 20180331 +/// @note cc_AS_stc02 + +////////////////////////////////////////////////////////////////////////////// + +#ifndef _APP_TASK_REG_H +#define _APP_TASK_REG_H + +#include "../ctask/task.h" +#include "../clib/clib.h" + +typedef struct _s_task_reglisten +{ + TS_task task; +}S_TASK_REGVAL_LISTEN; + +extern S_TASK_REGVAL_LISTEN s_task_reglisten; + +extern void L3_task_reglisten_init(void); +extern void L3_task_reglisten_handle(S_TASK_REGVAL_LISTEN *s); + + +#endif // #ifndef _APP_TASK_ADC_H + diff --git a/source/bsp/backu/bsp2019低功耗采样line版本 20200301073727.rar b/source/bsp/backu/bsp2019低功耗采样line版本 20200301073727.rar deleted file mode 100644 index f3236c84002a48455f6e0fb14eee0c32954ade75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8904 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 UAAF)x|I-qC9~KD!h$8_07hrrBrT_o{ diff --git a/source/bsp/backu/bsp_433.c b/source/bsp/backu/bsp_433.c deleted file mode 100644 index 42c4d12..0000000 --- a/source/bsp/backu/bsp_433.c +++ /dev/null @@ -1,34 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -///@copyright Copyright (c) 2018, ؿƼ All rights reserved. -///------------------------------------------------------------------------- -/// @file APP_433.c -/// @brief APP_POWER driver app Դ - -///------------------------------------------------------------------------- -/// @version 1.0 -/// @author CC -/// @date 20181010 -/// @note cc_AS_stc01 -////////////////////////////////////////////////////////////////////////////// - - - -/******************************************************************************/ -/***************************** Include Files **********************************/ -/******************************************************************************/ -//#include "app_Gsensor.h" - -#include "bsp_433.h" - - - - -////L0_uart0_sendArray( (unsigned char *)&TS_paer_value,5); - - - - - - - - diff --git a/source/bsp/backu/bsp_433.h b/source/bsp/backu/bsp_433.h deleted file mode 100644 index f224617..0000000 --- a/source/bsp/backu/bsp_433.h +++ /dev/null @@ -1,19 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -///@copyright Copyright (c) 2018, ؿƼ All rights reserved. -///------------------------------------------------------------------------- -/// @file APP_433.c -/// @brief APP_POWER driver app Դ - -///------------------------------------------------------------------------- -/// @version 1.0 -/// @author CC -/// @date 20181010 -/// @note cc_AS_stc01 -////////////////////////////////////////////////////////////////////////////// - - -#ifndef _BSP_433_H -#define _BSP_433_H -#include "../msp/uart0.h" -#endif // #ifndef _BSP_433_H - diff --git a/source/bsp/backu/bsp_cam - 副本 (2).c b/source/bsp/backu/bsp_cam - 副本 (2).c deleted file mode 100644 index 83e114f..0000000 --- a/source/bsp/backu/bsp_cam - 副本 (2).c +++ /dev/null @@ -1,574 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -///@copyright Copyright (c) 2018, ؿƼ All rights reserved. -///------------------------------------------------------------------------- -/// @file bsp_gc6133.c.c -/// @brief bsp @ driver config -///------------------------------------------------------------------------- -/// @version 1.0 -/// @author CC -/// @date 20180331 -/// @note cc_AS_stc02 -////////////////////////////////////////////////////////////////////////////// - -#include "Bsp_debug.h" -#include "bsp_func.h" -#include "bsp_power.h" -#include "bsp_cam_isr.h" -#include "bsp_cam.h" -#include "../msp/uart0.h" -#include "cw63xx.h" -#include "../clib/Clib.h" -#include "../clib/bit.h" -#include "../msp/time.h" - -TS_P_rf433 TS_paer_value= -{ - 0xaa,///vU8 ha; -// 0xaa,///vU8 hb; - 0xad, - 0x0123, -// 0x00,///U16 paperNum:12; //12bitֽ - ///U8 cameraIndex:2; //ͷ - ///U8 cameraWorking:1; //Ƿ - ///U8 reserved: 1; // - 0x56,///U8 cameraBoardPower; // - 0xcc//, 0xaa///vU8 hc; - -}; - -void GC032A_port_init(void) -{ - ///00 ׼˫ 20mA 270-150uS - ///01 20mA - ///10 - ///11 © open-Drain ڲϿ ©ģʽȿԶⲿ״̬ҲԶߵ͵ƽ - - //p3.6 --HSYNC -// BITN_0(P3M1,BITN6);BITN_0(P3M0,BITN6); - ///P3.7 -- VSYNC -// BITN_0(P3M1,BITN7);BITN_0(P3M0,BITN7); - L0_GC032A_standby(); - D_cam_AVDD_on(); - -} -////>>>>>>>>>>>>>>>>>>>>>_s_task_GC032A_>>>>>>>>>>>>>>>>>>>>>> - - - - -struct _s_task_GC032A_ s_task_GC032A; - -void L2_task_GC032A_init(void) -{ - L0_cam_isr_init(); - - L1_task_init(&s_task_GC032A.task); - ///L3_task_s_go(s_task_GC032A,D_task_init); - s_task_GC032A.next_line = D_clear; - s_task_GC032A.run = D_run; - s_task_GC032A.line_get = D_clear; - s_task_GC032A.cal_ok = D_clear; - s_task_GC032A.frames = 0; - s_task_GC032A.vs_ok = D_clear; - s_task_GC032A.line_en = D_ON; - s_task_GC032A.cal_en = D_OFF; -/// D_HSYNCS_open();//BITN_1(INT_CLKO, INT_EX2);//ʹINT2ж -} - -#if 10 - -///// get -void L2_task_GC032A_handle(struct _s_task_GC032A_ *s) -{ - - TTSS_Task_init(); - //PWDNͣ0 -- 1 -- ߣ - L0_GC032A_standby(); - L0_uart0_uc('2'); - L2_task_go(D_task_GC032A_init_DVDD); - TTSS_Task_step(D_task_GC032A_init_DVDD); - L0_GC032A_work(); - //IOVDDϵ磬ʱ50usϣ - D_cam_DVDD_on(); - // L0_uart0_uc('3'); - L2_task_go(D_task_GC032A_init_AVDD); - //L1_task_Tdelay(D_Tdelay_10ms); - TTSS_Task_step(D_task_GC032A_init_AVDD); - //AVDD28ϵ磬ʱ0us - D_cam_AVDD_on(); - L0_uart0_uc('4'); - L2_task_go(D_task_GC032A_init_pwdn); - TTSS_Task_step(D_task_GC032A_init_pwdn); - //ṩ032AϵͳƵ - /// L0_MCLKO_init(D_ON); - //L0_uart0_uc('n'); - //PWDNߣʱ - L0_GC032A_standby();DL0_WDT();// - L2_task_go(D_task_GC032A_init_pwdn_wait); - L1_task_Tdelay(D_Tdelay_10ms); - TTSS_Task_step(D_task_GC032A_init_pwdn_wait); - L0_GC032A_work(); - GC032a_L0_uart0_uc('5');/// Lc_delay_ms(20); - gRccUs03 = 0; - // L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);/// - L2_task_go(D_task_GC032A_write_reg); - //L2_task_go(0); - L1_task_Tdelay(D_Tdelay_10ms); - TTSS_Task_step(D_task_GC032A_write_reg); - //ͷ Լ2sʱ - if(0 != GC6133_init_reg_tbl[gRccUs03][0]) - { - //GC032a_L0_uart0_uc('k'); - L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);/// - gRccUs03 ++; - }else - { - L2_task_go(D_task_GC032A_div); - ///L1_task_Tdelay(D_Tdelay_500ms); - L1_task_Tdelay(D_Tdelay_1s);///Ҫ ʱܹؼaaaaaa - } - TTSS_Task_step(D_task_GC032A_div); - //L0_GC032A_write(0xfc,0x02); //λ?? - L0_GC032A_write(0xf8,0x03);/// ָƵ - L0_GC032A_write(0xfa,D_0xfa);DL0_WDT();// - GC032a_L0_uart0_uc('6'); - L2_task_go(D_task_GC032A_start_time); -///------------------------------------------------------cam init over -///------------------------------------------------------cam init over -///------------------------------------------------------cam init over - -////ȴ Ź - TTSS_Task_step(D_task_GC032A_start_time); - D_cam_led_on();D_VSYNCS_open(); - L1_GC032A_sleep(D_wakeup); - GC032a_L0_uart0_uc('7'); -/// s->one_line_ok = D_clear;D_ledb_OFF(); - L2_task_go(D_task_GC032A_led); - TTSS_Task_step(D_task_GC032A_led); - ///vs /```24.8ms````\__________________________..1.16s...____________________________/````````\___________ - ///cam_led ```````````\_________________________________________________________/`````````````````\____ - if(D_ready == s->vs_ok)///Ϊ˹ص - { - s_task_GC032A.vs_ok = D_clear; - D_cam_led_off(); GC032a_L0_uart0_uc('D'); - L2_task_go(D_task_GC032A_wait); - } - TTSS_Task_step(D_task_GC032A_wait);////>>>>>>>>>>>>>>>>>>>>>>>--- - ///Ҫ - - if(D_ready == s->line_get) - {DL0_WDT();// - s->line_get = D_clear; - /// 1.standby - /// D_cam_led_off(); - if(D_ON == s->line_en) - { - GC032a_L0_uart0_uc(0xfe); - GC032a_L0_uart0_uc(0xfd); - D_send_us(DR_pclk_n); - //D_send_us(s->lines); - L2_task_go(D_task_GC032A_send_line); - }else - { - L2_task_go(D_task_GC032A_cal); - } - - L1_task_Tdelay(D_Tdelay_10ms); - } - TTSS_Task_step(D_task_GC032A_send_line); - if(D_uart0_free()) - { - L0_uart0_sendArraylong(s->buf,0,199); - L2_task_go(D_task_GC032A_send2); - } - TTSS_Task_step(D_task_GC032A_send2); - if(D_uart0_free()) - { - L0_uart0_sendArraylong(s->buf,200,399); - L2_task_go(D_task_GC032A_send3); - } - TTSS_Task_step(D_task_GC032A_send3); - if(D_uart0_free()) - { - L0_uart0_sendArraylong(s->buf,400,599); - L2_task_go(D_task_GC032A_send4); - } - TTSS_Task_step(D_task_GC032A_send4); - if(D_uart0_free()) - { - L0_uart0_sendArraylong(s->buf,600,639); - L2_task_go(D_task_GC032A_send5); - } - TTSS_Task_step(D_task_GC032A_send5); - if(D_uart0_free()) - { - // 'fe','fd','fd','fc' - // GC032a_L0_uart0_uc(0xfd); - // GC032a_L0_uart0_uc(0xfc); - L2_task_go(D_task_GC032A_line1); - //L2_task_go(D_task_GC032A_sleep); - } - - TTSS_Task_step(D_task_GC032A_line1) - for(gRccUs03 = 1;gRccUs03 < 568;gRccUs03 ++) - { - if((s->buf[gRccUs03 - 1] == 0)&& - (s->buf[gRccUs03] == 1))//// _/`` - { - if(s->buf[gRccUs03 + 1] == 0) - {//_/`\_ Ҫ - - }else - {// ___/````ؿʼߵƽ - s->up_point = gRccUs03; - } - }else if((s->buf[gRccUs03 - 1] == 1)&& - (s->buf[gRccUs03] == 0))//// ``\_ ½ - { - s->down_point = gRccUs03; - - }else - { - - } - } - L2_task_go(D_task_GC032A_line2); - - TTSS_Task_step(D_task_GC032A_line2) - - D_send_us(s->up_point); - D_send_us(s->down_point); - D_send_us(s->down_point - s->up_point); - // DR_pdata_n =0; - // 'fe','fd','fd','fc' - GC032a_L0_uart0_uc(0xfd); - GC032a_L0_uart0_uc(0xfc); - if(D_ON == s->cal_en) - { - L2_task_go(D_task_GC032A_cal); - }else - { - L2_task_go(D_task_GC032A_sleep); - } - TTSS_Task_step(D_task_GC032A_cal) - - - GC032a_L0_uart0_uc('8');//2.1ms - L2_task_go(D_task_GC032A_sleep); - - - TTSS_Task_step(D_task_GC032A_sample); - ///20181007Գ ֶεled ͨvs ض Ƿֲõ - ///ʱled - D_cam_led_on();GC032a_L0_uart0_uc('`'); - L2_task_go(D_task_GC032A_sleep); - // L1_task_Tdelay(D_Tdelay_500ms+6); - TTSS_Task_step(D_task_GC032A_sleep); - /// յⲿrun ˯״̬ ͹Ĵ - ////CAL 10MS 433 10MS ܹ20ms / 1160ms/vs ȡ10ms - /////1160-10 - 20 = 1130ms - /// GC032a_L0_uart0_uc(0x88); - if(D_run == s->run) - { - GC032a_L0_uart0_uc('9');//2.1ms - L2_task_go(D_task_GC032A_led); - L1_task_Tdelay(D_Tdelay_10ms); - }else - { - D_cam_led_off(); - L1_GC032A_sleep(D_sleep); - L2_task_go(0); - } -///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - TTSS_Task_end(); -} - -#else - -///// get -void L2_task_GC032A_handle(struct _s_task_GC032A_ *s) -{ - - TTSS_Task_init(); - //PWDNͣ0 -- 1 -- ߣ - L0_GC032A_standby(); - L0_uart0_uc('2'); - L2_task_go(D_task_GC032A_init_DVDD); - TTSS_Task_step(D_task_GC032A_init_DVDD); - L0_GC032A_work(); - //IOVDDϵ磬ʱ50usϣ - D_cam_DVDD_on(); - // L0_uart0_uc('3'); - L2_task_go(D_task_GC032A_init_AVDD); - //L1_task_Tdelay(D_Tdelay_10ms); - TTSS_Task_step(D_task_GC032A_init_AVDD); - //AVDD28ϵ磬ʱ0us - D_cam_AVDD_on(); - L0_uart0_uc('4'); - L2_task_go(D_task_GC032A_init_pwdn); - TTSS_Task_step(D_task_GC032A_init_pwdn); - //ṩ032AϵͳƵ - /// L0_MCLKO_init(D_ON); - //L0_uart0_uc('n'); - //PWDNߣʱ - L0_GC032A_standby();DL0_WDT();// - L2_task_go(D_task_GC032A_init_pwdn_wait); - L1_task_Tdelay(D_Tdelay_10ms); - TTSS_Task_step(D_task_GC032A_init_pwdn_wait); - L0_GC032A_work(); - GC032a_L0_uart0_uc('5');/// Lc_delay_ms(20); - gRccUs03 = 0; - // L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);/// - L2_task_go(D_task_GC032A_write_reg); - //L2_task_go(0); - L1_task_Tdelay(D_Tdelay_10ms); - TTSS_Task_step(D_task_GC032A_write_reg); - //ͷ Լ2sʱ - if(0 != GC6133_init_reg_tbl[gRccUs03][0]) - { - //GC032a_L0_uart0_uc('k'); - L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);/// - gRccUs03 ++; - }else - { - L2_task_go(D_task_GC032A_div); - ///L1_task_Tdelay(D_Tdelay_500ms); - L1_task_Tdelay(D_Tdelay_1s);///Ҫ ʱܹؼaaaaaa - } - TTSS_Task_step(D_task_GC032A_div); - //L0_GC032A_write(0xfc,0x02); //λ?? - L0_GC032A_write(0xf8,0x03);/// ָƵ - L0_GC032A_write(0xfa,D_0xfa);DL0_WDT();// - GC032a_L0_uart0_uc('6'); - L2_task_go(D_task_GC032A_start_time); -///------------------------------------------------------cam init over -///------------------------------------------------------cam init over -///------------------------------------------------------cam init over - -////ȴ Ź - TTSS_Task_step(D_task_GC032A_start_time); - D_cam_led_on();D_VSYNCS_open(); - L1_GC032A_sleep(D_wakeup); - GC032a_L0_uart0_uc('7'); -/// s->one_line_ok = D_clear;D_ledb_OFF(); - L2_task_go(D_task_GC032A_led); - TTSS_Task_step(D_task_GC032A_led); - ///vs /```24.8ms````\__________________________..1.16s...____________________________/````````\___________ - ///cam_led ```````````\_________________________________________________________/`````````````````\____ - if(D_ready == s->vs_ok)///Ϊ˹ص - { - s_task_GC032A.vs_ok = D_clear; - D_cam_led_off(); GC032a_L0_uart0_uc('_'); - L2_task_go(D_task_GC032A_wait); - } - TTSS_Task_step(D_task_GC032A_wait);////>>>>>>>>>>>>>>>>>>>>>>>--- - ///Ҫ - if(1 == s->line_get) - {DL0_WDT();// - s->line_get = 0; - L2_task_go(D_task_GC032A_cal);//// м - } - TTSS_Task_step(D_task_GC032A_cal); - ///һ line - ///D_txd4_wakeup(); - ///GC032a_L0_uart0_uc(0xd); GC032a_L0_uart0_uc(0xa);// - s->buf[D_pclk_per_hs + 1] =s->buf[30]; - ///GC032a_L0_uart0_uchex(s->buf[D_pclk_per_hs + 1]); - gRccUs04 = 0; - for(gRccUs03 = 0;gRccUs03 < D_pclk_per_hs_2;gRccUs03 ++) - { //s->buf[gRccUs03] = 0x10; - //debug ʾǰյ - //L0_uart0_uc(s->buf[gRccUs03]); - if(s->buf[gRccUs03] >= 0x10) - { - s->buf[gRccUs03] -= 0x10; - } - s->buf[gRccUs03] >>= 1; - gRccUs04 += s->buf[gRccUs03]; - } - gRccUs04 >>= 2;//gRccUs04 >>= 4; - TS_paer_value.r123.paperNum = gRccUs04; - ///GC032a_L0_uart0_uchex((unsigned char)(gRccUs04>>8)); - s_task_GC032A.cal_ok = D_ready; - - L2_task_go(D_task_GC032A_sample);/// ʱʼ - L1_task_Tdelay(D_Tdelay_300ms); //700=1a 600=1e 500 21 400 25 300 26 - - TTSS_Task_step(D_task_GC032A_sample); - ///20181007Գ ֶεled ͨvs ض Ƿֲõ - ///ʱled - D_cam_led_on();GC032a_L0_uart0_uc('`'); - L2_task_go(D_task_GC032A_sleep); - // L1_task_Tdelay(D_Tdelay_500ms+6); - TTSS_Task_step(D_task_GC032A_sleep); - /// յⲿrun ˯״̬ ͹Ĵ - ////CAL 10MS 433 10MS ܹ20ms / 1160ms/vs ȡ10ms - /////1160-10 - 20 = 1130ms - /// GC032a_L0_uart0_uc(0x88); - if(D_run == s->run) - { - GC032a_L0_uart0_uc('r');//2.1ms - L2_task_go(D_task_GC032A_led); - }else - { - D_cam_led_off(); - L1_GC032A_sleep(D_sleep); - L2_task_go(0); - } -///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - TTSS_Task_end(); -} - - - - -#endif - -void L1_GC032A_sleep(unsigned char onf) -{///FE 15 Fd 33 44//standby -///FE 05 Fd 33 44//wakeup - if(D_sleep == onf) - { - GC032a_L0_uart0_uc('L'); - /// standby: - L0_GC032A_write(0xfc,0x03); L0_GC032A_write(0xf7,0x00); L0_GC032A_write(0xf9,0xcf); L0_GC032A_write(0xf3,0x00); - Lc_delay_nop(30); - Lc_delay_nop(30); - /// D_cam_AVDD_off(); - // D_cam_led_off(); - }else - { - GC032a_L0_uart0_uc('X'); - /// ˳standby: - L0_GC032A_write(0xfc,0x02); L0_GC032A_write(0xf7,0x01); L0_GC032A_write(0xf9,0xce); L0_GC032A_write(0xf3,0xff); - /// D_cam_led_on(); - } -} - -#if 10 -void L3_GC032A_fun(U8 *pPara) -{ - - -} -#else - -//// fe 01 reg data 0cx -/// Ac 01 02 03 ocr ---bsp_debug.c -/// p.cmd p.R2 p.R3 p.ocr -///Ac 00 03 01 00/// ACC_X[13:6] - -void L3_GC032A_fun(U8 *pPara) -{ - U8 i,val[2]; -// unsigned short j; - TS_P_debug *p = pPara; - switch(p->cmd) - { - - case 0x01: - ///AE 01 FE 33 44 // L0_GC032A_read(0xFE,&i,1); ȡǰҳ - ///AE 01 F0 33 44 // L0_GC032A_read(0xF0,&i,1); ȡid i= 0x23 - L0_GC032A_read(p->R2,&i,1); - L0_uart0_uc(i); - break; - //޸ͷò - case 0x02: - /// fe 02 r2 r3 xx üĴ(r2) = r3 - /// sysreg FE 02 FE 01 44 //õǰҳ01 - L0_GC032A_write(p->R2,p->R3); - L0_uart0_uc(p->R2); - L0_uart0_uc(p->R3); - break; - //ͷգ - case 0x03:/// sysreg FE 03 03 04 05 //ǷһlineݣݷΪһ֡=640Line = 640line*480pclk - ///AE 03 01 33 44 //s_task_GC032A.line_onf = 01 - ///AE 03 00 33 44 //s_task_GC032A.line_onf = 00 - s_task_GC032A.line_onf = p->R2; - L0_uart0_uc(0x30|s_task_GC032A.line_onf); - break; - case 0x05: - ///AE 05 01 33 44 // standby - ///AE 05 00 33 44 //˳ standby - L1_GC032A_sleep(p->R2); - L0_uart0_uc(0x30|s_task_GC032A.line_onf); - break; - case 6:///AE 06 22 33 44 - D_cam_led_off(); - break; - case 7:///AE 07 22 33 44 - D_cam_led_on(); - - break; - /******************* - case 0x00: - L0_GC032A_read(p->R2,val,p->R3); - L0_uart0_uc(p->cmd); - L0_uart0_uc(p->R2); - L0_uart0_uc(p->R3); - L0_uart0_uc('G'); - for(i = 0;i < p->R3;i++) - { - L0_uart0_uc(val[i]); - } - break; - //ȡͷò - case 0x35: - L0_GC032A_standby();// led 17.1-16.9ma standby 6.2ma - L0_uart0_uc(0x31); - break; - case 0x36: - /// ˳standby: - L0_GC032A_work(); - L0_uart0_uc(0x30); - break; - - - ****************************/ - - default: - break; - }; -} - -#endif - - - -#if 0 -FE 02 88 15 10 13 11 15 11 16 12 14 11 15 12 16 12 16 14 17 13 17 13 16 13 16 12 16 13 16 12 18 -14 15 12 15 13 15 12 16 14 15 13 15 12 15 13 16 14 18 14 17 13 16 10 16 15 1A 15 22 2D 3A 3F 47 -41 53 5E 63 65 69 6C 6F 71 7A 72 73 75 7A 7B 7E 7D 82 85 8B 8F 90 8F 93 96 9A 9D 9A 97 98 96 99 -9A 9B 9A 9C 9E 9F 9F 9D 9A 9A 99 9C 9B 9B 9A 9A 9B 9C 9D 9F 9F A0 A1 A2 A3 A2 A2 A3 A1 A3 A4 A4 -A4 A4 A3 A3 A2 A2 A3 A5 A6 A7 A8 A7 A6 A6 A5 A6 A6 A8 AA AA AA AA AA AB AB AB AC AC AB AC AC AD -AF AE AD AD AC AC AB AC AC AD AD AE AE AE AF AD AE AE AD AE AE AE AE AE AF AF AF AF AF AF B0 B1 -B1 B1 B2 B1 B1 B1 B1 B1 B1 B2 B2 B2 B3 B2 B2 B2 B3 B3 B3 B4 B4 B4 B4 B4 B4 B4 B4 B4 B4 B4 B4 B5 -B4 B5 B6 B5 B5 B4 B4 B4 B3 B4 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B5 B6 B6 B6 B6 B6 B6 B6 -B6 B6 B6 B6 B6 B6 B6 B6 B7 B6 B6 B7 B6 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 -B8 B7 B7 B8 B8 B7 B8 B8 B7 B8 B9 B8 B8 B8 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B8 B7 B7 B8 B8 -B8 B8 B8 B8 B8 B8 B7 B7 B7 B7 B8 B8 B9 B8 B9 B8 B8 B8 B8 B7 B7 B7 B7 B7 B8 B8 B8 B8 B8 B8 B8 B8 -B9 B8 B8 B8 B8 B9 BA B8 B8 B8 B7 B8 B8 B8 B8 B8 B8 B8 B9 B8 B7 B7 B7 B7 B7 B7 B6 B6 B7 B7 B7 B7 -B7 B7 B7 B8 B8 B8 B8 B8 B8 B8 B8 B8 B9 B9 B9 B8 B9 B8 B8 B9 BA B9 B8 B8 B8 B8 B9 B8 B9 B8 B8 B8 -B8 B8 B9 B9 B8 B9 B9 B9 B9 B8 B8 B8 B8 B8 B8 B8 B8 B8 B8 B8 B8 B9 B9 B8 B9 B9 B9 B9 B9 B9 BA B9 -B9 B9 B9 B9 B8 B9 B9 B9 B9 B9 B9 B9 B8 B9 B9 B9 B9 B9 B9 B9 B9 B9 BB B9 B9 B9 B9 B9 B9 B9 BA BA -BB B9 B8 B8 B8 B8 B8 B9 B9 BA BA B9 BA B9 B9 B9 B9 B9 B8 B8 B8 B8 B9 B9 B9 B9 BA BA BB B9 B9 B9 -B9 B9 B9 B9 B9 B9 B9 B9 B9 B9 B9 B9 BA B9 B9 B9 B9 BA BA BB BB BA BB BA B9 B9 B9 B9 B9 B9 B9 BA -BB BA BA BA BA B9 B8 B8 B8 B8 B8 B9 B9 BA BB BB BB BA BA B9 B9 B9 B9 B9 BA fd fc - - - -#endif - - - - - - - - - - - - - - diff --git a/source/bsp/backu/bsp_cam - 副本.c b/source/bsp/backu/bsp_cam - 副本.c deleted file mode 100644 index e9c132c..0000000 --- a/source/bsp/backu/bsp_cam - 副本.c +++ /dev/null @@ -1,574 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -///@copyright Copyright (c) 2018, ؿƼ All rights reserved. -///------------------------------------------------------------------------- -/// @file bsp_gc6133.c.c -/// @brief bsp @ driver config -///------------------------------------------------------------------------- -/// @version 1.0 -/// @author CC -/// @date 20180331 -/// @note cc_AS_stc02 -////////////////////////////////////////////////////////////////////////////// - -#include "Bsp_debug.h" -#include "bsp_func.h" -#include "bsp_power.h" -#include "bsp_cam_isr.h" -#include "bsp_cam.h" -#include "../msp/uart0.h" -#include "cw63xx.h" -#include "../clib/Clib.h" -#include "../clib/bit.h" -#include "../msp/time.h" - -TS_P_rf433 TS_paer_value= -{ - 0xaa,///vU8 ha; -// 0xaa,///vU8 hb; - 0xad, - 0x0123, -// 0x00,///U16 paperNum:12; //12bitֽ - ///U8 cameraIndex:2; //ͷ - ///U8 cameraWorking:1; //Ƿ - ///U8 reserved: 1; // - 0x56,///U8 cameraBoardPower; // - 0xcc//, 0xaa///vU8 hc; - -}; - -void GC032A_port_init(void) -{ - ///00 ׼˫ 20mA 270-150uS - ///01 20mA - ///10 - ///11 © open-Drain ڲϿ ©ģʽȿԶⲿ״̬ҲԶߵ͵ƽ - - //p3.6 --HSYNC -// BITN_0(P3M1,BITN6);BITN_0(P3M0,BITN6); - ///P3.7 -- VSYNC -// BITN_0(P3M1,BITN7);BITN_0(P3M0,BITN7); - L0_GC032A_standby(); - D_cam_AVDD_on(); - -} -////>>>>>>>>>>>>>>>>>>>>>_s_task_GC032A_>>>>>>>>>>>>>>>>>>>>>> - - - - -struct _s_task_GC032A_ s_task_GC032A; - -void L2_task_GC032A_init(void) -{ - L0_cam_isr_init(); - - L1_task_init(&s_task_GC032A.task); - ///L3_task_s_go(s_task_GC032A,D_task_init); - s_task_GC032A.next_line = D_clear; - s_task_GC032A.run = D_run; - s_task_GC032A.line_get = D_clear; - s_task_GC032A.cal_ok = D_clear; - s_task_GC032A.frames = 0; - s_task_GC032A.vs_ok = D_clear; - s_task_GC032A.line_en = D_ON; - s_task_GC032A.cal_en = D_OFF; -/// D_HSYNCS_open();//BITN_1(INT_CLKO, INT_EX2);//ʹINT2ж -} - -#if 10 - -///// get -void L2_task_GC032A_handle(struct _s_task_GC032A_ *s) -{ - - TTSS_Task_init(); - //PWDNͣ0 -- 1 -- ߣ - L0_GC032A_standby(); - L0_uart0_uc('2'); - L2_task_go(D_task_GC032A_init_DVDD); - TTSS_Task_step(D_task_GC032A_init_DVDD); - L0_GC032A_work(); - //IOVDDϵ磬ʱ50usϣ - D_cam_DVDD_on(); - // L0_uart0_uc('3'); - L2_task_go(D_task_GC032A_init_AVDD); - //L1_task_Tdelay(D_Tdelay_10ms); - TTSS_Task_step(D_task_GC032A_init_AVDD); - //AVDD28ϵ磬ʱ0us - D_cam_AVDD_on(); - L0_uart0_uc('4'); - L2_task_go(D_task_GC032A_init_pwdn); - TTSS_Task_step(D_task_GC032A_init_pwdn); - //ṩ032AϵͳƵ - /// L0_MCLKO_init(D_ON); - //L0_uart0_uc('n'); - //PWDNߣʱ - L0_GC032A_standby();DL0_WDT();// - L2_task_go(D_task_GC032A_init_pwdn_wait); - L1_task_Tdelay(D_Tdelay_10ms); - TTSS_Task_step(D_task_GC032A_init_pwdn_wait); - L0_GC032A_work(); - GC032a_L0_uart0_uc('5');/// Lc_delay_ms(20); - gRccUs03 = 0; - // L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);/// - L2_task_go(D_task_GC032A_write_reg); - //L2_task_go(0); - L1_task_Tdelay(D_Tdelay_10ms); - TTSS_Task_step(D_task_GC032A_write_reg); - //ͷ Լ2sʱ - if(0 != GC6133_init_reg_tbl[gRccUs03][0]) - { - //GC032a_L0_uart0_uc('k'); - L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);/// - gRccUs03 ++; - }else - { - L2_task_go(D_task_GC032A_div); - ///L1_task_Tdelay(D_Tdelay_500ms); - L1_task_Tdelay(D_Tdelay_1s);///Ҫ ʱܹؼaaaaaa - } - TTSS_Task_step(D_task_GC032A_div); - //L0_GC032A_write(0xfc,0x02); //λ?? - L0_GC032A_write(0xf8,0x03);/// ָƵ - L0_GC032A_write(0xfa,D_0xfa);DL0_WDT();// - GC032a_L0_uart0_uc('6'); - L2_task_go(D_task_GC032A_start_time); -///------------------------------------------------------cam init over -///------------------------------------------------------cam init over -///------------------------------------------------------cam init over - -////ȴ Ź - TTSS_Task_step(D_task_GC032A_start_time); - D_cam_led_on();D_VSYNCS_open(); - L1_GC032A_sleep(D_wakeup); - GC032a_L0_uart0_uc('7'); -/// s->one_line_ok = D_clear;D_ledb_OFF(); - L2_task_go(D_task_GC032A_led); - TTSS_Task_step(D_task_GC032A_led); - ///vs /```24.8ms````\__________________________..1.16s...____________________________/````````\___________ - ///cam_led ```````````\_________________________________________________________/`````````````````\____ - if(D_ready == s->vs_ok)///Ϊ˹ص - { - s_task_GC032A.vs_ok = D_clear; - D_cam_led_off(); GC032a_L0_uart0_uc('D'); - L2_task_go(D_task_GC032A_wait); - } - TTSS_Task_step(D_task_GC032A_wait);////>>>>>>>>>>>>>>>>>>>>>>>--- - ///Ҫ - - if(D_ready == s->line_get) - {DL0_WDT();// - s->line_get = D_clear; - /// 1.standby - /// D_cam_led_off(); - if(D_ON == s->line_en) - { - GC032a_L0_uart0_uc(0xfe); - GC032a_L0_uart0_uc(0xfd); - D_send_us(DR_pclk_n); - //D_send_us(s->lines); - L2_task_go(D_task_GC032A_send_line); - }else - { - L2_task_go(D_task_GC032A_cal); - } - - L1_task_Tdelay(D_Tdelay_10ms); - } - TTSS_Task_step(D_task_GC032A_send_line); - if(D_uart0_free()) - { - L0_uart0_sendArraylong(s->buf,0,199); - L2_task_go(D_task_GC032A_send2); - } - TTSS_Task_step(D_task_GC032A_send2); - if(D_uart0_free()) - { - L0_uart0_sendArraylong(s->buf,200,399); - L2_task_go(D_task_GC032A_send3); - } - TTSS_Task_step(D_task_GC032A_send3); - if(D_uart0_free()) - { - L0_uart0_sendArraylong(s->buf,400,509); - L2_task_go(D_task_GC032A_send5); - } - TTSS_Task_step(D_task_GC032A_send4); - if(D_uart0_free()) - { - L0_uart0_sendArraylong(s->buf,600,639); - L2_task_go(D_task_GC032A_send5); - } - TTSS_Task_step(D_task_GC032A_send5); - if(D_uart0_free()) - { - // 'fe','fd','fd','fc' - // GC032a_L0_uart0_uc(0xfd); - // GC032a_L0_uart0_uc(0xfc); - L2_task_go(D_task_GC032A_line1); - //L2_task_go(D_task_GC032A_sleep); - } - - TTSS_Task_step(D_task_GC032A_line1) - for(gRccUs03 = 1;gRccUs03 < 568;gRccUs03 ++) - { - if((s->buf[gRccUs03 - 1] == 0)&& - (s->buf[gRccUs03] == 1))//// _/`` - { - if(s->buf[gRccUs03 + 1] == 0) - {//_/`\_ Ҫ - - }else - {// ___/````ؿʼߵƽ - s->up_point = gRccUs03; - } - }else if((s->buf[gRccUs03 - 1] == 1)&& - (s->buf[gRccUs03] == 0))//// ``\_ ½ - { - s->down_point = gRccUs03; - - }else - { - - } - } - L2_task_go(D_task_GC032A_line2); - - TTSS_Task_step(D_task_GC032A_line2) - - D_send_us(s->up_point); - D_send_us(s->down_point); - D_send_us(s->down_point - s->up_point); - // DR_pdata_n =0; - // 'fe','fd','fd','fc' - GC032a_L0_uart0_uc(0xfd); - GC032a_L0_uart0_uc(0xfc); - if(D_ON == s->cal_en) - { - L2_task_go(D_task_GC032A_cal); - }else - { - L2_task_go(D_task_GC032A_sleep); - } - TTSS_Task_step(D_task_GC032A_cal) - - - GC032a_L0_uart0_uc('8');//2.1ms - L2_task_go(D_task_GC032A_sleep); - - - TTSS_Task_step(D_task_GC032A_sample); - ///20181007Գ ֶεled ͨvs ض Ƿֲõ - ///ʱled - D_cam_led_on();GC032a_L0_uart0_uc('`'); - L2_task_go(D_task_GC032A_sleep); - // L1_task_Tdelay(D_Tdelay_500ms+6); - TTSS_Task_step(D_task_GC032A_sleep); - /// յⲿrun ˯״̬ ͹Ĵ - ////CAL 10MS 433 10MS ܹ20ms / 1160ms/vs ȡ10ms - /////1160-10 - 20 = 1130ms - /// GC032a_L0_uart0_uc(0x88); - if(D_run == s->run) - { - GC032a_L0_uart0_uc('9');//2.1ms - L2_task_go(D_task_GC032A_led); - L1_task_Tdelay(D_Tdelay_10ms); - }else - { - D_cam_led_off(); - L1_GC032A_sleep(D_sleep); - L2_task_go(0); - } -///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - TTSS_Task_end(); -} - -#else - -///// get -void L2_task_GC032A_handle(struct _s_task_GC032A_ *s) -{ - - TTSS_Task_init(); - //PWDNͣ0 -- 1 -- ߣ - L0_GC032A_standby(); - L0_uart0_uc('2'); - L2_task_go(D_task_GC032A_init_DVDD); - TTSS_Task_step(D_task_GC032A_init_DVDD); - L0_GC032A_work(); - //IOVDDϵ磬ʱ50usϣ - D_cam_DVDD_on(); - // L0_uart0_uc('3'); - L2_task_go(D_task_GC032A_init_AVDD); - //L1_task_Tdelay(D_Tdelay_10ms); - TTSS_Task_step(D_task_GC032A_init_AVDD); - //AVDD28ϵ磬ʱ0us - D_cam_AVDD_on(); - L0_uart0_uc('4'); - L2_task_go(D_task_GC032A_init_pwdn); - TTSS_Task_step(D_task_GC032A_init_pwdn); - //ṩ032AϵͳƵ - /// L0_MCLKO_init(D_ON); - //L0_uart0_uc('n'); - //PWDNߣʱ - L0_GC032A_standby();DL0_WDT();// - L2_task_go(D_task_GC032A_init_pwdn_wait); - L1_task_Tdelay(D_Tdelay_10ms); - TTSS_Task_step(D_task_GC032A_init_pwdn_wait); - L0_GC032A_work(); - GC032a_L0_uart0_uc('5');/// Lc_delay_ms(20); - gRccUs03 = 0; - // L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);/// - L2_task_go(D_task_GC032A_write_reg); - //L2_task_go(0); - L1_task_Tdelay(D_Tdelay_10ms); - TTSS_Task_step(D_task_GC032A_write_reg); - //ͷ Լ2sʱ - if(0 != GC6133_init_reg_tbl[gRccUs03][0]) - { - //GC032a_L0_uart0_uc('k'); - L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);/// - gRccUs03 ++; - }else - { - L2_task_go(D_task_GC032A_div); - ///L1_task_Tdelay(D_Tdelay_500ms); - L1_task_Tdelay(D_Tdelay_1s);///Ҫ ʱܹؼaaaaaa - } - TTSS_Task_step(D_task_GC032A_div); - //L0_GC032A_write(0xfc,0x02); //λ?? - L0_GC032A_write(0xf8,0x03);/// ָƵ - L0_GC032A_write(0xfa,D_0xfa);DL0_WDT();// - GC032a_L0_uart0_uc('6'); - L2_task_go(D_task_GC032A_start_time); -///------------------------------------------------------cam init over -///------------------------------------------------------cam init over -///------------------------------------------------------cam init over - -////ȴ Ź - TTSS_Task_step(D_task_GC032A_start_time); - D_cam_led_on();D_VSYNCS_open(); - L1_GC032A_sleep(D_wakeup); - GC032a_L0_uart0_uc('7'); -/// s->one_line_ok = D_clear;D_ledb_OFF(); - L2_task_go(D_task_GC032A_led); - TTSS_Task_step(D_task_GC032A_led); - ///vs /```24.8ms````\__________________________..1.16s...____________________________/````````\___________ - ///cam_led ```````````\_________________________________________________________/`````````````````\____ - if(D_ready == s->vs_ok)///Ϊ˹ص - { - s_task_GC032A.vs_ok = D_clear; - D_cam_led_off(); GC032a_L0_uart0_uc('_'); - L2_task_go(D_task_GC032A_wait); - } - TTSS_Task_step(D_task_GC032A_wait);////>>>>>>>>>>>>>>>>>>>>>>>--- - ///Ҫ - if(1 == s->line_get) - {DL0_WDT();// - s->line_get = 0; - L2_task_go(D_task_GC032A_cal);//// м - } - TTSS_Task_step(D_task_GC032A_cal); - ///һ line - ///D_txd4_wakeup(); - ///GC032a_L0_uart0_uc(0xd); GC032a_L0_uart0_uc(0xa);// - s->buf[D_pclk_per_hs + 1] =s->buf[30]; - ///GC032a_L0_uart0_uchex(s->buf[D_pclk_per_hs + 1]); - gRccUs04 = 0; - for(gRccUs03 = 0;gRccUs03 < D_pclk_per_hs_2;gRccUs03 ++) - { //s->buf[gRccUs03] = 0x10; - //debug ʾǰյ - //L0_uart0_uc(s->buf[gRccUs03]); - if(s->buf[gRccUs03] >= 0x10) - { - s->buf[gRccUs03] -= 0x10; - } - s->buf[gRccUs03] >>= 1; - gRccUs04 += s->buf[gRccUs03]; - } - gRccUs04 >>= 2;//gRccUs04 >>= 4; - TS_paer_value.r123.paperNum = gRccUs04; - ///GC032a_L0_uart0_uchex((unsigned char)(gRccUs04>>8)); - s_task_GC032A.cal_ok = D_ready; - - L2_task_go(D_task_GC032A_sample);/// ʱʼ - L1_task_Tdelay(D_Tdelay_300ms); //700=1a 600=1e 500 21 400 25 300 26 - - TTSS_Task_step(D_task_GC032A_sample); - ///20181007Գ ֶεled ͨvs ض Ƿֲõ - ///ʱled - D_cam_led_on();GC032a_L0_uart0_uc('`'); - L2_task_go(D_task_GC032A_sleep); - // L1_task_Tdelay(D_Tdelay_500ms+6); - TTSS_Task_step(D_task_GC032A_sleep); - /// յⲿrun ˯״̬ ͹Ĵ - ////CAL 10MS 433 10MS ܹ20ms / 1160ms/vs ȡ10ms - /////1160-10 - 20 = 1130ms - /// GC032a_L0_uart0_uc(0x88); - if(D_run == s->run) - { - GC032a_L0_uart0_uc('r');//2.1ms - L2_task_go(D_task_GC032A_led); - }else - { - D_cam_led_off(); - L1_GC032A_sleep(D_sleep); - L2_task_go(0); - } -///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - TTSS_Task_end(); -} - - - - -#endif - -void L1_GC032A_sleep(unsigned char onf) -{///FE 15 Fd 33 44//standby -///FE 05 Fd 33 44//wakeup - if(D_sleep == onf) - { - GC032a_L0_uart0_uc('L'); - /// standby: - L0_GC032A_write(0xfc,0x03); L0_GC032A_write(0xf7,0x00); L0_GC032A_write(0xf9,0xcf); L0_GC032A_write(0xf3,0x00); - Lc_delay_nop(30); - Lc_delay_nop(30); - /// D_cam_AVDD_off(); - // D_cam_led_off(); - }else - { - GC032a_L0_uart0_uc('X'); - /// ˳standby: - L0_GC032A_write(0xfc,0x02); L0_GC032A_write(0xf7,0x01); L0_GC032A_write(0xf9,0xce); L0_GC032A_write(0xf3,0xff); - /// D_cam_led_on(); - } -} - -#if 10 -void L3_GC032A_fun(U8 *pPara) -{ - - -} -#else - -//// fe 01 reg data 0cx -/// Ac 01 02 03 ocr ---bsp_debug.c -/// p.cmd p.R2 p.R3 p.ocr -///Ac 00 03 01 00/// ACC_X[13:6] - -void L3_GC032A_fun(U8 *pPara) -{ - U8 i,val[2]; -// unsigned short j; - TS_P_debug *p = pPara; - switch(p->cmd) - { - - case 0x01: - ///AE 01 FE 33 44 // L0_GC032A_read(0xFE,&i,1); ȡǰҳ - ///AE 01 F0 33 44 // L0_GC032A_read(0xF0,&i,1); ȡid i= 0x23 - L0_GC032A_read(p->R2,&i,1); - L0_uart0_uc(i); - break; - //޸ͷò - case 0x02: - /// fe 02 r2 r3 xx üĴ(r2) = r3 - /// sysreg FE 02 FE 01 44 //õǰҳ01 - L0_GC032A_write(p->R2,p->R3); - L0_uart0_uc(p->R2); - L0_uart0_uc(p->R3); - break; - //ͷգ - case 0x03:/// sysreg FE 03 03 04 05 //ǷһlineݣݷΪһ֡=640Line = 640line*480pclk - ///AE 03 01 33 44 //s_task_GC032A.line_onf = 01 - ///AE 03 00 33 44 //s_task_GC032A.line_onf = 00 - s_task_GC032A.line_onf = p->R2; - L0_uart0_uc(0x30|s_task_GC032A.line_onf); - break; - case 0x05: - ///AE 05 01 33 44 // standby - ///AE 05 00 33 44 //˳ standby - L1_GC032A_sleep(p->R2); - L0_uart0_uc(0x30|s_task_GC032A.line_onf); - break; - case 6:///AE 06 22 33 44 - D_cam_led_off(); - break; - case 7:///AE 07 22 33 44 - D_cam_led_on(); - - break; - /******************* - case 0x00: - L0_GC032A_read(p->R2,val,p->R3); - L0_uart0_uc(p->cmd); - L0_uart0_uc(p->R2); - L0_uart0_uc(p->R3); - L0_uart0_uc('G'); - for(i = 0;i < p->R3;i++) - { - L0_uart0_uc(val[i]); - } - break; - //ȡͷò - case 0x35: - L0_GC032A_standby();// led 17.1-16.9ma standby 6.2ma - L0_uart0_uc(0x31); - break; - case 0x36: - /// ˳standby: - L0_GC032A_work(); - L0_uart0_uc(0x30); - break; - - - ****************************/ - - default: - break; - }; -} - -#endif - - - -#if 0 -FE 02 88 15 10 13 11 15 11 16 12 14 11 15 12 16 12 16 14 17 13 17 13 16 13 16 12 16 13 16 12 18 -14 15 12 15 13 15 12 16 14 15 13 15 12 15 13 16 14 18 14 17 13 16 10 16 15 1A 15 22 2D 3A 3F 47 -41 53 5E 63 65 69 6C 6F 71 7A 72 73 75 7A 7B 7E 7D 82 85 8B 8F 90 8F 93 96 9A 9D 9A 97 98 96 99 -9A 9B 9A 9C 9E 9F 9F 9D 9A 9A 99 9C 9B 9B 9A 9A 9B 9C 9D 9F 9F A0 A1 A2 A3 A2 A2 A3 A1 A3 A4 A4 -A4 A4 A3 A3 A2 A2 A3 A5 A6 A7 A8 A7 A6 A6 A5 A6 A6 A8 AA AA AA AA AA AB AB AB AC AC AB AC AC AD -AF AE AD AD AC AC AB AC AC AD AD AE AE AE AF AD AE AE AD AE AE AE AE AE AF AF AF AF AF AF B0 B1 -B1 B1 B2 B1 B1 B1 B1 B1 B1 B2 B2 B2 B3 B2 B2 B2 B3 B3 B3 B4 B4 B4 B4 B4 B4 B4 B4 B4 B4 B4 B4 B5 -B4 B5 B6 B5 B5 B4 B4 B4 B3 B4 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B5 B6 B6 B6 B6 B6 B6 B6 -B6 B6 B6 B6 B6 B6 B6 B6 B7 B6 B6 B7 B6 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 -B8 B7 B7 B8 B8 B7 B8 B8 B7 B8 B9 B8 B8 B8 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B8 B7 B7 B8 B8 -B8 B8 B8 B8 B8 B8 B7 B7 B7 B7 B8 B8 B9 B8 B9 B8 B8 B8 B8 B7 B7 B7 B7 B7 B8 B8 B8 B8 B8 B8 B8 B8 -B9 B8 B8 B8 B8 B9 BA B8 B8 B8 B7 B8 B8 B8 B8 B8 B8 B8 B9 B8 B7 B7 B7 B7 B7 B7 B6 B6 B7 B7 B7 B7 -B7 B7 B7 B8 B8 B8 B8 B8 B8 B8 B8 B8 B9 B9 B9 B8 B9 B8 B8 B9 BA B9 B8 B8 B8 B8 B9 B8 B9 B8 B8 B8 -B8 B8 B9 B9 B8 B9 B9 B9 B9 B8 B8 B8 B8 B8 B8 B8 B8 B8 B8 B8 B8 B9 B9 B8 B9 B9 B9 B9 B9 B9 BA B9 -B9 B9 B9 B9 B8 B9 B9 B9 B9 B9 B9 B9 B8 B9 B9 B9 B9 B9 B9 B9 B9 B9 BB B9 B9 B9 B9 B9 B9 B9 BA BA -BB B9 B8 B8 B8 B8 B8 B9 B9 BA BA B9 BA B9 B9 B9 B9 B9 B8 B8 B8 B8 B9 B9 B9 B9 BA BA BB B9 B9 B9 -B9 B9 B9 B9 B9 B9 B9 B9 B9 B9 B9 B9 BA B9 B9 B9 B9 BA BA BB BB BA BB BA B9 B9 B9 B9 B9 B9 B9 BA -BB BA BA BA BA B9 B8 B8 B8 B8 B8 B9 B9 BA BB BB BB BA BA B9 B9 B9 B9 B9 BA fd fc - - - -#endif - - - - - - - - - - - - - - diff --git a/source/bsp/backu/bsp_cam.c b/source/bsp/backu/bsp_cam.c deleted file mode 100644 index 00e44f6..0000000 --- a/source/bsp/backu/bsp_cam.c +++ /dev/null @@ -1,706 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -///@copyright Copyright (c) 2018, ؿƼ All rights reserved. -///------------------------------------------------------------------------- -/// @file bsp_gc6133.c.c -/// @brief bsp @ driver config -///------------------------------------------------------------------------- -/// @version 1.0 -/// @author CC -/// @date 20180331 -/// @note cc_AS_stc02 -////////////////////////////////////////////////////////////////////////////// - -#include "Bsp_debug.h" -#include "bsp_func.h" -#include "bsp_power.h" -#include "bsp_cam_isr.h" -#include "bsp_cam.h" -#include "../msp/uart0.h" -#include "cw63xx.h" -#include "../clib/Clib.h" -#include "../clib/bit.h" -#include "../msp/time.h" - -/// һȵڶӳ20ms ͬ,һ10.5ms ڶûз,ɸ - -#define D_p_send_delay(); L1_task_Cdelay(D_Cdelay_15ms*(1+D_cameralIndex)); - -////>>>>>>>>>>>>>>>>>>>>>_s_task_GC032A_>>>>>>>>>>>>>>>>>>>>>> - - -void L0_p_send(void); -extern TS_P_rf433 TS_paer_value; - - -struct _s_task_GC032A_ s_task_GC032A; - -void L2_task_GC032A_init(void) -{ - L0_cam_isr_init(); - - L1_task_init(&s_task_GC032A.task); - - s_task_GC032A.next_line = D_clear; - s_task_GC032A.line_ok = D_run; - s_task_GC032A.line_get = D_clear; - s_task_GC032A.cal_ok = D_clear; - s_task_GC032A.vs_ok = D_clear; -} - -//// ɼеij 20190217 -//// step01 ϵʱʼ -///step02 üĴ -///step03 жϽɼģʽ -///step04 ׽һ֡ ʼÿһ ͬʱԹرledԼ -/// step05 Ҫ ɼҪһ -/// step06------>״̬ -/// |----->ɼһ - - -#if(MODE_CAM_LINE == MODE_CAM) - - -#if 0 - -/// ɼʱһʱ led Ϊ´εcamṩԴ -/// ȴrunź رչ, fixme: -void L2_task_GC032A_handle(struct _s_task_GC032A_ *s) -{ - TTSS_Task_init() - //#define D_pclk_per_hs 6 -// PrintCam_L0_uart0_uc('$'); - L2_task_go(D_task_GC032A_init_standby); - TTSS_Task_step(D_task_GC032A_init_standby) - L0_GC032A_standby(); - D_cam_led_on(); - //PWDNͣ0 -- 1 -- ߣ - // PrintCam_L0_uart0_uc('2'); - L2_task_go(D_task_GC032A_init_DVDD); - TTSS_step01(D_task_GC032A_init_DVDD); - L0_GC032A_work(); - //IOVDDϵ磬ʱ50usϣ - L2_task_go(D_task_GC032A_init_AVDD); - TTSS_Task_step(D_task_GC032A_init_AVDD); - //AVDD28ϵ磬ʱ0us - D_cam_AVDD_on(); - L2_task_go(D_task_GC032A_init_pwdn); - TTSS_Task_step(D_task_GC032A_init_pwdn); - //ṩ032AϵͳƵ - L0_MCLKO_init(D_ON); - L2_task_GC032A_init(); - //PWDNߣʱ - L0_GC032A_standby(); - DL0_WDT();// - L2_task_go(D_task_GC032A_init_pwdn_wait); - L1_task_Cdelay(D_Cdelay_15ms); - TTSS_Task_step(D_task_GC032A_init_pwdn_wait); - L0_GC032A_work(); - gRccUs03 = 0; - L2_task_go(D_task_GC032A_write_reg); - L1_task_Cdelay(D_Cdelay_15ms); - TTSS_Task_step(D_task_GC032A_write_reg); - //ͷ Լ2sʱ - if(0 != GC6133_init_reg_tbl[gRccUs03][0]) - { - //GC032a_L0_uart0_uc('k'); - L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);/// - gRccUs03 ++; - }else - { - L2_task_go(D_task_GC032A_div); - L1_task_Tdelay(D_Tdelay_1s);///Ҫ ʱܹؼaaaaaa - } - TTSS_Task_step(D_task_GC032A_div); - //L0_GC032A_write(0xfc,0x02); //λ?? - L0_GC032A_write(0xf8,0x03);/// ָƵ - L0_GC032A_write(0xfa,D_0xfa);DL0_WDT(); - L2_task_go(D_task_GC032A_wakup_sample); -///------------------------------------------------------cam init over -///------------------------------------------------------cam init over -///------------------------------------------------------cam init over - -////ȴ Ź - TTSS_step03(D_task_GC032A_wakup_sample) - L1_GC032A_sleep(D_wakeup); - GC032a_L0_uart0_uc('w'); - ///D_ledb_OFF(); - L2_task_go((D_task_GC032A_wakup_sample2)); - L1_task_Tdelay(D_Tdelay_1s5); - TTSS_step04(D_task_GC032A_wakup_sample2); - D_VSYNCS_open();////̨жϿʼ - L2_task_go(D_task_GC032A_one_frame); -////////////////////////////////////////////////////////////////////////////// - TTSS_step04(D_task_GC032A_one_frame); - ////һ֡ݵĿʼ((ں̨ж)) - ///vs /```24.8ms````\__________________________..1.16s...____________________________/````````\___________ - ///cam_led ```````````\_________________________________________________________/`````````````````\____ - if(D_ready == s->vs_ok)///Ϊ˹ص - { - /// PrintCam_L0_uart0_uc('V'); - s_task_GC032A.vs_ok = D_clear; - D_cam_led_off(); - L2_task_go(D_task_GC032A_wait); - //L1_task_Tdelay(D_Tdelay_50ms); ////ȡgetline camҪƵʱ - } - TTSS_step05(D_task_GC032A_wait);////>>>>>>>>>>>>>>>>>>>>>>>--- - ///ҪLine(ں̨ж) - if(D_clear != s->line_get) - {DL0_WDT(); ////memo20190217 : 1.15s - //PrintCam_L0_uart0_uc(s->line_get);// L2_line_send(); - s->buf2_ok = D_ready;///buf2_ok׼ÿɹ㷨ѯ - L2_task_go(D_task_GC032A_sleep); - /// L1_task_Tdelay(D_Tdelay_10ms); - } - TTSS_Task_step(D_task_GC032A_sleep) - /// - L1_GC032A_sleep(D_sleep); - L0_GC032A_standby(); - L0_MCLKO_init(D_OFF); - D_cam_led_off(); - L2_task_go(D_task_FLOW_PreSend); - - ////>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - TTSS_Task_step(D_task_FLOW_PreSend); - D_txd4_wakeup();/// 1ms433 sleepԷ - /// TS_paer_value.r123.cameraBoardPower = s->t_stamp+0x30; - L0_p_send(); - //D_txd4_low(); - L2_task_go(D_task_FLOW_send); - // L1_task_Tdelay(D_Tdelay_10ms); - ///L1_task_Cdelay(60);//2ms---mcu+433޷ - TTSS_Task_step(D_task_FLOW_send); - //D_txd4_wakeup(); - L0_uart0_sendArray((unsigned char *)&TS_paer_value,6); - L2_task_go(D_task_FLOW_send2); - TTSS_Task_step(D_task_FLOW_send2); - if(D_uart0_free()) - { - L2_task_go(D_task_FLOW_send3);/// - D_p_send_delay(); - - } - TTSS_Task_step(D_task_FLOW_send3); - L0_uart0_sendArray((unsigned char *)&TS_paer_value,6); - L2_task_go(D_task_FLOW_send4); - TTSS_Task_step(D_task_FLOW_send4); - if(D_uart0_free()) - { - L2_task_go(D_task_FLOW_send5); - } - TTSS_Task_step(D_task_FLOW_send5); - D_txd4_low();///ƺʱ15ms - D_cam_AVDD_off();///עӰ췢 - L2_task_go(0); - -///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - TTSS_Task_end(); -} -#endif - -#elif(MODE_CAM_FRAME == MODE_CAM) - -#elif(MODE_CAM_TEST == MODE_CAM) - -#define PrintCam_L0_uart0_uc(x) L0_uart0_uc(x) -#define PrintCam_D_send_us(x) L0_uart0_us(x) - -///#define L0_uart0_sendArraylong(a,start,end) L0_uart0_sendArray(a(start)) - -/// ɼʱһʱ led Ϊ´εcamṩԴ -/// ȴrunź رչ, fixme: -void L2_task_GC032A_handleTest(struct _s_task_GC032A_ *s) -{ - TTSS_Task_init() - //#define D_pclk_per_hs 6 -// PrintCam_L0_uart0_uc('$'); - L2_task_go(D_task_GC032A_init_standby); - TTSS_Task_step(D_task_GC032A_init_standby) - L0_GC032A_standby(); - D_cam_led_on(); - //PWDNͣ0 -- 1 -- ߣ - // PrintCam_L0_uart0_uc('2'); - L2_task_go(D_task_GC032A_init_DVDD); - TTSS_step01(D_task_GC032A_init_DVDD); - L0_GC032A_work(); - //IOVDDϵ磬ʱ50usϣ - L2_task_go(D_task_GC032A_init_AVDD); - TTSS_Task_step(D_task_GC032A_init_AVDD); - //AVDD28ϵ磬ʱ0us - D_cam_AVDD_on(); - L2_task_go(D_task_GC032A_init_pwdn); - TTSS_Task_step(D_task_GC032A_init_pwdn); - //ṩ032AϵͳƵ - L0_MCLKO_init(D_ON); - L2_task_GC032A_init(); - //PWDNߣʱ - L0_GC032A_standby(); - DL0_WDT();// - L2_task_go(D_task_GC032A_init_pwdn_wait); - L1_task_Cdelay(D_Cdelay_15ms); - TTSS_Task_step(D_task_GC032A_init_pwdn_wait); - L0_GC032A_work(); - gRccUs03 = 0; - L2_task_go(D_task_GC032A_write_reg); - L1_task_Cdelay(D_Cdelay_15ms); - TTSS_Task_step(D_task_GC032A_write_reg); - //ͷ Լ2sʱ - if(0 != GC6133_init_reg_tbl[gRccUs03][0]) - { - L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);/// - gRccUs03 ++; - }else - { - L2_task_go(D_task_GC032A_div); - L1_task_Tdelay(D_Tdelay_1s);///Ҫ ʱܹؼaaaaaa - } - TTSS_Task_step(D_task_GC032A_div); - //L0_GC032A_write(0xfc,0x02); //λ?? - L0_GC032A_write(0xf8,0x03);/// ָƵ - L0_GC032A_write(0xfa,D_0xfa);DL0_WDT(); - L2_task_go(D_task_GC032A_wakup_sample); -///------------------------------------------------------cam init over -///------------------------------------------------------cam init over -///------------------------------------------------------cam init over - -////ȴ Ź - TTSS_step03(D_task_GC032A_wakup_sample) - L1_GC032A_sleep(D_wakeup); - ///D_ledb_OFF(); - L2_task_go((D_task_GC032A_wakup_sample2)); - L1_task_Tdelay(D_Tdelay_1s5); - TTSS_step04(D_task_GC032A_wakup_sample2); - D_VSYNCS_open();////̨жϿʼ - PrintCam_L0_uart0_uc('w'); - L2_task_go(D_task_GC032A_one_frame); -////////////////////////////////////////////////////////////////////////////// - TTSS_step04(D_task_GC032A_one_frame); - - - PrintCam_L0_uart0_uc('.'); - - ////һ֡ݵĿʼ((ں̨ж)) - ///vs /```24.8ms````\__________________________..1.16s...____________________________/````````\___________ - ///cam_led ```````````\_________________________________________________________/`````````````````\____ - if(D_ready == s->vs_ok)///Ϊ˹ص - { - s->vs_ok = D_clear; - PrintCam_L0_uart0_uc('V'); -/// D_cam_led_off(); - D_HSYNCS_open(); - L2_task_go(D_task_GC032A_send2); - //L1_task_Tdelay(D_Tdelay_50ms); ////ȡgetline camҪƵʱ - } - - TTSS_Task_step(D_task_GC032A_send2)///----------------------ʼһһеķ - - if(1 == s_task_GC032A.line_ok) - { - s_task_GC032A.line_ok = 0; - /// - PrintCam_L0_uart0_uc(0xfe); - PrintCam_L0_uart0_uc(0xfd); - ///PrintCam_D_send_us(DR_pclk_n); - PrintCam_D_send_us(DR_line_n); - L0_uart0_sendArray(&s_task_GC032A.buf[0],200); - - L2_task_go(D_task_GC032A_06); - /// L1_task_Tdelay(D_Tdelay_50ms); - }else { } - TTSS_step06(D_task_GC032A_06); - /********************************************************* - TTS_for_add(s_task_GC032A.lines,0,627)///[0]--[199]199 - - /// s_task_GC032A.buf[s_task_GC032A.lines] = s_task_GC032A.lines; - s_task_GC032A.buf[s_task_GC032A.lines] = 0; - TTS_for_add_end() - - **************************************************/ - if(D_uart0_send_over()) - { - L0_uart0_sendArray(&s_task_GC032A.buf[200],200); - L2_task_go(D_task_GC032A_07); - } - TTSS_step06(D_task_GC032A_07); - if(D_uart0_send_over()) - { - L0_uart0_sendArray(&s_task_GC032A.buf[400],200); - L2_task_go(D_task_GC032A_08); - } - TTSS_step06(D_task_GC032A_08); - if(D_uart0_send_over()) - { - L0_uart0_sendArray(&s_task_GC032A.buf[600],D_pclk_per_hs-600);/// 628point - - // 'fe','fd','fd','fc' 46 44 20 46 43 0d 0a - PrintCam_L0_uart0_uc(0xfd); - PrintCam_L0_uart0_uc(0xfc); - s_task_GC032A.next_line = 1; - L2_task_go(D_task_GC032A_send2); - L1_task_Tdelay(D_Tdelay_10ms); - } -///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - TTSS_Task_end(); -} -#endif - -void L1_GC032A_sleep(unsigned char onf) -{///FE 15 Fd 33 44//standby -///FE 05 Fd 33 44//wakeup - if(D_sleep == onf) - { - // GC032a_L0_uart0_uc('L'); - /// standby: - L0_GC032A_write(0xfc,0x03); L0_GC032A_write(0xf7,0x00); L0_GC032A_write(0xf9,0xcf); L0_GC032A_write(0xf3,0x00); - Lc_delay_nop(30); - Lc_delay_nop(30); - }else - { - // GC032a_L0_uart0_uc('X'); - /// ˳standby: - L0_GC032A_write(0xfc,0x02); L0_GC032A_write(0xf7,0x01); L0_GC032A_write(0xf9,0xce); L0_GC032A_write(0xf3,0xff); - } -} - -void L2_line_send(void) -{ -#if 0 - PrintCam_L0_uart0_uc(0x0d); - PrintCam_L0_uart0_uc(0x0a); -// PrintCam_L0_uart0_uc(0xfe); -// PrintCam_L0_uart0_uc(0xfd); -PrintCam_D_send_us(DR_pclk_n); -/// PrintCam_D_send_us(s_task_GC032A.usSum); - PrintCam_L0_uart0_uc(0x09); -// PrintCam_D_send_us(0x1234); PrintCam_D_send_us(0x5678); PrintCam_D_send_us(0xabcd); - -// PrintCam_L0_uart0_uc(0x0d); -// PrintCam_L0_uart0_uc(0x0a); - PrintCam_L0_uart0_sendArray(&(s_task_GC032A.buf[50]),40); - - PrintCam_L0_uart0_uc(0x09); - PrintCam_L0_uart0_sendArray(&(s_task_GC032A.buf[50]),40); - PrintCam_L0_uart0_uc(0x09); - PrintCam_L0_uart0_sendArray(&s_task_GC032A.buf[D_pclk_per_hs_570-21],20); - - ///Lc_hex2ascii(&(s_task_GC032A.buf[0]),10,ts_uart_send_shop.buf); -// Lc_hex2ascii(&s_task_GC032A.buf[D_pclk_per_hs_570-10],2,ts_uart_send_shop.buf2); -// L0_uart0_sendArray(ts_uart_send_shop.buf2,2*3); -///#ifdef D_debug_add_send - -// PrintCam_L0_uart0_uc('P'); - - ///L0_uart0_sendArraylong(s_task_GC032A.buf,D_pclk_per_hs_570-10,D_pclk_per_hs_570); - // 'fe','fd','fd','fc' -// PrintCam_L0_uart0_uc(0xfd); -// PrintCam_L0_uart0_uc(0xfc); - PrintCam_L0_uart0_uc(0x0d); - PrintCam_L0_uart0_uc(0x0a); -///#else - /***** - ?? - 10 10 10 10 10 10 10 10 10 10 - 10 10 10 10 11 11 11 11 11 11 - 11 11 11 11 11 11 11 11 11 11 - 11 11 - 10 10 10 10 10 10 10 10 10 10 - 10 10 10 10 10 10 10 10 10 10 - CRpaper =04F8-g-offdiff :. - - ******/ - ///vU16 i; for(i = 0;i <= D_pclk_per_hs_570; i ++) {s_task_GC032A.buf[i]=i; } - PrintCam_L0_uart0_uc(0xfe); - PrintCam_L0_uart0_uc(0xfd); - PrintCam_D_send_us(DR_pclk_n); - L0_uart0_sendArray(s_task_GC032A.buf,200); - L0_uart0_sendArray(&s_task_GC032A.buf[200],200); - L0_uart0_sendArray(&s_task_GC032A.buf[400],(D_pclk_per_hs_570-400)); - -// PrintCam_D_send_us(ts_task_ALGO.usSum_temp); -//// PrintCam_D_send_us(s_task_GC032A.down_point); -// PrintCam_D_send_us(s_task_GC032A.down_point - s_task_GC032A.up_point); - // DR_pdata_n =0; -// PrintCam_D_send_us(0x1234); - // 'fe','fd','fd','fc' -// PrintCam_L0_uart0_uc(0xfd); -// PrintCam_L0_uart0_uc(0xfc); - #endif -/* */ -} - - -#if 0 - -void GC032A_port_init(void) -{ - ///00 ׼˫ 20mA 270-150uS - ///01 20mA - ///10 - ///11 © open-Drain ڲϿ ©ģʽȿԶⲿ״̬ҲԶߵ͵ƽ - - //p3.6 --HSYNC -// BITN_0(P3M1,BITN6);BITN_0(P3M0,BITN6); - ///P3.7 -- VSYNC -// BITN_0(P3M1,BITN7);BITN_0(P3M0,BITN7); - L0_GC032A_standby(); - D_cam_AVDD_on(); - -} - - - - - - - -//// AX CMD R2 R3 R4 -/// Ae 01 01 03 04 -void L3_GC032A_fun(U8 *pPara) -{ - *pPara = 0; -} - /******** -void L3_GC032A_fun(U8 *pPara) -{ - U8 i,val[2]; - // unsigned short j; - TS_P_debug *p = pPara; - switch(p->cmd) - { - - case 3: //Ae 03 03 04 00 - //xx 03 R2 R3 xx - - PrintCam_L0_uart0_uc(0x0d); - PrintCam_L0_uart0_uc(0x0a); - PrintCam_L0_uart0_uc('l'); - Lc_delay_ms(12); - s_task_GC032A.vline_get = p->R2 << 8; - s_task_GC032A.vline_get |= p->R3; - L0_uart0_uchex(p->R2); - Lc_delay_ms(12); - L0_uart0_uchex(p->R3); - Lc_delay_ms(1200); - PrintCam_L0_uart0_uc(0x0d); - PrintCam_L0_uart0_uc(0x0a); - PrintCam_L0_uart0_uc(0x0d); - PrintCam_L0_uart0_uc(0x0a); - PrintCam_L0_uart0_uc(0x0d); - PrintCam_L0_uart0_uc(0x0a); - - break; - - default: - break; - }; - - -} -********/ -///#else - -//// fe 01 reg data 0cx -/// Ac 01 02 03 ocr ---bsp_debug.c -/// U8 i,val[2]; -// unsigned short j; - TS_P_debug *p = pPara; - switch(p->cmd) - { - - case 0x01: p.cmd p.R2 p.R3 p.ocr -///Ac 00 03 01 00/// ACC_X[13:6] - -void L3_GC032A_fun(U8 *pPara) -{ - U8 i,val[2]; -// unsigned short j; - TS_P_debug *p = pPara; - switch(p->cmd) - { - - case 0x01: - ///AE 01 FE 33 44 // L0_GC032A_read(0xFE,&i,1); ȡǰҳ - ///AE 01 F0 33 44 // L0_GC032A_read(0xF0,&i,1); ȡid i= 0x23 - L0_GC032A_read(p->R2,&i,1); - PrintCam_L0_uart0_uc(i); - break; - //޸ͷò - case 0x02: - /// fe 02 r2 r3 xx üĴ(r2) = r3 - /// sysreg FE 02 FE 01 44 //õǰҳ01 - L0_GC032A_write(p->R2,p->R3); - PrintCam_L0_uart0_uc(p->R2); - PrintCam_L0_uart0_uc(p->R3); - break; - //ͷգ - case 0x03:/// sysreg FE 03 03 04 05 //ǷһlineݣݷΪһ֡=640Line = 640line*480pclk - ///AE 03 01 33 44 //s_task_GC032A.line_onf = 01 - ///AE 03 00 33 44 //s_task_GC032A.line_onf = 00 - s_task_GC032A.line_onf = p->R2; - PrintCam_L0_uart0_uc(0x30|s_task_GC032A.line_onf); - break; - case 0x05: - ///AE 05 01 33 44 // standby - ///AE 05 00 33 44 //˳ standby - L1_GC032A_sleep(p->R2); - PrintCam_L0_uart0_uc(0x30|s_task_GC032A.line_onf); - break; - case 6:///AE 06 22 33 44 - D_cam_led_off(); - break; - case 7:///AE 07 22 33 44 - D_cam_led_on(); - - break; - /******************* - case 0x00: - L0_GC032A_read(p->R2,val,p->R3); - PrintCam_L0_uart0_uc(p->cmd); - PrintCam_L0_uart0_uc(p->R2); - PrintCam_L0_uart0_uc(p->R3); - PrintCam_L0_uart0_uc('G'); - for(i = 0;i < p->R3;i++) - { - PrintCam_L0_uart0_uc(val[i]); - } - break; - //ȡͷò - case 0x35: - L0_GC032A_standby();// led 17.1-16.9ma standby 6.2ma - PrintCam_L0_uart0_uc(0x31); - break; - case 0x36: - /// ˳standby: - L0_GC032A_work(); - PrintCam_L0_uart0_uc(0x30); - break; - - - ****************************/ - - default: - break; - }; -} - -#endif - - - -#if 0 -254 253 - -FE FD 02 7F ///639 -1A 1B 1B 1B 1B 1B 1A 1C 1B 1B 1B 1A 1A 19 19 1A 19 1A 19 1A 19 1A 19 19 18 19 19 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 17 16 17 16 18 18 18 18 18 18 18 18 18 18 18 18 17 17 17 17 18 18 17 17 17 17 17 16 17 17 17 17 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 17 17 17 17 17 17 17 17 17 17 18 18 18 18 18 19 19 19 19 19 19 18 18 19 19 19 18 18 18 1A 19 19 19 19 19 1A 1A 1A 1A 1A 1A 19 19 18 19 19 19 1A 1A 1A 1B 1B 1B 1C 1C 1C 1C 1C 1C 1C 1D 1D 1D 1C 1C 1C 1C 1D 1E 1C 1C 1C 1D 1C 1C 1C 1C 1C 1C 1C 1D 1D 1D 1D 1C 1B 1A 1B 1A 1B 1D 1D 1D 1D 1D 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1B 1B 1B 1B 1B 1B 1C 1C 1C 1C 1B 1B 1C 1C 1C 1E 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1B 1C 1B 1C 1C 1D 1D 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1D 1D 1D 1C 1C 1C 1C 1C 1D 1D 1E 1D 1E 1F 1F 1E 1E 1E 1E 1E 1E 1E 1E 1D 1D 1C 1C 1C 1C 1C 1C 1C 1C 1C 1D 1D 1D 1D 1C 1D 1D 1D 1D 1D 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1D 1C 1C 1C 1C 1C 1C 1C 1B 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1B 1C 1C 1C 1C 1C 1C 1D 1C 1C 1C 1C 1D 1F 1F 1D 1C 1C 1B 1C 1C 1C 1C 1C 1C 1B 1B 1B 1B 1B 1B 1B 1C 1C 1C 1C 1C 1D 1C 1C 1C 1D 1D 1D 1D 1E 1D 1C 1C 1C 1C 1C 1C 1C 1C 1D 1D 1E 1E 1E 1D 1D 1D 1D 1C 1D 1C 1C 1C 1C 1D 1D 1D 1D 1C 1C 1C 1C 1C 1C 1B 1B 1C 1C 1C 1C 1B 1B 1B 1B 1D 1B 1C 1B 1B 1B 1C 1D 1C 1B 19 1A 19 1B 1C 1A 1A 1A 1A 1A 1A 1B 1B 1B 1A 1B 19 1B 1A 1A 1A 1A 1A 19 18 19 19 1A 1A 1A 1A 1A 19 19 18 18 18 18 18 1A 18 18 18 18 18 18 18 18 19 1A 19 19 19 19 19 19 19 1A 1A 1A 1A 19 19 18 18 18 18 18 18 19 18 18 18 19 18 18 18 18 18 1A 18 18 18 18 18 18 18 18 17 17 17 18 18 18 18 17 17 17 17 17 16 17 17 18 18 19 19 19 19 19 19 18 18 18 18 18 18 17 17 18 18 17 17 17 17 17 17 19 17 17 17 17 17 17 17 17 17 17 17 17 18 17 17 17 17 17 17 17 17 16 16 17 17 17 17 17 16 16 17 17 17 17 16 16 16 16 16 16 16 17 16 16 16 16 16 16 16 16 16 16 18 19 16 16 16 16 15 16 17 17 16 15 15 16 16 16 15 14 14 15 17 15 15 15 15 16 16 16 16 16 15 16 16 16 15 15 15 15 15 -FD FC -253 252 - -254 253 /639./ 253 252 - - -#endif - - - - - -#if 0/// memo -//memo20190217 : 1.15s - /********* - [15:37:04.337]աv 4.337 - [15:37:05.487]աv 5.487 1.15 - [15:37:06.637]աv 6.637 1.15 - [15:37:07.787]աk 7.787 1.15 - [15:37:08.947]աv 8.947 1.16 - [15:37:10.097]աv 10.097 1.15 - [15:37:11.247]աv 11.247 1.15 - [15:37:12.397]աv 12.397 1.15 - [15:37:13.547]աk 13.547 1.15 - 48 31 61 77 77 77 77 2E 56 77 77 77 33 76 01 D3 56 2E 77 77 77 00 - - ***/ - -void GC032A_port_init(void) -{ - ///00 ׼˫ 20mA 270-150uS - ///01 20mA - ///10 - ///11 © open-Drain ڲϿ ©ģʽȿԶⲿ״̬ҲԶߵ͵ƽ - //p3.6 --HSYNC -// BITN_0(P3M1,BITN6);BITN_0(P3M0,BITN6); - ///P3.7 -- VSYNC -// BITN_0(P3M1,BITN7);BITN_0(P3M0,BITN7); -// L0_GC032A_standby(); -// D_cam_AVDD_on(); -} - -void L2_line_send(void) -{ -// /// vU16 usi; - PrintCam_D_send_us(0x1234); - PrintCam_D_send_us(0x5678); - PrintCam_D_send_us(0xabcd); -#if 0 - - PrintCam_L0_uart0_uc(0x0d); - PrintCam_L0_uart0_uc(0x0a); -// PrintCam_L0_uart0_uc(0xfe); -// PrintCam_L0_uart0_uc(0xfd); - PrintCam_D_send_us(DR_pclk_n); - PrintCam_D_send_us(0x1234); - PrintCam_D_send_us(0x5678); - PrintCam_D_send_us(0xabcd); - - PrintCam_L0_uart0_uc(0x0d); - PrintCam_L0_uart0_uc(0x0a); - - PrintCam_L0_uart0_sendArray(&(s_task_GC032A.buf[0]),2); - - PrintCam_L0_uart0_uc(0x09); -/// PrintCam_L0_uart0_sendArray(&s_task_GC032A.buf[D_pclk_per_hs_570-10],9); - ///Lc_hex2ascii(&(s_task_GC032A.buf[0]),10,ts_uart_send_shop.buf); - Lc_hex2ascii(&s_task_GC032A.buf[D_pclk_per_hs_570-10],2,ts_uart_send_shop.buf2); - L0_uart0_sendArray(ts_uart_send_shop.buf2,2*3); -///#ifdef D_debug_add_send - - PrintCam_L0_uart0_uc('P'); - - ///L0_uart0_sendArraylong(s_task_GC032A.buf,D_pclk_per_hs_570-10,D_pclk_per_hs_570); - // 'fe','fd','fd','fc' -// PrintCam_L0_uart0_uc(0xfd); -// PrintCam_L0_uart0_uc(0xfc); -// PrintCam_L0_uart0_uc(0x0d); -// PrintCam_L0_uart0_uc(0x0a); -///#else - - [18:41:16.591]?????02 FE FD 02 42 12 12 12 12 12 12 12 12 12 12 12 11 11 11 11 11 11 11 11 11 11 11 11 11 12 12 12 12 12 12 12 12 12 12 12 11 11 11 11 11 11 11 12 12 12 13 13 14 15 16 16 17 18 18 17 17 16 16 17 19 1C 1F 25 28 2A 2C 2D 2E 2F 30 31 31 32 32 32 32 31 31 32 32 32 32 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 34 33 34 34 34 34 34 34 34 34 34 34 34 35 35 34 35 35 35 35 35 35 36 35 35 36 36 11 11 11 FD FC - - - - PrintCam_L0_uart0_uc(0xfe); - PrintCam_L0_uart0_uc(0xfd); - PrintCam_D_send_us(DR_pclk_n); - L0_uart0_sendArraylong(s_task_GC032A.buf,0,199); - L0_uart0_sendArraylong(s_task_GC032A.buf,200,399); - if(D_pclk_per_hs < 600) - { - L0_uart0_sendArraylong(s_task_GC032A.buf,400,599); - }else - { - L0_uart0_sendArraylong(s_task_GC032A.buf,400,599); - L0_uart0_sendArraylong(s_task_GC032A.buf,600,(D_pclk_per_hs-1)); - } -// PrintCam_D_send_us(ts_task_ALGO.usSum_temp); -//// PrintCam_D_send_us(s_task_GC032A.down_point); -// PrintCam_D_send_us(s_task_GC032A.down_point - s_task_GC032A.up_point); - // DR_pdata_n =0; -// PrintCam_D_send_us(0x1234); - // 'fe','fd','fd','fc' - PrintCam_L0_uart0_uc(0xfd); - PrintCam_L0_uart0_uc(0xfc); - #endif -/* */ -} - -#endif - - diff --git a/source/bsp/backu/bsp_cam.h b/source/bsp/backu/bsp_cam.h deleted file mode 100644 index bc1f645..0000000 --- a/source/bsp/backu/bsp_cam.h +++ /dev/null @@ -1,189 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -///@copyright Copyright (c) 2018, ؿƼ All rights reserved. -///------------------------------------------------------------------------- -/// @file bsp_gc6133.c.h -/// @brief bsp @ driver config -///------------------------------------------------------------------------- -/// @version 1.0 -/// @author CC -/// @date 20180331 -/// @note cc_AS_stc02 - -////////////////////////////////////////////////////////////////////////////// - -#ifndef _bsp_cam_H -#define _bsp_cam_H - -#include "../bsp/bsp_config.h" - -#include "../tpc/tpc_uart.h" - -#include "../msp/uart0.h" - -#include "bsp_gc032a.h" - -//>>>>>>>>>>>>>>>>>>>>>0gc63xxtask - -//#define D_i2c_addr_gc61xx 0x80 //page8/30 @pdf -#define D_i2c_addr_gc032A 0x42 //page15/31 @pdf -///// 400KHz Tlow > 1.3us -#define L0_GC032A_write(R,D) L2_I2C_WriteCmd(D_i2c_addr_gc032A,(R),(D)) -#define L0_GC032A_read(R,D,N) L2_I2C_ReadReg(D_i2c_addr_gc032A,(R),(D),(N)) -#define L0_GC032A_reg(R,D) L2_tws_ReadReg(D_i2c_addr_gc032A,(R),(D)) - - /// p55 pwdn - /// p54 inclk - /// p3.7 vsync - /// p3.6 hsync -#if 0 -#define L0_GC032A_work() D_P55_OFF(); -#define L0_GC032A_standby() - -#else -#define L0_GC032A_work() D_P55_OFF();D_stdIO_P1_ALL();\ - D_stdIO_P5(BITN4);\ - D_stdIO_P5(BITN5);\ - D_stdIO_P3(BITN7);\ - D_stdIO_P3(BITN6); -#define L0_GC032A_standby() D_HighR_P1_ALL();\ - D_HighI_P5(BITN4);\ - D_HighI_P5(BITN5);\ - D_HighI_P3(BITN7);\ - D_HighI_P3(BITN6);D_P55_ON(); -///pwdn 100uAD_P55_OFF();// - - -#endif - - - -#define GC6123_SERIAL_write_cmos_sensor L0_GC032A_write - -///#define D_pclk_per_hs 628 -///#define D_pclk_per_hs 688 -#define D_pclk_per_hs 639 ///027F - -#define D_pclk_per_hs_570 570 - -//#define D_pclk_per_hs 580 - -#define D_pclk_per_hs_2 D_pclk_per_hs -///#define D_pclk_per_hs_2 (110) - -//#define D_pclk_per_hs 6 - -struct _s_task_GC032A_ -{ - TS_task task; -/// vU32 t_stamp; - unsigned short lines; ///ǰв - unsigned short frames; ///ǰв - - unsigned char next_line:1; ///һвʼ - unsigned char cal_ok:1; ///ǰв// - unsigned char lamp:1; ///ǰƵı־ - unsigned char line_get:1; ///ǰҪв Լ - unsigned char line_ok:1; /// Ŀ - unsigned char vs_ok:1; /// ʼһ֡IJ յvsź - unsigned char line_onf:2; /// D_line_onf_get=0Ҫ͵һline\\ D_line_onf_all=1 line - - -// volatile unsigned short usHs_count; -// volatile unsigned short usPclk; - unsigned char buf2_ok; - -/// volatile unsigned short usN; -////// unsigned short usMax; - unsigned char buf[D_pclk_per_hs +2]; -}; -#define D_line_onf_all 1 -#define D_line_onf_get 0 - - -extern struct _s_task_GC032A_ s_task_GC032A; - - -void L2_task_GC032A_init(void); - -#define D_task_GC032A_init_standby 0x36 - -#define D_task_GC032A_init_DVDD 0x30 -#define D_task_GC032A_init_AVDD 0x31 -#define D_task_GC032A_init_pwdn 0x32 -#define D_task_GC032A_init_pwdn_wait 0x33 - - -#define D_task_FLOW_PreSend 0xa3 -#define D_task_FLOW_PreSend2 0xa4 - - - - -#define D_task_FLOW_send 0x90 -#define D_task_FLOW_send2 0x91 -#define D_task_FLOW_send3 0x92 -#define D_task_FLOW_send4 0x93 -#define D_task_FLOW_send5 0x94 - - - -#define D_task_GC032A_write_reg 0x40 -#define D_task_GC032A_wakup_sample 0x41 -#define D_task_GC032A_start_time2 0x43 - -#define D_task_GC032A_wakup_sample2 0x44 - - -#define D_task_GC032A_wait 0x51 -#define D_task_GC032A_one_frame 0x52 -#define D_task_GC032A_write_reg2 0x53 -#define D_task_GC032A_div 0x54 -#define D_task_GC032A_dat 0x55 - - -#define D_task_GC032A_led 0x56 - - - -#define D_task_GC032A_send_line 0x61 -#define D_task_GC032A_send2 0x62 -#define D_task_GC032A_send3 0x63 -#define D_task_GC032A_send4 0x64 - -////#define D_task_GC032A_over 0x63 -#define D_task_GC032A_cal 0x65 -///#define D_task_GC032A_send_over 0x64 - -#define D_task_GC032A_sleep 0x67 -#define D_task_GC032A_06 0x68 -#define D_task_GC032A_07 0x69 -#define D_task_GC032A_08 0x6a -#define D_task_GC032A_09 0x6b - -#define D_task_GC032A_sample 0x68 - -#define D_task_GC032A_end 0x69 - -#define D_task_GC032A_next_line 0x70 - - -extern void L2_task_GC032A_handle(struct _s_task_GC032A_ *s); -extern void L2_task_GC032A_handleTest(struct _s_task_GC032A_ *s); - - -//////////////////////////////////////////////////////////////////// - - -extern void GC032A_port_init(void); -extern void L3_GC032A_fun(U8 *pPara); - -extern void L1_GC032A_sleep(unsigned char onf); - -#define D_cam_led_on(); L1_cw63_reg_set(D_power_VCC2,D_CW63XX_ON|D_CW63XX_3V2);//P34 = 1;/////s_task_GC032A.lamp = D_ON; -#define D_cam_led_off(); L1_cw63_reg_set(D_power_VCC2,D_CW63XX_OFF|D_CW63XX_3V2);///P34 = 0;/////s_task_GC032A.lamp = D_OFF; - - - - -#endif // #ifndef _bsp_gc6133_H - diff --git a/source/bsp/backu/bsp_cam_isr.c b/source/bsp/backu/bsp_cam_isr.c deleted file mode 100644 index f3a7f8f..0000000 --- a/source/bsp/backu/bsp_cam_isr.c +++ /dev/null @@ -1,218 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -///@copyright Copyright (c) 2018, ؿƼ All rights reserved. -///------------------------------------------------------------------------- -/// @file bsp_gc6133.c.c -/// @brief bsp @ driver config -///------------------------------------------------------------------------- -/// @version 1.0 -/// @author CC -/// @date 20180331 -/// @note cc_AS_stc02 -///------------------------------------------------------------------------- -/// @version 1.2 -/// @author CC -/// @date 20180703 -/// @note cc_AS_stc02 -////////////////////////////////////////////////////////////////////////////// - -//#include "Bsp_debug.h" -#include "bsp_func.h" -#include "bsp_cam_isr.h" -#include "bsp_cam.h" -#include "../msp/uart0.h" -#include "cw63xx.h" -#include "../clib/Clib.h" -#include "../clib/bit.h" -#include "../msp/time.h" -#define D_pclk_div_hs 1 ///D_pclk_per_hs*D_pclk_div_hs < 680 - -///vs p3.7 int3 -///hs p3.6 int2 -///pclk p3.2 int0 -/// row lineȷԱʾһ һе˼.columnıʾһġ - -#define D_line_get 10 -#define D_row_get2 4 -#ifdef doc_98989 -vs /```24.8ms````\_______________________________..1.16s..._____________________________________________/```````````\__________ -hs /\/\_2.14MS_/\____/\____/\____ ...... __/\____/\____/\__480__/\____/\____/\____/\/\ - -hs /``\________________________hs______________________/``\ -pclk |||||||||||||||||||||||||||||||||||||||||||||||640 - - -Line0 L1 L2 L1 L1 L1 L1 L1 L1 L480 ----------------------------------------------------------------------- - 1 1 1 1 1 1 1 1 1 --- --- 1 - 2 2 2 2 2 2 2 2 2 --- --- 2 - 3 3 3 3 3 3 3 3 3 --- --- 3 - 4 4 4 4 4 4 4 4 4 --- --- 4 - 5 5 5 5 5 5 5 5 5 --- --- 5 - 6 6 6 6 6 6 6 6 6 --- --- 6 - 7 7 7 7 7 7 7 7 7 --- --- 7 - 8 8 8 8 8 8 8 8 8 --- --- 8 - 9 9 9 9 9 9 9 9 9 --- --- 9 - 10 10 10 10 10 10 10 10 10 --- --- 10 - 11 11 11 11 11 11 11 11 11 --- --- 11 - 12 12 12 12 12 12 12 12 12 --- --- 12 - 13 13 13 13 13 13 13 13 13 --- --- 13 - 14 14 14 14 14 14 14 14 14 --- --- 14 - . . . . . . . . . --- --- . - . . . . . . . . . --- --- . - . . . . . . . . . --- --- . - . . . . . . . . . --- --- . - 640 640 640 640 640 640 640 640 640 --- --- 640 - -#endif ///doc_98989 - - -void L0_cam_isr_init(void) -{ - IT0 = 1;///int0 ½ش = 0 ؾɴ -/// IT0 = 0;////int0 ½ش = 0 ؾɴ -/// L0_INT0_OPEN(); - D_HSYNCS_close(); - D_VSYNCS_open(); - D_PCLK_close(); - -} - -#if(MODE_CAM_LINE == MODE_CAM) - - -#if 0 -////////// -/////һ֡ݵĿʼ -void L0_VSYNCS_Isr (void) interrupt D_ISR_int3////½ -{////ҵһ֡ݵĿͷһ - L0_INT3_CLEAR(); - ///s_task_GC032A.usHs_count = 0; - DR_line_n = 0; -/// s_task_GC032A.next_line = D_ready;///һ ȷ֡ͷǵһУ/// -/// s_task_GC032A.one_line_ok = D_clear; - s_task_GC032A.line_get = D_clear; - s_task_GC032A.vs_ok = D_ready; - //s_task_GC032A.frames ++; - //if(s_task_GC032A.frames > 10) - {/// ʱ - ///s_task_GC032A.frames = 0; - } - D_ledb_OFF(); -/// D_leda_ON(); - D_HSYNCS_open(); -} - -/////һline rowݵĿʼ -void L0_HSYNCS_Isr(void) interrupt D_ISR_int2/// using 1 /½ -{///hs Ч - L0_INT2_CLEAR(); - //// hsźŵļvsЧʱ㣬usHs_count=D_row_getʹ - //// ǰһ֡ĵD_row_gethsҲһеĵڼ - ///if(D_ready == s_task_GC032A.next_line) - {///D_P33_REV(); - //D_leda_OFF(); - /// s_task_GC032A.next_line = D_clear;///ΪһݵʱԶԶСڷ͵ʱ - ///Ϊ߿ɿ - ///˺ɡgc032a - s_task_GC032A.lines = DR_line_n;////浱ǰкŵ,Ϊкű仯ٶȳ - ////͵ٶ,"gc032A"ʹõʱDR_line_n Ѿ仯 - ///0 24 58 94 129 165 200 236 271 307 342 378 - D_PCLK_open(); - //D_P35_REV() ; - DR_pclk_n = 0; - if(DR_line_n >= D_line_get) - { - s_task_GC032A.line_get = D_ready; - D_HSYNCS_close();D_PCLK_close(); - } - } - DR_line_n ++;///ǰ -} - -////s_task_GC032A.buf ŵһе -//// pclk int0 ÿIJ -void L0_PCLK_Isr(void) interrupt D_ISR_int0 /// using 10/// -{///PCLK -// D_P34_REV(); - DR_Dat = P1; - s_task_GC032A.buf[DR_pclk_n] = DR_Dat; // s_task_GC032A.buf[DR_pclk_n] = 0xaa;//P1&0xf0; //s_task_GC032A.buf[s_task_GC032A.usN] = s_task_GC032A.usN; - DR_pclk_n++;// D_P34_REV(); - if(DR_pclk_n > D_pclk_per_hs)////һеЧݽ D_pclk_per_hs̶ - { - D_PCLK_close(); - - //D_ledb_REV() ; - DR_pclk_n = D_pclk_per_hs; ///fixme - DR_pclk_n = 0; -/// s_task_GC032A.one_line_ok = D_ready;////gc032a񡱴Ϣ Կʼ߷ - D_ledb_ON(); - } -} -#endif - -#elif(MODE_CAM_FRAME == MODE_CAM) - -#elif(MODE_CAM_TEST == MODE_CAM) -///// -void L0_VSYNCS_Isr (void) interrupt D_ISR_int3////½ -{////ҵһ֡ݵĿͷһ - ///s_task_GC032A.usHs_count = 0; - DR_line_n = 0; - s_task_GC032A.next_line = 1;///һ ȷ֡ͷǵһУ/// - s_task_GC032A.vs_ok = D_ready; -} - -/////һline rowݵĿʼ -void L0_HSYNCS_Isr(void) interrupt D_ISR_int2/// using 1 /½ -{///hs Ч - //// hsźŵļvsЧʱ㣬usHs_count=D_row_getʹ - //// ǰһ֡ĵD_row_gethsҲһеĵڼ - if(s_task_GC032A.next_line) - {///D_P33_REV(); - s_task_GC032A.next_line = 0;///ΪһݵʱԶԶСڷ͵ʱ - ///Ϊ߿ɿ - ///˺ɡgc032a - s_task_GC032A.lines = DR_line_n;////浱ǰкŵ,Ϊкű仯ٶȳ - ////͵ٶ,"gc032A"ʹõʱDR_line_n Ѿ仯 - ///0 24 58 94 129 165 200 236 271 307 342 378 - - /***** - if(D_line_get == DR_line_n) - { - s_task_GC032A.line_get = 1; - } - ******/ - D_PCLK_open();///¼һ - DR_pclk_n = 0; - } - DR_line_n ++;///ǰ -} - -////s_task_GC032A.buf ŵһе -//// pclk int0 ÿIJ -void L0_PCLK_Isr(void) interrupt D_ISR_int0 //// using 10/// -{///PCLK -// D_P34_REV(); -//// DR_Dat = P1; s_task_GC032A.buf[DR_pclk_n] = DR_Dat; - s_task_GC032A.buf[DR_pclk_n] = P1; - - - ////s_task_GC032A.buf[DR_pclk_n] = 0xcc; - ///s_task_GC032A.buf[DR_pclk_n] = DR_pclk_n; - DR_pclk_n++;// D_P34_REV(); - if(DR_pclk_n > D_pclk_per_hs) ////һеЧݽ D_pclk_per_hs̶ - { - D_PCLK_close(); - DR_pclk_n = D_pclk_per_hs; ///fixme - - s_task_GC032A.line_ok = 1; ////gc032a񡱴Ϣ Կʼ߷ - } -} - - -////յ next_line ¼ǰڼlines pclkɼݵbufУȻline_ok -///// send buf, set next_line after send buf over - -#endif - - diff --git a/source/bsp/backu/bsp_cam_isr.h b/source/bsp/backu/bsp_cam_isr.h deleted file mode 100644 index bac07b9..0000000 --- a/source/bsp/backu/bsp_cam_isr.h +++ /dev/null @@ -1,62 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -///@copyright Copyright (c) 2018, ؿƼ All rights reserved. -///------------------------------------------------------------------------- -/// @file bsp_gc6133.c.h -/// @brief bsp @ driver config -///------------------------------------------------------------------------- -/// @version 1.0 -/// @author CC -/// @date 20180331 -/// @note cc_AS_stc02 - -////////////////////////////////////////////////////////////////////////////// - -#ifndef _bsp_cam_isr_H -#define _bsp_cam_isr_H - -#include "../bsp/bsp_config.h" - -#include "../tpc/tpc_uart.h" - -#include "../msp/uart0.h" - -#include "bsp_gc032a.h" - -#define D_VSYNCS_open(); L0_INT3_OPEN(); -#define D_VSYNCS_close(); L0_INT3_CLOSE(); - -#define D_HSYNCS_open(); L0_INT2_OPEN(); -#define D_HSYNCS_close(); L0_INT2_CLOSE(); - -#define D_PCLK_open(); L0_INT0_OPEN(); -#define D_PCLK_close(); L0_INT0_CLOSE(); - - -#define DR_pclk_n gRccUs05 - -#define DR_line_n gRccUs01 -#define DR_line_n_H gRccUs01_H -#define DR_line_n_L gRccUs01_L - - -///// #define DR_Hs_count gRccUs02//s_task_GC032A.usPclk -///#define DR_Dat CCAP1L -#define DR_Dat SPDAT - -//>>>>>>>>>>>>>>>>>>>>>0gc63xxtask - -//#define D_row_max 640 - -//////////////////////////////////////////////////////////////////// - - -extern void L0_cam_isr_init(void) ; - - - - - - - -#endif // #ifndef _bsp_cam_isr_H - diff --git a/source/bsp/backu/bsp_func.c b/source/bsp/backu/bsp_func.c deleted file mode 100644 index bcc170f..0000000 --- a/source/bsp/backu/bsp_func.c +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -///@copyright Copyright (c) 2018, ؿƼ All rights reserved. -///------------------------------------------------------------------------- -/// @file bsp_func.c -/// @brief bsp @ fuctiong ; ioѡȣcpuͺϢϢ -///------------------------------------------------------------------------- -/// @version 1.0 -/// @author CC -/// @date 20180308 -/// @note cc_AS_stc02 - - - -////////////////////////////////////////////////////////////////////////////// - -#include "bsp_func.h" -#include "../msp/uart0.h" -//#include "../tpc/tpc_modbus.h" - -///struct _s_sysclk s_sysclk; - - -////MCLK0 ҪʱرԽԼ -void L0_MCLKO_init(U8 onf) -{ - BITN_1(P_SW2,EAXFR); - CKSEL &= B0000_0011; - if (D_ON == onf) - { - ///----------------------------------------------------- - // p107@stc8.pdf - ///step 1 :system out clock - //BITS_CLR(CKSEL,BITC_4,BIT4); /// REG BITxʼ Nλ - ///λãһҪʹãá - BITS_SET(CKSEL,D_CLKODIV_DIV8);/// sytem out clock 300k - ///step 2 :IO - BITN_0(CKSEL,MCLKO_S);/// P5.4 SELECTED - BITN_0(P5M1,BITN4);BITN_1(P5M0,BITN4);/// 01 - } - else - { - BITS_CLR(CKSEL,BITC_4,BIT4); - BITN_1(P5M1,BITN4);BITN_0(P5M0,BITN4);/// 00 ׼˫01 10 11 © - //// 32k L1_task_Tdelay(D_Tdelay_ms); ˴Լ8s - ///fixme - /// BITN_1(P5M1,BITN4);BITN_0(P5M0,BITN4);/// 00 ׼˫01 10 11 © - ///? ʹ10 11.130 ʹ01 Ϊ10.65 - //P54 = 1; Ȼȸʡ =1=0ʡ 10uA - } - BITN_0(P_SW2,EAXFR); -} - - diff --git a/source/bsp/backu/bsp_func.h b/source/bsp/backu/bsp_func.h deleted file mode 100644 index 194f7f0..0000000 --- a/source/bsp/backu/bsp_func.h +++ /dev/null @@ -1,52 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -///@copyright Copyright (c) 2018, ؿƼ All rights reserved. -///------------------------------------------------------------------------- -/// @file bsp_func.c -/// @brief bsp_func -///------------------------------------------------------------------------- -/// @version 1.0 -/// @author CC -/// @date 20170122 -/// @note cc_AS_stc01 -////////////////////////////////////////////////////////////////////////////// - -#ifndef _bsp_func_H -#define _bsp_func_H - -#include "../bsp/bsp_config.h" -#include "../clib/bit.h" -struct _s_sysclk -{ - U32 m; - U32 clk; - U32 out; -}; - -extern struct _s_sysclk s_sysclk; - -#define P3130 0 -//#define P1617 0 -#define P3736 1 - -extern void L0_MCLKO_init(U8 onf); - - -#define D_CLKODIV_NONE 0 - -#define D_CLKODIV_DIV1 B0001_0000 -#define D_CLKODIV_DIV2 B0010_0000 -#define D_CLKODIV_DIV4 B0100_0000 -#define D_CLKODIV_DIV8 B0110_0000 -#define D_CLKODIV_DIV16 B1000_0000 -#define D_CLKODIV_DIV32 B1010_0000 -#define D_CLKODIV_DIV64 B1100_0000 -#define D_CLKODIV_DIV128 B1110_0000 - -#define D_CLKODIV_MCLKO_S BITN3 - -#define D_CLKODIV_MCKSEL_IN24M B0000_0000 -#define D_CLKODIV_MCKSEL_EXTERN B0000_0001 -#define D_CLKODIV_MCKSEL_IN32K B0000_0011 - -#endif // #ifndef _bsp_func_H - diff --git a/source/bsp/backu/bsp_gc032a.c b/source/bsp/backu/bsp_gc032a.c deleted file mode 100644 index 6650b50..0000000 --- a/source/bsp/backu/bsp_gc032a.c +++ /dev/null @@ -1,773 +0,0 @@ -#include "bsp_gc032a.h" -#if 0 -const U8 GC6133_init_reg_sys[][2]= { - - /*System*/ - {0xf3,0xff}, - {0xf5,0x06}, - {0xf7,0x01}, - {0xf9,0xce}, - {0xfa,0x00}, -//1002 {0xf8,0x03},//////Ƶ {0xf8,0x03}, -{0xf8,0x0f},//////Ƶ {0xf8,0x03}, - // {0xfa,D_0xfa}, // cc add - /// {0xfd,D_0xfa}, // cc add - /// {0xfa,D_0xfa}, // cc add - /// {0xfd,D_0xfa}, // cc add -///20181002ʱʹýϸƵ ָƵ - {0xfc,0x02}, - {0x00,0x00} -/// ///20181003 -// -}; - - -const U8 GC6133_init_reg_tbl[][2]= { - {0xfe,0x02},//page 2 - {0x81,0x03}, - - {0xfe,0x00}, - {0x77,0x64}, - {0x78,0x40}, - {0x79,0x60}, - /*ANALOG & CISCTL*/ - {0xfe,0x00},//page 0 - {0x03,0x01}, - {0x04,0xce}, - {0x05,0x01}, - {0x06,0xad}, - {0x07,0x00}, - {0x08,0x10}, - {0x0a,0x00}, - {0x0c,0x00}, - {0x0d,0x01}, - {0x0e,0xe8}, - {0x0f,0x02}, - {0x10,0x88}, - {0x17,0x54}, - {0x19,0x08}, - {0x1a,0x0a}, - {0x1f,0x40}, - {0x20,0x30}, - {0x2e,0x80}, - {0x2f,0x2b}, - {0x30,0x1a}, - {0xfe,0x02}, - {0x03,0x02}, - {0x05,0xd7}, - {0x06,0x60}, - {0x08,0x80}, - {0x12,0x89}, - - /* BLK*/ - {0xfe,0x00},//page 1 - {0x18,0x02}, - {0xfe,0x02},//page 2 - {0x40,0x22}, - {0x45,0x00}, - {0x46,0x00}, - {0x49,0x20}, - {0x4b,0x3c}, - {0x50,0x20}, - {0x42,0x10}, - - /*ISP*/ - {0xfe,0x01},//page 1 - {0x0a,0xc5}, - {0x45,0x00}, - {0xfe,0x00},//page 0 - {0x40,0xff}, - {0x41,0x25}, - {0x42,0xcd},///cc201805 close AWB{0x42,0xcf}, -/// {0x44,0x83},///P0:0x44 Output_format [7] YUV420_row_switch 5h03: Y Cr Y Cb - {0x44,B1001_0000},///P0:0x44 Output_format [7] YUV420_row_switch 5h10: only Y - - {0x43,0x12},////{0x43,D_P00x43},// ///EABLE CrCb fixed en 02 -/** P0:0x43 special_effect 7 0x00 RW [7] NA - [6] subsample2 - [5] subsample4 - [4] GAMMA_en - [3:2] only_edge_map - [1] CrCb_ fixed_en - [0] inverse color*/ - {0xda,0x00}, - {0xdb,0x00}, - /////{0x46,0x22}, -////------------------------------------- -{0x46,B0010_1000},// hs high pclk polarity {0x46,0x22}, -/* P0:0x46 sync_mode 8 0x0f RW -[7] data delay half -[6] hsync delay half -[5] odd_even_col_switch -[4] odd_even_row_switch - -[3] opclk gated in HB -[2] opclk polarity -[1] hsync polarity -[0] vsync polarity*/ -// {0x4c,D_P00x4c},//lsc test image -// {0x4D,0xfc},//lsc test image - -// {0x4a,0x86},//////div_gate+clk_en 82 -/**P0:0x4a Clock_gating_e -n -8 0x82 RW [7] ISP quiet mode -[6] close AAA pclk -[5]vb change -[4]vb chang flop ---------------------- -[3]hb change -[2] DIV_gatedclk_en -[1] exception -[0] AEC_delay_mode*/ - -////------------------------------------- - {0x49,0x03}, - {0x52,0x02}, - {0x54,0x00}, - {0xfe,0x02}, - {0x22,0xf6}, - - /*Shading*/ - {0xfe,0x01},//page 1 - {0xc1,0x38}, - {0xc2,0x4c}, - {0xc3,0x00}, - {0xc4,0x32}, - {0xc5,0x24}, - {0xc6,0x16}, - {0xc7,0x08}, - {0xc8,0x08}, - {0xc9,0x00}, - {0xca,0x20}, - {0xdc,0x8a}, - {0xdd,0xa0}, - {0xde,0xa6}, - {0xdf,0x75}, - - /*AWB*//*20170110*/ - {0xfe, 0x01},//page 1 - {0x7c, 0x09}, - {0x65, 0x06}, - {0x7c, 0x08}, - {0x56, 0xf4}, - {0x66, 0x0f}, - {0x67, 0x84}, - {0x6b, 0x80}, - {0x6d, 0x12}, - {0x6e, 0xb0}, - {0xfe, 0x01}, - {0x90, 0x00}, - {0x91, 0x00}, - {0x92, 0xf4}, - {0x93, 0xd5}, - {0x95, 0x0f}, - {0x96, 0xf4}, - {0x97, 0x2d}, - {0x98, 0x0f}, - {0x9a, 0x2d}, - {0x9b, 0x0f}, - {0x9c, 0x59}, - {0x9d, 0x2d}, - {0x9f, 0x67}, - {0xa0, 0x59}, - {0xa1, 0x00}, - {0xa2, 0x00}, - {0x86, 0x00}, - {0x87, 0x00}, - {0x88, 0x00}, - {0x89, 0x00}, - {0xa4, 0x00}, - {0xa5, 0x00}, - {0xa6, 0xd4}, - {0xa7, 0x9f}, - {0xa9, 0xd4}, - {0xaa, 0x9f}, - {0xab, 0xac}, - {0xac, 0x9f}, - {0xae, 0xd4}, - {0xaf, 0xac}, - {0xb0, 0xd4}, - {0xb1, 0xa3}, - {0xb3, 0xd4}, - {0xb4, 0xac}, - {0xb5, 0x00}, - {0xb6, 0x00}, - {0x8b, 0x00}, - {0x8c, 0x00}, - {0x8d, 0x00}, - {0x8e, 0x00}, - {0x94, 0x50}, - {0x99, 0xa6}, - {0x9e, 0xaa}, - {0xa3, 0x0a}, - {0x8a, 0x00}, - {0xa8, 0x50}, - {0xad, 0x55}, - {0xb2, 0x55}, - {0xb7, 0x05}, - {0x8f, 0x00}, - {0xb8, 0xb3}, - {0xb9, 0xb6}, - - - /*CC*/ - {0xfe,0x01},//page 0 - {0xd0,0x40}, - {0xd1,0xf8}, - {0xd2,0x00}, - {0xd3,0xfa}, - {0xd4,0x45}, - {0xd5,0x02}, - - {0xd6,0x30}, - {0xd7,0xfa}, - {0xd8,0x08}, - {0xd9,0x08}, - {0xda,0x58}, - {0xdb,0x02}, - {0xfe,0x00}, - - /*Gamma*/ - {0xfe,0x00},//page 0 - {0xba,0x00}, - {0xbb,0x04}, - {0xbc,0x0a}, - {0xbd,0x0e}, - {0xbe,0x22}, - {0xbf,0x30}, - {0xc0,0x3d}, - {0xc1,0x4a}, - {0xc2,0x5d}, - {0xc3,0x6b}, - {0xc4,0x7a}, - {0xc5,0x85}, - {0xc6,0x90}, - {0xc7,0xa5}, - {0xc8,0xb5}, - {0xc9,0xc2}, - {0xca,0xcc}, - {0xcb,0xd5}, - {0xcc,0xde}, - {0xcd,0xea}, - {0xce,0xf5}, - {0xcf,0xff}, - - /*Auto Gamma*/ - {0xfe,0x00}, - {0x5a,0x08}, - {0x5b,0x0f}, - {0x5c,0x15}, - {0x5d,0x1c}, - {0x5e,0x28}, - {0x5f,0x36}, - {0x60,0x45}, - {0x61,0x51}, - {0x62,0x6a}, - {0x63,0x7d}, - {0x64,0x8d}, - {0x65,0x98}, - {0x66,0xa2}, - {0x67,0xb5}, - {0x68,0xc3}, - {0x69,0xcd}, - {0x6a,0xd4}, - {0x6b,0xdc}, - {0x6c,0xe3}, - {0x6d,0xf0}, - {0x6e,0xf9}, - {0x6f,0xff}, - - /*Gain*/ - {0xfe,0x00}, - {0x70,0x50}, - - /*AEC*/ - {0xfe,0x00},//page 0 - {0x4f,0x00},///cc201805 close ACE /// {0x4f,0x01}, - {0xfe,0x01},//page 1 - {0x0d,0x00},//08 add 20170110 - {0x12,0xa0}, - {0x13,0x3a}, - {0x44,0x04}, - {0x1f,0x30}, - {0x20,0x40}, - {0x26,0x9a}, - {0x3e,0x20}, - {0x3f,0x2d}, - {0x40,0x40}, - {0x41,0x5b}, - {0x42,0x82}, - {0x43,0xb7}, - {0x04,0x0a}, - {0x02,0x79}, - {0x03,0xc0}, - - /*measure window*/ - {0xfe,0x01},//page 1 - {0xcc,0x08}, - {0xcd,0x08}, - {0xce,0xa4}, - {0xcf,0xec}, - - /*DNDD*/ - {0xfe,0x00}, - {0x81,0xb8}, - {0x82,0x12}, - {0x83,0x0a}, - {0x84,0x01}, - {0x86,0x50}, - {0x87,0x18}, - {0x88,0x10}, - {0x89,0x70}, - {0x8a,0x20}, - {0x8b,0x10}, - {0x8c,0x08}, - {0x8d,0x0a}, - - /*Intpee*/ - {0xfe,0x00}, - {0x8f,0xaa}, - {0x90,0x9c}, - {0x91,0x52}, - {0x92,0x03}, - {0x93,0x03}, - {0x94,0x08}, - {0x95,0x44}, - {0x97,0x00}, - {0x98,0x00}, - - /*ASDE*/ - {0xfe,0x00}, - {0xa1,0x30}, - {0xa2,0x41}, - {0xa4,0x30}, - {0xa5,0x20}, - {0xaa,0x30}, - {0xac,0x32}, - - /*YCP*/ - {0xfe,0x00}, - {0xd1,0x3c}, - {0xd2,0x3c}, - {0xd3,0x38}, - {0xd6,0xf4}, - {0xd7,0x1d}, - {0xdd,0x73}, - {0xde,0x84}, - - /*Banding*/ - {0xfe,0x00}, - {0x05,0x01}, - {0x06,0xad}, - {0x07,0x00}, - {0x08,0x10}, - - {0xfe,0x01}, - {0x25,0x00}, - {0x26,0x9a}, - - {0x27,0x01}, - {0x28,0xce}, - {0x29,0x03}, - {0x2a,0x02}, - {0x2b,0x04}, - {0x2c,0x36}, - {0x2d,0x07}, - {0x2e,0xd2}, - {0x2f,0x0b}, - {0x30,0x6e}, - {0x31,0x0e}, - {0x32,0x70}, - {0x33,0x12}, - {0x34,0x0c}, - {0x3c,0x30}, - {0xfe,0x00}, - {0x00,0x00} - -}; -#else - -const U8 code GC6133_init_reg_tbl[][2]= { - - /*System*/ - {0xf3,0xff}, - {0xf5,0x06}, - {0xf7,0x01}, - {0xf9,0xce}, - {0xfa,0x00}, -//1002 {0xf8,0x03},//////Ƶ {0xf8,0x03}, -{0xf8,0x0f},//////Ƶ {0xf8,0x03}, - // {0xfa,D_0xfa}, // cc add - /// {0xfd,D_0xfa}, // cc add - /// {0xfa,D_0xfa}, // cc add - /// {0xfd,D_0xfa}, // cc add -///20181002ʱʹýϸƵ ָƵ - {0xfc,0x02}, - - {0xfe,0x02},//page 2 - {0x81,0x03}, - - {0xfe,0x00}, - {0x77,0x64}, - {0x78,0x40}, - {0x79,0x60}, - /*ANALOG & CISCTL*/ - {0xfe,0x00},//page 0 - {0x03,0x01}, - {0x04,0xce}, - {0x05,0x01}, - {0x06,0xad}, - {0x07,0x00}, - {0x08,0x10}, - {0x0a,0x00}, - {0x0c,0x00}, - {0x0d,0x01}, - {0x0e,0xe8}, - {0x0f,0x02}, - {0x10,0x88}, - {0x17,0x54}, - {0x19,0x08}, - {0x1a,0x0a}, - {0x1f,0x40}, - {0x20,0x30}, - {0x2e,0x80}, - {0x2f,0x2b}, - {0x30,0x1a}, - {0xfe,0x02}, - {0x03,0x02}, - {0x05,0xd7}, - {0x06,0x60}, - {0x08,0x80}, - {0x12,0x89}, - - /* BLK*/ - {0xfe,0x00},//page 1 - {0x18,0x02}, - {0xfe,0x02},//page 2 - {0x40,0x22}, - {0x45,0x00}, - {0x46,0x00}, - {0x49,0x20}, - {0x4b,0x3c}, - {0x50,0x20}, - {0x42,0x10}, - - /*ISP*/ - {0xfe,0x01},//page 1 - {0x0a,0xc5}, - {0x45,0x00}, - {0xfe,0x00},//page 0 - {0x40,0xff}, - {0x41,0x25}, - {0x42,0xcd},///cc201805 close AWB{0x42,0xcf}, -/// {0x44,0x83},///P0:0x44 Output_format [7] YUV420_row_switch 5h03: Y Cr Y Cb - {0x44,B1001_0000},///P0:0x44 Output_format [7] YUV420_row_switch 5h10: only Y - - {0x43,0x12},////{0x43,D_P00x43},// ///EABLE CrCb fixed en 02 -/** P0:0x43 special_effect 7 0x00 RW [7] NA - [6] subsample2 - [5] subsample4 - [4] GAMMA_en - [3:2] only_edge_map - [1] CrCb_ fixed_en - [0] inverse color*/ - {0xda,0x00}, - {0xdb,0x00}, - /////{0x46,0x22}, -////------------------------------------- -{0x46,B0010_1000},// hs high pclk polarity {0x46,0x22}, -/* P0:0x46 sync_mode 8 0x0f RW -[7] data delay half -[6] hsync delay half -[5] odd_even_col_switch -[4] odd_even_row_switch - -[3] opclk gated in HB -[2] opclk polarity -[1] hsync polarity -[0] vsync polarity*/ -// {0x4c,D_P00x4c},//lsc test image -// {0x4D,0xfc},//lsc test image - -// {0x4a,0x86},//////div_gate+clk_en 82 -/**P0:0x4a Clock_gating_e -n -8 0x82 RW [7] ISP quiet mode -[6] close AAA pclk -[5]vb change -[4]vb chang flop ---------------------- -[3]hb change -[2] DIV_gatedclk_en -[1] exception -[0] AEC_delay_mode*/ - -////------------------------------------- - {0x49,0x03}, - {0x52,0x02}, - {0x54,0x00}, - {0xfe,0x02}, - {0x22,0xf6}, - - /*Shading*/ - {0xfe,0x01},//page 1 - {0xc1,0x38}, - {0xc2,0x4c}, - {0xc3,0x00}, - {0xc4,0x32}, - {0xc5,0x24}, - {0xc6,0x16}, - {0xc7,0x08}, - {0xc8,0x08}, - {0xc9,0x00}, - {0xca,0x20}, - {0xdc,0x8a}, - {0xdd,0xa0}, - {0xde,0xa6}, - {0xdf,0x75}, - - /*AWB*//*20170110*/ - {0xfe, 0x01},//page 1 - {0x7c, 0x09}, - {0x65, 0x06}, - {0x7c, 0x08}, - {0x56, 0xf4}, - {0x66, 0x0f}, - {0x67, 0x84}, - {0x6b, 0x80}, - {0x6d, 0x12}, - {0x6e, 0xb0}, - {0xfe, 0x01}, - {0x90, 0x00}, - {0x91, 0x00}, - {0x92, 0xf4}, - {0x93, 0xd5}, - {0x95, 0x0f}, - {0x96, 0xf4}, - {0x97, 0x2d}, - {0x98, 0x0f}, - {0x9a, 0x2d}, - {0x9b, 0x0f}, - {0x9c, 0x59}, - {0x9d, 0x2d}, - {0x9f, 0x67}, - {0xa0, 0x59}, - {0xa1, 0x00}, - {0xa2, 0x00}, - {0x86, 0x00}, - {0x87, 0x00}, - {0x88, 0x00}, - {0x89, 0x00}, - {0xa4, 0x00}, - {0xa5, 0x00}, - {0xa6, 0xd4}, - {0xa7, 0x9f}, - {0xa9, 0xd4}, - {0xaa, 0x9f}, - {0xab, 0xac}, - {0xac, 0x9f}, - {0xae, 0xd4}, - {0xaf, 0xac}, - {0xb0, 0xd4}, - {0xb1, 0xa3}, - {0xb3, 0xd4}, - {0xb4, 0xac}, - {0xb5, 0x00}, - {0xb6, 0x00}, - {0x8b, 0x00}, - {0x8c, 0x00}, - {0x8d, 0x00}, - {0x8e, 0x00}, - {0x94, 0x50}, - {0x99, 0xa6}, - {0x9e, 0xaa}, - {0xa3, 0x0a}, - {0x8a, 0x00}, - {0xa8, 0x50}, - {0xad, 0x55}, - {0xb2, 0x55}, - {0xb7, 0x05}, - {0x8f, 0x00}, - {0xb8, 0xb3}, - {0xb9, 0xb6}, - - - /*CC*/ - {0xfe,0x01},//page 0 - {0xd0,0x40}, - {0xd1,0xf8}, - {0xd2,0x00}, - {0xd3,0xfa}, - {0xd4,0x45}, - {0xd5,0x02}, - - {0xd6,0x30}, - {0xd7,0xfa}, - {0xd8,0x08}, - {0xd9,0x08}, - {0xda,0x58}, - {0xdb,0x02}, - {0xfe,0x00}, - - /*Gamma*/ - {0xfe,0x00},//page 0 - {0xba,0x00}, - {0xbb,0x04}, - {0xbc,0x0a}, - {0xbd,0x0e}, - {0xbe,0x22}, - {0xbf,0x30}, - {0xc0,0x3d}, - {0xc1,0x4a}, - {0xc2,0x5d}, - {0xc3,0x6b}, - {0xc4,0x7a}, - {0xc5,0x85}, - {0xc6,0x90}, - {0xc7,0xa5}, - {0xc8,0xb5}, - {0xc9,0xc2}, - {0xca,0xcc}, - {0xcb,0xd5}, - {0xcc,0xde}, - {0xcd,0xea}, - {0xce,0xf5}, - {0xcf,0xff}, - - /*Auto Gamma*/ - {0xfe,0x00}, - {0x5a,0x08}, - {0x5b,0x0f}, - {0x5c,0x15}, - {0x5d,0x1c}, - {0x5e,0x28}, - {0x5f,0x36}, - {0x60,0x45}, - {0x61,0x51}, - {0x62,0x6a}, - {0x63,0x7d}, - {0x64,0x8d}, - {0x65,0x98}, - {0x66,0xa2}, - {0x67,0xb5}, - {0x68,0xc3}, - {0x69,0xcd}, - {0x6a,0xd4}, - {0x6b,0xdc}, - {0x6c,0xe3}, - {0x6d,0xf0}, - {0x6e,0xf9}, - {0x6f,0xff}, - - /*Gain*/ - {0xfe,0x00}, - {0x70,0x50}, - - /*AEC*/ - {0xfe,0x00},//page 0 - {0x4f,0x00},///cc201805 close ACE /// {0x4f,0x01}, - {0xfe,0x01},//page 1 - {0x0d,0x00},//08 add 20170110 - {0x12,0xa0}, - {0x13,0x3a}, - {0x44,0x04}, - {0x1f,0x30}, - {0x20,0x40}, - {0x26,0x9a}, - {0x3e,0x20}, - {0x3f,0x2d}, - {0x40,0x40}, - {0x41,0x5b}, - {0x42,0x82}, - {0x43,0xb7}, - {0x04,0x0a}, - {0x02,0x79}, - {0x03,0xc0}, - - /*measure window*/ - {0xfe,0x01},//page 1 - {0xcc,0x08}, - {0xcd,0x08}, - {0xce,0xa4}, - {0xcf,0xec}, - - /*DNDD*/ - {0xfe,0x00}, - {0x81,0xb8}, - {0x82,0x12}, - {0x83,0x0a}, - {0x84,0x01}, - {0x86,0x50}, - {0x87,0x18}, - {0x88,0x10}, - {0x89,0x70}, - {0x8a,0x20}, - {0x8b,0x10}, - {0x8c,0x08}, - {0x8d,0x0a}, - - /*Intpee*/ - {0xfe,0x00}, - {0x8f,0xaa}, - {0x90,0x9c}, - {0x91,0x52}, - {0x92,0x03}, - {0x93,0x03}, - {0x94,0x08}, - {0x95,0x44}, - {0x97,0x00}, - {0x98,0x00}, - - /*ASDE*/ - {0xfe,0x00}, - {0xa1,0x30}, - {0xa2,0x41}, - {0xa4,0x30}, - {0xa5,0x20}, - {0xaa,0x30}, - {0xac,0x32}, - - /*YCP*/ - {0xfe,0x00}, - {0xd1,0x3c}, - {0xd2,0x3c}, - {0xd3,0x38}, - {0xd6,0xf4}, - {0xd7,0x1d}, - {0xdd,0x73}, - {0xde,0x84}, - - /*Banding*/ - {0xfe,0x00}, - {0x05,0x01}, - {0x06,0xad}, - {0x07,0x00}, - {0x08,0x10}, - - {0xfe,0x01}, - {0x25,0x00}, - {0x26,0x9a}, - - {0x27,0x01}, - {0x28,0xce}, - {0x29,0x03}, - {0x2a,0x02}, - {0x2b,0x04}, - {0x2c,0x36}, - {0x2d,0x07}, - {0x2e,0xd2}, - {0x2f,0x0b}, - {0x30,0x6e}, - {0x31,0x0e}, - {0x32,0x70}, - {0x33,0x12}, - {0x34,0x0c}, - {0x3c,0x30}, - {0xfe,0x00}, - {0x00,0x00} - -}; - - -#endif diff --git a/source/bsp/backu/bsp_gc032a.h b/source/bsp/backu/bsp_gc032a.h deleted file mode 100644 index 7be8e1a..0000000 --- a/source/bsp/backu/bsp_gc032a.h +++ /dev/null @@ -1,19 +0,0 @@ - -#ifndef _gc_032a_H_ -#define _gc_032a_H_ - -#include "../bsp/bsp_config.h" - -#include "../clib/type.h" -#include "../clib/clib.h" -#include "../ctask/tick.h" - -//#define GC6133_reg_tbl_len 291 GC6133_reg_tbl_len+1 - -#define GC6133_reg_tbl_len (292) - - -extern U8 code GC6133_init_reg_tbl[][2]; - - -#endif///_gc_032a_H_ diff --git a/source/bsp/backu/bsp_msa300.c b/source/bsp/backu/bsp_msa300.c deleted file mode 100644 index 3e152fe..0000000 --- a/source/bsp/backu/bsp_msa300.c +++ /dev/null @@ -1,261 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -///@copyright Copyright (c) 2017, ؿƼ All rights reserved. -///------------------------------------------------------------------------- -/// @file msa300.c -/// @brief msa300 driver app -///------------------------------------------------------------------------- -/// @version 1.0 -/// @author CC -/// @date 20170122 -/// @note cc_AS_stc01 -////////////////////////////////////////////////////////////////////////////// - -/******************************************************************************/ -/***************************** Include Files **********************************/ -/******************************************************************************/ -#include "bsp_msa300.h" -#include "../msp/uart0.h" -struct _s_gsens_ s_as;//[D_as_ch_mun]; - - -// data*3.91mg/LSB 1g = 90 1/2g = 45 1/3g = 30 333mg/3.91mg = 85d=0x55 -/// б30Ⱦ -//#define D_actionTH_init 0x02 -#define D_actionTH_init 0x0f -//#define D_actionTH_init 0x25 /// z25ٽֵ -////#define D_actionTH_init 0x0c -////#define D_actionTH_init 0x04 -/// жϳʱΪ4s 4sжϽ ½ -// #define D_latch_time_init D_latch_4s -#define D_latch_time_init D_latch_50ms - - - - -#if 0 -void L1_as_power_mode(unsigned char dev,unsigned char ps) -{ - // s_as[0].reg_power - s_as[0].reg_power &= 0x3f; - s_as[0].reg_power |= ps; - L2_I2C_WriteCmd(dev,MSA_REG_POWERMODE_BW,s_as[0].reg_power); // normal ģʽ -} - - -/// D_sensor_active_close();DL_ms300_int_close(); - -/// L1_as_WorkStatus(D_wakeup); - -///extern void L1_as_WorkStatus(unsigned char d); -void L1_as_WorkStatus(unsigned char d) -{ - if(D_wakeup == d) - { -/// L1_ms300_reg_set(MSA_REG_INTERRUPT_MAPPING3,D_INT2_S_TAP|D_INT2_ACTIVE); - D_sensor_active_open();BITN_0(DR_who_wakeup, DRB_who_wakeup_action); - }else - { -/// L1_ms300_reg_set(MSA_REG_INTERRUPT_MAPPING3,0); - D_sensor_active_close(); - } -} -void L1_as_action(void) -{ - L2_I2C_ReadReg(D_i2c_addr_Gsensor,MSA_REG_Tape_Active_Status,&s_as[0].reg_temp,1); /// read only - ///L0_uart0_uc('.'); - s_as[0].reg_temp &= B0111_0111;/// ȥλ - if(s_as[0].reg_action == s_as[0].reg_temp) - { - }else - { - - s_as[0].action_ok = 1; - s_as[0].reg_action = s_as[0].reg_temp; - } -/// L0_uart0_uchex(s_as[0].reg_temp) -} -#endif - -/// msa300 ʼ ǰʹiicijʼ -/// ʹж EA -void L1_msa300_init(void) -{ - /// -///step 1: ȡpower reg - LD_gsensor_power(D_PowerMode_normal ); - /// ϵstandby ģʽ Ҫ 00:normal mode, 01:low power mode, 10/11 suspend mode - -///step 2: ÷ֱʺͼٶȷΧ -/// L1_ms300_reg_set(MSA_REG_G_RANGE,((D_MSA_14BIT)|(D_MSA_2G))); // 8b8t 2g - L1_ms300_reg_set(MSA_REG_G_RANGE,((D_MSA_8BIT)|(D_MSA_2G))); // 8b8t 2g -// L1_ms300_reg_set(NSA_REG_ODR_AXIS_DISABLE, -// D_ODR_31Hz25); - -///step 3: Ƶʺʹbandwidth Ƶʵһ -/// ODR BW -/// 15.63Hz (0100) 7.81Hz -/// CLOSE Yر y Ϊģŵ - L1_ms300_reg_set(MSA_REG_ODR_AXIS_DISABLE,D_AXIS_DIS_Y|D_ODR_15P63Hz); -// L1_ms300_reg_set(MSA_REG_ODR_AXIS_DISABLE,D_ODR_31Hz25); -////-------------------------------------------------------------------------- - //CC-MD-VH06 - /// for pcb (INT1 PIN5 ) --- SENSINT2---(P3.0 INT1) - /// (INT2 PIN6 ) --- SENSINT3---(P3.1/INT0) - -///step 4: active ж ʹXZ - L1_ms300_reg_set(MSA_REG_INTERRUPT_SETTINGS1, - ACTIVE_INT_EN_Y|ACTIVE_INT_EN_X); /// fixme:ҪACTIVE_INT_EN_Y - L1_ms300_reg_set(D_Active_TH,D_actionTH_init); - -///step 5: - /// ACTIVE жϺ single tapжӳ䵽 int2ϣҲint2ƽ仯֪ͨmcu - /// ps3.sch msa300.int1==sensint2 msa300.int2==sensint3 ---rxd -/// L1_ms300_reg_set(MSA_REG_INTERRUPT_MAPPING1,INT1_ACTIVE|INT1_S_TAP_INT); -// L1_ms300_reg_set(MSA_REG_INTERRUPT_MAPPING3,D_INT2_ACTIVE); - L1_ms300_reg_set(MSA_REG_INTERRUPT_MAPPING3,D_INT2_S_TAP|D_INT2_ACTIVE); - -/// INT2_OD 0: push-pull -/// INT2_LVL 0: low, 1:high -/// L1_ms300_reg_set(MSA_REG_INT_PIN_CONFIG,D_INT2_OD|D_INT2_LVL_low); - L1_ms300_reg_set(MSA_REG_INT_PIN_CONFIG,D_INT2_pull|D_INT2_LVL_low); - ///L1_ms300_reg_set(MSA_REG_INT_PIN_CONFIG,0|D_INT2_LVL_high); - -////-------------------------------------------------------------------------- -///step 6 : 1sʱ \_____1s______/```` - L1_ms300_reg_set(MSA_REG_INT_LATCH,D_latch_time_init); - ///L1_i2c_Configure(0);DL_ms300_int_open - ///();D_sensor_active_open(); -/// L1_as_WorkStatus(D_wakeup); - -// LD_gsensor_power(D_PowerMode_normal ); - LD_gsensor_power(D_PowerMode_low ); -} -#if 0///nouse - -///0x02 ACC_X[5:0] 0x00 -//0x03 ACC_X[13:6] 0x00 -//0x04 ACC_Y[5:0] 0x00 -//0x05 ACC_Y[13:6] 0x00 -//0x06 ACC_Z[5:0] 0x00 -//0x07 ACC_Z[13:6] 0x00 -/// 0 1 2 3 4 5 -// x5:0 x13:6 y5:0 y13:6 z5:0 z13:6 -void L1_as_readXYZ(unsigned char CH) -{ - -/********************************************** -///read data -//S ADD W A REG A -//S ADD R A D1 A D2 A.....DX N P - L2_I2C_ReadReg(D_i2c_addr_AS1,0x02,(unsigned char *)s_as[CH].d,6); - -////d 0 1 2 3 4 5 -//// 02 03 04 05 06 07 -//// XL XH YL YH ZL ZH -/// -L0_uart0_uc(0x09); -// L0_uart0_uchex(s_as[0].d[0]); L0_uart0_uc(0x09); - L0_uart0_uchex(s_as[0].d[1]); L0_uart0_uc(0x09); -// L0_uart0_uchex(s_as[0].d[2]); L0_uart0_uc(0x09); - L0_uart0_uchex(s_as[0].d[3]); L0_uart0_uc(0x09); -// L0_uart0_uchex(s_as[0].d[4]); L0_uart0_uc(0x09); - L0_uart0_uchex(s_as[0].d[5]); -/// L0_uart0_sendArray((unsigned char *)&s_as[CH],6); -L0_uart0_uc(0x0d); -L0_uart0_uc(0x0a); - - - -Lc_delay_ms(10); - *****************************************/ - -} - -#endif //////nouse -/***************** - -L2_I2C_ReadReg(D_i2c_addr_HP303B,0x0d,d,1); - L0_MUART_uc(d[0]); -L2_I2C_ReadReg(D_i2c_addr_AS1,0x05,d,1);// 11 =0f - L0_MUART_uc(d[0]); -L2_I2C_ReadReg(D_i2c_addr_AS2,0x05,d,1);//10 =0f - L0_MUART_uc(d[0]); - - L1_as1_readXYZ(); - s_p_rf.ucR1 = (U8)(s_as1.x>>8); - s_p_rf.ucR2 = (U8)(s_as1.y>>8); - s_p_rf.ucR3 = (U8)(s_as1.z>>8); -p = (U8*)&s_p_rf; - - L0_MUART_uc(s_p_rf.ucR1); - L0_MUART_uc(s_p_rf.ucR2); - L0_MUART_uc(s_p_rf.ucR3); - L0_MUART_uc(0xc7); - *********************/ -#if 0 - -void L3_msa300_fun(U8 *pPara) -{ - U8 val = 0; - TS_P_debug *p = pPara; - /// Ac 01 02 03 ocr ---bsp_debug.c - /// p.cmd p.R2 p.R3 p.ocr - ///Ac 00 03 01 00/// ACC_X[13:6] - switch(p->cmd) - { - case 0: - /// fc 00 02 01 xx ȡreg02 еһ - ///0x02 ACC_X[5:0] 0x00 - //0x03 ACC_X[13:6] 0x00 - //0x04 ACC_Y[5:0] 0x00 - //0x05 ACC_Y[13:6] 0x00 - //0x06 ACC_Z[5:0] 0x00 - //0x07 ACC_Z[13:6] 0x00 - //// Ac 00 03 01 00/// ACC_X[13:6] - //// Ac 00 05 01 00/// ACC_Y[13:6] - //// Ac 00 07 01 00/// ACC_Z[13:6] - L2_I2C_ReadReg(D_i2c_addr_AS1,p->R2 ,&val,p->R3); - ///L0_uart0_uc(p->R2); - ///L0_uart0_uc(p->R3); - L0_uart0_uc(val); - break; - case 2: - ///Ac 02 22 01 00/// (05)=01 - L0_uart0_uc('W'); - ///L2_I2C_WriteCmd(D_i2c_addr_AS1,p->R2,p->R3); - //L0_uart0_uc(pPara[2]); - // L0_uart0_uc(p->R2); - // L0_uart0_uc(p->R3); - break; - case 3: - ///Ac 03 22 01 00/// (05)=01 - L1_as_action(); - if(1 == s_as[0].action_ok) - { - s_as[0].action_ok = 0; - L0_uart0_uc(s_as[0].reg_action); - } - /********************* - L2_I2C_ReadReg(D_i2c_addr_Gsensor,MSA_REG_Tape_Active_Status,&s_as[0].reg_temp,1); /// read only - ///L0_uart0_uc('.'); - s_as[0].reg_temp &= B0111_0111; - if(s_as[0].reg_power == s_as[0].reg_temp) - { - - }else - { - L0_uart0_uc(s_as[0].reg_temp); - s_as[0].reg_power = s_as[0].reg_temp; - }*************************/ - break; - default: - break; - }; -} -///#else -void L3_msa300_fun(U8 *pPara) -{ -} -#endif - - diff --git a/source/bsp/backu/bsp_msa300.h b/source/bsp/backu/bsp_msa300.h deleted file mode 100644 index 4069586..0000000 --- a/source/bsp/backu/bsp_msa300.h +++ /dev/null @@ -1,473 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -///@copyright Copyright (c) 2017, ؿƼ All rights reserved. -///------------------------------------------------------------------------- -/// @file msa300.c -/// @brief msa300 driver app -///------------------------------------------------------------------------- -/// @version 1.0 -/// @author CC -/// @date 20170122 -/// @note cc_AS_stc01 -////////////////////////////////////////////////////////////////////////////// - - - -#ifndef _MSA300_H -#define _MSA300_H - - -#include "../clib/bit.h" - -#include "../msp/iic_sim.h" - - - - -/*********************************************************************** - - U51(SDO=1) int2 P33 ----------------U10(SDO=0) int2 P32----------------MCU----USB - 0x4c 0x4e - AS1 AS2 - -**************************************************************************/ - - -#define D_i2c_addr_AS1 0x4c // u51 -//#define D_i2c_addr_AS2 0x4e -/* Register define for NSA asic */ -#define MSA_REG_SPI_I2C 0x00 -#define MSA_REG_WHO_AM_I 0x01 -#define MSA_REG_ACC_X_LSB 0x02 -#define MSA_REG_ACC_X_MSB 0x03 -#define MSA_REG_ACC_Y_LSB 0x04 -#define MSA_REG_ACC_Y_MSB 0x05 -#define MSA_REG_ACC_Z_LSB 0x06 -#define MSA_REG_ACC_Z_MSB 0x07 - - -#define MSA_REG_Tape_Active_Status 0x0B - -#define MSA_REG_G_RANGE 0x0f -#define MSA_REG_ODR_AXIS_DISABLE 0x10 -#define MSA_REG_POWERMODE_BW 0x11 -#define MSA_REG_SWAP_POLARITY 0x12 -#define MSA_REG_FIFO_CTRL 0x14 -#define MSA_REG_INTERRUPT_SETTINGS1 0x16 -#define MSA_REG_INTERRUPT_SETTINGS2 0x17 -#define MSA_REG_INTERRUPT_MAPPING1 0x19 -#define MSA_REG_INTERRUPT_MAPPING2 0x1a -#define MSA_REG_INTERRUPT_MAPPING3 0x1b -#define MSA_REG_INT_PIN_CONFIG 0x20 -#define MSA_REG_INT_LATCH 0x21 -#define MSA_REG_ACTIVE_DURATION 0x27 -#define MSA_REG_ACTIVE_THRESHOLD 0x28 -#define MSA_REG_TAP_DURATION 0x2A -#define MSA_REG_TAP_THRESHOLD 0x2B -#define MSA_REG_CUSTOM_OFFSET_X 0x38 -#define MSA_REG_CUSTOM_OFFSET_Y 0x39 -#define MSA_REG_CUSTOM_OFFSET_Z 0x3a -#define MSA_REG_ENGINEERING_MODE 0x7f -#define MSA_REG_SENSITIVITY_TRIM_X 0x80 -#define MSA_REG_SENSITIVITY_TRIM_Y 0x81 -#define MSA_REG_SENSITIVITY_TRIM_Z 0x82 -#define MSA_REG_COARSE_OFFSET_TRIM_X 0x83 -#define MSA_REG_COARSE_OFFSET_TRIM_Y 0x84 -#define MSA_REG_COARSE_OFFSET_TRIM_Z 0x85 -#define MSA_REG_FINE_OFFSET_TRIM_X 0x86 -#define MSA_REG_FINE_OFFSET_TRIM_Y 0x87 -#define MSA_REG_FINE_OFFSET_TRIM_Z 0x88 -#define MSA_REG_SENS_COMP 0x8c -#define MSA_REG_MEMS_OPTION 0x8f -#define MSA_REG_CHIP_INFO 0xc0 -#define MSA_REG_CHIP_INFO_SECOND 0xc1 -#define MSA_REG_SENS_COARSE_TRIM 0xd1 - -/************* - -------------------------------------------------------------------- -Reg 0x0F(Resolution/Range)Read/Write -Bit7 Bit6 Bit5 Bit4 |Bit3 Bit2 |Bit1 Bit0 | Default - |RESOLUTION[1:0] | FS[1:0] | 0X00 - - -RESOLUTION[1:0]: resolution of x/y/z axes, -00:14bit, 01:12bit, 10:10bit, 11:8bit - - -FS[1:0]: acceleration range of x/y/z axes, -00:+/-2g, 01:+/-4g, 10:+/-8g, 11:+/-16g - - -*********/ -#define D_MSA_8BIT B0000_1100 -#define D_MSA_12BIT B0000_0100 -#define D_MSA_10BIT B0000_1000 -#define D_MSA_14BIT B0000_0000 - -#define D_MSA_16G B0000_0011 -#define D_MSA_8G B0000_0001 -#define D_MSA_4G B0000_0010 -#define D_MSA_2G B0000_0000 -/********** -ODR Output data rate 1 1000 Hz - -Reg0x10(ODR) Read/Write Default 0X0F -Bit7 Bit6 Bit5 -X_AXIS_DIS Y_AXIS_DIS Z_AXIS_DIS -Bit4 -Bit3 Bit2 Bit1 Bit0 -ODR[3:0] - -X_AXIS_DIS: 0:enable, 1:disable Y_AXIS_DIS: 0:enable, 1:disable Z_AXIS_DIS: 0:enable, 1:disable -ODR[3:0]: -0000:1Hz (not available in normal mode) -0001:1.95Hz (not available in normal mode) -0010:3.9Hz 0011:7.81Hz -0100:15.63Hz 0101: 31.25Hz 0110: 62.5Hz 0111: 125Hz 1000: 250Hz -1001: 500Hz (not available in low power mode) -1010-1111: (not available in low power mode) - - -Table 5: bandwidth under different ODR and BW settings in normal mode -ODR BW -1000Hz (1010-1111) 500Hz -500Hz (1001) 250Hz -250Hz (1000) 125Hz -125Hz (0111) 62.5Hz -62.5Hz (0110) 31.25Hz -31.25Hz (0101) 15.63Hz -15.63Hz (0100) 7.81Hz -7.81Hz (0011) 3.9Hz -3.9Hz (0010) 1.95Hz -MSA300 supports four different acceleration measurement ranges, it is selected -ODR BW -15.63Hz (0100) 7.81Hz - -*********/ -/// fixme: ʵ͹鲻һ -#define D_AXIS_DIS_Y B1000_0000 -#define D_AXIS_DIS_X B0100_0000 -#define D_AXIS_DIS_Z B0010_0000 - -#define D_ODR_31Hz25 0x05 -#define D_ODR_250Hz 0x08 -#define D_ODR_125Hz 0x0f -#define D_ODR_15P63Hz B0000_0100 - - - -/********** -Reg0x11(Power Mode/Bandwidth) Read/Write ------------------------------------------------------------------- -Bit7 Bit6 |Bit5 Bit4 Bit3 Bit2 Bit1 |Bit0 Default 0X9E ----------------------------------------------------------------------- -PWR_MODE | LOW_POWER_BW[3:0] | --------------------------------------------------------------------- -PWR_MODE: 00:normal mode, 01:low power mode, 10/11 suspend mode -LOW_POWER_BW[3:0]: -0000-0010:1.95Hz -0011:3.9Hz, -0100:7.81Hz -0101:15.63Hz, -0110: 31.25Hz, -0111: 62.5Hz, -1000: 125Hz, -1001: 250Hz, -1010-1111:500Hz -***********/ -//#define D_PowerMode_normal 0x00 -//#define D_PowerMode_low 0x40 -//#define D_PowerMode_suspend 0x80 -#define D_lowPower_BW (0x0F<<1) - -#define D_PowerMode_normal 0x1e -#define D_PowerMode_suspend 0x9e - -#define D_gs_LPBW1H9 (0<<1) -#define D_gs_LPBW3H9 (3<<1) -#define D_gs_LPBW7H8 (4<<1) -#define D_gs_LPBW15H (5<<1) -#define D_gs_LPBW31H (6<<1) -#define D_gs_LPBW62H (7<<1) -#define D_gs_LPBW125H (8<<1) -#define D_gs_LPBW250H (9<<1) -#define D_gs_LPBW500H (10<<1) - - -///#define D_PowerMode_low 0x5e - -#define D_PowerMode_low (0x50|D_gs_LPBW1H9) -//#define D_PowerMode_low 0x5e///(0x40|D_gs_LPBW62H) - -#define LD_gsensor_power(Pmode) L2_I2C_WriteCmd(D_i2c_addr_Gsensor,MSA_REG_POWERMODE_BW,Pmode);s_as.power=Pmode - - -/********** - - -/************************************** -Reg 0x1B (Int_Map_2) Read/Write -Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default - -Bit6 INT2_ORIENT -Bit5 INT2_S_TAP -Bit4 INT2_D_TAP -Bit2 INT2_ACTIVE -Bit1 RESERVED -Bit0 INT2_FREEFALL -0X00 -INT2_ORIENT: map orientation interrupt to INT2, 0:disable, 1:enable INT2_S_TAP: map single tap interrupt to INT2, 0:disable, 1:enable INT2_D_TAP: map double tap interrupt to INT2, 0:disable, 1:enable INT2_ACTIVE: map active interrupt to INT2, 0:disable, 1:enable INT2_FREEFALL: map freefall interrupt to INT2, 0:disable, 1:enable -***************************************/ -#define D_INT2_ORIENT BITN6 -#define D_INT2_S_TAP BITN5 -#define D_INT2_D_TAP BITN4 -#define D_INT2_ACTIVE BITN2 -#define D_INT2_FREEFALL BITN1 -/********************************************** - -Reg 0x20 (Int_Map_2) Read/Write -Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default 0X00 -Bit3 INT2_OD -Bit2 NT2_LVL -Bit1 IINT1_OD -Bit0 INT1_LVL -INT2_OD: select output for INT2, 0: push-pull, 1:OD -INT2_LVL: select active level for INT2, 0: low, 1:high -INT1_OD: select output for INT1, 0: push-pull, 1:OD -INT1_LVL: select active level for INT1, 0: low, 1:high -***************************************/ -#define D_INT2_pull 0 -#define D_INT2_OD BITN3 -#define D_INT2_LVL_high BITN2 -#define D_INT2_LVL_low 0 - - -#define D_INT1_pull 0 -#define D_INT1_OD BITN1 -#define D_INT1_LVL_high BITN0 -#define D_INT1_LVL_low 0 - - - -/************************************************************* - - U51(SDO=1) int2 P33 ----------------U10(SDO=0) int2 P32----------------MCU----USB - 0x4c 0x4e - AS1 AS2 - --------------------------------------------------------------------- -Reg 0x16(Int_Set_0) Read/Write -Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default 0X00 -------------------------------------------------------------------- -Ӧ λʶ -Tap -˫͵ -ʹܵ s_tap_en ʹ˫d_tap_en -ж״̬: s_tap_int , d_tap_int -ͨٶбǷ񳬹趨ֵжǷе¼ - -Bit6 ORIENT_INT_EN -Bit5 S_TAP_INT_EN -Bit4 D_TAP_INT_EN -Bit2 ACTIVE_INT_EN_Z -Bit1 ACTIVE_INT_EN_Y -Bit0 ACTIVE_INT_EN_X - -------------------------------------------------------------------- -ORIENT_INT_EN: orient interrupt, 0:disable, 1:enable -S_TAP_INT_EN: single tap interrupt, 0:disable, 1:enable -D_TAP_INT_EN: double tap interrupt, 0:disable, 1:enable -ACTIVE_INT_EN_Z: active interrupt for the z axis, 0:disable, 1:enable -ACTIVE_INT_EN_Y: active interrupt for the y axis, 0:disable, 1:enable -ACTIVE_INT_EN_X: active interrupt for the x axis, 0:disable, 1:enable - - -reg 0x16ӦReg 0x19 -------------------------------------------------------------------- -Reg 0x19(Int_Map_0) Read/Write -Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default -------------------------------------------------------------------- - INT1_ORIENT - INT1_S_TAP - INT1_D_TAP - INT1_ACTIVE - INT1_FREEFALL - 0X00 -------------------------------------------------------------------- -INT1_ORIENT: map orientation interrupt to INT1, 0:disable, 1:enable -INT1_S_TAP: map single tap interrupt to INT1, 0:disable, 1:enable -INT1_D_TAP: map double tap interrupt to INT1, 0:disable, 1:enable -INT1_ACTIVE: map active interrupt to INT1, 0:disable, 1:enable -INT1_FREEFALL: map freefall interrupt to INT1, 0:disable, 1:enable - - -------------------------------------------------------------------- -Reg 0x27 (Active_Dur) Read/Write -Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default - ACTIVE_DUR[1:0] 0X00 -ACTIVE_DUR[1:0]: active duration time is (ACTIVE_DUR[1:0]+1)ms -------------------------------------------------------------------- -Reg 0x28(Active_Th) Read/Write - -Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default -ACTIVE_TH[7:0] 0X14 -ACTIVE_TH[7:0]: threshold of active interrupt -3.91mg/LSB(2g range) -7.81mg/LSB(4g range) -15.625mg/LSB(8g range) -31.25mg/LSB(16g range) - - - -**************************************************************************/ - -#define ACTIVE_INT_EN_Z BITN2 -#define ACTIVE_INT_EN_Y BITN1 -#define ACTIVE_INT_EN_X BITN0 - - -/*************************************** -0x21 RESET_INT LATCH_INT[3:0] 0x00 - latch_int Interrupt mode - 0000 non-latched - 0001 temporary latched 250ms - 0010 temporary latched 500ms - 0011 temporary latched 1s - 0100 temporary latched 2s - 0101 temporary latched 4s - 0110 temporary latched 8s - 0111 Latched - 1000 non-latched - 1001 temporary latched 1ms - 1010 temporary latched 1ms - 1011 temporary latched 2ms - 1100 temporary latched 25ms - 1101 temporary latched 50ms - 1110 temporary latched 100ms - 1111 Latched - - _______/``latch period````\_______ -****************************************/ -#define D_no_latched 0x01 -#define D_latch_250ms 0x01 -#define D_latch_500ms 0x02 -#define D_latch_1s 0x03 -#define D_latch_2s 0x04 -#define D_latch_4s 0x05 -#define D_latch_8s 0x06 -#define D_latched 0x07 -#define D_no_latched2 0x08 -#define D_latch_1ms 0x09 -#define D_latch_1ms2 0x0a -#define D_latch_2ms 0x0B -#define D_latch_25ms 0x0C -#define D_latch_50ms 0x0D -#define D_latch_100ms 0x0E -#define D_latched2 0x0f - -/**************************************************** -Reg 0x09(Motion_Interrupt) :Read only -Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default 0X00 -Bit6 ORIENT_INT -Bit5 S_TAP_INT -Bit4 D_TAP_INT -Bit2 ACTIVE_INT -Bit0 FREEFALL_INT -ʱͣĶô Ҫλж -ͼǺڰ -Ķ Ҫر -ҲдĶʱҪ5s֮ٹ Ϣ5 Ѻĵ -С - -ORIENT_INT: orientation interrupt status,0:inactive,1:active -S_TAP_INT: single tap interrupt status,0:inactive,1:active -D_TAP_INT: double tap interrupt status,0:inactive,1:active -ACTIVE_INT: active interrupt status,0:inactive,1:active -FREEFALL_INT: freefall interrupt status,0:inactive,1:active -------------------------------------------------------------------- -Reg 0x0B(Tape_Active_Status) :Read only -Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default -TAP_SIGN - TAP_FIRST_X - TAP_FIRST_Y - TAP_FIRST_Z - ACTIVE_SIGN - ACTIVE_FIRST_X - ACTIVE_FIRST_Y - ACTIVE_FIRST_Z - 0X00 -------------------------------------------------------------------- -TAP_SIGN: sign of tap triggering signal, 0:positive,1:negative -TAP_FIRST_X: tap interrupt triggered by x axis, 1:positive,0:negative -TAP_FIRST_Y: tap interrupt triggered by y axis, 1:positive,0:negative -TAP_FIRST_Z: tap interrupt triggered by z axis, 1:positive,0:negative -ACTIVE_SIGN: sign of active interrupt, 0:positive,1:negative -ACTIVE_FIRST_X: active interrupt triggered by x axis, 1:positive,0:negative -ACTIVE_FIRST_Y: active interrupt triggered by y axis, 1:positive,0:negative -ACTIVE_FIRST_Z: active interrupt triggered by z axis, 1:positive,0:negative - - -***************************************************/ - -#define INT1_S_TAP_INT BITN5 ///ж -#define INT1_D_TAP_INT BITN4 ///˫ж -#define INT1_ACTIVE BITN2 /// ж - -#define D_Active_TH 0x28 -#define D_Active_Dur 0x27 - - -#define D_i2c_addr_AS1 0x4c // u51 -#define D_i2c_addr_AS2 0x4e - - -#define D_i2c_addr_Gsensor 0x4c // u51 - - -#define D_i2c_addr_AS1 0x4c // u51 -#define D_i2c_addr_AS2 0x4e - -/******************************************************************************/ -/***************************** Include Files **********************************/ -/******************************************************************************/ - -// 400Khz 1/400 ms 2.5us - -//Symbol Parameter Condition Min Max Unit -//fscl Clock frequency 400 kHz -#define D_as_ch_mun 1 -struct _s_gsens_ -{//8byte - U8 d[6]; -// U8 reg_action; - U8 power; -// U8 reg_temp; -// U8 action_ok; - - // U16 x; - // U16 y; - // U16 z; - -}; -extern struct _s_gsens_ s_as; -extern void L1_as_readXYZ(unsigned char CH); -extern void L1_msa300_init(void); -extern void L3_msa300_fun(U8 *pPara); -extern void L1_as_action(void); - -extern void L1_as_WorkStatus(unsigned char d); -///L1_msa300_power(D_sleep); -extern void L1_msa300_power(U8 mode); - -#define L1_ms300_reg_set(x,y) L2_I2C_WriteCmd(D_i2c_addr_Gsensor, (x),(y) ) -#define L1_ms300_reg_get(x,y) L2_I2C_ReadReg(D_i2c_addr_Gsensor,(x),1) -#define DL_ms300_int_open(); L1_ms300_reg_set(MSA_REG_INTERRUPT_MAPPING3,D_INT2_S_TAP|D_INT2_ACTIVE); -#define DL_ms300_int_close(); L1_ms300_reg_set(MSA_REG_INTERRUPT_MAPPING3,0); - - - - -#endif // #ifndef _MSA300_H - - - diff --git a/source/bsp/backu/cw63xx.c b/source/bsp/backu/cw63xx.c deleted file mode 100644 index c171c3e..0000000 --- a/source/bsp/backu/cw63xx.c +++ /dev/null @@ -1,191 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -///@copyright Copyright (c) 2017, ؿƼ All rights reserved. -///------------------------------------------------------------------------- -/// @file cw63xx.c -/// @brief cw630x driver app -///------------------------------------------------------------------------- -/// @version 1.0 -/// @author CC -/// @date 20170122 -/// @note cc_AS_stc01 - -/// @version 1.1 -/// @author CC -/// @date 20170619 -/// @note for - - -////////////////////////////////////////////////////////////////////////////// - -#include "cw63xx.h" -//#include "../debug/debug_drv.h" -#include "../msp/iic_sim.h" -#include "../msp/uart0.h" -//#include "msa300.h" - -///------------------------------------------------------------------------- -/// @breif L1_cw63xx_init -/// @param a s_task_PWON -/// @param s "L1_cw63xx_init" -/// @return none -/// @see Test() οصĺһӣ -/// @note (noteҪע) -///------------------------------------------------------------------------- -#define D_lowPower_warnning 0x02 -#define D_lowPower_BAT_FULL 0x08 - - - - -/***************************** - -if(BITN_G(I2CTXD,BITN1)) - -CHG_IN DCIN 5V Դ룬⵽粢жϣĴ 0x03[5] 0 1 -BAT_FULLس磬Ϊ 0򴥷жϣĴ 0x03[4] 0 1 -BAT_OT¶ȹߣĬֵ 60ң򴥷жϲֹͣ磬Ĵ 0x03[3] 0 1 -BAT_UT¶ȹͣĬֵ 0ң򴥷жϲֹͣ磬Ĵ 0x03[2] 0 1 -LOW_BATصѹڸ澯ֵʱĬΪ 3.4V򴥷жϣĴ 0x03[1] 0 1 -BUTTON£ᴥһжϣĴ 0x03[0] 0 1 - -ʵУȥغ BAT_FULLжϡ - -***************************/ -void L1_cw63xx_sta(void) -{ - U8 d; - L2_I2C_ReadReg(D_i2c_addr_cw63xx,D_CW63X_REG_Interrupt,&d,1); - if(BITN_G(d, BITN1))///յ͵ѹ - { - I2CTXD = 1; - } - - if(BITN_G(d, BITN4))///ֻгŵѹ־ - { - I2CTXD = 0; - } - L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_CW63X_REG_Interrupt,0); -} -#if 0 -void L1_cw63xx_init(void) -{ - U8 val = 0; - // LDO1 LDO2 LDO3 LDO4 - #if 0 - L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_CW63X_REG_LDO1,D_CW63XX_ON|D_CW63XX_3V2); // normal ģʽ - Lc_delay_ms(100);// 2000--7s - L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_CW63X_REG_LDO2,D_CW63XX_ON|D_CW63XX_3V2); // LDO1 Ϊ1.8v - Lc_delay_ms(100); - L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_CW63X_REG_LDO3,D_CW63XX_ON|D_CW63XX_3V2); // normal ģʽ - Lc_delay_ms(100);// 2000--7s - L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_CW63X_REG_LDO4,D_CW63XX_ON|D_CW63XX_3V2); // LDO1 Ϊ1.8v -//#else - L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC,D_CW63XX_ON|D_CW63XX_2V5); // mcu gsensor - Lc_delay_ms(10);// 2000--7s - L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC1,D_CW63XX_ON|D_CW63XX_3V); // uart4 sed ch430 mcu_program - Lc_delay_ms(10); - L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC2,D_CW63XX_ON|D_CW63XX_2V5); //uart 4 receive - Lc_delay_ms(10);// 2000--7s - L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC3,D_CW63XX_ON|D_CW63XX_2V5); // AS cpu 2.5v - - //L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC2,D_CW63XX_ON|D_CW63XX_1V8); // AS cpu 2.5v - //Lc_delay_ms(600); - L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC3,D_CW63XX_ON|D_CW63XX_2V8); // AS cpu 2.5v - Lc_delay_ms(10); - - #endif - - L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_CW63X_REG_Charge,0x3F);///150mA CHARGE - ///L2_I2C_ReadReg(D_i2c_addr_cw63xx,D_CW63X_REG_Charge,&val,1); -// L0_uart0_uchex(val); -// Lc_delay_ms(10); - //// Lc_delay_ms(10); - //// L2_I2C_ReadReg(D_i2c_addr_cw63xx,D_CW63X_REG_Charge,&val,1); - //// L0_uart0_uc(val); - //// Lc_delay_ms(10); - /****************** - while(9) - { - L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC2,D_CW63XX_ON|D_CW63XX_2V8); L0_uart0_uc('e'); - Lc_delay_ms(30); - L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC2,D_CW63XX_OFF|D_CW63XX_2V8); - Lc_delay_ms(30); - - } -*****************/ - -///-------------------------------------------------------------------- -// L2_I2C_ReadReg(D_i2c_addr_cw63xx,D_CW63X_REG_LDO1,s_as1.d,4);// press -// L0_uart0_uchex(s_as1.d[0]); L0_uart0_uchex(s_as1.d[1]); L0_uart0_uchex(s_as1.d[2]); L0_uart0_uchex(s_as1.d[3]); - -} - -void L3_cw63xx_fun(U8 *pPara) -{ -*pPara=0; -} - -///#else - -//// FX CMD R2 R3 4 -void L3_cw63xx_fun(U8 *pPara) -{ - U8 val = 0; - TS_P_debug *p = pPara; - switch(p->cmd) - { - /********** - case 0: - L1_cw63xx_init(); - L0_uart0_uc('C'); - L0_uart0_uc(p->R1); - L0_uart0_uc(p->R2); - L0_uart0_uc(p->R3); - break; - ***********/ - case 1: //// - //// AX CMDR2 R3 R4 - /// AD 01 01 03 04 ȡreg 01ֵ - //void L2_I2C_ReadReg(unsigned char sla,unsigned char reg, - // unsigned char *r,unsigned char n) - L2_I2C_ReadReg(D_i2c_addr_cw63xx,p->R2,&val,1); - L0_uart0_uc(val); - break; - - - case 2: //FD 02 03 04 00 - ///aD 02 0A 38 00 //vcc1 off - ///aD 02 0A B8 00 //vcc1 ON - ///FD 02 0B 04 00 B0011_1000 - ///FD 02 0C 04 00 - ///FD 02 01 3a 00 100mA - - L0_uart0_uc('W'); - L2_I2C_WriteCmd(D_i2c_addr_cw63xx,p->R2,p->R3); - //L0_uart0_uc(pPara[2]); - - L0_uart0_uc(p->R2); - L0_uart0_uc(p->R3); - break; - - - default: - break; - }; -} - -L2_I2C_ReadReg(D_i2c_addr_cw63xx,0,s_as.d,4); -L0_uart0_sendArray(s_as.d,4); -L2_I2C_WriteCmd(D_i2c_addr_cw63xx,0x03,0);////жϺҪдж -CHG_IN DCIN 5V Դ룬⵽粢жϣĴ 0x03[5] 0 1 -BAT_FULLس磬Ϊ 0򴥷жϣĴ 0x03[4] 0 1 -BAT_OT¶ȹߣĬֵ 60ң򴥷жϲֹͣ磬Ĵ 0x03[3] 0 1 -BAT_UT¶ȹͣĬֵ 0ң򴥷жϲֹͣ磬Ĵ 0x03[2] 0 1 -LOW_BATصѹڸ澯ֵʱĬΪ 3.4V򴥷жϣĴ 0x03[1] 0 1 -BUTTON£ᴥһжϣĴ 0x03[0] 0 1 - -ʵУȥغ BAT_FULLжϡ - -#endif - - diff --git a/source/bsp/backu/cw63xx.h b/source/bsp/backu/cw63xx.h deleted file mode 100644 index 5b741bb..0000000 --- a/source/bsp/backu/cw63xx.h +++ /dev/null @@ -1,123 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -///@copyright Copyright (c) 2017, ؿƼ All rights reserved. -///------------------------------------------------------------------------- -/// @file msa300.c -/// @brief msa300 driver app -///------------------------------------------------------------------------- -/// @version 1.0 -/// @author CC -/// @date 20170122 -/// @note cc_AS_stc01 -////////////////////////////////////////////////////////////////////////////// - -#ifndef _cw63xx_H -#define _cw63xx_H - -#define D_i2c_addr_cw63xx 0x12 - - -#include "../msp/iic_sim.h" -//#include "../bsp/type_hs.h" -///-------------------------------------------------------------------- -#define D_CW63X_REG_system 0X00 -#define D_CW63X_REG_Charge 0X01 -#define D_CW63X_EN_NTC BITN7 ///Enable NTC check -#define D_CW63X_EN_CHG BITN6 /// Enable charging -#define D_CW63X_EN_TIMER BITN5 // Enalble charging timer - -// in power-off state,the IC will turn off LDO1,2,3,B ut hte LDORTC/LDO4 will remain on -#define D_CW63X_power_off 0x0a -//L1_cw63xx_set(D_CW63X_REG_Safety,D_CW63X_EN_NTC|D_CW63X_EN_CHG|D_CW63X_EN_TIMER|D_CW63X_power_off); -//L1_cw63xx_set(D_CW63X_REG_Safety,D_CW63X_EN_NTC|D_CW63X_EN_CHG|D_CW63X_EN_TIMER); - -///-------------------------------------------------------------------- - -#define D_CW63X_REG_Safety 0X02 -#define D_CW63X_LowBateryThreshold 0 -#define L0_set_LBT(x) ((x) - 28) -// L0_set_LBT(28) -/// L1_cw63xx_set(D_CW63X_REG_Safety,L0_set_LBT(28));/// 2.8v -/// fixme ʵֵԴIJ -///-------------------------------------------------------------------- -#define D_CW63X_REG_Interrupt 0X03 -#define D_CW63X_REG_Interrupt_type 0X04 -#define D_CW63X_INT_CHG_OUT BITN7 ///Charging unplugged -#define D_CW63X_INT_TIMER_EXPIRE BITN6 ///Charging timer expire -#define D_CW63X_INT_CHG_INT BITN5 ///Charger detected -#define D_CW63X_INT_BAT_FULL BITN4 ///Battery full - -#define D_CW63X_INT_BAT_OT BITN3 ///Battery over temperature -#define D_CW63X_INT_BAT_UT BITN2 ///Battery under temperature -#define D_CW63X_INT_LOW_BAT BITN1 ///Battery low voltage -#define D_CW63X_INT_BUTTON BITN0 ///button detected - -///-------------------------------------------------------------------- - -#define D_CW63X_REG_LDO1 0X0A -#define D_CW63X_REG_LDO2 0X0B -#define D_CW63X_REG_LDO3 0X0C -#define D_CW63X_REG_LDO4 0X0D - - -//// reg[]543] reg[210] -//// 54 3 -//// || |210 -#define D_CW63XX_V800 B0000_0000 -#define D_CW63XX_V975 B0000_0111 -#define D_CW63XX_1V4 B0001_0100 - - -#define D_CW63XX_1V8 B0001_1100 -#define D_CW63XX_2V1 B0011_0001 -#define D_CW63XX_2V5 B0011_0101 -#define D_CW63XX_2V8 B0011_1000 -#define D_CW63XX_3V B0011_1010 -#define D_CW63XX_3V2 B0011_1100 - -#define D_CW63XX_ON B1000_0000 -#define D_CW63XX_OFF B0000_0000 - - -////extern void L1_cw63xx_init(void); -extern void L3_cw63xx_fun(U8 *pPara); -extern void L1_cw63xx_sta(void); - -///debug ʹU8 -////ine L3_cw63xx_fun(x); - - -///--------------------------------- - - - - - -#define D_power_VCC1 D_CW63X_REG_LDO1 -#define D_power_VCC2 D_CW63X_REG_LDO2 -#define D_power_VCC3 D_CW63X_REG_LDO3 -#define D_power_VCC D_CW63X_REG_LDO4 -/* -#define D_power_rf_Rxd D_power_VCC2 /// rfģ -#define D_power_rf_Txd D_power_VCC1 /// rf ģ - -#define D_power_AS D_power_VCC3 /// ASģ - -#define L2_power_AS_OFF(); L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_AS,D_CW63XX_OFF|D_CW63XX_3V); -#define L2_power_AS_ON(); L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_AS,D_CW63XX_ON|D_CW63XX_3V); -#define L2_power_rf_Rxd_OFF(); L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_rf_Rxd,D_CW63XX_OFF|D_CW63XX_3V); -#define L2_power_rf_Rxd_ON(); L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_rf_Rxd,D_CW63XX_ON|D_CW63XX_3V); - -//#define L2_power_rf_Txd_OFF(); //L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_rf_Txd,D_CW63XX_OFF|D_CW63XX_3V); -//#define L2_power_rf_Txd_ON(); //L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_rf_Txd,D_CW63XX_ON|D_CW63XX_3V); - -/// fixme for the -#define L2_power_rf_Txd_OFF(); //L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_rf_Rxd,D_CW63XX_OFF|D_CW63XX_3V); -#define L2_power_rf_Txd_ON(); //L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_rf_Rxd,D_CW63XX_ON|D_CW63XX_3V); -*/ - -#define L1_cw63xx_init() L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_CW63X_REG_Charge,0x3F);\ - L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_CW63X_REG_Safety,0x05);///n3.3v baongjin - - -#endif // #ifndef _cw63xx_H - diff --git a/source/bsp/board support/msa300.c b/source/bsp/board support/msa300.c deleted file mode 100644 index 85331b9..0000000 --- a/source/bsp/board support/msa300.c +++ /dev/null @@ -1,75 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -///@copyright Copyright (c) 2017, ؿƼ All rights reserved. -///------------------------------------------------------------------------- -/// @file msa300.c -/// @brief msa300 driver app -///------------------------------------------------------------------------- -/// @version 1.0 -/// @author CC -/// @date 20170122 -/// @note cc_AS_stc01 -////////////////////////////////////////////////////////////////////////////// - - - -/******************************************************************************/ -/***************************** Include Files **********************************/ -/******************************************************************************/ -#include "msa300.h" -struct _s_gsens_ s_as1,s_as2; -void L1_msa300_init(void) -{ - /// ϵstandby ģʽ Ҫ - L2_I2C_WriteCmd(D_i2c_addr_AS1,0x11,0x1e); // normal ģʽ - L2_I2C_WriteCmd(D_i2c_addr_AS2,0x11,0x1e); // normal ģʽ - -} - -void L1_as1_readXYZ(void) -{ -///read data -//S ADD W A REG A -//S ADD R A D1 A D2 A.....DX N P - L2_I2C_ReadReg(D_i2c_addr_AS1,0x02,(unsigned char *)&s_as1,6); -// L2_I2C_ReadReg(D_i2c_addr_AS2,0,(unsigned char *)&s_as2,3); -} - -void L1_as2_readXYZ(void) -{ -///read data -//S ADD W A REG A -//S ADD R A D1 A D2 A.....DX N P - L2_I2C_ReadReg(D_i2c_addr_AS2,0x02,(unsigned char *)&s_as2,6); -} - - - - - - -#if 0 - -L2_I2C_ReadReg(D_i2c_addr_HP303B,0x0d,d,1); - L0_MUART_uc(d[0]); -L2_I2C_ReadReg(D_i2c_addr_AS1,0x05,d,1);// 11 =0f - L0_MUART_uc(d[0]); -L2_I2C_ReadReg(D_i2c_addr_AS2,0x05,d,1);//10 =0f - L0_MUART_uc(d[0]); - - - L1_as1_readXYZ(); - s_p_rf.ucR1 = (U8)(s_as1.x>>8); - s_p_rf.ucR2 = (U8)(s_as1.y>>8); - s_p_rf.ucR3 = (U8)(s_as1.z>>8); -p = (U8*)&s_p_rf; - - L0_MUART_uc(s_p_rf.ucR1); - L0_MUART_uc(s_p_rf.ucR2); - L0_MUART_uc(s_p_rf.ucR3); - L0_MUART_uc(0xc7); - - -#endif - - - diff --git a/source/bsp/board support/msa300.h b/source/bsp/board support/msa300.h deleted file mode 100644 index 34b0714..0000000 --- a/source/bsp/board support/msa300.h +++ /dev/null @@ -1,63 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -///@copyright Copyright (c) 2017, ؿƼ All rights reserved. -///------------------------------------------------------------------------- -/// @file msa300.c -/// @brief msa300 driver app -///------------------------------------------------------------------------- -/// @version 1.0 -/// @author CC -/// @date 20170122 -/// @note cc_AS_stc01 -////////////////////////////////////////////////////////////////////////////// - - - -#ifndef _MSA300_H -#define _MSA300_H - - -#include "../msp/iic_sim.h" - - - - -/*********************************************************************** - - U51(SDO=1) int2 P33 ----------------U10(SDO=0) int2 P32----------------MCU----USB - 0x4c 0x4e - AS1 AS2 - -**************************************************************************/ - - -#define D_i2c_addr_AS1 0x4c // u51 -#define D_i2c_addr_AS2 0x4e - -/******************************************************************************/ -/***************************** Include Files **********************************/ -/******************************************************************************/ - -// 400Khz 1/400 ms 2.5us - -//Symbol Parameter Condition Min Max Unit -//fscl Clock frequency 400 kHz - -struct _s_gsens_ -{//8byte - - U8 d[6]; - // U16 x; - // U16 y; - // U16 z; - -}; -extern struct _s_gsens_ s_as1,s_as2; - -extern void L1_as1_readXYZ(void); -extern void L1_as2_readXYZ(void); -extern void L1_msa300_init(void); - -#endif // #ifndef _MSA300_H - - - diff --git a/source/bsp/bsp_485.h b/source/bsp/bsp_485.h deleted file mode 100644 index 134dfa8..0000000 --- a/source/bsp/bsp_485.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef BSP_485_H -#define BSP_485_H - -// #include "../cpu/STC_stc8a8k.h" -// #include "../cpu/c51_macro.h" -// #include "../clib/bit.h" - -#include "../bsp/bsp_config.h" -#include "../msp/uart0.h" - -//485_RE P33 -//485_DE P32 -#define D_485_TX() P32 = 1;// >750us -#define D_485_RX() P32 = 0; - -extern void L2_485_init(void); -#endif \ No newline at end of file diff --git a/source/bsp/bsp_config.c b/source/bsp/bsp_config.c new file mode 100644 index 0000000..33f0363 --- /dev/null +++ b/source/bsp/bsp_config.c @@ -0,0 +1,84 @@ +#include "bsp_config.h" +#include "../msp/UART0.h" +#include "../msp/eeprom.h" + +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2018, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file bsp_func.c +/// @brief bsp @ fuctiong ; io复用选择等,和cpu型号息息相关 +///------------------------------------------------------------------------- +/// @version 1.0 +/// @author CC +/// @date 20180308 +/// @note cc_AS_stc02 + +////////////////////////////////////////////////////////////////////////////// +//struct _s_sysclk s_sysclk; + +//========================================================== +//系统定时器回调 +//初始化为NULL,timer0_isr中判断为NULL则不调用 +//========================================================== + + +void L0_board_config(void) +{ +#if (PIN_UART0_Rxd_30_Txd_31 == D_PIN_UART0) + BITN_0(P_SW1 ,BITN7);// + BITN_0(P_SW1 ,BITN6);// rxd p3.0 txd p3.1 +#elif (PIN_UART0_Rxd_36_Txd_37 == D_PIN_UART0) + BITN_0(P_SW1 ,BITN7);// + BITN_1(P_SW1 ,BITN6);// rxd p3.6 txd p3.7 +#elif (PIN_UART0_Rxd_16_Txd_17 == D_PIN_UART0) + BITN_1(P_SW1 ,BITN7);// + BITN_0(P_SW1 ,BITN6);// rxd p1.6 txd p1.7 +#elif (PIN_UART0_Rxd_43_Txd_44 == D_PIN_UART0) + BITN_1(P_SW1 ,BITN7);// + BITN_1(P_SW1 ,BITN6);// rxd p4.3 txd p4.4 +#else + BITN_0(P_SW1 ,BITN7);// + BITN_0(P_SW1 ,BITN6);// rxd p3.0 txd p3.1 +#endif + + //uart2 + BITN_0(P_SW2 ,BITN0);// rxd2 p1.0 txd2 p1.1 + //BITN_1(P_SW2 ,BITN0);// rxd2 p4.0 txd2 p4.2 + + //uart3 + //P_SW2 = 0x02; // RXD3_2/P5.0, TXD3_2/P5.1 + + //uart4 + //BITN_1(P_SW2 ,BITN2);// rxd4 p5.2 txd4 p5.3 + //BITN_0(P_SW2 ,BITN2);// rxd4 p0.2 txd4 p0.3 + + //485 RE/DE 配置推完输出 P55 + BITN_0(P5M1,BITN5);BITN_1(P5M0,BITN5); + + //LED + D_stdIO_P1(BITN7); + D_stdIO_P5(BITN4); + + //IO + D_stdIO_P1(BITN0); + D_stdIO_P1(BITN1); + D_stdIO_P1(BITN2); + D_stdIO_P1(BITN6); + D_stdIO_P3(BITN2); + D_stdIO_P3(BITN3); + D_stdIO_P3(BITN4); + D_stdIO_P3(BITN5); + D_stdIO_P3(BITN6); + D_stdIO_P3(BITN7); + + #if (TYPE_WDT_ENABLE == D_WDT_STATUS) + WDT_CONTR = 0x27; //使能看门狗,22M时钟下溢出时间约为5s,请注意添加喂狗程序 + #else + WDT_CONTR = 0x00; + #endif + + //Lp0_Sys_timer_extern_handler被timer0中断调用 + //Lp0_Sys_timer_extern_handler = L1_Sys_timer_extern_handler; +} + + diff --git a/source/bsp/bsp_config.h b/source/bsp/bsp_config.h index 83a9f41..c37d08f 100644 --- a/source/bsp/bsp_config.h +++ b/source/bsp/bsp_config.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////////////////////// ///@copyright Copyright (c) 2017, 传控科技 All rights reserved. ///------------------------------------------------------------------------- -/// @file hard_config.h +/// @file bsp_config.h /// @brief hard config include /// @info FILE FOR HARDWARE SETUP AND SOFTWARE SETUP///FOR EXAMPLE: BAORD ,MCU,IDE /// @info YOU CAN CHANGE OR ADD THE DEFINE IF YOU NEED @@ -9,337 +9,222 @@ /// @info bsp_CONFIG 为其他头文件的始祖 TYPE_BOARD_xx ///------------------------------------------------------------------------- /// @version 1.1 -/// @author CC +/// @author CC /// @date 20180308 /// @note ////////////////////////////////////////////////////////////////////////////// /// @version 5.1 -/// @author CC +/// @author CC /// @date 20200301 /// @note ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// +///存储器中的特殊参数 +///全球唯一ID号 7FF9H~7FFFH BFF9H~BFFFH EFF9H~EFFFH FDF9H~FDFFH 7字节 +///内部1.19V参考信号源 7FF7H~7FF8H BFF7H~BFF8H EFF7H~EFF8H FDF7H~FDF8H 毫伏(高字节在前) +///32K掉电唤醒定时器的频率 7FF5H~7FF6H BFF5H~BFF6H EFF5H~EFF6H FDF5H~FDF6H Hz (高字节在前) +///22.1184MHz的IRC参数(20M频段) 7FF4H BFF4H EFF4H FDF4H - +///24MHz的IRC参数(20M频段) 7FF3H BFF3H EFF3H FDF3H - +///20MHz的IRC参数(20M频段) 7FF2H BFF2H EFF2H FDF2H +///固件版本为7.3.12U +///以及后续版本有效 +///27MHz的IRC参数(35M频段) 7FF1H BFF1H EFF1H FDF1H +///30MHz的IRC参数(35M频段) 7FF0H BFF0H EFF0H FDF0H +///33.1776MHz的IRC参数(35M频段) 7FEFH BFEFH EFEFH FDEFH +///35MHz的IRC参数(35M频段) 7FEEH BFEEH EFEEH FDEEH +///36.864MHz的IRC参数(35M频段) 7FEDH BFEDH EFEDH FDEDH +///保留 7FECH BFECH EFECH FDECH +///保留 7FEBH BFEBH EFEBH FDEBH +///20M频段的VRTRIM参数 7FEAH BFEAH EFEAH FDEAH +///35M频段的VRTRIM参数 7FE9H BFE9H EFE9H FDE9H +////////////////////////////////////////////////////////////////////////// + #ifndef _BSP_CONFIG_H #define _BSP_CONFIG_H -#include - - -#include "bsp_config0.h" - -#define D_version_v 'L' - - -#if 0 - -#define D_leda_OFF(); D_P35_OFF(); -#define D_leda_ON(); D_P35_ON(); -#define D_leda_REV(); D_P35_REV(); -#define D_ledb_OFF(); D_P34_OFF(); -#define D_ledb_ON(); D_P34_ON(); -#define D_ledb_REV(); D_P34_REV(); - -#else -#define D_leda_OFF(); ///D_P35_OFF(); -#define D_leda_ON(); ///D_P35_ON(); -#define D_leda_REV(); ///D_P35_REV(); -#define D_ledb_OFF(); ///D_P34_OFF(); -#define D_ledb_ON(); ///D_P34_ON(); -#define D_ledb_REV(); ///D_P34_REV(); - -#endif - - -#if 0 -#define D_debug_sim -#endif -//#define D_iic_inspect -#define D_open_save_f - -#define TYPE_UASER_BOARD ccSensor_WS_ps5ws //CC_SE_paper_main_m10_smt01.sch - -//STEP 2 TYPE_UASER_BOARD CONFIG >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -#if(TYPE_UASER_BOARD == ccSensor_WS_ps5ws)///-------TYPE_UASER_BOARD----------------TYPE_UASER_BOARD---------- -//2.0-5.5 8K 2kram 4k eeprom spi iic 2uart tssop20 stc8f2k08s2 1.2yuan -//2.0-5.5 16K 2kram 4k eeprom spi iic 2uart tssop20 stc8f2k16s2 1.4yuan +#include +#include "../bsp/bsp_config_const.h" +#include "../clib/type.h" +#include "../clib/bit.h" -//1.7-5.5 8K 1kram 3k eeprom spi iic 2uart tssop20 stc8f2k16s2 1.1yuan +//STEP 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TYPE_UASER_BOARD SELECT +#define TYPE_UASER_BOARD TYPE_BOARD_WEIGH_0B +//STEP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TYPE_UASER_BOARD CONFIG +#if(TYPE_UASER_BOARD == TYPE_BOARD_WEIGH_0B) + #include + #include "../cpu/stc_stc8hxx.h" + #include "../cpu/stc_macro.h" + + //基本配置(工作频率、时钟、看门狗、字节序) + #define TYPE_MCU TYPE_MCU_STC_8H #define TYPE_IDE TYPE_IDE_KEIL + #define D_CPUfamily_type D_CPUfamily_8bits + #define D_sys_MainFre MainFre_22M + #define D_sys_Jiffies TYPE_JIFFIES_10MS + #define D_WDT_STATUS TYPE_WDT_DISABLE //如果配置为enable,请在bsp_config.c中设置wdt溢出时间 + #define D_MCU_ENDIAN TYPE_MCU_BIGENDIAN + #define D_CODE_ENCRYPTION_TYPE TYPE_ENCRYPTION_ENABLE //是否代码加密 - #include - #include - #include - #include "../cpu/STC_stc8a8k.h" - -#if 0//// 烧写配置 - . 内部IRC振荡器的频率: 22.128MHz - . 掉电唤醒定时器的频率: 35.575KHz - . 振荡器放大增益使能 - . P3.2和P3.3与下次下载无关 - . 上电复位时增加额外的复位延时 - . 复位引脚用作普通I/O口 - . 检测到低压时不复位,而产生低压中断 - . 低压检测门槛电压 : 2.20 V - . 上电复位时,硬件不启动内部看门狗 - . 上电自动启动内部看门狗时的预分频数为 : 256 - . 空闲状态时看门狗定时器停止计数 - . 启动看门狗后,软件可以修改分频数,但不能关闭看门狗 - . 下次下载用户程序时,将用户EEPROM区一并擦除 - . 下次下载用户程序时,没有相关的端口控制485 - . 下次下载时不需要校验下载口令 - . TXD脚直通输出RXD脚的电平 - . 芯片复位后,TXD脚为强推挽输出 - . 芯片复位后,P2.0输出高电平 - . 内部参考电压: 1341 mV (参考范围: 1270~1410mV) - . 内部安排测试时间: 2018年1月13日 + #define D_MCU_NAME "STC8H3K48S4" + //存储器特殊参数地址配置 + #define D_MCU_SPEC_PARAM_CHIPID 0xBFF9 + //...其他参数 - . 芯片出厂序列号 : F64181C6219784 - 单片机型号: STC8F2K08S2 - 固件版本号: 7.3.10U + //串口配置 + #define D_uart0_BRT BRT_115200 + #define D_uart0_SBIT SBIT_1 + #define D_PIN_UART0 PIN_UART0_Rxd_30_Txd_31 + #define D_uart2_BRT BRT_115200 + #define D_uart3_BRT BRT_115200 + #define D_uart4_BRT BRT_115200 - . 用户设定频率: 22.118MHz - . 调节后的频率: 22.128MHz - . 频率调节误差: 0.043% + //485配置 + #define D_UART0_485_TYPE TYPE_485_SLAVER //UART0启用485 + #define D_UART0_485_SLAVER_ID_BROADCAST 0xFF //485从机总是响应0xFF消息 + #define D_UART0_485_SLAVER_ID 0x01 //板卡作为485从机 slaverId + #define D_UART0_485_TX() P55 = 1; + #define D_UART0_485_RX() P55 = 0; + #define D_UART2_485_TYPE TYPE_485_NONE //UART2不启用485 + #define D_UART3_485_TYPE TYPE_485_NONE //UART2不启用485 + #define D_UART4_485_TYPE TYPE_485_NONE //UART2不启用485 + //MODBUS协议配置 + #define D_MODBUS_ENABLE //MODBS启用开关,如果不使用modbus,可以注释掉本行 + #define D_MODBUS_SPLIT_ENTRY L1_modbus_split //modbus切割函数,在tpc_modbus.c中实现,依据实际情况修改 + #define D_MODBUS_REG_MAX_NUM 32 //每次最多读取/写入的寄存器数量,此处的数量要注意和 D_tp_handle_x_len 对应 - 操作成功 !(2019-02-24 18:16:24) - -该单片机的功能: 2.0-5v 8kflash 2kram DPTR EEPROM 4K - SPI IIC T0-T4 5个定时器 掉电唤醒专用定时器 比较器 内部电压检测中断 看门狗 tssop20 1.2元人民币 -#endif + //外设定义 + #define LED0 P17 //D4 + #define LED1 P54 //D4 - #include "../cpu/c51_macro.h" -#define D_MCLKO_DIV2 2 -#define D_MCLKO_DIV4 4 -#define D_MCLKO_DIV8 6 -#define D_MCLKO_DIV16 8 -#define D_MCLKO_DIV32 10 -#define D_MCLKO_DIV64 12 - -#define D_CPUfamily_type D_CPUfamily_8bits - - #define D_uart0_BRT BRT_115200 - #define D_uart0_SBIT SBIT_1 -#ifdef D_debug115200 - #if 0 - #define L2_task_L0_uart0_uc(X) L0_uart0_uc(X)/// - #define GC032a_L0_uart0_uc(x) L0_uart0_uc(x)// - #else - - #define L2_task_L0_uart0_uc(X) L0_uart0_uc(X)// - #define GC032a_L0_uart0_uc(x) L0_uart0_uc(x)// - #endif - -#else - #define L2_task_L0_uart0_uc(x) //L0_uart0_uc_debug(x)/////// - #define L2_task_L0_uart0_uchex(x) // L0_uart0_uchex(x)///// - - - #define GC032a_L0_uart0_uc(x) //L0_uart0_uc_debug(x)///// - #define GC032a_L0_uart0_uchex(x) //L0_uart0_uchex(x)//// - - - #define GC032a_L0_uart0_sendArray(x,Y) //L0_uart0_uchex(Y)// - #define GC032a_L0_uart0_us(x) //L0_uart0_us(x)*/ - + //EEP存储地址定义 + #define D_EEP_SECTOR_SIZE 0x200 //每个扇区0x200==512bytes + #define D_EEP_SECTOR_BLOCK_SIZE 0x40 //扇区中每个数据块0x40==64bytes,可选值[32,64,128]等 + #define D_EEP_SECTOR_BLOCK_NUM (D_EEP_SECTOR_SIZE / D_EEP_PARAM_BLOCK_SIZE) //每个扇区数据块的数量 + #define D_EEP_BLOCK_FILTER0 0xAA //扇区中每个数据块的Filter字段值 + #define D_EEP_BLOCK_FILTER1 0x55 + //EEP User Defined 参数区存储配置 + #define D_EEP_PARAM_IN_SECTOR 1 //eeprom参数区扇区地址,从0开始 + #define D_EEP_PARAM_IN_BLOCK 0 //eeprom参数区数据块地址,从0开始 + #define D_EEP_PARAM_BLOCK_SIZE (D_EEP_SECTOR_BLOCK_SIZE) //参数区每个块大小,必须:D_EEP_PARAM_BLOCK_SIZE<=D_EEP_SECTOR_BLOCK_SIZE!!!,因为eeprom.h中是按照D_EEP_SECTOR_BLOCK_SIZE分配的buf + #define D_EEP_PARAM_BLOCK_NUM (D_EEP_SECTOR_SIZE / D_EEP_PARAM_BLOCK_SIZE) //每个扇区数据块的数量 + //EEP 加密区存储配置 + #if(D_CODE_ENCRYPTION_TYPE == TYPE_ENCRYPTION_ENABLE) + #define D_EEP_ENC_IN_SECTOR 0 //eeprom加密区扇区地址,从0开始 + #define D_EEP_ENC_IN_BLOCK 0 //eeprom加密区数据块地址,从0开始 + #define D_EEP_ENC_BLOCK_SIZE 0x20 //ENC_BLOCK_SIZE必须与加密程序中的ENC_BLOCK_SIZE匹配,此处不建议修改,如需修改,请同时修改加密程序 + #endif +#elif + xxx #endif -///#define D_sys_MainFre MainFre_16M2 -#define D_sys_MainFre MainFre_11M -///#define D_sys_MainFre MainFre_22M - -#if(MainFre_5M == D_sys_MainFre) - -#define D_Cdelay_200us 20 -#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令 -#elif(MainFre_22M == D_sys_MainFre) - -#define D_Cdelay_200us 10 -#define D_Cdelay_1us 10 ////while p21翻转时测定 500k 2us 一个指令 -#define D_Cdelay_1ms 36// 500 14ms 360--10ms -#define D_Cdelay_5ms 180// 500 14ms 360--10ms -#define D_Cdelay_15ms 900 -#define D_Cdelay_30ms 2400 - -#define L0_delay_1us() Lc_delay_nop(2) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us -#define L0_delay_10us() Lc_delay_nop(20) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us - - - -// 0x01/#define D_MCLKO_set D_MCLKO_DIV16 //1.389MHz/800ns@MCU.22MHz- -#define D_MCLKO_set D_MCLKO_DIV8 ////2.778MHz/400ns@MCU.22MHz- -///#define D_MCLKO_set D_MCLKO_DIV4 ////5.556MHz/ @MCU.22MHz- -///#define D_MCLKO_set D_MCLKO_DIV2 ////5.556MHz/ @MCU.22MHz- -#define D_0xfa 0x33 -//#define D_0xfa 0x11 - -/******************* -#define D_0xf7 0x01 -#define D_0xf8 0x02 - -#define D_P00x46 0x26////pclk /////cccc201805 hs low polarity -#define D_P00x4c 0x00 -#define D_P00x4d 0x04 -#define D_P00x43 0x10 ///EABLE CrCb fixed en 02 -#define D_P00x4a 0x83 ///div_gate+clk_en 82 +//STEP 2 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>IRQ Config +#if ((TYPE_MCU & TYPE_MCU_VENDOR_MSK) == TYPE_MCU_VENDOR_STC) +#define D_SERVE_INT0 interrupt 0 +#define D_SERVE_TIMER0 interrupt 1 +#define D_SERVE_INT1 interrupt 2 +#define D_SERVE_TIMER1 interrupt 3 +#define D_SERVE_UART interrupt 4 +#define D_SERVE_ADC interrupt 5 +#define D_SERVE_LVD interrupt 6 +#define D_SERVE_PCA interrupt 7 +#define D_SERVE_UART2 interrupt 8 +#define D_SERVE_SPI interrupt 9 +#define D_SERVE_INT2 interrupt 10 +#define D_SERVE_INT3 interrupt 11 +#define D_SERVE_TIMER2 interrupt 12 +#define D_SERVE_INT4 interrupt 16 +#define D_SERVE_UART3 interrupt 17 +#define D_SERVE_UART4 interrupt 18 + +#define D_SERVE_TIMER3 interrupt 19 +#define D_SERVE_TIMER4 interrupt 20 +#define D_SERVE_CMP interrupt 21 +#define D_SERVE_PWM interrupt 22 +#define D_SERVE_PWMFD interrupt 23 +#define D_SERVE_I2C interrupt 24 +#endif +//STEP 3 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Cdelay CONFIG +#if(MainFre_5M == D_sys_MainFre) +#define D_Cdelay_200us 20 +#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令 +#elif(MainFre_22M == D_sys_MainFre) +#define D_Cdelay_200us 20 +#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令 +#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令 +#define L0_delay_1us() Lc_delay_nop(0) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#define L0_delay_10us() Lc_delay_nop(4) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#define L0_delay_40us() Lc_delay_nop(18) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us #elif(MainFre_27M == D_sys_MainFre) - #define D_Cdelay_200us 20 #define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令 - -#else ///MainFre_11M - +#else ///MainFre_11M #define D_Cdelay_200us 20 -#define D_Cdelay_1us 1 - -#define D_Cdelay_1ms 36// -#define D_Cdelay_5ms 180// -#define D_Cdelay_15ms 900 -#define D_Cdelay_30ms 2400 -#if 0 -#define L0_delay_1us() Lc_delay_nop(5) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us -#define L0_delay_10us() Lc_delay_nop(40) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us -#define L0_delay_40us() Lc_delay_nop(150) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us -#else -#define L0_delay_1us() Lc_delay_nop(0) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us -#define L0_delay_10us() Lc_delay_nop(4) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us //绀烘尝鍣ㄦ祴璇曠粨鏋? -#define L0_delay_40us() Lc_delay_nop(18) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us -#endif - +#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令 +#define L0_delay_1us() Lc_delay_nop(0) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#define L0_delay_10us() Lc_delay_nop(4) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#define L0_delay_40us() Lc_delay_nop(18) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us + //xx #endif//D_sys_MainFre) -/*******>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -1, -串口1选择定时器2为波特率发生器 - AUXR &= 0xFB; //定时器2时钟为Fosc/12,即12T, -2, timer0 为task使用 -L1_tick_tick -3, - -///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<****/ - -#define D_IO_LED1_OFF() D_P35_OFF() -#define D_IO_LED2_OFF() D_P34_OFF() -#define D_IO_485_RE_OFF() D_P33_OFF() -#define D_IO_485_DE_OFF() D_P32_OFF() -#define D_IO_LED1_INIT() ///D_P35_INIT() -#define D_IO_LED2_INIT() ///D_P34_INIT() -#define D_IO_485_RE_INIT() ///D_P33_INIT() -#define D_IO_485_DE_INIT() ///D_P32_INIT() -#define D_IO_LED1_ON() D_P35_ON() -#define D_IO_LED2_ON() D_P34_ON() -#define D_IO_485_RE_ON() D_P33_ON() -#define D_IO_485_DE_ON() D_P32_ON() - - -////////////////////////////////sim iic config -//根据sch的定义 -#define L0_IIC_SIM_INIT() BITN_0(P3M1,5);BITN_0(P3M0,5);\ - BITN_0(P3M1,4);BITN_0(P3M0,4); -///stc独有10 高阻 -#define L0_IIC_SIM_close() BITN_1(P3M1,5);BITN_0(P3M0,5);\ - BITN_1(P3M1,4);BITN_0(P3M0,4); - -#if 10 -#define L0_SDA_ON() D_P34_ON() -#define L0_SDA_OFF() D_P34_OFF() -#define L0_SDA_AT() D_P34_AT() -#define L0_SCL_ON() D_P35_ON() -#define L0_SCL_OFF() D_P35_OFF() -#else - -#define L0_SDA_ON() //D_P34_ON() -#define L0_SDA_OFF() //D_P34_OFF() -#define L0_SDA_AT() //D_P34_AT() -#define L0_SCL_ON() //D_P35_ON() -#define L0_SCL_OFF() //D_P35_OFF() - -#endif - +//STEP 4 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<750us -#define D_txd4_low() P31 = 0 -////为适应433 模块的功耗问题 -////debug的时候切记 此处会对串口造成影响 low有效的情况下其他的发送不会好使,除非事先wakeup -#else -#define D_txd4_wakeup() //P31 = 1 // >750us -#define D_txd4_low() //P31 = 0 - - -#endif - -#define DR_who_wakeup22 i2ctxd -///// DR: Define Register DRB:bit of Define Register -#define DR_isr_times SADDR -#define DR_who_wakeup SADEN -#define DRB_who_wakeup_timer0 BITN0 -#define DRB_who_wakeup_action BITN1 -#define DRB_who_wakeup_voice BITN2 -#ifdef doc342343 -BITN_1(DR_who_wakeup, DRB_who_wakeup_timer0); -BITN_0(DR_who_wakeup, DRB_who_wakeup_timer0); +//STEP 5 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - #include - #include +//STEP 6 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - -#include "../clib/Type.h" -#include "../clib/bit.h" -#include "../ctask/task.h" - -#include "../clib/clib.h" -////#define D_debug115200/// - - -//#define D_cameralIndex 0 -//#define D_cameralIndex 1 -//#define D_cameralIndex 2 -#define D_cameralIndex 3 -//#define D_cameralIndex 4 -//#define D_cameralIndex 5 - - -#define SBIT_1 1 //1 stop bit -#define SBIT_2 2 //2 stop bit - - -#define BRT_115200 115200 -#define BRT_19200 19200 -#define BRT_9600 9600 -#define BRT_4800 4800 -#define BRT_SIM 900 -#define MainFre_5M 0 -#define MainFre_11M 1 -#define MainFre_22M 2 -#define MainFre_27M 3 -#define MainFre_24M 4 -#define MainFre_33M 5 -#if 0 - -#define D_leda_OFF(); D_P35_OFF(); -#define D_leda_ON(); D_P35_ON(); -#define D_leda_REV(); D_P35_REV(); -#define D_ledb_OFF(); D_P34_OFF(); -#define D_ledb_ON(); D_P34_ON(); -#define D_ledb_REV(); D_P34_REV(); - -#else -#define D_leda_OFF(); ///D_P35_OFF(); -#define D_leda_ON(); ///D_P35_ON(); -#define D_leda_REV(); ///D_P35_REV(); -#define D_ledb_OFF(); ///D_P34_OFF(); -#define D_ledb_ON(); ///D_P34_ON(); -#define D_ledb_REV(); ///D_P34_REV(); - -#endif - - - -#if 0 -#define D_debug_sim -#endif -//#define D_iic_inspect -#define D_open_save_f - -//>>>>>>>>>>>>>>>>>>>>>>.BORAD TYPE -#define TYPE_BOARD_hhnew 16 -#define TYPE_BOARD_st_sleep04_01 4 -#define TYPE_BOARD_st_sleep03 5 -#define TYPE_BOARD_SMMM_MB_VH032_0E 6 -#define TYPE_BOARD_LPC17xx_ 8 -#define TYPE_BOARD_STM32F_103ZET6_READBULL 1036 -#define TYPE_BOARD_hh_CC_MD_VH05_anyriny_simple_m51 0x0551 -#define TYPE_BOARD_hh_CC_MD_VH06_asMain_m6a7 0x6a7 -#define TYPE_BOARD_TI26_MT01_M178 0x178 //会议计时器版v TI26_MT01-M178 -#define TYPE_BOARD_stc5as32_WIFIBV01 532 -#define TYPE_BOARD_SHC16LAXXQN32 1632 //SHC16LAXXQN32 - -#define TYPE_BOARD_paper6133_m0a6 0xa6 //纸张传感器 -#define TYPE_BOARD_paper_main_m10 0x10 //纸张传感器2 CC_SE_paper_main_m10_smt01.sch -#define ccSensor_CG_V02_m08_debug 0x0208 //CG传感器2 -#define TYPE_BOARD_cc_Light_Speed0B 0x11b //LR光电感器2 - -#define TYPE_BOARD_cc_G0A03 0x123 //倾角感器2 -#define ccSensor_WS_ps5ws 0x0258 ///称重传感器 - - -/************************************* -芯片型号 : IRC15W207S -HSY037.XA -关于此芯片的重要说明: - 有定时器0和定时器2 (注意:无定时器1) - 有比较器 (可当作一路ADC使用) -************************/ -///cc_gsm_paper6133_m0a6_debug01 -//STEP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<.BORAD TYPE - - -// BORAD, -// MCU:SHC6601 -// IDE :KEIL -//>>>>>>>>>>>>>>>>>>>>>>mcu TYPE -#define TYPE_MCU_SHC6601 66 -#define TYPE_MCU_STC 51 -#define TYPE_MCU_LPC17xx 3217 -#define TYPE_MCU_STM32 3232 - -#define D_CPUfamily_8bits 8 -#define D_CPUfamily_16bits 16 -#define D_CPUfamily_32bits 32 -//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>IDE TYPE - -#define TYPE_IDE_KEIL 1 -#define TYPE_IDE_MDK 2 -#define TYPE_IDE_IAR 3 - -//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>G-SENSOR TYPE - -#define TYPE_ASENSOR_ADXL362 362 -#define TYPE_ASENSOR_MSA300 362 -#define TYPE_ASENSOR TYPE_ASENSOR_MSA300 -//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>TTSS_tick TYPE - -#define D_TTSS_tick_5ms 5 -#define D_TTSS_tick_10ms 10 -#define D_TTSS_tick_25ms 25 - - -//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - -//#define TYPE_UASER_BOARD TYPE_BOARD_SMMM_MB_VH032_0E -//#define TYPE_UASER_BOARD TYPE_BOARD_stc90c516rd -//#define TYPE_UASER_BOARD TYPE_BOARD_hh_CC_MD_VH06_asMain_m6a7 -//#define TYPE_UASER_BOARD TYPE_BOARD_stc5as32_WIFIBV01 -//#define TYPE_UASER_BOARD TYPE_BOARD_hhnew -//STEP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -//>>>>>>>>>>>>>>>>>>>>>>TTSS_tick TYPE - -#define D_TTSS_tick_5ms 5 -#define D_TTSS_tick_10ms 10 -#define D_TTSS_tick_25ms 25 - - -//<<<<<<<<<<<<<<<<<<<<< +#include "../clib/type.h" +#include "../clib/bit.h" + +//>>>>>>>>>>>>>>>>>>>>>>.BORAD TYPE +#define TYPE_BOARD_hhnew 1 +#define TYPE_BOARD_st_sleep04_01 4 +#define TYPE_BOARD_st_sleep03 5 +#define TYPE_BOARD_SMMM_MB_VH032_0E 6 +#define TYPE_BOARD_LPC17xx_ 8 +#define TYPE_BOARD_STM32F_103ZET6_READBULL 1036 +#define TYPE_BOARD_hh_CC_MD_VH05_anyriny_simple_m51 0x0551 +#define TYPE_BOARD_hh_CC_MD_VH06_asMain_m6a7 0x6a7 +#define TYPE_BOARD_TI26_MT01_M178 0x178 //会议计时器版v TI26_MT01-M178 +#define TYPE_BOARD_stc5as32_WIFIBV01 532 +#define TYPE_BOARD_SHC16LAXXQN32 1632 //SHC16LAXXQN32 +#define TYPE_BOARD_PAPER6133_M0A6 0xa6 //打印机纸张传感 +#define TYPE_BOARD_GSM_MAIN_V07 0xa7 //打印机运维板 +#define TYPE_BOARD_ADDA_MAIN_V02 0xa8 //ADDA +#define TYPE_BOARD_433_0A 0xa9 //433 +#define TYPE_BOARD_WEIGH_0B 0xaa //称重 +//<<<<<<<<<<<<<<<<<<<<<<<<<<<.BORAD TYPE end + +//>>>>>>>>>>>>>>>>>>>>>>MCU TYPE +#define TYPE_MCU_VENDOR_MSK 0xF0 +#define TYPE_MCU_VENDOR_STC 0x10 +#define TYPE_MCU_STC_8A 0x11 +#define TYPE_MCU_STC_8F 0x12 +#define TYPE_MCU_STC_8G 0x13 +#define TYPE_MCU_STC_8H 0x14 + +#define TYPE_MCU_VENDOR_TI 0x60 +#define TYPE_MCU_SHC6601 0x66 +#define TYPE_MCU_LPC17xx 0x67 +#define TYPE_MCU_STM32 0x68 + +#define D_CPUfamily_8bits 8 +#define D_CPUfamily_16bits 16 +#define D_CPUfamily_32bits 32 +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>IDE TYPE +#define TYPE_IDE_KEIL 1 +#define TYPE_IDE_MDK 2 +#define TYPE_IDE_IAR 3 +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>SysTimer TYPE +#define TYPE_JIFFIES_5MS 5 +#define TYPE_JIFFIES_10MS 10 +#define TYPE_JIFFIES_25MS 25 +//<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>.WDT TYPE +#define TYPE_WDT_DISABLE 1 +#define TYPE_WDT_ENABLE 2 +//#define WDT_FEED() WDT_CONTR |= 0x10 +//<<<<<<<<<<<<<<<<<<<<<<<<<<<.SysTimer TYPE end + +//>>>>>>>>>>>>>>>>>>>>>>.ByteOrder TYPE +#define TYPE_MCU_BIGENDIAN 1 //大端字节序 +#define TYPE_MCU_LITENDIAN 2 //小端字节序 +//<<<<<<<<<<<<<<<<<<<<<<<<<<<.ByteOrder TYPE end + +//>>>>>>>>>>>>>>>>>>>>>>.代码加密 TYPE +#define TYPE_ENCRYPTION_ENABLE 1 //代码加密 +#define TYPE_ENCRYPTION_DISABLE 2 //代码不加密 +//<<<<<<<<<<<<<<<<<<<<<<<<<<<.ByteOrder TYPE end + +//>>>>>>>>>>>>>>>>>>>>>>BUADRATE & StopBit +#define SBIT_1 1 //1 stop bit +#define SBIT_2 2 //2 stop bit +#define BRT_115200 115200 +#define BRT_19200 19200 +#define BRT_9600 9600 +#define BRT_4800 4800 +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>MainFre +#define MainFre_5M 5529600L +#define MainFre_11M 11059200L +#define MainFre_22M 22118400L +#define MainFre_24M 24000000L +#define MainFre_27M 27000000L +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>UART0 PIN +#define PIN_UART0_Rxd_30_Txd_31 1 +#define PIN_UART0_Rxd_36_Txd_37 2 +#define PIN_UART0_Rxd_16_Txd_17 3 +#define PIN_UART0_Rxd_43_Txd_44 4 +//<<<<<<<<<<<<<<<<<<<<<<<<<<<.UART0 PIN + +//>>>>>>>>>>>>>>>>>>>>>>485 Type +#define TYPE_485_NONE 0 +#define TYPE_485_MASTER 1 +#define TYPE_485_SLAVER 2 +//<<<<<<<<<<<<<<<<<<<<<<485 Type end + +//>>>>>>>>>>>>>>>>>>>>>>G-SENSOR TYPE +#define TYPE_ASENSOR_ADXL362 362 +#define TYPE_ASENSOR_MSA300 300 +#define TYPE_ASENSOR TYPE_ASENSOR_MSA300 +//<<<<<<<<<<<<<<<<<<<<<>>端口位定义,可修改!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -#include "../cpu/stc_stc8a8k.h" -#include "../cpu/c51_macro.h" #include "../bsp/bsp_config.h" - - -#include "uart0.h" +#include "../msp/uart0.h" extern void L0_id_get(U8 *id); extern void L0_id_get_rom(U8 *id); diff --git a/source/bsp/bsp_cs1232.c b/source/bsp/cs1232.c similarity index 91% rename from source/bsp/bsp_cs1232.c rename to source/bsp/cs1232.c index a498b71..9aa2073 100644 --- a/source/bsp/bsp_cs1232.c +++ b/source/bsp/cs1232.c @@ -14,11 +14,11 @@ /// @note ////////////////////////////////////////////////////////////////////////////// -#include "bsp_cs1232.h" +#include "cs1232.h" TSS_FLOW_ tss_ads; //#define D_ADC_GATHER_Way1 1 - +#if 0 u8 Read_byte_adcIC(void) { u8 i; @@ -40,17 +40,6 @@ u8 Read_byte_adcIC(void) return(rdata); } -void L0_ADS1213_INIT(void) -{ - D_ADS1213_INIT(); - - L0_ADS1213_CH(D_ADCCH_1); - Lc_delay_ms(100);///57ms 建立时间 - - //L0_ADS1213_CH(D_ADCCH_3); - //Lc_delay_ms(100);///57ms 建立时间 -} - void L0_ADS1213_CH(u8 ch) { /// /// SPEED = 1 57--57 ms 硬件配置成高电平 @@ -99,6 +88,21 @@ void L0_ADS1213_T(u8 onff) } } +#endif +void L0_ADS1213_INIT(void) +{ + D_ADS1213_INIT(); + D_stdIO_P3(BITN2); + D_stdIO_P3(BITN3); + + //L0_ADS1213_CH(D_ADCCH_1); //4个独立芯片,不需要切换 + Lc_delay_ms(100);///57ms 建立时间 + + //L0_ADS1213_CH(D_ADCCH_3); + //Lc_delay_ms(100);///57ms 建立时间 +} + + void L0_2dc_SCLK(vtype ch,vtype onf) { switch (ch) @@ -144,12 +148,10 @@ vtype L0_2dc_DOUT_AT(vtype ch) return r; } - -vtype i; vU32 rdata = 0; - +//任务读 vS32 L0_ADS1231_readCH(vtype ch) { - rdata = 0; + vtype i; vU32 rdata = 0; for(i = 0; i < 24; i++) { L0_2dc_SCLK(ch,1);/// D_ADC_SCLK1_ON(); @@ -171,23 +173,15 @@ vS32 L0_ADS1231_readCH(vtype ch) return rdata; } - +//调试阻塞读 vS32 L0_ADS1231_read(U8 ch) { vU32 e = 0;u8 i;vS32 rdata = 0; - while(0 == L0_2dc_DOUT_AT(ch)) - { - if(e ++ > 100000) - { - return 0; - } - } - e = 0; while(1 == L0_2dc_DOUT_AT(ch)) { if(e ++ > 100000) { - return 0; + //return 0; } } for(i = 0; i < 24; i++) @@ -200,6 +194,7 @@ vS32 L0_ADS1231_read(U8 ch) rdata += 1; } } + L0_2dc_SCLK(ch,1); if(rdata & 0x800000) //???λ?1??<0?? { rdata |= 0xFF000000; @@ -210,16 +205,16 @@ vS32 L0_ADS1231_read(U8 ch) void L1_ADS1213_main(void) { - U8 ch = D_ADCCH_4; + U8 ch = D_ADCCH_2; while(1) { while(1 == L0_2dc_DOUT_AT(ch)) ; tss_ads.u32_i = L0_ADS1231_readCH(ch); tss_ads.u16_v = (vU16)( tss_ads.u32_i >> 16); - L0_uart0_ushex(tss_ads.u16_v,16); + L0_uart0_ushex(tss_ads.u16_v); tss_ads.u16_v = (vU16)(tss_ads.u32_i & 0x0000ffff); - L0_uart0_ushex(tss_ads.u16_v,16);//Lc_delay_us(500); + L0_uart0_ushex(tss_ads.u16_v);//Lc_delay_us(500); L0_uart0_uc(0x0d); L0_uart0_uc(0x0a); } } diff --git a/source/bsp/bsp_cs1232.h b/source/bsp/cs1232.h similarity index 76% rename from source/bsp/bsp_cs1232.h rename to source/bsp/cs1232.h index f9b375a..bab0040 100644 --- a/source/bsp/bsp_cs1232.h +++ b/source/bsp/cs1232.h @@ -21,16 +21,17 @@ #include "../bsp/bsp_config.h" #include "../msp/uart0.h" +#include "../ctask/task.h" -#define D_ADCCH_T 0 -#define D_ADCCH_1 1 -#define D_ADCCH_2 2 -#define D_ADCCH_3 3 -#define D_ADCCH_4 4 - -#define D_ADCCH_Toff 5 +#define D_ADCCH_1 0 +#define D_ADCCH_2 1 +#define D_ADCCH_3 2 +#define D_ADCCH_4 3 + +#define D_ADCCH_T 8 +#define D_ADCCH_Toff 9 ///数字部分需要有四个数据转换周期满足模拟输入信号的建立和滤波器的建立时间要求。芯 ///片从外部差分输入信号切换到温度传感器、从温度传感器切换到外部差分输入信号,或通 @@ -70,65 +71,62 @@ /************** IO DEFINE PIN -P1.2 TEMP 1 -P1.3 SCLK3 2 -P1.4 DOUT1 3 -P1.5 SCLK1 4 -P1.6 DOUT2 5 -P1.7 SCLK2 6 -P5.4 PDWN 7 -P5.5 CS_A0 9 -P1.1 DOUT3 20 -P1.0 LED1 19 -P3.7 GAIN1 18 -P3.6 GAIN0 17 -P3.5 LED2 16 -P3.4 DOUT4 15 -P3.3 SCLK4 14 -P3.2 485_RE 13 +P1.0 DOUT2 1 +P1.6 SCLK2 2 +P1.7 LED1 3 +P5.4 LED2 7 +P5.5 485_RE 9 +P1.1 PDWN 20 +P1.2 GAIN0 19 +P3.7 DOUT3 18 +P3.6 DOUT1 17 +P3.5 SCLK1 16 +P3.4 SCLK3 15 +P3.3 DOUT4 14 +P3.2 SCLK4 13 P3.1 TXD0 12 P3.0 RXD0 11 *****************/ -#define D_ADC_DOUT1_INIT() ///D_P16_INIT() -#define D_ADC_SCLK1_INIT() ///D_P17_INIT() +#define D_ADC_DOUT1_INIT() ///D_P17_INIT() +#define D_ADC_SCLK1_INIT() ///D_P16_INIT() #define D_ADC_CS_A0_INIT() ///D_P55_INIT() -#define D_ADC_DOUT1_AT() D_P14_AT() -#define D_ADC_DOUT1_ON() D_P14_ON() -#define D_ADC_SCLK1_ON() D_P15_ON();D_adc_delay2(); -#define D_ADC_CS_A0_ON() D_P55_ON() -#define D_ADC_DOUT1_OFF() D_P14_OFF() -#define D_ADC_SCLK1_OFF() D_P15_OFF();D_adc_delay(); -#define D_ADC_CS_A0_OFF() D_P55_OFF() +#define D_ADC_DOUT1_AT() D_P36_AT() +#define D_ADC_DOUT1_ON() D_P36_ON() +#define D_ADC_SCLK1_ON() D_P35_ON();D_adc_delay2(); +#define D_ADC_CS_A0_ON() //D_P55_ON() +#define D_ADC_DOUT1_OFF() D_P36_OFF() +#define D_ADC_SCLK1_OFF() D_P35_OFF();D_adc_delay(); +#define D_ADC_CS_A0_OFF() //D_P55_OFF() //#define D_ADC_CS2_A0_ON() D_P13_ON() -#define D_ADC_DOUT2_ON() D_P16_ON() -#define D_ADC_DOUT2_AT() D_P16_AT() -#define D_ADC_SCLK2_ON() D_P17_ON();D_adc_delay2(); +#define D_ADC_DOUT2_ON() D_P10_ON() +#define D_ADC_DOUT2_AT() D_P10_AT() +#define D_ADC_SCLK2_ON() D_P16_ON();D_adc_delay2(); //#define D_ADC_CS2_A0_INIT() ///D_P13_INIT() #define D_ADC_DOUT2_INIT() ///D_P14_IN() ///D_P14_INIT() #define D_ADC_SCLK2_INIT() ///D_P15_INIT() //#define D_ADC_CS2_A0_OFF() D_P13_OFF() -#define D_ADC_DOUT2_OFF() D_P16_OFF() -#define D_ADC_SCLK2_OFF() D_P17_OFF();D_adc_delay(); +#define D_ADC_DOUT2_OFF() D_P10_OFF() +#define D_ADC_SCLK2_OFF() D_P16_OFF();D_adc_delay(); #define D_ADC_DOUT3_INIT() ///D_P11_INIT() #define D_ADC_SCLK3_INIT() ///D_P13_INIT() -#define D_ADC_DOUT3_AT() D_P11_AT() -#define D_ADC_DOUT3_ON() D_P11_ON() -#define D_ADC_SCLK3_ON() D_P13_ON();D_adc_delay2(); -#define D_ADC_DOUT3_OFF() D_P11_OFF() -#define D_ADC_SCLK3_OFF() D_P13_OFF();D_adc_delay(); +#define D_ADC_DOUT3_AT() D_P37_AT() +#define D_ADC_DOUT3_ON() D_P37_ON() +#define D_ADC_SCLK3_ON() D_P34_ON();D_adc_delay2(); +#define D_ADC_DOUT3_OFF() D_P37_OFF() +#define D_ADC_SCLK3_OFF() D_P34_OFF();D_adc_delay(); #define D_ADC_DOUT4_INIT() ///D_P34_INIT() #define D_ADC_SCLK4_INIT() ///D_P33_INIT() -#define D_ADC_DOUT4_AT() D_P34_AT() -#define D_ADC_DOUT4_ON() D_P34_ON() -#define D_ADC_SCLK4_ON() D_P33_ON();D_adc_delay2(); -#define D_ADC_DOUT4_OFF() D_P34_OFF() -#define D_ADC_SCLK4_OFF() D_P33_OFF();D_adc_delay(); +#define D_ADC_DOUT4_AT() D_P33_AT() +#define D_ADC_DOUT4_ON() D_P33_ON() +#define D_ADC_SCLK4_ON() D_P32_ON();D_adc_delay2(); +#define D_ADC_DOUT4_OFF() D_P33_OFF() +#define D_ADC_SCLK4_OFF() D_P32_OFF();D_adc_delay(); @@ -137,14 +135,14 @@ P3.0 RXD0 11 #define D_ADC_TEMP_INIT() ///D_P12_INIT() -#define D_ADC_TEMP_ON() D_P12_ON() -#define D_ADC_TEMP_OFF() D_P12_OFF() +#define D_ADC_TEMP_ON() //D_P12_ON() +#define D_ADC_TEMP_OFF() //D_P12_OFF() #define D_ADC_PDWN_INIT() ///D_P54_INIT() -#define D_ADC_PDWN_OFF() D_P54_OFF() -#define D_ADC_PDWN_ON() D_P54_ON() +#define D_ADC_PDWN_OFF() D_P11_OFF() +#define D_ADC_PDWN_ON() D_P11_ON() @@ -152,15 +150,15 @@ P3.0 RXD0 11 #define D_ADC_GAIN1_INIT() ///D_P37_INIT() #define D_ADC_GAIN0_INIT() ///D_P36_INIT() -#define D_ADC_GAIN1_OFF() D_P37_OFF() -#define D_ADC_GAIN0_OFF() D_P36_OFF() -#define D_ADC_GAIN1_ON() D_P37_ON() -#define D_ADC_GAIN0_ON() D_P36_ON() +#define D_ADC_GAIN1_OFF() //D_P37_OFF() +#define D_ADC_GAIN0_OFF() D_P12_OFF() +#define D_ADC_GAIN1_ON() //D_P37_ON() +#define D_ADC_GAIN0_ON() D_P12_ON() // #define D_ADS1213_GAIN_VAL 1 // #define D_ADS1213_GAIN_VAL 2 -//#define D_ADS1213_GAIN_VAL 64 -#define D_ADS1213_GAIN_VAL 128 +#define D_ADS1213_GAIN_VAL 64 +//#define D_ADS1213_GAIN_VAL 128 #if (D_ADS1213_GAIN_VAL == 128) #define D_ADS1213_INIT() D_ADC_GAIN1_ON();D_ADC_GAIN0_ON();\ @@ -168,6 +166,7 @@ P3.0 RXD0 11 D_ADC_CS_A0_ON();\ D_ADC_SCLK1_OFF();D_ADC_SCLK2_OFF();\ D_ADC_SCLK3_OFF();D_ADC_SCLK4_OFF(); + #elif (D_ADS1213_GAIN_VAL == 64) #define D_ADS1213_INIT() D_ADC_GAIN1_ON();D_ADC_GAIN0_OFF();\ D_ADC_TEMP_OFF();\ diff --git a/source/bsp/bsp_485.c b/source/bsp/rs485.c similarity index 63% rename from source/bsp/bsp_485.c rename to source/bsp/rs485.c index b2efe0e..5c00a48 100644 --- a/source/bsp/bsp_485.c +++ b/source/bsp/rs485.c @@ -1,8 +1,8 @@ -#include "bsp_485.h" +#include "rs485.h" void L2_485_init(void) { //485配置强推挽输出 P33 P32 //BITN_0(P3M1,BITN3);BITN_1(P3M0,BITN3); - BITN_0(P3M1,BITN2);BITN_1(P3M0,BITN2); + BITN_0(P5M1,BITN5);BITN_1(P5M0,BITN5); } \ No newline at end of file diff --git a/source/bsp/rs485.h b/source/bsp/rs485.h new file mode 100644 index 0000000..0bdba72 --- /dev/null +++ b/source/bsp/rs485.h @@ -0,0 +1,13 @@ +#ifndef BSP_485_H +#define BSP_485_H + +#include "../bsp/bsp_config.h" +#include "../msp/uart0.h" + +//485_RE P33 +//485_DE P32 +#define D_485_TX() P55 = 1;// >750us +#define D_485_RX() P55 = 0; + +extern void L2_485_init(void); +#endif \ No newline at end of file diff --git a/source/clib/clib.c b/source/clib/clib.c index 078fba9..f7f8633 100644 --- a/source/clib/clib.c +++ b/source/clib/clib.c @@ -307,6 +307,51 @@ vS32 Lc_S32_media(vS32 val[],S16 num) return val[num/2]; } } +U32 Lc_vS32_media(U32 *d, U8 n) +{ + U8 i = 0,j = 0; + U32 h = 0; + if(n == 1) + { + return d[0]; + } + for(i=0;i d[j]) + { + h = d[i]; + d[i] = d[j]; + d[j] = h; + } + } + } + if(n%2 != 0) //奇数 + { + return d[n/2]; + } + else//偶数 + { + return ((d[n/2] + d[n/2-1])/2); + } +} + + +U32 Lc_vU32_avg(U32 *d, U8 n) +{ + U8 i = 0; + U32 sum = 0; + if(n == 1) + { + return d[0]; + } + for(i=0;i>=1;//先将数据右移一位 + wcrc^=0XA001;//与上面的多项式进行异或 + } + else//如果不是1,则直接移出 + { + wcrc>>=1;//直接移出 + } + } + } + temp=wcrc;//crc的值 + CRC[0]=wcrc;//crc的低八位 + CRC[1]=wcrc>>8;//crc的高八位 +} + +#if 0 +void crc16_irq(unsigned char *CRC,void *dat,unsigned int len) { unsigned char *ptr = (unsigned char *)dat; unsigned long wcrc=0XFFFF;//预置16位crc寄存器,初值全部为1 @@ -389,6 +464,7 @@ void crc16(unsigned char *CRC,void *dat,unsigned int len) CRC[0]=wcrc;//crc的低八位 CRC[1]=wcrc>>8;//crc的高八位 } +#endif U32 Lc_abs(vS32 a,vS32 b) @@ -414,6 +490,33 @@ void Lc_encrypt_id(U8 *enc_dst, U8 *enc_src, U32 enc_key, U8 src_len) } } +void Lc_encrypt_id1(U8 *enc_dst, U8 *enc_src, U8 enc_key[], U8 src_len) +{ + U8 i; + for(i=0;i 0x31 0x31 0x32 0x32 '1' '1' '2' '2' extern void Lc_hex2ascii(U8 *buf,U16 len,U8 *ascii); -extern void crc16(unsigned char *CRC,void *dat,unsigned int len); +extern void crc16(unsigned char *CRC,void *dat,unsigned int len) /*reentrant*/; +//extern void crc16_irq(unsigned char *CRC,void *dat,unsigned int len); extern int isBigEndianOrder(void); extern U32 ntohl(U32 dat); extern U32 htonl(U32 dat); @@ -105,6 +106,13 @@ extern U16 ntohs(U16 dat); extern U16 htons(U16 dat); extern U32 Lc_abs(vS32 a,vS32 b); extern void Lc_encrypt_id(U8 *enc_dst, U8 *enc_src, U32 enc_key, U8 src_len); +extern void Lc_encrypt_id1(U8 *enc_dst, U8 *enc_src, U8 enc_key[], U8 src_len); +extern int Lc_strlen(char *str); +extern U32 Lc_vU32_avg(U32 *d, U8 n); +extern U32 Lc_vS32_media(U32 *d, U8 n); +extern int Lc_memset(U8 *buf,U8 c,U16 len); + + #endif /* end __UART_H */ /***************************************************************************** diff --git a/source/clib/type.h b/source/clib/type.h index a07b789..439b662 100644 --- a/source/clib/type.h +++ b/source/clib/type.h @@ -80,6 +80,7 @@ #ifndef TRUE #define TRUE (1) #endif + /********************************************************************************************************* ޹ص *********************************************************************************************************/ @@ -267,7 +268,7 @@ typedef struct #define HIGHT 1 #define LOW 0 - +#if 0 #ifndef MIN #define MIN(a,b) (((a) < (b)) ? (a) : (b)) #endif @@ -275,7 +276,7 @@ typedef struct #ifndef MAX #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #endif - +#endif #ifndef ABS #define ABS(a, b) (((a) > (b)) ? ((a) - (b)) : ((b) - (a))) #endif diff --git a/source/cpu/STARTUP.A51 b/source/cpu/STARTUP.A51 index fbe7294..65daedc 100644 --- a/source/cpu/STARTUP.A51 +++ b/source/cpu/STARTUP.A51 @@ -35,7 +35,7 @@ XDATASTART EQU 0 ; ; XDATALEN: XDATA memory size <0x0-0xFFFF> ; The length of XDATA memory in bytes. -XDATALEN EQU 0 +XDATALEN EQU 3072 ; ; PDATASTART: PDATA memory start address <0x0-0xFFFF> ; The absolute start address of PDATA memory diff --git a/source/cpu/STC_stc8a8k.H b/source/cpu/STC_stc8a8k.H index 7c5ea25..79da822 100644 --- a/source/cpu/STC_stc8a8k.H +++ b/source/cpu/STC_stc8a8k.H @@ -2,6 +2,7 @@ #define __STC_stc8a8k_H_ // STC_stc8a8k.h #include + ///////////////////////////////////////////////// //注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为 // 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用 @@ -140,11 +141,7 @@ sfr AUXR = 0x8E; //0000,0000 辅助寄存器 #define S1ST2 BITN0 //串口1选择定时器1 =0 选择定时器2 =1 -sfr VOCTR = 0xBB; //电压控制寄存器 -///BITN_1(VOCTR, BITN7) VOCTR -#define D_VOCTR_SCCIN 0x00 -#define D_VOCTR_SCC 0x80 -#define D_VOCTR_SET(X) VOCTR = (X) + sfr AUXR1 = 0xA2; //0000,0000 辅助寄存器1 sfr P_SW1 = 0xA2; //0000,0000 外设端口切换寄存器1 @@ -173,7 +170,6 @@ sbit ET1 = IE^3; sbit EX1 = IE^2; sbit ET0 = IE^1; sbit EX0 = IE^0; -sfr IE2 = 0xAF; //0000,0000 中断控制寄存器2 sfr IP = 0xB8; //0000,0000 中断优先级寄存器 sbit PPCA = IP^7; sbit PLVD = IP^6; @@ -183,6 +179,7 @@ sbit PT1 = IP^3; sbit PX1 = IP^2; sbit PT0 = IP^1; sbit PX0 = IP^0; +sfr IE2 = 0xAF; //0000,0000 中断控制寄存器2 /// 不可位寻址 #define ET4 BITN6 #define ET3 BITN5 @@ -192,46 +189,9 @@ sbit PX0 = IP^0; #define ESPI BITN1 #define ES2 BITN0 -sfr IPH = 0xB7; //xxxx,xx00 中断优先级寄存器2 -#define PPCAH BITN7 -#define PLVDH BITN6 -#define PADCH BITN5 -#define PSH BITN4 -#define PT1H BITN3 -#define PX1H BITN2 -#define PT0H BITN1 -#define PX0H BITN0 - - - sfr IP2 = 0xB5; //xxxx,xx00 中断优先级寄存器2 -#define IP2_7 BITN7 -#define PI2C BITN6 -#define PCMP BITN5 -#define PX4 BITN4 -#define PPWMFD BITN3 -#define PPWM BITN2 -#define PSPI BITN1 -#define PS2 BITN0 - -sfr IP2H = 0xB6; //xxxx,xx00 中断优先级寄存器2 -#define IP2_7 BITN7 -#define PI2CH BITN6 -#define PCMPH BITN5 -#define PX4H BITN4 -#define PPWMFDH BITN3 -#define PPWMH BITN2 -#define PSPIH BITN1 -#define PS2H BITN0 - - - - - sfr INT_CLKO = 0x8F; //0000,0000 外部中断与时钟输出控制寄存器 -#define INT_EX4 BITN6 -#define INT_EX3 BITN5 -#define INT_EX2 BITN4 + //定时器特殊功能寄存器 sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器 sbit TF1 = TCON^7; @@ -257,7 +217,6 @@ sfr T2H = 0xD6; //0000,0000 T2高字节 sfr T2L = 0xD7; //0000,0000 T2低字节 sfr WKTCL = 0xAA; //0000,0000 掉电唤醒定时器低字节 sfr WKTCH = 0xAB; //0000,0000 掉电唤醒定时器高字节 -sfr16 WKTC = 0xAA; sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器 //串行口特殊功能寄存器 @@ -421,60 +380,74 @@ sfr PWMCR = 0xfe; -#define I2CTXD (*(unsigned char volatile xdata *)0xfE86)//423@ST8.PDF - -#define I2CRXD (*(unsigned char volatile xdata *)0xfE87)//423@ST8.PDF +///////////////////////////////////////////////// -///------------------------------------- +/* P3 */ +sbit RD = 0xB7; +sbit WR = 0xB6; +sbit T1 = 0xB5; +sbit T0 = 0xB4; +sbit INT1 = 0xB3; +sbit INT0 = 0xB2; +sbit TXD = 0xB1; +sbit RXD = 0xB0; -#define gRccUs01_H (*(unsigned char volatile data *)0xd2) -#define gRccUs01_L (*(unsigned char volatile data *)0xd3) -#define gRccUs01 (*(unsigned short volatile data *)0xd2)//226@ST8.PDF T4H定时器4的高字节 D2H T4H定时器4的低字节 D3H -#define gRccUs02 (*(unsigned short volatile data *)0xEA)//351@ST8.PDF CCAP0l CCAP1L EAH EBH -#define gRccUs03 (*(unsigned short volatile data *)0xEC)//351@ST8.PDF CCAP0l CCAP1L EAH EBH -//#define gRccUs03 s_task_GC032A.n +#if 0 +/// >>>>> add by cc +//sbit P34=P3^4; //定义SDA数据线 +//sbit P35=P3^5; //定义SCL时钟线 +#define mBIT_1(X,N) X|= (1<>>>> add by cc -#include "../clib/bit.h" +//added by cc #define D_stdIO_P0_ALL() P0M1=0;P0M0=0; #define D_HighI_P0_ALL() P0M1=0;P0M0=0XFF; #define D_HighR_P0_ALL() P0M1=0XFF;P0M0=0; @@ -485,46 +458,48 @@ sfr AUXINTIF = 0xef; #define D_HighR_P1_ALL() P1M1=0XFF;P1M0=0; #define D_OpenD_P1_ALL() P1M1=0XFF;P1M0=0XFF; +//// n: BITN0---BITN7 +#define D_stdIO_P0(BITN) BITN_0(P0M1,BITN);BITN_0(P0M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P0(BITN) BITN_0(P0M1,BITN);BITN_1(P0M0,BITN); //////01 推挽输出 20mA 加限流 +#define D_HighR_P0(BITN) BITN_1(P0M1,BITN);BITN_0(P0M0,BITN); /////////10 高阻 +#define D_OpenD_P0(BITN) BITN_1(P0M1,BITN);BITN_1(P0M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P1(BITN) BITN_0(P1M1,BITN);BITN_0(P1M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P1(BITN) BITN_0(P1M1,BITN);BITN_1(P1M0,BITN); //////01 推挽输出 20mA 加限流 +#define D_HighR_P1(BITN) BITN_1(P1M1,BITN);BITN_0(P1M0,BITN); /////////10 高阻 +#define D_OpenD_P1(BITN) BITN_1(P1M1,BITN);BITN_1(P1M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P2(BITN) BITN_0(P2M1,BITN);BITN_0(P2M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P2(BITN) BITN_0(P2M1,BITN);BITN_1(P2M0,BITN); //////01 推挽输出 20mA 加限流 +#define D_HighR_P2(BITN) BITN_1(P2M1,BITN);BITN_0(P2M0,BITN); /////////10 高阻 +#define D_OpenD_P2(BITN) BITN_1(P2M1,BITN);BITN_1(P2M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P3(BITN) BITN_0(P3M1,BITN);BITN_0(P3M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P3(BITN) BITN_0(P3M1,BITN);BITN_1(P3M0,BITN); //////01 推挽输出 20mA 加限流 +#define D_HighR_P3(BITN) BITN_1(P3M1,BITN);BITN_0(P3M0,BITN); /////////10 高阻 +#define D_OpenD_P3(BITN) BITN_1(P3M1,BITN);BITN_1(P3M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P4(BITN) BITN_0(P4M1,BITN);BITN_0(P4M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P4(BITN) BITN_0(P4M1,BITN);BITN_1(P4M0,BITN); //////01 推挽输出 20mA 加限流 +#define D_HighR_P4(BITN) BITN_1(P4M1,BITN);BITN_0(P4M0,BITN); /////////10 高阻 +#define D_OpenD_P4(BITN) BITN_1(P4M1,BITN);BITN_1(P4M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P5(BITN) BITN_0(P5M1,BITN);BITN_0(P5M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P5(BITN) BITN_0(P5M1,BITN);BITN_1(P5M0,BITN); //////01 推挽输出 20mA 加限流 +#define D_HighR_P5(BITN) BITN_1(P5M1,BITN);BITN_0(P5M0,BITN); /////////10 高阻 +#define D_OpenD_P5(BITN) BITN_1(P5M1,BITN);BITN_1(P5M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P6(BITN) BITN_0(P6M1,BITN);BITN_0(P6M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P6(BITN) BITN_0(P6M1,BITN);BITN_1(P6M0,BITN); //////01 推挽输出 20mA 加限流 +#define D_HighR_P6(BITN) BITN_1(P6M1,BITN);BITN_0(P6M0,BITN); /////////10 高阻 +#define D_OpenD_P6(BITN) BITN_1(P6M1,BITN);BITN_1(P6M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P7(BITN) BITN_0(P7M1,BITN);BITN_0(P7M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P7(BITN) BITN_0(P7M1,BITN);BITN_1(P7M0,BITN); //////01 推挽输出 20mA 加限流 +#define D_HighR_P7(BITN) BITN_1(P7M1,BITN);BITN_0(P7M0,BITN); /////////10 高阻 +#define D_OpenD_P7(BITN) BITN_1(P7M1,BITN);BITN_1(P7M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 -#define D_stdIO_P0(n) BITN_0(P0M1,n);BITN_0(P0M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS -#define D_HighI_P0(n) BITN_0(P0M1,n);BITN_1(P0M0,n); //////01 推挽输出 20mA 加限流 -#define D_HighR_P0(n) BITN_1(P0M1,n);BITN_0(P0M0,n); /////////10 高阻 -#define D_OpenD_P0(n) BITN_1(P0M1,n);BITN_1(P0M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 - -#define D_stdIO_P1(n) BITN_0(P1M1,n);BITN_0(P1M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS -#define D_HighI_P1(n) BITN_0(P1M1,n);BITN_1(P1M0,n); //////01 推挽输出 20mA 加限流 -#define D_HighR_P1(n) BITN_1(P1M1,n);BITN_0(P1M0,n); /////////10 高阻 -#define D_OpenD_P1(n) BITN_1(P1M1,n);BITN_1(P1M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 - -#define D_stdIO_P2(n) BITN_0(P2M1,n);BITN_0(P2M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS -#define D_HighI_P2(n) BITN_0(P2M1,n);BITN_1(P2M0,n); //////01 推挽输出 20mA 加限流 -#define D_HighR_P2(n) BITN_1(P2M1,n);BITN_0(P2M0,n); /////////10 高阻 -#define D_OpenD_P2(n) BITN_1(P2M1,n);BITN_1(P2M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 - -#define D_stdIO_P3(n) BITN_0(P3M1,n);BITN_0(P3M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS -#define D_HighI_P3(n) BITN_0(P3M1,n);BITN_1(P3M0,n); //////01 推挽输出 20mA 加限流 -#define D_HighR_P3(n) BITN_1(P3M1,n);BITN_0(P3M0,n); /////////10 高阻 -#define D_OpenD_P3(n) BITN_1(P3M1,n);BITN_1(P3M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 - -#define D_stdIO_P4(n) BITN_0(P4M1,n);BITN_0(P4M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS -#define D_HighI_P4(n) BITN_0(P4M1,n);BITN_1(P4M0,n); //////01 推挽输出 20mA 加限流 -#define D_HighR_P4(n) BITN_1(P4M1,n);BITN_0(P4M0,n); /////////10 高阻 -#define D_OpenD_P4(n) BITN_1(P4M1,n);BITN_1(P4M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 - -#define D_stdIO_P5(n) BITN_0(P5M1,n);BITN_0(P5M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS -#define D_HighI_P5(n) BITN_0(P5M1,n);BITN_1(P5M0,n); //////01 推挽输出 20mA 加限流 -#define D_HighR_P5(n) BITN_1(P5M1,n);BITN_0(P5M0,n); /////////10 高阻 -#define D_OpenD_P5(n) BITN_1(P5M1,n);BITN_1(P5M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 - -#define D_stdIO_P6(n) BITN_0(P6M1,n);BITN_0(P6M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS -#define D_HighI_P6(n) BITN_0(P6M1,n);BITN_1(P6M0,n); //////01 推挽输出 20mA 加限流 -#define D_HighR_P6(n) BITN_1(P6M1,n);BITN_0(P6M0,n); /////////10 高阻 -#define D_OpenD_P6(n) BITN_1(P6M1,n);BITN_1(P6M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 - -#define D_stdIO_P7(n) BITN_0(P7M1,n);BITN_0(P7M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS -#define D_HighI_P7(n) BITN_0(P7M1,n);BITN_1(P7M0,n); //////01 推挽输出 20mA 加限流 -#define D_HighR_P7(n) BITN_1(P7M1,n);BITN_0(P7M0,n); /////////10 高阻 -#define D_OpenD_P7(n) BITN_1(P7M1,n);BITN_1(P7M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 +#endif /*** @@ -533,7 +508,6 @@ sfr AUXINTIF = 0xef; #define P2_conf_in(n) BITN_1(P2M1,n);BITN_0(P2M0,n); #define P2_conf_port(n) BITN_0(P2M1,n);BITN_0(P2M0,n); - #define P3_conf_in(n) BITN_1(P3M1,n);BITN_0(P3M0,n); #define P3_conf_port(n) BITN_0(P3M1,n);BITN_0(P3M0,n); @@ -544,7 +518,6 @@ sfr AUXINTIF = 0xef; -#define NOP() _nop_() #define L0_INT4_OPEN() BITN_1(INT_CLKO, INT_EX4) #define L0_INT4_CLOSE() BITN_0(INT_CLKO, INT_EX4) @@ -614,4 +587,3 @@ sfr AUXINTIF = 0xef; - diff --git a/source/cpu/c51_macro.H b/source/cpu/stc_macro.h similarity index 59% rename from source/cpu/c51_macro.H rename to source/cpu/stc_macro.h index 5bbfab9..8c2f880 100644 --- a/source/cpu/c51_macro.H +++ b/source/cpu/stc_macro.h @@ -17,10 +17,13 @@ -#ifndef __C51_MACRO_H_ -#define __C51_MACRO_H_ +#ifndef __STC_MACRO_H_ +#define __STC_MACRO_H_ #include +#include "../clib/bit.h" + +#define NOP() _nop_() #define D_P07_ON() P07 = 1 #define D_P06_ON() P06 = 1 @@ -290,8 +293,88 @@ #define D_P70_REV() P70 = ~P70 +#define D_stdIO_P0_ALL() P0M1=0;P0M0=0; +#define D_HighI_P0_ALL() P0M1=0;P0M0=0XFF; +#define D_HighR_P0_ALL() P0M1=0XFF;P0M0=0; +#define D_OpenD_P0_ALL() P0M1=0XFF;P0M0=0XFF; + +#define D_stdIO_P1_ALL() P1M1=0;P1M0=0; +#define D_HighI_P1_ALL() P1M1=0;P1M0=0XFF; +#define D_HighR_P1_ALL() P1M1=0XFF;P1M0=0; +#define D_OpenD_P1_ALL() P1M1=0XFF;P1M0=0XFF; + +#define D_stdIO_P2_ALL() P2M1=0;P2M0=0; +#define D_HighI_P2_ALL() P2M1=0;P2M0=0XFF; +#define D_HighR_P2_ALL() P2M1=0XFF;P2M0=0; +#define D_OpenD_P2_ALL() P2M1=0XFF;P2M0=0XFF; + +#define D_stdIO_P3_ALL() P3M1=0;P3M0=0; +#define D_HighI_P3_ALL() P3M1=0;P3M0=0XFF; +#define D_HighR_P3_ALL() P3M1=0XFF;P3M0=0; +#define D_OpenD_P3_ALL() P3M1=0XFF;P3M0=0XFF; + +#define D_stdIO_P4_ALL() P4M1=0;P4M0=0; +#define D_HighI_P4_ALL() P4M1=0;P4M0=0XFF; +#define D_HighR_P4_ALL() P4M1=0XFF;P4M0=0; +#define D_OpenD_P4_ALL() P4M1=0XFF;P4M0=0XFF; + +#define D_stdIO_P5_ALL() P5M1=0;P5M0=0; +#define D_HighI_P5_ALL() P5M1=0;P5M0=0XFF; +#define D_HighR_P5_ALL() P5M1=0XFF;P5M0=0; +#define D_OpenD_P5_ALL() P5M1=0XFF;P5M0=0XFF; + +#define D_stdIO_P6_ALL() P6M1=0;P6M0=0; +#define D_HighI_P6_ALL() P6M1=0;P6M0=0XFF; +#define D_HighR_P6_ALL() P6M1=0XFF;P6M0=0; +#define D_OpenD_P6_ALL() P6M1=0XFF;P6M0=0XFF; + +#define D_stdIO_P7_ALL() P7M1=0;P7M0=0; +#define D_HighI_P7_ALL() P7M1=0;P7M0=0XFF; +#define D_HighR_P7_ALL() P7M1=0XFF;P7M0=0; +#define D_OpenD_P7_ALL() P7M1=0XFF;P7M0=0XFF; + +////Notice: n: BITN0---BITN7 不是0-7 eg:D_stdIO_P0(BITN0) +#define D_stdIO_P0(n) BITN_0(P0M1,n);BITN_0(P0M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P0(n) BITN_0(P0M1,n);BITN_1(P0M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P0(n) BITN_1(P0M1,n);BITN_0(P0M0,n); /////////10 高阻 +#define D_OpenD_P0(n) BITN_1(P0M1,n);BITN_1(P0M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P1(n) BITN_0(P1M1,n);BITN_0(P1M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P1(n) BITN_0(P1M1,n);BITN_1(P1M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P1(n) BITN_1(P1M1,n);BITN_0(P1M0,n); /////////10 高阻 +#define D_OpenD_P1(n) BITN_1(P1M1,n);BITN_1(P1M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P2(n) BITN_0(P2M1,n);BITN_0(P2M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P2(n) BITN_0(P2M1,n);BITN_1(P2M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P2(n) BITN_1(P2M1,n);BITN_0(P2M0,n); /////////10 高阻 +#define D_OpenD_P2(n) BITN_1(P2M1,n);BITN_1(P2M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P3(n) BITN_0(P3M1,n);BITN_0(P3M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P3(n) BITN_0(P3M1,n);BITN_1(P3M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P3(n) BITN_1(P3M1,n);BITN_0(P3M0,n); /////////10 高阻 +#define D_OpenD_P3(n) BITN_1(P3M1,n);BITN_1(P3M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P4(n) BITN_0(P4M1,n);BITN_0(P4M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P4(n) BITN_0(P4M1,n);BITN_1(P4M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P4(n) BITN_1(P4M1,n);BITN_0(P4M0,n); /////////10 高阻 +#define D_OpenD_P4(n) BITN_1(P4M1,n);BITN_1(P4M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P5(n) BITN_0(P5M1,n);BITN_0(P5M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P5(n) BITN_0(P5M1,n);BITN_1(P5M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P5(n) BITN_1(P5M1,n);BITN_0(P5M0,n); /////////10 高阻 +#define D_OpenD_P5(n) BITN_1(P5M1,n);BITN_1(P5M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P6(n) BITN_0(P6M1,n);BITN_0(P6M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P6(n) BITN_0(P6M1,n);BITN_1(P6M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P6(n) BITN_1(P6M1,n);BITN_0(P6M0,n); /////////10 高阻 +#define D_OpenD_P6(n) BITN_1(P6M1,n);BITN_1(P6M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P7(n) BITN_0(P7M1,n);BITN_0(P7M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P7(n) BITN_0(P7M1,n);BITN_1(P7M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P7(n) BITN_1(P7M1,n);BITN_0(P7M0,n); /////////10 高阻 +#define D_OpenD_P7(n) BITN_1(P7M1,n);BITN_1(P7M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 -#endif //__C51_MACRO_H_ +#endif //__STC_MACRO_H_ diff --git a/source/cpu/stc_stc15w.h b/source/cpu/stc_stc15w.h new file mode 100644 index 0000000..9c2f57d --- /dev/null +++ b/source/cpu/stc_stc15w.h @@ -0,0 +1,466 @@ +#ifndef __STC15F2K60S2_H_ +#define __STC15F2K60S2_H_ +// stc_stc15w.h +#include + +///////////////////////////////////////////////// +//注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为 +// 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用 +//相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2 +// P2.3/P2.7/P3.7/P4.2/P4.4/P4.5 +///////////////////////////////////////////////// + +///////////////////////////////////////////////// + +//包含本头文件后,不用另外再包含"REG51.H" + +//内核特殊功能寄存器 // 复位值 描述 +sfr ACC = 0xE0; //0000,0000 累加器Accumulator +sfr B = 0xF0; //0000,0000 B寄存器 +sfr PSW = 0xD0; //0000,0000 程序状态字 +sbit CY = PSW^7; +sbit AC = PSW^6; +sbit F0 = PSW^5; +sbit RS1 = PSW^4; +sbit RS0 = PSW^3; +sbit OV = PSW^2; +sbit P = PSW^0; +sfr SP = 0x81; //0000,0111 堆栈指针 +sfr DPL = 0x82; //0000,0000 数据指针低字节 +sfr DPH = 0x83; //0000,0000 数据指针高字节 + +//I/O 口特殊功能寄存器 +sfr P0 = 0x80; //1111,1111 端口0 +sbit P00 = P0^0; +sbit P01 = P0^1; +sbit P02 = P0^2; +sbit P03 = P0^3; +sbit P04 = P0^4; +sbit P05 = P0^5; +sbit P06 = P0^6; +sbit P07 = P0^7; +sfr P1 = 0x90; //1111,1111 端口1 +sbit P10 = P1^0; +sbit P11 = P1^1; +sbit P12 = P1^2; +sbit P13 = P1^3; +sbit P14 = P1^4; +sbit P15 = P1^5; +sbit P16 = P1^6; +sbit P17 = P1^7; +sfr P2 = 0xA0; //1111,1111 端口2 +sbit P20 = P2^0; +sbit P21 = P2^1; +sbit P22 = P2^2; +sbit P23 = P2^3; +sbit P24 = P2^4; +sbit P25 = P2^5; +sbit P26 = P2^6; +sbit P27 = P2^7; +sfr P3 = 0xB0; //1111,1111 端口3 +sbit P30 = P3^0; +sbit P31 = P3^1; +sbit P32 = P3^2; +sbit P33 = P3^3; +sbit P34 = P3^4; +sbit P35 = P3^5; +sbit P36 = P3^6; +sbit P37 = P3^7; +sfr P4 = 0xC0; //1111,1111 端口4 +sbit P40 = P4^0; +sbit P41 = P4^1; +sbit P42 = P4^2; +sbit P43 = P4^3; +sbit P44 = P4^4; +sbit P45 = P4^5; +sbit P46 = P4^6; +sbit P47 = P4^7; +sfr P5 = 0xC8; //xxxx,1111 端口5 +sbit P50 = P5^0; +sbit P51 = P5^1; +sbit P52 = P5^2; +sbit P53 = P5^3; +sbit P54 = P5^4; +sbit P55 = P5^5; +sbit P56 = P5^6; +sbit P57 = P5^7; +sfr P6 = 0xE8; //0000,0000 端口6 +sbit P60 = P6^0; +sbit P61 = P6^1; +sbit P62 = P6^2; +sbit P63 = P6^3; +sbit P64 = P6^4; +sbit P65 = P6^5; +sbit P66 = P6^6; +sbit P67 = P6^7; +sfr P7 = 0xF8; //0000,0000 端口7 +sbit P70 = P7^0; +sbit P71 = P7^1; +sbit P72 = P7^2; +sbit P73 = P7^3; +sbit P74 = P7^4; +sbit P75 = P7^5; +sbit P76 = P7^6; +sbit P77 = P7^7; +sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0 +sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器1 +sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0 +sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1 +sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0 +sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1 +sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0 +sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1 +sfr P4M0 = 0xB4; //0000,0000 端口4模式寄存器0 +sfr P4M1 = 0xB3; //0000,0000 端口4模式寄存器1 +sfr P5M0 = 0xCA; //0000,0000 端口5模式寄存器0 +sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1 +sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0 +sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1 +sfr P7M0 = 0xE2; //0000,0000 端口7模式寄存器0 +sfr P7M1 = 0xE1; //0000,0000 端口7模式寄存器1 + +//系统管理特殊功能寄存器 +sfr PCON = 0x87; //0001,0000 电源控制寄存器 +sfr AUXR = 0x8E; //0000,0000 辅助寄存器 + +#define TOx12 BITN7 +#define T1x12 BITN6 +#define UART_M0x6 BITN5 //串口1模式0速度 =0 12倍 = 1 两倍 +#define T2R BITN4 //定时器2 运行 =1 +#define T2_C BITN3 //定时器/计数器选择 +#define T2x12 BITN2 +#define EXTRAM BITN1 +#define S1ST2 BITN0 //串口1选择定时器1 =0 选择定时器2 =1 + + + + +sfr AUXR1 = 0xA2; //0000,0000 辅助寄存器1 +sfr P_SW1 = 0xA2; //0000,0000 外设端口切换寄存器1 +sfr CLK_DIV = 0x97; //0000,0000 时钟分频控制寄存器 +sfr BUS_SPEED = 0xA1; //xx10,x011 总线速度控制寄存器 +sfr P1ASF = 0x9D; //0000,0000 端口1模拟功能配置寄存器 +sfr P_SW2 = 0xBA; //0xxx,x000 外设端口切换寄存器 + +//中断特殊功能寄存器 +sfr IE = 0xA8; //0000,0000 中断控制寄存器 +sbit EA = IE^7; +sbit ELVD = IE^6; +sbit EADC = IE^5; +sbit ES = IE^4; +sbit ET1 = IE^3; +sbit EX1 = IE^2; +sbit ET0 = IE^1; +sbit EX0 = IE^0; +sfr IP = 0xB8; //0000,0000 中断优先级寄存器 +sbit PPCA = IP^7; +sbit PLVD = IP^6; +sbit PADC = IP^5; +sbit PS = IP^4; +sbit PT1 = IP^3; +sbit PX1 = IP^2; +sbit PT0 = IP^1; +sbit PX0 = IP^0; +sfr IE2 = 0xAF; //0000,0000 中断控制寄存器2 +/// 不可位寻址 +#define ET4 BITN6 +#define ET3 BITN5 +#define ES4 BITN4 +#define ES3 BITN3 +#define ET2 BITN2 +#define ESPI BITN1 +#define ES2 BITN0 + +sfr IP2 = 0xB5; //xxxx,xx00 中断优先级寄存器2 +sfr INT_CLKO = 0x8F; //0000,0000 外部中断与时钟输出控制寄存器 + +//定时器特殊功能寄存器 +sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器 +sbit TF1 = TCON^7; +sbit TR1 = TCON^6; +sbit TF0 = TCON^5; +sbit TR0 = TCON^4; +sbit IE1 = TCON^3; +sbit IT1 = TCON^2; +sbit IE0 = TCON^1; +sbit IT0 = TCON^0; +sfr TMOD = 0x89; //0000,0000 T0/T1模式寄存器 +sfr TL0 = 0x8A; //0000,0000 T0低字节 +sfr TL1 = 0x8B; //0000,0000 T1低字节 +sfr TH0 = 0x8C; //0000,0000 T0高字节 +sfr TH1 = 0x8D; //0000,0000 T1高字节 +sfr T4T3M = 0xD1; //0000,0000 T3/T4模式寄存器 +sfr T3T4M = 0xD1; //0000,0000 T3/T4模式寄存器 +sfr T4H = 0xD2; //0000,0000 T4高字节 +sfr T4L = 0xD3; //0000,0000 T4低字节 +sfr T3H = 0xD4; //0000,0000 T3高字节 +sfr T3L = 0xD5; //0000,0000 T3低字节 +sfr T2H = 0xD6; //0000,0000 T2高字节 +sfr T2L = 0xD7; //0000,0000 T2低字节 +sfr WKTCL = 0xAA; //0000,0000 掉电唤醒定时器低字节 +sfr WKTCH = 0xAB; //0000,0000 掉电唤醒定时器高字节 +sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器 + +//串行口特殊功能寄存器 +sfr SCON = 0x98; //0000,0000 串口1控制寄存器 +sbit SM0 = SCON^7; +sbit SM1 = SCON^6; +sbit SM2 = SCON^5; +sbit REN = SCON^4; +sbit TB8 = SCON^3; +sbit RB8 = SCON^2; +sbit TI = SCON^1; +sbit RI = SCON^0; +//sfr SBUF = 0x99; //xxxx,xxxx 串口1数据寄存器 +//sfr S2CON = 0x9A; //0000,0000 串口2控制寄存器 +//sfr S2BUF = 0x9B; //xxxx,xxxx 串口2数据寄存器 +//sfr SADDR = 0xA9; //0000,0000 从机地址寄存器 +//sfr SADEN = 0xB9; //0000,0000 从机地址屏蔽寄存器 + +sfr SBUF = 0x99; //Serial Data Buffer +sfr SBUF0 = 0x99; //Serial Data Buffer xxxx,xxxx +sfr SADEN = 0xB9; //Slave Address Mask 0000,0000 +sfr SADDR = 0xA9; //Slave Address 0000,0000 +//----------------------------------- +// 7 6 5 4 3 2 1 0 Reset Value +sfr S2CON = 0x9A; //S2 Control S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI 00000000B +#define S2SM0 BITN7 +#define S2ST4 BITN6 +#define S2SM2 BITN5 +#define S2REN BITN4 +#define S2TB8 BITN3 +#define S2RB8 BITN2 +#define S2TI BITN1 +#define S2RI BITN0 + +sfr S2BUF = 0x9B; //S2 Serial Buffer xxxx,xxxx +//sfr BRT = 0x9C; //S2 Baud-Rate Timer 0000,0000 + +//--------------------------------------------------------------- +sfr S3CON = 0xAC; //0000,0000 串口3控制寄存器 +#define S3SM0 BITN7 +#define S3ST4 BITN6 +#define S3SM2 BITN5 +#define S3REN BITN4 +#define S3TB8 BITN3 +#define S3RB8 BITN2 +#define S3TI BITN1 +#define S3RI BITN0 + +sfr S3BUF = 0xAD; //xxxx,xxxx 串口3数据寄存器 +//--------------------------------------------------------------- +sfr S4CON = 0x84; //0000,0000 串口4控制寄存器 +#define S4SM0 BITN7 +#define S4ST4 BITN6 +#define S4SM2 BITN5 +#define S4REN BITN4 +#define S4TB8 BITN3 +#define S4RB8 BITN2 +#define S4TI BITN1 +#define S4RI BITN0 + +sfr S4BUF = 0x85; //xxxx,xxxx 串口4数据寄存器 + +//ADC 特殊功能寄存器 +sfr ADC_CONTR = 0xBC; //0000,0000 A/D转换控制寄存器 +sfr ADC_RES = 0xBD; //0000,0000 A/D转换结果高8位 +sfr ADC_RESL = 0xBE; //0000,0000 A/D转换结果低2位 + +//SPI 特殊功能寄存器 +sfr SPSTAT = 0xCD; //00xx,xxxx SPI状态寄存器 +sfr SPCTL = 0xCE; //0000,0100 SPI控制寄存器 +sfr SPDAT = 0xCF; //0000,0000 SPI数据寄存器 + +//IAP/ISP 特殊功能寄存器 +sfr IAP_DATA = 0xC2; //0000,0000 EEPROM数据寄存器 +sfr IAP_ADDRH = 0xC3; //0000,0000 EEPROM地址高字节 +sfr IAP_ADDRL = 0xC4; //0000,0000 EEPROM地址第字节 +sfr IAP_CMD = 0xC5; //xxxx,xx00 EEPROM命令寄存器 +sfr IAP_TRIG = 0xC6; //0000,0000 EEPRPM命令触发寄存器 +sfr IAP_CONTR = 0xC7; //0000,x000 EEPROM控制寄存器 + +//PCA/PWM 特殊功能寄存器 +sfr CCON = 0xD8; //00xx,xx00 PCA控制寄存器 +sbit CF = CCON^7; +sbit CR = CCON^6; +sbit CCF2 = CCON^2; +sbit CCF1 = CCON^1; +sbit CCF0 = CCON^0; +sfr CMOD = 0xD9; //0xxx,x000 PCA 工作模式寄存器 +sfr CL = 0xE9; //0000,0000 PCA计数器低字节 +sfr CH = 0xF9; //0000,0000 PCA计数器高字节 +sfr CCAPM0 = 0xDA; //0000,0000 PCA模块0的PWM寄存器 +sfr CCAPM1 = 0xDB; //0000,0000 PCA模块1的PWM寄存器 +sfr CCAPM2 = 0xDC; //0000,0000 PCA模块2的PWM 寄存器 +sfr CCAP0L = 0xEA; //0000,0000 PCA模块0的捕捉/比较寄存器低字节 +sfr CCAP1L = 0xEB; //0000,0000 PCA模块1的捕捉/比较寄存器低字节 +sfr CCAP2L = 0xEC; //0000,0000 PCA模块2的捕捉/比较寄存器低字节 +sfr PCA_PWM0 = 0xF2; //xxxx,xx00 PCA模块0的PWM寄存器 +sfr PCA_PWM1 = 0xF3; //xxxx,xx00 PCA模块1的PWM寄存器 +sfr PCA_PWM2 = 0xF4; //xxxx,xx00 PCA模块1的PWM寄存器 +sfr CCAP0H = 0xFA; //0000,0000 PCA模块0的捕捉/比较寄存器高字节 +sfr CCAP1H = 0xFB; //0000,0000 PCA模块1的捕捉/比较寄存器高字节 +sfr CCAP2H = 0xFC; //0000,0000 PCA模块2的捕捉/比较寄存器高字节 + +//比较器特殊功能寄存器 +sfr CMPCR1 = 0xE6; //0000,0000 比较器控制寄存器1 +sfr CMPCR2 = 0xE7; //0000,0000 比较器控制寄存器2 + +//增强型PWM波形发生器特殊功能寄存器 +sfr PWMCFG = 0xf1; //x000,0000 PWM配置寄存器 +sfr PWMCR = 0xf5; //0000,0000 PWM控制寄存器 +sfr PWMIF = 0xf6; //x000,0000 PWM中断标志寄存器 +sfr PWMFDCR = 0xf7; //xx00,0000 PWM外部异常检测控制寄存器 + +//如下特殊功能寄存器位于扩展RAM区域 +//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写 +#define PWMC (*(unsigned int volatile xdata *)0xfff0) +#define PWMCH (*(unsigned char volatile xdata *)0xfff0) +#define PWMCL (*(unsigned char volatile xdata *)0xfff1) +#define PWMCKS (*(unsigned char volatile xdata *)0xfff2) +#define PWM2T1 (*(unsigned int volatile xdata *)0xff00) +#define PWM2T1H (*(unsigned char volatile xdata *)0xff00) +#define PWM2T1L (*(unsigned char volatile xdata *)0xff01) +#define PWM2T2 (*(unsigned int volatile xdata *)0xff02) +#define PWM2T2H (*(unsigned char volatile xdata *)0xff02) +#define PWM2T2L (*(unsigned char volatile xdata *)0xff03) +#define PWM2CR (*(unsigned char volatile xdata *)0xff04) +#define PWM3T1 (*(unsigned int volatile xdata *)0xff10) +#define PWM3T1H (*(unsigned char volatile xdata *)0xff10) +#define PWM3T1L (*(unsigned char volatile xdata *)0xff11) +#define PWM3T2 (*(unsigned int volatile xdata *)0xff12) +#define PWM3T2H (*(unsigned char volatile xdata *)0xff12) +#define PWM3T2L (*(unsigned char volatile xdata *)0xff13) +#define PWM3CR (*(unsigned char volatile xdata *)0xff14) +#define PWM4T1 (*(unsigned int volatile xdata *)0xff20) +#define PWM4T1H (*(unsigned char volatile xdata *)0xff20) +#define PWM4T1L (*(unsigned char volatile xdata *)0xff21) +#define PWM4T2 (*(unsigned int volatile xdata *)0xff22) +#define PWM4T2H (*(unsigned char volatile xdata *)0xff22) +#define PWM4T2L (*(unsigned char volatile xdata *)0xff23) +#define PWM4CR (*(unsigned char volatile xdata *)0xff24) +#define PWM5T1 (*(unsigned int volatile xdata *)0xff30) +#define PWM5T1H (*(unsigned char volatile xdata *)0xff30) +#define PWM5T1L (*(unsigned char volatile xdata *)0xff31) +#define PWM5T2 (*(unsigned int volatile xdata *)0xff32) +#define PWM5T2H (*(unsigned char volatile xdata *)0xff32) +#define PWM5T2L (*(unsigned char volatile xdata *)0xff33) +#define PWM5CR (*(unsigned char volatile xdata *)0xff34) +#define PWM6T1 (*(unsigned int volatile xdata *)0xff40) +#define PWM6T1H (*(unsigned char volatile xdata *)0xff40) +#define PWM6T1L (*(unsigned char volatile xdata *)0xff41) +#define PWM6T2 (*(unsigned int volatile xdata *)0xff42) +#define PWM6T2H (*(unsigned char volatile xdata *)0xff42) +#define PWM6T2L (*(unsigned char volatile xdata *)0xff43) +#define PWM6CR (*(unsigned char volatile xdata *)0xff44) +#define PWM7T1 (*(unsigned int volatile xdata *)0xff50) +#define PWM7T1H (*(unsigned char volatile xdata *)0xff50) +#define PWM7T1L (*(unsigned char volatile xdata *)0xff51) +#define PWM7T2 (*(unsigned int volatile xdata *)0xff52) +#define PWM7T2H (*(unsigned char volatile xdata *)0xff52) +#define PWM7T2L (*(unsigned char volatile xdata *)0xff53) +#define PWM7CR (*(unsigned char volatile xdata *)0xff54) + +///////////////////////////////////////////////// + + + +/* P3 */ +sbit RD = 0xB7; +sbit WR = 0xB6; +sbit T1 = 0xB5; +sbit T0 = 0xB4; +sbit INT1 = 0xB3; +sbit INT0 = 0xB2; +sbit TXD = 0xB1; +sbit RXD = 0xB0; + + + + + +/// >>>>> add by cc + + +//sbit P34=P3^4; //定义SDA数据线 +//sbit P35=P3^5; //定义SCL时钟线 +#define mBIT_1(X,N) X|= (1< +///////////////////////////////////////////////// +//注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为 +// 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用 +//相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2 +// P2.3/P2.7/P3.7/P4.2/P4.4/P4.5 +///////////////////////////////////////////////// + +///////////////////////////////////////////////// + +//包含本头文件后,不用另外再包含"REG51.H" + + +///////////////////////////////////////////////// + +//包含本头文件后,不用另外再包含"REG51.H" + +sfr P0 = 0x80; +sbit P00 = P0^0; +sbit P01 = P0^1; +sbit P02 = P0^2; +sbit P03 = P0^3; +sbit P04 = P0^4; +sbit P05 = P0^5; +sbit P06 = P0^6; +sbit P07 = P0^7; +sfr SP = 0x81; +sfr DPL = 0x82; +sfr DPH = 0x83; +sfr S4CON = 0x84; +sfr S4BUF = 0x85; +sfr PCON = 0x87; +sfr TCON = 0x88; +sbit TF1 = TCON^7; +sbit TR1 = TCON^6; +sbit TF0 = TCON^5; +sbit TR0 = TCON^4; +sbit IE1 = TCON^3; +sbit IT1 = TCON^2; +sbit IE0 = TCON^1; +sbit IT0 = TCON^0; +sfr TMOD = 0x89; +sfr TL0 = 0x8A; +sfr TL1 = 0x8B; +sfr TH0 = 0x8C; +sfr TH1 = 0x8D; +sfr AUXR = 0x8E; +sfr INTCLKO = 0x8F; +sfr P1 = 0x90; +sbit P10 = P1^0; +sbit P11 = P1^1; +sbit P12 = P1^2; +sbit P13 = P1^3; +sbit P14 = P1^4; +sbit P15 = P1^5; +sbit P16 = P1^6; +sbit P17 = P1^7; +sfr P1M1 = 0x91; +sfr P1M0 = 0x92; +sfr P0M1 = 0x93; +sfr P0M0 = 0x94; +sfr P2M1 = 0x95; +sfr P2M0 = 0x96; +sfr SCON = 0x98; +sbit SM0 = SCON^7; +sbit SM1 = SCON^6; +sbit SM2 = SCON^5; +sbit REN = SCON^4; +sbit TB8 = SCON^3; +sbit RB8 = SCON^2; +sbit TI = SCON^1; +sbit RI = SCON^0; +sfr SBUF = 0x99; +sfr S2CON = 0x9A; +sfr S2BUF = 0x9B; +sfr IRCBAND = 0x9D; +sfr LIRTRIM = 0x9E; +sfr IRTRIM = 0x9F; +sfr P2 = 0xA0; +sbit P20 = P2^0; +sbit P21 = P2^1; +sbit P22 = P2^2; +sbit P23 = P2^3; +sbit P24 = P2^4; +sbit P25 = P2^5; +sbit P26 = P2^6; +sbit P27 = P2^7; +sfr P_SW1 = 0xA2; +sfr IE = 0xA8; +sbit EA = IE^7; +sbit ELVD = IE^6; +sbit EADC = IE^5; +sbit ES = IE^4; +sbit ET1 = IE^3; +sbit EX1 = IE^2; +sbit ET0 = IE^1; +sbit EX0 = IE^0; +sfr SADDR = 0xA9; +sfr WKTCL = 0xAA; +sfr WKTCH = 0xAB; +sfr S3CON = 0xAC; +sfr S3BUF = 0xAD; +sfr TA = 0xAE; +sfr IE2 = 0xAF; +sfr P3 = 0xB0; +sbit P30 = P3^0; +sbit P31 = P3^1; +sbit P32 = P3^2; +sbit P33 = P3^3; +sbit P34 = P3^4; +sbit P35 = P3^5; +sbit P36 = P3^6; +sbit P37 = P3^7; +sfr P3M1 = 0xB1; +sfr P3M0 = 0xB2; +sfr P4M1 = 0xB3; +sfr P4M0 = 0xB4; +sfr IP2 = 0xB5; +sfr IP2H = 0xB6; +sfr IPH = 0xB7; +sfr IP = 0xB8; +sbit PPCA = IP^7; +sbit PLVD = IP^6; +sbit PADC = IP^5; +sbit PS = IP^4; +sbit PT1 = IP^3; +sbit PX1 = IP^2; +sbit PT0 = IP^1; +sbit PX0 = IP^0; +sfr SADEN = 0xB9; +sfr P_SW2 = 0xBA; +sfr ADC_CONTR = 0xBC; +sfr ADC_RES = 0xBD; +sfr ADC_RESL = 0xBE; +sfr P4 = 0xC0; +sbit P40 = P4^0; +sbit P41 = P4^1; +sbit P42 = P4^2; +sbit P43 = P4^3; +sbit P44 = P4^4; +sbit P45 = P4^5; +sbit P46 = P4^6; +sbit P47 = P4^7; +sfr WDT_CONTR = 0xC1; +sfr IAP_DATA = 0xC2; +sfr IAP_ADDRH = 0xC3; +sfr IAP_ADDRL = 0xC4; +sfr IAP_CMD = 0xC5; +sfr IAP_TRIG = 0xC6; +sfr IAP_CONTR = 0xC7; +sfr P5 = 0xC8; +sbit P50 = P5^0; +sbit P51 = P5^1; +sbit P52 = P5^2; +sbit P53 = P5^3; +sbit P54 = P5^4; +sbit P55 = P5^5; +sbit P56 = P5^6; +sbit P57 = P5^7; +sfr P5M1 = 0xC9; +sfr P5M0 = 0xCA; +sfr SPSTAT = 0xCD; +sfr SPCTL = 0xCE; +sfr SPDAT = 0xCF; +sfr PSW = 0xD0; +sbit CY = PSW^7; +sbit AC = PSW^6; +sbit F0 = PSW^5; +sbit RS1 = PSW^4; +sbit RS0 = PSW^3; +sbit OV = PSW^2; +sbit P = PSW^0; +sfr T4T3M = 0xD1; +sfr T4H = 0xD2; +sfr T4L = 0xD3; +sfr T3H = 0xD4; +sfr T3L = 0xD5; +sfr T2H = 0xD6; +sfr T2L = 0xD7; +sfr CCON = 0xD8; +sbit CF = CCON^7; +sbit CR = CCON^6; +sbit CCF2 = CCON^2; +sbit CCF1 = CCON^1; +sbit CCF0 = CCON^0; +sfr CMOD = 0xD9; +sfr CCAPM0 = 0xDA; +sfr CCAPM1 = 0xDB; +sfr CCAPM2 = 0xDC; +sfr ADCCFG = 0xDE; +sfr IP3 = 0xDF; +sfr ACC = 0xE0; +sfr DPS = 0xE3; +sfr DPL1 = 0xE4; +sfr DPH1 = 0xE5; +sfr CMPCR1 = 0xE6; +sfr CMPCR2 = 0xE7; +sfr CL = 0xE9; +sfr CCAP0L = 0xEA; +sfr CCAP1L = 0xEB; +sfr CCAP2L = 0xEC; +sfr IP3H = 0xEE; +sfr AUXINTIF = 0xEF; +sfr B = 0xF0; +sfr PWMSET = 0xF1; +sfr PCA_PWM0 = 0xF2; +sfr PCA_PWM1 = 0xF3; +sfr PCA_PWM2 = 0xF4; +sfr IAP_TPS = 0xF5; +sfr PWMCFG01 = 0xF6; +sfr PWMCFG23 = 0xF7; +sfr CH = 0xF9; +sfr CCAP0H = 0xFA; +sfr CCAP1H = 0xFB; +sfr CCAP2H = 0xFC; +sfr PWMCFG45 = 0xFE; +sfr RSTCFG = 0xFF; + +//如下特殊功能寄存器位于扩展RAM区域 +//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写 + +#define CKSEL (*(unsigned char volatile xdata *)0xFE00) +#define CLKDIV (*(unsigned char volatile xdata *)0xFE01) +#define HIRCCR (*(unsigned char volatile xdata *)0xFE02) +#define XOSCCR (*(unsigned char volatile xdata *)0xFE03) +#define IRC32KCR (*(unsigned char volatile xdata *)0xFE04) +#define MCLKOCR (*(unsigned char volatile xdata *)0xFE05) +#define IRCDB (*(unsigned char volatile xdata *)0xFE06) + +#define P0PU (*(unsigned char volatile xdata *)0xFE10) +#define P1PU (*(unsigned char volatile xdata *)0xFE11) +#define P2PU (*(unsigned char volatile xdata *)0xFE12) +#define P3PU (*(unsigned char volatile xdata *)0xFE13) +#define P4PU (*(unsigned char volatile xdata *)0xFE14) +#define P5PU (*(unsigned char volatile xdata *)0xFE15) +#define P0NCS (*(unsigned char volatile xdata *)0xFE18) +#define P1NCS (*(unsigned char volatile xdata *)0xFE19) +#define P2NCS (*(unsigned char volatile xdata *)0xFE1A) +#define P3NCS (*(unsigned char volatile xdata *)0xFE1B) +#define P4NCS (*(unsigned char volatile xdata *)0xFE1C) +#define P5NCS (*(unsigned char volatile xdata *)0xFE1D) +#define P0SR (*(unsigned char volatile xdata *)0xFE20) +#define P1SR (*(unsigned char volatile xdata *)0xFE21) +#define P2SR (*(unsigned char volatile xdata *)0xFE22) +#define P3SR (*(unsigned char volatile xdata *)0xFE23) +#define P4SR (*(unsigned char volatile xdata *)0xFE24) +#define P5SR (*(unsigned char volatile xdata *)0xFE25) +#define P0DR (*(unsigned char volatile xdata *)0xFE28) +#define P1DR (*(unsigned char volatile xdata *)0xFE29) +#define P2DR (*(unsigned char volatile xdata *)0xFE2A) +#define P3DR (*(unsigned char volatile xdata *)0xFE2B) +#define P4DR (*(unsigned char volatile xdata *)0xFE2C) +#define P5DR (*(unsigned char volatile xdata *)0xFE2D) +#define P0IE (*(unsigned char volatile xdata *)0xFE30) +#define P1IE (*(unsigned char volatile xdata *)0xFE31) +#define P3IE (*(unsigned char volatile xdata *)0xFE33) + +#define I2CCFG (*(unsigned char volatile xdata *)0xFE80) +#define I2CMSCR (*(unsigned char volatile xdata *)0xFE81) +#define I2CMSST (*(unsigned char volatile xdata *)0xFE82) +#define I2CSLCR (*(unsigned char volatile xdata *)0xFE83) +#define I2CSLST (*(unsigned char volatile xdata *)0xFE84) +#define I2CSLADR (*(unsigned char volatile xdata *)0xFE85) +#define I2CTXD (*(unsigned char volatile xdata *)0xFE86) +#define I2CRXD (*(unsigned char volatile xdata *)0xFE87) +#define I2CMSAUX (*(unsigned char volatile xdata *)0xFE88) + +#define TM2PS (*(unsigned char volatile xdata *)0xFEA2) +#define TM3PS (*(unsigned char volatile xdata *)0xFEA3) +#define TM4PS (*(unsigned char volatile xdata *)0xFEA4) +#define ADCTIM (*(unsigned char volatile xdata *)0xFEA8) + +#define PWM0CH (*(unsigned char volatile xdata *)0xFF00) +#define PWM0CL (*(unsigned char volatile xdata *)0xFF01) +#define PWM0CKS (*(unsigned char volatile xdata *)0xFF02) +#define PWM0TADCH (*(unsigned char volatile xdata *)0xFF03) +#define PWM0TADCL (*(unsigned char volatile xdata *)0xFF04) +#define PWM0IF (*(unsigned char volatile xdata *)0xFF05) +#define PWM0FDCR (*(unsigned char volatile xdata *)0xFF06) +#define PWM00T1H (*(unsigned char volatile xdata *)0xFF10) +#define PWM00T1L (*(unsigned char volatile xdata *)0xFF11) +#define PWM00T2H (*(unsigned char volatile xdata *)0xFF12) +#define PWM00T2L (*(unsigned char volatile xdata *)0xFF13) +#define PWM00CR (*(unsigned char volatile xdata *)0xFF14) +#define PWM00HLD (*(unsigned char volatile xdata *)0xFF15) +#define PWM01T1H (*(unsigned char volatile xdata *)0xFF18) +#define PWM01T1L (*(unsigned char volatile xdata *)0xFF19) +#define PWM01T2H (*(unsigned char volatile xdata *)0xFF1A) +#define PWM01T2L (*(unsigned char volatile xdata *)0xFF1B) +#define PWM01CR (*(unsigned char volatile xdata *)0xFF1C) +#define PWM01HLD (*(unsigned char volatile xdata *)0xFF1D) +#define PWM02T1H (*(unsigned char volatile xdata *)0xFF20) +#define PWM02T1L (*(unsigned char volatile xdata *)0xFF21) +#define PWM02T2H (*(unsigned char volatile xdata *)0xFF22) +#define PWM02T2L (*(unsigned char volatile xdata *)0xFF23) +#define PWM02CR (*(unsigned char volatile xdata *)0xFF24) +#define PWM02HLD (*(unsigned char volatile xdata *)0xFF25) +#define PWM03T1H (*(unsigned char volatile xdata *)0xFF28) +#define PWM03T1L (*(unsigned char volatile xdata *)0xFF29) +#define PWM03T2H (*(unsigned char volatile xdata *)0xFF2A) +#define PWM03T2L (*(unsigned char volatile xdata *)0xFF2B) +#define PWM03CR (*(unsigned char volatile xdata *)0xFF2C) +#define PWM03HLD (*(unsigned char volatile xdata *)0xFF2D) +#define PWM04T1H (*(unsigned char volatile xdata *)0xFF30) +#define PWM04T1L (*(unsigned char volatile xdata *)0xFF31) +#define PWM04T2H (*(unsigned char volatile xdata *)0xFF32) +#define PWM04T2L (*(unsigned char volatile xdata *)0xFF33) +#define PWM04CR (*(unsigned char volatile xdata *)0xFF34) +#define PWM04HLD (*(unsigned char volatile xdata *)0xFF35) +#define PWM05T1H (*(unsigned char volatile xdata *)0xFF38) +#define PWM05T1L (*(unsigned char volatile xdata *)0xFF39) +#define PWM05T2H (*(unsigned char volatile xdata *)0xFF3A) +#define PWM05T2L (*(unsigned char volatile xdata *)0xFF3B) +#define PWM05CR (*(unsigned char volatile xdata *)0xFF3C) +#define PWM05HLD (*(unsigned char volatile xdata *)0xFF3D) +#define PWM06T1H (*(unsigned char volatile xdata *)0xFF40) +#define PWM06T1L (*(unsigned char volatile xdata *)0xFF41) +#define PWM06T2H (*(unsigned char volatile xdata *)0xFF42) +#define PWM06T2L (*(unsigned char volatile xdata *)0xFF43) +#define PWM06CR (*(unsigned char volatile xdata *)0xFF44) +#define PWM06HLD (*(unsigned char volatile xdata *)0xFF45) +#define PWM07T1H (*(unsigned char volatile xdata *)0xFF48) +#define PWM07T1L (*(unsigned char volatile xdata *)0xFF49) +#define PWM07T2H (*(unsigned char volatile xdata *)0xFF4A) +#define PWM07T2L (*(unsigned char volatile xdata *)0xFF4B) +#define PWM07CR (*(unsigned char volatile xdata *)0xFF4C) +#define PWM07HLD (*(unsigned char volatile xdata *)0xFF4D) +#define PWM1CH (*(unsigned char volatile xdata *)0xFF50) +#define PWM1CL (*(unsigned char volatile xdata *)0xFF51) +#define PWM1CKS (*(unsigned char volatile xdata *)0xFF52) +#define PWM1IF (*(unsigned char volatile xdata *)0xFF55) +#define PWM1FDCR (*(unsigned char volatile xdata *)0xFF56) +#define PWM10T1H (*(unsigned char volatile xdata *)0xFF60) +#define PWM10T1L (*(unsigned char volatile xdata *)0xFF61) +#define PWM10T2H (*(unsigned char volatile xdata *)0xFF62) +#define PWM10T2L (*(unsigned char volatile xdata *)0xFF63) +#define PWM10CR (*(unsigned char volatile xdata *)0xFF64) +#define PWM10HLD (*(unsigned char volatile xdata *)0xFF65) +#define PWM11T1H (*(unsigned char volatile xdata *)0xFF68) +#define PWM11T1L (*(unsigned char volatile xdata *)0xFF69) +#define PWM11T2H (*(unsigned char volatile xdata *)0xFF6A) +#define PWM11T2L (*(unsigned char volatile xdata *)0xFF6B) +#define PWM11CR (*(unsigned char volatile xdata *)0xFF6C) +#define PWM11HLD (*(unsigned char volatile xdata *)0xFF6D) +#define PWM12T1H (*(unsigned char volatile xdata *)0xFF70) +#define PWM12T1L (*(unsigned char volatile xdata *)0xFF71) +#define PWM12T2H (*(unsigned char volatile xdata *)0xFF72) +#define PWM12T2L (*(unsigned char volatile xdata *)0xFF73) +#define PWM12CR (*(unsigned char volatile xdata *)0xFF74) +#define PWM12HLD (*(unsigned char volatile xdata *)0xFF75) +#define PWM13T1H (*(unsigned char volatile xdata *)0xFF78) +#define PWM13T1L (*(unsigned char volatile xdata *)0xFF79) +#define PWM13T2H (*(unsigned char volatile xdata *)0xFF7A) +#define PWM13T2L (*(unsigned char volatile xdata *)0xFF7B) +#define PWM13CR (*(unsigned char volatile xdata *)0xFF7C) +#define PWM13HLD (*(unsigned char volatile xdata *)0xFF7D) +#define PWM14T1H (*(unsigned char volatile xdata *)0xFF80) +#define PWM14T1L (*(unsigned char volatile xdata *)0xFF81) +#define PWM14T2H (*(unsigned char volatile xdata *)0xFF82) +#define PWM14T2L (*(unsigned char volatile xdata *)0xFF83) +#define PWM14CR (*(unsigned char volatile xdata *)0xFF84) +#define PWM14HLD (*(unsigned char volatile xdata *)0xFF85) +#define PWM15T1H (*(unsigned char volatile xdata *)0xFF88) +#define PWM15T1L (*(unsigned char volatile xdata *)0xFF89) +#define PWM15T2H (*(unsigned char volatile xdata *)0xFF8A) +#define PWM15T2L (*(unsigned char volatile xdata *)0xFF8B) +#define PWM15CR (*(unsigned char volatile xdata *)0xFF8C) +#define PWM15HLD (*(unsigned char volatile xdata *)0xFF8D) +#define PWM16T1H (*(unsigned char volatile xdata *)0xFF90) +#define PWM16T1L (*(unsigned char volatile xdata *)0xFF91) +#define PWM16T2H (*(unsigned char volatile xdata *)0xFF92) +#define PWM16T2L (*(unsigned char volatile xdata *)0xFF93) +#define PWM16CR (*(unsigned char volatile xdata *)0xFF94) +#define PWM16HLD (*(unsigned char volatile xdata *)0xFF95) +#define PWM17T1H (*(unsigned char volatile xdata *)0xFF98) +#define PWM17T1L (*(unsigned char volatile xdata *)0xFF99) +#define PWM17T2H (*(unsigned char volatile xdata *)0xFF9A) +#define PWM17T2L (*(unsigned char volatile xdata *)0xFF9B) +#define PWM17CR (*(unsigned char volatile xdata *)0xFF9C) +#define PWM17HLD (*(unsigned char volatile xdata *)0xFF9D) +#define PWM2CH (*(unsigned char volatile xdata *)0xFFA0) +#define PWM2CL (*(unsigned char volatile xdata *)0xFFA1) +#define PWM2CKS (*(unsigned char volatile xdata *)0xFFA2) +#define PWM2TADCH (*(unsigned char volatile xdata *)0xFFA3) +#define PWM2TADCL (*(unsigned char volatile xdata *)0xFFA4) +#define PWM2IF (*(unsigned char volatile xdata *)0xFFA5) +#define PWM2FDCR (*(unsigned char volatile xdata *)0xFFA6) +#define PWM20T1H (*(unsigned char volatile xdata *)0xFFB0) +#define PWM20T1L (*(unsigned char volatile xdata *)0xFFB1) +#define PWM20T2H (*(unsigned char volatile xdata *)0xFFB2) +#define PWM20T2L (*(unsigned char volatile xdata *)0xFFB3) +#define PWM20CR (*(unsigned char volatile xdata *)0xFFB4) +#define PWM20HLD (*(unsigned char volatile xdata *)0xFFB5) +#define PWM21T1H (*(unsigned char volatile xdata *)0xFFB8) +#define PWM21T1L (*(unsigned char volatile xdata *)0xFFB9) +#define PWM21T2H (*(unsigned char volatile xdata *)0xFFBA) +#define PWM21T2L (*(unsigned char volatile xdata *)0xFFBB) +#define PWM21CR (*(unsigned char volatile xdata *)0xFFBC) +#define PWM21HLD (*(unsigned char volatile xdata *)0xFFBD) +#define PWM22T1H (*(unsigned char volatile xdata *)0xFFC0) +#define PWM22T1L (*(unsigned char volatile xdata *)0xFFC1) +#define PWM22T2H (*(unsigned char volatile xdata *)0xFFC2) +#define PWM22T2L (*(unsigned char volatile xdata *)0xFFC3) +#define PWM22CR (*(unsigned char volatile xdata *)0xFFC4) +#define PWM22HLD (*(unsigned char volatile xdata *)0xFFC5) +#define PWM23T1H (*(unsigned char volatile xdata *)0xFFC8) +#define PWM23T1L (*(unsigned char volatile xdata *)0xFFC9) +#define PWM23T2H (*(unsigned char volatile xdata *)0xFFCA) +#define PWM23T2L (*(unsigned char volatile xdata *)0xFFCB) +#define PWM23CR (*(unsigned char volatile xdata *)0xFFCC) +#define PWM23HLD (*(unsigned char volatile xdata *)0xFFCD) +#define PWM24T1H (*(unsigned char volatile xdata *)0xFFD0) +#define PWM24T1L (*(unsigned char volatile xdata *)0xFFD1) +#define PWM24T2H (*(unsigned char volatile xdata *)0xFFD2) +#define PWM24T2L (*(unsigned char volatile xdata *)0xFFD3) +#define PWM24CR (*(unsigned char volatile xdata *)0xFFD4) +#define PWM24HLD (*(unsigned char volatile xdata *)0xFFD5) +#define PWM25T1H (*(unsigned char volatile xdata *)0xFFD8) +#define PWM25T1L (*(unsigned char volatile xdata *)0xFFD9) +#define PWM25T2H (*(unsigned char volatile xdata *)0xFFDA) +#define PWM25T2L (*(unsigned char volatile xdata *)0xFFDB) +#define PWM25CR (*(unsigned char volatile xdata *)0xFFDC) +#define PWM25HLD (*(unsigned char volatile xdata *)0xFFDD) +#define PWM26T1H (*(unsigned char volatile xdata *)0xFFE0) +#define PWM26T1L (*(unsigned char volatile xdata *)0xFFE1) +#define PWM26T2H (*(unsigned char volatile xdata *)0xFFE2) +#define PWM26T2L (*(unsigned char volatile xdata *)0xFFE3) +#define PWM26CR (*(unsigned char volatile xdata *)0xFFE4) +#define PWM26HLD (*(unsigned char volatile xdata *)0xFFE5) +#define PWM27T1H (*(unsigned char volatile xdata *)0xFFE8) +#define PWM27T1L (*(unsigned char volatile xdata *)0xFFE9) +#define PWM27T2H (*(unsigned char volatile xdata *)0xFFEA) +#define PWM27T2L (*(unsigned char volatile xdata *)0xFFEB) +#define PWM27CR (*(unsigned char volatile xdata *)0xFFEC) +#define PWM27HLD (*(unsigned char volatile xdata *)0xFFED) +#define PWM3CH (*(unsigned char volatile xdata *)0xFC00) +#define PWM3CL (*(unsigned char volatile xdata *)0xFC01) +#define PWM3CKS (*(unsigned char volatile xdata *)0xFC02) +#define PWM3IF (*(unsigned char volatile xdata *)0xFC05) +#define PWM3FDCR (*(unsigned char volatile xdata *)0xFC06) +#define PWM30T1H (*(unsigned char volatile xdata *)0xFC10) +#define PWM30T1L (*(unsigned char volatile xdata *)0xFC11) +#define PWM30T2H (*(unsigned char volatile xdata *)0xFC12) +#define PWM30T2L (*(unsigned char volatile xdata *)0xFC13) +#define PWM30CR (*(unsigned char volatile xdata *)0xFC14) +#define PWM30HLD (*(unsigned char volatile xdata *)0xFC15) +#define PWM31T1H (*(unsigned char volatile xdata *)0xFC18) +#define PWM31T1L (*(unsigned char volatile xdata *)0xFC19) +#define PWM31T2H (*(unsigned char volatile xdata *)0xFC1A) +#define PWM31T2L (*(unsigned char volatile xdata *)0xFC1B) +#define PWM31CR (*(unsigned char volatile xdata *)0xFC1C) +#define PWM31HLD (*(unsigned char volatile xdata *)0xFC1D) +#define PWM32T1H (*(unsigned char volatile xdata *)0xFC20) +#define PWM32T1L (*(unsigned char volatile xdata *)0xFC21) +#define PWM32T2H (*(unsigned char volatile xdata *)0xFC22) +#define PWM32T2L (*(unsigned char volatile xdata *)0xFC23) +#define PWM32CR (*(unsigned char volatile xdata *)0xFC24) +#define PWM32HLD (*(unsigned char volatile xdata *)0xFC25) +#define PWM33T1H (*(unsigned char volatile xdata *)0xFC28) +#define PWM33T1L (*(unsigned char volatile xdata *)0xFC29) +#define PWM33T2H (*(unsigned char volatile xdata *)0xFC2A) +#define PWM33T2L (*(unsigned char volatile xdata *)0xFC2B) +#define PWM33CR (*(unsigned char volatile xdata *)0xFC2C) +#define PWM33HLD (*(unsigned char volatile xdata *)0xFC2D) +#define PWM34T1H (*(unsigned char volatile xdata *)0xFC30) +#define PWM34T1L (*(unsigned char volatile xdata *)0xFC31) +#define PWM34T2H (*(unsigned char volatile xdata *)0xFC32) +#define PWM34T2L (*(unsigned char volatile xdata *)0xFC33) +#define PWM34CR (*(unsigned char volatile xdata *)0xFC34) +#define PWM34HLD (*(unsigned char volatile xdata *)0xFC35) +#define PWM35T1H (*(unsigned char volatile xdata *)0xFC38) +#define PWM35T1L (*(unsigned char volatile xdata *)0xFC39) +#define PWM35T2H (*(unsigned char volatile xdata *)0xFC3A) +#define PWM35T2L (*(unsigned char volatile xdata *)0xFC3B) +#define PWM35CR (*(unsigned char volatile xdata *)0xFC3C) +#define PWM35HLD (*(unsigned char volatile xdata *)0xFC3D) +#define PWM36T1H (*(unsigned char volatile xdata *)0xFC40) +#define PWM36T1L (*(unsigned char volatile xdata *)0xFC41) +#define PWM36T2H (*(unsigned char volatile xdata *)0xFC42) +#define PWM36T2L (*(unsigned char volatile xdata *)0xFC43) +#define PWM36CR (*(unsigned char volatile xdata *)0xFC44) +#define PWM36HLD (*(unsigned char volatile xdata *)0xFC45) +#define PWM37T1H (*(unsigned char volatile xdata *)0xFC48) +#define PWM37T1L (*(unsigned char volatile xdata *)0xFC49) +#define PWM37T2H (*(unsigned char volatile xdata *)0xFC4A) +#define PWM37T2L (*(unsigned char volatile xdata *)0xFC4B) +#define PWM37CR (*(unsigned char volatile xdata *)0xFC4C) +#define PWM37HLD (*(unsigned char volatile xdata *)0xFC4D) +#define PWM4CH (*(unsigned char volatile xdata *)0xFC50) +#define PWM4CL (*(unsigned char volatile xdata *)0xFC51) +#define PWM4CKS (*(unsigned char volatile xdata *)0xFC52) +#define PWM4TADCH (*(unsigned char volatile xdata *)0xFC53) +#define PWM4TADCL (*(unsigned char volatile xdata *)0xFC54) +#define PWM4IF (*(unsigned char volatile xdata *)0xFC55) +#define PWM4FDCR (*(unsigned char volatile xdata *)0xFC56) +#define PWM40T1H (*(unsigned char volatile xdata *)0xFC60) +#define PWM40T1L (*(unsigned char volatile xdata *)0xFC61) +#define PWM40T2H (*(unsigned char volatile xdata *)0xFC62) +#define PWM40T2L (*(unsigned char volatile xdata *)0xFC63) +#define PWM40CR (*(unsigned char volatile xdata *)0xFC64) +#define PWM40HLD (*(unsigned char volatile xdata *)0xFC65) +#define PWM41T1H (*(unsigned char volatile xdata *)0xFC68) +#define PWM41T1L (*(unsigned char volatile xdata *)0xFC69) +#define PWM41T2H (*(unsigned char volatile xdata *)0xFC6A) +#define PWM41T2L (*(unsigned char volatile xdata *)0xFC6B) +#define PWM41CR (*(unsigned char volatile xdata *)0xFC6C) +#define PWM41HLD (*(unsigned char volatile xdata *)0xFC6D) +#define PWM42T1H (*(unsigned char volatile xdata *)0xFC70) +#define PWM42T1L (*(unsigned char volatile xdata *)0xFC71) +#define PWM42T2H (*(unsigned char volatile xdata *)0xFC72) +#define PWM42T2L (*(unsigned char volatile xdata *)0xFC73) +#define PWM42CR (*(unsigned char volatile xdata *)0xFC74) +#define PWM42HLD (*(unsigned char volatile xdata *)0xFC75) +#define PWM43T1H (*(unsigned char volatile xdata *)0xFC78) +#define PWM43T1L (*(unsigned char volatile xdata *)0xFC79) +#define PWM43T2H (*(unsigned char volatile xdata *)0xFC7A) +#define PWM43T2L (*(unsigned char volatile xdata *)0xFC7B) +#define PWM43CR (*(unsigned char volatile xdata *)0xFC7C) +#define PWM43HLD (*(unsigned char volatile xdata *)0xFC7D) +#define PWM44T1H (*(unsigned char volatile xdata *)0xFC80) +#define PWM44T1L (*(unsigned char volatile xdata *)0xFC81) +#define PWM44T2H (*(unsigned char volatile xdata *)0xFC82) +#define PWM44T2L (*(unsigned char volatile xdata *)0xFC83) +#define PWM44CR (*(unsigned char volatile xdata *)0xFC84) +#define PWM44HLD (*(unsigned char volatile xdata *)0xFC85) +#define PWM45T1H (*(unsigned char volatile xdata *)0xFC88) +#define PWM45T1L (*(unsigned char volatile xdata *)0xFC89) +#define PWM45T2H (*(unsigned char volatile xdata *)0xFC8A) +#define PWM45T2L (*(unsigned char volatile xdata *)0xFC8B) +#define PWM45CR (*(unsigned char volatile xdata *)0xFC8C) +#define PWM45HLD (*(unsigned char volatile xdata *)0xFC8D) +#define PWM46T1H (*(unsigned char volatile xdata *)0xFC90) +#define PWM46T1L (*(unsigned char volatile xdata *)0xFC91) +#define PWM46T2H (*(unsigned char volatile xdata *)0xFC92) +#define PWM46T2L (*(unsigned char volatile xdata *)0xFC93) +#define PWM46CR (*(unsigned char volatile xdata *)0xFC94) +#define PWM46HLD (*(unsigned char volatile xdata *)0xFC95) +#define PWM47T1H (*(unsigned char volatile xdata *)0xFC98) +#define PWM47T1L (*(unsigned char volatile xdata *)0xFC99) +#define PWM47T2H (*(unsigned char volatile xdata *)0xFC9A) +#define PWM47T2L (*(unsigned char volatile xdata *)0xFC9B) +#define PWM47CR (*(unsigned char volatile xdata *)0xFC9C) +#define PWM47HLD (*(unsigned char volatile xdata *)0xFC9D) +#define PWM5CH (*(unsigned char volatile xdata *)0xFCA0) +#define PWM5CL (*(unsigned char volatile xdata *)0xFCA1) +#define PWM5CKS (*(unsigned char volatile xdata *)0xFCA2) +#define PWM5IF (*(unsigned char volatile xdata *)0xFCA5) +#define PWM5FDCR (*(unsigned char volatile xdata *)0xFCA6) +#define PWM50T1H (*(unsigned char volatile xdata *)0xFCB0) +#define PWM50T1L (*(unsigned char volatile xdata *)0xFCB1) +#define PWM50T2H (*(unsigned char volatile xdata *)0xFCB2) +#define PWM50T2L (*(unsigned char volatile xdata *)0xFCB3) +#define PWM50CR (*(unsigned char volatile xdata *)0xFCB4) +#define PWM50HLD (*(unsigned char volatile xdata *)0xFCB5) +#define PWM51T1H (*(unsigned char volatile xdata *)0xFCB8) +#define PWM51T1L (*(unsigned char volatile xdata *)0xFCB9) +#define PWM51T2H (*(unsigned char volatile xdata *)0xFCBA) +#define PWM51T2L (*(unsigned char volatile xdata *)0xFCBB) +#define PWM51CR (*(unsigned char volatile xdata *)0xFCBC) +#define PWM51HLD (*(unsigned char volatile xdata *)0xFCBD) +#define PWM52T1H (*(unsigned char volatile xdata *)0xFCC0) +#define PWM52T1L (*(unsigned char volatile xdata *)0xFCC1) +#define PWM52T2H (*(unsigned char volatile xdata *)0xFCC2) +#define PWM52T2L (*(unsigned char volatile xdata *)0xFCC3) +#define PWM52CR (*(unsigned char volatile xdata *)0xFCC4) +#define PWM52HLD (*(unsigned char volatile xdata *)0xFCC5) +#define PWM53T1H (*(unsigned char volatile xdata *)0xFCC8) +#define PWM53T1L (*(unsigned char volatile xdata *)0xFCC9) +#define PWM53T2H (*(unsigned char volatile xdata *)0xFCCA) +#define PWM53T2L (*(unsigned char volatile xdata *)0xFCCB) +#define PWM53CR (*(unsigned char volatile xdata *)0xFCCC) +#define PWM53HLD (*(unsigned char volatile xdata *)0xFCCD) +#define PWM54T1H (*(unsigned char volatile xdata *)0xFCD0) +#define PWM54T1L (*(unsigned char volatile xdata *)0xFCD1) +#define PWM54T2H (*(unsigned char volatile xdata *)0xFCD2) +#define PWM54T2L (*(unsigned char volatile xdata *)0xFCD3) +#define PWM54CR (*(unsigned char volatile xdata *)0xFCD4) +#define PWM54HLD (*(unsigned char volatile xdata *)0xFCD5) +#define PWM55T1H (*(unsigned char volatile xdata *)0xFCD8) +#define PWM55T1L (*(unsigned char volatile xdata *)0xFCD9) +#define PWM55T2H (*(unsigned char volatile xdata *)0xFCDA) +#define PWM55T2L (*(unsigned char volatile xdata *)0xFCDB) +#define PWM55CR (*(unsigned char volatile xdata *)0xFCDC) +#define PWM55HLD (*(unsigned char volatile xdata *)0xFCDD) +#define PWM56T1H (*(unsigned char volatile xdata *)0xFCE0) +#define PWM56T1L (*(unsigned char volatile xdata *)0xFCE1) +#define PWM56T2H (*(unsigned char volatile xdata *)0xFCE2) +#define PWM56T2L (*(unsigned char volatile xdata *)0xFCE3) +#define PWM56CR (*(unsigned char volatile xdata *)0xFCE4) +#define PWM56HLD (*(unsigned char volatile xdata *)0xFCE5) +#define PWM57T1H (*(unsigned char volatile xdata *)0xFCE8) +#define PWM57T1L (*(unsigned char volatile xdata *)0xFCE9) +#define PWM57T2H (*(unsigned char volatile xdata *)0xFCEA) +#define PWM57T2L (*(unsigned char volatile xdata *)0xFCEB) +#define PWM57CR (*(unsigned char volatile xdata *)0xFCEC) +#define PWM57HLD (*(unsigned char volatile xdata *)0xFCED) + +///////////////////////////////////////////////// + + +/// >>>>> add by cc + +#include "../clib/bit.h" + +#define D_stdIO_P0_ALL() P0M1=0;P0M0=0; +#define D_HighI_P0_ALL() P0M1=0;P0M0=0XFF; +#define D_HighR_P0_ALL() P0M1=0XFF;P0M0=0; +#define D_OpenD_P0_ALL() P0M1=0XFF;P0M0=0XFF; + +#define D_stdIO_P1_ALL() P1M1=0;P1M0=0; +#define D_HighI_P1_ALL() P1M1=0;P1M0=0XFF; +#define D_HighR_P1_ALL() P1M1=0XFF;P1M0=0; +#define D_OpenD_P1_ALL() P1M1=0XFF;P1M0=0XFF; + + +#define D_stdIO_P0(n) BITN_0(P0M1,n);BITN_0(P0M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P0(n) BITN_0(P0M1,n);BITN_1(P0M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P0(n) BITN_1(P0M1,n);BITN_0(P0M0,n); /////////10 高阻 +#define D_OpenD_P0(n) BITN_1(P0M1,n);BITN_1(P0M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P1(n) BITN_0(P1M1,n);BITN_0(P1M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P1(n) BITN_0(P1M1,n);BITN_1(P1M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P1(n) BITN_1(P1M1,n);BITN_0(P1M0,n); /////////10 高阻 +#define D_OpenD_P1(n) BITN_1(P1M1,n);BITN_1(P1M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P2(n) BITN_0(P2M1,n);BITN_0(P2M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P2(n) BITN_0(P2M1,n);BITN_1(P2M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P2(n) BITN_1(P2M1,n);BITN_0(P2M0,n); /////////10 高阻 +#define D_OpenD_P2(n) BITN_1(P2M1,n);BITN_1(P2M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P3(n) BITN_0(P3M1,n);BITN_0(P3M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P3(n) BITN_0(P3M1,n);BITN_1(P3M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P3(n) BITN_1(P3M1,n);BITN_0(P3M0,n); /////////10 高阻 +#define D_OpenD_P3(n) BITN_1(P3M1,n);BITN_1(P3M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P4(n) BITN_0(P4M1,n);BITN_0(P4M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P4(n) BITN_0(P4M1,n);BITN_1(P4M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P4(n) BITN_1(P4M1,n);BITN_0(P4M0,n); /////////10 高阻 +#define D_OpenD_P4(n) BITN_1(P4M1,n);BITN_1(P4M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P5(n) BITN_0(P5M1,n);BITN_0(P5M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P5(n) BITN_0(P5M1,n);BITN_1(P5M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P5(n) BITN_1(P5M1,n);BITN_0(P5M0,n); /////////10 高阻 +#define D_OpenD_P5(n) BITN_1(P5M1,n);BITN_1(P5M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P6(n) BITN_0(P6M1,n);BITN_0(P6M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P6(n) BITN_0(P6M1,n);BITN_1(P6M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P6(n) BITN_1(P6M1,n);BITN_0(P6M0,n); /////////10 高阻 +#define D_OpenD_P6(n) BITN_1(P6M1,n);BITN_1(P6M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P7(n) BITN_0(P7M1,n);BITN_0(P7M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P7(n) BITN_0(P7M1,n);BITN_1(P7M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P7(n) BITN_1(P7M1,n);BITN_0(P7M0,n); /////////10 高阻 +#define D_OpenD_P7(n) BITN_1(P7M1,n);BITN_1(P7M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +/*** + +#define P0_conf_in(n) BITN_1(P0M1,n);BITN_0(P0M0,n); +#define P1_conf_in(n) BITN_1(P1M1,n);BITN_0(P1M0,n); +#define P2_conf_in(n) BITN_1(P2M1,n);BITN_0(P2M0,n); +#define P2_conf_port(n) BITN_0(P2M1,n);BITN_0(P2M0,n); + + +#define P3_conf_in(n) BITN_1(P3M1,n);BITN_0(P3M0,n); +#define P3_conf_port(n) BITN_0(P3M1,n);BITN_0(P3M0,n); + +#define P4_conf_in(n) BITN_1(P4M1,n);BITN_0(P4M0,n); +#define P5_conf_in(n) BITN_1(P5M1,n);BITN_0(P5M0,n); + +***/ + + + +#define NOP() _nop_() + +#define L0_INT4_OPEN() BITN_1(INT_CLKO, INT_EX4) +#define L0_INT4_CLOSE() BITN_0(INT_CLKO, INT_EX4) + +#define L0_INT4_AT() BITN_G(INT_CLKO, INT_EX4) + + + + +#define L0_INT4_CLEAR() BITN_0(AUXINTIF, INT4IF) +#define L0_INT3_CLEAR() BITN_0(AUXINTIF, INT3IF) +#define L0_INT2_CLEAR() BITN_0(AUXINTIF, INT2IF) + + + + +////// + +#define L0_INT3_OPEN() BITN_1(INT_CLKO, INT_EX3); +#define L0_INT3_CLOSE() BITN_0(INT_CLKO, INT_EX3); +#define L0_INT2_OPEN() BITN_1(INT_CLKO, INT_EX2); +#define L0_INT2_CLOSE() BITN_0(INT_CLKO, INT_EX2); +#define L0_INT1_OPEN() EX1 = 1; +#define L0_INT1_CLOSE() EX1 = 0; +#define L0_INT0_OPEN() EX0 = 1; +#define L0_INT0_CLOSE() EX0 = 0; + +#define D_ISR_int0 0 ///int0 下降沿触发 = 0 上下沿均可触发 +#define D_ISR_timer0 1 +#define D_ISR_int1 2 ///int1 下降沿触发 = 0 上下沿均可触发 +#define D_ISR_timer1 3 +#define D_ISR_int2 10 /////只有下降沿 +#define D_ISR_int3 11 /////只有下降沿 +#define D_SERVE_UART 4 +#define D_ISR_int4 16 /////只有下降沿 + +#if 0 +#define L0_TIMER1_start() TR1 = 1; +#define L0_TIMER1_end() TR1 = 0; + + +#define L0_TIMER1_isr_OPEN() ET1 = 1; +#define L0_TIMER1_isr_CLOSE() ET1 = 0; + + +#else + +#define L0_TIMER1_start() ET1 = 1; +#define L0_TIMER1_end() ET1 = 0; + + +#define L0_TIMER1_isr_OPEN() TR1 = 1; +#define L0_TIMER1_isr_CLOSE() TR1 = 0; + + +#endif + +/// fixme 颠倒定义会让c51锁死#define _nop_() NOP() + +///#define L0_INT3_OPEN() BITN_1(INT_CLKO,INT_EX3); //使能INT3中断 +///#define L0_INT3_CLOSE() BITN_0(INT_CLKO,INT_EX3); +#endif //STC_stc8a8k + + + + + + diff --git a/source/cpu/stc_stc8hxx.h b/source/cpu/stc_stc8hxx.h new file mode 100644 index 0000000..a279eea --- /dev/null +++ b/source/cpu/stc_stc8hxx.h @@ -0,0 +1,640 @@ +#ifndef __STC8H_H__ +#define __STC8H_H__ + +///////////////////////////////////////////////// + +//ͷļ,ٰ"REG51.H" + +sfr P0 = 0x80; +sbit P00 = P0^0; +sbit P01 = P0^1; +sbit P02 = P0^2; +sbit P03 = P0^3; +sbit P04 = P0^4; +sbit P05 = P0^5; +sbit P06 = P0^6; +sbit P07 = P0^7; +sfr SP = 0x81; +sfr DPL = 0x82; +sfr DPH = 0x83; +sfr S4CON = 0x84; +sfr S4BUF = 0x85; +sfr PCON = 0x87; +sfr TCON = 0x88; +sbit TF1 = TCON^7; +sbit TR1 = TCON^6; +sbit TF0 = TCON^5; +sbit TR0 = TCON^4; +sbit IE1 = TCON^3; +sbit IT1 = TCON^2; +sbit IE0 = TCON^1; +sbit IT0 = TCON^0; +sfr TMOD = 0x89; +sfr TL0 = 0x8a; +sfr TL1 = 0x8b; +sfr TH0 = 0x8c; +sfr TH1 = 0x8d; +sfr AUXR = 0x8e; +sfr INTCLKO = 0x8f; +sfr P1 = 0x90; +sbit P10 = P1^0; +sbit P11 = P1^1; +sbit P12 = P1^2; +sbit P13 = P1^3; +sbit P14 = P1^4; +sbit P15 = P1^5; +sbit P16 = P1^6; +sbit P17 = P1^7; +sfr P1M1 = 0x91; +sfr P1M0 = 0x92; +sfr P0M1 = 0x93; +sfr P0M0 = 0x94; +sfr P2M1 = 0x95; +sfr P2M0 = 0x96; +sfr SCON = 0x98; +sbit SM0 = SCON^7; +sbit SM1 = SCON^6; +sbit SM2 = SCON^5; +sbit REN = SCON^4; +sbit TB8 = SCON^3; +sbit RB8 = SCON^2; +sbit TI = SCON^1; +sbit RI = SCON^0; +sfr SBUF = 0x99; +sfr S2CON = 0x9a; +sfr S2BUF = 0x9b; +sfr IRCBAND = 0x9d; +sfr LIRTRIM = 0x9e; +sfr IRTRIM = 0x9f; +sfr P2 = 0xa0; +sbit P20 = P2^0; +sbit P21 = P2^1; +sbit P22 = P2^2; +sbit P23 = P2^3; +sbit P24 = P2^4; +sbit P25 = P2^5; +sbit P26 = P2^6; +sbit P27 = P2^7; +sfr P_SW1 = 0xa2; +sfr IE = 0xa8; +sbit EA = IE^7; +sbit ELVD = IE^6; +sbit EADC = IE^5; +sbit ES = IE^4; +sbit ET1 = IE^3; +sbit EX1 = IE^2; +sbit ET0 = IE^1; +sbit EX0 = IE^0; +sfr SADDR = 0xa9; +sfr WKTCL = 0xaa; +sfr WKTCH = 0xab; +sfr S3CON = 0xac; +sfr S3BUF = 0xad; +sfr TA = 0xae; +sfr IE2 = 0xaf; +sfr P3 = 0xb0; +sbit P30 = P3^0; +sbit P31 = P3^1; +sbit P32 = P3^2; +sbit P33 = P3^3; +sbit P34 = P3^4; +sbit P35 = P3^5; +sbit P36 = P3^6; +sbit P37 = P3^7; +sfr P3M1 = 0xb1; +sfr P3M0 = 0xb2; +sfr P4M1 = 0xb3; +sfr P4M0 = 0xb4; +sfr IP2 = 0xb5; +sfr IP2H = 0xb6; +sfr IPH = 0xb7; +sfr IP = 0xb8; +sbit PPCA = IP^7; +sbit PLVD = IP^6; +sbit PADC = IP^5; +sbit PS = IP^4; +sbit PT1 = IP^3; +sbit PX1 = IP^2; +sbit PT0 = IP^1; +sbit PX0 = IP^0; +sfr SADEN = 0xb9; +sfr P_SW2 = 0xba; +sfr ADC_CONTR = 0xbc; +sfr ADC_RES = 0xbd; +sfr ADC_RESL = 0xbe; +sfr P4 = 0xc0; +sbit P40 = P4^0; +sbit P41 = P4^1; +sbit P42 = P4^2; +sbit P43 = P4^3; +sbit P44 = P4^4; +sbit P45 = P4^5; +sbit P46 = P4^6; +sbit P47 = P4^7; +sfr WDT_CONTR = 0xc1; +sfr IAP_DATA = 0xc2; +sfr IAP_ADDRH = 0xc3; +sfr IAP_ADDRL = 0xc4; +sfr IAP_CMD = 0xc5; +sfr IAP_TRIG = 0xc6; +sfr IAP_CONTR = 0xc7; +sfr P5 = 0xc8; +sbit P50 = P5^0; +sbit P51 = P5^1; +sbit P52 = P5^2; +sbit P53 = P5^3; +sbit P54 = P5^4; +sbit P55 = P5^5; +sbit P56 = P5^6; +sbit P57 = P5^7; +sfr P5M1 = 0xc9; +sfr P5M0 = 0xca; +sfr P6M1 = 0xcb; +sfr P6M0 = 0xcc; +sfr SPSTAT = 0xcd; +sfr SPCTL = 0xce; +sfr SPDAT = 0xcf; +sfr PSW = 0xd0; +sbit CY = PSW^7; +sbit AC = PSW^6; +sbit F0 = PSW^5; +sbit RS1 = PSW^4; +sbit RS0 = PSW^3; +sbit OV = PSW^2; +sbit F1 = PSW^1; +sbit P = PSW^0; +sfr T4T3M = 0xd1; +sfr T4H = 0xd2; +sfr T4L = 0xd3; +sfr T3H = 0xd4; +sfr T3L = 0xd5; +sfr T2H = 0xd6; +sfr T2L = 0xd7; +sfr USBCLK = 0xdc; +sfr ADCCFG = 0xde; +sfr IP3 = 0xdf; +sfr ACC = 0xe0; +sfr P7M1 = 0xe1; +sfr P7M0 = 0xe2; +sfr DPS = 0xe3; +sfr DPL1 = 0xe4; +sfr DPH1 = 0xe5; +sfr CMPCR1 = 0xe6; +sfr CMPCR2 = 0xe7; +sfr P6 = 0xe8; +sfr USBDAT = 0xec; +sfr IP3H = 0xee; +sfr AUXINTIF = 0xef; +sfr B = 0xf0; +sfr USBCON = 0xf4; +sfr IAP_TPS = 0xf5; +sfr P7 = 0xf8; +sfr USBADR = 0xfc; +sfr RSTCFG = 0xff; + +//⹦ܼĴλչRAM +//ЩĴ,ȽP_SW2BIT7Ϊ1,ſд + +///////////////////////////////////////////////// +//FF00H-FFFFH +///////////////////////////////////////////////// + + + +///////////////////////////////////////////////// +//FE00H-FEFFH +///////////////////////////////////////////////// + +#define CKSEL (*(unsigned char volatile xdata *)0xfe00) +#define CLKDIV (*(unsigned char volatile xdata *)0xfe01) +#define HIRCCR (*(unsigned char volatile xdata *)0xfe02) +#define XOSCCR (*(unsigned char volatile xdata *)0xfe03) +#define IRC32KCR (*(unsigned char volatile xdata *)0xfe04) +#define MCLKOCR (*(unsigned char volatile xdata *)0xfe05) +#define IRCDB (*(unsigned char volatile xdata *)0xfe06) +#define X32KCR (*(unsigned char volatile xdata *)0xfe08) + +#define P0PU (*(unsigned char volatile xdata *)0xfe10) +#define P1PU (*(unsigned char volatile xdata *)0xfe11) +#define P2PU (*(unsigned char volatile xdata *)0xfe12) +#define P3PU (*(unsigned char volatile xdata *)0xfe13) +#define P4PU (*(unsigned char volatile xdata *)0xfe14) +#define P5PU (*(unsigned char volatile xdata *)0xfe15) +#define P6PU (*(unsigned char volatile xdata *)0xfe16) +#define P7PU (*(unsigned char volatile xdata *)0xfe17) +#define P0NCS (*(unsigned char volatile xdata *)0xfe18) +#define P1NCS (*(unsigned char volatile xdata *)0xfe19) +#define P2NCS (*(unsigned char volatile xdata *)0xfe1a) +#define P3NCS (*(unsigned char volatile xdata *)0xfe1b) +#define P4NCS (*(unsigned char volatile xdata *)0xfe1c) +#define P5NCS (*(unsigned char volatile xdata *)0xfe1d) +#define P6NCS (*(unsigned char volatile xdata *)0xfe1e) +#define P7NCS (*(unsigned char volatile xdata *)0xfe1f) +#define P0SR (*(unsigned char volatile xdata *)0xfe20) +#define P1SR (*(unsigned char volatile xdata *)0xfe21) +#define P2SR (*(unsigned char volatile xdata *)0xfe22) +#define P3SR (*(unsigned char volatile xdata *)0xfe23) +#define P4SR (*(unsigned char volatile xdata *)0xfe24) +#define P5SR (*(unsigned char volatile xdata *)0xfe25) +#define P6SR (*(unsigned char volatile xdata *)0xfe26) +#define P7SR (*(unsigned char volatile xdata *)0xfe27) +#define P0DR (*(unsigned char volatile xdata *)0xfe28) +#define P1DR (*(unsigned char volatile xdata *)0xfe29) +#define P2DR (*(unsigned char volatile xdata *)0xfe2a) +#define P3DR (*(unsigned char volatile xdata *)0xfe2b) +#define P4DR (*(unsigned char volatile xdata *)0xfe2c) +#define P5DR (*(unsigned char volatile xdata *)0xfe2d) +#define P6DR (*(unsigned char volatile xdata *)0xfe2e) +#define P7DR (*(unsigned char volatile xdata *)0xfe2f) +#define P0IE (*(unsigned char volatile xdata *)0xfe30) +#define P1IE (*(unsigned char volatile xdata *)0xfe31) +#define P2IE (*(unsigned char volatile xdata *)0xfe32) +#define P3IE (*(unsigned char volatile xdata *)0xfe33) +#define P4IE (*(unsigned char volatile xdata *)0xfe34) +#define P5IE (*(unsigned char volatile xdata *)0xfe35) +#define P6IE (*(unsigned char volatile xdata *)0xfe36) +#define P7IE (*(unsigned char volatile xdata *)0xfe37) + +#define RTCCR (*(unsigned char volatile xdata *)0xfe60) +#define RTCCFG (*(unsigned char volatile xdata *)0xfe61) +#define RTCIEN (*(unsigned char volatile xdata *)0xfe62) +#define RTCIF (*(unsigned char volatile xdata *)0xfe63) +#define ALAHOUR (*(unsigned char volatile xdata *)0xfe64) +#define ALAMIN (*(unsigned char volatile xdata *)0xfe65) +#define ALASEC (*(unsigned char volatile xdata *)0xfe66) +#define ALASSEC (*(unsigned char volatile xdata *)0xfe67) +#define INIYEAR (*(unsigned char volatile xdata *)0xfe68) +#define INIMONTH (*(unsigned char volatile xdata *)0xfe69) +#define INIDAY (*(unsigned char volatile xdata *)0xfe6a) +#define INIHOUR (*(unsigned char volatile xdata *)0xfe6b) +#define INIMIN (*(unsigned char volatile xdata *)0xfe6c) +#define INISEC (*(unsigned char volatile xdata *)0xfe6d) +#define INISSEC (*(unsigned char volatile xdata *)0xfe6e) +#define YEAR (*(unsigned char volatile xdata *)0xfe70) +#define MONTH (*(unsigned char volatile xdata *)0xfe71) +#define DAY (*(unsigned char volatile xdata *)0xfe72) +#define HOUR (*(unsigned char volatile xdata *)0xfe73) +#define MIN (*(unsigned char volatile xdata *)0xfe74) +#define SEC (*(unsigned char volatile xdata *)0xfe75) +#define SSEC (*(unsigned char volatile xdata *)0xfe76) + +#define I2CCFG (*(unsigned char volatile xdata *)0xfe80) +#define I2CMSCR (*(unsigned char volatile xdata *)0xfe81) +#define I2CMSST (*(unsigned char volatile xdata *)0xfe82) +#define I2CSLCR (*(unsigned char volatile xdata *)0xfe83) +#define I2CSLST (*(unsigned char volatile xdata *)0xfe84) +#define I2CSLADR (*(unsigned char volatile xdata *)0xfe85) +#define I2CTXD (*(unsigned char volatile xdata *)0xfe86) +#define I2CRXD (*(unsigned char volatile xdata *)0xfe87) +#define I2CMSAUX (*(unsigned char volatile xdata *)0xfe88) +#define TM2PS (*(unsigned char volatile xdata *)0xfea2) +#define TM3PS (*(unsigned char volatile xdata *)0xfea3) +#define TM4PS (*(unsigned char volatile xdata *)0xfea4) +#define ADCTIM (*(unsigned char volatile xdata *)0xfea8) + +#define PWM1_ETRPS (*(unsigned char volatile xdata *)0xfeb0) +#define PWM1_ENO (*(unsigned char volatile xdata *)0xfeb1) +#define PWM1_PS (*(unsigned char volatile xdata *)0xfeb2) +#define PWM1_IOAUX (*(unsigned char volatile xdata *)0xfeb3) +#define PWM2_ETRPS (*(unsigned char volatile xdata *)0xfeb4) +#define PWM2_ENO (*(unsigned char volatile xdata *)0xfeb5) +#define PWM2_PS (*(unsigned char volatile xdata *)0xfeb6) +#define PWM2_IOAUX (*(unsigned char volatile xdata *)0xfeb7) +#define PWM1_CR1 (*(unsigned char volatile xdata *)0xfec0) +#define PWM1_CR2 (*(unsigned char volatile xdata *)0xfec1) +#define PWM1_SMCR (*(unsigned char volatile xdata *)0xfec2) +#define PWM1_ETR (*(unsigned char volatile xdata *)0xfec3) +#define PWM1_IER (*(unsigned char volatile xdata *)0xfec4) +#define PWM1_SR1 (*(unsigned char volatile xdata *)0xfec5) +#define PWM1_SR2 (*(unsigned char volatile xdata *)0xfec6) +#define PWM1_EGR (*(unsigned char volatile xdata *)0xfec7) +#define PWM1_CCMR1 (*(unsigned char volatile xdata *)0xfec8) +#define PWM1_CCMR2 (*(unsigned char volatile xdata *)0xfec9) +#define PWM1_CCMR3 (*(unsigned char volatile xdata *)0xfeca) +#define PWM1_CCMR4 (*(unsigned char volatile xdata *)0xfecb) +#define PWM1_CCER1 (*(unsigned char volatile xdata *)0xfecc) +#define PWM1_CCER2 (*(unsigned char volatile xdata *)0xfecd) +#define PWM1_CNTR (*(unsigned int volatile xdata *)0xfece) +#define PWM1_CNTRH (*(unsigned char volatile xdata *)0xfece) +#define PWM1_CNTRL (*(unsigned char volatile xdata *)0xfecf) +#define PWM1_PSCR (*(unsigned int volatile xdata *)0xfed0) +#define PWM1_PSCRH (*(unsigned char volatile xdata *)0xfed0) +#define PWM1_PSCRL (*(unsigned char volatile xdata *)0xfed1) +#define PWM1_ARR (*(unsigned int volatile xdata *)0xfed2) +#define PWM1_ARRH (*(unsigned char volatile xdata *)0xfed2) +#define PWM1_ARRL (*(unsigned char volatile xdata *)0xfed3) +#define PWM1_RCR (*(unsigned char volatile xdata *)0xfed4) +#define PWM1_CCR1 (*(unsigned int volatile xdata *)0xfed5) +#define PWM1_CCR1H (*(unsigned char volatile xdata *)0xfed5) +#define PWM1_CCR1L (*(unsigned char volatile xdata *)0xfed6) +#define PWM1_CCR2 (*(unsigned int volatile xdata *)0xfed7) +#define PWM1_CCR2H (*(unsigned char volatile xdata *)0xfed7) +#define PWM1_CCR2L (*(unsigned char volatile xdata *)0xfed8) +#define PWM1_CCR3 (*(unsigned int volatile xdata *)0xfed9) +#define PWM1_CCR3H (*(unsigned char volatile xdata *)0xfed9) +#define PWM1_CCR3L (*(unsigned char volatile xdata *)0xfeda) +#define PWM1_CCR4 (*(unsigned int volatile xdata *)0xfedb) +#define PWM1_CCR4H (*(unsigned char volatile xdata *)0xfedb) +#define PWM1_CCR4L (*(unsigned char volatile xdata *)0xfedc) +#define PWM1_BKR (*(unsigned char volatile xdata *)0xfedd) +#define PWM1_DTR (*(unsigned char volatile xdata *)0xfede) +#define PWM1_OISR (*(unsigned char volatile xdata *)0xfedf) +#define PWM2_CR1 (*(unsigned char volatile xdata *)0xfee0) +#define PWM2_CR2 (*(unsigned char volatile xdata *)0xfee1) +#define PWM2_SMCR (*(unsigned char volatile xdata *)0xfee2) +#define PWM2_ETR (*(unsigned char volatile xdata *)0xfee3) +#define PWM2_IER (*(unsigned char volatile xdata *)0xfee4) +#define PWM2_SR1 (*(unsigned char volatile xdata *)0xfee5) +#define PWM2_SR2 (*(unsigned char volatile xdata *)0xfee6) +#define PWM2_EGR (*(unsigned char volatile xdata *)0xfee7) +#define PWM2_CCMR1 (*(unsigned char volatile xdata *)0xfee8) +#define PWM2_CCMR2 (*(unsigned char volatile xdata *)0xfee9) +#define PWM2_CCMR3 (*(unsigned char volatile xdata *)0xfeea) +#define PWM2_CCMR4 (*(unsigned char volatile xdata *)0xfeeb) +#define PWM2_CCER1 (*(unsigned char volatile xdata *)0xfeec) +#define PWM2_CCER2 (*(unsigned char volatile xdata *)0xfeed) +#define PWM2_CNTR (*(unsigned int volatile xdata *)0xfeee) +#define PWM2_CNTRH (*(unsigned char volatile xdata *)0xfeee) +#define PWM2_CNTRL (*(unsigned char volatile xdata *)0xfeef) +#define PWM2_PSCR (*(unsigned int volatile xdata *)0xfef0) +#define PWM2_PSCRH (*(unsigned char volatile xdata *)0xfef0) +#define PWM2_PSCRL (*(unsigned char volatile xdata *)0xfef1) +#define PWM2_ARR (*(unsigned int volatile xdata *)0xfef2) +#define PWM2_ARRH (*(unsigned char volatile xdata *)0xfef2) +#define PWM2_ARRL (*(unsigned char volatile xdata *)0xfef3) +#define PWM2_RCR (*(unsigned char volatile xdata *)0xfef4) +#define PWM2_CCR1 (*(unsigned int volatile xdata *)0xfef5) +#define PWM2_CCR1H (*(unsigned char volatile xdata *)0xfef5) +#define PWM2_CCR1L (*(unsigned char volatile xdata *)0xfef6) +#define PWM2_CCR2 (*(unsigned int volatile xdata *)0xfef7) +#define PWM2_CCR2H (*(unsigned char volatile xdata *)0xfef7) +#define PWM2_CCR2L (*(unsigned char volatile xdata *)0xfef8) +#define PWM2_CCR3 (*(unsigned int volatile xdata *)0xfef9) +#define PWM2_CCR3H (*(unsigned char volatile xdata *)0xfef9) +#define PWM2_CCR3L (*(unsigned char volatile xdata *)0xfefa) +#define PWM2_CCR4 (*(unsigned int volatile xdata *)0xfefb) +#define PWM2_CCR4H (*(unsigned char volatile xdata *)0xfefb) +#define PWM2_CCR4L (*(unsigned char volatile xdata *)0xfefc) +#define PWM2_BKR (*(unsigned char volatile xdata *)0xfefd) +#define PWM2_DTR (*(unsigned char volatile xdata *)0xfefe) +#define PWM2_OISR (*(unsigned char volatile xdata *)0xfeff) + +#define PWMA_ETRPS (*(unsigned char volatile xdata *)0xfeb0) +#define PWMA_ENO (*(unsigned char volatile xdata *)0xfeb1) +#define PWMA_PS (*(unsigned char volatile xdata *)0xfeb2) +#define PWMA_IOAUX (*(unsigned char volatile xdata *)0xfeb3) +#define PWMB_ETRPS (*(unsigned char volatile xdata *)0xfeb4) +#define PWMB_ENO (*(unsigned char volatile xdata *)0xfeb5) +#define PWMB_PS (*(unsigned char volatile xdata *)0xfeb6) +#define PWMB_IOAUX (*(unsigned char volatile xdata *)0xfeb7) +#define PWMA_CR1 (*(unsigned char volatile xdata *)0xfec0) +#define PWMA_CR2 (*(unsigned char volatile xdata *)0xfec1) +#define PWMA_SMCR (*(unsigned char volatile xdata *)0xfec2) +#define PWMA_ETR (*(unsigned char volatile xdata *)0xfec3) +#define PWMA_IER (*(unsigned char volatile xdata *)0xfec4) +#define PWMA_SR1 (*(unsigned char volatile xdata *)0xfec5) +#define PWMA_SR2 (*(unsigned char volatile xdata *)0xfec6) +#define PWMA_EGR (*(unsigned char volatile xdata *)0xfec7) +#define PWMA_CCMR1 (*(unsigned char volatile xdata *)0xfec8) +#define PWMA_CCMR2 (*(unsigned char volatile xdata *)0xfec9) +#define PWMA_CCMR3 (*(unsigned char volatile xdata *)0xfeca) +#define PWMA_CCMR4 (*(unsigned char volatile xdata *)0xfecb) +#define PWMA_CCER1 (*(unsigned char volatile xdata *)0xfecc) +#define PWMA_CCER2 (*(unsigned char volatile xdata *)0xfecd) +#define PWMA_CNTR (*(unsigned int volatile xdata *)0xfece) +#define PWMA_CNTRH (*(unsigned char volatile xdata *)0xfece) +#define PWMA_CNTRL (*(unsigned char volatile xdata *)0xfecf) +#define PWMA_PSCR (*(unsigned int volatile xdata *)0xfed0) +#define PWMA_PSCRH (*(unsigned char volatile xdata *)0xfed0) +#define PWMA_PSCRL (*(unsigned char volatile xdata *)0xfed1) +#define PWMA_ARR (*(unsigned int volatile xdata *)0xfed2) +#define PWMA_ARRH (*(unsigned char volatile xdata *)0xfed2) +#define PWMA_ARRL (*(unsigned char volatile xdata *)0xfed3) +#define PWMA_RCR (*(unsigned char volatile xdata *)0xfed4) +#define PWMA_CCR1 (*(unsigned int volatile xdata *)0xfed5) +#define PWMA_CCR1H (*(unsigned char volatile xdata *)0xfed5) +#define PWMA_CCR1L (*(unsigned char volatile xdata *)0xfed6) +#define PWMA_CCR2 (*(unsigned int volatile xdata *)0xfed7) +#define PWMA_CCR2H (*(unsigned char volatile xdata *)0xfed7) +#define PWMA_CCR2L (*(unsigned char volatile xdata *)0xfed8) +#define PWMA_CCR3 (*(unsigned int volatile xdata *)0xfed9) +#define PWMA_CCR3H (*(unsigned char volatile xdata *)0xfed9) +#define PWMA_CCR3L (*(unsigned char volatile xdata *)0xfeda) +#define PWMA_CCR4 (*(unsigned int volatile xdata *)0xfedb) +#define PWMA_CCR4H (*(unsigned char volatile xdata *)0xfedb) +#define PWMA_CCR4L (*(unsigned char volatile xdata *)0xfedc) +#define PWMA_BKR (*(unsigned char volatile xdata *)0xfedd) +#define PWMA_DTR (*(unsigned char volatile xdata *)0xfede) +#define PWMA_OISR (*(unsigned char volatile xdata *)0xfedf) +#define PWMB_CR1 (*(unsigned char volatile xdata *)0xfee0) +#define PWMB_CR2 (*(unsigned char volatile xdata *)0xfee1) +#define PWMB_SMCR (*(unsigned char volatile xdata *)0xfee2) +#define PWMB_ETR (*(unsigned char volatile xdata *)0xfee3) +#define PWMB_IER (*(unsigned char volatile xdata *)0xfee4) +#define PWMB_SR1 (*(unsigned char volatile xdata *)0xfee5) +#define PWMB_SR2 (*(unsigned char volatile xdata *)0xfee6) +#define PWMB_EGR (*(unsigned char volatile xdata *)0xfee7) +#define PWMB_CCMR1 (*(unsigned char volatile xdata *)0xfee8) +#define PWMB_CCMR2 (*(unsigned char volatile xdata *)0xfee9) +#define PWMB_CCMR3 (*(unsigned char volatile xdata *)0xfeea) +#define PWMB_CCMR4 (*(unsigned char volatile xdata *)0xfeeb) +#define PWMB_CCER1 (*(unsigned char volatile xdata *)0xfeec) +#define PWMB_CCER2 (*(unsigned char volatile xdata *)0xfeed) +#define PWMB_CNTR (*(unsigned int volatile xdata *)0xfeee) +#define PWMB_CNTRH (*(unsigned char volatile xdata *)0xfeee) +#define PWMB_CNTRL (*(unsigned char volatile xdata *)0xfeef) +#define PWMB_PSCR (*(unsigned int volatile xdata *)0xfef0) +#define PWMB_PSCRH (*(unsigned char volatile xdata *)0xfef0) +#define PWMB_PSCRL (*(unsigned char volatile xdata *)0xfef1) +#define PWMB_ARR (*(unsigned int volatile xdata *)0xfef2) +#define PWMB_ARRH (*(unsigned char volatile xdata *)0xfef2) +#define PWMB_ARRL (*(unsigned char volatile xdata *)0xfef3) +#define PWMB_RCR (*(unsigned char volatile xdata *)0xfef4) +#define PWMB_CCR5 (*(unsigned int volatile xdata *)0xfef5) +#define PWMB_CCR5H (*(unsigned char volatile xdata *)0xfef5) +#define PWMB_CCR5L (*(unsigned char volatile xdata *)0xfef6) +#define PWMB_CCR6 (*(unsigned int volatile xdata *)0xfef7) +#define PWMB_CCR6H (*(unsigned char volatile xdata *)0xfef7) +#define PWMB_CCR6L (*(unsigned char volatile xdata *)0xfef8) +#define PWMB_CCR7 (*(unsigned int volatile xdata *)0xfef9) +#define PWMB_CCR7H (*(unsigned char volatile xdata *)0xfef9) +#define PWMB_CCR7L (*(unsigned char volatile xdata *)0xfefa) +#define PWMB_CCR8 (*(unsigned int volatile xdata *)0xfefb) +#define PWMB_CCR8H (*(unsigned char volatile xdata *)0xfefb) +#define PWMB_CCR8L (*(unsigned char volatile xdata *)0xfefc) +#define PWMB_BKR (*(unsigned char volatile xdata *)0xfefd) +#define PWMB_DTR (*(unsigned char volatile xdata *)0xfefe) +#define PWMB_OISR (*(unsigned char volatile xdata *)0xfeff) + +///////////////////////////////////////////////// +//FD00H-FDFFH +///////////////////////////////////////////////// + +#define P0INTE (*(unsigned char volatile xdata *)0xfd00) +#define P1INTE (*(unsigned char volatile xdata *)0xfd01) +#define P2INTE (*(unsigned char volatile xdata *)0xfd02) +#define P3INTE (*(unsigned char volatile xdata *)0xfd03) +#define P4INTE (*(unsigned char volatile xdata *)0xfd04) +#define P5INTE (*(unsigned char volatile xdata *)0xfd05) +#define P6INTE (*(unsigned char volatile xdata *)0xfd06) +#define P7INTE (*(unsigned char volatile xdata *)0xfd07) +#define P0INTF (*(unsigned char volatile xdata *)0xfd10) +#define P1INTF (*(unsigned char volatile xdata *)0xfd11) +#define P2INTF (*(unsigned char volatile xdata *)0xfd12) +#define P3INTF (*(unsigned char volatile xdata *)0xfd13) +#define P4INTF (*(unsigned char volatile xdata *)0xfd14) +#define P5INTF (*(unsigned char volatile xdata *)0xfd15) +#define P6INTF (*(unsigned char volatile xdata *)0xfd16) +#define P7INTF (*(unsigned char volatile xdata *)0xfd17) +#define P0IM0 (*(unsigned char volatile xdata *)0xfd20) +#define P1IM0 (*(unsigned char volatile xdata *)0xfd21) +#define P2IM0 (*(unsigned char volatile xdata *)0xfd22) +#define P3IM0 (*(unsigned char volatile xdata *)0xfd23) +#define P4IM0 (*(unsigned char volatile xdata *)0xfd24) +#define P5IM0 (*(unsigned char volatile xdata *)0xfd25) +#define P6IM0 (*(unsigned char volatile xdata *)0xfd26) +#define P7IM0 (*(unsigned char volatile xdata *)0xfd27) +#define P0IM1 (*(unsigned char volatile xdata *)0xfd30) +#define P1IM1 (*(unsigned char volatile xdata *)0xfd31) +#define P2IM1 (*(unsigned char volatile xdata *)0xfd32) +#define P3IM1 (*(unsigned char volatile xdata *)0xfd33) +#define P4IM1 (*(unsigned char volatile xdata *)0xfd34) +#define P5IM1 (*(unsigned char volatile xdata *)0xfd35) +#define P6IM1 (*(unsigned char volatile xdata *)0xfd36) +#define P7IM1 (*(unsigned char volatile xdata *)0xfd37) +#define P0WKUE (*(unsigned char volatile xdata *)0xfd40) +#define P1WKUE (*(unsigned char volatile xdata *)0xfd41) +#define P2WKUE (*(unsigned char volatile xdata *)0xfd42) +#define P3WKUE (*(unsigned char volatile xdata *)0xfd43) +#define P4WKUE (*(unsigned char volatile xdata *)0xfd44) +#define P5WKUE (*(unsigned char volatile xdata *)0xfd45) +#define P6WKUE (*(unsigned char volatile xdata *)0xfd46) +#define P7WKUE (*(unsigned char volatile xdata *)0xfd47) +#define PIN_IP (*(unsigned char volatile xdata *)0xfd60) +#define PIN_IPH (*(unsigned char volatile xdata *)0xfd61) + +///////////////////////////////////////////////// +//FC00H-FCFFH +///////////////////////////////////////////////// + +#define MD3 (*(unsigned char volatile xdata *)0xfcf0) +#define MD2 (*(unsigned char volatile xdata *)0xfcf1) +#define MD1 (*(unsigned char volatile xdata *)0xfcf2) +#define MD0 (*(unsigned char volatile xdata *)0xfcf3) +#define MD5 (*(unsigned char volatile xdata *)0xfcf4) +#define MD4 (*(unsigned char volatile xdata *)0xfcf5) +#define ARCON (*(unsigned char volatile xdata *)0xfcf6) +#define OPCON (*(unsigned char volatile xdata *)0xfcf7) + +///////////////////////////////////////////////// +//FB00H-FBFFH +///////////////////////////////////////////////// + +#define COMEN (*(unsigned char volatile xdata *)0xfb00) +#define SEGENL (*(unsigned char volatile xdata *)0xfb01) +#define SEGENH (*(unsigned char volatile xdata *)0xfb02) +#define LEDCTRL (*(unsigned char volatile xdata *)0xfb03) +#define LEDCKS (*(unsigned char volatile xdata *)0xfb04) +#define COM0_DA_L (*(unsigned char volatile xdata *)0xfb10) +#define COM1_DA_L (*(unsigned char volatile xdata *)0xfb11) +#define COM2_DA_L (*(unsigned char volatile xdata *)0xfb12) +#define COM3_DA_L (*(unsigned char volatile xdata *)0xfb13) +#define COM4_DA_L (*(unsigned char volatile xdata *)0xfb14) +#define COM5_DA_L (*(unsigned char volatile xdata *)0xfb15) +#define COM6_DA_L (*(unsigned char volatile xdata *)0xfb16) +#define COM7_DA_L (*(unsigned char volatile xdata *)0xfb17) +#define COM0_DA_H (*(unsigned char volatile xdata *)0xfb18) +#define COM1_DA_H (*(unsigned char volatile xdata *)0xfb19) +#define COM2_DA_H (*(unsigned char volatile xdata *)0xfb1a) +#define COM3_DA_H (*(unsigned char volatile xdata *)0xfb1b) +#define COM4_DA_H (*(unsigned char volatile xdata *)0xfb1c) +#define COM5_DA_H (*(unsigned char volatile xdata *)0xfb1d) +#define COM6_DA_H (*(unsigned char volatile xdata *)0xfb1e) +#define COM7_DA_H (*(unsigned char volatile xdata *)0xfb1f) +#define COM0_DC_L (*(unsigned char volatile xdata *)0xfb20) +#define COM1_DC_L (*(unsigned char volatile xdata *)0xfb21) +#define COM2_DC_L (*(unsigned char volatile xdata *)0xfb22) +#define COM3_DC_L (*(unsigned char volatile xdata *)0xfb23) +#define COM4_DC_L (*(unsigned char volatile xdata *)0xfb24) +#define COM5_DC_L (*(unsigned char volatile xdata *)0xfb25) +#define COM6_DC_L (*(unsigned char volatile xdata *)0xfb26) +#define COM7_DC_L (*(unsigned char volatile xdata *)0xfb27) +#define COM0_DC_H (*(unsigned char volatile xdata *)0xfb28) +#define COM1_DC_H (*(unsigned char volatile xdata *)0xfb29) +#define COM2_DC_H (*(unsigned char volatile xdata *)0xfb2a) +#define COM3_DC_H (*(unsigned char volatile xdata *)0xfb2b) +#define COM4_DC_H (*(unsigned char volatile xdata *)0xfb2c) +#define COM5_DC_H (*(unsigned char volatile xdata *)0xfb2d) +#define COM6_DC_H (*(unsigned char volatile xdata *)0xfb2e) +#define COM7_DC_H (*(unsigned char volatile xdata *)0xfb2f) + +#define TSCHEN1 (*(unsigned char volatile xdata *)0xfb40) +#define TSCHEN2 (*(unsigned char volatile xdata *)0xfb41) +#define TSCFG1 (*(unsigned char volatile xdata *)0xfb42) +#define TSCFG2 (*(unsigned char volatile xdata *)0xfb43) +#define TSWUTC (*(unsigned char volatile xdata *)0xfb44) +#define TSCTRL (*(unsigned char volatile xdata *)0xfb45) +#define TSSTA1 (*(unsigned char volatile xdata *)0xfb46) +#define TSSTA2 (*(unsigned char volatile xdata *)0xfb47) +#define TSRT (*(unsigned char volatile xdata *)0xfb48) +#define TSDAT (*(unsigned int volatile xdata *)0xfb49) +#define TSDATH (*(unsigned char volatile xdata *)0xfb49) +#define TSDATL (*(unsigned char volatile xdata *)0xfb4A) +#define TSTH00 (*(unsigned int volatile xdata *)0xfb50) +#define TSTH00H (*(unsigned char volatile xdata *)0xfb50) +#define TSTH00L (*(unsigned char volatile xdata *)0xfb51) +#define TSTH01 (*(unsigned int volatile xdata *)0xfb52) +#define TSTH01H (*(unsigned char volatile xdata *)0xfb52) +#define TSTH01L (*(unsigned char volatile xdata *)0xfb53) +#define TSTH02 (*(unsigned int volatile xdata *)0xfb54) +#define TSTH02H (*(unsigned char volatile xdata *)0xfb54) +#define TSTH02L (*(unsigned char volatile xdata *)0xfb55) +#define TSTH03 (*(unsigned int volatile xdata *)0xfb56) +#define TSTH03H (*(unsigned char volatile xdata *)0xfb56) +#define TSTH03L (*(unsigned char volatile xdata *)0xfb57) +#define TSTH04 (*(unsigned int volatile xdata *)0xfb58) +#define TSTH04H (*(unsigned char volatile xdata *)0xfb58) +#define TSTH04L (*(unsigned char volatile xdata *)0xfb59) +#define TSTH05 (*(unsigned int volatile xdata *)0xfb5a) +#define TSTH05H (*(unsigned char volatile xdata *)0xfb5a) +#define TSTH05L (*(unsigned char volatile xdata *)0xfb5b) +#define TSTH06 (*(unsigned int volatile xdata *)0xfb5c) +#define TSTH06H (*(unsigned char volatile xdata *)0xfb5c) +#define TSTH06L (*(unsigned char volatile xdata *)0xfb5d) +#define TSTH07 (*(unsigned int volatile xdata *)0xfb5e) +#define TSTH07H (*(unsigned char volatile xdata *)0xfb5e) +#define TSTH07L (*(unsigned char volatile xdata *)0xfb5f) +#define TSTH08 (*(unsigned int volatile xdata *)0xfb60) +#define TSTH08H (*(unsigned char volatile xdata *)0xfb60) +#define TSTH08L (*(unsigned char volatile xdata *)0xfb61) +#define TSTH09 (*(unsigned int volatile xdata *)0xfb62) +#define TSTH09H (*(unsigned char volatile xdata *)0xfb62) +#define TSTH09L (*(unsigned char volatile xdata *)0xfb63) +#define TSTH10 (*(unsigned int volatile xdata *)0xfb64) +#define TSTH10H (*(unsigned char volatile xdata *)0xfb64) +#define TSTH10L (*(unsigned char volatile xdata *)0xfb65) +#define TSTH11 (*(unsigned int volatile xdata *)0xfb66) +#define TSTH11H (*(unsigned char volatile xdata *)0xfb66) +#define TSTH11L (*(unsigned char volatile xdata *)0xfb67) +#define TSTH12 (*(unsigned int volatile xdata *)0xfb68) +#define TSTH12H (*(unsigned char volatile xdata *)0xfb68) +#define TSTH12L (*(unsigned char volatile xdata *)0xfb69) +#define TSTH13 (*(unsigned int volatile xdata *)0xfb6a) +#define TSTH13H (*(unsigned char volatile xdata *)0xfb6a) +#define TSTH13L (*(unsigned char volatile xdata *)0xfb6b) +#define TSTH14 (*(unsigned int volatile xdata *)0xfb6c) +#define TSTH14H (*(unsigned char volatile xdata *)0xfb6c) +#define TSTH14L (*(unsigned char volatile xdata *)0xfb6d) +#define TSTH15 (*(unsigned int volatile xdata *)0xfb6e) +#define TSTH15H (*(unsigned char volatile xdata *)0xfb6e) +#define TSTH15L (*(unsigned char volatile xdata *)0xfb6f) + +///////////////////////////////////////////////// +//FA00H-FAFFH +///////////////////////////////////////////////// + + +///////////////////////////////////////////////// + +#endif + diff --git a/source/ctask/task.c b/source/ctask/task.c index 15e272c..0835750 100644 --- a/source/ctask/task.c +++ b/source/ctask/task.c @@ -2,83 +2,29 @@ *============================================================================ * HISTORY * Below this line, this part is controlled by TSTS. DO NOT MODIFY!! -αʱƬǶʽƽ̨(Task Step by Step Turn by Turn StructureTSTS +伪时间片嵌入式平台(Task Step by Step Turn by Turn Structure,简称TSTS) *============================================================================ ****************************************************************************/ #include "task.h" -//: -// 1:һ -/// 0оƬ flash -/// 1оƬӦü save -/// 2Ӧü jilu_save +//任务命名规则: +// 1:第一层 +/// 0驱动芯片级 flash +/// 1芯片应用级 save +/// 2任务应用级 jilu_save // -// 2:ڶ/flash/i2c/7290/ȸоƬ -// 3:/ͬоƬ/ +// 2:第二层/flash/i2c/7290/等各类芯片 +// 3:任务序号/不同的芯片/ // -void L1_task_init(TS_task *s) +void L1_task_init(TS_task *s) { -// s->en = 1; -// s->pfun = 0; + s->en = 1; s->sh = 0; s->sh_next= 0; -/// s->sh_pre= 0; s->n= 0; } - -/////ʾtask ṹʹ ɾ -#define D_task_test_01 0x20 -#define D_task_test_02 0x22 -#define D_task_test_03 0x23 -#ifdef D_debug_task_test -////>>>>>>>>>>>>>>>>>>>>>_s_task_test_>>>>>>>>>>>>>>>>>>>>>> -struct _s_task_test_ s_task_test; -void L2_task_test_init(void) -{ -ddd - L1_task_init(&s_task_test.task); - L3_task_s_go(s_task_test,D_task_init); -} - - -///L2_task_test_handle(&s_task_test); -void L2_task_test_handle(struct _s_task_test_ *s) -{ - unsigned char d = 0; - TTSS_Task_init(); - L2_task_go(D_task_test_01); - TTSS_Task_step(D_task_test_01): - if(d > 8) - { - d = 0; - L2_task_go(D_task_test_02); - L1_task_Cdelay(D_Cdelay_200us); - }else - { - d ++; - } - TTSS_Task_step(D_task_test_02): - if(d > 4) - { - d = 0; - L2_task_go(D_task_test_01); - L1_task_Tdelay(D_Tdelay_100ms); - }else - { - d ++; - } - - TTSS_Task_end(); -} -#endif//#ifdef D_debug_task_test -////<<<<<<<<<<<<<<<<<<<<<_s_task_test_<<<<<<<<<<<<<<<<<<<<<< - -/////<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ʾtask ṹʹ ɾ - - -//example : #if 0 @@ -149,7 +95,7 @@ void L2_task_voice_handle(struct _s_task_music_ *s) }else { - L2_task_go_father();//ص + L2_task_go_father();//回到 } break; //<<<<<<<<<<<<<<<<<<<<<< son function @@ -205,11 +151,11 @@ void L2_task_voice_handle(struct _s_task_music_ *s) } //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -//>>>>>>>>>>>>>>>>>>>>>¼task +//>>>>>>>>>>>>>>>>>>>>>记录task struct _s_task_4ChuShengRiQi_ { TS_task task; - unsigned char pic_id;//ID + unsigned char pic_id;//画面ID }; @@ -256,7 +202,7 @@ void L2_task_4ChuShengRiQi_handle(struct _s_task_4ChuShengRiQi_ *s) -//<<<<<<<<<<<<<<<<<<<¼task +//<<<<<<<<<<<<<<<<<<<记录task @@ -272,9 +218,9 @@ void L2_task_4ChuShengRiQi_handle(struct _s_task_4ChuShengRiQi_ *s) /***************************************************** *============================================================== -* HISTORY +* HISTORYmm * Below this line, this part is controlled by TSTS. DO NOT MODIFY!! -αʱƬǶʽƽ̨(Task Step by Step Turn by Turn StructureTSTS +伪时间片嵌入式平台(Task Step by Step Turn by Turn Structure,简称TSTS) *============================================================== ****************************************************************************/ diff --git a/source/ctask/task.h b/source/ctask/task.h index 5b08832..33cde0e 100644 --- a/source/ctask/task.h +++ b/source/ctask/task.h @@ -1,25 +1,20 @@ /******************************** 2013.7.23 add dictionary and task step by cc -:task -:task step -־:sh ( struct handle) +任务:task +任务段:task step +任务标志:sh ( struct handle) -һsh_next -,sh_nextִִsh_pre +下一个任务段sh_next +缓存的任务段,sh_next执行完后执行sh_pre ***************************/ /***************************************************** *============================================================== * HISTORY * Below this line, this part is controlled by TSTS. DO NOT MODIFY!! -αʱƬǶʽƽ̨(Task Step by Step Turn by Turn StructureTSTS +伪时间片嵌入式平台(Task Step by Step Turn by Turn Structure,简称TSTS) *============================================================== - -20190217 and step01 Ұdelay_nű - - - ****************************************************************************/ #ifndef _TASK_H_ @@ -29,258 +24,135 @@ #include "task.h" #include "tick.h" -typedef struct +typedef struct _ts_task { + volatile UN_TYPE en; //关闭任务,也可以理解为暂停,但是使用idelay的地方时间在后台计数任务在延时到了后才暂停,而的delay相当于暂停 + volatile UN_TYPE sh; //当前任务段 + volatile UN_TYPE sh_next; //下一个任务段,并不代表一定下一任务段一定是他,有可能中间插入延时等任务段 + volatile UN_TYPE sh_pre; //前一个任务段,一般为调出缓存任务段使用 vU32 n; -/// volatile UN_TYPE en; //ر,ҲΪͣ,ʹidelayĵطʱں̨ʱ˺ͣ,delay൱ͣ - volatile UN_TYPE sh; //ǰ - volatile UN_TYPE sh_next; //һ,һһһ,пмʱ -/// volatile UN_TYPE sh_pre; //ǰһ,һΪʹ }TS_task; -//extern TS_task ts_task_stcadc; -#define D_task_close 0 +#define D_task_close 0 +#if 0 #define D_task_Tdelay 0x01 #define D_task_stop 0x04 #define D_task_Cdelay 0x09 #define D_task_init 0x10 #define D_task_quit 0xf0 +#else -#define TTS_for_add(i,start,len) for((i) = (start); (i) < (len); (i) ++){ -#define TTS_for_add_end() } - - +#define D_task_init 0xf0 +#define D_task_Tdelay 0xf1 +#define D_task_Cdelay 0xf2 +#define D_task_stop 0xf3 +#define D_task_quit 0xf4 +#endif -//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ڲ s->task +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>内部调用 s->task #define L2_task_delay_over() s->task.sh = s->task.sh_next -#define L2_task_go(next) s->task.sh = next -#define L2_task_en(onf) s->task.en = onf +#define L2_task_go(next) s->task.sh = next; +//#define L2_task_gogogo(next) s->task.sh = next; +#define L2_task_en(onf) s->task.en = onf; -#define L2_task_busy(s) (D_task_close != s.task.sh) -#define L2_task_free(s) (D_task_close == s.task.sh) +#define L2_task_busy(s) (D_task_close != s.task.sh) +#define L2_task_free(s) (D_task_close == s.task.sh) -#define L2_task_go_father() s->task.sh = s->task.sh_pre -#define L2_task_go_son(fun,pre) s->task.sh = fun;s->task.sh_pre = pre +#define L2_task_go_father() s->task.sh = s->task.sh_pre; +#define L2_task_go_son(fun,pre) s->task.sh = fun;s->task.sh_pre = pre; - -//>task ʱ>>>>>>>>>>>>>>TTSS -/// D_task_Tdelay == task timer delay ҪиʱԪ time0ʱ -/// Delay_cycle ʱ̵,һѭȡѭʱ,Tdelay,Cdelayʱʱ +/// task 定时>>>>>>>>>>>>>>TTSS +/// D_task_Tdelay == task timer delay 需要额外有个定时单元 和time0定时器设置相关 +/// Delay_cycle适用于 时间短的,其一次循环取决于主循环的时间,和Tdelay比,Cdelay长时间计时误差大 #define L2_task_switch_default_idelay(); \ case D_task_Tdelay:\ - if (s_nos_tick.t_10ms >= s->task.n)\ + if (s_nos_tick.jiffies >= s->task.n)\ {\ L2_task_delay_over();\ }\ break; \ - case D_task_Cdelay:\ - s->task.n--; \ - if (s->task.n == 0) \ - { \ - s->task.n = 0; \ - L2_task_delay_over();\ - } \ - break;\ - default : \ - break; -#if 0 - -#define L2_task_switch_default_idelay2(); \ - case D_task_Tdelay:\ - if (s_nos_tick.t_10ms >= s->task.n)\ - {\ + case D_task_Cdelay:\ + s->task.n--; \ + if (s->task.n == 0) \ + { \ + s->task.n = 0; \ L2_task_delay_over();\ - }else\ - {\ - L2_time_beat_heart(D_TBH_ch0,3,'i');\ - }\ - break; \ - case D_task_Cdelay:\ - s->task.n--; \ - if (s->task.n == 0) \ - { \ - s->task.n = 0; \ - L2_task_delay_over();\ - } \ - break;\ + } \ + break;\ default : \ break; - - -//ڵȴĹüʱ,ʱfunxx -//ڵȴĿʱԶʱʾһЩϢ -//ִ - -#define L2_task_switch_fun_idelay(invent,ch) L2_task_switch_default_idelay() -#define L2_task_switch_fun_idelay0000(chhh,invent,funxx); \ - case D_task_Tdelay:\ - if (s_nos_tick.t_10ms >= s->task.n)\ - {\ - L2_task_delay_over();\ - }else\ - {\ - L2_time_beat_heart_fun(chhh,invent,funxx);\ - }\ - break; \ - case D_task_Cdelay:\ - s->task.n--; \ - if (s->task.n == 0) \ - { \ - s->task.n = 0; \ - L2_task_delay_over();\ - } \ - break;\ - default : \ - break; - - - - -//ڵȴĹüʱ,ʱʾַch -//ڵȴĿʱԶʱʾһЩϢch -// ͨchĿǰеĽ׶κϢ -#define L2_task_switch_flag_idelay(invent,ch) L2_task_switch_default_idelay() -#define L2_task_switch_flag_idelay000(invent,ch); \ - case D_task_Tdelay:\ - if (s_nos_tick.t_10ms >= s->task.n)\ - {\ - L2_task_delay_over();\ - }else\ - {\ - L2_time_beat_heart(D_TBH_ch0,invent,ch);\ - }\ - break; \ - case D_task_Cdelay:\ - s->task.n--; \ - if (s->task.n == 0) \ - { \ - s->task.n = 0; \ - L2_task_delay_over();\ - } \ - break;\ - default : \ - break; - - -TTSS_Task_init, Highlight -TTSS_Task_step, Highlight -TTSS_Task_end, Highlight -L2_task_go, Highlight -L1_task_Tdelay, Highlight -L1_task_Cdelay, Highlight -L2_task_go, Highlight - - - - -#endif - - //if(delay_n+s_time0.t_10ms > 655340) //{s_time0.t_10ms = 0;} - -//fix 201312 ֹs_time0.t_10ms -// з -//>>L2_task_delayһҪL2_task_go֮ +//fix 201312 防止s_time0.t_10ms 溢出 +// 但是有风险 +//>>L2_task_delay一定要放在L2_task_go之后 #define L1_task_Tdelay(delay_n) s->task.sh_next = s->task.sh;\ s->task.sh = D_task_Tdelay;\ - s->task.n = (delay_n) + s_nos_tick.t_10ms; + s->task.n = delay_n + s_nos_tick.jiffies; -//>>L2_task_delayһҪL2_task_go֮ +//>>L2_task_delay一定要放在L2_task_go之后 #define L1_task_Cdelay(delay_n) s->task.sh_next = s->task.sh;\ - s->task.sh = D_task_Cdelay;\ - s->task.n = (delay_n) - - -//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ڲ s->task - -//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ⲿ + s->task.sh = D_task_Cdelay;\ + s->task.n = delay_n + +#define L2_task_go_Tdelay(next,delay_n) do{ \ + if(delay_n) \ + { \ + s->task.sh_next = next;\ + s->task.sh = D_task_Tdelay;\ + s->task.n = (delay_n) + s_nos_tick.jiffies; \ + } \ + else \ + { \ + s->task.sh = next; \ + } \ + }while(0) + +#define L2_task_go_Cdelay(next,delay_n) do{ \ + if(delay_n) \ + { \ + s->task.sh_next = next;\ + s->task.sh = D_task_Cdelay;\ + s->task.n = (delay_n); \ + } \ + else \ + { \ + s->task.sh = next; \ + } \ + }while(0) + +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 外部调用 +#define L3_task_s_go(s,next) (s).task.sh = next; #define L2_task_s_go_son(s,fun,pre) (s).task.sh = fun;(s).task.sh_pre = pre; - #define L3_task_s_time_start(s,delay) (s).task.n = delay+s_nos_tick.t_1s; -#define L3_task_s_go(s,next) (s).task.sh = next; #define L3_task_s_en(s,onf) (s).task.en = onf; -//L1_task_goout(s_task_music.task,D_task_close); - #define L3_task_s_busy(s) (D_task_close != (s).task.sh) #define L3_task_s_free(s) (D_task_close == (s).task.sh) - #define L3_task_s_step(s) ((s).task.sh) - -#define D_task_uc unsigned char -#define D_task_ui unsigned int ///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -#define TTSS_Task_init() switch(s->task.sh){\ - case D_task_init - -#define TTSS_Task_step(step) break;\ - case (step) -#define TTSS_step01(step) break;case (step) -#define TTSS_step02(step) break;case (step) -#define TTSS_step03(step) break;case (step) -#define TTSS_step04(step) break;case (step) -#define TTSS_step05(step) break;case (step) -#define TTSS_step06(step) break;case (step) -#define TTSS_step07(step) break;case (step) -#define TTSS_step08(step) break;case (step) -#define TTSS_step09(step) break;case (step) -#define TTSS_step10(step) break;case (step) -#define TTSS_step11(step) break;case (step) -#define TTSS_step12(step) break;case (step) - - - - - - - -#define TTSS_Task_end(); break;\ - L2_task_switch_default_idelay();} - - +#define TTSS_Task_init(); switch(s->task.sh)\ + {\ + case D_task_init:{\ + +#define TTSS_Task_step(step); break;}\ + case (step):{ +#define TTSS_Task_end(); break;}\ + L2_task_switch_default_idelay();} +#define TTSS_Task_fun(step); break;}\ + case (step):{ //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - extern void L1_task_init(TS_task *s); - - -////>>>>>>>>>>>>>>>>>>>_s_task_test_>>>>>>>>>>>>>>>>>>>>>>>> - -#ifdef D_debug_task_test - -struct _s_task_test_ -{ - TS_task task; -}; -extern struct _s_task_test_ s_task_test; -extern void L2_task_test_handle(struct _s_task_test_ *s); -extern void L2_task_test_init(void); -#else - -#define L2_task_test_handle(x); -#define L2_task_test_init(); - -#endif//#ifdef D_debug_task_test - -////<<<<<<<<<<<<<<<<<<<_s_task_test_<<<<<<<<<<<<<<<<<<<<<<<< - - - - - - - - #endif//_TASK_H_ /***************************************************** *============================================================== -* HISTORY +* HISTORY * Below this line, this part is controlled by TSTS. DO NOT MODIFY!! -αʱƬǶʽƽ̨(Task Step by Step Turn by Turn StructureTSTS +伪时间片嵌入式平台(Task Step by Step Turn by Turn Structure,简称TSTS) *============================================================== ****************************************************************************/ diff --git a/source/ctask/tick.c b/source/ctask/tick.c index 0d3d01d..3644450 100644 --- a/source/ctask/tick.c +++ b/source/ctask/tick.c @@ -7,127 +7,42 @@ * History * 2009.05.27 ver 1.00 Prelimnary version, first Release *2017.01.10 ver 1.10 rename tick.h tick.c - 2019.03.11 ver 1.30 ʱʱΪ25ms ڽܸŵ ****************************************************************************************/ -/***************************************************** -*============================================================================ -* HISTORY -* Below this line, this part is controlled by TSTS. DO NOT MODIFY!! -αʱƬǶʽƽ̨(Task Step by Step Turn by Turn StructureTSTS -*============================================================================ -****************************************************************************/ - #include "tick.h" - struct _s_nos_tick_ s_nos_tick; - - -#ifdef D_use_tick_fum +/********************************************************************************************************* +* Function Name: timer0Isr +* Description: TIMER0 中断处理函数 +* Input: ? +* Output: ? +* Return: ? +*********************************************************************************************************/ void L1_tick_init(void) { - s_nos_tick.tp_count = 0; - - s_nos_tick.n_stamp = 0; - s_nos_tick.t1s_heatbeart= 0; - /***** - s_nos_tick.t1s_flag[0] = 0; - s_nos_tick.t1s_flag[1] = 0; - s_nos_tick.t1s_flag[2] = 0; - s_nos_tick.t1s_flag[3] = 0; - s_nos_tick.t1s_flag[4] = 0; - s_nos_tick.t1s_flag[5] = 0; - if(L2_tick_time_interval(n_stamp,7*D_Tdelay_1s)) - {// ʱ - - - L2_tick_time_stamp(s->t_stamp); - - - ********/ - - s_nos_tick.t_10ms = 0; + s_nos_tick.jiffies = 0; s_nos_tick.t_1s = 0; - -/// s_nos_tick.flag_1s = 0; - -/// s_nos_tick.t_n = 0; - //s_nos_tick.tmp = 0; - //L0_timer0_ONF(1); -} - -/// ʱ 10ms һж -/// ʱ 25ms һж -void L1_tick_tick (void) -{ /// 65535*65535 /3600/24/365=139nian/s=1.39nian/10ms - ///൱1.39t_10ms ڵعϵͳ ȫ - // 4,294,836,225 = 65535*65535 ;3600*24*60*60 = 31,536,000/ - s_nos_tick.tp_count++; - s_nos_tick.t_10ms ++;//D_led_D1_REV(); 20160522 ֤ - if(s_nos_tick.t_10ms%D_TIMER0_1S_COUNT == 0) - {// 65535*65535/24/60/60/356/10 =12.7 - s_nos_tick.t_1s ++;//// 65535*65535/24/60/60/356/10 =12.7 - s_nos_tick.flag_1s2 = 1; - s_nos_tick.t1s_heatbeart = 1; - } -//<<<<<<<<<<<<<<<<<<<<<< + s_nos_tick.t1s_heatbeart= 0; } -#else -#endif -#if 0 +//JIFFIES回绕问题没有解决 参见 linux time_after宏定义 void L1_tick_tick (void) -{ - s_nos_tick.t_n++; - if (s_nos_tick.t_n >= D_TIMER0_10MS_COUNT)// 5500--- 100 10s--556 - /// s 5ms 65535*65535 /3600/24/365=139nian/s - // 4,294,836,225 = 65535*65535 ;3600*24*60*60 = 31,536,000/ - // fixme:˴ һbug:) +{ + ///65535*65535/3600/24/365=139nian/s=1.39nian/10ms + ///相当于1.39年后t_10ms 溢出,对于电池供电的系统而言 完全可以满足 + // 4,294,836,225 = 65535*65535 ;3600*24*60*60 = 31,536,000秒/年 + //s_nos_tick.t_50ms ++;//D_led_D1_REV(); 20160522验证 + s_nos_tick.jiffies++; + if(s_nos_tick.jiffies % HZ == 0) { - s_nos_tick.t_10ms ++;//D_led_D1_REV(); 20160522 ֤ - if(s_nos_tick.t_10ms%D_TIMER0_1S_COUNT == 0) - {// 65535*65535/24/60/60/356/10 =12.7 - s_nos_tick.t_1s ++;// - - // led_red =~led_red; - //s_nos_tick.t1s_flag[0] = 1; - //s_nos_tick.t1s_flag[1] = 1; - //s_nos_tick.t1s_flag[2] = 1; - //s_nos_tick.t1s_flag[3] = 1; - //s_nos_tick.t1s_flag[4] = 1; - //s_nos_tick.t1s_flag[5] = 1; - s_nos_tick.flag_1s = 1; - s_nos_tick.t1s_heatbeart = 1; - } - s_nos_tick.t_n = 0; + // 65535*65535/24/60/60/356/10 =12.7年 + s_nos_tick.t_1s ++; + s_nos_tick.t1s_heatbeart = 1; } - /******************* -// 0.2mm 4/0.2 = 20 20/60s = 333ms/maicong -// 0.2mm 60s 60 100 ms -// 0.2 6000ms -// ƽʱΪ1 ˮһΪ0 -// rain = 1;Ҫijʼ - if(0 == rain) - { - if(1 == s_rain.temp) - {// ````\___ - s_rain.pool = s_rain.t; - s_rain.all ++; - s_rain.t = 0; - } - s_rain.temp = 0; - }else - { - s_rain.temp = 1; - } - s_rain.t ++; - - ******/ -//<<<<<<<<<<<<<<<<<<<<<< } -#endif + diff --git a/source/ctask/tick.h b/source/ctask/tick.h index dafeb42..bc47af5 100644 --- a/source/ctask/tick.h +++ b/source/ctask/tick.h @@ -8,202 +8,80 @@ * 2009.05.27 ver 1.00 Prelimnary version, first Release *2017.01.10 ver 1.10 rename tick.h tick.c ******************************************************************************/ -/***************************************************** -*============================================================================ -* HISTORY -* Below this line, this part is controlled by TSTS. DO NOT MODIFY!! -αʱƬǶʽƽ̨(Task Step by Step Turn by Turn StructureTSTS -*============================================================================ -****************************************************************************/ #ifndef __tick_H #define __tick_H #include "../clib/Type.h" -//#include "../bsp/type_hs.h" #include "../msp/time.h" -#define D_use_tick_fum - struct _s_nos_tick_ { - vU32 tp_count; //һνʱ䵽Ŀǰtick -/// vU32 sys_clock; -// vU32 t_n; // noosϵͳʱСԪ - vU32 t_10ms; // noos ϵͳʱ10m -#ifdef D_use_tick_fum - - - //volatile INT32U t_100ms; + vU32 jiffies; // noos系统定时器最小计时单元 vU32 t_1s; -/// vU32 t_10s; -// vU32 t_60s; - vU8 flag_1s; - vU8 flag_1s2; -/// volatile INT32U tmp; -/// volatile INT32U time_left; -/// volatile INT32U h; -/// volatile INT32U m; - vU32 n_stamp; -// vU32 t1s_flag[6]; //fixme: INT32U ݲͬϵͳ - //volatile unsigned char t1s_flag; -/// vU8 ts_flag; - vU32 n_stamp3; -#endif - vU8 t1s_heatbeart; //noos ϵͳʱʱ̱־,Ҫ + vU8 t1s_heatbeart; //noos 系统定时器整秒时刻标志,需要软件清除 }; extern struct _s_nos_tick_ s_nos_tick; -#ifdef D_timer0_10ms -//10ms ʹã10msСʱ޷ʹ -#define D_Tdelay_ms D_TIMER0_10MS_COUNT//D_TIMER0_10MS_COUNT -#define D_Tdelay_10ms 2 -#define D_Tdelay_20ms (2+D_Tdelay_ms) -#define D_Tdelay_30ms (3+D_Tdelay_ms) -#define D_Tdelay_40ms (4+D_Tdelay_ms) -#define D_Tdelay_50ms (5+D_Tdelay_ms) -#define D_Tdelay_60ms (6+D_Tdelay_ms) - -#define D_Tdelay_80ms (8+D_Tdelay_ms) - - -#define D_Tdelay_100ms (10+D_Tdelay_ms) - -#else -//10ms ʹã10msСʱ޷ʹ -#define D_Tdelay_ms D_TIMER0_10MS_COUNT//D_TIMER0_10MS_COUNT -#define D_Tdelay_10ms 1 -#define D_Tdelay_20ms (0+D_Tdelay_ms) -#define D_Tdelay_30ms (0+D_Tdelay_ms) -#define D_Tdelay_40ms (2+D_Tdelay_ms) -#define D_Tdelay_50ms (2+D_Tdelay_ms) -#define D_Tdelay_60ms (2+D_Tdelay_ms) - -#define D_Tdelay_80ms (3+D_Tdelay_ms) - -#define D_Tdelay_100ms (4+D_Tdelay_ms) - +#if(TYPE_JIFFIES_5MS == D_sys_Jiffies) + #define HZ 200 +#elif(TYPE_JIFFIES_10MS == D_sys_Jiffies) + #define HZ 100 +#elif(TYPE_JIFFIES_25MS == D_sys_Jiffies) + #define HZ 40 #endif - - -#define D_Tdelay_200ms (D_Tdelay_100ms*2) -#define D_Tdelay_300ms (D_Tdelay_100ms*3) -#define D_Tdelay_400ms (D_Tdelay_100ms*4) -#define D_Tdelay_500ms (D_Tdelay_100ms*5) - -#define D_Tdelay_600ms (D_Tdelay_100ms*6) -#define D_Tdelay_700ms (D_Tdelay_100ms*7) -#define D_Tdelay_800ms (D_Tdelay_100ms*8) -#define D_Tdelay_900ms (D_Tdelay_100ms*9) - - -#define D_Tdelay_1s (D_Tdelay_100ms*10) -#define D_Tdelay_1s2 (D_Tdelay_100ms*12) -#define D_Tdelay_1s5 (D_Tdelay_100ms*15) -#define D_Tdelay_2s (D_Tdelay_100ms*20) -#define D_Tdelay_2s5 (D_Tdelay_100ms*25) -#define D_Tdelay_3s (D_Tdelay_100ms*30) -#define D_Tdelay_5s (D_Tdelay_100ms*50) -#define D_Tdelay_8s (D_Tdelay_100ms*80) -#define D_Tdelay_9s (D_Tdelay_100ms*90) -#define D_Tdelay_10s (D_Tdelay_100ms*100) - -#define D_Tdelay_1min (D_Tdelay_1s*60) -#define D_Tdelay_1h (D_Tdelay_1min*60) -#define D_Tdelay_1day (D_Tdelay_1h*24) -#define D_TIMER0_1S_COUNT 100 -//#define D_10mS 1//D_TIMER0_10MS_COUNT -//#define D_100mS (D_10mS*10) -//#define D_1S (D_10mS*100) - - - - -//>> ʱ: ʼ ʱ䵽 -// L0_nos_tick10ms_start(s->times); ʼʼs->times 10msΪһλ -// if( L0_nos_tick10ms_interval(s->times) < 20)// s->times ִ20κ,Ҳ ʱ20*10m - - -// -#define L0_nos_tick10ms_start(start_n) start_n = s_nos_tick.t_10ms -#define L0_nos_tick10ms_interval(start_n) (s_nos_tick.t_10ms - start_n) - +#define JIFFIES (1000/HZ) + +#define D_sys_now (s_nos_tick.jiffies) +//D_sys_delay_msec以jiffies为最小计时单位,jiffies是10ms为例,参数n=12ms时,最终延时了20ms +#define D_sys_delay_msec(n) do{ \ + if(n>0) \ + { \ + U32 mstmp = D_sys_now; \ + while(D_sys_now - mstmp < (((n)-1)/JIFFIES) + 1); \ + } \ + }while(0) + +#define D_Tdelay_Msec(n) (((n)-1) / JIFFIES + 1) +#define D_Tdelay_Sec(n) (((n)*1000-1) /JIFFIES + 1) +#define D_Tdelay_5ms ((5-1) / JIFFIES + 1) +#define D_Tdelay_10ms ((10-1) / JIFFIES + 1) +#define D_Tdelay_100ms ((100-1) / JIFFIES + 1) +#define D_Tdelay_200ms ((200-1) / JIFFIES+ 1) +#define D_Tdelay_300ms ((300-1) / JIFFIES + 1) +#define D_Tdelay_400ms ((400-1) / JIFFIES + 1) +#define D_Tdelay_1s (1 * HZ) +#define D_Tdelay_2s (2 * HZ) +#define D_Tdelay_3s (3 * HZ) +#define D_Tdelay_4s (4 * HZ) +#define D_Tdelay_5s (5 * HZ) +#define D_Tdelay_10s (10 * HZ) +#define D_Tdelay_15s (15 * HZ) + +#define D_Tdelay_1min (1 * 60 * HZ) +#define D_Tdelay_10min (10 * 60 * HZ) +#define D_Tdelay_1h (60 * 60 * HZ) +#define D_Tdelay_1day (24 * 60 * 60 * HZ) + + +//必须配对 +#define L0_nos_tick10ms_start(start_n) start_n = s_nos_tick.t_50ms +#define L0_nos_tick10ms_interval(start_n) (s_nos_tick.t_50ms - start_n) #define L0_nos_tick1s_start(start_n) start_n = s_nos_tick.t_1s #define L0_nos_tick1s_interval(start_n) (s_nos_tick.t_1s - start_n) - -//>>>// -#define L2_tick_time_stamp(time_stamp) time_stamp = s_nos_tick.t_10ms; -#define L2_tick_time_interval(time_stamp,time_overflow) (( s_nos_tick.t_10ms - time_stamp) > time_overflow) +//>>>//必须配对 +#define L2_tick_time_stamp(time_stamp) time_stamp = s_nos_tick.t_50ms; +#define L2_tick_time_interval(time_stamp,time_overflow) (( s_nos_tick.t_50ms - time_stamp) > time_overflow) #define L3_tick_interval(x) L2_tick_time_interval(s_nos_tick.n_stamp,x) #define L2_tick_stamp() L2_tick_time_stamp(s_nos_tick.n_stamp); - -//>>>ʾ: -#if 0 -{ - case D_task_init:// - Lc_print_buf(" \r\n YL_ init"); - s->step = D_AT; - L0_esp_open(); - L2_task_go(D_task_YL_ready); - s_uart0_rec.ok = 0; - L2_tick_time_stamp(s->t_stamp); - // L1_task_Tdelay(1*D_Tdelay_1s); //Լ6s - break; - case D_task_YL_ready: - if(1 == s_uart0_rec.ok) - { - if(strstr(s_uart0_rec.array,"ready") != NULL) - { - - Ldi_print("ready..\r\n"); - s->step = D_AT; - L2_task_go(D_task_YL_ask); - } - s_uart0_rec.ok = 0; - } - if(L2_tick_time_stamp(s->t_stamp,1*D_Tdelay_1s)) - {// ʱ - L0_esp_close(); - Ldi_print("fail esp restart.\r\n"); - L2_task_go(D_task_init); - L1_task_Tdelay(2*D_Tdelay_1s); - } - break; -} -#endif - -// t_10ms ,t_10msΪ1ʱΪ(D_TIMER0_10MS_COUNT*ʱ) -/// #define D_TIMER0_10MS_COUNT 1 //ʱΪ 10msһж -#ifdef D_use_tick_fum extern void L1_tick_init(void); extern void L1_tick_tick (void); -#else - - -#define L1_tick_init() -#define L1_tick_tick() s_nos_tick.t_10ms ++; - -#endif - - - -//L2_time_beat_heart(D_TBH_ch1,2,'t') -#define D_TBH_ch0 0 -#define D_TBH_ch1 1 -#define D_TBH_ch2 2 -#define D_TBH_ch3 3 -#define D_TBH_ch4 4 -#define D_TBH_ch5 5 -extern void L2_time_beat_heart(vU32 ch,U8 invent,U8 s); -//void L2_time_beat_heart_fun(INT32U ch,unsigned char invent,void *fun(void)); -extern void L2_time_beat_heart_fun(vU32 ch,U8 invent,void (*fun)(void)); - #endif /* end __tick_H */ /***************************************************************************** ** End Of File diff --git a/source/debug/cc_as_stc01_main.ini b/source/debug/cc_as_stc01_main.ini deleted file mode 100644 index 7636777..0000000 --- a/source/debug/cc_as_stc01_main.ini +++ /dev/null @@ -1,7 +0,0 @@ -//MODE COM4 9600,0,8,1 -//ASSIGN COM4 < SIN > SOUT -// please "dir vtreg" and show the -MODE COM2 115200,0,8,1 -ASSIGN COM2 < S0IN > S0OUT -//MODE COM1 9600,0,8,1 -//ASSIGN COM1 < S0IN > S0OUT diff --git a/source/debug/cc_ls_03_debug.ini b/source/debug/cc_ls_03_debug.ini deleted file mode 100644 index 87a0def..0000000 --- a/source/debug/cc_ls_03_debug.ini +++ /dev/null @@ -1,6 +0,0 @@ -//MODE COM4 9600,0,8,1 -//ASSIGN COM4 < SIN > SOUT -MODE COM6 9600,0,8,1 -ASSIGN COM6 < S0IN > S0OUT -//MODE COM1 9600,0,8,1 -//ASSIGN COM1 < S0IN > S0OUT diff --git a/source/debug/debug.ini b/source/debug/debug.ini deleted file mode 100644 index 203177f..0000000 --- a/source/debug/debug.ini +++ /dev/null @@ -1,123 +0,0 @@ -MODE COM1 9600,0,8,1 -//assign com1 SOUT -ASSIGN COM1 < SIN > SOUT -//ASSIGN WIN SOUT -KILL FUNC * -KILL BUTTON * - - -//swatch(0.5) -DEFINE BUTTON "adc", "adc()" -signal void adc (void) { -// while (1) { /* repeat forever */ - P14= 0; /* set PORTA bit 0 */ - printf("adc is on\n"); - twatch(500); - //} /* repeat */ -} - -DEFINE BUTTON "k1 ", "k1()" -signal void k1 (void) { -P2.0= 0; - //P20= 0; - printf("K1 down\n"); - swatch(0.17); - P2.0= 1; - //P20= 1; - swatch(0.17); - printf("K1 up\n"); -} - - -DEFINE BUTTON "k2 ", "k2()" -signal void k2 (void) { - P2.1= 0; - //P21= 0; - printf("K2 down\n"); - swatch(0.17); - P2.1= 1; - //P21= 1; - swatch(0.17); - printf("K2 up\n"); -} - - -DEFINE BUTTON "k3 ", "k3()" -signal void k3 (void) { - P2.2= 0; - //P22= 0; - printf("K3 down\n"); - swatch(0.07); - P2.2= 1; - //P22= 1; - swatch(0.07); - printf("K3 up\n"); -} - - - - -DEFINE BUTTON "kx4 enter/", "kx4()" -signal void kx4 (void) { - - P13= 0; /* set PORTA bit 0 */ - printf("Kx4 down\n"); - swatch(0.07); - - P13= 1; - swatch(0.07); - printf("Kx4 up\n"); -} - -DEFINE BUTTON "<-- kx1_left ", "kx1_left()" -signal void kx1_left (void) { - - P12= 0; /* set PORTA bit 0 */ - - printf("kx1_left down\n"); - swatch(0.07); - P11= 0; - swatch(0.07); - - P12= 1; - swatch(0.07); - P11= 1; - swatch(0.07); - printf("kx1_left up\n"); - -} - -DEFINE BUTTON "kx1_right--> ", "kx1_right()" -signal void kx1_right (void) { - - P11= 0; /* set PORTA bit 0 */ - - printf("kx1_right down\n"); - swatch(0.07); - P12= 0; - swatch(0.07); - - P11= 1; - swatch(0.07); - P12= 1; - swatch(0.07); - printf("kx1_right up\n"); - -} -DEFINE BUTTON "My Registers", "MyRegs()" - -FUNC void MyRegs (void) { - printf ("---------- MyRegs() ----------\n"); - printf (" R4 R8 R9 R10 R11 R12\n"); - printf (" %04X %04X %04X %04X %04X %04X\n", - R0, R1, R2, R3, R4, R5); - printf ("------------------------------\n"); -} - - - -//bs write P3,1,"check_moto()"//дp2Ķִ signal -//signal void check_moto (void) - - - diff --git a/source/debug/debug2.ini b/source/debug/debug2.ini deleted file mode 100644 index 3c56f97..0000000 --- a/source/debug/debug2.ini +++ /dev/null @@ -1,45 +0,0 @@ -MODE COM1 9600,0,8,1 -//assign com1 SOUT -ASSIGN COM1 < S0IN > S0OUT -//ASSIGN WIN S0OUT -//S0TIME = 0 -KILL FUNC * -KILL BUTTON * -// - //AA 70 70 71 72 72 75 74 76 77 78 79 24 55 -DEFINE BUTTON "master_send01","master_send01()" -signal void master_send01(void) { - - printf("DD\n"); -// #define rU0IIR rU0FCR /* share the same address */ - - //U0IIR =0x02; -// U0THR = 0x33; U0IIR =0x04; twatch(1000); - U0RBR = 0x34; U0IIR =0x04; twatch(1000); - -//U0RBR=0xaa;twatch(1000); -//U0RBR=0x70;twatch(1000); -//U0RBR=0x70;twatch(1000); -//U0RBR=0x71;twatch(1000); - -} - -DEFINE BUTTON "master_send021","master_send021()" -signal void master_send021(void) { - -// printf("DD\n"); -// #define rU0IIR rU0FCR /* share the same address */ - - //U0IIR =0x02; -// U0THR = 0x33; U0IIR =0x04; twatch(1000); - U0RBR = 0xAA; twatch(1000); - -U0RBR=0x66;twatch(1000); -//U0RBR=0x70;twatch(1000); -//U0RBR=0x70;twatch(1000); -//U0RBR=0x71;twatch(1000); - -} - - - diff --git a/source/debug/debug_M3sfy.ini b/source/debug/debug_M3sfy.ini deleted file mode 100644 index 3e88329..0000000 --- a/source/debug/debug_M3sfy.ini +++ /dev/null @@ -1,83 +0,0 @@ -MODE COM4 115200,0,8,1 -//assign com1 SOUT -ASSIGN COM4 < S1IN > S1OUT -//ASSIGN WIN S0OUT -//S0TIME = 0 -KILL FUNC * -KILL BUTTON * - -DEFINE BUTTON "A","key_up2()" -signal void key_up2(void) -{ - //s_task_key_up.sim = 1; - s_task_key_up.down = 1; - twatch(1000); - s_task_key_up.up = 1; - //swatch(0.1); - //swatch (0.05); /* wait 50 milliseconds */ - -// swatch(0.1);//twatch(1000); -} - - -DEFINE BUTTON "V","key_down2()" -signal void key_down2(void) -{ - //s_task_key_up.sim = 1; - s_task_key_down.down = 1; - - twatch(1000); - - s_task_key_down.up = 1; - //swatch(0.1); -// swatch(0.1);//twatch(1000); - -} - - -DEFINE BUTTON "key_upanddown","key_upanddown()" -signal void key_upanddown(void) -{ - //s_task_key_up.sim = 1; - s_task_key_down.down = 1; - // twatch(10); - s_task_key_up.down = 1; - twatch(1000); - s_task_key_down.up = 1; -// twatch(10); - s_task_key_up.up = 1; - //swatch(0.1);// - twatch(100); -} - - - -DEFINE BUTTON "key_ent2","key_ent2()" -signal void key_ent2(void) -{ - //s_task_key_up.sim = 1; - s_task_key_ent.down = 1; - twatch(1000); - s_task_key_ent.up = 1; - -} - - - - -DEFINE BUTTON "key_clear","key_clear()" -signal void key_clear(void) -{ - //s_task_key_up.sim = 1; - s_task_key_up.down = 0; - s_task_key_down.down = 0; - s_task_key_ent.down = 0; - - s_task_key_up.up = 0; - s_task_key_down.up = 0; - s_task_key_ent.up = 0; - twatch(1000); - -} - - diff --git a/source/debug/debug_M3sfy2.ini b/source/debug/debug_M3sfy2.ini deleted file mode 100644 index 98bd76d..0000000 --- a/source/debug/debug_M3sfy2.ini +++ /dev/null @@ -1,54 +0,0 @@ -MODE COM4 115200,0,8,1 -//assign com1 SOUT -ASSIGN COM4 < S1IN > S1OUT -//ASSIGN WIN S0OUT -//S0TIME = 0 -KILL FUNC * -KILL BUTTON * - -//#include "key_ext.h" -DEFINE BUTTON "A","key_up2()" -signal void key_up2(void) -{ - s_task_key_ext.value = 1; - twatch(100); -} - - -DEFINE BUTTON "V","key_down2()" -signal void key_down2(void) -{ - s_task_key_ext.value = 2; - twatch(10); -} - -DEFINE BUTTON "key_ent2","key_ent2()" -signal void key_ent2(void) -{ - s_task_key_ext.value = 0x3; - twatch(10); -} - - -DEFINE BUTTON "Setup","key_setup()" -signal void key_setup(void) -{ - s_task_key_ext.value = 0x12; - twatch(10); -} - -DEFINE BUTTON "Adc100","Adc100()" -signal void Adc100(void) -{ - s_adc_read.uiV = 100; - twatch(10); -} - - -DEFINE BUTTON "Adc5000","Adc5000()" -signal void Adc5000(void) -{ - s_adc_read.uiV = 5000; - twatch(10); -} - diff --git a/source/debug/debug_app.c b/source/debug/debug_app.c deleted file mode 100644 index ef467ca..0000000 --- a/source/debug/debug_app.c +++ /dev/null @@ -1,130 +0,0 @@ -/***************************************************************************** - * uart.c: UART API file for NXP LPC17xx Family Microprocessors - * - * Copyright(C) 2013, cc - * All rights reserved. - * - * History - * 2013.05.24 ver 1.00 Prelimnary version, first Release - - * -******************************************************************************/ - -#include "target_cfg.h" -#include "type.h" -#include "time.h" -#include "uart.h" -//#include "..\Sensor.h" - -#include "debug_app.h" -struct _s_task_debug_led_ s_task_debug_led; - -void L2_task_debug_led_init(void) -{ - D_P1_OUT(15); - D_P1_OFF(15); //ָʾ - D_P1_OUT(16); - D_P1_OFF(16); //ָʾ - - while(0) - { - D_P1_OFF(15) ; - L0_delay_ms(600); - D_P1_ON(15) ; - L0_delay_ms(600); - L0_debugS_uc('a'); L0_USART_print(UART_debug,"\r\n"); - // L2_oled_main(); - } - L3_task_s_go(s_task_debug_led,D_task_debug_led_init); - - -} - -void L2_task_debug_led_handdle(struct _s_task_debug_led_ *s) -{ - switch(s->task.sh) - { - - case D_task_debug_led_init:// - L0_USART_print(UART_debug,"\r\n s_task_debug_led "); - L2_task_go(D_task_debug_led_key); - break; - case D_task_debug_led_key : - D_P1_ON(15); - L0_debugS_uc('^'); - L2_task_go(D_task_debug_led_key2); - L1_task_idelay(D_idelay_1s); - // L0_oled_point(60,50,0x00); - //L2_debug_Au4B48347975); - break; - case D_task_debug_led_key2 : - D_P1_OFF(15); - //L0_debugS_uc('~'); - #if 0 - if((s->x ++)> 64)s->x =0; - if((s->y ++)> 48)s->y =0; - - L0_oled_point(s->x,s->y,0xff); - #else - - - // L0_oled_point(60,50,0xff); - - #endif - L2_task_go(D_task_debug_led_key); - L1_task_idelay(D_idelay_1s); - //L2_debug_Au4B1234567); - - break; - - L2_task_switch_default_idelay(); - - } -} -void L1_debug_rx_handle(struct _s_protocol_ *p) -{ -// unsigned int i; - p->cashe[0] = p->rbr;// - if(p->num > D_s_protocol_len) - { - p->num = 0; - p->buf[p->num] = p->cashe[0]; - }else - { - p->buf[p->num] = p->cashe[0]; - p->num ++; - } -} - - -struct _s_uart_config_ s_debug_config; - - -#define D_debug_buf s_debug_config.puart_config->st->buf -#define D_debug_buf_d(x) s_debug_config.puart_config->st->buf[(x)] -#define D_debug_num (s_debug_config.puart_config->st->num) - -void L1_debug_init(void) -{ - ts_uart1.L1_uart_rx_handle = L1_debug_rx_handle; - ts_uart1.st = (struct _s_protocol_ *)&s_at1; - - s_debug_config.usart = 1; - s_debug_config.puart_config = &ts_uart1; - - - s_debug_config.type = 0; -#if 0 - while(9) - { - if(D_debug_num >= 1) - { - L0_Usend_uc(s_debug_config.usart,D_debug_buf_d(0)); - D_debug_num = 0; - - } - } -#endif -} - -//>>>>>>>>>>>>>>>>>>>>> debug led task diff --git a/source/debug/debug_app.h b/source/debug/debug_app.h deleted file mode 100644 index 497c810..0000000 --- a/source/debug/debug_app.h +++ /dev/null @@ -1,44 +0,0 @@ -/***************************************************************************** - * uart.h: Header file for NXP LPC17xx Family Microprocessors - * - * Copyright(C) 2013, cc - * All rights reserved. - * - * History - * 2013.05.24 ver 1.00 Prelimnary version, first Release - - * -******************************************************************************/ -#ifndef __DEBUG_APP_H -#define __DEBUG_APP_H -#include "LPC17xxcc.h" -#include "LPC17xxzlg.h" -#include "LPC17xx_macro.h" - -#include "Task.h" -#include "time.h" - -#include "debug_drv.h" - - -struct _s_task_debug_led_ -{ - _ts_task task; - unsigned char x; - unsigned char y; -}; -extern struct _s_task_debug_led_ s_task_debug_led; - -#define D_task_debug_led_init 0x10 -#define D_task_debug_led_key 0x11 -#define D_task_debug_led_key2 0x12 - -void L2_task_debug_led_init(void); - -extern void L2_task_debug_led_handdle(struct _s_task_debug_led_ *s); -extern void L1_debug_init(void); - -#endif /* end __DEBUG_APP_H */ -/***************************************************************************** -** End Of File -******************************************************************************/ diff --git a/source/debug/debug_drv.c b/source/debug/debug_drv.c deleted file mode 100644 index 373a01a..0000000 --- a/source/debug/debug_drv.c +++ /dev/null @@ -1,48 +0,0 @@ -/***************************************************************************** - * debug_drv.c: debug app - * - * Copyright(C) 2013, cc - * All rights reserved. - * - * History - * 2013.05.24 ver 1.00 Prelimnary version, first Release - * -******************************************************************************/ - -#include "debug_drv.h" - -void L3_debug_drv_init(void) -{ - L0pf_send_uc = L0_uart0_uc; - Lc_print("\r\n debug shell init:\t"); -/// io õı׼д - - Lc_print("Mode:"); - #ifdef D_debug_time - Lc_print(" debug"); - #else - //D_debug_time_using - Lc_print(" normal"); - #endif -} - - -#ifdef D_debug_sim - -fff -void L3_debug_cycle(void) -{ - INTERRUPT_UART(); - TIMER0_IRQHandler(); - - - -} - -#else - -#endif - -/****************************************************************************** -** End Of File -******************************************************************************/ diff --git a/source/debug/debug_drv.h b/source/debug/debug_drv.h deleted file mode 100644 index f14c872..0000000 --- a/source/debug/debug_drv.h +++ /dev/null @@ -1,85 +0,0 @@ -/***************************************************************************** - * DEBUG_DRV.h: Header file for DEBUY DRIVER FILES - * - * - * Copyright(C) 2013, cc - * All rights reserved. - * - * History - * 2013.05.24 ver 1.00 Prelimnary version, first Release - -******************************************************************************/ -#ifndef __DEBUG_DRV_H -#define __DEBUG_DRV_H - -#include "../clib/type.h" -#include "../clib/clib.h" -#include "../clib/uartlib.h" -#include "../msp/uart0.h" -#include "debug_led.h" - -void L3_debug_drv_init(void); -#define L3_debug_time() L0pf_send_uc = L0_uart0_uc; ///Lc_print("\r\n%s,-%sL:%d,",__DATE__,__TIME__,__LINE__); -extern void L3_debug_cycle(void); - -#if 0 - -#define UART_debug_reg ((LPC_UART1_TypeDef *) LPC_UART1_BASE ) -//#define UART_debug ((LPC_UART1_TypeDef *) LPC_UART1_BASE ) -//#define UART_debug ((LPC_UART_TypeDef *) LPC_UART_BASE ) -//#define UART_debug ((LPC_UART_TypeDef *) LPC_UART_BASE ) -#define UART_debug 1 - -#define L0_debugS_uc(x) //L0_Usend_uc(UART_debug,x) -#define L0_debugS_uc_hex(x) //L0_Usend_uc_hex(UART_debug,x) -#define L0_debug_uc_show(x,y); //L0_USART_print(UART_debug,x,y); -#define L0_debug_us_show(x,y); //L0_USART_print(UART_debug,x,y); -#define L0_debug_ul_show(x,y); //L0_USART_print(UART_debug,x,y); - - -//#define L2_debug_info(x) //L0_USART_print(UART_debug,x); -#define L2_debug_Au4B(x) // L0_Usend_Au4B(UART_debug,x) -#define L0_debug_Au4B_show(x,y); //L0_USART_print(UART_debug,x,y); -#define L0_debug_Aus_show(x,y); //L0_USART_print(UART_debug,x,y); -#define L0_debug_A4B_show(x,y); //L0_USART_print(UART_debug,x,y); - - -//#define debug22(format...) Lc_print("%s (%d): ",__FILE__,__LINE__); - -//#define LOG(format, args...) Lc_print(format, ##args) -//#define RTA_printf(...) Lc_print(__VA_ARGS__) - -//#define L2_debug_info Lc_print - -//#define L3_debug_time() Lc_print(L0_uart0_uc,"\r\n%s,-%sL:%d,",__DATE__,__TIME__,__LINE__); - - - - -#define L2_debug_info(...) \ -Lc_print(L0_uart_uc,__VA_ARGS__); - -//do { -//Lc_print("%s (%d): ", __FILE__, __LINE__); -//Lc_print(format, __VA_ARGS__); -//} while (0) - - -#define CHECK1(x, ...) if (!(x)) { printf(__VA_ARGS__); } - -#define LOG(...) {\ - Lc_print(L0_uart_uc,"%s: Line %d:\t", __FILE__, __LINE__);\ - Lc_print(L0_uart_uc, __VA_ARGS__);\ - Lc_print(L0_uart_uc,"\n");\ -} - -int main() { - int x = 3; - // һЩ... - LOG("x = %d", x); // 2-1-5.cpp: Line 12: x = 3 -} -#endif -#endif /* end __DEBUG_DRV_H */ -/***************************************************************************** -** End Of File -******************************************************************************/ diff --git a/source/debug/debug_led.c b/source/debug/debug_led.c deleted file mode 100644 index e125d7a..0000000 --- a/source/debug/debug_led.c +++ /dev/null @@ -1,37 +0,0 @@ -/***************************************************************************** - * debug_drv.c: debug app - * - * Copyright(C) 2013, cc - * All rights reserved. - * - * History - * 2013.05.24 ver 1.00 Prelimnary version, first Release - * - - ȡӲ汾 CC-ACC-VH02 -******************************************************************************/ - -#include "debug_led.h" - -void L3_debug_led_init(void) -{ - D_led_THB_init(); - D_led_debug_init(); - //D_led_D0_init(); - D_led_D1_init(); - D_led_D2_init(); - //while(0) - { - D_led_THB_REV(); - D_led_debug_REV(); - D_led_D1_REV(); - D_led_D2_REV(); - - - - } - -} -/****************************************************************************** -** End Of File -******************************************************************************/ diff --git a/source/debug/debug_led.h b/source/debug/debug_led.h deleted file mode 100644 index 7dee3ec..0000000 --- a/source/debug/debug_led.h +++ /dev/null @@ -1,138 +0,0 @@ -/***************************************************************************** - * DEBUG_DRV.h: Header file for DEBUY DRIVER FILES - * - * - * Copyright(C) 2013, cc - * All rights reserved. - * - * History - * 2013.05.24 ver 1.00 Prelimnary version, first Release - - 20160413 CC-ACC-VH02 - - led pin33 P22 LED - P16 P17 - - -******************************************************************************/ -#ifndef __DEBUG_LED_H -#define __DEBUG_LED_H - -#include "../clib/type.h" -#include "../bsp/type_hs.h" - - - -///P22timer heratbeat -#define D_led_THB BIT2 -#define D_led_THB_SEL0 P2_SEL0 -#define D_led_THB_SEL1 P2_SEL1 -#define D_led_THB_SEL2 P2_SEL2 -#define D_led_THB_DIR P2_DIR - -#define D_led_THB_REV() D_P22_REV() -#define D_led_THB_ON() P22 = 1 -#define D_led_THB_OFF() P22 = 0 -#define D_led_THB_init() \ - BITN_0(D_led_THB_SEL2,(D_led_THB));\ - BITN_0(D_led_THB_SEL1,(D_led_THB));\ - BITN_0(D_led_THB_SEL0,(D_led_THB));\ - BITN_0(D_led_THB_DIR, (D_led_THB)); // led_debug output - -//>>>>>>>>>>>>>>>>CC-ACC-VH02 ܽſ - - - - -///P23debug˿ -#define D_led_debug BIT3 -#define D_led_debug_SEL0 P2_SEL0 -#define D_led_debug_SEL1 P2_SEL1 -#define D_led_debug_SEL2 P2_SEL2 -#define D_led_debug_DIR P2_DIR - -#define D_led_debug_REV() D_P23_REV() -#define D_led_debug_ON() P23 = 1 -#define D_led_debug_OFF() P23 = 0 -#define D_led_debug_init() \ - BITN_0(D_led_debug_SEL2,(D_led_debug));\ - BITN_0(D_led_debug_SEL1,(D_led_debug));\ - BITN_0(D_led_debug_SEL0,(D_led_debug));\ - BITN_0(D_led_debug_DIR,( D_led_debug)); // led_debug output - -///P24debug -#define D_led_D1 BIT4 -#define D_led_D1_SEL0 P2_SEL0 -#define D_led_D1_SEL1 P2_SEL1 -#define D_led_D1_DIR P2_DIR -#define D_led_D1_REV() D_P24_REV() -#define D_led_D1_ON() P24 = 0 -#define D_led_D1_OFF() P24 = 1 -#define D_led_D1_init() D_led_D1_OFF();\ - BITN_0(D_led_D1_SEL1,(D_led_D1));\ - BITN_0(D_led_D1_SEL0,(D_led_D1));\ - BITN_0(D_led_D1_DIR, (D_led_D1));\ - BITN_0(P2_PE, (D_led_D1));\ - BITN_1(P2_DS, (D_led_D1));\ - BITN_0(P2_OD, (D_led_D1)); //CMOS or push_Pull -///PE ODds= ǿ - -///P25debug -#define D_led_D2 BIT5 -#define D_led_D2_SEL0 P2_SEL0 -#define D_led_D2_SEL1 P2_SEL1 -#define D_led_D2_DIR P2_DIR -#define D_led_D2_REV() D_P25_REV() -#define D_led_D2_ON() P25 = 0 -#define D_led_D2_OFF() P25 = 1 -#define D_led_D2_init() D_led_D2_OFF();\ - BITN_0(D_led_D2_SEL1,(D_led_D2));\ - BITN_0(D_led_D2_SEL0,(D_led_D2));\ - BITN_0(D_led_D2_DIR, (D_led_D2));\ - BITN_0(P2_PE, (D_led_D2));\ - BITN_1(P2_DS, (D_led_D2));\ - BITN_0(P2_OD, (D_led_D2)); //CMOS or push_Pull -///PE=1 OD=0 ds=1 ǿ - - -// linuxһerronoĽṹ 浱ǰĴϢ - -struct _s_errorno_ -{ - int errono; - char *errostr; -}; - -//#define D_debug_time - - -#ifdef D_debug - -#define D_debug_sim -#define D_debug_spi_sim - -#define D_debug_time -#define D_debug_time_using -#define D_debug_sim_using - -#define D_debug_key - -#define D_debug_adc - -#define D_debug_lcd - - -#define D_debug_flash -#endif - - - -extern void L3_debug_led_init(void); - - -#endif /* end __DEBUG_LED_H */ -/***************************************************************************** -** End Of File -******************************************************************************/ - - diff --git a/source/debug/testiic.uvla b/source/debug/testiic.uvla deleted file mode 100644 index 95fb5b0ca1a0027c47e0ad426fc480a53d187e08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1187 zcmZ`&Jxc>Y5FO(oYNL&v0V60@201^fzOSXifzA34QB zNMkLi>o3rmomp>py&IUD-N(CO_U+qxWuvjV*4VCY#Ss8p;irK0B*u>uS`FZC5OV~R z)|5Y(RY@!oTG{xK`(aAC(!;R*gjKq>2!aBT?hH zpnKs+Ik@*!+Yxp4XI)&YSHTOxsg^~xT@TmlRPd1hlEW{G$|3(u@UVY3hdI)X>j{(aTNRb|&z3- S0OUT -//ASSIGN WIN S0OUT -//S0TIME = 0 -KILL FUNC * -KILL BUTTON * - - -DEFINE BUTTON "key_up","key_up()" -signal void key_up(void) -{ - //s_task_key_up.sim = 1; - s_task_key_up.down = 1; - //swatch(0.1); - twatch(1000); - //swatch (0.05); /* wait 50 milliseconds */ - - s_task_key_up.up = 1; -// swatch(0.1);//twatch(1000); -} - - -DEFINE BUTTON "key_down","key_down()" -signal void key_down(void) -{ - //s_task_key_up.sim = 1; - s_task_key_down.down = 1; - swatch(0.1); - //twatch(1000); - s_task_key_down.up = 1; -// swatch(0.1);//twatch(1000); - -} - - -DEFINE BUTTON "key_upanddown","key_upanddown()" -signal void key_upanddown(void) -{ - //s_task_key_up.sim = 1; - s_task_key_down.down = 1; - // twatch(10); - s_task_key_up.down = 1; - twatch(1000); - s_task_key_down.up = 1; -// twatch(10); - s_task_key_up.up = 1; - swatch(0.1);//twatch(1000); -} - - - - -DEFINE BUTTON "key_ent","key_ent()" -signal void key_ent(void) -{ - //s_task_key_up.sim = 1; - s_task_key_ent.down = 1; - twatch(1000); - s_task_key_ent.up = 1; - -} - - - - diff --git a/source/debug/复制 debug_M3sfy.ini b/source/debug/复制 debug_M3sfy.ini deleted file mode 100644 index 10e05ba..0000000 --- a/source/debug/复制 debug_M3sfy.ini +++ /dev/null @@ -1,129 +0,0 @@ -//MODE COM1 9600,0,8,1 -//assign com1 SOUT -//ASSIGN COM1 < S0IN > S0OUT -//ASSIGN WIN S0OUT -//S0TIME = 0 -KILL FUNC * -KILL BUTTON * - - -DEFINE BUTTON "key_up","key_up()" -signal void key_up(void) { - //s_task_key_up.sim = 1; - s_task_key_up.down = 1; - twatch(1000); - s_task_key_up.up = 1; -} -DEFINE BUTTON "key_down","key_down()" -signal void key_down(void) { - //s_task_key_up.sim = 1; - s_task_key_down.down = 1; - twatch(1000); - s_task_key_down.up = 1; - -} - - -DEFINE BUTTON "key_upanddown","key_upanddown()" -signal void key_upanddown(void) { - //s_task_key_up.sim = 1; - s_task_key_down.down = 1; - // twatch(10); - s_task_key_up.down = 1; - twatch(1000); - s_task_key_down.up = 1; -// twatch(10); - s_task_key_up.up = 1; -} - -} - - - -DEFINE BUTTON "key_ent","key_ent()" -signal void key_ent(void) { - //s_task_key_up.sim = 1; - s_task_key_ent.down = 1; - twatch(1000); - s_task_key_ent.up = 1; - -} - - - - - -DEFINE BUTTON "key_up","key_up()" -signal void key_up(void) { - -U1THR = 'e'; - //LPC_GPIO1->FIOSET |= (1<<18); - FIO1SET|= (1<<18); - twatch(1000); -//U0RBR=0xaa;twatch(1000); -//U0RBR=0x70;twatch(1000); - -} -DEFINE BUTTON "key_down","key_down()" -signal void key_down(void) { - - printf("key down\n"); - - FIO1CLR|= (1<<18); - twatch(1000); - -//U0RBR=0xaa;twatch(1000); -//U0RBR=0x70;twatch(1000); - -} - - //AA 70 70 71 72 72 75 74 76 77 78 79 24 55 -DEFINE BUTTON "master_send01","master_send01()" -signal void master_send01(void) { - - printf("DD\n"); -// #define rU0IIR rU0FCR /* share the same address */ - - //U0IIR =0x02; -// U0THR = 0x33; U0IIR =0x04; twatch(1000); - U0RBR = 0x34; U0IIR =0x04; twatch(1000); - -//U0RBR=0xaa;twatch(1000); -//U0RBR=0x70;twatch(1000); -//U0RBR=0x70;twatch(1000); -//U0RBR=0x71;twatch(1000); - -} - - - -DEFINE BUTTON "master_send021","master_send021()" -signal void master_send021(void) { - -// printf("DD\n"); -// #define rU0IIR rU0FCR /* share the same address */ - - //U0IIR =0x02; -// U0THR = 0x33; U0IIR =0x04; twatch(1000); - U0RBR = 0xAA; twatch(1000); - -U0RBR=0x66;twatch(1000); -//U0RBR=0x70;twatch(1000); -//U0RBR=0x70;twatch(1000); -//U0RBR=0x71;twatch(1000); - -} -int SendChar (int ch) -{ - //while (!(USART1->SR & USART_FLAG_TXE)); - U1THR = (ch & 0x1FF); - twatch(200); - return (ch); -} -int GetKey (void) -{ - while (!(USART1->SR & USART_FLAG_RXNE)); - return ((int)(USART1->DR & 0x1FF)); -} - - diff --git a/source/msp/UART0.C b/source/msp/UART0.C index c7ac5d3..999ac97 100644 --- a/source/msp/UART0.C +++ b/source/msp/UART0.C @@ -18,9 +18,15 @@ /// Modified date: /// Version: /// Descriptions: +// 20160413 CC-ACC-VH02 +// 连接至 J22 RXD0 TXD0 +//P5_DIR &= ~BITN1; //p5.1输出TXD +//P5_DIR |= BITN0; //p5.0输入RXD +//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD +//P5_SEL1 |= BITN0 +BITN1; /***************************************************************************** -update by cc @201800400 +update by cc @201700110 针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 个需要平衡的事情. @@ -30,9 +36,17 @@ clib/clib.c: 一些覆盖模式输出的(lcd等固屏输出的)的也可使用 void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) ----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 ----------------------------------------------------------------------------------------- - +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 -------------------------------------------------------------------------------------------- msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 L0_UART0_Init @@ -40,412 +54,107 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 L0_Usend_uc------UserDef ----------------------------------------------------------------------------------------- ********************************************************************************/ -#include "uart0.h" -//#include "uart2.h" -//#include "uart3.h" -//#include "uart4.h" - #include - #include "../bsp/bsp_485.h" - #include "../ctask/tick.h" - #include "../app/common.h" - #include "../msp/time.h" - #include "../app/app_task_uart0.h" - -// TS_Handle_PH1 volatile s_uart0_rec; -// TS_Handle_PH1A volatile s_uart0_rec; -TS_Handle_PH4 volatile s_uart0_rec; - -///struct _s_uart0_send_buf_ ts_uart_send_shop; -//struct _s_uart0_send_buf_ ts_uart_send_depot; -volatile Ts_uart_send_buf ts_uart_send_shop; -////volatile Ts_uart_send_buf ts_uart_send_depot; - -#if(MainFre_5M == D_sys_MainFre) - void L0_uart0_init32K_290BPS(void) //290bps@32kHz - {//定时器2 16位重载 作为串口波特率 - SCON = 0x50; //8位数据,可变波特率 - AUXR |= 0x01; //串口1选择定时器2为波特率发生器 - BITN_1(AUXR, BITN5);// f/2 - T2L = 0xFE; //设定定时初值 - T2H = 0xFF; //设定定时初值 /// 32K 280---290BPS - AUXR |= 0x10; //启动定时器2 - } - - -#elif(MainFre_27M == D_sys_MainFre) -#elif(MainFre_22M == D_sys_MainFre) - #if(BRT_115200 == D_uart0_BRT) - void L0_uart0_init(void) //115200bps@22.1184MHz - {//定时器2 16位重载 作为串口波特率 - SCON = 0x50; //8位数据,可变波特率 - AUXR |= 0x01; //串口1选择定时器2为波特率发生器 - AUXR &= 0xFB; //定时器2时钟为Fosc/12,即12T - T2L = 0xFC; //设定定时初值 - T2H = 0xFF; //设定定时初值 - AUXR |= 0x10; //启动定时器2 - } - - #elif(BRT_4800 == D_uart0_BRT) - void L0_Uart0_Init(void) //4800bps@22.1184MHz - { - SCON = 0x50; //8位数据,可变波特率 - AUXR |= 0x01; //串口1选择定时器2为波特率发生器 - AUXR |= 0x04; //定时器2时钟为Fosc,即1T - T2L = 0x80; //设定定时初值 - T2H = 0xFB; //设定定时初值 - AUXR |= 0x10; //启动定时器2 - } - #elif(BRT_SIM == D_uart0_BRT) - void L0_uart0_init(void) - { - SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */ - TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */ - TH1 = 221; /* TH1: reload value for 1200 baud @ 16MHz */ - TR1 = 1; /* TR1: timer 1 run */ - TI = 1; /* TI: set TI to send first char of UART */ - EA = 1; - AUXR = 0x40; - // TI = 0; - RI = 0; - D_uart0_ES_INT(1); //打开串口中断 - } - #endif - -#else ///MainFre_11M - - #if(BRT_115200 == D_uart0_BRT && SBIT_1 == D_uart0_SBIT) - void L0_uart0_init(void) //115200bps@11.0592MHz - { - SCON = 0x50; //8位数据,可变波特率 - AUXR |= 0x01; //串口1选择定时器2为波特率发生器 - AUXR &= 0xFB; //定时器2时钟为Fosc/12,即12T - T2L = 0xFE; //设定定时初值 - T2H = 0xFF; //设定定时初值 - AUXR |= 0x10; //启动定时器2 - } - #elif(BRT_19200 == D_uart0_BRT && SBIT_1 == D_uart0_SBIT) - void L0_uart0_init(void) //19200@11.0592MHz - { - xxxx - SCON = 0x50; //8位数据,可变波特率 - AUXR |= 0x01; //串口1选择定时器2为波特率发生器 - AUXR |= 0x04; //定时器2时钟为Fosc,即1T - T2L = 0x70; //设定定时初值 - T2H = 0xFF; //设定定时初值 - AUXR |= 0x10; //启动定时器2 - } - #elif(BRT_19200 == D_uart0_BRT && SBIT_2 == D_uart0_SBIT) - void L0_uart0_init(void) //19200@11.0592MHz - { - //使用第9位数据模拟1个停止位,可变波特率;SM2=0, TB8=1(第9bit总为1模拟1个停止位) - SCON = 0xD8; - AUXR |= 0x01; //串口1选择定时器2为波特率发生器 - AUXR |= 0x04; //定时器2时钟为Fosc,即1T - T2L = 0x70; //设定定时初值 - T2H = 0xFF; //设定定时初值 - AUXR |= 0x10; //启动定时器2 - } - #elif (BRT_9600 == D_uart0_BRT) - void L0_uart0_init(void) //9600bps@11.0592MHz - { - SCON = 0x50; //8位数据,可变波特率 - AUXR |= 0x01; //串口1选择定时器2为波特率发生器 - AUXR &= 0xFB; //定时器2时钟为Fosc/12,即12T - T2L = 0xE8; //设定定时初值 - T2H = 0xFF; //设定定时初值 - AUXR |= 0x10; //启动定时器2 - } - #endif -#endif//D_sys_MainFre) -void L1_uart0_buf_init(void) -{ -/// ts_uart_send_depot.p = ts_uart_send_depot.buf; - ts_uart_send_shop.now = 0; - s_uart0_rec.head = 0; - s_uart0_rec.ok = 0; - s_uart0_rec.num = 0; -// L1_s2b_PH4_init(&s_uart0_rec,G.p.slaver_id); -// s_uart0_rec.sp = s_uart0_rec.buf; -// s_uart0_rec.cmd = 0; -// head_0 = D_CMD_Filter1_ff; -// s_uart0_rec.head_1 = D_CMD_Filter2_fe; -// s_uart0_rec.sp = (U8*)&(s_uart0_rec.ts_ccmodbus); - - L0_uart0_init(); - -// L0_uart0_init(); - BITN_0(P3M1,BITN1);BITN_1(P3M0,BITN1);/// p31 01 tuiwan - - ts_uart_send_shop.ok = D_ready; - - D_uart0_ES_INT(1); //打开串口中断 - -} -//115200 0.1ms /Byte 115200/4800=23 0.1*23=2.3ms -/// 4800 uartb波形 2.1ms 一个数据 b8s 共10bits 1000ms 发送480个Bytes 大约就是2.1ms 一个数据 - -//// ````\_b_|___________________________/``s`|```2.1ms 0x00 sscom 测试 - -//// s 1 1 1 1 1 1 1 0 b11111111s - -//// ````\_b_/```````````````````````````|``s`|```200us 0xff - -//// ````\_b_|__/```\__/```\__/```\__/```|``s`|```1.9ms`\0xaa -//// b 1 0 1 0 1 0 1 0 b10101010s - -//// -//// ````\_b_|__/```\__/```\__/```\__/```|``s`|```1.9ms`\0xaa -//// b 1 0 1 0 1 0 1 0 b10101010s - -/// 1.9ms`\0xaa 0xaa 0xaa -//// ````\_b_|__/```\__/```\__/```\__/```|``s`|\_b_|__/```\__/```\__/```\__/```|``s`|\_b_|__/```\__/```\__/```\__/```|``s`| -//// b 1 0 1 0 1 0 1 0 s b 1 0 1 0 1 0 1 0 s b 1 0 1 0 1 0 1 0 s - - -//// ````\_200us_/`````0xff -//// ````\_200us_/`````0xff -void L0_uart0_uc(U8 ww) -{ - L0_uart0_sendArray(&ww,1); -} -extern void L2_waitFree_uart0(void); - - -#define D_waitFree_uart0() L2_waitFree_uart0() - - -/********* -while(ts_uart_send_shop.ok != D_ready)\ - {\ - if(ts_uart_send_shop.over ++ > 600000)\ - {\ - break;\ - }\ - }\ -*********************/ -void L0_uart0_us(vU32 ww) -{ - U_U16 uStemp; - uStemp.word = ww; - L0_uart0_uc(uStemp.BYTE2.h); - L0_uart0_uc(uStemp.BYTE2.l); -} -void L0_uart0_ul(vU32 ww) -{ - L0_uart0_uc(ww >> 24 & 0xFF); - L0_uart0_uc(ww >> 16 & 0xFF); - L0_uart0_uc(ww >> 8 & 0xFF); - L0_uart0_uc(ww >> 0 & 0xFF); -} -void L0_uart0_uchex(U8 ww) -{ - D_waitFree_uart0(); - ts_uart_send_shop.buf3[0] = cguHex2Char[D_uc_high(ww)][1]; - ts_uart_send_shop.buf3[1] = cguHex2Char[D_uc_low(ww)][1]; - L0_uart0_sendArray(ts_uart_send_shop.buf3,2); -} - -// void L0_uart0_ushex(U16 ww) -// { -// L0_uart0_uchex(ww >> 8 & 0xFF); -// L0_uart0_uchex(ww >> 0 & 0xFF); -// } - -void L0_uart0_ulhex(U32 ww) -{ - L0_uart0_uchex(ww >> 24 & 0xFF); - L0_uart0_uchex(ww >> 16 & 0xFF); - L0_uart0_uchex(ww >> 8 & 0xFF); - L0_uart0_uchex(ww >> 0 & 0xFF); +#include "uart0.h" +#include "../msp/time.h" +//#define _USE_485 + +static volatile Ts_uart_send_buf idata ts_uart_send_shop; + +TP_Handler_X s_uart0_rec; +TS_PH4_modbus s_uart0_ack; + +void L0_uart0_init(void) +{ + U16 val = D_BRT_COUNT(12,D_sys_MainFre,D_uart0_BRT); + SCON = 0x50; //8位数据,可变波特率 + AUXR |= 0x01; //串口1选择定时器2为波特率发生器 + AUXR &= 0xFB; //定时器2时钟为Fosc/12,即12T + //T2L = 0xFE; //设定定时初值 + //T2H = 0xFF; //设定定时初值 + T2L = val; + T2H = val >> 8; + AUXR |= 0x10; //启动定时器2 } -void L0_uart0_uldec(U32 ww) +void L0_uart0_buf_init(void) { - L0_uart0_uc(ww / 1000000 % 10 + '0'); - L0_uart0_uc(ww / 100000 % 10 + '0'); - L0_uart0_uc(ww / 10000 % 10 + '0'); - L0_uart0_uc(ww / 1000 % 10 + '0'); - L0_uart0_uc(ww / 100 % 10 + '0'); - L0_uart0_uc(ww / 10 % 10 + '0'); - L0_uart0_uc(ww / 1 % 10 + '0'); -} - -/********** -void L0_uart0_uc_debug(U8 ww) -{ - L0_uart0_sendArray(&ww,1); - while(0 != ts_uart_send_shop.now){} -} - -void L0_uart0_ushex(vU16 ww,U8 hex) -{ - U8 buf3[4]; - U_F16 k; - k.us = ww; - if(16 == hex ) - { - buf3[0] = cguHex2Char[D_uc_high(k.BYTE2.H)][1]; - buf3[1] = cguHex2Char[D_uc_low(k.BYTE2.H)][1]; - buf3[2] = cguHex2Char[D_uc_high(k.BYTE2.L)][1]; - buf3[3] = cguHex2Char[D_uc_low(k.BYTE2.L)][1]; - L0_uart0_sendArray(buf3,4); - - }else if(2 == hex) - { - buf3[0] = (k.BYTE2.H); - buf3[1] = (k.BYTE2.L); - L0_uart0_sendArray(buf3,2); - }else - { - - buf3[0] = 0x55; - buf3[1] = 0x66; - - L0_uart0_sendArray(buf3,2); - - } -} -k.us = 0x1234 -uc - [0]=0x12 - [1]=0x34 -byte2 - H=0x12 - L=0x34 - -**********/ - -void L0_uart0_ushex(vU16 ww,U8 hex) -{ - U_F16 k; - k.us = ww; - D_waitFree_uart0(); - if(16 == hex ) - { - ts_uart_send_shop.buf3[0] = cguHex2Char[D_uc_high(k.BYTE2.H)][1]; - ts_uart_send_shop.buf3[1] = cguHex2Char[D_uc_low(k.BYTE2.H)][1]; - ts_uart_send_shop.buf3[2] = cguHex2Char[D_uc_high(k.BYTE2.L)][1]; - ts_uart_send_shop.buf3[3] = cguHex2Char[D_uc_low(k.BYTE2.L)][1]; - L0_uart0_sendArray(ts_uart_send_shop.buf3,4); - - } - - - /**************** - else if(2 == hex) - { - ts_uart_send_shop.buf3[0] = (k.BYTE2.H); - ts_uart_send_shop.buf3[1] = (k.BYTE2.L); - L0_uart0_sendArray(ts_uart_send_shop.buf3,2); - }else - { - ts_uart_send_shop.buf3[0] = 0x55; - ts_uart_send_shop.buf3[1] = 0x66; - L0_uart0_sendArray(ts_uart_send_shop.buf3,2); - } + ts_uart[uNum0].p = &ts_uart_send_shop; + ts_uart[uNum0].p->max = ts_uart[uNum0].p->now = 0; + ts_uart[uNum0].p->ok = D_ready; + ts_uart[uNum0].t = &s_uart0_rec; + ts_uart[uNum0].t->head = 0; + ts_uart[uNum0].t->ok = 0; + //ts_uart[uNum0].tp_handler = L1_s2b_PH4; + ts_uart[uNum0].tp_handler = NULL; //使用函数指针导致错误 + ts_uart[uNum0].ack = (U8*)&s_uart0_ack; + L0_uart0_init(); + D_uart0_ES_INT(1); //打开串口中断 - */ -} -void L2_waitFree_uart0(void) -{ - while(ts_uart_send_shop.ok != D_ready) - { - if(ts_uart_send_shop.over ++ > 600000) - { - break; - } - } +#if (D_UART0_485_TYPE != TYPE_485_NONE) + D_UART0_485_RX() //默认处于接收状态 +#endif } -void L0_uart0_sendArray(U8 *buf,U16 len) +void L0_uart0_sendArray(U8 * buf, U16 len) { - D_485_TX(); //切换到输出状态 - - D_waitFree_uart0(); // P31 = 1; - ts_uart_send_shop.over = 0; - ts_uart_send_shop.p = buf; - ts_uart_send_shop.max = len; - ts_uart_send_shop.now = 1; - ts_uart_send_shop.ok = D_clear; - L0_uart0_set(ts_uart_send_shop.p[0]); +#if (D_UART0_485_TYPE != TYPE_485_NONE) + D_UART0_485_TX() //切换到输出状态 +#endif + L0_uartN_sendArray(uNum0,buf,len); } - /************************************************* UART 中断 *************************************************/ -void INTERRUPT_UART(void) interrupt D_SERVE_UART// using 2 +void INTERRUPT_UART(void) D_SERVE_UART { - NOP(); NOP(); NOP(); - if(L0_uart0_IntRI() /*&& G.e.mcu_enc_id[5] == eep_enc.enc_val[5]*/) //如果是U0接收中断 + //NOP(); NOP(); NOP(); + if(L0_uart0_IntRI()) //如果是U0接收中断 { L0_uart0_IntRIClear(); //清除接收中断标志 - //s_nos_tick.tp_count = 0; - L0_timer1_reset(); - s_uart0_rec.reg = L0_uart0_get(); - L1_s2b_PH4(&s_uart0_rec); + ts_uart[uNum0].t->reg = L0_uartN_get(uNum0); + //ts_uart[uNum0].tp_handler(ts_uart[uNum0].t); + L1_s2b_PH4(ts_uart[uNum0].t); + L0_timer1_restart(); } if(L0_uart0_IntTI()) //如果是U0发送中断 { L0_uart0_IntTIClear(); //清除发送中断标志 - if(ts_uart_send_shop.max != ts_uart_send_shop.now) + if(ts_uart[uNum0].p->max != ts_uart[uNum0].p->now) { - L0_uart0_set(ts_uart_send_shop.p[ts_uart_send_shop.now]); - ts_uart_send_shop.now ++; + L0_uartN_set(uNum0,ts_uart[uNum0].p->p[ts_uart[uNum0].p->now]); + ts_uart[uNum0].p->now ++; } else { - ts_uart_send_shop.ok = D_ready; - ts_uart_send_shop.max = 0; - ts_uart_send_shop.now = 0;//可以发送下一个数据 - // P31 = 0; - //切换到接收状态 - D_485_RX(); + ts_uart[uNum0].p->ok = D_ready; + ts_uart[uNum0].p->max = 0; + ts_uart[uNum0].p->now = 0;//可以发送下一个数据 +#if (D_UART0_485_TYPE != TYPE_485_NONE) + D_UART0_485_RX() //切换到接收状态 +#endif } } - else - { - //其他中断 - } - NOP(); NOP(); NOP(); + //NOP(); NOP(); NOP(); } -#if 1 -void timer1_isrHanddle (void) interrupt D_ISR_timer1 -{// - TF1 = 0; - //s_nos_tick.uart0_free = 1; - //if(s_uart0_rec.head == 1) //收到一条协议 - if(s_uart0_rec.head == 1) //收到一条协议 +void timer1_isrHanddle(void) D_SERVE_TIMER1 +{ + struct _tp_handler_x *p = &s_uart0_rec; + + if((p->head == 1) && (p->num >= D_s_modbus_min)) { - s_uart0_rec.head = 0; - P10 ^= 1; - if(s_uart0_rec.ok == 0) - { - s_uart0_rec.ok = 1; - //Lc_buf_copy_uc(); + //LED1 ^= 1; + p->head = 0; + crc16(p->crc,p->buf,p->num - 2); //校验CRC + if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1]) + { + p->ok = 1; + LED0 ^= 1; } } + L0_timer1_stop(); } -#else - -void timer1_isrHanddle (void) interrupt D_ISR_timer1 -{// - TF1 = 0; - //s_nos_tick.uart0_free = 1; - if(s_uart0_rec.head == 1) //收到一条协议 - { - s_uart0_rec.head = 0; - s_uart0_rec.ok = 1; - L3_task_uart0_modbus_handler(&s_uart0_rec); - } -} - - - -#endif - - diff --git a/source/msp/UART0.h b/source/msp/UART0.h index 3df7585..37bd779 100644 --- a/source/msp/UART0.h +++ b/source/msp/UART0.h @@ -14,10 +14,10 @@ /// /// /// 修订说明:最初版本 -/// Modified by: cc -/// Modified date: 20190222 +/// Modified by: +/// Modified date: /// Version: -/// Descriptions: 中断的now和max调整类型 可以支持int型的数据一次发送,前提是指向已有的数组 +/// Descriptions: ////////////////////////////////////////////////////////////////////////// /***************************************************************************** update by cc @201700110 @@ -53,100 +53,36 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #ifndef _uart0_H #define _uart0_H #include "../bsp/bsp_config.h" -#include "../clib/type.h" -//#include "../debug/debug_drv.h" -//#include "../uartcom/urec2protocol.h" -//?include "../uartcom/uprotocol2app.h" -#include "../tpc/tpc_modbus.h" -#define Ldi_print(x) Lc_print_buf(x) -//#include "../uartcom/UProtocol.h" -#include "../ctask/task.h" -#include "../clib/Clib.h" +#include "../tpc/modbus.h" +#include "uart_x.h" +//#include "../tpc/tpc_x.h" -//extern struct _s_uart_rec_ s_uart0_rec; -// extern TS_Handle_PH1 volatile s_uart0_rec; -//extern TS_Handle_PH1A volatile s_uart0_rec; -extern TS_Handle_PH4 s_uart0_rec; +#define uNum0 0 - -///#define D_s_uart0_rec_close(); s_uart0_rec.ok = 2;// 关闭串口协议解析 -///#define D_s_uart0_rec_open(); s_uart0_rec.ok = 0;// 关闭串口协议解析 -#define D_uart0_free() (0 == ts_uart_send_shop.max) -#define D_uart0_busy() (0 != ts_uart_send_shop.max) - - - -//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -////fixme:和cpu的程序容量息息相关 -#define D_send_buf_max 8 /// 9600bps = 10000bps = 1000 Bps = 1Byte/ms - /// 19200bps = 20000bps = 2000Bps = 2Byte/ms = 1Byte/0.5ms - /// 128Bytes = 128*0.5ms = 64ms - -#define D_send_buf2_max 6 - -typedef struct _ts_uart0_send_buf_ -{//8byte - U8 num; //接收到的数目注意数据长度的范围 - U8 *p; - vU16 now; /// 当前buf所在的位置 0------(max-1) - vU16 max; /// 当前buf的最大值,也就是需要发送的长度 - vU16 over; /// 当前buf的最大值,也就是需要发送的长度 - U8 ok; /// 当前buf的最大值,也就是需要发送的长度 - U8 buf[D_send_buf_max]; -/// U8 buf2[D_send_buf2_max]; - U8 buf3[D_send_buf2_max]; -//// U8 buf4[D_send_buf_max]; - /// U8 buf[D_send_buf_max + 1];//buffer 的第一位是 长度 -}Ts_uart_send_buf; - - -extern volatile Ts_uart_send_buf ts_uart_send_shop; -///extern volatile Ts_uart_send_buf ts_uart_send_depot; - - -#define D_uart0_ES_INT(x) ES = (x) - - -#define L0_uart0_IntRI() (RI)//BITN_G(SCON,U0RI) -#define L0_uart0_IntTI() (TI)//BITN_G(SCON,U0TI) +#define D_uart0_ES_INT(x) ES = (x) +#define L0_uart0_IntRI() (RI)//BITN_G(SCON,U0RI) +#define L0_uart0_IntTI() (TI)//BITN_G(SCON,U0TI) #define L0_uart0_IntRIClear(); RI = 0;//BITN_0(SCON,U0RI) #define L0_uart0_IntTIClear(); TI = 0;//BITN_0(SCON,U0TI) -#define L0_uart0_set(x) SBUF = (x); -#define L0_uart0_get() (SBUF) -//#define D_send_us(x) gRccUs01 = x;L0_uart0_uc(gRccUs01_H);L0_uart0_uc(gRccUs01_L); - -#define D_send_ushex(x) L0_uart0_ushex(x,16);///Lc_delay_ms(2);//gRccUs01 = x;L0_uart0_uchex(gRccUs01_H);L0_uart0_uchex(gRccUs01_L); -#define D_uart0_send_over() (D_ready == ts_uart_send_shop.ok) - //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -void L1_uart0_buf_init(void); - -extern void L0_uart0_init(void); -extern void L0_uart0_init32K_290BPS(void); +void L0_uart0_buf_init(void); +void L0_uart0_sendArray(U8 * buf, U16 len); -extern void L0_Uart0_Init4800(void) ; +#define L0_uart0_uc(X) L0_uartN_uc(uNum0,X) +#define L0_uart0_us(X) L0_uartN_us(uNum0,X) +#define L0_uart0_ul(X) L0_uartN_ul(uNum0,X) +#define L0_uart0_0d0a() L0_uartN_0d0a(0) +#define L0_uart0_uchex(X) L0_uartN_uchex(uNum0,X) +#define L0_uart0_ushex(X) L0_uartN_ushex(uNum0,X) +#define L0_uart0_ulhex(X) L0_uartN_ulhex(uNum0,X) +#define L0_uart0_sendstr(buf) L0_uartN_sendstr(uNum0,buf) +#define L1_uart0_uchexArray(buf) L1_uartN_uchexArray(uNum0,buf) -extern void L0_uart0_uchex(U8 ww); - -extern void L0_uart0_ulhex(vU32 ww); - -extern void L0_uart0_ul(vU32 ww); -extern void L0_uart0_sendstr(U8 *str); -extern void L0_uart0_0d0a(void); -extern void L0_uart0_uc(U8 ww); -extern void L0_uart0_uc_debug(U8 ww); -extern void L0_uart0_us(vU32 ww); -extern void L0_uart0_ushex(vU16 ww,U8 hex); -extern void L0_uart0_uldec(U32 ww); - -/////////////////////////////////////////////////////////////// -extern void L0_uart0_sendArray(U8 *buf,U16 len); -extern void L0_uart0_sendbuf(void); -///extern void L0_uart0_sendArraylong(U8 *buf,U16 usStart,U16 usEnd); +extern TP_Handler_X s_uart0_rec; +extern TS_PH4_modbus s_uart0_ack; #endif //#ifndef _uart0_H - diff --git a/source/msp/eeprom.c b/source/msp/eeprom.c new file mode 100644 index 0000000..e9d706b --- /dev/null +++ b/source/msp/eeprom.c @@ -0,0 +1,223 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2018, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file msp_eeprom.c +/// @brief msp @ driver config +///------------------------------------------------------------------------- +/// @version 1.0 +/// @author CC +/// @date 20190106 +/// @note cc_AS_stc02 由stc-isp v6.0860 +////////////////////////////////////////////////////////////////////////////// +#include "eeprom.h" +#include "../bsp/bsp_config.h" + +struct eeprom_block_t eep_block; + +#if(TYPE_MCU == TYPE_MCU_STC_8A || TYPE_MCU == TYPE_MCU_STC_8F) +#define WT_30M 0x80 +#define WT_24M 0x81 +#define WT_20M 0x82 +#define WT_12M 0x83 +#define WT_6M 0x84 +#define WT_3M 0x85 +#define WT_2M 0x86 +#define WT_1M 0x87 + + +void L0_Iap_Idle() +{ + IAP_CONTR = 0; //关闭IAP功能 + IAP_CMD = 0; //清除命令寄存器 + IAP_TRIG = 0; //清除触发寄存器 + IAP_ADDRH = 0x80; //将地址设置到非IAP区域 + IAP_ADDRL = 0; +} + +char L0_Iap_Read(vU16 addr) +{ + char dat; + + IAP_CONTR = WT_12M; //使能IAP + IAP_CMD = 1; //设置IAP读命令 + IAP_ADDRL = addr; //设置IAP低地址 + IAP_ADDRH = addr >> 8; //设置IAP高地址 + IAP_TRIG = 0x5a; //写触发命令(0x5a) + IAP_TRIG = 0xa5; //写触发命令(0xa5) + _nop_(); + dat = IAP_DATA; //读IAP数据 + L0_Iap_Idle(); //关闭IAP功能 + + return dat; +} + +void L0_Iap_Program(vU16 addr, char dat) +{ + IAP_CONTR = WT_12M; //使能IAP + IAP_CMD = 2; //设置IAP写命令 + IAP_ADDRL = addr; //设置IAP低地址 + IAP_ADDRH = addr >> 8; //设置IAP高地址 + IAP_DATA = dat; //写IAP数据 + IAP_TRIG = 0x5a; //写触发命令(0x5a) + IAP_TRIG = 0xa5; //写触发命令(0xa5) + _nop_(); + L0_Iap_Idle(); //关闭IAP功能 +} + +///每个扇区512字节 +///指定地址可以为当前扇区内的任意地址,都会完整擦除当前扇区 +void L0_Iap_Erase(vU16 addr) +{ + IAP_CONTR = WT_12M; //使能IAP + IAP_CMD = 3; //设置IAP擦除命令 + IAP_ADDRL = addr; //设置IAP低地址 + IAP_ADDRH = addr >> 8; //设置IAP高地址 + IAP_TRIG = 0x5a; //写触发命令(0x5a) + IAP_TRIG = 0xa5; //写触发命令(0xa5) + _nop_(); // + L0_Iap_Idle(); //关闭IAP功能 +} + +#elif (TYPE_MCU == TYPE_MCU_STC_8G || TYPE_MCU == TYPE_MCU_STC_8H) +void L0_Iap_Idle() +{ + IAP_CONTR = 0; //关闭IAP功能 + IAP_CMD = 0; //清除命令寄存器 + IAP_TRIG = 0; //清除触发寄存器 + IAP_ADDRH = 0x80; //将地址设置到非IAP区域 + IAP_ADDRL = 0; +} + +char L0_Iap_Read(vU16 addr) +{ + char dat; + + IAP_CONTR = 0x80; //使能IAP + IAP_TPS = 12; + IAP_CMD = 1; //设置IAP读命令 + IAP_ADDRL = addr; //设置IAP低地址 + IAP_ADDRH = addr >> 8; //设置IAP高地址 + IAP_TRIG = 0x5a; //写触发命令(0x5a) + IAP_TRIG = 0xa5; //写触发命令(0xa5) + _nop_(); + dat = IAP_DATA; //读IAP数据 + L0_Iap_Idle(); //关闭IAP功能 + + return dat; +} + +void L0_Iap_Program(vU16 addr, char dat) +{ + IAP_CONTR = 0x80; //使能IAP + IAP_TPS = 12; //设置擦除等待参数 12MHz + IAP_CMD = 2; //设置IAP写命令 + IAP_ADDRL = addr; //设置IAP低地址 + IAP_ADDRH = addr >> 8; //设置IAP高地址 + IAP_DATA = dat; //写IAP数据 + IAP_TRIG = 0x5a; //写触发命令(0x5a) + IAP_TRIG = 0xa5; //写触发命令(0xa5) + _nop_(); + L0_Iap_Idle(); //关闭IAP功能 +} + +///每个扇区512字节 +///指定地址可以为当前扇区内的任意地址,都会完整擦除当前扇区 +void L0_Iap_Erase(vU16 addr) +{ + IAP_CONTR = 0x80; //使能IAP + IAP_TPS = 12; //设置擦除等待参数 12MHz + IAP_CMD = 3; //设置IAP擦除命令 + IAP_ADDRL = addr; //设置IAP低地址 + IAP_ADDRH = addr >> 8; //设置IAP高地址 + IAP_TRIG = 0x5a; //写触发命令(0x5a) + IAP_TRIG = 0xa5; //写触发命令(0xa5) + _nop_(); // + L0_Iap_Idle(); //关闭IAP功能 +} +#endif + + +void L0_Iap_Program_array(vU16 addr,U8 *buf,U8 len) +{ + U8 i = 0; + for(i=0;i D_EEP_SECTOR_BLOCK_BUF_SIZE) + { + L0_uart0_sendstr("eep write error."); + return 1; + } + + Lc_memset((U8*)&eep_block,0,sizeof(eep_block)); + eep_block.filter[0] = D_EEP_BLOCK_FILTER0; + eep_block.filter[1] = D_EEP_BLOCK_FILTER1; + eep_block.len[0] = len >> 8 & 0xFF; + eep_block.len[1] = len >> 0 & 0xFF; + for(i=0;i>>端口位定义,可修改!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - -#include "../cpu/stc_stc8a8k.h" -#include "../cpu/c51_macro.h" -#include "../bsp/bsp_config.h" - - #include "uart0.h" -extern void L3_eeprom_fun(U8 *pPara); +/** + * EEPROM 存储结构 + * filter0 + filter1 + len0 + len1 + {data} + crc0 + crc1 + */ +#define D_EEP_SECTOR_BLOCK_BUF_SIZE (D_EEP_SECTOR_BLOCK_SIZE - 6) +typedef struct eeprom_block_t +{ + U8 filter[2]; //filter + U8 len[2]; //有效数据的个数 + U8 buf[D_EEP_SECTOR_BLOCK_BUF_SIZE]; + U8 crc[2]; //从filter开始进行整体校验 +}EEPROM_BLOCK; + +extern struct eeprom_block_t eep_block; +extern U8 L1_eep_read_block(U8 sector, U8 block, U16 blocksize, U8 *buf, U16 *plen); +extern U8 L1_eep_write_block(U8 sector, U8 block, U16 blocksize, const U8 *buf, U16 len, U8 sectorEraseFlag); +extern U8 L1_eep_erase_sector(U8 sector); + ///每个扇区512字节 extern void L0_Iap_Erase(vU16 addr); @@ -41,6 +49,7 @@ extern char L0_Iap_Read(vU16 addr); extern void L0_Iap_Program_array(vU16 addr,U8 *buf,U8 len); extern void L0_Iap_Read_array(vU16 addr,U8 *buf,U8 len); extern void L1_Iap_main(void); +extern void L3_eeprom_fun(U8 *pPara); #endif// #ifndef _msp_eeprom_H_ diff --git a/source/msp/iic_sim.h b/source/msp/iic_sim.h index d3665bd..b6a89e8 100644 --- a/source/msp/iic_sim.h +++ b/source/msp/iic_sim.h @@ -25,8 +25,6 @@ ///>>>˿λ壬޸!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -#include "../cpu/stc_stc8a8k.h" -#include "../cpu/c51_macro.h" #include "../bsp/bsp_config.h" diff --git a/source/msp/msp_eeprom.c b/source/msp/msp_eeprom.c deleted file mode 100644 index 3020f46..0000000 --- a/source/msp/msp_eeprom.c +++ /dev/null @@ -1,153 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -///@copyright Copyright (c) 2018, 传控科技 All rights reserved. -///------------------------------------------------------------------------- -/// @file msp_eeprom.c -/// @brief msp @ driver config -///------------------------------------------------------------------------- -/// @version 1.0 -/// @author CC -/// @date 20190106 -/// @note cc_AS_stc02 由stc-isp v6.0860 -////////////////////////////////////////////////////////////////////////////// -#include "msp_eeprom.h" - -#include "../tpc/tpc_uart.h" - - -#define WT_30M 0x80 -#define WT_24M 0x81 -#define WT_20M 0x82 -#define WT_12M 0x83 -#define WT_6M 0x84 -#define WT_3M 0x85 -#define WT_2M 0x86 -#define WT_1M 0x87 - - -U_F16 uf_ee_add; - - -void L0_Iap_Idle() -{ - IAP_CONTR = 0; //关闭IAP功能 - IAP_CMD = 0; //清除命令寄存器 - IAP_TRIG = 0; //清除触发寄存器 - IAP_ADDRH = 0x80; //将地址设置到非IAP区域 - IAP_ADDRL = 0; -} - -char L0_Iap_Read(vU16 addr) -{ - char dat; - - IAP_CONTR = WT_12M; //使能IAP - IAP_CMD = 1; //设置IAP读命令 - IAP_ADDRL = addr; //设置IAP低地址 - IAP_ADDRH = addr >> 8; //设置IAP高地址 - IAP_TRIG = 0x5a; //写触发命令(0x5a) - IAP_TRIG = 0xa5; //写触发命令(0xa5) - _nop_(); - dat = IAP_DATA; //读IAP数据 - L0_Iap_Idle(); //关闭IAP功能 - - return dat; -} - -void L0_Iap_Program(vU16 addr, char dat) -{ - IAP_CONTR = WT_12M; //使能IAP - IAP_CMD = 2; //设置IAP写命令 - IAP_ADDRL = addr; //设置IAP低地址 - IAP_ADDRH = addr >> 8; //设置IAP高地址 - IAP_DATA = dat; //写IAP数据 - IAP_TRIG = 0x5a; //写触发命令(0x5a) - IAP_TRIG = 0xa5; //写触发命令(0xa5) - _nop_(); - L0_Iap_Idle(); //关闭IAP功能 -} - -///每个扇区512字节 -///指定地址可以为当前扇区内的任意地址,都会完整擦除当前扇区 -void L0_Iap_Erase(vU16 addr) -{ - IAP_CONTR = WT_12M; //使能IAP - IAP_CMD = 3; //设置IAP擦除命令 - IAP_ADDRL = addr; //设置IAP低地址 - IAP_ADDRH = addr >> 8; //设置IAP高地址 - IAP_TRIG = 0x5a; //写触发命令(0x5a) - IAP_TRIG = 0xa5; //写触发命令(0xa5) - _nop_(); // - L0_Iap_Idle(); //关闭IAP功能 -} - -void L0_Iap_Program_array(vU16 addr,U8 *buf,U8 len) -{ - U8 i = 0; - for(i=0;i>8 & 0xFF); - L0_uart0_uchex(i>>0 & 0xFF); - } - } -#endif - Lc_delay_ms(100); - L0_uart0_uc('%'); - - while(1); -} -#endif - diff --git a/source/msp/time.c b/source/msp/time.c index e34f228..8007b26 100644 --- a/source/msp/time.c +++ b/source/msp/time.c @@ -1,84 +1,28 @@ -#include "Time.h" +#include "time.h" +#define D_TIMER_COUNT(t,clk,timeInUs) (U16)(65536 - 1.0 * (clk) / 1000 * (1.0 * timeInUs / 1000) / t) +//#define D_TIMER_COUNT(t,clk,timeInUs) (U16)(65536 - (clk) / 1000 * timeInUs / 1000 / t) /*************初始化定时器0由 stc-isp v6.86L定时器计算器生成******************/ -#if(MainFre_5M == D_sys_MainFre) -#elif(MainFre_27M == D_sys_MainFre) -#elif(MainFre_22M == D_sys_MainFre) -void L0_timer0_Init(void) //25毫秒@22.1184MHz +void L0_timer0_Init(void) { + U16 val = D_TIMER_COUNT(12,D_sys_MainFre,D_sys_Jiffies * 1000); AUXR &= 0x7F; //定时器时钟12T模式 TMOD &= 0xF0; //设置定时器模式 - TL0 = 0x00; //设置定时初值 - TH0 = 0x4C; //设置定时初值 + //TL0 = 0x00; //设置定时初值 + //TH0 = 0x4C; //设置定时初值 + TL0 = val; //设置定时初值 + TH0 = val >> 8; //设置定时初值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET0 = 1; //add by cc } -/******************************************** -void L0_timer0_Init(void) //10毫秒@22.1184MHz -{ - AUXR &= 0x7F; //定时器时钟12T模式 - TMOD &= 0xF0; //设置定时器模式 - TL0 = 0x00; //设置定时初值 - TH0 = 0xB8; //设置定时初值 - TF0 = 0; //清除TF0标志 - TR0 = 1; //定时器0开始计时 - ET0 = 1; //add by cc -} - -void L0_timer0_Init_32k(void) //4fen@32kHz -{ - AUXR &= 0x7F; //定时器时钟12T模式 - TMOD &= 0xF0; //设置定时器模式 - #if 0 - TL0 = 0x00; //设置定时初值 - TH0 = 0xB8; //设置定时初值/// 4m20s 71 - #else - TL0 = 0x00; //设置定时初值 - TH0 = 0xcc; //设置定时初值// ff 4s - - - #endif - TF0 = 0; //清除TF0标志 - TR0 = 1; //定时器0开始计时 - ET0 = 1; //add by cc - BITN_0(DR_who_wakeup, DRB_who_wakeup_timer0); /// 标志中断类型: 定时器 -} -****************************************************/ - -#else ///MainFre_11M -void L0_timer0_Init(void) //10毫秒@11.0592MHz -{ - AUXR &= 0x7F; //定时器时钟12T模式 - TMOD &= 0xF0; //设置定时器模式 - TL0 = 0x00; //设置定时初值 - TH0 = 0xDC; //设置定时初值 - TF0 = 0; //清除TF0标志 - TR0 = 1; //定时器0开始计时 - ET0 = 1; //add by cc -} - -/******************************************** -void L0_timer0_Init(void) //25毫秒@11.0592MHz -{ - AUXR &= 0x7F; //定时器时钟12T模式 - TMOD &= 0xF0; //设置定时器模式 - TL0 = 0x00; //设置定时初值 - TH0 = 0xA6; //设置定时初值 - TF0 = 0; //清除TF0标志 - TR0 = 1; //定时器0开始计时 - ET0 = 1; //add by cc -} -****************************************************/ -#endif//D_sys_MainFre) - //10---87 10s /********************** Timer0中断函数************************/ /// 和 L0_timer0_Init 关联,需要配置 bsp_config.h中的 D_sys_MainFre /// 默认10ms 作为TTSS系统的定时引擎 -void timer0_isrHanddle (void) interrupt D_ISR_timer0 +void timer0_isrHandle (void) D_SERVE_TIMER0 {// NOP(); NOP(); NOP(); TF0 = 0; @@ -99,154 +43,64 @@ void timer0_isrHanddle (void) interrupt D_ISR_timer0 - - - - - - -#if(MainFre_5M == D_sys_MainFre) -#elif(MainFre_27M == D_sys_MainFre) -#elif(MainFre_22M == D_sys_MainFre) -/****************************** -void L0_Timer1_Init(void) //35毫秒@22.1184MHz -{///自动重载 - AUXR &= 0xFB; //定时器时钟12T模式 - T2L = 0x00; //设置定时初值 - T2H = 0x04; //设置定时初值 - AUXR |= 0x10; //定时器2开始计时 - - BITN_1(IE2, ET2);// IE2 = ET2; //使能定时器中断 -} -**********************************/ -#else ///MainFre_11M - -void L0_timer1_Init_7ms(void) //7毫秒@11.0592MHz +void L0_timer1_Init() //600微秒@11.0592MHz { - AUXR &= 0xBF; //定时器时钟12T模式 +#if 0 + AUXR |= 0x40; //定时器时钟1T模式 TMOD &= 0x0F; //设置定时器模式 - TL1 = 0xCD; //设置定时初值 + TL1 = 0x14; //设置定时初值 TH1 = 0xE6; //设置定时初值 TF1 = 0; //清除TF1标志 TR1 = 1; //定时器1开始计时 ET1 = 1; //add by cc -} -void L0_timer1_Init_5ms(void) //5毫秒@11.0592MHz -{//0x7F示波器测试大约40ms,led闪烁 肉眼可见 - AUXR &= 0xBF; //定时器时钟12T模式 +#else + U16 val = D_TIMER_COUNT(1,D_sys_MainFre,600); + AUXR |= 0x40; //定时器时钟1T模式 TMOD &= 0x0F; //设置定时器模式 - TL1 = 0x00; //设置定时初值 - TH1 = 0xEE; //设置定时初值 + //TL1 = 0xCD; //设置定时初始值 + //TH1 = 0xD4; //设置定时初始值 + TL1 = val; //设置定时初值 + TH1 = val >>8; //设置定时初值 TF1 = 0; //清除TF1标志 TR1 = 1; //定时器1开始计时 ET1 = 1; //add by cc +#endif } -void L0_timer1_Init_1ms(void) //1毫秒@11.0592MHz + +void L0_timer1_restart() //600微秒@11.0592MHz { + U16 val = D_TIMER_COUNT(1,D_sys_MainFre,600); + TR1 = 0; //先关闭,否则会重复中断,起不到resetart效果 +#if 1 AUXR |= 0x40; //定时器时钟1T模式 TMOD &= 0x0F; //设置定时器模式 - TL1 = 0xCD; //设置定时初值 - TH1 = 0xD4; //设置定时初值 + //TL1 = 0x14; //设置定时初值 + //TH1 = 0xE6; //设置定时初值 + TL1 = val; //设置定时初值 + TH1 = val >>8; //设置定时初值 TF1 = 0; //清除TF1标志 TR1 = 1; //定时器1开始计时 ET1 = 1; //add by cc -} -void L0_timer1_Init(void) //600微秒@11.0592MHz -{ +#else AUXR |= 0x40; //定时器时钟1T模式 TMOD &= 0x0F; //设置定时器模式 - TL1 = 0x14; //设置定时初值 - TH1 = 0xE6; //设置定时初值 + TL1 = 0xCD; //设置定时初始值 + TH1 = 0xD4; //设置定时初始值 TF1 = 0; //清除TF1标志 TR1 = 1; //定时器1开始计时 ET1 = 1; //add by cc +#endif } - -//0x7F示波器测试大约40ms,led闪烁 肉眼可见 -void L0_timer1_reset(void) +void L0_timer1_stop(void) { TR1 = 0; - TL1 = 0x14; //设置定时初值 - TH1 = 0xE6; //设置定时初值 - TR1 = 1; TF1 = 0; } -#endif//D_sys_MainFre) - - -#if 0 -void L0_Timer1Init(void) -{ - #if 0 - - //30毫秒@22.1184MHz - AUXR &= 0xBF; //定时器时钟12T模式 - TMOD &= 0x0F; //设置定时器模式 - TMOD |= 0x10; //设置定时器模式 - TL1 = 0x00; //设置定时初值 - TH1 = 0x28; //设置定时初值 - TF1 = 0; //清除TF1标志 -#else - TMOD = 0x40; //外部计数模式 - TL1 = (0xff-10); - TH1 = 0xff; - - - #endif -// TR1 = 1; //定时器1开始计时 - L0_TIMER1_start(); - //L0_TIMER1_end(); - L0_TIMER1_isr_CLOSE(); -/// ET1 = 1; // add by cc 启动定时器1的中断 -} - -void L0_timer1_Init(void) //计数器1初始化 -{ - - TMOD = 0x40; //外部计数模式 - TL1 = 0x9c; - TH1 = 0xff; - // TR1 = 1; //启动定时器 - ET1 = 1; //使能定时器中断 - // EA = 1; -} -#define L0_timer1_on(); TR1 = 1; //启动计数器 -#define L0_timer1_off(); TR1 = 0; //关闭计数器 //启动计数器 - -//10---87 10s -/********************** Timer0中断函数************************/ -/// 和 L0_timer0_Init 关联,需要配置 bsp_config.h中的 D_sys_MainFre -/// 默认10ms 作为TTSS系统的定时引擎 -void timer1_inr (void) interrupt 3 -{ - -/******* - s_task_GC032A.usN ++; - s_task_GC032A.buf[s_task_GC032A.usN] = P1; - if(s_task_GC032A.usN < D_row_max) - { - - }else - { - s_task_GC032A.status = 1; - } -// task_handler.line_camera++; -****************/ -} - -#endif - - - - - - - /******************************END*********************************/ diff --git a/source/msp/time.h b/source/msp/time.h index 1f49191..6d78f09 100644 --- a/source/msp/time.h +++ b/source/msp/time.h @@ -6,7 +6,9 @@ #include "../bsp/bsp_config.h" #include "../ctask/tick.h" - +extern void L0_timer1_stop(void); +extern void L0_timer1_start(); +extern void L0_timer1_restart(void); //600微秒@11.0592MHz extern void L0_timer1_Init(void); extern void L0_timer1_reset(void); extern void L0_timer1_off(void); diff --git a/source/msp/uart2.c b/source/msp/uart2.c new file mode 100644 index 0000000..3884af7 --- /dev/null +++ b/source/msp/uart2.c @@ -0,0 +1,156 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2015, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +// 20160413 CC-ACC-VH02 +// 连接至 J22 RXD0 TXD0 +//P5_DIR &= ~BITN1; //p5.1输出TXD +//P5_DIR |= BITN0; //p5.0输入RXD +//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD +//P5_SEL1 |= BITN0 +BITN1; + +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ +#include "uart2.h" +#include "../app/common.h" + +//#define _USE_485 + +static volatile Ts_uart_send_buf idata ts_uart_send_shop; +TP_Handler_X s_uart2_rec; +TS_PH3_ccmodbus s_uart2_ack; + +void L0_uart2_init(void) +{ +#if(MainFre_11M == D_sys_MainFre) //115200bps@11.0592MHz + S2CON = 0x50; //8位数据,可变波特率 + AUXR |= 0x04; //定时器2时钟为Fosc,即1T + T2L = 0xE8; //设定定时初值 + T2H = 0xFF; //设定定时初值 + AUXR |= 0x10; //启动定时器2 + +#elif (MainFre_22M == D_sys_MainFre) //115200bps@22.1184MHz + S2CON = 0x50; //8位数据,可变波特率 + AUXR |= 0x04; //定时器2时钟为Fosc,即1T + T2L = 0xD0; //设定定时初值 + T2H = 0xFF; //设定定时初值 + AUXR |= 0x10; //启动定时器2 +#endif +} + +void L0_uart2_buf_init(void) +{ + ts_uart[uNum2].p = &ts_uart_send_shop; + ts_uart[uNum2].p->now = 0; + ts_uart[uNum2].p->ok = D_ready; + ts_uart[uNum2].t = &s_uart2_rec; + ts_uart[uNum2].t->head_0 = D_CMD_Filter1_ff; + ts_uart[uNum2].t->head_1 = D_CMD_Filter2_fe; + ts_uart[uNum2].t->head = 0; + ts_uart[uNum2].t->ok = 0; + ts_uart[uNum2].tp_handler = L1_s2b_PH3; + ts_uart[uNum2].ack = (U8*)&s_uart2_ack; + L0_uart2_init(); + D_uart2_ES_INT(1); //打开串口中断 + +#if (D_UART2_485_TYPE != TYPE_485_NONE) + D_UART2_485_RX() //默认处于接收状态 +#endif +} + +void L0_uart2_sendArray(U8 * buf, U16 len) +{ +#if (D_UART2_485_TYPE != TYPE_485_NONE) + D_UART2_485_TX() //切换到输出状态 +#endif + L0_uartN_sendArray(uNum2,buf,len); +} + +/************************************************* +UART 中断 +*************************************************/ +#define D_SERVE_uart2 interrupt 8 +void INTERRUPT_uart2(void) D_SERVE_uart2// using 2 +{ + //NOP(); NOP(); NOP(); + if(L0_uart2_IntRI()) //如果是U2接收中断 + { + L0_uart2_IntRIClear(); //清除接收中断标志 + ts_uart[uNum2].t->reg = L0_uartN_get(uNum2); + ts_uart[uNum2].tp_handler(ts_uart[uNum2].t); + } + if(L0_uart2_IntTI()) //如果是U0发送中断 + { + L0_uart2_IntTIClear(); //清除发送中断标志 + if(ts_uart[uNum2].p->max != ts_uart[uNum2].p->now) + { + L0_uartN_set(uNum2,ts_uart[uNum2].p->p[ts_uart[uNum2].p->now]); + ts_uart[uNum2].p->now ++; + } + else + { + ts_uart[uNum2].p->ok = D_ready; + ts_uart[uNum2].p->max = 0; + ts_uart[uNum2].p->now = 0;//可以发送下一个数据 +#if (D_UART2_485_TYPE != TYPE_485_NONE) + D_UART2_485_RX() //切换到接收状态 +#endif + + } + } + //NOP(); NOP(); NOP(); +} + + + + + + + + + + + diff --git a/source/msp/uart2.h b/source/msp/uart2.h new file mode 100644 index 0000000..8d2835b --- /dev/null +++ b/source/msp/uart2.h @@ -0,0 +1,86 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2015, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +////////////////////////////////////////////////////////////////////////// +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_uart2_Init + uart2_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ + + +#ifndef _uart2_H +#define _uart2_H + +#include "../bsp/bsp_config.h" +#include "../tpc/tpc_ccmodbus.h" +#include "uartN.h" + +#define uNum2 1 + +#define D_uart2_ES_INT(x) (x) ? (BITN_1(IE2,ES2)) : (BITN_0(IE2,ES2)) +#define L0_uart2_IntRI() (S2CON & S2RI)//BITN_G(SCON,U0RI) +#define L0_uart2_IntTI() (S2CON & S2TI)//BITN_G(SCON,U0TI) +#define L0_uart2_IntRIClear(); BITN_0(S2CON,S2RI) +#define L0_uart2_IntTIClear(); BITN_0(S2CON,S2TI) + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +void L0_uart2_buf_init(void); +void L0_uart2_sendArray(U8 * buf, U16 len); + +#define L0_uart2_uc(X) L0_uartN_uc(uNum2,X) +#define L0_uart2_us(X) L0_uartN_us(uNum2,X) +#define L0_uart2_ul(X) L0_uartN_ul(uNum2,X) +#define L0_uart2_0d0a() L0_uartN_0d0a(0) +#define L0_uart2_uchex(X) L0_uartN_uchex(uNum2,X) +#define L0_uart2_ushex(X) L0_uartN_ushex(uNum2,X) +#define L0_uart2_ulhex(X) L0_uartN_ulhex(uNum2,X) +#define L0_uart2_sendstr(buf) L0_uartN_sendstr(uNum2,buf) + +extern TP_Handler_X s_uart2_rec; +extern TS_PH3_ccmodbus s_uart2_ack; + +#endif //#ifndef _uart2_H + diff --git a/source/msp/uart3.c b/source/msp/uart3.c new file mode 100644 index 0000000..5c59ccb --- /dev/null +++ b/source/msp/uart3.c @@ -0,0 +1,170 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2015, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +// 20160413 CC-ACC-VH02 +// 连接至 J22 RXD0 TXD0 +//P5_DIR &= ~BITN1; //p5.1输出TXD +//P5_DIR |= BITN0; //p5.0输入RXD +//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD +//P5_SEL1 |= BITN0 +BITN1; + +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ +#include "uart3.h" +#include "time.h" +#include + +static volatile Ts_uart_send_buf idata ts_uart_send_shop; +struct _tp_handler_x s_uart3_rec; +TS_PH4_modbus s_uart3_ack; + +void L0_uart3_init(void) +{ +#if(MainFre_11M == D_sys_MainFre) //115200bps@11.0592MHz + S3CON = 0x10; //8位数据,可变波特率 + S3CON |= 0x40; //串口3选择定时器3为波特率发生器 + T4T3M |= 0x02; //定时器3时钟为Fosc,即1T + T3L = 0xE8; //设定定时初值 + T3H = 0xFF; //设定定时初值 + T4T3M |= 0x08; //启动定时器3 + +#elif (MainFre_22M == D_sys_MainFre) //115200bps@22.1184MHz + S3CON = 0x10; //8位数据,可变波特率 + S3CON |= 0x40; //串口3选择定时器3为波特率发生器 + T4T3M |= 0x02; //定时器3时钟为Fosc,即1T + T3L = 0xD0; //设定定时初值 + T3H = 0xFF; //设定定时初值 + T4T3M |= 0x08; //启动定时器3 +#endif + +} + +void L0_uart3_buf_init(void) +{ + ts_uart[uNum3].p = &ts_uart_send_shop; + ts_uart[uNum3].p->now = 0; + ts_uart[uNum3].p->ok = D_ready; + ts_uart[uNum3].t = &s_uart3_rec; + ts_uart[uNum3].t->head = 0; + ts_uart[uNum3].t->ok = 0; + ts_uart[uNum3].tp_handler = L1_s2b_PH4; + ts_uart[uNum3].ack = (U8*)&s_uart3_ack; + L0_uart3_init(); + //D_uart3_ES_INT_OPEN(); //打开串口中断 + D_uart3_ES_INT(1); //打开串口中断 + +#if (D_UART3_485_TYPE != TYPE_485_NONE) + D_UART3_485_RX() //默认处于接收状态 +#endif +} + +void L0_uart3_sendArray(U8 * buf, U16 len) +{ +#if (D_UART3_485_TYPE != TYPE_485_NONE) + D_UART3_485_TX() //切换到输出状态 +#endif + L0_uartN_sendArray(uNum3,buf,len); +} + +/************************************************* +UART 中断 +*************************************************/ +#define D_SERVE_UART3 interrupt 17 +void INTERRUPT_UART3(void) D_SERVE_UART3// using 3 +{ + NOP(); NOP(); NOP(); + if(L0_uart3_IntRI()) //如果是U0接收中断 + { + L0_uart3_IntRIClear(); //清除接收中断标志 + ts_uart[uNum3].t->reg = L0_uartN_get(uNum3); + ts_uart[uNum3].tp_handler(ts_uart[uNum3].t); + //L0_timer4_start(0); + } + if(L0_uart3_IntTI()) + { + if(L0_uart3_IntTI()) //如果是U0发送中断 + { + L0_uart3_IntTIClear(); //清除发送中断标志 + if(ts_uart[uNum3].p->max != ts_uart[uNum3].p->now) + { + L0_uartN_set(uNum3,ts_uart[uNum3].p->p[ts_uart[uNum3].p->now]); + ts_uart[uNum3].p->now ++; + } + else + { + ts_uart[uNum3].p->ok = D_ready; + ts_uart[uNum3].p->max = 0; + ts_uart[uNum3].p->now = 0;//可以发送下一个数据 +#if (D_UART3_485_TYPE != TYPE_485_NONE) + D_UART3_485_RX() //切换到接收状态 +#endif + } + } + } + NOP(); NOP(); NOP(); +} + +void timer4_isrHanddle(void) D_SERVE_TIMER4 +{ + struct _tp_handler_x *p = &s_uart3_rec; + if((p->head == 1) && (p->num >= D_s_modbus_min)) + { + p->head = 0; + crc16_irq(p->crc,p->buf,p->num - 2); //校验CRC + if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1]) + { + if(p->ok == 0) + { + p->ok = 1; + } + } + LED0 ^= 1; + } + L0_timer4_stop(); +} + + diff --git a/source/msp/uart3.h b/source/msp/uart3.h new file mode 100644 index 0000000..a4e2ea8 --- /dev/null +++ b/source/msp/uart3.h @@ -0,0 +1,93 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2015, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +////////////////////////////////////////////////////////////////////////// +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_uart3_Init + uart3_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ + + +#ifndef _uart3_H +#define _uart3_H + +#include "../bsp/bsp_config.h" +#include "../tpc/tpc_modbus.h" +#include "uartN.h" + +#define uNum3 2 + +//#define S4SM0 BITN7 +#define D_uart3_ES_INT(x) (x) ? (BITN_1(IE2,ES3)) : (BITN_0(IE2,ES3)) +//#define D_uart3_ES_INT_CLOSE() BITN_0(IE2,ES3) +//#define D_uart3_ES_INT_OPEN() BITN_1(IE2,ES3) +#define L0_uart3_IntRI() (S3CON & S3RI)//BITN_G(SCON,U0RI) +#define L0_uart3_IntTI() (S3CON & S3TI)//BITN_G(SCON,U0TI) +#define L0_uart3_IntRIClear(); BITN_0(S3CON,S3RI) +#define L0_uart3_IntTIClear(); BITN_0(S3CON,S3TI) +#define L0_uart3_set(x) S3BUF = (x); +#define L0_uart3_get() (S3BUF) + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +void L0_uart3_buf_init(void); +void L0_uart3_sendArray(U8 * buf, U16 len); + +#define L0_uart3_uc(X) L0_uartN_uc(uNum3,X) +#define L0_uart3_us(X) L0_uartN_us(uNum3,X) +#define L0_uart3_ul(X) L0_uartN_ul(uNum3,X) +#define L0_uart3_0d0a() L0_uartN_0d0a(uNum3) +#define L0_uart3_uchex(X) L0_uartN_uchex(uNum3,X) +#define L0_uart3_ushex(X) L0_uartN_ushex(uNum3,X) +#define L0_uart3_ulhex(X) L0_uartN_ulhex(uNum3,X) +#define L0_uart3_sendstr(buf) L0_uartN_sendstr(uNum3,buf) +#define L1_uart3_uchexArray(buf) L1_uartN_uchexArray(uNum3,buf) + +extern TP_Handler_X s_uart3_rec; +extern TS_PH4_modbus s_uart3_ack; + +#endif //#ifndef _uart3_H + diff --git a/source/msp/uart4.C b/source/msp/uart4.C new file mode 100644 index 0000000..9184f55 --- /dev/null +++ b/source/msp/uart4.C @@ -0,0 +1,169 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2015, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +// 20160413 CC-ACC-VH02 +// 连接至 J22 RXD0 TXD0 +//P5_DIR &= ~BITN1; //p5.1输出TXD +//P5_DIR |= BITN0; //p5.0输入RXD +//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为uart4 RXD TXD +//P5_SEL1 |= BITN0 +BITN1; + +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_uart4_Init + uart4_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ +#include "uart4.h" + +//#define _USE_485 + +static volatile Ts_uart_send_buf idata ts_uart_send_shop; +//TP_Handler_X s_uart4_at_rec; +//TP_Handler_X s_uart4_tcp_rec; +TP_Handler_X s_uart4_rec; +TS_PH3_ccmodbus s_uart4_ack; + +//#define FOSC 11059200L //系统频率 +//#define BAUD4 115200 //串口波特率 +void L0_uart4_init(void)//115200bps@11.0592MHz +{ + #if(MainFre_11M == D_sys_MainFre) +#if 0 + S4CON = 0x50; //8位可变波特率 + T4L = (65536 - (FOSC/4/BAUD4)); //设置波特率重装值 + T4H = (65536 - (FOSC/4/BAUD4))>>8; + T4T3M |= 0x20; //定时器4为1T模式 + T4T3M |= 0x80; //定时器4开始计时 +#else + S4CON = 0x10; //8位数据,可变波特率 + S4CON |= 0x40; //串口4选择定时器4为波特率发生器 + T4T3M |= 0x20; //定时器4时钟为Fosc,即1T + T4L = 0xE8; //设定定时初值 + T4H = 0xFF; //设定定时初值 + T4T3M |= 0x80; //启动定时器4 +#endif + + +#elif (MainFre_22M == D_sys_MainFre) //115200bps@22.1184MHz + S4CON = 0x10; //8位数据,可变波特率 + S4CON |= 0x40; //串口4选择定时器4为波特率发生器 + T4T3M |= 0x20; //定时器4时钟为Fosc,即1T + T4L = 0xD0; //设定定时初值 + T4H = 0xFF; //设定定时初值 + T4T3M |= 0x80; //启动定时器4 +#endif +} + +void L0_uart4_buf_init(void) +{ + ts_uart[uNum4].p = &ts_uart_send_shop; + ts_uart[uNum4].p->now = 0; + ts_uart[uNum4].p->ok = D_ready; + ts_uart[uNum4].t = &s_uart4_rec; + ts_uart[uNum4].t->head_0 = D_CMD_Filter1_ff; + ts_uart[uNum4].t->head_1 = D_CMD_Filter2_fe; + ts_uart[uNum4].t->head = 0; + ts_uart[uNum4].t->ok = 0; + ts_uart[uNum4].tp_handler = L1_s2b_PH3; + ts_uart[uNum4].ack = (U8*)&s_uart4_ack; + + //s_uart4_tcp_rec.head_0 = D_CMD_Filter1_ff; + //s_uart4_tcp_rec.head_1 = D_CMD_Filter2_fe; + //s_uart4_tcp_rec.head = 0; + //s_uart4_tcp_rec.ok = 0; + L0_uart4_init(); + D_uart4_ES_INT(1); //打开串口中断 + +#if (D_UART4_485_TYPE != TYPE_485_NONE) + D_UART4_485_RX() //默认处于接收状态 +#endif +} + +void L0_uart4_sendArray(U8 * buf, U16 len) +{ +#if (D_UART4_485_TYPE != TYPE_485_NONE) + D_UART4_485_TX() //切换到输出状态 +#endif + L0_uartN_sendArray(uNum4,buf,len); +} + +/************************************************* +UART 中断 +*************************************************/ + +#define D_SERVE_uart4 interrupt 18 +void INTERRUPT_uart4(void) D_SERVE_uart4// using 2 +{ +#if 1 + //NOP(); NOP(); NOP(); + if(L0_uart4_IntRI()) //如果是U0接收中断 + { + L0_uart4_IntRIClear(); //清除接收中断标志 + ts_uart[uNum4].t->reg = L0_uartN_get(uNum4); + ts_uart[uNum4].tp_handler(ts_uart[uNum4].t); + } + if(L0_uart4_IntTI()) //如果是U0发送中断 + { + L0_uart4_IntTIClear(); //清除发送中断标志 + if(ts_uart[uNum4].p->max != ts_uart[uNum4].p->now) + { + L0_uartN_set(uNum4,ts_uart[uNum4].p->p[ts_uart[uNum4].p->now]); + ts_uart[uNum4].p->now ++; + } + else + { + ts_uart[uNum4].p->ok = D_ready; + ts_uart[uNum4].p->max = 0; + ts_uart[uNum4].p->now = 0;//可以发送下一个数据 +#if (D_UART4_485_TYPE != TYPE_485_NONE) + D_UART4_485_RX() //切换到接收状态 +#endif + + } + } + //NOP(); NOP(); NOP(); +#endif +} + + diff --git a/source/msp/uart4.h b/source/msp/uart4.h new file mode 100644 index 0000000..b70da6c --- /dev/null +++ b/source/msp/uart4.h @@ -0,0 +1,88 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2015, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +////////////////////////////////////////////////////////////////////////// +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_uart4_Init + uart4_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ + + +#ifndef _uart4_H +#define _uart4_H + +#include "../bsp/bsp_config.h" +#include "../tpc/tpc_ccmodbus.h" +#include "uartN.h" + +#define uNum4 3 + +#define D_uart4_ES_INT(x) (x) ? (BITN_1(IE2,ES4)) : (BITN_0(IE2,ES4)) +#define L0_uart4_IntRI() (S4CON & S4RI)//BITN_G(SCON,U0RI) +#define L0_uart4_IntTI() (S4CON & S4TI)//BITN_G(SCON,U0TI) +#define L0_uart4_IntRIClear(); BITN_0(S4CON,S4RI) +#define L0_uart4_IntTIClear(); BITN_0(S4CON,S4TI) + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +void L0_uart4_buf_init(void); +void L0_uart4_sendArray(U8 * buf, U16 len); + +#define L0_uart4_uc(X) L0_uartN_uc(uNum4,X) +#define L0_uart4_us(X) L0_uartN_us(uNum4,X) +#define L0_uart4_ul(X) L0_uartN_ul(uNum4,X) +#define L0_uart4_0d0a() L0_uartN_0d0a(0) +#define L0_uart4_uchex(X) L0_uartN_uchex(uNum4,X) +#define L0_uart4_ushex(X) L0_uartN_ushex(uNum4,X) +#define L0_uart4_ulhex(X) L0_uartN_ulhex(uNum4,X) +#define L0_uart4_sendstr(buf) L0_uartN_sendstr(uNum4,buf) +#define L1_uart4_uchexArray(buf) L1_uartN_uchexArray(uNum4,buf) + +extern TP_Handler_X s_uart4_rec; +extern TS_PH3_ccmodbus s_uart4_ack; + +#endif //#ifndef _uart4_H + diff --git a/source/msp/uart_x.c b/source/msp/uart_x.c new file mode 100644 index 0000000..3be3670 --- /dev/null +++ b/source/msp/uart_x.c @@ -0,0 +1,211 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2015, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +// 20160413 CC-ACC-VH02 +// 连接至 J22 RXD0 TXD0 +//P5_DIR &= ~BITN1; //p5.1输出TXD +//P5_DIR |= BITN0; //p5.0输入RXD +//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD +//P5_SEL1 |= BITN0 +BITN1; + +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ +#include "uart_x.h" + +TS_uart_reg idata ts_uart[SERIAL_MAX_NUM] = {0}; + +void L0_uartN_set(U8 uartx,U8 x) /*reentrant*/ +{ + switch(uartx) + { + case 0:SBUF = (x);break; + case 1:S2BUF = (x);break; + case 2:S3BUF = (x);break; + case 3:S4BUF = (x);break; + default:break; + } +} + +U8 L0_uartN_get(U8 uartx) +{ + U8 x = 0; + switch(uartx) + { + case 0:x = SBUF; break; + case 1:x = S2BUF;break; + case 2:x = S3BUF;break; + case 3:x = S4BUF;break; + default:break; + } + return x; +} + +void L0_waitFree_uartN(U8 uartx) +{ + ts_uart[uartx].p->over = 0; + while(ts_uart[uartx].p->ok != D_ready) + { + #if 0 //发送数据特别快时,某些情况下会导致数据发送出错 + if(ts_uart[uartx].p->over ++ > 600000) + { + break; + } + #endif + } +} + +void L0_uartN_sendArray(U8 uartx,void *buf,U16 len) +{ + L0_waitFree_uartN(uartx); + ts_uart[uartx].p->ok = D_clear; + ts_uart[uartx].p->over = 0; + ts_uart[uartx].p->max = len; + ts_uart[uartx].p->now = 1; + if(len <= D_UART_send_buf_max) + { + //将参数buf拷贝至内部buf + for(ts_uart[uartx].p->num = 0;ts_uart[uartx].p->num < len;ts_uart[uartx].p->num ++) + { + ts_uart[uartx].p->buf[ts_uart[uartx].p->num] = ((U8*)buf)[ts_uart[uartx].p->num]; + } + ts_uart[uartx].p->p = ts_uart[uartx].p->buf; + } + else + { + //不使用内部buf,如果再发送完毕之前,参数buf被回收,发送会出错 + ts_uart[uartx].p->p = (U8 *)buf; + } + L0_uartN_set(uartx,ts_uart[uartx].p->p[0]); +} + +void L0_uartN_uc(U8 uartx,U8 ww) +{ + L0_uartN_sendArray(uartx,&ww,1); +} + +void L0_uartN_us(U8 uartx,vU16 ww) +{ + U_U16 uStemp; + uStemp.word = ww; + ts_uart[uartx].p->buf3[0] = uStemp.BYTE2.h; + ts_uart[uartx].p->buf3[1] = uStemp.BYTE2.l; + L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,2); +} + +void L0_uartN_ul(U8 uartx,vU32 ww) +{ + U_U32 uStemp; + L0_waitFree_uartN(uartx); + uStemp.dWord = ww; + ts_uart[uartx].p->buf3[0] = uStemp.BYTE4.byte0; + ts_uart[uartx].p->buf3[1] = uStemp.BYTE4.byte1; + ts_uart[uartx].p->buf3[2] = uStemp.BYTE4.byte2; + ts_uart[uartx].p->buf3[3] = uStemp.BYTE4.byte3; + L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,4); +} + +void L0_uartN_0d0a(U8 uartx) +{ + L0_waitFree_uartN(uartx); + ts_uart[uartx].p->buf3[0] = 0x0d; + ts_uart[uartx].p->buf3[1] = 0x0a; + L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,2); +} + +void L0_uartN_uchex(U8 uartx,U8 ww) +{ + L0_waitFree_uartN(uartx); + ts_uart[uartx].p->buf3[0] = cguHex2Char[D_uc_high(ww)][1]; + ts_uart[uartx].p->buf3[1] = cguHex2Char[D_uc_low (ww)][1]; + L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,2); +} + +void L0_uartN_ushex(U8 uartx,vU16 ww) +{ + U_F16 k; + L0_waitFree_uartN(uartx); + k.us = ww; + ts_uart[uartx].p->buf3[0] = cguHex2Char[D_uc_high(k.BYTE2.H)][1]; + ts_uart[uartx].p->buf3[1] = cguHex2Char[D_uc_low (k.BYTE2.H)][1]; + ts_uart[uartx].p->buf3[2] = cguHex2Char[D_uc_high(k.BYTE2.L)][1]; + ts_uart[uartx].p->buf3[3] = cguHex2Char[D_uc_low (k.BYTE2.L)][1]; + L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,4); +} + +void L0_uartN_ulhex(U8 uartx,U32 ww) +{ + U_U32 k; + L0_waitFree_uartN(uartx); + k.dWord = ww; + ts_uart[uartx].p->buf3[0] = cguHex2Char[D_uc_high(k.BYTE4.byte0)][1]; + ts_uart[uartx].p->buf3[1] = cguHex2Char[D_uc_low (k.BYTE4.byte0)][1]; + ts_uart[uartx].p->buf3[2] = cguHex2Char[D_uc_high(k.BYTE4.byte1)][1]; + ts_uart[uartx].p->buf3[3] = cguHex2Char[D_uc_low (k.BYTE4.byte1)][1]; + ts_uart[uartx].p->buf3[4] = cguHex2Char[D_uc_high(k.BYTE4.byte2)][1]; + ts_uart[uartx].p->buf3[5] = cguHex2Char[D_uc_low (k.BYTE4.byte2)][1]; + ts_uart[uartx].p->buf3[6] = cguHex2Char[D_uc_high(k.BYTE4.byte3)][1]; + ts_uart[uartx].p->buf3[7] = cguHex2Char[D_uc_low (k.BYTE4.byte3)][1]; + L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,8); +} + +void L0_uartN_sendstr(U8 uartx,U8 *str) +{ + L0_uartN_sendArray(uartx,str,Lc_strlen(str)); +} + +void L0_uartN_uchexArray(U8 uartx,vU8 *buf,U16 n) +{ + int i; + for(i=0;i>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +//L1_uart_2strbuf(&s_uart0_rec);s_uart0_rec.ok = 2 +/// 接收以od oa为结束的标准的assci码的协议 类似 send xx (回车换行)测试时注意以回车换行 +/// 为结束标志,也就是发送的数据后面 必须有回车换行 :0x0d 0x0a + + +//对于连续的多条协议,比如:abcdefg\r\n12345\r\n,如果前一条处理不及时,可能会被后一条覆盖 +void L1_s2b_0d0a(struct _tp_handler_x *p) //reentrant +{ + if(p->head == 0) + { + p->head = 1; + p->num = 0; + } + + if(p->num >= D_tp_handle_x_len) + { + p->num = 0; + } + p->cashe[1] = p->cashe[0]; + p->cashe[0] = p->reg;// + + p->buf[++p->num] = p->cashe[0]; + //p->buf[++p->num] = p->cashe[0]; + + if ((p->num > 2) && (p->cashe[0] == 0x0a) && (p->cashe[1] == 0x0d))// 0d0a + { + if(1 != p->ok) + { + p->buf[0] = p->num - 2; //去掉0d0a + if(p->sp2 != NULL) //备份缓冲区不为null + { + //byte_copy_uc(p->buf + 1,p->__buf,p->num-2); //经过调试,此处不要调用外部函数,入栈出栈会增加出错风险 + for(p->i=0;p->ibuf[0]+1;p->i++) + { + p->sp2[p->i] = p->buf[p->i]; + } + } + p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文 + } + p->head = 0; + } +} + diff --git a/source/tpc/0d0a.h b/source/tpc/0d0a.h new file mode 100644 index 0000000..ddf5a39 --- /dev/null +++ b/source/tpc/0d0a.h @@ -0,0 +1,33 @@ +#ifndef TPC_0D0A_H +#define TPC_0D0A_H + +#include "tpc_x.h" + +///----------------------------------------------------------------------------------------- +//#define D_s_SSTR_0D0A_len 64 //str类的协议需要长度大一些,容易bug的地方,限制为接收64bytes的数据 +#if 0 +#define FLAG_NONE 0 +#define FLAG_DISCARD 1 +#define FLAG_CCID 2 +#define FLAG_CIP 3 +typedef struct _s_PC1_0D0A_ +{//8byte + vU8 reg; + // vU8 sub_num; //接收到的数目注意数据长度的范围 + vU8 head; //接收标志头标志 + + vU8 cashe[4]; + //vU8 filter1; + //vU8 filter2; + vU8 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围 + + vU8 ok; //接收协议ok标志 + vU8 max; //接收到的数目的最大值 + vU8 __buf[D_s_SSTR_0D0A_len+1];//buffer + vU8 buf[D_s_SSTR_0D0A_len+1];//array的第一位是 长度 //协议缓冲 + // U8 pro[16]; ///解析协议用 +}TS_Handle_0d0a; +#endif +extern void L1_s2b_0d0a(struct _tp_handler_x *p); //reentrant; + +#endif diff --git a/source/tpc/ccmodbus.c b/source/tpc/ccmodbus.c new file mode 100644 index 0000000..b847efa --- /dev/null +++ b/source/tpc/ccmodbus.c @@ -0,0 +1,182 @@ + +/***************************************************************************** +update by cc @201501101001 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +uartcom/uartlib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/uartcom0 + 和uart相关的通讯协议 com + n + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/uprotocol: 主要是为 uartcom + n服务的 驱动层到应用层缓存的过度 +公用的串口通讯定义 + struct _s_protocol_ 的公共协议包(关键的结构体)的声明------struct _s_protocol_ + void L1_uart_2buf(struct _s_protocol_ *p)串行数据保存到缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc----------s_at0 +----------------------------------------------------------------------------------------- +********************************************************************************/ + +#include "ccmodbus.h" +#include "../clib/clib.h" + +#if 0 +U8 L3_pack_ccmodbus_03(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num) +{ + U8 bufsize = 4; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_READ; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = num >> 8 * 0xFF; + pmodbus->buf[3] = num >> 0 & 0xFF; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +U8 L3_pack_ccmodbus_06(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf) +{ + U8 bufsize = 4; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_WRITE; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = buf[0]; + pmodbus->buf[3] = buf[1]; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +U8 L3_pack_ccmodbus_10(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num, U8 bytes, U8 *buf) +{ + U8 bufsize = 5,i = 0; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_WRITE_M; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = num >> 8 * 0xFF; + pmodbus->buf[3] = num >> 0 & 0xFF; + pmodbus->buf[4] = bytes; + + for(i=0;ibuf[5+i] = buf[i]; + } + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize + bytes); + pmodbus->buf[bufsize + bytes] = pmodbus->crc[0]; + pmodbus->buf[bufsize + bytes + 1] = pmodbus->crc[1]; + + return bufsize + bytes + 2 + 2; +} +#endif + +U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, MD_SLAVER_INFO *slaver_info) +{ + U8 pkglen = 0; + pccmodbus->filter1 = D_CMD_Filter1_ff; + pccmodbus->filter2 = D_CMD_Filter2_fe; + pccmodbus->num = L3_pack_modbus((TS_PH4_modbus*)&pccmodbus->slaver, slaver_info); +#if 0 + switch(slaver_info->oper) + { + case MODBUS_OPER_READ: + pkglen = L3_pack_ccmodbus_03(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum); + break; + case MODBUS_OPER_WRITE: + pkglen = L3_pack_ccmodbus_06(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->buf); + break; + case MODBUS_OPER_WRITE_M: + pkglen = L3_pack_ccmodbus_10(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf); + break; + default: + break; + } + pccmodbus->num = pkglen; +#endif + return pccmodbus->num + 3; +} + +U16 L3_ccmodbus_slaver_ack(TS_PH3_ccmodbus *pccmodbus,TS_PH3_ccmodbus *pModbusAck) +{ + U16 pkglen = L3_modbus_slaver_ack((TS_PH4_modbus*)&pccmodbus->slaver, (TS_PH4_modbus*)&pModbusAck->slaver); + pModbusAck->filter1 = D_CMD_Filter1_ff; + pModbusAck->filter2 = D_CMD_Filter2_fe; + pModbusAck->num = pkglen; + return pkglen + 3; +} + +void L3_ccmodbus_master_handler(TS_PH3_ccmodbus *pmodbus,MD_SLAVER_INFO *p_slaver_info) +{ + L3_modbus_master_handler((TS_PH4_modbus*)pmodbus->slaver,p_slaver_info); +} + +///FF FE 08 52 16 11 22 33 44 F5 9F 发送了一个modbus协议包(8个数据52 16 11 22 33 44 F5 9F ) +/// 0 1 2 3 4 5 6 7 8 9 10 +/// 协议表达的意思为地址为0x52的从机, 功能码16 数据为11 22 33 44,校验码 F5 9F +void L1_s2b_PH3(struct _tp_handler_x *p)// reentrant +{ + p->cashe[1] = p->cashe[0]; + p->cashe[0] = p->reg;// + + if (0 == p->head) + { + if ((p->cashe[1] == p->head_0)&&(p->cashe[0] == p->head_1)) + { + p->head = 1; + p->max = D_tp_handle_x_len; + p->sp = p->buf; + p->num = 0; + p->sp[p->num++] = p->head_0; + p->sp[p->num++] = p->head_1; + } + } + else + { + p->sp[p->num++] = p->cashe[0]; + if(p->num == 3)//数量 第3个数据 + { + p->max = p->cashe[0] + 3; + if((p->max > D_tp_handle_x_len) || (p->max < D_s_ccmodbus_min)) + { + p->head = 0; + return; //error 超过最大长度 + } + } + if(p->num >= p->max) + { + crc16(p->crc,p->buf + 3,p->num - 3 - 2); + if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1]) + { + if (p->ok != 1) + { + p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文 + } + } + p->head = 0; //放在if (p->ok != 1) 外 + } + } +} + + + +/****************************************************************************** +** End Of File +******************************************************************************/ diff --git a/source/tpc/ccmodbus.h b/source/tpc/ccmodbus.h new file mode 100644 index 0000000..80f9eff --- /dev/null +++ b/source/tpc/ccmodbus.h @@ -0,0 +1,98 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file tpc_fsk.c +/// @brief transaction protocol control of fsk +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// @version 1.2 CCsens technology +/// @author CC +/// @date 20180308 +/// @info 整理 + +// +////////////////////////////////////////////////////////////////////////// + + +/***************************************************************************** +@version 1.2 +update by cc @201501101001 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/uartlib.c: +公用的函数 和硬件无关 +接收各类协议的处理函数 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- + + +----------------------------------------------------------------------------------------- + + +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc----------s_at0 +----------------------------------------------------------------------------------------- +********************************************************************************/ + + + +#ifndef __TPC_CCMODBUS_H_ +#define __TPC_CCMODBUS_H_ + +#include "tpc_x.h" +#include "tpc_modbus.h" +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +///协议类型: 十六进制协议3->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +/// 发送的数据为有ff fe开头的十六进制的长协议,内包含标准的modbus协议 +///FF FE 08 52 16 11 22 33 44 F5 9F 发送了一个modbus协议包(8个数据52 16 11 22 33 44 F5 9F ) +/// 协议表达的意思为地址为0x52的从机, 功能码16 数据为11 22 33 44,校验码 F5 9F +/// 校验码的范围为 + +//#define D_s_PH3_ccmodbus_max 128 +#define D_s_ccmodbus_min (D_s_modbus_min + 3) + +typedef struct +{//8byte + vU8 filter1; + vU8 filter2; + vU8 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围 + vU8 slaver; //发送方的地址或命令 + vU8 oper; //命令 + vU8 buf[D_tp_handle_x_len + 8];//D_s_PH3_ccmodbus_max - 3,长一点防止越界 + vU8 crc[2]; //crc16 +}TS_PH3_ccmodbus; + +#if 0 +typedef struct +{ + U16 slaver; + U16 oper; + U16 reg; + U16 regnum; + U16 bytes; + U8 *buf; + U16 mask; +}CCMD_SLAVER_INFO; +#endif + +extern U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, MD_SLAVER_INFO *slaver_info); +extern U16 L3_ccmodbus_slaver_ack(TS_PH3_ccmodbus *pccmodbus,TS_PH3_ccmodbus *pModbusAck); +extern void L3_ccmodbus_master_handler(TS_PH3_ccmodbus *pmodbus,MD_SLAVER_INFO *p_slaver_info); +extern void L1_s2b_PH3(struct _tp_handler_x *p);// reentrant; + +#endif /* end __TPC_CCMODBUS_H_ */ + diff --git a/source/tpc/debug.c b/source/tpc/debug.c new file mode 100644 index 0000000..59a0e4a --- /dev/null +++ b/source/tpc/debug.c @@ -0,0 +1,88 @@ + +/***************************************************************************** +update by cc @201501101001 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +uartcom/uartlib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/uartcom0 + 和uart相关的通讯协议 com + n + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/uprotocol: 主要是为 uartcom + n服务的 驱动层到应用层缓存的过度 +公用的串口通讯定义 + struct _s_protocol_ 的公共协议包(关键的结构体)的声明------struct _s_protocol_ + void L1_uart_2buf(struct _s_protocol_ *p)串行数据保存到缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc----------s_at0 +----------------------------------------------------------------------------------------- +********************************************************************************/ + +#include "debug.h" +#include "../clib/clib.h" + +//NUM: 0 1 2 3 4 +// Fx R1 R2 R3 ocr +// F+从机 R1 R2 R3 校验 +//相关功能移动到tpc_fx.c +/// 实践中发现 如果收到多个以0d0a结束的短协议时,如果 +/// 协议之间间隔时间太短,ok处理不及时 会出现丢失协议的 +/// 的情况,所以 对于短暂的多个协议 应该有一定容量的缓冲 +/// 保留 ,同时 处理完协议后,应该清除接收缓冲,否则缓冲 +/// 会在自身满了后自动清除 +//_s_HRTU_P_rf_ +/// _s_HRTU_Pfx_ +/// fx 11 22 33 oc -- oc = 11+ 22+33 +//buf 0 1 2 3 [4] +//fd 01 02 03 06 fd为头 010203为数据 06为数据校验和(01+02+03) + +//对于连续的多条协议,如果前一条处理不及时,可能会被后一条覆盖 +void L1_s2b_PH1 (struct _tp_handler_x *p) //reentrant +{ + if (0 == p->head) + { + if (D_HETU_FX_fi == (p->reg & p->head_0)) + { + p->head = 1; + p->num = 1; + p->buf[0] = p->reg; + //p->ok = 1; + } + } + else + { + p->buf[p->num++] = p->reg; + if(p->num >= D_HETU_FX_buf_max) // [D_HETU_FX_buf_max == 5] + { + p->ocr = p->buf[1]; + p->ocr += p->buf[2]; + p->ocr += p->buf[3]; + if(p->ocr == p->buf[D_HETU_FX_buf_max-1]) + { + if (p->ok != 1) + { + p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文 + } + } + p->head = 0; //放在if (p->ok != 1) 外 + } + } +} + + + +/****************************************************************************** +** End Of File +******************************************************************************/ + diff --git a/source/tpc/tpc_modbus.h b/source/tpc/debug.h similarity index 65% rename from source/tpc/tpc_modbus.h rename to source/tpc/debug.h index 37605e9..88d7231 100644 --- a/source/tpc/tpc_modbus.h +++ b/source/tpc/debug.h @@ -22,33 +22,27 @@ ////////////////////////////////////////////////////////////////////////// -#ifndef __TPC_MODBUS_H_ -#define __TPC_MODBUS_H_ - -#include "../clib/Type.h" -#include "../bsp/bsp_config.h" -#include "../app/common.h" +#ifndef __TPC_DEBUG_H_ +#define __TPC_DEBUG_H_ +#include "tpc_x.h" //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - +//定长协议:长度固定为5个字节 +//eg: F1 01 02 03 06 typedef struct -{ - U8 reg; - U8 max; //接收到的数目的最大值 - U8 slaver; - vU8 head; //接收标志头标志 - vU8 ok; //接收协议ok标志 - vU8 num; - vU8 error; //错误 - vU8 *sp; - U8 buf[D_s_PH4_modbus_max + 8]; - vU8 crc[2]; -}TS_Handle_PH4; - -extern void L1_s2b_PH4_init(TS_Handle_PH4 *p,U8 slaver); -extern void L1_s2b_PH4(TS_Handle_PH4 *p); - -#endif /* end __TPC_UART_H_ */ +{//8byte + vU8 filter; + vU8 R1; + vU8 R2; + vU8 R3; + vU8 ocr; +}TS_P_debug; + +#define D_HETU_FX_buf_max 5 //定长协议 长度为5 + +extern void L1_s2b_PH1 (struct _tp_handler_x *p);// reentrant; + +#endif /* end __TPC_DEBUG_H_ */ /***************************************************************************** ** End Of File ******************************************************************************/ diff --git a/source/tpc/tpc_modbus.c b/source/tpc/modbus.c similarity index 81% rename from source/tpc/tpc_modbus.c rename to source/tpc/modbus.c index 54b7561..f858244 100644 --- a/source/tpc/tpc_modbus.c +++ b/source/tpc/modbus.c @@ -2,7 +2,7 @@ /***************************************************************************** update by cc @201501101001 针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 -个需要平衡的事情. +个需要平衡的事情.d uartcom/uartlib.c: 公用的函数 和硬件无关 @@ -29,31 +29,23 @@ msp/uartx.c 底层代码 和cpu相关 ----------------------------------------------------------------------------------------- ********************************************************************************/ -#include "tpc_modbus.h" +#include "modbus.h" +#include "../bsp/bsp_config.h" +#include "../ctask/tick.h" +#include "../clib/clib.h" -void L1_s2b_PH4_init(TS_Handle_PH4 *p,U8 slaver) -{ - p->max = 0; - p->ok = 0; - p->head = 0; - p->num = 0; - p->slaver = slaver; - p->error = 0; -} - -void L1_s2b_PH4(TS_Handle_PH4 *p) +//MODBUS协议解析函数 +//超出D_tp_handle_x_len,不继续保存数据 +void L1_s2b_PH4(struct _tp_handler_x *p) { + //p->modbusstmp = D_sys_now; if(p->head == 0) { - if(p->reg == p->slaver) - { - p->head = 1; - p->error = 0; - p->max = D_s_PH4_modbus_max; - p->sp = p->buf; - p->num = 0; - p->sp[p->num++] = p->reg; - } + p->head = 1; + p->max = D_TPC_HANDLER_X_LEN; + p->sp = p->buf; + p->num = 0; + p->sp[p->num++] = p->reg; } else { @@ -61,16 +53,9 @@ void L1_s2b_PH4(TS_Handle_PH4 *p) { p->sp[p->num++] = p->reg; } - else - { - //P10 ^= 1; - p->error = 1; - } } } - - /****************************************************************************** ** End Of File ******************************************************************************/ diff --git a/source/tpc/modbus.h b/source/tpc/modbus.h new file mode 100644 index 0000000..491bf66 --- /dev/null +++ b/source/tpc/modbus.h @@ -0,0 +1,114 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file tpc_fsk.c +/// @brief transaction protocol control of fsk +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// @version 1.2 CCsens technology +/// @author CC +/// @date 20180308 +/// @info 整理 + +// +////////////////////////////////////////////////////////////////////////// + + +#ifndef __TPC_MODBUS_H_ +#define __TPC_MODBUS_H_ + +#include "tpc_x.h" +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +/** + * 用户协议 + */ +enum MODBUS_OPER +{ + MODBUS_OPER_READ = 0x03, + MODBUS_OPER_READCONFIG = 0x04, + MODBUS_OPER_WRITE = 0x06, + MODBUS_OPER_WRITE_M = 0x10, + MODBUS_OPER_ERR = 0x8F, +}; + +//协议类型: MODBUS RTU模式 +//#define D_s_PH4_modbus_max (128) +//#define D_s_PH4_modbus_max (64) +#define D_s_modbus_min 4 //modbus协议的最小长度 + +typedef struct ts_ph4_modbus +{ + U8 slaver; //从机地址 + U8 oper; //功能码 + U8 buf[D_TPC_HANDLER_X_LEN + 8]; + U8 crc[2]; +}TS_PH4_modbus; + +typedef struct s_modbus_03_ack +{ + U8 bytes; + U8 buf[D_TPC_HANDLER_X_LEN-1]; +}Modbus03Ack; + +typedef struct s_modbus_06_ack +{ + U16 reg; + U16 val; +}Modbus06Ack; + +typedef struct s_modbus_10_ack +{ + U16 reg; + U16 num; +}Modbus10Ack; + +typedef struct +{ + U16 slaver; + U16 oper; + U16 reg; + U16 regnum; + U16 bytes; + U8 *buf; + U16 mask; +}MD_SLAVER_INFO; + +#if 0 +typedef struct +{ + U8 reg; + U8 slaver; //对于主设备,slaver代表当前轮询的包的id,主设备每次轮询时,总是应该将slaver设置为轮询到的从设备id;对于从设备,slaver总是等于slaverId + U8 max; //接收到的数目的最大值 + vU8 head; //接收标志头标志 + vU8 ok; //接收协议ok标志 + vU8 num; + vU8 *sp; + U8 buf[D_s_PH4_modbus_max + 8]; + vU8 crc[2]; + vU32 modbusstmp; +}TS_Handle_PH4; +#endif +extern U8 L3_pack_modbus(TS_PH4_modbus *pmodbus, MD_SLAVER_INFO *slaver_info); +//extern U8 L3_pack_modbusack(TS_PH4_modbus *pmodbus ,U8 slaver, U8 oper, U8 bufsize); +extern U16 L3_modbus_slaver_ack(TS_PH4_modbus *pmodbus,TS_PH4_modbus *pModbusAck); +extern void L3_modbus_master_handler(TS_PH4_modbus *pmodbus,MD_SLAVER_INFO *p_slaver_info); +extern void L1_s2b_PH4(struct _tp_handler_x *p); +extern void L1_modbus_split(struct _tp_handler_x *p); + + +#endif /* end __TPC_UART_H_ */ +/***************************************************************************** +** End Of File +******************************************************************************/ + + + diff --git a/source/tpc/tpc_uart.c b/source/tpc/tpc_uart.c deleted file mode 100644 index 24ea373..0000000 --- a/source/tpc/tpc_uart.c +++ /dev/null @@ -1,191 +0,0 @@ - -/***************************************************************************** -update by cc @201501101001 -Զമ һ ÿǶĻǷֿн ǸӵĻӦü -Ҫƽ. - -uartcom/uartlib.c: -õĺ Ӳ޹ -ôģʽ(ڵͨѶ)ĺ, -һЩģʽ(lcdȹ)Ҳʹ - void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) ------------------------------------------------------------------------------------------ -uartcom/uartcom0 - uartصͨѶЭ com + n - ΪӦͬͨѶЭҪͬuartӦ Ӧ - -typedef struct _ts_lcm_pro_; ӦЭĶ? LCMЭ------------ - L3_UARTcom0_exp_protocol ӦЭ ------------------------------------------------------------------------------------------ -uartcom/uprotocol: ҪΪ uartcom + n 㵽Ӧò㻺Ĺ -õĴͨѶ - struct _s_protocol_ ĹЭ(ؼĽṹ)------struct _s_protocol_ - void L1_uart_2buf(struct _s_protocol_ *p)ݱ浽 --------------------------------------------------------------------------------------------- -msp/uartx.c ײ cpu - L0_UART0_Init - UART0_IRQHandler - L0_Usend_uc----------s_at0 ------------------------------------------------------------------------------------------ -********************************************************************************/ - -#include "tpc_uart.h" - - -//NUM: 0 1 2 3 4 -// Fx R1 R2 R3 ocr -// F+ӻ R1 R2 R3 У - - - - -/// ʵз յ0d0aĶЭʱ, -/// Э֮ʱ̫,okʱ ֶʧЭ -/// , ڶݵĶЭ ӦһĻ -/// ,ͬʱ Э,Ӧջ,򻺳 -/// ˺Զ -//_s_HRTU_P_rf_ -/// _s_HRTU_Pfx_ -/// fx 11 22 33 oc -- oc = 11+ 22+33 -//buf 0 1 2 3 [4] -// -//// protocol hex 1 serial to buff -#ifdef D_use_uart_rx -void L1_s2b_PH1 (TS_Handle_PH1 *p)// reentrant -{ - if (0 == p->head) - { - if (D_HETU_FX_fi == (p->reg&D_HETU_FX_H4)) - {//p->ok = 1;p->head = 0; - p->head = 1; - p->num = 0; - //p->ocx = 0; - p->buf[p->num]=p->reg; - } - }else - { - p->num ++; - p->buf[p->num] = p->reg; - - if(p->num >= D_HETU_FX_buf_max) // [4] - { - ///p->ocr = p->buf[1]; p->ocr += p->buf[2];p->ocr += p->buf[3]; - ///if(p->ocr == p->buf[D_HETU_FX_buf_max]) - { - // if (p->ok != 1) - { - // D_led_D2_ON(); - p->ok = 1;//յ ,иط0޷ٴνܱ - // D_led_D2_OFF(); - } - } - p->num = 0; //if (p->ok != 1) - p->head = 0; //if (p->ok != 1) - //p->max = 0; - } - } -} -#endif - -////485 -//// ַж -void L1_s2b_PH1A (TS_Handle_PH1A *p)// reentrant -{ - if (0 == p->head) - { - if (D_HETU_FXA == p->reg) - {//p->ok = 1;p->head = 0; - p->head = 1; - p->num = 0; - //p->ocx = 0; - p->buf[p->num]=p->reg; - } - }else - { - p->num ++; - p->buf[p->num] = p->reg; - if(p->num >= D_HETU_FXA_buf_max - 1) // [4] - { - ///p->ocr = p->buf[1]; p->ocr += p->buf[2];p->ocr += p->buf[3]; - ///if(p->ocr == p->buf[D_HETU_FX_buf_max]) - { - //if (p->add == p->buf[1])///ַƥ - { - // D_led_D2_ON(); - p->ok = 1;//յ ,иط0޷ٴνܱ - // D_led_D2_OFF(); - } - // p->ok = 1; - } - p->num = 0; //if (p->ok != 1) - p->head = 0; //if (p->ok != 1) - //p->max = 0; - } - } -} - - -///FF FE 08 52 16 11 22 33 44 F5 9F һmodbusЭ(852 16 11 22 33 44 F5 9F ) -/// 1 2 3 4 5 6 7 8 -/// 0 1 2 3 4 5 6 7 8 9 10 -/// Э˼ΪַΪ0x52Ĵӻ, 16 Ϊ11 22 33 44,У F5 9F - -void L1_s2b_PH3_init(TS_Handle_PH3 *p) -{ - p->max = 0; - p->ok = 0; - p->num = 0; - p->head = 0; - p->head_0 = TS_PH3_FILTER0; - p->head_1 = TS_PH3_FILTER1; -} - -void L1_s2b_PH3(TS_Handle_PH3 *p)// reentrant -{ - p->cashe[1] = p->cashe[0]; - p->cashe[0] = p->reg;// - - if (0 == p->head) - { - if ((p->cashe[1] == p->head_0)&&(p->cashe[0] == p->head_1)) - { - p->head = 1; - p->max = D_s_PH3_ccmodbus_max - 1; - p->sp = p->buf; - p->sp[0] = p->head_0; - p->sp[1] = p->head_1; - p->num = 1; - } - } - else - { - p->num ++; - p->sp[p->num] = p->cashe[0]; - if(p->num == 2)// 3 - { - p->max = p->reg + 2;// - if(p->max >= D_s_PH3_ccmodbus_max) - { - p->max = D_s_PH3_ccmodbus_max - 1; - } - } - if(p->num >= p->max) - { - //p->ts_ccmodbus.crc = (p->sp[p->num-1] | p->sp[p->num]) & 0xFFFF; - if(/*crc()==p->ts_ccmodbus.crc*/ 1) - { - if (p->ok != 1) - { - p->ok = 1;//յ ,иط0޷ٴνܱ - } - } - p->num = 0; - p->head = 0; - } - } -} - - -/****************************************************************************** -** End Of File -******************************************************************************/ diff --git a/source/tpc/tpc_uart.h b/source/tpc/tpc_uart.h deleted file mode 100644 index 305c5b2..0000000 --- a/source/tpc/tpc_uart.h +++ /dev/null @@ -1,408 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -/// COPYRIGHT NOTICE -/// Copyright (c) 2018, ؿƼ -/// All rights reserved. -/// -/// @file tpc_fsk.c -/// @brief transaction protocol control of fsk -/// -///ļʵֵĹܵ -/// -/// @version 1.1 CCsens technology -/// @author CC -/// @date 20150102 -/// -/// -/// @version 1.2 CCsens technology -/// @author CC -/// @date 20180308 -/// @info - -// -////////////////////////////////////////////////////////////////////////// - - -/***************************************************************************** -@version 1.2 -update by cc @201501101001 -Զമ һ ÿǶĻǷֿн ǸӵĻӦü -Ҫƽ. - -clib/uartlib.c: -õĺ Ӳ޹ -ոЭĴ -ôģʽ(ڵͨѶ)ĺ, -һЩģʽ(lcdȹ)Ҳʹ - void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) ------------------------------------------------------------------------------------------ - - ------------------------------------------------------------------------------------------ - - --------------------------------------------------------------------------------------------- -msp/uartx.c ײ cpu - L0_UART0_Init - UART0_IRQHandler - L0_Usend_uc----------s_at0 ------------------------------------------------------------------------------------------ -********************************************************************************/ - - - -#ifndef __TPC_UART_H_ -#define __TPC_UART_H_ - -#include "../clib/Type.h" -#include "../bsp/bsp_config.h" - - -// 20170609 - -///----------------------------------------------------- - - - -//L0_type_byte(ts_cmd_pro0)[] -//#define D_CMD_Filter1 0xA5 -//#define D_CMD_Filter2 0x5A -#define D_CMD_Filter1 0x0a -#define D_CMD_Filter2 0x0d - -#define D_CMD_Filter1_ff 0xFF -#define D_CMD_Filter2_fe 0xFE - - - -///Э: ʮЭ1->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -/// ͵ΪfxͷʮƵĶЭ飬ͳЭ֡ͷΪ1ֽ⣬ݵijҲDZȽϾ򣬴󲿷ְλģʺϵͲrf433֮Ĵ -///5 ʺڴʱϴ -/// R1 -///λ 7 6 5 4 3 2 1 0 -/// AS1 (0---15) AS2 (0---15) - -/// R2 -///λ 7 6 5 4 3 2 1 0 -/// ѹPress (0---15) open mic - -/// R3 -///λ 7 6 5 4 3 2 1 0 -/// Temp (0---15) Gsensor(0---15) - -typedef struct -{//8byte -///////// - vU8 as2:4; - vU8 as1:4; -///////// - vU8 mic:3; - vU8 open:1; - vU8 press:4; -//////////////// - vU8 Gsensor:4; - vU8 temp:4; -/////////// -}TS_P_pc_dat; - -typedef struct -{//8byte - ///////// - U8 cameraBoardPower; //ǰе4ɼͼ - vU16 paperNum:10; //10bitֽ ʾ1024 ʵ170 - vU16 cameraIndex:4; //ͷ - vU16 cameraWorking:1; //Ƿ - vU16 LowPower:1; // =1 lowPower Ҫ,δӵ -}TS_P_paper; - -//NUM: 0 1 2 3 4 -// Fx R1 R2 R3 ocr -// F+ӻ R1 R2 R3 У -typedef struct _s_P_rf_ -{//8byte - vU8 slave:4; - vU8 filter1:4; -//////////////// - TS_P_paper r123; - vU8 ocr; -}TS_P_rf; - -typedef struct _s_P_rf433_ -{//8byte - vU8 ha; -// vU8 hb; - - vU8 slave:4; - vU8 filter1:4; -//////////////// - TS_P_paper r123; - vU8 ocr; -/// vU8 hc; -}TS_P_rf433; - -//NUM: 0 1 2 3 4 -// Fx R1 R2 R3 ocr -// F+ӻ R1 R2 R3 У - -typedef struct -{//8byte - vU8 slave:4; - vU8 filter1:4; -//////////////// - vU8 G1; -//////////////// - vU8 G2; -//////////////// - vU8 Tmp:4; - vU8 Press:4; -//////////////// - vU8 ocr; -}TS_P_as; - -typedef struct -{//8byte - vU8 slave:4; - vU8 filter1:4; -//////////////// - vU8 cmd; -//////////////// - vU8 R2; -//////////////// - vU8 R3; -//////////////// - vU8 ocr; -}TS_P_debug; - - -#define D_HETU_FX_fi 0xa0 ///2018.7.7 -#define D_HETU_FX_H4 0xf0 ///2018.7.7 - -#define D_HETU_FX_buf_max 4 //max ָʵʵ,numcntָʱ -/// Hex RTU Protocol 0xFx -typedef struct -{//8byte - vU8 reg; - vU8 n; - vU8 head; //ձ־ͷ־ - vU8 ok; //Эok־ - vU8 num; -// vU8 cmd; - vU8 ocr; -// vU8 *sp; - U8 buf[D_HETU_FX_buf_max+1]; -}TS_Handle_PH1; - - -extern void L1_s2b_PH1 (TS_Handle_PH1 *p);// reentrant; - -//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - -///Э: ʮЭ2->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -/// ͵Ϊff feͷʮƵijЭ飬 -///FF FE 52 03 98 77 88 99 ַΪ0x52Ĵӻ, PC30x77,0x88,0x99 - -///FF FE 06 03 e5 77 88 99 (0x06)Я30x77,0x88,0x99УΪ0x98(=0x06+0x03+0x77+0x88+0x99ݵĺ) -///:Уλ=0x12+0x34+0x56=0x9c;ȡλֽڵõOCR=0x9c - -typedef struct -{//8byte - vU8 filter1; - vU8 filter2; - vU8 addr; //ͷĵַ - vU8 num; //յݵļ ݽն仯עݳȵķΧ - vU8 ocr; - vU8 buf[4];//--->_s_P_pc_dat_ -}TS_P_pc; - -// FF FE 10 02 0C 51 03 -// cashe[1] cashe[0] У 1 ӻ 2 -// filter2 filter1 -struct _s_PH2_FFFE_ -{//8byte - vU8 cashe[2]; - vU8 reg; - vU8 max; //յĿֵ - vU8 head_0; - vU8 head_1; - // vU8 sub_num; //յĿעݳȵķΧ - vU8 head; //ձ־ͷ־ - vU8 ok; //Эok־ - vU8 num; - vU8 *sp; - TS_P_pc s_FF; - // U8 pro[16]; ///Э -}; - -extern void L1_s2b_PH2(struct _s_PH2_FFFE_ *p);// reentrant; - - -//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -///Э: ʮЭ3->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -/// ͵Ϊff feͷʮƵijЭ飬ڰ׼modbusЭ -///FF FE 08 52 16 11 22 33 44 F5 9F һmodbusЭ(852 16 11 22 33 44 F5 9F ) -/// Э˼ΪַΪ0x52Ĵӻ, 16 Ϊ11 22 33 44,У F5 9F -/// УķΧΪ -#define TS_PH3_FILTER0 0xFF -#define TS_PH3_FILTER1 0xFE - -#define D_s_PH3_ccmodbus_max (16 + 8) -typedef struct -{ - U8 filter0; - U8 filter1; - U8 num; - U8 src; //Դ豸ID - U8 dst; //Ŀ豸ID - U8 oper; - U8 buf[D_s_PH3_ccmodbus_max - 8]; - U8 crc[2]; -}TS_PH3_ccmodbus; - -typedef struct -{//8byte - U8 cashe[2]; - U8 reg; - U8 max; //յĿֵ - U8 head_0; - U8 head_1; - // vU8 sub_num; //յĿעݳȵķΧ - vU8 head; //ձ־ͷ־ - vU8 ok; //Эok־ - vU8 num; - vU8 *sp; - U8 _buf[D_s_PH3_ccmodbus_max]; ///Э - U8 buf[D_s_PH3_ccmodbus_max]; -}TS_Handle_PH3; - -extern void L1_s2b_PH3_init(TS_Handle_PH3 *p); -extern void L1_s2b_PH3(TS_Handle_PH3 *p);// reentrant; -//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - -///Э: ַЭ1->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -/// ͵ΪԻس(0x0a 0x0d)ΪβַͳЭ飬ȽȷַͶӦݣʺdebugҪ󲻸ߣ -/// ij - -///----------------------------------------------------------------------------------------- -#define D_s_SSTR_0D0A_len 16 //strЭҪȴһЩbugĵطΪ64bytes -struct _s_PC1_0D0A_ -{//8byte - vU8 reg; - // vU8 sub_num; //յĿעݳȵķΧ - vU8 head; //ձ־ͷ־ - - vU8 cashe[2]; - //vU8 filter1; - //vU8 filter2; - vU8 num; //յݵļ ݽն仯עݳȵķΧ - - vU8 ok; //Эok־ - vU8 max; //յĿֵ - vU8 buf[D_s_SSTR_0D0A_len+1];//buffer ĵһλ - // U8 pro[16]; ///Э -}; -extern void L1_s2b_PC1(struct _s_PC1_0D0A_ *p);// reentrant; -//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - - - - -///modebusЭͨѶʹ>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -#ifdef doc_98098908 -///ModbusRTUģʽͨţϢеÿ8Bitֽڰԭֵͣ63HRTUֱӷ01100011 -////ַʽҪŵǣ֮֡ûмͬ´ݵܶҪASCIIߣٶȸ [1] -////ASCIIģʽʹõַRTUģʽASCIIݵʹΪһЩ⣬RTUģʽʱַʽͣ -///ASCIIģʽַ֮ɲ1sļӦٶȽĻ -///01 16 1000 1234 ABCD -///δ˼ ַ 01 д 1000 1234 ô -////ַ ָ վĵַһƵһDZַͨѶַ -/// Ҫ飬ͨѶĿ Ƕдݣ MODBUS Ȼֻܶ࣬dzõģǶд -///Ĺ03 дĹ16ע⣬Ķдһд16λҲһWORD. -///Address Function Data Check -///8-Bits 8-Bits N x 8-Bits 16-Bits -/// ܣFunction -/// ˱Ѱַնִкֹܡ±г˸ϵDZõĹ룬Լǵ͹ܡ -/// Ϊ -/// 03 ݼĴ һĴĵǰֵ -/// 16 ԤöĴ 趨ֵһϵжĴ(ACRXXXE) - - -///ɢǶͬһźŵIJͬ˵ -///0ʾϿ1ʾͨPLCƿ豸Уһֲ͵ı? -///Զ///PLCеY/Q͵ź - - - - -///ccĽmodebusЭ飬һ֡ͷ -/// ff fe num add function dat check -#endif - - -//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - - - - -///ЭͨѶʹ>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -#define D_s_protocol_len 32 -struct _s_protocol_ -{//8byte - vU8 rbr; - vU8 reg; - vU8 cashe[3]; - vU8 filter1; - vU8 filter2; - vU8 (*pfun_get)(void); - vU8 num; //յĿעݳȵķΧ - vU8 sub_num; //յĿעݳȵķΧ - vU8 head; //ձ־ͷ־ - vU8 ok; //Эok־ - vU8 data_ok; //Эok־ - vU8 ucXor; - vU8 array[D_s_protocol_len];//buffer ĵһλ - vU8 buf[D_s_protocol_len];//buffer ĵһλ - vU8 buf2[12];//buffer ĵһλ -}; - -extern void L1_uart_2buf(struct _s_protocol_ *p); - - - -//485 -///Э: ʮЭ2 ַж ڶǵַ->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -#define D_HETU_FXA 0xaa - -#define D_HETU_FXA_buf_max 8 //max ָʵʵ,numcntָʱ -/// Hex RTU Protocol 0xFx -typedef struct -{//8byte - vU8 reg; - vU8 n; - vU8 head; //ձ־ͷ־ - vU8 ok; //Эok־ - vU8 num; - vU8 add; ///ݵַ - vU8 ocr; -// vU8 *sp; - U8 buf[D_HETU_FXA_buf_max + 1]; -}TS_Handle_PH1A; - -typedef struct -{ - vU8 filter; - vU8 src; - vU8 dst; - vU8 dat[4]; - vU8 ocr; -}TS_PH1A_DAT; - -extern void L1_s2b_PH1A (TS_Handle_PH1A *p); - - -#endif /* end __TPC_UART_H_ */ -/***************************************************************************** -** End Of File -******************************************************************************/ - - diff --git a/source/tpc/tpc_x.h b/source/tpc/tpc_x.h new file mode 100644 index 0000000..8956284 --- /dev/null +++ b/source/tpc/tpc_x.h @@ -0,0 +1,24 @@ +#ifndef TPC_CONFIG_H +#define TPC_CONFIG_H + +#include "../bsp/bsp_config.h" +#include "../clib/type.h" + +typedef struct _tp_handler_x +{//8byte + vU8 reg; + vU8 head; //接收标志头标志 + vU8 cashe[2]; + vU8 head_0; + vU8 head_1; + vU8 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围 + vU8 ok; //接收协议ok标志 + vU8 max; //接收到的数目的最大值 + vU8 buf[D_TPC_HANDLER_X_LEN+16];////协议缓冲 + vU8 *sp; + vU8 *sp2; //备份值,如果协议需要备份,单独提供备份缓冲区 + vU8 ocr; + vU8 crc[2]; +}TP_Handler_X; + +#endif diff --git a/source/tpc/协议Transfer Protocol Conversion/.keep b/source/tpc/协议Transfer Protocol Conversion/.keep deleted file mode 100644 index e69de29..0000000