From c5991ab971e70260e28db6d310ef0ac944488bb3 Mon Sep 17 00:00:00 2001 From: zhangsan Date: Thu, 7 Oct 2021 16:42:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E7=A6=BBbsp=5Fconfig=E4=B8=8Ebsp=5Fco?= =?UTF-8?q?nfig=5Fconst.h?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- keilp/cc_as_stc02_ps5ws.uvprojx | 132 +-- si4/ps5ws.si4project/soft_ps5ws.sip_sym | Bin 674972 -> 754532 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xab | Bin 180224 -> 184320 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xad | Bin 2048 -> 2128 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xc | Bin 117904 -> 99688 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xf | Bin 117904 -> 99688 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xm | Bin 204 -> 196 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xr | Bin 117904 -> 99688 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xsb | Bin 94208 -> 102400 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xsd | Bin 1248 -> 1328 bytes si4/ps5ws.si4project/soft_ps5ws.siproj | Bin 19536 -> 16584 bytes 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 | 351 ------ source/app/app_task_adc.h | 144 --- source/app/app_task_uart0.c | 31 - source/app/app_task_uart0.h | 11 - source/app/common.c | 230 ---- source/app/common.h | 75 -- source/app/main.c | 101 +- 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 + .../{tpc/tpc_modbus.c => app/task_modbus.c} | 88 +- 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_config.c | 75 +- source/bsp/bsp_config.h | 337 +++--- 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} | 4 +- source/bsp/{bsp_cs1232.c => cs1232.c} | 51 +- source/bsp/{bsp_cs1232.h => cs1232.h} | 113 +- source/bsp/{bsp_485.c => rs485.c} | 4 +- source/bsp/{bsp_485.h => rs485.h} | 4 +- source/clib/clib.c | 69 +- source/clib/clib.h | 10 +- source/clib/type.h | 5 +- source/cpu/STARTUP.A51 | 2 +- source/cpu/stc_stc8hxx.h | 640 +++++++++++ source/ctask/task.h | 1 + source/ctask/tick.h | 4 +- source/debug/cc_as_stc01_main.ini | 7 - source/debug/cc_ls_03_debug.ini | 6 - source/debug/debug.ini | 123 -- source/debug/testiic.uvla | Bin 1187 -> 0 bytes source/msp/UART0.C | 93 +- source/msp/UART0.h | 4 +- source/msp/eeprom.c | 222 ++++ source/msp/{msp_eeprom.h => eeprom.h} | 25 +- source/msp/msp_eeprom.c | 151 --- source/msp/time.c | 164 +-- source/msp/time.h | 3 +- source/msp/{UARTN.C => uart_x.c} | 48 +- source/msp/{UARTN.h => uart_x.h} | 25 +- source/tpc/{tpc_0d0a.c => 0d0a.c} | 2 +- source/tpc/{tpc_0d0a.h => 0d0a.h} | 0 source/tpc/{tpc_ccmodbus.c => ccmodbus.c} | 4 +- source/tpc/{tpc_ccmodbus.h => ccmodbus.h} | 0 source/tpc/{tpc_debug.c => debug.c} | 4 +- source/tpc/{tpc_debug.h => debug.h} | 0 source/tpc/modbus.c | 62 + source/tpc/{tpc_modbus.h => modbus.h} | 4 +- source/tpc/tpc_x.h | 18 +- 99 files changed, 2668 insertions(+), 8486 deletions(-) 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/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 rename source/{tpc/tpc_modbus.c => app/task_modbus.c} (64%) 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 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} (97%) rename source/bsp/{bsp_cs1232.c => cs1232.c} (93%) rename source/bsp/{bsp_cs1232.h => cs1232.h} (76%) rename source/bsp/{bsp_485.c => rs485.c} (63%) rename source/bsp/{bsp_485.h => rs485.h} (69%) 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/testiic.uvla create mode 100644 source/msp/eeprom.c rename source/msp/{msp_eeprom.h => eeprom.h} (61%) delete mode 100644 source/msp/msp_eeprom.c rename source/msp/{UARTN.C => uart_x.c} (86%) rename source/msp/{UARTN.h => uart_x.h} (82%) rename source/tpc/{tpc_0d0a.c => 0d0a.c} (98%) rename source/tpc/{tpc_0d0a.h => 0d0a.h} (100%) rename source/tpc/{tpc_ccmodbus.c => ccmodbus.c} (99%) rename source/tpc/{tpc_ccmodbus.h => ccmodbus.h} (100%) rename source/tpc/{tpc_debug.c => debug.c} (99%) rename source/tpc/{tpc_debug.h => debug.h} (100%) create mode 100644 source/tpc/modbus.c rename source/tpc/{tpc_modbus.h => modbus.h} (97%) diff --git a/keilp/cc_as_stc02_ps5ws.uvprojx b/keilp/cc_as_stc02_ps5ws.uvprojx index 60abb09..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\common.c + ..\source\app\task_debug.c - app_task_uart0.c + task_register.c 1 - ..\source\app\app_task_uart0.c + ..\source\app\task_register.c - app_task_adc.c + task_modbus.c 1 - ..\source\app\app_task_adc.c + ..\source\app\task_modbus.c + + + app_config.c + 1 + ..\source\app\app_config.c + + + task_encrypt.c + 1 + ..\source\app\task_encrypt.c @@ -381,19 +396,14 @@ ..\source\msp\UART0.C - msp_eeprom.c - 1 - ..\source\msp\msp_eeprom.c - - - msp_id.c + eeprom.c 1 - ..\source\msp\msp_id.c + ..\source\msp\eeprom.c - UARTN.C + uart_x.c 1 - ..\source\msp\UARTN.C + ..\source\msp\uart_x.c @@ -401,19 +411,24 @@ bsp - bsp_cs1232.c + bsp_config.c 1 - ..\source\bsp\bsp_cs1232.c + ..\source\bsp\bsp_config.c - bsp_485.c + chipid.c 1 - ..\source\bsp\bsp_485.c + ..\source\bsp\chipid.c - bsp_config.c + cs1232.c 1 - ..\source\bsp\bsp_config.c + ..\source\bsp\cs1232.c + + + rs485.c + 1 + ..\source\bsp\rs485.c @@ -436,24 +451,9 @@ tpc - tpc_modbus.c - 1 - ..\source\tpc\tpc_modbus.c - - - tpc_0d0a.c - 1 - ..\source\tpc\tpc_0d0a.c - - - tpc_ccmodbus.c + modbus.c 1 - ..\source\tpc\tpc_ccmodbus.c - - - tpc_debug.c - 1 - ..\source\tpc\tpc_debug.c + ..\source\tpc\modbus.c @@ -467,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 f734da4a8e06575bf3919492f80c10c7d9da414f..418885bcbca1ff15d2e81473af04944975ca7289 100644 GIT binary patch literal 754532 zcmeFa2YejW)rY;VxED+(6w@IT72A-GEXlS&l7%E=0||p{%eFwa97(1mAt8;lH@)}X z8wu&X7t(uANbl`U&zpqrJZJ8;t`DoQyZ7WrzTfx#f1Z7IM>{i*j_%yKJ3G5R^q@-R zewE7XTbBx#RVu%pQK`J8^8e@mD;4`N@wOyrJD218l8{pC?9Z=8 zdfLWG(>Sjwh9-K3M)nlD*9@H-)>{kiE>FT45~XpTBlB~dS0v8eeeKQXUVCk!8*A`} z-w)^bdn%1HHO+B8zWP2WZCSdJw%+xfb-H)TzK=5`O5;rb9i4eDsi$pB)7PnUBYj;* zaE3%_obk+Yo~EzExuL$UJvc+6G|uy7{(s21p}uZiaE3%_oH-)qIIpbUo(DE`t&fSa`PKm2xmx^i7?JHD|gYy+^mo($N9))T-Vpu*V(_OxwWfco#b91CjInK+Y^Te*PYl?hnPNd-+PpDld_e*De^(2ofm7`>;<{X}=&zbIqb6-m* zCkhTHTSxchb#6hdv~A>c%)y!c zi~cudJUC=a$H|=>=fi^YfkV2u*T=2YPHIfM zNZD={KVBZ^I3H1-cy8GxCVujW{nY+WPv6!M1@5^;G``-B892uTOD?L}{E)l=(T%E2f+~ zd)xaj=^HGvylZiezVICV&FX6#i{#k7d)vNZWP34oRaia;XUoEzCxZOlA@2vJxl~T{ zNAKv&IgeV8gA2uZe0ZnBNTamcD&Y74$%stlcq6vlN@Zsh86kKHr3?J{f3d$>jxXS|Uz)-tY{^EFw{BlMtt;qOhIQ^xUs z+zM?y$9dN7p=;y1JjjU=>YS3kFAZa+9OoInW!CF8aOV6#r1rgu^y*CKSq|r65}nFD zu9WB-(mToo92^SF*m`yVQ{D22w6IE2Z7!IN$C#*wfY6o0-9jV;f!8Dam7d z9E`rSpV+759S3)hY!BOO1h{e>jEuiSx-R-<`tP)VmiCiz9Q@BaN8h#L9qU}ranSpi z!dRL9B4zZF*&6E0KAP5fIX|iOIOu##VQfslk|MSk#_d@ZGb-pu?gBOVh{YJ{@C9^fuw^Qz=b*|?)IK%hlU}aETa87Ca zx^?pN9Os$N$L@ad!7=4Rd7NgwJjikOKBjCDAL^Xa)_Fsw^V~hd*X-H1Th`)}i)A%9 zr?hqMlAq_)8Rxv7;=tc^vpl4(DeZV;W3Kbq=yuOKZxSEsoYL0$f=uUw_4r6o9d^5O=6M&(;K~>&GX4%SYkz3Rw4Lns6LEiwomltq>8Xw!Yb60WA@W{?xlW8#;ykE$2?1L!}HtV9km&?4g&h?Bpy!Sy|*auVE zeURTL$N9))ALK*mdP%WkPSxzFXyfY#a6LgGZ(N;DHxz z$4%5l{MZL0qPyI+?C34;=w+c(jEt? z?>1BCdiFu@_cV_c7sf~_V=ZO2X1m^*)yL40sbDf`y} z*&&Z|oM-PH8yh`fjd>4_m&I{Txj-JL*(ncloaatV4o&WxNLQJ4pX=ah8!7EM#$EFB z9B1$2;9bOr<6ugA9307XKHxKAIUkZ155oR+v?1@wr-?OAk14Bp!i@A;)$emX|FYz> zc)NDV3H0hut$A*%Jd<++kSNUyLfQ?!OilW%av!MG`G7h*obYG=qRuI8ov%uqW8Ym* zoxMMcM?Xd#Q?|+DG`r~c@Qkp2jzhKXgNx(mfVK~B-N%lT8TLPp zDUh5kQ`v=09S!d<^P+cj=DD?grsm)Sobx|+b%<;mXGo5asdUy?B06teZmT)hT<7>Y z#i`DWgE{V{jO|2)<%W@hb>{c1)p_~U=LfYZ=Y4vx{EQ>*c?k{@<-cjqcP*c$(mz9@{5Sn`9P`yP-iY7#wYjrv{f36V8L)JVw~Rw^hD2$c zub27Mn5hxx{huwBx7$WXCMJjXgb$bM7VE!B&mXb$-DE2NVQ}%xk z)s%DA7vZq)F?N82_cKf9sWH++WL`DrTHCYt=jbmIAC7~N;~l~e_^PSb6857|Q z;~42Qxu53Y@}Qb?t?hYP_z3U*T`*mF1NS+W(7&aO{aIYyBjk>CUd<0{Y|qQ%7|BUG zj*TL#jgcN1oF65OZR7t9eE`Oat?wB<*OFO1IhjGy-(2X~Kc-@0!i^IIV*m7B$d;~*p-l!;wy z=Kfc;@?G-s!Zz-M`g)ruN^0%vmhJzlp-pZ5gH72775o?@#V$Z;#z@f@9*(S}o@0u4 zo!K`1Go*ip+K&li9w&FAcXVDX^J=a0g0)SOf}6O?ES@JzQ)ft&|EA8orXlszdCIxD zTsZTVu_w-uD2?;uWqz!4mUFXDo$oF_I76Z|&QFl}KF&UMzK8hW42jY>KT+m;I5#`B z=X;6|&X6dL^OI!0kF!sm8F%6w$Dc~${A4d@r}ljB;0%efA0qI76Z|&d-$j9?o9KTGEOIQ!JOQ+#lSL}{F#E%RNR zo!av{@xd7qrEz|a%=dBjsq=dA!5I>zael7M&vtJ18$Wl656+M%jq~$lzK^p{oi7j{ zoFP#f=jY3O7iXvTe4+T@42jY>zd+{uIQ!JOTYPYaL}{E~DDyp>z53@K@xd7qrEz|d z%=dBjsWa!GaE|Aql*akRUd~SKd1G*fL}{E~BJ*A9>@#`$$J-^baf&Xzd`2vIQ!K3e&T~OBueA_Mw##7?A1SCE z@8ay#p05xeoFTb_8{_zalTpRJ2<zf{I6v@xd7qrEz|@%+Gdq zJpX)^_}~nQ(m20I=KDDN)Ol2VaE3%_oZl<+U7VfT^KS9M84{&&exJ#`%LX-^JOfJ>Oq^aE3%_oIfP< zeVl#jJT5*sL!va!AC~zJ&Tix93Gu-h5~Xqeh|KqK_Nnuv_}~nQ(l~!q=DRpMwdZ}} zgEJ&b%G4$f}l=SPSS&X6dL^Ot45kF!smA1OXKL!va!Uy=DP&Q9(5M)AQJ5~Xqes?7Is z_Nnuu#0O_cl*ajMGT+15tABp9_}~nQ(l~!z=KDDN)cG;ugEJ&bzKF&UMew_H=42jY>e@o_PJ3F3#e!TeL42jY>e_Q7JIQ!K33F3n@BueA_ z9hvXq?9`s0C_XqtqBPFmmH9r-K6QSQ_}~nQ(l~!l=6g7M_0LZhADkgk8s}SOzK^p{ zou48;I76Z|&fk~$F3wKv`KjWAGbBpm`~#WqEeSk zBueA_Bbo2x>{I7wh!4(?D2?-vWxk8EQ+s}<_}~nQ(m4M_=KDDN)cINBgEJ&bAyFFVU&wqPXP-Jh zPkeBOL}{FVDf4rkJ+FU$f%xDIiPAX#O6L1G`_%b`;)63JO5^-%neXE4)Sh1?J~%`2 zB5sWHZ)BE_vrnC0EIv3xqBPFGmH8gdUj6e+#0O_cl*ajYGT+D9r_L`GADkgk8t323 zd>3b@_WUyO!5I>zasFSK@8j%K=a-8Q&X6dL^B-isgR|TC`4!@WGbBpm{70GZ;)63JO5^+&neXB3)jz*Rd~k+D zX`KHm^L?Cs>ik;q!5I>zasHdkcX4)VoFP#f=fBH*A7`IBzg~QBhD2$c|4-&; zJ3F3#exvx{42jY>|3l{cIQ!K3Ch@@;5~Xqer_6V8c52UW5+9r)Q5xre$$TGYpE|!; zd~k+DX`FA9`5w+*{qxP@gEJ&bIL~u)_NnuG#1m&ol*W0!m$OrQey@1q z42jY>FK~1Asq_296K6=2#(813GhMUa_0Jy=Pn;q705`^Yk(;wmoj)jwI76Z|&WpXA zo!aw<#1m&ol*W09o3l@yKP;X&L!va!OP!p(`sa^`C(e*4jq@@$XP-KMR6KEpL}{Ft zdpSF`=Z}de&X6dL^TBS;K6U=Mc;XC+(m1d1adsO&e?mNQhD2$c4{>w$sq-hr6K6=2 z#`#b$XQ%dji+JJ;iPAV9=H~2E=TC_z&X6dL^Wjd;Uj6f@#S>>pl*ai8H)o$Ze?~lU zhD2$ckMweOYR{h)Pn;o98t0?joPFy2Iq}395~XoI+QZrL{PP#Y6K6=2#`!L8&OUYi zqIlvAiPAV9&Q9(5YvPGBBue9af}68Xoxd)gI76Z|&L{dfyN#c}A)YuxqBPDY zxjFmP`J3X2GbBpme6p9bQ+xiFc;XC+(m0>u=Im4FZ;L0+kSLAwsZP#b{quLk6K6=2 z#`!ciXP-KMS3GfsL}{E)_i}b>&)*YIoFP#f=QG@#ed>Ixc;XDnt=t&ryE-^~UjO_9 zQN$S%rExyf&Dp2UKNL@#AyFFVv%H+0+VhXZ6K6=2#`$bFXP-L%SUhotL}{GQadP(R zpMN5rI76Z|&P{I4K6U=7c;XC+(l|GJIXkuIpNS{VkSL9Fi<`4goqsN#I76Z|&aFPq zZsX@)h$qgFD2?+fH)o$Z|57}0hD2$cS9>`-wdY@nC(e*4jq@5eXP-L%T0C)vL}{GQ zb#nIVpZSar&X6dL^LcL0K6U=Bc;XC+(m3DE%h{ z;tYw>IN!&~*{gs4i+JJ;iPAWq@8;}N=f8?4&X6dLbDNj5Q+xiKc;XC+(m1bmbM~q8 z-^CMWNR-C8-N)H&{QQ67i8CZh{I7|h$qgFD2;Qcm$OrQ{-=2242jY>uXA(u zsq??Y6K6=2#(BMyvseGj=Vfq)L}{EixHHGwP!vrgEJ&b<9vae zvrnD*ybR8eD2?-l`Oeam{jPuJvnM!1qBPFkZq7b+=Cda_L!va!JzmaE?Rjo+hD2$c zd)=IU>da?Ps52x={DkxdxA40O5;4>_1tI76Z|&YQfPo!T>>J;50g zrE$L4&Dp2UeD(xqNR-BTvy-z||IBAkaE3%_oVU0+`_!4wp5P3L(l}q@_1tI76Z|&X;*OJDz{$a~wEBqBPF;b#wNqGoRzY84{&&zMq$~Q+wuf z95_RwG|rd1Is4R^&vD=kiPAV1PR?HaGoRzY84{&&zQWDfr_Owi17}E-#(Bug*{MDA zIS!m5Q5xs1Zq7b+=5ri4L!va!+kBke#?O3?17}E-#(BG&vrnD*90$&jD2?;5m$OrQ z=5ri4L!va!JKUUo>U?}~hD2$ccRD$H_0KDVGbBpmyvxnmr_Lt?XGoOBdBn@vsXg;K z4%#y$O5=Q`o3l@yPYTYED2?+~4$hv}Kc5nuAyFFVQ8#CwI-eSxAyFFV-CoX4?fJCe z42jY>?{RbXsq^W<84{&&9&>W`>YvXD&X6dL^IkV+pE}<)I76Z|&iD6nc52UO24_f= z#(CV$*{9BD1!qW<#(BcW*=_uMc5sG7X`CnBoPFwiPH=`qX`J_YIXkuIrr->T(l}r3 z=Im4F=HLv8(l}q^N z_Nnvg;0%ekSLAwBfXrR+H+fQhD2$cZ*+6^sq@<4 z42jY>Kg!A3tAB0}&X6dL^P}CIed^p1oFP#f=f`+CJGJM|;0%eKQ+^NuJq6Cg$YUXGoOB`B^T`e!bmjaE3%_ zoS*ID?AP1v4$hD$jq`I{oX;ya;BdPqI76Z|&d<$so+JHpZ&SH`kK4iE42jY>KhMM2 z?~qd26r3SZ8t3PGIQtz^Di;T5NR-C;1s=|Rhm^|Z;0%ew+^RO5^<6X`E}V^ZcR^>taJul-tO?JwjGMUk8cOIKQrn^IV=BeoyXB7ww<7wU3T( zZJO>Wbzrn@XZ_t0Tc;XC+(m21-#o2Gre~NhG z42jY>-{j)#H|RfAJaL9ZX`J8W;_Nr*KTSMwhD2$c-|XV-H|RfIJaL9ZX`F9%arPVZ zpCO(&L!va!Z^?EZ7@l`Z&9F&}WG!&X6dL z^ZR_9-8$&A#S>>pl*ak}KF)3(^f}^*GbBpm`~e?lw+^~VJaL9ZX`Dake^T6{cXU?W`kV*7obinl&fK?S(OWW|z1#CbQCuVwq%Ff( zOS!B0R2ApN{G`S@FB`n1ud}$IYu&o8&Vgce&p^4_hHo#IC8;eWO4By(COc?s8%^cY zD)qGIrQJ=%*0G`S?ZvjSJv&BrhE+5S&XLnY=(%#?MKYD;J5BDDiM~+JLB=1{Sm#CE zt;P88PMIc#JvzHS**gp6#Q<E1}dFp!F^NQ}~ z0`1}Pp^4#QVtCu+SXRezx;QP63DVcWsUx5~kbEs^8_}6#$_)N6cM$rG1#9~Ui{|Fl zElo{#@a)=te6>7{@dhMH(>7vThH>pzX9#*h_5GgPWz2HGXIW3zj1JIzGi%6a@axo zG}$Q55N9|lQ=0Ei<2<)k=khq%+1p-p^_Js}boF)Lf1oVEaS);a?XkN^jwy|_jd1J^ z&gD>v%`}<^$bvXSoS}8THK}tW&Uew*uxmHA^>-8#liOAgO|-TYo4eL^t-ZLZk%7lO zMRA@?kSNVQczROjrt)cZy@ov@aUK}#X>D0oG&i+g+BvwU=$}Kg1d!a0fGbBpm{Nv0zFG=bwt-0J##%-T0i!&rj z%FYfH^ke7r#1F=NqM(ey?C(p+j5~XqeX{PfbZ5{2>$qh~Jn<%#JYA*Wa z7#_!DBv0 zwZ?AgcyNv#kkUB+EOBlMo2ln@%8GO>Dnrr%xvsb|+j1$!o{W)n3>s;iPfXfIz0L!& ztelf+-`LSv$bh5&lD@&NjlBhXWhv0W?ai_b;|(a~RNC>zuQKa=usHW^+A*|yWc0eC zdCk_5$qCs~;~9`eX&aCzO`X4;>AWm;p1f}FaJi|5Z}|&RXGop(FJ_#-lQ=grt~;b0 zKliouxAl08p!Wr5h%>ZpuZysYb&4fjC2)p>@7xN#1)Ca|igiRU>Bwkhy($1B`wH5~b-kZpauTaqg>h&VNl+ z8kWaBob~t@X`KI-w2h{)U_E2e@--}1_w=+4$QwX$+l}(^vLMcoD2?;qGo5E`-KV=r zxrO{&^r%_Nm1eb^%bgY4NBk_=a-PEua0j7nOx1ayyY1rqIzK_SNu424nmQl9bZQ@L zDxX%@>%m3(y1Q+lvv*))cEgbEKTRf_AyFFVe`dCgFc#&!X!*Wo=Fsjz;z?fz`BOvN z*L@{%Zsgc~XgYq*f4f`Xr^1={t8j+a`L;~wMT33qj&G-^Cv5{?qBLzIeLp4cgZ1=v z;#_PfuiGfLl$*)AJv4Z#gWTsa@3E$t5&DeT!stAkC&XVgeX_Yvzp=QO+#4@8DXuk7 zXy75P(k*B|0ORkFu4-m*UMBUA&NA!2+L^Wyy`!_do|#c=ofpa{|G7@a=@P2SU?^8_ zC@hZ`h5Hd_g#P&;DXz8&`9VExV`(_Q$h8F%Ls#n%J+8YEo*)a&ktyXNW<^IxoA^`k zj;{ynISwu=d<#u|X~&VV?x{9yV~*4q#yZ#2HWp2eO%9C~*9?#B+%=i5xWW5eZ$h0@ zY7LY1%@yCAIxjArAK)d;wRAYAjDP>AJulOF_5+5;$KuKyxKh@Eb4rejY364-AN0VX zJ!5X3?&}r}ZQmwu&F>p8hOXAv$Oo*w z{s(uJML4dcj9zhV?0XAE62_m^)o<)~-aWECt~7&Z$g()6j9ziIi^Mm}`A+ETVn27L z^wY7glV79uW4F9Df89iJ!N`ssBg1*8%e9Q_<(7R8(ypN$i~dD^K)YaSWc<9ibnY1% z*|TnZm<{A*oh*(s#2H%WrJ*f1>U`t@?+;#Eo)<0F%8M;FR)1E=B8;CQQJV4dACfx9 zw$47Fza;!OVJy0&quA8eKiK5;DHXm-hdM**3~im4RjD)2t<`y9N6{x2^{6+CfA_sme+$*buLdA6pf#)t5ohMia0}@p>G;q0U!`BF+$J zXq^wvbe8w6$~trIob_jhb>Iwf)^(a=$`P5)q0X&(OmV35P;iDgLtEz~Go3?wZt-f* z7mFfwhB!m(d{m}$sPihXI&T$4oFUH8Iv<_s9O~TaRp-s3h%>|)TIaiDI?Fz|xkJ9# zaIkG~llDt&BO@DRS)3ux&^jNJ>3p!B=jScLaDCli7h7pKJ+dTYQAm`g-}t5cGI7k` zR6ecd_a;t~-?#ic>?Rp6%O}LRqByLhQM^DF#2FH$aXvn&bG^=b?AAKdJUY4t9Nwho zbuiBH^{~>}xqROWXTR$TaE>q2l*ajlj5?nz%g&qFHL_#U=d-Y)s@F`-F*M2*uCI&N z1)jq~l3LGioU-5f>Y>qc(d=9HV8&=E?KwvFqeh)im1Sp5?Ax6!nyg?$a87B@ne+E; z)cG`7cJ}1Z#8t^QbMLmv3h19xE;cLW@7t*J>9Xu01I1w5z=Z{;4AypU>X)z0-KfVd zvz=NWULjB9Sfa0~ggoYbpfu5!K03DN**t*-?;vN0^P$B=L8*)V=j|qTja_pG3;vrQ z<0_{+)frwPlU2c$zj5kZ>v{gW-bv2UH+2@3+y8RRGdWY9xM+NA-_Bir?@e$HhJGVu zJXaJqk1K!U)VbEa?kri(dmrR=Hv3>oyASgBZPfW}S@y_eA8g;y*4x|JT@1AK^fh{= z-HGB$`_=F06!JLUm%Ezio7TD3eefJ{J}TV@x5+ma>=_=FHwt&}9gRodxTV^NANyWp z{2kJzapiBEI@h`nHr+|i(KmG#m74a!R(axF>Ery4+~s#hvJW07Q=~l(s;jAUt@|Kj z(Ia#$8b6B{J|niOXy|izlxmesjO!p#nnBW!q`~9O)KosL<}p9cM<&jLT`g;hp24Q( zqNn-X_+h%R&RTH~c_Pk`D2;P-sBt6CN6WfqZrfF^-0AjMSr22;ln0r0vmdelYa0na ztEX+0pQ$O^#^%nh^&5(&wPq7_J!E0(99N<=b#9rN*ESB^|8*)5^_WZ`03}^a{@;XLw zF1p(KS$}3OmF1~3BuZ1~T<7Il=lFeJE!kiAb%l8149OMT80VH*jqigi_qPo>kHoqi z@;X@uZ3EIapmqLC<}t$^VPHCL)ncHtT zf3MoP;!E3r)a;GdcPjL zi#XD6q_nRGkCnF4=osk&ab7CltG55thQno4!{U3iOeyarkJCiobX>QZC)C()%AUto@#Y2kAvk{bX99>(bUGmjfchQH{xoPM*6H|A8ZPn;&-go zIel%_*3r=>AFYu~P%dt23G1pC=gR^(LvlVh#<@MIb0f~)-_?1mDDs;1Au`R7=~kIm z%9Q4~#92zN(fyPK?jRgf7RRw@abagy_Z=)y!;kq)0Ck2$Y3h7l;@n7`r^cc^9a&#u zQ7TsW>>c>a-QQS0~D$+bPD zv%Y{G)a~Tl;2S5_!+pCCZb<4}uk(en>;cD=v3-+lA}2d#VU8&&?JoKy59Wq6>nN@Q9ZPZ!EqT#Ixd53UxWMXo7k6C}c4;l0D z{z=M{%}Q>N$ID6xDUp^aXodG?+lsxKAH2fl`9O#afU=`oG(i1T(9$>EGyT2O*uP!pUfM?lePhA z8_>3m{tV|$vTT*_C62#3TdOp<`^@=Fy36;A{zw#YhB!m(Oq*=f`BGWd`};+ID2g~koS}8*@7t*J<+7~z z=jd-0MVukd&^q(?ZPb~4(EGI&@AI(_LZURsl#3JRxDWE-!8_}<6?!;FO=Wz*FCn=s z*LnTu*w&%Z{^6aB_{YnYX56;Qvb2dK!#a4(*fh<3gYzHd2eHnzj-LxzHvB&b<~8Z`656mOY@~kRCes+myc} zia0}@p>^i(+o*-|e*?F6+ z0cVIaw9fo}8+G0(%X)vW+B-xMXNWVj&is8Fb>1b*dVf#gXGIZbh%>a#{CyjB9+73e zzbEkXqKGrZ8CqxlzKuFxd4RLe_XK`U6mf<)L+i}nw^8S-WLX)Dx_(yreWHjn#2H#= z{=SVmkIJ&)v;S`2S8$Uk;tX+y)|tO=qt3ghoZY^!;Eke)GsGEMXa2s8I`5HX5BRLK z!~anE2~oru;tZ`be_!j&b9DjuZ!#v!dVh}oW3oM*As)~=^Y^vRwVvPDE6aL+j{c*f zh%>|)T4(;gjXK|7mOY?tIDC%&&)NRI@j7ZCS=+0d04m4(Z5F&afUcU>&)M`QRhin*84N*?-fOyA{EesPi?lY-k&9pGkkeDB=uphSr(CZ==qf`|`e)xI+|i zhB!m(+?P1l`(E3%vTSG@Zr@jMizwm@afa5JHrZ&Muajj%+i?3F{Rc!5XNWVj&a}x! zogXk&XSeSw_>?H(3~`3mnZIwN&JUcb^D3|JEBK%&;tX+y)|tO=qs|YKWxcn0`(4l9F59GSKop>D8&@ZFuD5^2`SAU(V2l21w->Ez zia`)Bxn_%X`S>GQFX9?v0 z;_YGexp}axfVKgN(zK17>o*Q?ZfS9Geu#MD42jY>KisR%EvsCdZxBzMA-RDYb{BHkHTjhP&)XiUW0qL}{EKlj%Hb$m@Ti zFC7O2jL}l^JEY-wvLtxV4nJ59ISAcB=%1H#Hx(`N70?|UH_0{qgLkmR9sihP2;-f2 zOnI8zM`cd(tupZ#2#=7T#ngJu$->|~(B6GvTsDUzvM_aq_<^tMg+0zgD+RG`GnAHJ;fn*z5|KaE3%_jwxwh7q1Vi=k?%xy)L(XgV%q5 zcC>hM41q*xoS&N1Im@}F+(zy#=Q41P=QNbY`DtFxt+}@4^2Y>cNR-C;>0ZvO%5CJ{ z9xE%L&X6dL^E14h^M@Mhc)Z-=49W4_80TkZI?H)cxi((*!NIW|9A|U0QdWR7BueA_ ztW0OQwnwk$A80Asnu?9R<(3-1y;&Be4X2Ff5#w5)UB!7ZKb#StF+CZJdON>UHivUc z>-?Om&LUi+v%CjX)|oOp4D9YFzO)TUl%{Pww~Djs*66&y&e}BAtt+?G_$>oNoZ|pd zX`G*z=`7b3Ow~ERIqP?U<2)38ZKZL3{(qS>`yTI2aLpxsGmqmjQSNG9P{nyMjk(6Q z;az9;J)F6I5oaD-=NDFWmYFp=%X^x9{l@m;(V^>P_1WRQ2-=3eClP7d#*3;rt8R_X za!lFp>@iI02+oiwjq{5$okQE;RDrx;$v=Q!E}qmG5~Xo|Nv3n?pG#+l{`oTT#2FH$ zaeis0bLgK-=Z*RO^H%Z184{&&ep#mT0d2#fe=fumXGoOB`Q?7jGD^yC&zwKPIi5#S z8s}GJIw$S9#bdlN8k`|f8s}GLIw$S9rEqA^W8z7jAyFFVS7kaU?OB|&htHK=;)ydP zO5^-$Kj&7D_B<(`I76Z|&acUIPTI4}iP3TK#2FH$aei&4bJCt$J=*g%;)ydPO5^;x zOy{IMi*tT^-Y1?oL!va!ulI9a<oXfd_XNV`xkSLAw zn=_q5+bEqKj@{1|Pn;o98t0ocokQCQ&iQTQx#Ed4BueA_mQ3fQZ8UrI8&4NcoFP#f z=eK4$CvBtIqu+Rzc;XC+(m1~@(>ZAy;+)?$o+F+(L!va!Z_jiNb?)of-0RUaDvuXW zoFP#f=XYc}hdQgXL$^_RqIlvAiPAW~Gt*f_FOtUG>&cJi8CZhfIrQzDb1pa8 z2VKs|>=s3wAyFFV4`ezgZNuf9%wF-t84{&&{@{O^GyB|eGNo)nKFNowI5)Tty40C{ z4(F8C`NLJ6WoG^Rpv$?hE5(<#0g2MIjgM4uZg3xTIgd0Uo;X9IG|nH*bWZj`m-9&1 ziYLyHD2?;SGM$tD+2uUa)#8aWBueA_@l5BWe|9-1^FZ;$84{&&{zRs8(l%Vq$=o2G zI74y+H^%vsna)Yua5*RQU{S;w5~XpzCDS?7d9bsm&*imME!W0>D$_aCS)Cn*&y~kY zZK*RPN>k@g|Cc$xSv(nw-h{A($H(ZsshiJKajxgs?Oo@0h#Jms3yM6p&Y!L7EHi67 zc8AxnW!uOfK35(ijrTOwS&b59%WpVu6gnT|F_cIfC zyFoVEpl^vB z&Jbs4+r~GiajvyJdw&k-8{)|4eo`JGkJEgsit}ooFe80d_4{0BK7Vjvpjg+vadT1q zIrYx{x-7t^ZwU+XctN-y@$KOJUEz^o=4@D_^U?a3rA ztFg}B|7YT-MQ*-KDXsIZ;+x}q&}1<&DgXU^T8EtbpOJ;Bb4vQYG~ds3o)?^3(v@c1 z|Ew&_YmSsl%=&(i={#qjeB3{tTr=x#=akm@ zM;^|*t8c%NxnB;>DXsI5Go2S*Gj!GPzP-id$Zm)K1)=;NV%qcPWQsi4{PI7^be=!7 zZ`-c+{`L({?c-Ck%Hv?<_vEqdcGJ)B#=imk!0n!Bepepqcq2G>k5zd>1GBy#oFo5K z#rbDa=jh#t^TKUA_iY%ywxxa7(0Buiw_D`lQq&bPH}dK7*w*>yna;DMUEFTN88hA> zb)`Q}d5BrxFEX9yY#ZO!yvD3Fxzl7afbovauKA?kenKvXIErYAM%?_=OyC2b>EI++t}XgihbMS zY8&PUWJ#PM;aq{O^KYkduC+Zc6leYLV6oe!fxJ;1afXC*GC0rFSL4j7RDL&&bFJrO z7VUT5Gv+afevvrg49P2HvUUD_rt?&t_qo*h8RCdDBrlMubmo<9ng7jnW*?OQuyp*o zy_3br_PEx@`CSpj8IoTJOXr2<47vToG|scbGW(xcZmr&XBAUa(71ZKimFk8s}P%DYT9K z&aJwcteaoU(l|r1G&s*m&W`?h8s~cIyy?8M%nr(W{)pq?Eov-d3n6u$lbmV%OQth* zzIuP5!-g`jS_E;1O&#x@=Q9yr(9Z>Y1&D74gJoP`I(8CvHVna;~bCf1JZ?A#+Gq&*wQw`ZTT8x}{L zAt_1sr?Yq4*n*gC==(IH!89kgeNGdxzNG_$60uC;B<$9clf zd9%pj3~`3X$dqPwrnC3?jVnctwgGX5$IFyv&NR-o9#g!}Z_v+EXNWUAL#8xyGo8K9 zZ(JgBI76JF9^-^D2TkK#YyUiTuAtfFh4(rU<2VS3(i{ipRdLosV2#JYsdEKB=VUGr zPwEV*GdxbFH1n%C*KuA^IN}U(hPKWNGo8K9 z$y_ClI76Iaw@hgkP2+rLos-!rayUbrp?y8ScpB$g`wiNL=X*dL^A^YiafWuhv1A(O zT94iH#Cc@TWXq7O+au@8O6UV1&hXwcrCBDWGw!dIWoa7_XLz1WX_h%S z?;V#)rz_34-!IGJ3~`1h$&_aKG|soxcub*xR%hO!NLSq8{Xtm{XNWUAO{O#lXF9VF zmd?HH>3SQzKOhU@3~`31$dqP9rnC3C+{;A{XNWUAQ>HYBOygY7Sakm>M%$658>;dC z{p5K#L!99`GNn0m8s}R34eIQ9E|<^xFO&)549}1$&0(3&oMYUlZ%?FaZT$X5S(G|M zoZ+!Dr8#^W=UR^`>O8?)D(PAqzuzZ|;tX+y91GJNk?HJx&U{SdXd4h`X#0&Lr*W=z zAEdAIJZHW~9C3y?Lwig)D%08focV5X#2MlY?fChGX`E|q&vW)nj_n$i6+4AvDb5gQ zXwQ8e?cqEjD|X5*Sr5(-XK0;|$#kA8Z>GpUS+h?VA2Jq&IKy*gN^|Tq&b97?iw6e^ zxg>D=*fo2Ky_`VF%+azu!!zEWAUx)psx-$1=aoYKCS*1@HID06glppy@#|T<(cn5y zrpWj^r0e6{^YOtuI?GiwHD70bXE;aSlae~mtiyRh*(%1oM*T-fLFdYp(ws)pbNsQt zi*>H&+W2|WnD@FFS1N}G=ajZRpD6XsaXy6qgT81R=4r9 zJfHRqiP9AMU$U>o_fwk6r|I9O)_riPI?MkLTMP`g7w4@Dt7sUUH^LbbrE$JN3ZLUV zpZ|w<>*(0FtIBQU-qH@Zk}jn^cHblP8FCdrSzBDZp-C=|XzJ9B)_Jo=o{uvmO5=Q5 zQs+k6^NjW7y1j1s8#Crl$+0|5tT9{>eo#-_ST6sM7)_f0tIeZbzepUUj1@@UDHF|f zb}~{rGpTcI&pdZdjqQ0wa2_5Xniwu7hPO?QjkA2C`Km04GbDWGu~gAY>b%Xc z6@}z5naVoLh$7^S#5uNS{ZWl=V^LdQU(vp?r)OiY$A8zRe)z`CD@~o#eemG$d(>0s zg*ac_*+0$*Azisq)Cfv~X#!Al*S<4Yc;ab7P?JGPIeu$_9Gm+(KnY#rSC|Fp%3Zdfl5uI8#p1j$c*nL;*Z5g3ewHp{2j_b{LO;NGKjrae#jBIHad!Aw zJ;%XC(%0?Ywok6tF2+2DcC=4kkH&U-54lg@F)KL^#&!Xtvpi+0v(X3DZ@5loMQ3MU z|Hhu8v$wtIXd7%RdfK*Be|BwisWI&t5~XR+JxO~$r+ivnWB%od^SZ9?!Os4$k_N%~ z7o6jH7^QJuleCRSoEHV>wcQ)rFKo~=UF;-zKwF6CoOx`=b=L&vy9qg$Km-Yu|K7xO{du^ z&X))8*q-Y-4tl>HIN?#Wle}{B+_}(YfIy%?W*WDS;(YHOR zvvhwo?}Kv~^Y^4x$h%+5c%wOK&#|r7(?8F=_S!s2v-AdeOxsMUKFRZF8*Qd-)YEV9 z+N!0=uh5K}=g9<#(u|STX4YAqSNS=!PvIQ*Ev0ep$aJPXJHCX~^ZYo+*HcR4+?naj zd&j$ncTWuG59!2I`d#UqY0r?%l@5WsGqn0TtMU(-N1JBiTD+KAuQ~B{-YWvUuLF5c z6WVJ|?vm7*=aR)T)#`k(o-5$JiSDk!&fbo$wq9LFqc^;!q-{W=G;M>uC)T-1pB2vG zguhLgRTYfujxNW~1D)-I@*Yq*j9$BGT`|ygX=l}i?qKFI@^hRaQ5xs(iCc7zW2Ace z=Y!>Scl@mMuAx2KM>9X6!q}4W1*C02JFdGdX&d~U&^Brvi+Z0IJFGjobK(kxfXM0mVZ?@is@GdTAOW1Z_6*Dd3OOl%wu=aX>7 zF*5!RQ^sXm?g`$}xt?*|o#7mP`;$7?Gp;*GYFu13d|g_Hockxr!u*|6#=ar0mp)^o zsdGJJqy?dExO~BaNSz#puM&bxz59DrqjtbY8+Cu&blE zu=A3lyEE??h!?H2 zc1q5JrP-3yxn5_+&x^%5oHmyuV!GzW?sNQDDpMq5x*29wgTeWJ!suMjv3nlJZilf^ z)H+@6;FxX0ooj6y<@smd@dj;~<6z2a({Dsy7&YtZH)tDOLwk!(u461WlXcr6OV5!B5?-y9 zUQ?|)b&g|xo;xG{0z8-|v<+|P2g$Z@hU8H)l`8S9t$a2pX&Y0{a#=x*&ivmx)VWK} zF6u@yZ#b^u9FK1&$o*1?g%Hz&yoaE7E+rn1gcqmI#Ooa^m3 zyqqr;N1P$KQl`>*i9Y6LcU9-w`#Sy)Blba@vm1u^JWVE?A$hJ$wr%XG>Rfx<@II!T zC64TEklqcRC{vpBI2ikJT28HP!@J)&Tegie#2Lodsd87dH>q>#T5kN3O1 z-aB3*PP76@l(C_dvnmg+;#^OAp4YXuZ(y*^<+CX$#W7suJ%VS7v^~=o5_O(g-v4*E z9J?1r=fRDA|L(c9{_I}iiIMlNvfvF#of~nU*Ttu-yjsT8F)tqbI1bu8G}pP$w{3I> z!N?vfERP?S>AWyHJGG72z#=&pX7lh&=Xrg;ZR4yU76u> zsIyM-suTqYNW?d=+PhML=qBP^W)iNN8a=HlYu42jY>Kf%d4j%ms*HGaD} zI76Z|&QJ7lZt<$~mf#GD(l|fK$=R#Umjq`>l*akVnaM@lL!va!Pxoo+bB&X6dL^D~^B zz3N;9XGoOB`I(u{+HbV_^&2~aGbBpm{H#o8?KfKe`VIc?&qd-I{|`{5aelUovtPfl zH8?|}G|ta)a`tM^+k!JBO5^-oA7{6IV|#FhL}{F#=j7~F=i%TCiPAVfKhs(Jja7dA z#%OScL}{E~km;=b#wx#lV|Q?dL}{E~=;G|xZ|n-rkSLAwi=3Rj+Ve;0%e{aJ$f-@va3=wXbWxaG=~m{%ucihD2$c-=67Q z*4e9N$p38|oFP#f=XYc}YyZ5i!|kB5F*rk_G|unLbk;g|#VbV0?d06{24_f=#`#^D z&a~&2Cbu$I9v7S;Q5xrWXFAh1TAKWh-TxDuAyFFV_qaIw9lIYDoFP#f=l41}d-WWT z4$hD$jr03_oZXJyj|t9@D2?;`ot(Yu{Mg_OiPAWKAk$g<4aaM!o*bMZQ5xqDW;$!X z(d^f6JS8|oqBPDQa&h+SHy$6HAyFFV4?8(~wdW@UXGoOB`6E8gZvDm+gEJ&b92 zkSLAwXEL3&-*CK!>IK0W5~Xqetc$Z>zwzwg42jY>f6mF-t35v_I76Z|&Y$;jcI!8u z8=N6g8s{%KIeXRldBGVHrE&gZrnB}Nj@MAVG&n<|G|pejbk=^u@fxa^1!qW<#`()G z&VK#I3xhKxO5^+$Cugtr{G#9tiPAWK)yLVb-*|CwhD2$czvkrZRp*xkXGoOB`Rkd^ z+HW{sL-p$542jY>eO5^;!OlR#k9Iv6e zDL6x-G|soWIQ#V*uMN(SD2?;?ot(Ye^Xq~$BueA_10QF%e&hAQ84{&&{-KkzSDoJw zoFP#f=O1M{Yro-m4b@wNGbBpm{Nqe#?Kd2+p?X_zhD2$cf8yfo*KfQjI76Z|&Odc> z_G-^>4$hD$jq}fZoZb43n}ahXO5^-S4hd5~XqeRi<-UXRnq~sXR0|L!va!zs_{l{@L*wsvCndBueA_n@ne| zv*R^Xj||R`D2?-PGo9zN4-U3y1A zJ`kKCQ5xs}&2(lTY<0X=?SsJ?5~XqegNw7@80kI184{&&{-cw#Q**AoH#kG0G|qqW zadsOcy)QUJqBPEbc5?Qr^ZSD{BueA_mrQ5vHyp23`&e*>L}{G=n(3_lhU2wr9}muu zD2?;qT%7&-jSmH9NR-C;?@rEM?fJvO84{&&{y!gQw|?Uz!5I>zasG#svsaxz8k`|f z8s~pzI%~h-c&*x}gEJ&bls$7|KT7@Q$d z8t2)W&f0G{UaR({;0%eb^cm#hD2$cmu5O^zu|bT z+INF9BueAFEYn&04aaNMz89P!Q5xsvF3x`a#y5jABue9au#>Y_d;V5%hD2$cSNJ%) z^&8&~&X6dL^C3>oUUmLXaE3%_oDa=()_%kBTD2bqXGoOB`LIl9?Kd2+Rr_&phD2$c z4|j3)>o;x<&X6dL^AS$YUhVn&!5I>zaX!+=*{$FBL2!mdX`GL8a`vk84}&u#O5=QV zrnB}Nj@PRFA~-{$G|qR)bk=^u@mjTC24_f=#`zc*XTN^qC&3vKrExyi$=Rzt|1>y5 zqBPFO`8d1v8$S!qkSLAw@lMWOb^dv9hD2$cS7thMZBMJ$MKa>}_TUVO(m0=x>8yR7 z8$;;3Yt`Nr zoFP#f=TkDBY0s-1uc7)&aE3%_oKMYkrfsZpyoTzp!5I>zaX!t(+3(o>hu{o}(m0>) zAyZ;oNAyFFVyE-|0)%nlC84{&&J~Pu<`whoysQww8AyFFV zvof8v-*CK!>R-Vb5~XoI+r`z zac*{U_Nwzgf-@va$J ze&e>#HXuI^l|IIr<>cI!801ZPN;#`#<)XRkWX49<`!jq`b#&f0G{ zUPCoMI76Z|&Uedn)_%kB8ma}s84{&&zPpRFU%xRYI76Z|&i8O~_G-^_gEJ&b<9tsa zXSaUipx_LN(m3DC$=R#U^MW%ZO5=R*OlR#k9Iv5T8k`|f8t40DI%~h-cn#IE;0%e< zIG^w0?ALEB49<`!jdPomvsZgw6r3SZ8t1h>&Tjq2;@}L4(m1y}IeXQ4NpOZlX`DMU zoweU^yoTz~;0%e{aJOf-@va<9tD;v-TT~*H9fDoFP#f=L<8Pwcl{OhUzZC z84{&&?sjqZ>o*P$&X6dLbB~j=S9?ApI76Z|&b>a)ZvDoQ!5I>zao*_U>{aKZf-@va z8uGbBpmd{L&e_8X4ZP@NE*AyFFVeivuIe&d+n42jY>4>&n{wdZ4l zGbBpmJm}->)^8jaoFP#f=S@z|UUfb`I76Z|&KGAobIr*r$7`s570&ZRqBPE%Go7`s zbG(M?H^CVarE%Vp>0H*?t7TLwzYfljD2?+ana26cn#I> zgEJ&b<9u1BGvD{M%JKWYejA)2Q5xs_dO15a>E8usNR-C;ewohn8>=0!RXa2E&yXmM z^W~Y&?1QTvuT?uMI76Z|&V`G!-x%q%;0%e8$;RzaUOPY_Ukv! z4$hD$jq?sCXRr2rPH=`qX`FZZIJ@;5O~DxwrE%WnzalSIsS^EvgYt`-+oFP#f=c`zaUOMY_G-_ogEJ&b ze*MPXgEJ&b<2>%ls z$7|I(f-@va<9v0dv-TT~*Q#{}XGoOB`5G5zzkcKV;0%e8$;RI#!|__Ri-R*HO5^+IDsDwUIhGbBpm z{G?20?Vla5RXa5}L!va!PtJ7KIy+vgc1m!DL}{F#lIcvH+t;mcYA!dCeft$z!y=hd zo@Uni)GE$%cuu%h%sl;ohyT3ow%dYpOX~qYY5c)gWl@|{TIZ+vIImjWxaI*%ek(Yq zw9Ze@bf!HIbPgV{-JA!X56&sA^D{D?XZ3Aq%5k*IJ|Z}$w9e1WclO%-RR3YYIi+=e zR;KfuzG7grqxEIMIi+=ewuf_zmdNGi#^9XNIzK1Vc~<}0^IT-ZO1gq`$}`Lco}2C5 z*=tsr^>BS~PHCN=m+3sSpNjb9LRl5Zl$6%_`I*kM`UhP5y4MHil&71LyddA%vDc_n zUKgBGTIUyLI?wGN7?d%RsYK%sza5-Y+J56jna**(m04LN04)1)9V2xF=ahC__u71C*D+FOa87BRUzhLf_{vJIeF)Aet@GGtk#Q$WHE*SIByBPHCOrnD5-t=64#Y^2*?x(mLOi z={$F!Z(z_-`sKknrFDK&rt^ZLkQXZFtuHndvbFqhI+nH(Ps=Ko9k|{%S8<-pQ{qAg zKK+14oXedx==L_7uKTTWi*rg_=bNiI&td7>ogMeUO66_AIi+=eOSW_C27X1a+$<}i z&MB?)Tl1Y=>-?7BoYFeKE!%mOYn|T|oKsrox92;%*7?oBIi+=eN2c?f!BvB;ys&r5 zO|l-^b4u&{&P?Z-gKbW>vc-VmHq+Hu{xGo5D-`o2y%DLALJ zb$(B#^Q^&jP32$J=l0a#oYL0$z4^|ruTxGA&MB?)`?8%kxYn7K(Ql-*ZR7p<&aQQ4 zWjLp_&L7Bho;lbhTky*TvMQWY+P3k*Oy^mH-L7rp?BJZz*7-yE&aQ3aoZy_&I)6CR zdCp)@OW%NO$SF%@+)mqoM7gZIA8$WW#kro>DdODf>AWmBL!va!AI*1O<>|aUI76Z| z&L7Kko;}#Jv7=nQ%k5dR7TQKi+nzsO#ks!MgZ-}k27WlFw0+$t@||7#jZ=biO6&Z| zOy~KVI|d6G+6_9rKk?MyoYJ<9TQZ&JY`$>N@e7wVp26|lg!CPfx^jj&9lE-Oo zJV^duLOJiov@-mluD))drzKrq?)~q}3fO*1>-@Q-&W$*GpXWbXd_}2}@(6jH=JT1( z-sky`pHVuew9a41cXmC`zcM(dw9a45boM^ae_U`*X`R26>AXzO^A{77+s+$0@2dQ> z{i0l%Cle$})7O2uigP`E-ONGPAyVZ=k)+>9X_PBpsp4EuUpI5mwR^5SGB~HS&R@-R zo-^2dZL?z!eWTQPK6RFfD2?>jsyNrvHoV^h`kHu(QYEF`2ftp$xt_Km&W}M!vJ(07-lwEfZ}65~XPy->l+XPurL?*y7rrA1j_XL!va!-^z5JJ=jukO^a6^ zBP+rg5~XqecBb>JLErZW`TUP4>F0nVZF~Ms73cc)!B*FOkk9|%n$kLdH`95}VC z$M>zi7@SjD=kH}Y&l>c7PxDK`Ii+>JHQ(8_ZG1U6r?k%B&vf>FPxA}GIi+>}LAG;S zNBjT7+I@h>Rb5}8A4?p%VhJ<(`N1WG(R7+Q6|sEFY;z-pT7|1GTHpgq*?tv&7a0>l*zO4tE5@| zJAXyUp2Wzslst;O{HU_&5K(V20n%QQg&Ble%ys5j{XNZZg}F>N|3zUIJ|p~Qn9F4IUz6sZ_0r3AjVHxpuuK}~#@~`= z_4i?~i06YylqaG8USY2D80;Ax>mFQm`&K*7Cibh$ed*Y<--AW&8vk3J$6)X1m=ulY zfiRc3Pq=2|pGBW{jW5@^vye@4;Lq_xV2+<~p;n5a#KLHhQ9{r`kbaE|bmoCe4e&Jf#5JF>qZU<}%rQ zU)sEG!{nNd>{H6{oC@YL*?fP}+#FrEL3t(|3Uirk#s+(Kjo#J%KB~?z7) zi$R~uWb=ZgxqobIv^B6&MfUG$!u*Y}BiY;|F;B_Np9*W4Z0=Q<2X%eM9u$2plg&+u zS=Z-Jhq+8P_bJT6x0mAi3Hn?noBJhZU7tS_<}%s5P+=B+%)+fpF|-G{0^Y6pV3%>C%#8whKsW zll#1R(%fgCu{|+Gcbxd+55tT^dD8RlEh@})o_F_*3BhLkr2Rsl%j7<9Sz)#>&HH;3 z{bN(B#wU-(zmU|A>?klJQJ&Q2tt!lQ`rI7TzDMj9bHZFE_j&6IbG<&VZjA}Q4Rm*y z%VhI560`2Ca!;7cWb=cQ<{sgDfQ;MtNSMpy_4y%b^KrNNptUb zYb6~r^~YW9U&CA`&&GC1bJNVqecfGQE|bmMC(YL9DZ3k4?P5nlpUY(P4oS21c}m&m zJHuQin|Dl_to?m zf&JYDxcUDnycXg?51400r}CqHQkan_PcrW^hk3rQ-*}+UnyJ1p%t(|cnRlJTT))qQ zl0KgvW+cj!%)8BDuHR?Pp5wAGBT=4Y-hB@9eEa;sYz%krBzgO|Fe6c(WZpw&9_ijm z^7iU5BT=4Y-cx4Q`~;OJhZ%|TB=cS}v*ra!PY*K^Z(+J~qrqlqZ?@pTj)gKF4{`W=gjsV=xjoEClqZ>oWoFI#d}o-EC{Hqv$jqAc z`K~Y{QJ!R8A~S2&=X=78M0t{VY0|t&cb+df>)g{W8tC3l>h=?1Mxs2)yi90TJPPj! zGZN)V<^z*vTQ}BTaN2p}sy+XCVMd}n$$U_Sx#qR6S+iu%e@d8# z$!Ih#4l@$vN#;Z5Fwb`{YJ2`!v!u^wh8cJ?D?+`GZN)V<|Ach&7S|pFe6c(WFD27 zHGBT&gc*tQB=hp5+4dXliRoh}X7Jv}?%kwr?+!B(2C(S(*quqmxZXa#O z!E1ZUraz0bm*BleOom&xW+ljcR}v;B0PQM)fiJ>L$3*(j6ErzOok8y(&IYQ7TY zGTD53((HZiOiv!AXtEvS#bGX!&1WRdJ(Ck6ZTB$8hq+8PpP4lGPEHIc(GLrAnfyM@ zv+`!?b67n0!(*^aHa{kB)_hYU{?9r)%w_UyoSif;v=1n=x23O*yG#eZ!+}1R$>wvC z=AOw`+F2gp@nJ5L&F3b~y^}5JY+MoMGTD4y(%dxj%Cb?(-(MN#GTD57(rkU!e3LEy zTR#!zGTD4V(rkT}{y-pnUOXOyWwQCgq}lqc9F4}~!dxbsFG`vh+2y+7p;fXcu|Ewn z66HzHtuC%G*STJ|(9Fw6*U0w#Sm-euWpbY{sW97@=Kb8N&&=b?@eefhb2|*oNR%h_ z`O*q=oj&(ZPTNjY_t~?@m=oqQxzCqXnCtYpcT)R3p#8&KChw6Rn>S1Mb?~9jWwQD5 zqB>IBT=3-&sS8K{Sr=G$Lapd>RY_`f0J4B+SbIH z>c3X&tG9+3iSi`#l}U5-c~I5oTf&S)d6M~YNptjha7NVUkA@kE@+9-)lji8N{our@ ziBZ8t==X#fiSi`#RXVfeF?e&Bktk0xKOt$3*%(sI#!X>HqCCm`#H2Z9V^}pC?+!B( zgno@Bl@Y2K)NP8pdQ?R4)XdHdEdBT=4Y zzAkBwc^*;C^Si=~M0t|=NjkG+p5Gj1B+8S_PfnU+o<~&k{H8D?QJ!ReO45wku%9*9;@JEd=h8Hw^F^HY=NE&s1My;J&Tn2{(? zGCwV8-s}PM#h09P(Iwq``rmKA8fGNQlgv*~nio!KpTxGziRV^j@^jc5D$Mq!d0#77 zxEfcVWtU_cKMOMwta2%}ZopJJ1ecE|bkK%$t`g%{zv+F%tEPbU6-fM}+;Ou)YJ<0siyjl2@bsCK$%?opxJR2{oFx!{ry??eo zuU4K2kFdLjxlA^{JZbK04Xhb!<3CbUzqiA{j6`|TY`mhvTyvgV>$-=R-2T#z0y7fj zN#+LrNrTgce*gqpto@9P&-YnfeA8t-O2Fv8xcw2?pzBKQ1x6Ouh|9n`O z%VhK0ljgqGpmhKIhcF{io-`Zps4&-@XX*a=SLVcQAW@!VerMh+-9P`$oG>F%o@9Pk z(%hqcnRx@xA7Cz%=lR_gX8Y2-AA`NEp#l7LRpF^6%w@9qJ$bWq|J(_4nQVS<-Ynfe zuM2aTY<^$fEZsjJ8|E_E{QkUIx_@3D<}%s*fxKC|f8G%0GTHpWym_hJjjWEdBVpYr zlg%H>o2C2bM~1mfHh(y2ZnlP``{#SZj6`|TdGI3@=6d^$A?aRpxj8W#WpbZysxaG^ z=6xQtK1=taqhT(S%{M2_eXSwsUi6P)Mxs1vHa=Qmt~ndhz38vaiP=D+Jjr}Z-YngV z{@t7~BT=4YzBOs?(Y_V0agI4*E|cf^V-;rm(!3voy{+K^{B>2GYX^e4Og4W!ZTW#UoG_Qk^ZfY=vwdma zkHOy7$N>Jjs&23Y!CWSrzmPXe_s=(mxlA^HF>fAH^%%!_MwrWF^Oy2w>HhhdVJ?%+ zU(TDQ55i}KxlA^HC2yAQpPwD(GTHpqyji+`eomOnWb@bZX6gR0b1==EQ6uQJ!S}PTnlti~iG`Fe6c(Wd3f_+|!btQW`Hc zC(LE?Jb$mkY+su9W3aciWB`9%RWGvx!CWSrzn?ct_o6QkbD3=ZLEbFgi@qYvWwQB) zd9!pc`pPhu$>tyB&CiF7ZDpCO3#`M*C)5Z6cPJoxhpbG`k>66s#__0i`txzE3-Fx!_N`0vE; z=O}y@ob_3{7k!=G7y4W#n}3-!_qCQt_o9CZGZN)Vv+=76bIsY1?nQrRPV^ax@+9-G z^JeK@^k3$L8Hw^F^Ka5-?a#$~qB&tMljr%j6=wU=ydQ&$T4SR#t@X0C% zd|jB!Wb@zhX4TT{|4&^L<}%s*_oR6t&Vd8E&->cN_V`%qkSI^uZ~UXeTxVam$jvLK zR3E~=YnYKJPcr{gV(tvC?A}HCc84${QJ!S}m&iQTy^Hkij$uZkJjwiTjal|{GIk0x z66Hze|A@@0KJOf6B+8S__a@E0ZVc+yjlIH*M0t|=zNFdLjX~YI@z5|MQJ!SJUt-p+ z8@q)WiSi_K!xrQF>^cR0?dpHae!eL({!M(TGH`vP+vm=pYMyrwGZN)V<^>wFY~9!+ z%t(|cnR`TLRiF0^GZN)V=H8^)*A4p-vE6&f-##qNNR%g;n@O|J^N?=c*gwojlqZ?{ zBxc>Zv3Hn}C{Hr?i_EHd-Y3jRlqZ=NYRs~AW8W|%QJ!R8Br>b|ykD4+C{HpkPMUq) z7}l*DgJDLZJjuLK((LQTux{NL3NsSrN#>0uX5G5+@Gv7$o@CxcWLC}dBf^YCd6Ick zjajyC91vzC%9G3w5}8$f9tblMS#F*+;1&zkmVMd}n$-Ga} z>}%cFs&@At^0yBTGZN)V=6#dqZl6_?(P(TFW+cj!%=;zHzCN!Qmz`9$4>JqV%t(|c znTIrH*&b;+%t(|cnTJJYRiE2oMxs2)Jd!jw+uGOjf5x0m`&H()z!$a0CJ(%ZYSZ|- zy%cQTuc7K~%ifye_x@SC#r>DLz5g!{+$=5n{6CtduYdkrn9F4IvbqaC{wQEe9H zGTD4c(%j!}wL3!ereQ9V&4(t=zQ{N#~Tq zD$Mq!2mTR$KS$v;u07hfr!+1$B-ZCLiQG86!d&N^($kSH&y9=1Tqc{3NSgaPgO?8q zS7^MSZL$4AqC5$GWQDoTZ1i?yTRJ!1X}4JG%H+r3Xob1XY?xWNIyV}3g}F>NFVCB0 zuOmjIueM*94J7Jn+|X={RhaEd^IkXlIz!TVzSiy*BR*y3uohFVJ?%+tCHs4&hi88 zZe;aEI}+A_GWq%7RMOn+Xs>U)$GlkU%H%$;PMUi=D+cT?Wc7YK68c;w_jyg;JSYR( zf!-VDGTFQ~ZC)wu^DSn^Y?R5f(aM{peZDo!WwQC0q`9XvY4@Tle7*_hxlEpo>7=>0 zGbNpko6U>aD3kl#&YPvP@zF4s$>vVd-0ZAgJ8t)*s+;UU=yREDUY9iYb=FFsr{FVL zu;)jjJZaB=Y=zmrH1FqDy`5?4Jb%FM8jry;`7yY@!i<0O--}Q9{TzksNM@GK^ZV?+ zaQ|hpc|+Q~K{?Ki%NBIaWzuLgj!T*suN$52%&Z=`T=Yqj_-r!FGZN)V=towV?Mw5X zjm7K7J2SSm>xiy$eA4b3>qeQpZak{OTxXv9*01WQUI&3z-4o_A*?hdhEPQr#cbLm$ z^P`jIp7o-kK$ER5jK^S^G|r6^vgT3cRU~`Ol({jRWp0Q6n4)Gs#{#)qe7(**_l}N9 z(OZ}SkHIo|Hcl-1{J)qN+e?v@>jqxu1#_8fJ}GHl2=nwrJN_?92R;u8<}%rQa?-pg z%&MgWpN9lN|L+n`)It}`#pWwQCyq`41f;V$VpVJ?%+rzOn`mfM{OYfC#8 z`dlWPPfwZ`FJIT5X}2aO#x?Nghq+8PpOG~8kByDC26UHm@g7I?xlA^nDKV>7jqdxo zVaEHqXOqomDa^7@uj{_Q3Rb+&YBt&Y7>QZeXS|mb)-u_Aw!$p@_A%ZQ26LHgK1X8K z_4(j1m&xXH6=vZ}?3RSNOg5h?a=S$OO-JTBrIp0)|yY0zI^x5(^x zeI3e^F3LQ%!faof_cg|zF(KIQb~yT6CinUB3Nz+uzSqqA$EH?|PacbZA*sij8GS~g zJgLuDRG91Zd7+tSgy`p)6YEBq+~+GR%ys(Q9MgW^YA9x-Og29*Y3?6e-5L{KEWqb& zpwDHp`SB97?o5c!+km-DHeV$$ubq)yuJfPahsWT{>=(+D9)nM)Fx!{ry>9f#-U*94 z?S3vG9#8muz}e*U;1es%bsmE~W5@Y@scyEm1L6M56HlV;-?6=wU=yw8Kp3GL5odxPCI`dlXW`I!}F{G0hc@9xok zdmi`Nc$59Y{g=t+XC=+O6K%~&8(^zj>=$15g+zJMY&^TdTxT}StT}0SiT*lKm~Sfn z%c5AYGc*!kZLku$#0|IM zVJ?%+FHM^JCpL7ZM|E!?yur+v4J68wX5(cQX8Y2-AA>#8?;P7_8QNXr|K~FKdfm$_ z%ynj?e{yJSrmY)~mzWp(XC%s#`uvItbDchS&AKJ}rRIbgiSi`#E0gBMlcTMf(ed%= zmEHTu-r{E@;<{*={1|*yg}Kgb{MRhHI*Ol>2y>Zies$8k5Pcq7J)Z6F?7!bT%w@9q zHA%DgS@>QL{M<0~xlA^{HfdgjKHDcGjm|bInR|x0Og6txVeU*%9+kAt{&W0HIrOAW=%Dh;&%G}=mT-F=&X5C59VE5QBn9F4I zoAPGeNzkl#uOnuoOrDK5C(X^tHPR=sPqoJ&`dlWRx*Km1n3cnEeVEH+^IMbVMb_sT zd)>)e>y4s5ZU@0^l*zO4wxqddvSs(6tGC;sU@nu*Z%>+gCtK3TVEOqbu;b5cen-;0 zXmWaNXk@kQ6%m))JY)ZiM0wIczq7(@Uz+!GE0~9eR>{m)h8c)@JSD5i{=6jvr%*v(C-*1fj|D^qzO*X$LY2I{dUQJ!ReU(y_X9#r*tmoOty zo@9Q1(j0vroDubT=P)Bto@D+&(j0xZ58j)a7@h9kPv&;3Fe6c(Wd5MeEO`v>6lNsK zlguAVnqxMGRI{;Tn2{(?GJiN}j@cMi&Bm5tMxs2){1Kg5G8;RD8Hw^F^G!)}%*L>4 zHntBl66Hzeo0H~^y62RU8PR7zZxUuC%9G3=O`2n#M^y8?MVOH&Pcq-4GfU=qqc9^; zo@Bl?X^wdwQO)z>Fe6c(Wd2yvjM?Z+uAZ14oH^~hQ@i(*xjit=T zi!aLWlnxCu66Hze+mhxj|F1c{Q#vHfNR%g;Kan(V_JH}~OHR7zlI}hI@3+gsj6`{o z`SzrF(P~_f(Y+A}pBInk-AI%tneV7D+n473d~l(gb#L~#B+N*ZCzfX}^Bfd|J=i6oC_hsE(VaC6i@3n#jt@3F3-{ZOf?!Qbn-;*@=vNe=cucVs|5}huV?w7%Y>`pU<0@%D{G@y~A84o4=4Z zFH@TL33Hij{$kSHYz+uMO{USfz|1(Ol*#5V3Czj``ob`m$>uL7%{?up*j^tK<}%s* zm87}1H7GrI?`LML8)dTjt9i4u(GLrAnQZ=A-Yh+L?;qwe+5GjqS$gh%c$mv%^EdKl z>ACw6VJ?%+-^`n(=k5c-Tqc{pl{ZVz-B^UMZj{O9Z|BX@b2kZ7vwg#p9jf=uuCY!$}Fe^_g7l*k_Hh({9?$N%qr-2g`W}{3t z{~&4ZZ4F8H8#qDXF<2&>f0#EbN27rg6wGC^`A2y({%@2OPEatH$>tyD&G^4jRyaYy zTqc`;k~d5D8#qD1Tqc`;nm6PBMp+$bM}oObHvcSdmhLwW3Uirk{(0Uk-ESNm<}%s* zi=?^P8j_y7FEKODDP^+xmjbhLfxa}%WwQBKNpnw2y3{oe33Hij{&mva+ZvXhyAL%p z){QdR{F}U4IU0?_!dxbsf15W;&)tWIxlA_yE^n3&^buh$lg+=+o2BROBg0%KoBxnE zOV8b-VJ?%+f6SYu=kDcUE|blF%A2Lu*N&CS-Z^xS=!nQ`telg)n-n3W6k zW5Zk~oBx_L_q3$TMq@n8WwQBiNpo*&M0)O?Ff-2GWwQD2d9!jf8Y{wFCY%3}H%rgm zcrP&eTqc|UnKw(%-7CXfCY%42H%lLclVL8C&Hv7urRVOW!(1kt|C2XM&)uuSTqc|E z&6}m??x`@B$>#f#=4NX|dhWj5%s6+K$>#e7X5|8XMVQNEb7NtnG5d29@%k_n*2nq2 zCa|X^eF!%22|(y`nQUH=H21caNYCAPKOcHlCYyWmX60x!@IG;v%VcwJ-Yh+Lx58W| zo11yF^xS<+n9F2yU*0S|cTb18Og8uD&C-RV9p*CGyfAN;p1V6?E|blR@@DC|dtI2z zWb@*rx!GDGJ$GMeW}H*XWb;M>vvPrcT$syb^TtVYPfI$^jbp=HCYv`&ntNMIrRVPT zX2yB2Og3+tH!DY@u_4T5viU)Iv-I43T$syb^JaOo^xXZ(Fqg^Z>mIx%*LJE|bk$ z7%Y`|)PRxw}j@ZzC`( z7wD_PTqc_zoHX~eq@&T833Hijen`^X+gc_)cb{lxoV&|p^R{`jax@wzg}F>NZOV8b>g}F>N@02%7&)uhoxlA_i zoHt7s=rh7xCYyIjnwza<(sTC{%#3q)nQY!wU{)^BPYiRJY~C$x*8be3cg1X!$>!aY z=0&Zs(V5nI*?b(bpgS97vUv}YSv4PrhPg~O?ZPxxwu6LRjd(kr4ym#7c4??>SRlUOw1ap~e-Y049Y2k{zuHJ2jg1JmK z@0&FDw%WKHD66gPNSNm`*}Pxcto`iS_n8-cE|bj<%bQh8vq>9`_t-C(%VhKZNpnBW zfwE5}ZZxKCeO_c{B+7I1?(b)BA6{X$mm19bd-MxoUO6>Bd%SG6!;D0ElKBxyv-er} z(ZsDVBT=4YK0sntow*y0W5SF?d6IcRU>+3C^RZz@qCCkwm^5Ra2Zi&zKFmmzCz*$m zX3X=TaGpD1Mxs2)JS;Km=6PM1ktk0xj|j{|!g+pVn2{(?GA~J*G0#K7d45!wktk0x zFHM>;&qKm_-VkOa%9G5?Bxc<_9~WjM%9G3o3e3a8c|IY`NR%g;4@#Ob&%?rbo(VG& zJ*o2SFe6c(WIj@0ULu_5)5DBJd6IcFX~sM+ z5zg}&VMd}n$-F#i#yl?(&hx2ZMxs2)JSH*g=J~WRBT=4Y9v7IG3g`JTVMd}n$vlxX zW1g1^=lSd~BT=4YUXe6oo|g*e`OGjQQJ!QzN@CW{^I2g=qCCmGQea*toaghxj6`{o zc`|9nJTDW@^Z8*$qCClbbkdA@UM8I9bHa>7d6IdR#H^d=bHj{8d6Ic5X>MAd@t${8 ztqwC1RnDM=V`M$5s&8ymU)c^gDYr>2~c~YO( zR+#Ht=kG(Gr@O~j+^!09ncU}Ag}F|jvDU2^*Qt*VbD3;DCTT{WCs!ys+&#u*n9F4I zbkf}0+AyFKHyZD^gW><@GWmOL?Yvp~{lWK!xlA^9lIFhFOnbdh{aiESd&gz6d7Z*M zWOpK}7uj)OE|bm2Ce6Lm%MTQB{V+eVTg-Er+tVGaPnvtC$LWZV&R-W`}~gOg29n>R=wginvhV43_Fe00*>*B)$lgzNK-*5k$Y3yJb1^a&N_ zT6@v<(DHS{J<`4AY}&6fiQJf}Fk_zPyXWs~4@qCh_~$T}$>tODX6c#mpJv8vAW@!# zKB>Z7b2g-BmA{)4W+cj!%qJ(!&GwM=tnzPj!i+?DlKGUR+2*+|d%?CD|6;#jMxs2) ze5%4MTPcok-Fn30}$5-6`)eZtP66Hze)AQzzatHknbHa>7d6M~zq}d*W zoyqRuCAa^wqri+rd6N0eyjl0dG|l)*`-RtwB2k`XJ}YVNYY$7$-5c8;3Fq!Iu`ey_ zF%{-|=k8(YxqCsF%VhJ}d9(D~z0k~u-u=L#B7iJ{Nlg#HP&CT|( z^xVBT%t(|cna@j_?J+1lclU%DiSi`#`3ke}+}#W_66Hze3j}86xw|*aNR%g;FU*^z z=kES6BT=4Yz9?z7$Ds7wy(r8`lqZ=l&YPv@?pMHRzmOfR+#IZyGNww?oGp7CYvwIo2BROtzw>$C{LP=$5xo@ox4Y*=k6`Sj6`{o`SPT> z*&dOeySE8566HzeE0Sh=3`)=44+=99=k6`Tj6`{o`KqMZ9)r?z_ts%XqCCm`guGdL?tZyBaqdQIzB$# zJ-*`h4|WioyUQeUs{Ixbi!MzYlYnY`!LGZnmXcq{eTwX&{Fn)_fL zD36%?{qO9bV>Zg}nirdS#vXpPyM_uG43q=XPgwTGM9#90<(w|JUb2JgdT7 zug~i?Os?t3UYh$W^P zD9mND`MF8+g5?_P>{0N2Hkiv~^YfDC#mm>VXWFfaiSgNc&E>1YTqc{JpENhe24s&v z{MUXZ&V$I=KR4(+_<{;^opqx*HYhcJIm}3uCz)TEHV;Y7UkWo4+gWR+#JT>$+yuj=#~k zIm~6U`Be(@psvp!4|ADpeznA`>+?s$Tqc`eqc9KY`g~iM%VhIwC1zcpZwYgmY<``> zJgn>UC&FANn_n+6>-v0an9F4I8x&^Y3(a2^<}%s*Mu}PX_NCW_xlA^{Nn+ML@qSyF z%VhJLCFWtlS-X3P_l3DkHorw-UNaywztYT$>}W`oC+(5mT4Ap99M<<6YjpGc#xNsM zo@9QT#H^d=cZL~>@+9-yC1%|`e=y8QlqZ?rp)j`wx_2PBeMOj&C{HrKQ)1T5^Bcm9 zM0t|=T@tfyp5GB>B+8S_@0OT#^ZbD@BT=4YeoxZewC}CinTnNpo{-a$NUp&_0vJ%-D+} zQJ%Cuf26`(XD`|}wyHfLM8DabFe6c(WWFhB?imw;&G?d-jWT&QZmuxbIj8iGO|2TA zJl1=nxOs~m1bs%LJgLtgtuWV_jfG=V(=+SGMXxGoH1>>nMxs2)d`r^2Xl(WP%!<)T z)r4FgW+cj!%(o`Z&9T*MMc+1d;|tA-b4r;!&mXHW*PG|nt+8p{F6o*um&xXjOU$}m z5`Xlqb#eCo0T!)(x1I-?+Li%t(|cnQs@E*G_bg zueg0`n2{(?GT)Ij_gkNZF9~csEzC%iCzNN1&-^->yOZV~-N$sg@i}J2`JqhS^WRfpu5(W589UDJOLeoc9SHYdCcifR zlSy;`_+)#@YZYm&xbu&s3P}%yZMsx*bxZf!T$*Og4WuX|_Hqm%7H*VJ?%+pG%sp&r`}i!-qbX z$>z@|&DQ6(-G!|1IgBuu$>uL4%{>#NGA|DFZu^DDQ<-f3V$$54us0##&P4TII}Xfc zviVC%bKk`1h85EyupQ>L_6vI?B+8T4=Py^7Yn@Xj#+FZZ4==g>L7Y>NC{HqfC28)P z(0+5`wP8l0Jjwi3g;}`Ry*128lqZ?LrZDTCb~oM|W+cj!%wJcSh2NaGDa=TeCz-#I zH1|$uFZ91S%t(|cnZKDd+hcI8@a0I2mxmdN@+9-O6lURL@bzIvqCCm`ZG~C*7<_w} zktk0xe@9^!J_g?(W+cj!%->C#n-eR>mFK~4g&B$RB=h&u=BZ=HyN8$DzQ>M&JyMyx zNBVw+xz=;5iPddopND(8dn6>vlluIF3Uj?Z(wY^@K7S)-1Bvn^^AD5ezKJ!HL&6R8 zK=c`j@+9+*@@D&~FWuuSZoeOWMxs2){Ntp#e`1aDTWyU!!i+?DlKCe|b8}*PgYq$W zNX!NjgEikVYnhy&z66Hze-z3ew6PvKoCKHp?cn2{(?GXEiOmafkq zF(=GOlqZ@0m^AlIbfg!cKOOrzB+8S_e@dF06CLTk?$B84kSI?w|2b*yozVWw#1EMh z>sFb(Zv3UfTyL%0AiRoXuip=InQZ=R-Yi|~er9Go29YRFnvK6znCq=|8>DO9Pt6H4 z66Hzezvs=;weBb8gc*tQB=bL#=KhHdo#|2C6YrOq6J{jJlg$52ntP=0PH8kYH7C}9 zGV%TTvi?Dcc<8Af!m$n{>x;NZZz#u?uzc=CAZ%VGZN)V=6eO^wcW!@Zod;|B+8S__a)5>?FCdT zrY2?VZ-yC(@+9;9NptT}+J)me=EPcuM0t`Ke_{5sTzBvOwMLzJHuGToGf6z#jsi0h zjAMBMWQ^(+>#Z?$ls2H8Hw^F zb2DkiY)lJ(MC{RFMxs2)+?O;jGIM)sRQA#FE5nRLd6Kz5X~sOar*!jtP?(V@Pcko* zn051fM3|8%Pckn`nlaBE;XF@<8Hw^F^WvnrZ*o-n{*+7O+>Jzel6j+~d9j&i@Z%d+ zcJCv5dyZL~c91gpdH2Q@<~n=+|C&Xw&OJBGWwLpbqzNn`?%qZE_JS}YQJ!SpQeo~)Paf61i}dZq zX2tqkCeQO$73SLO^ZMz@j%c1Qj6Ne#p48{9E6jD~xmP&LFh0+I8Od|@&-}i&ZIb4N zW>&sXX0PZo66HyKesI#!dxbsx67NQ-%t6lnK2t>ZcBaMK56c^AKak)MDyR8&q)5Wxj@CAdEMBd z!dz#qgIW2B=D#r_%t(|cts6TE%*szR|Ft<`Mxs2)yi?M=(E4m2bt1c#`(txrp3CHU z-nqhDXRWi@I9B=1iLb>u1&Q*cKJQXtt~1ZpXP9Muz9Gy=lqZ>YO`7}6th>tJXnZ}) zNR%g;cT1XkCR^Qui*9eT<6xf4Idn9F4IzDe^!^jUa~ z@$q3Ulg;}j&E99>HO41|xlA@cENNbZJ`1lgUJ>Rp*}T8PEWD0%RhY|U^TU(o-bw9i zw*PI9VyppW@^jcnQtE9#^DSxCajKO#7{o8c38Uol^!X%yrI# z&DEpQ;dqtJGt5YoCz%HYX610aDa=TeCz*!?X5|L@U13I|JjpyPFe_i=`k^o*QJ!QT zNt*jtw@1fT>E2YcEWY23M0t{ViNq{>+TA!X%t(|cnV06x_R}ek>)wIjc1f6#C{Hpk zOPZVZ_HO0+yfn;6lqZ=F%$sFDHyFmjFe7LG%-2N^%9~X`ZrqKh#kzq+c~YMbPMUky zXuqNIrnQT5XZ&q$a z8_U96CYwj|X6072abTFsWb^X8S-BN$92Dj<**umvOW$vGaG1+v^LXC8#O_8`huD$u z7%Y>`6L~Wp;<7r_js$a=Y+jK!;~_4q!|X^fm&xX%lICV>K>4w1jlIl^b4r)wXP$z23qTi<7Iz)g&hE9B+8S_ ztCHrPmU1#0jh)Sjc`lP@W2(Z8$L)OIr`g*Yl zrF*0!!(1kt*XGUAJ<@2H%VcvaZF%o@CyTH1}v<_SM+MoS5e_c{Yx#Fk^k3{~l>bx<^`J zca8fmlg*FJo0Sj22HxiabD3;@RNgGzBdrW`nQT5jZM)nd=97}3By3Wi-Y9LXbwBIJMvviNt z3UirkJ}YmQ4)if$E|blV$(yBnr0Fo1$>y{3X6YWO9p*CGd`{jh-6M6vTqc{(&6}lr zBz&I(>qePuJ}+r*wuYs9q=%Uo=ae$pe7?Y}T%h+4bD3v#TwGzUw?`ToKtEJ4Wf*VJ?%+m*>sW zJ<_AXTqc{Z$eX2mq~pU}CY!I!o27fCM~AsgHa{+DZnj3Gd!&b(8RwKT+5C8cS-C(z zBFts7`KqM3uQejwBR$#7Mrt5Yp0wY1LWQ~B9%)3nN4myiz&C)&6sbMaY&DZD6(mm2?VJ?%+ zPfePettHYu(g9}1Ii*ZCKTTj(F3>nZ!CWSrpPn@LwU$WtNKY}Zks3&pC+#|iVm8X;*?2~Ux!xXWDMn9Lr`wTm|7EiInR&DF zA=o%0%w@9qS$VT`k9203%VhJj^JeKD>8vo9$>!(e&C)&6W5Qe}o1dFEOZP};hq+8P zKQC{VE_UaHxlA@cKW~=qktX& z&3&z<(mm4k<~33SiSnfV#)~V=_4Y_hrF*0&niFOu%9G45Nt%0F(uZJUPjg~6%H-L2 zX@$Ao9%-3$k93}SasOqq`DJ;t@*&tbKg?ya`Q>@DbdPjFn9F4IEAnRP9_hj`m&xW= z=FQSQ(nVn|lg+Qno27fCi^E(dn_rzbOZP~Zgt<&Mzb0>%F3^{TxlA^{Hfe6QmPz+W zctGQvQYM>UCon4)Xgr`{E|bl#Pn!E$%cOgxr<&JD4J68w_8V`ozmWMEpf(%QJ<`?Y zgc*st8aHHqW7<4AK8E9p>JB>&_8VpLY`m$$TxXBe*D~`;5!ep%Rr`fLBT=5z=QmfF z>+GKwwZ=wgTI*$N$L$NckHIpz&u^(P*Xi@DS+#cD5#}=4{8o`!wYj@9%w@9qZ6Y(y z0gAdS%w@9q?MZX9rTnQLjmBr}Kio*3=mGxBYu!64%yk}veK4=Yfi?AAI}FT7lqanl z?@XGl&uiCo4==gB!H&|jUuE)aysN@oXWi&&jZ3Vv2YIgj27N}NJgLv`t}xe`jb_V! zKy3H$lG{()QD8=*Jjwi?q`42~mEGejZogv(ffhlLH%yrg{-qzX`-J@%6pJj)E8Hw^F^M{h=X3I9C-NQ?6KVe6~|IcOeY<#%F zTyHkayi&sTgM8U;(Pt#elluIT3Ui&=us*L}-95bI_VacWn2{(?GT)Rm_rttGw{m>W zoG>F%o@Bl`X&C4W<~r*}Z>z0(Du|9YzG%PDXC%s#`uwp9bG>z=J+!iWc**UL>?klJ zQJ!S}c+zZrR+1ZEGbhYQlqZ>QOPZUlc5AYGc**S->?klJQJ!S}MAF;`^UCh=6}LaM zgTRbLd6N0|q}gU;efQ{^+l}lncn(`8uN!w%nCq<@(jN!ZxW~M>|1#NpXVTnkbp}@2 zeW>c2b|51)kSI@@jk_w$b=JDxR!4Pt(T#W6E&5z0_xbJ$bDi0+J`XDU{B`r9&q$Of z_4%F(bDcgnh1Z^8e9eNc89DoB-fw&|Y3_$v_LC_ajX#DNiSndAe=2ES2=mG**#`Pg zVMd}n$^7Z0+50Sf82&oUNR%g;Ka(_jpM?*@--H>7@+9+THRh@AJ>+kH8)hWRlgyt> zn!B^1+d}^?%t(|cnLnR2cV|Plh5mh*ktk0xe?eoG&Bh`fif%F*jrW8ZiSi`#x07bf^N{eIvY@B?+zN^EB=dKY zX3X=D@SM^UW+cj!%->C#z0bmP%D-bakSI?we=lkFJ`2w&{|Pe^Z)(xZ=lFUC&nsH7U zj>9YBBhhCh%9G4LNt!Xw!@_gQ;^;FHO|m zj6`{o`R7Tq_gQ#OX@(hz@+9*wG-lbl(HCYU%9G5$Oq#p1p*yGahZ%|TB=fJ5=I(6h z&M6DSj6`{o`PUk=Y&I5!8Hw^F^KX)7%*KdtecmF>NR%g;f15O8Hb#W&^Oj*oqCCm` zyQJCsEL@*A4l@$vN#@@t&E99>`n*Y)ktk0x|3PDxJq9-oGZN)V=07IQ-PzEs&kqVS z66HzeKPAoG+0d=en}r#P@+9-0HD=jtY#wGL%9G50Nt!VmON8t5c40=MJjwjmq#3iZ zM7Tb0A7&)Vlgxihn!V4$^?9o>BT=4Y{(I8weHO0ITZb8m@+9*=G-lajaGNkAQJ!S} zXVToA4c+?u;4mXmo@D-4(%hX5-TM5HFe6c(Wd66tESrsO!;D0ElKDSLGiGC{aDCn_ z%t(|cneR=SF&j&T>+|kmMxs2)d|%S+eHO0IJA@gD@+9;9NwfD^xIXU~W+cj!%#Fpl z_x^`j_88nL%t(|cnHMC@-PzEs&pU@1iSi_KPtx4&vu=IfCCo^aCz*RSX4!1)8fGNQ zlg!Pe8MCoWxIXV2W+cj!%za5SW@DLfecmt3NR%g;`;%txvv7UhBg{yYCz%%}&E99> z`n+eDktk0xFVdK0kHNjdj6`{od2!O*oekak{LnBXQJ!SpC~5A_hHib{JIqLwCz&_a zm}RrEPneM?PcmC{HqPo-})(Wskr{<7Z(; zqCCmGg~B}DJ-*`hduGKvm&xCn z{@;JSnf(#7QRa64_pdZ|&6|a*hQ0P7%w@89x1_m$y4_JeAAG%;vDTHz>&EU$b8~uw zax2``H^bMEeI54JnP_4(!I#CZ^j@+9+~Y4gzXb;3RWA+~N{Hp=AL z*sH=^>pa*Vl73j{P?*bP^F#Ay>6!3AGh;T8C{LP=y(`T1=6PsZc_v&MW+cj!%=;wG z&GwM=On7jZktk0x@0&FDwTIfW53DxhaF~%OPcrYPFbmhZC1FOQJjwhpfw?1mb~O@a zB+8S_`{&Ia3Q(TFe6c(WFAVIo9$ug zd2l?;NR%g;hm&S|3`);~hlLr5@+9+!!Yn)w9ua0F%9G4X1ZL%V@bEArQJ!R8nm0?& zgQH3MLiS#cgLlg}v!Rha9Y2S=pm!4+XH zlg$U`&C>JWRLlkv(~NQJrHd2mE}9y~hCNR%g;4^5hz?GfpDa7~zzC{HpUmNeUA zPI6AJpUUy8G%VhI-(%fuI zw;PSYFqg^ZiL_a|-DvC+<}%s5B5Ce#PmPYPnpBLkA7e#)KLv^Mq{rY<73MnojjnlZ z_YMTNM}--Q@+9-hym|S$_Ho@i5ZoRaW+cj!%#%rTUwg{FL)bmO;`Z<`BT=4YK00ac zmF|%2eG>K<#9CV>f4_TGg}Ki9Y-Z{Aj`s_5nQWfQn}xf&M&n^&E|blxljdf7_1bZt zJk8CGb{KrG4TwA7=J8SC`g~@X%VhI((%fvflv~lpDQ3nzBT=3- z&+Q6xoyVY=rLQ@e2{RJqN#;({+~01sJHp{O!K`=;mdUfRuEJdBG1zRkCw1>mX*5ob zJ|j_{)aPR>%ynj?&$_G}j?vg7AyJ-WUY|5?G&5r_{5o*O%*vVWog{D3UOWb)&D|vP zhNRj0yjI!g@#r%W_J$dW@+9*~ zNppW^P`YmX!kl;vB2k`XJ~?Ub>kLZQjTf2|W+cj!%%|kd(skoLbHa>7d6N0mqhohN%ypg* zTAzhik?iy8qR(Y=pUDC(KBc zCz;R9o2BQ$mzWb~B+8S_=OxYkonh%(w?&*&kSI?wpPw}Mc7|7WkFL4hIv#^%@?-FV z3Ui&uV6!tUUF&{t|LK?wB+8Ted|`#T&STK}EM4oii9VOfeZHu|T&K@wmacUVig`w& zJgLtYSD5Scxvw)UUF$XvGZN)V=1cNs=~}m0n2{(?GGCfB_jg95Yu%<{Mxs2)d|A@m z+mU|6LSsv_VqaG#KL#ILVXpHSY<5PZYu)e6i?t4k@}xdrUSY2D7_>f1*Sf8u&t-C- zuc$EB>9d)oYu!dM&q$Of_4&#QbDci-bw)bFtGmZn+%Aqjm&tv8T!pz#pUo^?pErp< zBT=5z=f_u=YxY^XK5ramB+8S_S0&9oozd>WMYj*O8c6EfLrb z^NZ*+66HyKeqx2W&TRB|VAgG+e;H;Z%9G4jOU$|@`d48_qCClbP14*eeZ_X8@o=+Z zHp}GKP+ePLt~1Zgj`lUKe>N{3gJtq#@VcbAx3glv?m||7vm>ErWpbaNls5~nirUY< z4s)4oesbEpQrhQ*HqV%iGI=(hk~d5HyeQ0NvibVFS@@k}`#kwL}&C+#ayD*o@=4U6(&5ri9@&BhMTNP}V{q~M@y?80{_2RntFoI} z(dRO`&#$a7*Xi>jm{&}Vs+Nx3qt8f`C-wPN73Mm9?pwdAqx_jKyF{PM{)m%!&0GiSi`#>yqY; z#%ETZb;g;KGp&K{og{CMi9RDyo@Bo7{`>Er{k2E;uQl-3XWzFFU#g6I?cYA=0rSl0 zRDQ7c2{RJqN#-{ceJ;%o@BXtnZ()9*&zddiv0+A{JjwjVIn4F@JSgcizW0N9Mxs2) z{H8g~_4}-OR`{qeBT=4Ye)AmW`h6af^ckNCjy@w%o@9Q@9On9c);yCvG0aGmCz;Ahb4Vp7G@;Mlgw|M!(6}5n#*>lg&B$RB=g(nFxT(%h@{W>Y+uYX66Hzecg$g~ z-{&RWJ4xO?Cd^2bCz;Amq_|N8fGNQlg#g$!(6}5nkTX6hZ%|TB=fuHFxT(% zQc0ij8J(DCB+8S_@0r6~zt79McaprlB+N*ZCz;Amr44(D$GcfCz;R_!$D2Xa89O zvq|P#<}laqvu6K%c9@YUPcq*+hq->AHT&n~VMd}n$^5Z7%=P=M**{+pW+cj!%pae_ zT))qn{WCrb9P{j-2|k--zHJV3{XT2<&zFW7iSi`#C+0BM@3UtAjL+jopOGj}GT%Oj zxkjJYUU1rZR8^Vl4d6N0A zIn4F@tl2-~b)uMOB+8S_ch6z2-)GJK`O#rUqCClb&m89Zeb(%sN5YImd6M~)bC~P* zS+jpWIm}3uCz(Grhq->AHT!4$OgYT6|7^M0B=e`|FxT(1X8(Lfn2{(?GJj?cbNxPR z_Roih8Hw^F^JnKU*YC4t|9noEktk0xe{K$Q{XT2<&tqXmqCCm``8mw>`>feNUl?X2 z%9G4rn8RGZ&zk-7$}l5Qo@D;w9On9c*6g1z3o{bsN#-xjVXoh2&Hj0Hn2{(?GJkmv z^L+cf2s>xHjN9qnMfw)I7MxRNcQ2k~{z}rkxNBa!Vnv$k2iPynNR%g;znU~hpVzMG z-bMO$cRK?5j6`{o`D;mY^m%&X*zSE~Zx6Nuz>GwBlKJaNv-jDy`>J`yvmKacpY?c> z`5Q^I_jzzeHqZNp8Hw^F^EZ>`=(B8|cQYsYj6`{o`CCbI^jS8~2bmLQB+8S_-%gsn z&-S!RHO~X)gc*tQB=dKYX7BTmZl3osC(KBcCz-#SG)JFh^SrA$VMd~M#SNLimo!J8 zW%GQX5n)E6Jjwk1q}lsyPhVB@e1JJ&Mxs2){DY*~`#h|h=e^AdGZN)V<{u`_(P!B_ z?_y4vktk0x|0rpWKFj7A&m3T$eFou4<{u}`-euLmd!K1Gm1XXeuvbP%zsXr(dR+o^=CXTV4i(^c#`=qNi+Iv zX4&;RyaN$tB+8S_e@&XB&$4+QHz&+UlqZ@0mNZA7W%GQzIblYkJjwj`q}lr{y#Cxa zC(KBcCz=0|G<%F%o@CxAX^uY2 z=6St2VMd}n$-HsW?0ptqf5z*_U`C=m$-GI@?0ptqf5yx7U`C=m$-HUO9DSC}^Wo-% z8Hw^F^MjJ+=(B8|@iIM_ktk0xZeHLDSo-ilONR%g; zw@8|!&$4+w%$zVIQJ!SpGHH%J%jS8VIblYkJjuLO(u_V239mn2YEGDuC{HqPoiwA* zW|m!lKG&QuBT=4Y-X>{|KFj9$G;_j?M0t|=!AW!USvJpCnGPcrY3G<%(6JI6J{jJ zlgxW1&CzGsJfCDvn2{(?GCwqFjy}ug`3iHwj6`{odGDmz`z*Zve1SP(Mxs2)yid~X zeHLDSKGU2qBT=4Y-ZyEEKFj9$M03K7M4gBmGVhl(N1tW$e7O-}Mxs2){II0i`z*Zv ze7-qhMxs2)ynoW{eHLDSKEs?aBT=4Yet6OxeU{Dhj5%ROqCCm`h@?6CESu-YniFOu z%9G3oB+cGu;q~Y9%n36R(9?JC(KBcCz+Qd&CzGs zJYR24n2{(?GA~V8v-eqe{rS1(gc*tQB=gFo+50TK{`_=v!i+?Dl6f*|jy}ug z`C4%d!L2ZpFeC)n2{(?GH*zlz0bny&+j%T%t(|cnU71FqtCK=ezQ4YMxs2) z{K%v^`YfC0kDC)_BX797``tyg32s0ApN#^5|X797``t!TY2{RJqN#;i< z&CzGsJip1DFe6c(WIiEjjy}ug`D5mU8Hw^F^Gwq0eHLDS{-8NwMxs2)d}7k7d6M~}q&fO5o9CO%2{RJqN#=`_X7qW9@cQ$&%n36RF%o@Bl_2(~`6J{jJlgw8o&CzGsJl|tZn2{(?GCv_{ zjy}ug`3L5N8HxG7d6M~>q&fO5 zo9DaD2{RJqN#<*l=IFC*p1*HSn2{(?GGCW8d!L2ZpTA~Kn2{(?GCwJ4_C5=*KYz}g zFe6c(WPWne9DSC}^IhhI8Hw^F^HY-M=(B8|zh_REktk0xU!OF4pM}?-ziLjHktk0x zKQ(FgJ`1luf7YBZBT=4Yep=ETeU{Dho#uoYiSi`#)05`tvuvKfYfhMvC{HrqkTiRr zh1Z|IVosQmC{Hrqm^6Ezh1Z`yV@{ZnC{Hp!BWaF4%jWqGbHa>7d6M~=NptjBHqYNN zC(KBcCz+p>G<%PclC{Y4$z~uRnjF%o@9Pb(j0x3&GYT%gc*tQ zB=d8V=IFC*p1*BQn2{(?GCwbAMxU1ouRs6WoG>F%o@9Q0(u_WvS$6&T&*p>~iSi`# z3zFvOvuvJ!ZBCexC{HrKFlmlH%jUUvLD!5#d6M}>NwfD^c>Vcb=0u;7C{HrKIBE7i z3$H)_$(%4FQJ!ReNzxpBmd*38%n36R(75QC(KBcCz)T7G)JFh^ZZM5!i+?DlKGWMbM#p@&kJInktk0x zzba|=J`1lu|HGW7d6N0fNwfD^c>Vcz z=7brE@+9+HlIG~MY@UB+PMDD>PcpwXX^uY2=J`Hz!i+?DlKE{(v-eqe{rRuvgc*tQ zB=g&oX797``txti2{RJqN#=JX&CzGsJpa_3Fe6c(WPWGT9DSC}^S$PT8Hw^F^ShE} z@3Zjw^IyyfGZN)V=65H}-e=+U=iitUW+cj!%qtCK={)stZMxs2){NAKF`YfC0 z|CkeIB+8S_?@OA|=Vij{&pXDRABplL^ZS!#^x4d^>(5(<8Hw^F^9PdV=(B8|HwiNm zJjwi#q&fO5 zo9B(gj6`{o`KF{f`YfC0J;IDcd6N0&q}lr{y#Bm>n2{(?GJiB__C5=*KW`akB+8S_ zw zVMd}n$$VSV9DSC}^WrcgQJ!S}MA966md*2SVMd}n$$Wd#?0ptqf8I9CNR%g;??{@x z&%*1^n}->R@+9+}NptjBHqVQ~j6`{o`L3in`YfC0UBiq-d6N0=q}lr{y#D--vMzVEwmcTQ){bKvpkgT)y{Fpcx)oX(u*z~j$L#2G{| zjq~T7&XVV_dTtSC5WzIgUvN50p2O<-XmJJ+Oym4Tr!(g{@c8pV;tV2~#`#N5XU=or z@#n?j3?i7u`O8jc$#YmeH;XffU>fJIIGrWWVfB2JID-hLasH~)c|lKga%$7SNVU|O zuEe=4i8F{`8t1Rg;>_1ur7xRxdH22d-n(SRx!N^2IO}t3{l!V*3?i7u`RlVdC-R!~ zmHA6J&*Zr+|49XZx<;Hq1k*TwV;1M)d8Pxp0eL=MoIwQBIDc~%=i+&8PgmkxUM|ic zf@z$;HH&lcJkx>3fIPQ}Gl*as=WoyATs+Sm=}Mf-syKrPrg8qxEY8LAOb5UM^1NJ} zK?Kt{e|Hw=;(6{&SK?f55@!&>G|u0f#kqK%>A*}tp3fC$5WzIg-=D>~c%GM~D{(Hj zi8F{`8s{I(;#@q>big1W&lia^h+rD$AI{=jJkQJ1l{l9>#Ti5}jq{IYaW0-`+K~;& zbFVmq2&QrV@hr~8^SmNmiE}wA&LDzmoPRQlbMZXW4pu;(FA--D!8Fc4oyEDgld_j|^8vRilo(IIa(8P3!zCr}JDmkM@=wntQzz=hon?X`O%Vbe<>9 z{=L^!9p|^a-ukETIWASIJd>+`3!N^w9bDHagNI~jwzxxG_CVrBAnaf@_eQ^Yg*^OhB(LN z`DAg{w9bEva2{$6>o;)SB5Fg^I{!VyIc^}twZm}Mw9fwsac&RG^9katX`TP+bZ+YI z?u)C8^qf5QIdE=18Ljhw{LW$L zGf@J#b{N~Brmg2Yoz4y2eOOgk;QD>!SJUSCF1K^s7>GX{*Wn`1nl{gOyPf04KsX;G z&YITw9;fr%?!nd7o`K7-zKD1tHG({ATIYM6&Q0AzBRvta(#BHBv!-=U7Selre`-{ zQXS7DZxF#W$NA^xIOFLB&H-i4A?JXeEzTf<+K9PM<}Kn3BACW`QJ8aQ zx)SH|o#G54n8tZ=m~+ha8}Acm5WzIgOTwIEu7&upID-hLao#7)Ip(^8Plz*!U>fIr zW1L5$#=)0~Gl*as=lz_{bd4*HIme8H9}#B|!8Fc?g*nHJgP#;<5WzIg zhx?sJc8~9*Pw#0>SK?g0T%17!(>NdDbf*3}a}F5?pDWHFf@z$OoW;37|18cie4#jl2&Qp9dKTy6d5#$e-zd%?f@z!|FpG1od8TntY9nSG ze499f2&Qpf8s;1`4!&EQK?Kt{9~0&rGY)=0oIwQBI3FA495W7nRGdKs(>Na&<{UE) zeoCA{1k*Sl?{^M;&*MwP8ALFR^9fF8>Yp>`ka6%?;tV2~#`(lqoD1~N;v6#$zEYe) z1k*U5G>dbs{qszoW5&Vfi!+E|8t0Q|aW0>0!<>zaD$jT3l&P~1-KVEvlbxz+7F zcv<8%C%1{Srgd&}Iyc0)h^iZtN|`41jE$B(EjTryGc1nr*Nn$GOP+ z+Q>O(08AB=R}tY1BACXx)9)NJ0H%t`D~WIh5lrK}%<0_JTP_Wx&4(;sL#@CWL@ za;I}+Z>2SDJ!biAY6g9srrictcOyhix-#N73csY5(8ALFR^SN&4b)nnfbI23hlcufb^KzW= znp)>bjlJtax4~zLv!-=E-|5`ayRI_YHH5!1ByOQrP#YkEX=>ww9Ook2U_)hpZ zo{Kzp4~0$p@wtF-*0j#6oX%Vuf$#l4M4UCPbGOrZ9`fANRq67VGPkh5IBQzxo(Sj4 z=)lE6&IgOLrgiRhIyVgT2HB>~JdJ>Q*0j!jPUpsf-q5l8UF3_tR?}Y3f3e>=bnJeI zIBQzxe!p|*{Q0HijM~t&wK3pyZWU0~=6=zNBJmhq494LiugRd87P3t`Db`ISH zlXsIdwn0tX*Nym{BR9e1o#L!%ol8#VmL01GD%H55@D}Pf=8-puV49BO(i~?zy+K~X zFPvq8&-+T9<5K-daRw1g<2)MT95t&;l1GU%h+rD$veP;G^XqOGXAr?O&Xrl5YdyZv zFmhSic+e92*yuMjabL%p9A~_yR_8e--J1VC`UtFF(>h<~bZ!W`PBi;#m(m@K-I{hx zS?hFeEVZ`MD#GFzY6*GPw9f1N&T$wJaZIrNzM3F542ov-ve$6Rbeu80%qhHX&OI$z~?UXFD|#Yxlhn3&P}D(z)#LflC9*6F-6llUlZUQ*+Fj;XHDxo=5$^_?;G5>Yv<|4vbMvSf5WzI_x(zwbczUhZ1U3Y{Z;%CPaSGi~8=5xH8*`ko4b(cXYb>>e&Noh_ zRb%~{)_IfPIkKFS)5KZRI*P@H>YV2L@F*Yg*?? zzjNpu34LQ+2X8eop10vht84C z5ob;7e52F3sni}i-`Gyh7*jN@^GyNHksb67an`iX4{|y$D7A;qHy$tZ4G_UJ^NpKx zoQupi7G=)6cTG&Ct8p!#AkH9yX`CPIbZ!XxjG@$!zHgB3pq@2tZ9F8$8GU-~$B{Zh z=Sb(#s-LQ1>&q}ogeOZ4xJ-iD9)PJ`4N8S&^gjY z;;d<%AL(}vog;OLv!->v#qS(CN5WT6q2JK7&X4jtht83@#aYujKicWsRO$$wBjKzJ z#uQEK{Fnge$PRj!IBQzx$2y%ClsZD^NKcaa28dvq`NrdNobmKp&s#0ZoP*{_PZ4Jj z!8Fc~cRDweLc8arhdfcwnzlBckmFozj?@`CN9rYCtY6bQKhf_Txd|pXlnrN1>wK%< zIdqPMD$Pp@^3)KCiTHj*J)H)=!E=J}a9&KQSkKPIy*biOf6tH$~@t@E?| z&XMJujEJ+Qb$+(rIdr~J5@${8{2ae?=zQZ+an`iX&-FWp&NoKIS<^Z{&+i=Cag@bb z(>g!j?;JYcsED(sb$)^0Ids0UMw~UR^Bqp-rqZ&|`Njk}V@%Ps&Mypbj_jZ(#aYuj zzsTvlptLM>zHyt(H$Vi_%r{<~<6LaM5xNN`mysuGL(}H@B{|N;<{QgH=NoIu7wgxw z&M);lN0xK4PMkHZ^UM6s?X;S(SWhh>&zjcx<$mXmFkx!wa&gwQ&ad!0ht4;y5NA#6 z{7S!b=zQZ!an`iXukt&Gc6L{Zv!-=^wcj~(zHzlUYg*^mIGvkH%R}cIQ{;>>MbkRJ zHo!TugWe;~n%4PsPUnVFXlW!>an`iXuXj2(mR5w0-Pe#a#uQEK{06^sWN9R0;;d<% z-{^M^9lJM(v!-=^lixXX?A|EOn%4Qve&^7!dy_b8TIaX;okPd&adFnP&TsWQhmPHw z#aYujzs>I)+Cgs-XHDz;cBgYwX+`MReLXp2?AEl-?+9>??4WNDXHDz;PPcRH=kvcn zYD3dHzsu=7uhiXDEv*f!k5lMC1!_anI=?%}IjTNR6=zNB{GK4^r~&*man`iX?{zvi zmFNRe>3 zqjb5QJH%PjI)BjV+*m5Fjg&rs8bdv6TIUbBont>I@Wqm6P3!z&zjIXA%>S+zinFG5 z{)p4Lg~q`4?onP}#G;S-XMAP|h+vxI{2$G6Zo!k~HMl!l@aF`=Iq)kdE)r)D!8Fbv zb2`sWopEVdNOXxah+rD$kHfI7#W;u6Mz1)72&QrVw9^^2(Gl3!4T&>|U>fJoL^ucbbr*{>h+rD$ z&pMq^&mEPvuzKznXAr?O&Yz2M4y)$@aRw1g3OT`&PFpcxqoz7`(#PxNf;tV2~ z#`zmD&SAAt7H1H_G|u02I-@q01@?7Uh%<;_8s~3CI0yE1Ys48uFpcxKozAG|Wr2O& zW#SAXn8x`#G0tK2yjGk+1k*Tw*Xhjl9N5>b6K4>?G|u01I;XV}*VnBVXAr?O&fkx5 z4y%pJ#Ti5}jq?wj&Zv#$fqmTuaRw1gv?CUm*Gl*as=ifM;)7psZ>$Zq9h+rD$-^MtH)y7tF1`$l- z{5z*}6K#X|ETgD6PnVX$>5O{r?!za1#Kbak#dQUm_I&pra-4C^My`Mn8x|f z5zcX!LL|${74@uX>-jG^&PD1O{c~SW+$3qGIBQzxzdD^!8v}j(Zwy(i5NA#6{5Pj_ zV`*J$h^#d75+eT3n%4R6e&^8ZkzORun%4OrPUq%QwY)aa`U&KWZBWxX|1-il?vj(_ z$>OYOo&V)@ZX8{;l2#KIU!j&z&zgsu*8lBvZW!$`E&3krrhWs?nr28z{^N9R9PN#~ zlsNek`NCP#=J`&ibHgY;O)M_HMoqz4(>mYfbZ#6ihxX6d-r%fx7(Lc;x8FIir%RGU zNDj`L*7+W{^SaQD@CMliHSIQduhY4?+*S_U?M@y=Ii6295W%$4i<0CX+TXx!ar(5R z$eh2q+`ei};2i0<)haX4jl=9NzSMZ5WzIk zjXBN*Ya?`2`8j#Q8ALFRbCc7#soWkqs{EQf;S3^}#<|()Oxs{N>??>zn~dBPb)Fpcv(zjGyW2K@{2gfoa>8t3^=XW9lU z18MUi%U@9|a0U@f++6Mm9S8qSo)`x;?Y`B*9Oq)=U`OaU_(yTpw9bqC&Y|Pr z-^m%Z0V0^DHWueN7aIpVLdU_sk|&%&1k*S#aXL4ZJ3`07f08GhK?Kt{@8fi)Z7_5k z{1bV?8ALFR^S%+zf#cv`$P>;Wf@z%h3viAc2mef-a0U@f z0ZwPy21Ccee~>4fK?Kt{ALw*$E_a5GgUz(xjd4)ZjwuJ_I2RiSJ4468JINQ$n%4PX zzjNp~IEV6#+5izuQyYimI2RiSJ4468d&v{dAcAR}4|O^>l{-Vn!A8k5h+rD$!<^2v z4Tg?`cabOZ3?i7u`S1wmz;W;%@`N*pU>fHm0-Phq!Mn*5&LDzmoR9Q7hmM0d<_72K zV{fQy<9w9UnYO{uaj-$0K?Kt{AMJE*E_e0xjHc~JEPp_aU`)|8%E<$AoQsWvT|JR! zfxa)!n$~%#)48b}I^9UVE6$qx(9d)n<8*F@bE|IAcmI3za@2;V&GWHN=Z3DxtG<%t z4)P_Xy?6>e){&i;0JGl}sprP7?ojDBk{p~hPu9Y8|9F+>dYoJ6Bg!JLReQZSYg*?M z0-P%Y__mXnIG*}tAowRu@8%2ntDDp z$GJ#7w~+JDK-?u9EwT-Q2&Qp9Ex@_l8`nk86=x8^G|s0xolzU*K$n|(} z*0j#8PUktRXeEL1UTO<@*0j!TPUmL2$h>zjPWp@D3?i7Op4)Sr3-!<4gR6T6E=yMs zu>2CWfjolL2dOLZ-S<}`=XO44`ZLp;q&h1D^NW6nufwQJ{UgmV3 z-#s$aTJ7no_J=4Z$4LJSBABK&mghJZspo0u!E_zoPxk;~ZAc9pVfkn8x{{ zDCeL&pC-;Af@z$)0-QSn>-l(b1`$l-yei5$D9=ZVGl*as=k6HiuzKzkXAr?O&OK4i zL3uu1oIwQBIQIrPcLvt;3E~VQn8vv;$~h>{M~O3tU>fI(W1Pe4d6_ta2&QrFk8%#m z^BLj{BACW`Ai#N9U_GBG&LDzmoG*!T4$AY<;tV2~#(8y&b67nu7iSQ`G|q!j&Ov!T zQ=CBr(>MaFlaUo*y92AcAR}M`E1A>Uo7Yg9xT^E=4&9<@qde z1`$l-d})C5iokk4S)4%x(>RYtIS1u=sW^iOrg1LEIEU5qN^u4eOygXMat_LKt2l!Q zrg2{5bZ(~O&ym-C9VpHqf@z#Db2>M4uTL8fTE2kVA*Dn!yM8BI#o8R_BIhO=d%8lU z_m^|WAcAS~ye`MN$Z`J0o>I_R32`JK&-*Ld^C|0doQveSiJarkS|!Qb#8uNeU+#3K zJP*=p!eT#a33=AE&Q~~{DbItEd48)nYg*?koz9f!uD<^G`<;nv#97liZ}2-uc6A9lAyV3l)_J4bIrg*QaP4KFBNA^>%7J3+|oZV+8y^1lF66F8ALG6{CR7RbCLOT zQ{;uj5O_V560E=5#kIYn8tZ`h;v*$A1Tftf@z!|=yXOsR|4z#XmJJ+ zOyfM^be=!ZRjT4GvHj^fyvxT@1EiE_+Iih%j&qUYNYl=PUfcBbj}vE2>pbOjo{Kzp z5B0oQXSB{YIh`8@dV_4!X7H{)xN2JG2RWS^2YOp0 zrH>M4%~Q<^ZuUEe?!+D;&YITw!G7m>K zk%;7l<>6 zU>fH~IGvH_z_;)wOT-yOFpcvgozAG|$oC!ZBhDa#X`F8fa9-crg;NP3F<+cP1k*S_ z%I{pEw`$_lSV){et&mcpY5V6#=QtPHPiYt^g}7#o>=b8B>--p}bK^iMbR4`+oHecU zW1Y@T-;pQbIV|FPvrMJ9xB(1f(WLm=cng57pdpDaITCF zrfcvo4-sb&!8Fddxt(J-!d2u+N{Oc325--CF0u{I9m4E6Y)Ikn;)3(n=!RgLJU=7H zxkzm^4)wIAt;Z}ENNs=!rg46z-#N73m@m#Cf@z$e<#!I9^Uo7!5WzIg&-Ocq&Y$Os zGl*as=jZsHJJZ%bN$ZC($-^^3&j~kFpcx`+|Gd?xJQl$%JB^l!8Fd# zcRDvm9;_qB{lpnWFpcvIyv`$~(9f@1BDDb`n8x`Ir*p#yu9A$4mrzrr#NWf4(OzHo z!W`!!WA~g=oG)5>8QtKjX`Nr>bZ#iMVpU-=ms*0erkx|b*y-F@Y7Ld1C(fGI`6Yhm z*!hMy&sVh0FZDZz&Nmi_tEP2+ncq2dzOhi8HLdf@{m!xT4RIzd-WEaY{0hHw=zL?b zxN2JGSNffo(`v$E3AKdWYFg)4`JGpU2~$J+h_j}3eznuNsni;F-6j6^KZ!GlVD6jV z&z7&raW1kCOU|KJo&1Z$P#YkEX`El{bZ#c+$nP!vmCQv!1k*UbF2Xr*B>a;&g9xT^ ze!bJVh4MUH=}lJ6)dg9xT^enW_JU%G;T<&VS}L@8=cOy4Mvu8g2@Xh?M2(y zy(!1J$ebU}f#sZ_EjVjh=Qlf@soxmxF4Iba;z!gDoI%8ourRgpmK^7T{c~vz+6{_t zQ9E!35lrL!R=;z3G;Ka)`73G#&LDzmoZsejroL|N>NRnF-M^&Y01-^%{C1~vLn(3# zq|f&vPvlwCZiDa0aW2wtG?v<0k&mc2i5h~lrgeU&-#IkV@Po6ab$*xMIdmTu$6w&A zX`SEgcMjc$#raD(Yg*^`_?<)dVNVlhP3!z#zjNq5?CIjHX`SEacMjc$Jwu!|t@Hc+ z&Y}CTXNt3?b^d_UxvA6^x)1wjaRw1gGY)<*$GO-XsV#IL_TS`5N(qQy8s`r=otsN- zq5H7EmiY#VU>fHSM>q$Lgnt%i5WzIgA8|UjP@W_AVZSZTAcAR}KN{lPm#!dS`D1Yg z5lrL!F{d;28=?EKt>j5ciKgxAKAz)TWG)Klz;aH`5@${8{0XNs^&6r4us;@O5WzIH z@yQ(Lg8g&oKJ2&26SV;%n8x{2e&^7A*k6+;oIwQBIDgvdOnqJGKJ34#zkoA{U>fJo zIGr0}FXvBifiIjj?Kb$?9OokaMq{bH75Rt?9Cd)Rrgi?D-#N0YOE5aYS<^ay-tQc` z4|}mVYg*?o_?<)dVf)2d(>j0A?;N@hJ0Q-Q*7-|*=g@uFOT<~zI)B;k9J&v?TAVel z^H==Nq5H6d;;d<%zv^^uDz%61!~R8_K?Ku`gI~*WE;dJM58a3T4|$SO0wS2k`Rh*S z=2Cm;KJ0H~z5ybb#`zl&&VeK0U&I+iFpcv!oz5+k=g587?}#&qU>fIdg*an&5EDNU zXAr?O&fj)AQ@;_q4~s#SloCzb*L^3)xyW1;&Vl8eVDbWIP3!z!r!(~%q5H5u5oZv= zG_~=)9Or`lbLc+ocgPcY1`$l-{C&T3=sxUk$P>;Wf@z$8;B=)<#`i;g?M=SCX6;)~o&YITw$A0I?t}eMooHecUPyEiI z`>UR#^hut8~n%4Pee&^7A*p1?>X`O%WcMjc$-6YPM*7+BH=g@uFadFnP z&cF0Khwj5}7H3WC{41w(Q>i0#ANH@}3?i6j9Q<{TbFn#6N9aE6o#aVM35Z}C=ifM; zn@b&``>?;2`38t!8t30eI0ue|e-&pC!8Fdlb2_(Bo+I~Rzbnolf@z$8AL87Xt{`Cf zQ*j0nOym3qr!(~%q5H5~$&-{4P21P~F~_;cTolfM<(zC0XHDz;C#N&@8=?EKKNV*X z!8En;=N#vP{d4F(?03l%wE-fS#`!OP=g@uF-;yVsK?Kt{|JCVCeO>52?48nYfC#2> z{+rXep%glOP9992$g`&12LGPpT%_MCIdmg@gg9$j=l}SfL-%1HDbAYK`A)xc=sxT% z;;d<%@A5l`?!!JxoHecU-A?DGQfKHs?BB#0L@>=bcu$UVu{ly_=sxUS~{{`hkdFzYg*?ee&^7A*r$oJrgh%O?;P53 zJYAeMt@FNq=g@uF+r(MZI`8Lq4&8^nU7R(o^ZrifrqZ&|eb~Q?Gl*cCaqxf~=VEiD zWug19catZ^6cE8Q&IdZ3n@h_=_hEl8^9>NeG|mS_I0ue|e-~#E!8FbXJDpo7&yoAE z-xp^P!8Fc?ggD3T!~R^HK?Kt{AL?|bej{`r_L<~~ZBWzpb%*6R7nzH~Ik23QXNa?= zbw1qbO#MdaKJ3rM8ALEmZ5)x~T(Ex*-G}`?d7?Hz1k*Sl>30s@hy6Wy!Wl#`jq_1X zXX@)h_hIjregi}>jq}k?=Y~?~v@Urkc_Po6b{l*^j&reoV|nNt=^x?@BA6!6OLLry zZG+20=ScUEC-Mv;n8x`Sr*m^@dFUMJ4^qz{f@z$Ojc^VeRQ@5(AcAR}k8?V=P@W^_ zNIwu~5WzIg$A>t_&5?c~&LDzmoKJ8%HqL(EqJoj6YkCychfmVs*TV&(hq25s0|RoG|s2^okQnH ze;`jdg9xT^KGo?=eO>4r=^p7fKm^k`pXPLKD6L2v4_bbJ+CiQ*?KXINj&reoV@2p3 z>7U{ZBA6!6XXH2++Xh#J&XMjVPvjXyFpcw>PUq&*iqJXIAEll_1k*U572zB>NBXBY zg9xT^Zgo1hP@W^_NIw*35WzIgZ6VHm=?VgtzZ7Q>!8Fe8PUoi5iqJXIo5>T~pr-BX zI&z!~_I06iq&JDPrgiRgI#a(9I!F4YID-hLsf}eh&ISAD&^gi%$rH5!BACW`x!*Z- zj`T8s`;GXX@)h=ScTTzX2kc#(AaFxvA9E)15XSvV0)5f;?;5ZSd?I=VJXv z=-0I+2Z^($bw0=G+)^4Ct`3w!a?Fi1qv!0FsjDhC=T$%Hs- zTIUO$&W)w=+DPf=i?gP6zR2wy`<>%^#97licln*$BJ(^c&YISFmD71%Y3)#3wQF=V zNPLxy-5`Q#`nv8M=OX>{{LHyOU59tsEzTf6p^p z9aPRqpE!dErg0u}I%j>|Xj{xcc(FKx2&Qo!4s(tf2>ZnuL@h|_txHe$MsWI&uj z1k*T|oX*p=(H>J9mxwcnU>fI3!<=JkW3@Pg2&Qo!bvjSiMojmd42m;|U>fJL(|Ni! zI$~;LNSr|g(>PbcoMUQZSe!uw(>SkjI#1U|%rKaYh%<;_8t2QL&eOHg8B-f2aRw1g zUDN=HlID-hLalR_VxhHB9Ov>U6BACYc z>JaDNi-Wq2WSKaF2&Qqa#yAg;q^oc*PZDPk!8Fd-#5jl5Mw>W;2&Qo!b2_K}b8lrd z=p4m~;tV2~#(9I&IqmBPdZX&OU7SG#(>QN*I;VLa80lKGE?tRpd5SoL2&Qq~QN-I;VLqmAiuq`a*FA5lrK}#p#^Z zGn`}Qbr*>9d8q75WzIgJDtv` zXLgS1>XK{48ALFR^R6i8n656lPMkpm(>U*TI%6Abug0A_zDb-x1k*S_(CLhEu)P|0 z?s!a`K?Kt{PlP$g^c)++8ALFR^JI{7)VbrU#2G{|jq_BPb4;GE7H1H_G|qd%oMTQ- zRK*!YFpcx|Va_oJ&94z>5WzIgH#nWsF(vNY@eXkY5lrKJqtiL->!Qvb?-XYc!8Fb{ zg*nFzguBEUL@gPhLOwGq>8B)i2KL@%}(d(+6X##{6KLA5lrL!;4tTy+L#b$ z5WzIg4{d**Ea9`n8x{OPUkewap#UVi!+E| z8t11wozr@bJ9oTAoIwQBINuiL95b)mD$XE+X`F9&I;VYI+_~fJ;tV2~#`zge=d_;V z&K<86XAr?O&d+o@r+JP$cYL`xg9xT^epZlk)cpAhaRw1gfHa zg*nHZoOp^jg9xT^esP#{%t7;~iZh5{8t0cdozpQT?%eSU#2G{|jq^*L&RJg`i0L+x7l|{7U>fIFIGv|!Bk0`mi^Um4Fpcvo z!<=Jk<0aw@BACYcRZi#W+KB0%lb4D!h+rD$S38}jYa{5~@yo;+L@Yr>pkYUAbN z3?i7u`L#~x>Dq`H29sBaGl*as=hr!%r)wkV-0>^L8ALFR^XtQ$V`}47;tV2~#`z6S zXQ_>_bH}%dGl*as=Qlc?r8dIO9p5g_AcAR}-xTH?Qyb3^XAr?O&Tn=)r~BP;=Z+sO z&LDzmoZk}U95h8r9wW{mf@z%J8sZ#x?)Ww03?i7u`E4Q2ap#V26=x8^G|q32aSl6o z{7`WQ5lrL!ju_{#bH|SpXAr?O&hKx#Ne3Gl*as=XW`s)4ne5-0|bZ8ALFR z^ShnSX`bWG9Y0*0K?Kt{zsKpE&Nt%D9lutbK?Kt{zt`!EbH`nQ=Z+sH&LDzmoZshk zPV*dh?)aJF3?i7u`Tb7kw4US69Y0H)K?Kt{e;~{`W?uJfaRw1g&JN}S3g9xT^{+QDl^~}ye=Z-%t&LDzmoIf7r9Mjb$9}#B|!8FdFa5`ffTorik z_)FppBACYclTK%hgR2719luMQK?Kt{e=5v5rssIKID-hLasG6WbJV%xw}~@|U>fJo zggM9L`R(EiBACYcvtiCLCnw$^&LDzmoIe-l9COh8o#G54n8x|@PUmz?p>xN}(sg*3 z9}{N~!8Fcaa5`sw-RQEIf$-zv3?i7u`HNxBF$3Wz#2G{|jq{hB&eOFK^mXZ<6lV~@ zG|pdkI#1We@|fEAlsJP3rg8pCm~%{Rd|I4A1k*Tw)#*H48!OUvc$c3MXAr?O&R=sn zPuIqZnA-TPID-hLasGOkb4+b~PMkpm(>Q;_={#KfHi#W;tZJAR}%g9xT^{&9?R*tz33iZh5{8t0!lozwm~ z?%eSs#2G{|jq^{P&S_s4ckcL2;tV2~#`$MX=QPi8=Z+sG&LDzmoPX|gPUjnO=Z?Q3 z&LDzmoPXhT#<}BFf#;5I5oZv=G|sd+y;?5m^RGdKs(>VXu>73Sc+_~d7h%<;_8t30RozpzW zojZQBID-hLasGXfbJYC#E#eF!n8x`JPUptby4JMynC11<%p$sJo@|=_V~%r??@1@; zm@l&xuPJfXw9bEWIyaZ9<+XvJIA>NPnOrzd2$-6Me`;f3O? zX`SzJJ9mWU`3iB?w9fbXokR0{xj1WD=VVEe+(Ug9ZrONKtTsAB^L(HXHDze7~mW@q$D?pv!-=!aymDaL(4h2K%6zLbF_(>k{}og2%&-L#6ZI7r5B5WzHK_uL%kBJ;YIa__~x!~N+B0+t6iqK#+*lrJOmLU6A8kWE>>t(EY&`;;d<%7y6w8 zk0K=r4)7q)n$~%d)48EsqBXOHN1QW%rV!s^cBIDq~YLyNot?aM% zSF5Voy6-|2+n^|?G|u}wof|7bAM_=EwK`=Ip_nZB+su9XHDyTh~GIh`P3wH9)493Q zS?L&(Bn9B*;;d<%4|6&W;bHrKG&P9)KIyY5f_qz`k zXHA>uBc0BTmA=-Q|E&MsVdAW5^L&)wIdtFZ5OLPD&PThQ`$O}5tT=1h+IWE9IW*75 ziL<74Ug~sis0`3r;^I7N3Ug6STN}qXof|8Ip|!D8oHcEpkM%o;*2Xd7tZAK(b2>Ly zhT7x4Stm)3p&b;|28dvq{gmT#oQv#Rk#k3+^ReO#BACYc1iy1^e zqR$m)5WzIgXE>cv8D*K)j|QHaNLGn6h+rD$cBeDd2A!J->*|t=#2G{| zjdMqcb68iGbcr*FU>fI6zjLL(wKZKqz_L%AK?Kt{FLOH6I0)ykj^ko+1`$l-ygbG^ ztmEhxXAr?O&MTbGv<*_8&8aRw1gQlIozvQgJAYgjXAr?O&Z}aa!)l`<&LDzmoV%UQX>A03=p{L>5oZv=G|oLv z=d?D0KJ=0tFB4}F!8FdjG0tJNu~wWx1k*V8Ii1tmz!j-6u}+*p1k*TQ>~v0RBj`gf z$#K0ng9xT^?vHT}tBuRW8ALFR^MKPitqolH8xvQEGl*as=S!TA03=p{K`Db65* zX`ENbIEU57RpJaHn8ta~>73REuCR`YtHl{aFpcw&(>bk;pbxzy$ErAk2&Qo!j&TmF zjcddiL@h|@W(jkD7g1T4qI8ALFRbIIwP*2dXk$2T^JGl*as=SyRp!)jxrID-hL zaUOL#b8WP>rYi_oZW3n@!8Fcgr!&_^TikKcad8F_OygXMaSp4E&EgCqn8taH(>bk; zxZ|Q*#2G{|jq_zr=d?EBj*D&;XAr?O&TC_w!)jxjID-hLabD+iPHQ9XxahUw3?i7u zdA-v)t&OfJEVw}TjW0yFC2&Qqq+UcCuM%;1H-Qo-)n8vy4bWUp{?zrd!#Ti5}jq^1z z&SAANAG(E7o8Gk5WzIg8)KZqYGaQ$g9xT^ z-sE(q+E}}$68F&%7l<>6U>fIfuk)Jns;gzG+W2)N<;V|Y{0e!ZHb4Z^IPY{iH?8mO8cmxIS?(+EsR0p8v3Kv&OxP-oKBu_1`$l-JQ?Ktz&#=5oV1cBoIwQBI8OyRPfqRHovy{VJd0iqXAr?O z&U>8B*)~`S+6K=cPdI}Jrg6UB>AWQC>w-FtDtW>gM2ul!oNvf+Mt@jqUl-j!-$v`k zI0()aoVK>oWA}p0d3@*p zcxLUt!WB1g&aS*+8s`Vk;#_MzFUp)ZPmD*5-S~VHID-hLaej!?c{JT ziOTcjuAS+M97}vR2An|z(>OnJ7Uz2M95EDbBu_Yl2+o3WzQyT$RF>z-8@5et+*;i< zzIklV_NnT&I_G(-$P>;Wg7=S&^P^^QuC+Gyop!F$R_L#ehmj|oK?Kt{KYAADMoc>H zBd`rF8SF^s8OnN7Ux>GL6zr_ z(fbzigfoa>8t2E&;#^0bLq_k1k|&%&1k*S_eir9C@;o^;zB^r!WBDk0Eu29F(>On2 z7Ux>?eBjJBIJIrZcy)4WY{GL4?BV1IXAtplER6FLXK}7I&-1F4uJUU76j!tz5C>8l z3+M(Sn8x|m9Ooj(zUVwG_jTzS{L5pgi8*w`XW$_472+R>3^<$>N$u`tfhq&#QG z3bb>r^Nl4lc@8o)YGl+Ns7RLEmvpCn<*D2?adEFC95zZjuRxFJ3vuAOxHP3v^ zeA~vbbD9T{Vl&-91jg{RO!3n+vbq5G`g3Zm=V|9D63-fS5Pcl%K*VWugUXx)NAlBn zuF7*g&I=~1J9p76DaJTGFM%B6{6t3ddpe$%Xwld;$6w_1~l%ErPKtRLBvuljPnar zo-^knbN(eg)%1{8wXL;v$0XL^iZkiea0U@f<9tV;^Nwvh(-k?E=hAE83?i7u`Grnr zIuARY=YTZxc~>}}!N&RLVPE8QrfVUlo&A-Op8J9G|2hZs;yCAJ5zZ^g7tSDpX=>vo zPG?mcny?45WzIguXH-k}BP7qA@l50V#vJD&`&KixQFiYOBDL7hhBJs@8s|4Tog4Zu zPa6+f;&|eGx`D_YX!i%-oa0<%e=yn^$6(+L!Wp#AZ^?D0XX6F;5jY1F?Tm90a0a0O zTIaXsI@1}I8lC4}GSJsI&|5~+5rN}JsORiB64TW4+j5=hMKwAfI@mgWAgPTG7SMYU zrp70(AKPB%AFxWCK?Kt{zdgqpy0so-JjgmbPab#Cx{+rP!8FeAa5^8Xo!wcc&($VR zID-hLaek-M`GCEhomr;OwkJT9> z7Ux>~=Y4T)51joeX2)S#!Wl#`jq?Yb&e7*na1I4?49ycEui}F_&b$v+V?8gb&YT3Q zs&?zWyAQn({YAzD>AqF@kT`#gxSy! zHasIe2lQd_&YYR{k4vAv*AmW)r`jf~TgS(yHjMi&Qj?YsAmY54=Kg!FHAy}~z8>eM zscKtTlF1Ez$g}1GZSwUP8UWk4JL@-Uik>yyQAH?7JUxkmKnc&)> zW99=xy`%L0|24xE^MpDcq9oy*l_t|T>+{{%MiF>k?bkoI@^CWIS{;aZ=P_zIyTJw9 zR_c#gNE)Az?GNsmGyf+0L$fF55P4oQxREZ9**J02Zd?!Fmh-G)Kl&Z57tSE!uSDFP z!#yDXD7lk5wk+4W)|=!t>9g{e|2LemPlk+w=%>M9y6Na|oN>3H29>Xc@T_^KNFCG3^}E*PTIja0U@QbW5GFWv20^IOmYJrH_#o zoI%7m-BM@1Dw}`yd8hNfTo|p@ZIcuIV>>r($2vTLYw$JmX114NO&Zt=kIKqZ}Wv{nNqO2{e3wludwzLMj-7*ELlQ2k_cA7l6adplP<+OIRuD)ta_A~=I^29Kwk zj;}hMRi1b44!E`-bA8lvwr|2TwehtaXQa5+V+D&T&lMh1Lb_+(cSWAFeOS;Q`}%s0 zbCKGZ&U0JL{2B8!ID@DSa4Fq%e8cICJj>X2zMCoOe?D z-XI-z2H_0aW4Yg=A7*pWtgkCl8~e;S(;R7hidNwYeS96hhYcmhul z&fsx$)A1drv&wV8Of;Q4!x?jEID>e9jgId+omIaPGOt753}+C|;8MEj_@2|bdE>4< zJKa@0W3-;`oW(pbx5q?vD^H^*(q;-TpHHuV zGl+N--Qe6Z{ch7F`GKm9EYEmut>-529$s;t+&)I1fKwgY=$R$q$_ng}fQV<)4bJnD zGx3n)M^0zFCw(_*ig?y+-Nbd}*q6?(Gw-MSaBfojus?P>@3*(JFUjO~3EkifBFc1w zbJ~OOo#ZF8IM;d{$v9VAJJNRRU7|kWoYg6gou|$`I&-r>jdsp1*y7fUFED?Ab2g7S zj_zCMp9MR6zp~~8aRw3i>?}CXQGMOdXK`*x|2VvC)kv@RHJj_&OJM_wju~u%r7*TnudSrbY8T3h)0yxjxJZfoM~M~cW?|&b7}TV z;jf~cm&Z7-B`-K@E)~}dzYcP4YmISUM`Cc+T$;%Wf8%s+oEYC?nshxx9Un$FO}@rX zwfbAHbN!d4DT|rAa6N`@n)aB?@0`wbojJ|uWMUWazP2;S7xR1&!8FHY^!z#N$BP_e z+=u4R*}QJ|cK>I&ZY59br-0Z`0qxBE4=T@@^J02lt@G#TIX^ZIID>Eo&!U@-KRTVG z=lnRV17{GVK;H7la@n@%V^qhYq$>Ep=2xoAJZaV(r zbsp-emIu2oqbmyrhWkcz({2+ZU%kb-^4p}J{W&$jm`^Wr%1dXh*hr;N$eM5o79o{{{ z=$71Z47Jcqw~Qy#ee0b0&Y?dp>+3N7{MQrlGZWbF-e+jWx!ODG_CAT$0Y^){YV;d- znLJbd)Z9PstDQ%CyLxovb=*IWUIS-K-PGOW>v2BVI@5Op^$nm3>kI6Yz}Zr_c8}9} zKkdABbfD6!TQ7be^$BN7-4ecl#FOU({>!;)r(t?^_j&(BdIp>=_j)01dmiWeV;jtT zu`Oo(2KV9kWA7u-Z`>c-U<2hDzV$laAKPG~)A|0`2AiDD_s2Ha>~y|A=FctSJfE0t zgGJsq(YRp`cIU(59BK)32hC$l>)7_@ig)IW>z25aG|#mU(Qh(>gCC zUyt)lZT!F6Psx1uskb(Q&s+6Lo;7WrQ5%arwGmv;z2dBCotKcW$9bP>wNmP?%8b^v8*W=toR}fEx8K<8~hW@#oZW-;^ zeSp)sCA|tM%({(QLY_5ko)2_7FQ(7ur|Z>F$F!ThS7dc@2)SqV+=Nc! z|KolGecZw1tNXel$NBG%a}$~G15}==udDgkSM;2}L{)%#*2K1`1NlAF6Zy#2>EZLDtCzGtF3wUyrNv31w>P0~tzID=k>`Mc&3 zrm2obx?X|?5jgKJzbn!|FNQOHw;a7`VrtK%X}peyC(&!*tch!LbsR&r;c;%Rju!YI8=p>97Un z_%s*h&u`6mh-v-A9A~_));a%t$}r`bvTYi!^Wk~)I^-EdFioCM%5g4|=S6TveXQy# z2Mj6vz8^TRWaIqLjXycZ8QVauc|HK&eTGl7Xsu4t7Xr~2RBo=y>gocH;gS*`%LOsN zv%7g;m2t40p3p?UN8F#sWUwitKh`_}QYx_hohrG`oQsTuO_W$1^NET9Y6#AnxW+)o zY2@p1Zj9=fMXHC0eJRbwTA1#i?sX3P=9E;dn*e7`>wJdWIrhCCUF3_}&|E~1b)4yR zZrF95Zq9wbk6M7Urk(Sj<#cY^MeiAOo6a^bSy;al*#uQED zT}PYKxv^_iS-0oCe<+O?a0U@fGj?b5BQUFVJiXTI%o{iO-*>=rve-<7Gl*as=MKtq z=AAjW;K}lL;_hsL^WAe-jf@QTc45~(B(9=X-~l2)yKmK*jm}N0)_X7YVz+F8 z$qJmaNegJwoGf!XABgJ;s`U23>gH{m=}X6_CiZNc$^`1*U+6VR*YD)DczlrD&#+va zR}!<@D3a&H`P%qA@rPuqC`7oTo-<~DgKh-1yh6M)=OV|<7xwg3uOFMJZrXLjPTg+3 z_m86_!x==J3Yy}`d~Lr`>-&!9i}Rk{ybAZ?7;y#>OyhiZPCeu4wK~u387OzH8jRRQ zVaJ!!662mF|56s`<) z>8Wm_PoGU!5U{LeAND+_Gkvee=Ivu!s@-Ed*G!K4rC&%*AkQFzY4Uu&)0w{4gPo%a z5Tcwj1kSCl$1k*TQ=yY!G2|HBBj>~BYXAr?O&KLQe zNBXjjJY9`ziT!Ojg9xT^?s7Ue^;Ac~CUxZ4Pd7M&2&Qpf<#e9gL!Z$(w&|vH4gMw0 zNx&IIFpYD!(|Mjax2LOcFWaaEID-hLaqe+C(>6G&62nq&WWy zXAr?O&izhjnj?jLHd$(zUS9;~6XXX><2>MWrtfIpv$49B&Ru0|^|4Ln{2+p9oG;07 z#?xy(2Sj}xId6~pTIr-+oIwQBIIng(BhTC0NxL;&hj-a3&LDzmoCgD(C*jM=BIcJ?yx~jUDXNWV1U>fIPr!&=aP%oD{4iV6AfC#2>9?5Yov_IH89J$-g z``fr)1N+^Y@Xw-@bfkygc%IYWlhcLr!MO3XUNn&me+n@_cEIbCEnR=%YQ@ za?k}QG1XSim>-=G7> zyvpL8ITtxz*U~rGb#b+%n{?g3gFq6 z4+gFCnw)wr=)Am>+Kq}m)DWCO1ZbTvb2{(Sw`b?ZscpM!#5;2?vJKAbtM&~Hmk0WFqmKJW z(zpO;5WzJ4bLOkJ!6N=T5$E~jJTkhP zoYQr9mq&>+h+rD$E1b^F{R0>GSJL()mW#w0L@l}_iDf#FKq^0?E-4<=9absz#f zito)VuF7#P(r={BYi1gB-n*Gz4`&boTIZ_+oIBd%^87GzgfoZ$t#dWRIWEuW+Tjc$ zKK z-|KPH?(r%vhcNl5=V7OegCK%w#=*>2&yn!-T94Pwr_W&Dv#q*e+ZJAhdvPAE9JvGM z3hj51Y{{wT#q``l&XaM@=ZZ53XVCV~Tb<60gClFH>9AN#j+j4#2&SoxZ8^?G=Auo* zYX%3?=0ldqDV($1GL7@KPUl6tchR>q`>&mv{(~vMNbz0S59k4ERmXMWyn~qa8%6rM z{ds>-i$6p+U-&*;k>`x~1MoNKK!34ayffz_eO+UzoV{H@H(U4p4fM+6=>{Uellb1u zBJK%g%jf&Bg=Wd)I#>1x_F%Z|M`!g#V&Dv zV4d~6AJ?-I_mwk$|1atp&S3U8WWFG3Vz;B7n@4-gy@C6%m>Vsjn82+_qf($bEM^wSc)OhyV}edozm(XFWHTLl284yGRYrAOf_`lTPP`*sd5n$%eKcK~fa_YHAZ8WZlb-tFI;0z)_>wI&rGZjXSwb8gH zc1+n#j&KGMpmlz5t}{KcM(2jusVILB5N%IP0@IFz5Aizh37tOk_W;3p9fT=B>-^AM z=h|yy?i%M8(6iah;^lM~?-v9S;QoAXX7R9GXZn4Owb8t$+84PMep6Qc1yRIf?#JXY z@NjW{Br)rsi}V`{c}!t(|A0b1a7F)|G5Z_nN7I3R`4QrsITsmIkmtyr<2Pi6fAP=7 z5RYx1Gv7yf^W4!Ml4rOg&l$77LH+~=@_dUg&!MBrhsX+feiz#%2_D-#XTFbd=9$Dp z@(fqxIU}5HcYr)U+L`Cbdj7mPeuRj?W1Hv9_i^4l2h}rNk>`xr-#|Z_4&?c7U6tvNRIBK@P|DK?Ha#-D+w%6rBN@Y0rD_71RLc8z2HSyD7;Noz6|yhj!1&b>xV81`(jG z=Ue^Gq4oSga)dL80Ilg!ljDJO0}&whTXa0x>3rY~yCyaTz9;=ZB!_YD zZz74u$h(fGi1X8k_4IY=d(!j7>l@19iZLZ)_BUu}^l?uW@65T#Ty*~B>**5$E7g(J zy4CvcKZRZj4-mmL9Y^M?`)3~C@ejI>!13n;*csOa_Eh`U40l%sd~YXw8m$w~AcAR} zpDsDB*LgqXJhJMN-tJ1eu6mcZ(+lAYBACYcHmCEV)R{ierCFfGtXxC70g}$EB|3zX?B~Lhm2&QpUqa0K zjUs*BoEyzX?RiGV=8} zM{k48;;d=w`Q={c;BBx)oHecUE1b^v$F&eyUA&guv%apez&JQ(lPNam!?)Axo9U*B zZBhre!B>&59tR8c&y%_}|NXa76F63(X=~%vZOL=lkP4 zY?k9U)mhKY_^i%$odw_hZ_vw8&ziP2P{*%x)N@1F6<_J!`ekv}w9c<5U!QaAM))Oi zMn9ox_fy{BbWZD;3#7h-w`qE(mtUcKG^`{Uvl^Lx0^NC|IKPFM_0NUo&;7bJ|NXB~ z6Y$VnY??(qWBaSSe;zaqIv;+WUJqwY>-=W&^*B%WbwTHjvuhwS{)YTfD>}06@9nBK zij3V2o44!c-1mP;Euf#!MBa6vCf@3(jp)AaS0so2S=07)ZzErib5{hO)C&3uO`B)b25PzPF(tOEOFkgZn%4O}~b%ZFg4Mv|k{s*le{jui0kWztd?_=a!?=~2H?)cy2hW=SI%Vnnhaq@LJ z2cJ9smpE%$=TCT@gU=oRQ=B!e^Cz9oO9orztNiwC-#YF;SvW$@m?MD*rYY#3kuz!; zw}aEC@jR;5&kR{O;~a7j>=JT-Gl*as=TAGGRh}m!@;pqQa0U@fBZ(bUEla-54?c=!@<2a_kR+h$qkuW!k7dT`lXI z!K3k{ENZOh{ige8d^7B}o!)QBL*EAHtgoxm{ZwU1W|n+e<+&c`#naAyUr2S)4bC89 zkZ!5-%vqJMIGy*OcE;E6y1Qq74-K5hAWX4^ZmBc&Y}5GaEY7ulXX12U7t}vrNLr`@ z&BMes!`E`0@psA}mpv_)|2O*Q3usL^)}?u4w^9NJv!T8#&JWtF(x+r{xlP-cP<(I{jAZ$*sF~=RUROAEG}# ziEf%J&8xqe<6NXR==)RBZ^G^^SE;KutrvfYn!uO>BA8}O(fxBh^XHkqu60vuwy~$H zt80nA4bC8fX`H{U@~oX}-3Ft_ls@vr{~1JpNAkUy#dmU?`51ML^*l4@AJ{oHIxy34 zo%hhkAGGz2BeMMV@d55lrL!J*V?td9L{Ld=YuV8AM!! zg>nAA(|NBvR|ed9UPX#<1`$l-`~#BEVDm-pt~MInLMyYn^ZGJ6+G1 zBhlCJ&NN-uy%N0&c?J9%{vfspIA>c1(>VXw={&Oy?!mDFTAMG1 z=;d$*5lrL!6Q{E}jdHRSxeFlokb3M*kUpLH? zQUAWxCiY7b5b+?o!MTBtF5xFh@{3uV8}Y>Z2+W_ezAkn4_jMnkb)q&v#K-BDsv!Gm z{BjoOTKngj+KBnON6hu%3?eYEOKW2RKgQx$PUo!O7^bhsn{L!`=fU(^ID?3X(aq-h z*G}iGe};2J|9l5I!Wl%ojBcrO3qQu=yXAto?x~0x@`7suMa5}3zhnxd?1v$YPM7)V^sq;*2{L$%*{q7sawoUa- zjE|>-IIpVi#bxwLID?1{bc1t)`ZTIP&Ej0^d}FR0M?(7%aSk=IKixFXG7bMZ#~FX8 z{6oyM_kPI77<;O#Ml03sku?Dak*Il$f0&DA;~>+_MfJQcJHm_qMXi0^K3lf$+Ay}A zzQlXWw#g~~8|rb~meRD5a9)%iV;rt-*fZ%m0W0m}`(02Q+4sCKO>O*D)w8aRTJt>ZyqP)< zS+57!_TUU6n8x`ZPUq--t15Xeq8o@&1U!yzI{umCjN==%_H{G!=a_w~%W2(k2H^}I zOE(?=ayrlCIp$p3I+BAk2xrjd`QJ|G=>5Sf$PvyUoI$Q>Viy0I#kto0IeLE(J3DX& z;S8QhHywA*;#})obf%tT_6OIK9GpQogD25V$6ZcmH5Wxn+;Jtf0A~=+pmo06>8$3W zA^U^ZkRzNyID@CrO~*Y>XO-vey4`y3UrjHBGYDt!6uRlS*XgYC9I|hR8@n;4)Vd9-JcsOCT}A7LGYDtU=6R0OS>-uo-)f8;;S9nVw0UlDI%n6{ zMIGPRM2>I<;S8>%n~ug=oNFCZnm3M7eszn!``A;(5hKl+qXcQ&chTIwu_3ML<7IVx zEjs=Dz5?^-#*Gsp{c^Uh1L+Q&HIa86&6H=4bJN!GG5r6cVm>tlXU&enAY4^SJLHqQ&4&JDY+)2npfM_&wQP3(v3SmbnW zqytF0J@0+^!CBMhd9l;EVRE-ubFbH9Jj0l+X`Poiof{{2x9_!5=K~zeg0rR_Q}%H> zAKX*z?JcDr6OSUi0K1pukE3O(bMziM*N-v^;GMzuja8$ z*N<(-3u2;`n!&MT&7(}ynD75x_EqrzKoprH&EL4SdPCsH!C^#&v*t07Qn5ePhR1o% zZq-=8T^!4xe?1@5$e8{Av*r(QI?taNpB$gKetZ)W6A(vI8_2V!oj)HK z>wHj@GfpA|#97n^@~ml{4|X~)n%K2xOWE)_V`Av{qqCpwRCP`ZBM0Iu5?w_l%2kK`K@%rm;z!<0qvNwo;s4u8T|~RR_7zh zdCt!CHBn3S#i$KU_E9V7pib~C84FSO2(BOek@pctk#pm&JyZAbv_ii=mYxkqO*;3t zR~$j>t=IWzdTrD0UAqE@?qn(1!CBMJk?{Ym*ZCs)|Fld_jZN*Dq_xBZ<`$?8P3(i~ z!2h>i=cUN=U~f;WZqRxEmGpXSgCNQiwAzx8f|$B1*#unoK9RdjwNrP&YdC7IQ9qU>=+=^IOG3Yuk#6eIj;zD9v5d2!8FeJ|JLh#61{doR?o{ql=-+m z@;t`ILgS48Z@tbq{v5rZQX<#G>85#v_-A+`jSEZY2Ja^MVXb5L$@KRgQW_ZMcO17? zM{nFzZChTg04uWgixNkrkmu~^6qDAY<3xH~Z=O&2Z|9CycJ8RV%iczEa0U@faxqf9rKV>%W~lJ2=mso#`5jFEQVOb2jf{8fW}}|4(b@ z+S^7Eg<<%D3gS{I2oOk=Qm&zBZO2ZyHfwvGY~yuOuXAZZ8bv5lDkV{7giCTZN6NfT)7SH4-re!e?%J_3>ppm`N230-E97*GeuhQR2>AuJXX`!)^DCz( z?m*tWdszS0It^t!8|SKiqCYun7HTrzocIsm@bBT3_y3nTc5KXF&6rV2HDV@TEAxtYt8-ns)@yWz>F(~sk@@eC ze<_@dGfJsO%;aljPR08{Wt_{RkjbvgF4$_i#B`K*M>t_dDbUPCm%H+sUOS3Xe8#zmP{Tqm*jIOukm;o_Oz6n9E7gY7Sf@X+6#+9XHO>es^og zith4tSN1_vNorjC{#ZC+Mk&>ZnS8CxnRu)F;GB8U znYIfUZ_5|VD0Q1AVkTcJ^FX}Sxo(m-JFb`{4OcXlmg(&3^|@GJMk&>ZnS8CxtKzM` zrtD<->Y7WszBgOT^=p{Jb!^p$nS8CxYvR43+jHJGO>F=0YyBnv_Og7TFU~aHHpth? zoQv152Zh2<6J35jtIVW~<#)goUj^8@kva|JN3XZh8pwJOH^@rpcx8KqWeB4+Zn zGOvsGY@Cb!I?rFTQt`u#QmPR%`C6HW;`Qsn2l-%-%O?dklA`8~Cu_n9GfJsO%;alj zE-o-P+jW_9;e;8bR3m2cwK9*y>(^FcoNFWNXOh9Zs>Cymn90}5ydmDVbgm1`og}Gw zSJFUOVMZy{h?#t?%$wr%^K;SL@?F$!|CDE7eny#}(RkhUrPqoO`$~->DJj^H8z&sH+m{CeKVkTcJb17cG4>HcP6|C>d+_FZ8 zIjq%HBWCioGEdGi%WAOGF&~45Uy`LS%wY+v8Zncvm3d3N{+v1ETuyp!IlO!YgexoO z`Cty``&1)l^0hK=Ut|tb)RkF-p*3ShDbZnS8Cx zyBC?)d{6fFGWX?@ua)_ccwg7oLBBoAs@o1bbFw63oWs&gRr;wG`C6GDi`UO}TXGR- z?DVW%^~nv7{}2z%D5V-PldqNe=Q%UCK=<=9?GEd%vA7cpW|UHmn90}5{EK+~TnBSD zx&~zZTLLhLBLLNinS8Cx_-=qZ$g;kUO8sU-o&si+QjM6&H)iH|N)M{g|ERwKKz!8F literal 674972 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 z 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 CwOnWb diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xab b/si4/ps5ws.si4project/soft_ps5ws.sip_xab index 28241b7082797a5256eec3999614ad7b08a69e04..5bf140e4cc6d7c577cfaf98e9878e11daf1017e4 100644 GIT binary patch literal 184320 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 HtOWiK)LnOL literal 180224 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 z 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 diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xad b/si4/ps5ws.si4project/soft_ps5ws.sip_xad index e4c7691369d07a3e6c71db8c580686ece5167940..01d23be21307fe73e4fcca47ecfa7687fc63abdc 100644 GIT binary patch literal 2128 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 delta 13490 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 literal 204 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 MY@+#_>y;S%Ut3`HW@S~>)RJ4{zsSDiZN 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 diff --git a/si4/ps5ws.si4project/soft_ps5ws.siproj b/si4/ps5ws.si4project/soft_ps5ws.siproj index 4ab4c6aea00ff66ff077aab8404a5ed7a1ba4cc5..df6d35c8cb8e18750abfbcd76fd2d655522a6fcb 100644 GIT binary patch literal 16584 zcmeI3`)`v~7{^cDU~E$qRIWon=D-Vc1*Q{lNI*ro2)L1n!`ZdnR_Ce|L9x&+_5J|FVKW7yiEku~>C95NRw9TJgxe9&-D=g+r%( zlJbSJl-i2u)!Ij{PzqnE3F2QcE|tNtK}PLpm+b0W*Jn@47Y4Mcc;suek7t{opK&R2 zOvZxM(WX#sbHdJy%=sqI;ds2iQsn?tr2SZ~QkUWLKmm<$DRQh$#H!(%U{hmVq`ug? ztSoBZn_Yo^J>V*(&H&Km+HaVE>6nRQ6daoa@nlVleGJKCN{*Y4IKgn~Bq?2&)D^K}exmcv~3(owUU@5;M$Kd0U+UnX!(#BjQkIA3SIyYlg%J(%GZi3mj>82YQ z?JdTndN>lMrQ_rCzw7Z4>&FgEB3A+uy?29BH{pFuT8@$*V^WzM8)Vpu_WlvM&OCDv z99!_jT<*|sqiqsnQav1#D`H_wJNCB^jr%nJtexlYn@+otaBaEvuq zCz8P$*k8KbKA7hVcD>yHqm-`(eflss762E$d4ZWDV^R)BF2bw%V&?#P`eI8*)uxnh z8T#=r05nSbgf8sJbvNTuf}@oKWc#|#JU{yN7I54KK%=z}nhHBQhPMo*af}2l&Buq^ zo^#;b&h^^)NJMn=UiBWvr36PS^Ks=&cfQ^aj#U6OM*G)%Ny}|BE=7*4hr`y^ z&1OF8?q}MOe3byidLw-s3up$(dL(~h;Aq{>u=DQQTgp*?oPwh5QZN~yy$$)uI&Kl1 zF2<$Ek@d%9BpSAJwpMEP3AbM#LcfjzP@#5(&PR@!>0(?egQJzBqf+ZD*H;bSo$?(8 z$2$P%2JIcPV5Z?QF6D8ooW8K4#J(lCgCnxh&ByPtpW!^iJvIF&i#-N0CgqKf>Gg2i z($cGkw*pQsjH?KaKaj9=n{g>}7?bkGNB7*-%HdIMX?N$D@31fA9FnJfLBi5)#-+S` zY&=L*48rjE~y@=w|I#Q8(jKd={K8#-+$HhX$$H z&$o-});Rl_R`lyOJT0ad$7hF_ADwY2kE1?UD697`wQjO`<*vG)yO58EvQZDm+GiLb z(FG0&A1df@;)wX z>-9&~IXK_B2attal!7m!&O+ft6aE=7*w zUbA(3nsGB0oh`+F<`DXH1ppBr{Sr4bkjy_5UXNq2Argy(EF2uc$*Y^K#QKqEF@v>t zqHPl6Qi7v(xkw&aa|;KTAs<(R8>beIk@RA$gSelO>u%HXoE*8I@z&uDE%sfuKlQ*` zXFn4|VQ~%SmXTmb?`DDAAjYJ~k>}UWxk4yh+gxwoCi~KT?mhb?;7o)$P1CJRMo89e zP1Cr6qjht($8i;yjeQ%FNNOl=L`01305#c4zv1Q{w3u-ZGTIG29r8uZSfrOGmYOYUdf=OL+?UI1hAg z)gIW-{hOr13}S9veARQm$C+n5j&`M^>e%e|>)FV^NdQ!={iU8~Bs0dPn2(wJ8D2X} iSoJp`KQuRfbr16K9QHF?0f_f`=s!#cS~`Ze4E+OQDco!T literal 19536 zcmeI4d2Ccw6vpq^A_!KtBFH9X6|n7;wooaEr9eTVv49K7;B@*rlu4P+Fdf7yh-geS z5(H&Q3_=0{wj-|*)2)%Z8p&wTTG=TwvT z%f08GyHtNirRFJ>U96NE4_^mQ_u=Dz8A0H3YinyL9uGuAk;Vech*xg&l8^8Itn|xe zhkbu$DfI!OeYMwjR|;RLQt@vvE|tM?fsC5b{zVm=qgIDgSy&pNoON>k1 zfG=vB;sH3A2-ioNlHo*wVLW#fUw&>M`r{Rh&4<9FNc-_Fl9t_OT#EfM8Mgv(FdD0? zUEE~e=zitZvUOv@@qrwrt^m*&?H#u&)f+!=70?)$a>g}sWH25|gd%mO^+u&G+%xUB zN{s7g0jDd>;Y`nHr%v!1?j9U1{3nc(!|^G+^-}nH?T;|7v+<8#&|qAO9G(1V#Tw^F z>dotqdk%ro~_%$jqrc?eTDs<%8cr4SsS zx=E=7zPUqtS`SIfZZj_B9@q01#+I0f^2BgEKQ;r-9Jqt_Jg-EkV|ZkU$enSWu6qp2 zkjrXz)H`(#$1KY4l;7c^)I*F*x%*=>)YK4M97-hpX4O8;-#mSZ`B5P^qSR5HwReMK zHh%6UpfN7xo@YwRO3ebOVa&>#o~nB$fm-buw%I4?i^G(<5zh;-TZ~DOqqQ(n z8>o#WP3wmai}4@ZviBrc64l{^Bb8@#-!353Dd~zsMPYD-{0jtvpP$uomi~g z3`lf*rBZo#o)*v;lgi|{K!%NIH~08t4>_&{N7muoo1j~~CKMgRBSUG9$>w<2(1G1^ z?u^uYU5NF}M2u_h+tQN;W}r$pXp|Xa8>GGGZ@wT;U#?g7@hkgAq5#NKkW(eMwE_&Ge z#Tk=IapXcKzz+jEBY;debMN)X&$jqJ#6)}w?cv%#_OxlqeKN+S1VXn)du^_yWw#lZa&e4UhW5urFXyK6<8g3g?z>I93pygE9VNHV7?%cpJpj_0x#T0dlr7+R>f=qfpIBvjMBZO8aBI@mMXOF)o$C(a7wm)UI2%EhWbx;8+GgJl>)k<;J6i$C#AEk>_0g zf=U@SqJ3~f;a=v)a;yu##T$>+F7I!j!G;9|#-*J6$a?^;a|NS%=GP~CY~uZ%EEG9i z04Qx1Jsx6Qiv8GGUt5-$H&c%Kho#ro?}JBy_DD=9JTl}xOt%=9;u^dSN27Y9Qd=s9 zr#aSwN1^sx$d_JXT*^JJLksI;iAZum)Ub*B(vhjDeKYpGGpKzW^{%k<V30H88)JQpd@z`@0$fs zhabcnvlgW1VM78bQYB%x7?W~1f@LrqjwfPK^Y(nE9D5@YMSje|faRKRfc8eO0jy*H zfukjV=UQ+7UDA2?OW@c6+&184u^dc!6FMWd($qKsfN`nz@}o&Go%}c%aMr>nj9=M=NzN z1sme`-&askT9gqtp|SCkuE(n|t_P#;*@qV%q^5UkZjNACRJz1GkgcN|S{wGX_`bq=`Vcq{1|)ie zJSf!g7?Tnl%jO$c`SjX+cj~^`cpO$&V{T!Nq$kXjwCpxxQj%j;k$Ly_=JXx4?d;wb z-yYsK1IJ;2L|1Q;wCpxxQsn5I&pc{iUnGy3oyY!q9{F)4>cv55muTm=GhZ_<<>shQ z3ymv$@~cbNy$Fsgz%cc1PdY+EG(rx4f3!?2p{X<^Ci7UjW82B%kKnXQs{zyJy>Dn#VHq2((cOwYgvBb!;Oz z8aJkaNsT;~oXdTRUf^~c+WgxCdV4$hkuj+|@P#wa`0M;36Q>$~)zI`k0M^*~+Wo=R mON>i#ZJxo=z>yv3lM~?i3|SNc(Cyk`3~C;A4T9ZbT>>>>>>>>>>>>>>>>>>>>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 2b5f684..0000000 --- a/source/app/app_task_adc.c +++ /dev/null @@ -1,351 +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 >= R.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 >> R.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 >> R.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 >> R.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 = (R.p.cc_blur_all_out_threshold); - //s->diff_threshold1 = (R.p.cc_blur_all_out_threshold1); - //s->diff_threshold2 = (R.p.cc_blur_all_out_threshold2); - //s->should_show_times_threshold = (R.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] >= R.p.cc_blur_all_out_d_threshold) || (s->SHA_diff[0] >= R.p.cc_blur_all_out_d_threshold) || (s->SHA_ddiff[0] >= R.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 <<= R.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 >> R.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 << R.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 >= R.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] >= R.p.weight_show_limit[i].times) - { - L3_task_show_times_reset(); - s->pool_val = s->val; - G._total_weight = s->pool_val; - R.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); -#if 0 - 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); - s->u16_v = (vU16)(s->pool_val & 0x0000ffff); - L0_uart0_ushex(s->u16_v);//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); -#endif - TTSS_Task_end(); -} - - -void L3_task_show_times_reset() -{ - U8 i = 0; - for(i=0;iok) - { - TS_PH4_modbus *ts_modbus = (TS_PH4_modbus *)ph4->buf; - 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); - - switch(ts_modbus->oper) - { - case 0x06: - case 0x10: - //重新计算重量 - R.total_weight = L3_count_std_weight(G._total_weight); - //持久化 - L3_eeprom_persist_param(); - break; - } - } - } - #endif -} - - diff --git a/source/app/app_task_uart0.h b/source/app/app_task_uart0.h deleted file mode 100644 index 347829a..0000000 --- a/source/app/app_task_uart0.h +++ /dev/null @@ -1,11 +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(TP_Handler_X *ph4); - -#endif diff --git a/source/app/common.c b/source/app/common.c deleted file mode 100644 index 3b5bf8d..0000000 --- a/source/app/common.c +++ /dev/null @@ -1,230 +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*)&R.p,(U8*)eep_param.buf,sizeof(R.p));//防止dlen>sizeof(G.P)引起的内存错误 - } - } -} - -void L3_eeprom_persist_param() -{ - U8 dlen = sizeof(R.p); - eep_param.filter = EEPROM_PARAM_FILTER; - eep_param.len = dlen + 2; - Lc_buf_copy_uc((U8*)eep_param.buf,(U8*)&R.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; -} - -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; -} -#endif - diff --git a/source/app/common.h b/source/app/common.h deleted file mode 100644 index fb88fb8..0000000 --- a/source/app/common.h +++ /dev/null @@ -1,75 +0,0 @@ -#ifndef APP_COMMON_H -#define APP_COMMON_H - -#include "../clib/type.h" - -#define APP_VERSION 0x10 - -#define D_MCU_BIGENDIAN 1 -// #define D_MCU_LITTLEENDIAN 1 - -#define D_COUNT_WEIGHT(adc) ((S32)((1000.0 * R.p.weight_max * (adc)) / (2 * 0x7FFFFF / 1000 * D_ADS1213_GAIN_VAL * R.p.lmd))) - -enum tp_handle -{ - TP_HANDLED, - TP_UNHANDLE -}; - -/** - * EEPROM 存储结构 - */ -#define EEPROM_PARAM_DATA_MAX 90 -#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; - -#define baud_rade L3_baud_rate_change(G.p.baud_rate) - -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; - -#define D_ch_max_num 4 -typedef struct global_param -{ - //EncryptInfo - McuEncryptInfo e; - - //Global Variables - S32 weight[D_ch_max_num]; //4路重量 - S32 _total_weight; //实际重量*1000 - S32 _total_zweight; //实际皮重*1000 -}GlobalParam; - -extern struct global_param G; -extern struct ts_eeprom_param eep_param; -extern struct ts_eeprom_enc eep_enc; - -extern void L3_param_init(void); -extern int L3_mcu_id_ok(); -extern S32 L3_count_std_weight(S32 weight); -extern void L3_eeprom_persist_param(void); - -#endif - diff --git a/source/app/main.c b/source/app/main.c index 1ead5a2..daf14a2 100644 --- a/source/app/main.c +++ b/source/app/main.c @@ -79,23 +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_board_config(); L0_uart0_buf_init();//串口初始化 EA = 1; //Lc_delay_ms(100); L1_tick_init(); L0_timer0_Init(); - //L0_timer1_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); } //=============================================== @@ -103,72 +109,39 @@ void L0_main_init(void) //=============================================== void main(void) { -//----------------------------------------------- -//系统初始化 -//---------------------------------------------- + //初始化 L0_main_init(); - L0_reg_init(); - L3_param_init(); - L2_485_init(); - L0_ADS1213_INIT(); - L3_task_adc_init(); - L0_uart0_sendArray("v2.7",4); - P35 = 0;//led on - -//----------------------------------------------- -//系统主循环 -//----------------------------------------------- -#if 0 //看门狗 - 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; LED1 ^= 1; - //L0_uart0_sendArray("abcdefg",7); } - #if 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]); - //单路滤波 - 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); - #endif + //L1_ADS1213_main(); + + //单路采集滤波 + 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 bc0a59e..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 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<buf; @@ -157,6 +127,7 @@ U16 L3_modbus_slaver_ack(TS_PH4_modbus *pmodbus,TS_PH4_modbus *pModbusAck) } break; } +#endif case MODBUS_OPER_WRITE_M: { U16 i = 0; @@ -205,50 +176,21 @@ void L3_modbus_master_handler(TS_PH4_modbus *pmodbus,MD_SLAVER_INFO *p_slaver_in } } -//MODBUS协议解析函数 -//超出D_tp_handle_x_len,不继续保存数据 -void L1_s2b_PH4(struct _tp_handler_x *p) -{ - //p->modbusstmp = D_sys_now; - if(p->head == 0) - { - p->head = 1; - p->max = D_tp_handle_x_len; - p->sp = p->buf; - p->num = 0; - p->sp[p->num++] = p->reg; - } - else - { - if(p->num < p->max) - { - p->sp[p->num++] = p->reg; - } - } -} -#if 0 -//MODBUS协议分割函数,该函数应该被timer0中断调用 -//本函数负责检查modbus crc,不负责校验业务ID -//校验业务ID,在具体的业务处理函数中实现 -void L1_modbus_split(struct _tp_handler_x *p) +void L3_task_modbus_handler(TP_Handler_X *ph4) { - if((p->head == 1) && (p->num >= D_s_modbus_min)) + if(ph4->ok) { - 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]) + 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) //从机 { - if(p->ok == 0) - { - p->ok = 1; - } + U16 acklen = L3_modbus_slaver_ack(ts_modbus,&s_uart0_ack); + L0_uart0_sendArray((U8*)&s_uart0_ack, acklen); } - p->head = 0; } } -#endif -/****************************************************************************** -** End Of File -******************************************************************************/ 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_config.c b/source/bsp/bsp_config.c index 9145292..33f0363 100644 --- a/source/bsp/bsp_config.c +++ b/source/bsp/bsp_config.c @@ -1,5 +1,6 @@ #include "bsp_config.h" -#include "../tpc/tpc_modbus.h" +#include "../msp/UART0.h" +#include "../msp/eeprom.h" //////////////////////////////////////////////////////////////////////////// ///@copyright Copyright (c) 2018, 传控科技 All rights reserved. @@ -15,58 +16,6 @@ ////////////////////////////////////////////////////////////////////////////// //struct _s_sysclk s_sysclk; -GlobalRegister R; - -void L0_reg_reset() -{ - U8 i = 0; - //R.p.reset = 0; - R.p.adc_ch_status = ADC_status_ch2_Ready | ADC_status_ch3_Ready | ADC_status_ch4_Ready; //修改采集通道 - R.p.slaver_id = D_UART0_485_SLAVER_ID; - //R.p.zero = 0; - R.p.weight_max = 500; //500kg - R.p.lmd = 2; //2mv/v - - R.p.cc_blur_ch_avg = 6; - R.p.cc_blur_ch_shift = 2; - R.p.cc_blur_all_shift0 = 2; - R.p.cc_blur_all_shift1 = 4; - R.p.cc_blur_all_out_d_threshold = 200; //0.2kg - R.p.cc_blur_all_out_dd_threshold = 200; //0.2kg - - for(i=0;i +#include "../bsp/bsp_config_const.h" #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_STC_8A 51 -#define TYPE_MCU_STC_8F 52 -#define TYPE_MCU_STC_8G 53 -#define TYPE_MCU_SHC6601 66 -#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 -//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>.SysTimer TYPE -#define TYPE_JIFFIES_5MS 1 -#define TYPE_JIFFIES_10MS 2 -#define TYPE_JIFFIES_25MS 3 -//<<<<<<<<<<<<<<<<<<<<<<<<<<<.SysTimer TYPE end - -//>>>>>>>>>>>>>>>>>>>>>>.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 - -//>>>>>>>>>>>>>>>>>>>>>>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 -//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +//STEP 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TYPE_UASER_BOARD SELECT #define TYPE_UASER_BOARD TYPE_BOARD_WEIGH_0B +//STEP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +//STEP 2 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TYPE_UASER_BOARD CONFIG #if(TYPE_UASER_BOARD == TYPE_BOARD_WEIGH_0B) - #include - #include #include - #include "../cpu/stc_stc8f.h" + #include "../cpu/stc_stc8hxx.h" #include "../cpu/stc_macro.h" //基本配置(工作频率、时钟、看门狗、字节序) - #define TYPE_MCU TYPE_MCU_STC_8F + #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_11M + #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 //是否代码加密 + + + #define D_MCU_NAME "STC8H3K48S4" + //存储器特殊参数地址配置 + #define D_MCU_SPEC_PARAM_CHIPID 0xBFF9 + //...其他参数 //串口配置 #define D_uart0_BRT BRT_115200 @@ -151,8 +92,8 @@ #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() P32 = 1; - #define D_UART0_485_RX() P32 = 0; + #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 @@ -163,111 +104,38 @@ #define D_MODBUS_REG_MAX_NUM 32 //每次最多读取/写入的寄存器数量,此处的数量要注意和 D_tp_handle_x_len 对应 //外设定义 - #define LED0 P10 //D4 - #define LED1 P35 //D4 + #define LED0 P17 //D4 + #define LED1 P54 //D4 //EEP存储地址定义 - #define D_EEP_SECTOR_SIZE 0x200 - #define D_EEP_PARAM_ADDR (D_EEP_SECTOR_SIZE * 0) //eeprom参数区扇区地址 - - #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 - #define D_Cdelay_200us 20 - #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) - -#elif(TYPE_UASER_BOARD == TYPE_BOARD_433_0A) + #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 +//STEP 2 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -#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 -#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_weight_show_limit_num 5 -#define D_weight_std_num 10 -typedef struct global_register -{ - //RO Register - S16 reserved1; - S32 total_weight; //净重(显示重量)*100 - S32 total_zweight; //皮重*100 - //RW Register - S16 reserved2; - struct { //需要持久化的参数,不能超过72字节,否则会导致eeprom溢出 - 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 - struct{ - S16 weight; - S16 times; - } weight_show_limit[D_weight_show_limit_num]; - struct { - S16 weight_range; //量程 x 100 - S16 ratio; //重量计算系数,默认100,保留两位小数,相当于x1 - } weight_std[D_weight_std_num]; - U16 baud_rate; //波特率 - U16 stop_bits; //停止位 - }p; - S16 reserved3; -}GlobalRegister; - -//寄存器内存基地址 -#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)) - -extern GlobalRegister R; - -//Step4: IRQ Config -#if (TYPE_MCU == TYPE_MCU_STC_8A || TYPE_MCU == TYPE_MCU_STC_8F) +//Step3: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>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 @@ -292,20 +160,71 @@ extern GlobalRegister R; #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 +#define D_Cdelay_200us 20 +#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) +//STEP 4 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +#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 "../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 93% rename from source/bsp/bsp_cs1232.c rename to source/bsp/cs1232.c index 45ffb11..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,7 +205,7 @@ 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)) 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 b39f16d..bab0040 100644 --- a/source/bsp/bsp_cs1232.h +++ b/source/bsp/cs1232.h @@ -23,14 +23,15 @@ #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/bsp_485.h b/source/bsp/rs485.h similarity index 69% rename from source/bsp/bsp_485.h rename to source/bsp/rs485.h index e3629e4..0bdba72 100644 --- a/source/bsp/bsp_485.h +++ b/source/bsp/rs485.h @@ -6,8 +6,8 @@ //485_RE P33 //485_DE P32 -#define D_485_TX() P32 = 1;// >750us -#define D_485_RX() P32 = 0; +#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 c8250bf..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 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) reentrant; +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); @@ -106,7 +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 int libc_strlen(char *str); +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 a84d004..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 2048 +XDATALEN EQU 3072 ; ; PDATASTART: PDATA memory start address <0x0-0xFFFF> ; The absolute start address of PDATA memory 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.h b/source/ctask/task.h index ee75f39..33cde0e 100644 --- a/source/ctask/task.h +++ b/source/ctask/task.h @@ -52,6 +52,7 @@ typedef struct _ts_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_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) diff --git a/source/ctask/tick.h b/source/ctask/tick.h index 29c91ac..bc47af5 100644 --- a/source/ctask/tick.h +++ b/source/ctask/tick.h @@ -15,7 +15,7 @@ struct _s_nos_tick_ { - vU32 jiffies; // noos系统定时器最小技术单元 + vU32 jiffies; // noos系统定时器最小计时单元 vU32 t_1s; vU8 t1s_heatbeart; //noos 系统定时器整秒时刻标志,需要软件清除 }; @@ -26,7 +26,7 @@ extern struct _s_nos_tick_ s_nos_tick; #elif(TYPE_JIFFIES_10MS == D_sys_Jiffies) #define HZ 100 #elif(TYPE_JIFFIES_25MS == D_sys_Jiffies) - #define HZ 50 + #define HZ 40 #endif #define JIFFIES (1000/HZ) 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/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-> 8; AUXR |= 0x10; //启动定时器2 - -#elif(BRT_19200 == D_uart0_BRT && SBIT_1 == D_uart0_SBIT) //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) //19200@11.0592MHz - xxx - //使用第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) //9600bps@11.0592MHz - xxx - 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 L0_uart0_buf_init(void) { ts_uart[uNum0].p = &ts_uart_send_shop; - ts_uart[uNum0].p->now = 0; + 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 = D_CMD_Filter1_ff; - //ts_uart[uNum0].t->head_1 = D_CMD_Filter1_fe; 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 = 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); //打开串口中断 @@ -150,9 +112,10 @@ void INTERRUPT_UART(void) D_SERVE_UART if(L0_uart0_IntRI()) //如果是U0接收中断 { L0_uart0_IntRIClear(); //清除接收中断标志 - L0_timer1_start(0); ts_uart[uNum0].t->reg = L0_uartN_get(uNum0); - ts_uart[uNum0].tp_handler(ts_uart[uNum0].t); + //ts_uart[uNum0].tp_handler(ts_uart[uNum0].t); + L1_s2b_PH4(ts_uart[uNum0].t); + L0_timer1_restart(); } if(L0_uart0_IntTI()) //如果是U0发送中断 { @@ -168,50 +131,30 @@ void INTERRUPT_UART(void) D_SERVE_UART ts_uart[uNum0].p->max = 0; ts_uart[uNum0].p->now = 0;//可以发送下一个数据 #if (D_UART0_485_TYPE != TYPE_485_NONE) - D_UART0_485_RX() //切换到接收状态 + D_UART0_485_RX() //切换到接收状态 #endif } } //NOP(); NOP(); NOP(); } -#if 0 -void timer1_isrHanddle (void) D_SERVE_TIMER1 -{// - TF1 = 0; - //s_nos_tick.uart0_free = 1; - //if(s_uart0_rec.head == 1) //收到一条协议 - if(s_uart0_rec.head == 1) //收到一条协议 - { - s_uart0_rec.head = 0; - P10 ^= 1; - if(s_uart0_rec.ok == 0) - { - s_uart0_rec.ok = 1; - //Lc_buf_copy_uc(); - } - } -} -#else 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)) { + //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]) - { - if(p->ok == 0) - { - p->ok = 1; - } + { + p->ok = 1; + LED0 ^= 1; } - LED0 ^= 1; } L0_timer1_stop(); } -#endif diff --git a/source/msp/UART0.h b/source/msp/UART0.h index 91224b6..37bd779 100644 --- a/source/msp/UART0.h +++ b/source/msp/UART0.h @@ -53,8 +53,8 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #ifndef _uart0_H #define _uart0_H #include "../bsp/bsp_config.h" -#include "../tpc/tpc_modbus.h" -#include "uartN.h" +#include "../tpc/modbus.h" +#include "uart_x.h" //#include "../tpc/tpc_x.h" diff --git a/source/msp/eeprom.c b/source/msp/eeprom.c new file mode 100644 index 0000000..78ff57c --- /dev/null +++ b/source/msp/eeprom.c @@ -0,0 +1,222 @@ +//////////////////////////////////////////////////////////////////////////// +///@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) + { + 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 "../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); @@ -37,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/msp_eeprom.c b/source/msp/msp_eeprom.c deleted file mode 100644 index 51ace62..0000000 --- a/source/msp/msp_eeprom.c +++ /dev/null @@ -1,151 +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" - - -#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 7131189..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) D_SERVE_TIMER0 +void timer0_isrHandle (void) D_SERVE_TIMER0 {// NOP(); NOP(); NOP(); TF0 = 0; @@ -99,96 +43,56 @@ void timer0_isrHanddle (void) D_SERVE_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模式 - TMOD &= 0x0F; //设置定时器模式 - TL1 = 0x00; //设置定时初值 - TH1 = 0xEE; //设置定时初值 - TF1 = 0; //清除TF1标志 - TR1 = 1; //定时器1开始计时 - ET1 = 1; //add by cc -} -void L0_timer1_Init_1ms(void) //1毫秒@11.0592MHz -{ +#else + U16 val = D_TIMER_COUNT(1,D_sys_MainFre,600); AUXR |= 0x40; //定时器时钟1T模式 TMOD &= 0x0F; //设置定时器模式 - TL1 = 0xCD; //设置定时初值 - TH1 = 0xD4; //设置定时初值 + //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(void) //600微秒@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 = 0x14; //设置定时初值 - TH1 = 0xE6; //设置定时初值 + //TL1 = 0x14; //设置定时初值 + //TH1 = 0xE6; //设置定时初值 + TL1 = val; //设置定时初值 + TH1 = val >>8; //设置定时初值 TF1 = 0; //清除TF1标志 TR1 = 1; //定时器1开始计时 ET1 = 1; //add by cc -} - - -//0x7F示波器测试大约40ms,led闪烁 肉眼可见 -void L0_timer1_reset(void) -{ - TR1 = 0; - TL1 = 0x14; //设置定时初值 - TH1 = 0xE6; //设置定时初值 - TR1 = 1; - TF1 = 0; -} -#endif//D_sys_MainFre) - - - -void L0_timer1_start(U16 v) //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 } void L0_timer1_stop(void) diff --git a/source/msp/time.h b/source/msp/time.h index f923c0b..6d78f09 100644 --- a/source/msp/time.h +++ b/source/msp/time.h @@ -7,7 +7,8 @@ #include "../ctask/tick.h" extern void L0_timer1_stop(void); -extern void L0_timer1_start(U16 v); +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/UARTN.C b/source/msp/uart_x.c similarity index 86% rename from source/msp/UARTN.C rename to source/msp/uart_x.c index 6f84292..3be3670 100644 --- a/source/msp/UARTN.C +++ b/source/msp/uart_x.c @@ -54,11 +54,11 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 L0_Usend_uc------UserDef ----------------------------------------------------------------------------------------- ********************************************************************************/ -#include "uartN.h" +#include "uart_x.h" TS_uart_reg idata ts_uart[SERIAL_MAX_NUM] = {0}; -void L0_uartN_set(U8 uartx,U8 x) reentrant +void L0_uartN_set(U8 uartx,U8 x) /*reentrant*/ { switch(uartx) { @@ -99,30 +99,27 @@ void L0_waitFree_uartN(U8 uartx) } void L0_uartN_sendArray(U8 uartx,void *buf,U16 len) -{ - if(len > 0) +{ + 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) { - 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_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 + for(ts_uart[uartx].p->num = 0;ts_uart[uartx].p->num < len;ts_uart[uartx].p->num ++) { - //不使用内部buf,如果再发送完毕之前,参数buf被回收,发送会出错 - ts_uart[uartx].p->p = (U8 *)buf; + ts_uart[uartx].p->buf[ts_uart[uartx].p->num] = ((U8*)buf)[ts_uart[uartx].p->num]; } - L0_uartN_set(uartx,ts_uart[uartx].p->p[0]); + 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) @@ -142,6 +139,7 @@ void L0_uartN_us(U8 uartx,vU16 ww) 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; @@ -152,6 +150,7 @@ void L0_uartN_ul(U8 uartx,vU32 ww) 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); @@ -159,6 +158,7 @@ void L0_uartN_0d0a(U8 uartx) 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); @@ -167,6 +167,7 @@ void L0_uartN_uchex(U8 uartx,U8 ww) 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]; @@ -178,6 +179,7 @@ void L0_uartN_ushex(U8 uartx,vU16 ww) 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]; @@ -192,7 +194,7 @@ void L0_uartN_ulhex(U8 uartx,U32 ww) void L0_uartN_sendstr(U8 uartx,U8 *str) { - L0_uartN_sendArray(uartx,str,libc_strlen(str)); + L0_uartN_sendArray(uartx,str,Lc_strlen(str)); } void L0_uartN_uchexArray(U8 uartx,vU8 *buf,U16 n) diff --git a/source/msp/UARTN.h b/source/msp/uart_x.h similarity index 82% rename from source/msp/UARTN.h rename to source/msp/uart_x.h index ce65476..bb8abf2 100644 --- a/source/msp/UARTN.h +++ b/source/msp/uart_x.h @@ -52,30 +52,26 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #ifndef _uartN_H #define _uartN_H -#include "../clib/Clib.h" +#include "../clib/clib.h" #include "../tpc/tpc_x.h" +#include "../bsp/bsp_config.h" #define D_uartN_free() (0 == ts_uart_send_shop[uartx].max) #define D_uartN_busy() (0 != ts_uart_send_shop[uartx].max) +#define D_BRT_COUNT(t,clk,uartBRT) (U16)(65536- (clk / (4 * uartBRT * t))) -//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -////fixme:和cpu的程序容量息息相关 -#define D_send_buf_max 16 /// 9600bps = 10000bps = 1000 Bps = 1Byte/ms - /// 19200bps = 20000bps = 2000Bps = 2Byte/ms = 1Byte/0.5ms - /// 128Bytes = 128*0.5ms = 64ms -#define D_send_buf2_max 8 //此处改动会影响L0_uartN_ulhex函数 typedef struct _ts_uart0_send_buf_ -{//8byte +{ vU8 num; //接收到的数目注意数据长度的范围 vU8 *p; vU16 now; /// 当前buf所在的位置 0------(max-1) vU16 max; /// 当前buf的最大值,也就是需要发送的长度 vU32 over; /// 结束等待标志,over累加到某个值时,结束等待 vU8 ok; /// 发送完成标志 - vU8 buf[D_send_buf_max + 1]; + vU8 buf[D_UART_send_buf_max + 1]; /// U8 buf2[D_send_buf2_max]; - vU8 buf3[D_send_buf2_max]; + vU8 buf3[D_UART_send_buf2_max]; //// U8 buf4[D_send_buf_max]; /// U8 buf[D_send_buf_max + 1];//buffer 的第一位是 长度 }Ts_uart_send_buf; @@ -83,20 +79,15 @@ typedef struct _ts_uart0_send_buf_ typedef struct _TS_uart_reg { Ts_uart_send_buf idata *p; - //eUSCI_UART_Config *c; - //int sta; - //U8 heartbeat; TP_Handler_X *t; - void (*tp_handler)(TP_Handler_X *); //reentrant; + void (*tp_handler)(TP_Handler_X *); U8 *ack; //ack }TS_uart_reg; -//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -#define SERIAL_MAX_NUM 1 extern TS_uart_reg idata ts_uart[SERIAL_MAX_NUM]; extern void L0_uartN_init(U8 uartx); -extern void L0_uartN_set(U8 uartx,U8 x) reentrant; +extern void L0_uartN_set(U8 uartx,U8 x); extern U8 L0_uartN_get(U8 uartx); extern void L0_uartN_sendArray(U8 uartx,void *buf,U16 len); extern void L0_uartN_uc(U8 uartx,U8 ww); diff --git a/source/tpc/tpc_0d0a.c b/source/tpc/0d0a.c similarity index 98% rename from source/tpc/tpc_0d0a.c rename to source/tpc/0d0a.c index e713210..da7a66f 100644 --- a/source/tpc/tpc_0d0a.c +++ b/source/tpc/0d0a.c @@ -1,4 +1,4 @@ -#include "tpc_0d0a.h" +#include "0d0a.h" #include "../clib/clib.h" //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> diff --git a/source/tpc/tpc_0d0a.h b/source/tpc/0d0a.h similarity index 100% rename from source/tpc/tpc_0d0a.h rename to source/tpc/0d0a.h diff --git a/source/tpc/tpc_ccmodbus.c b/source/tpc/ccmodbus.c similarity index 99% rename from source/tpc/tpc_ccmodbus.c rename to source/tpc/ccmodbus.c index 1ef753f..b847efa 100644 --- a/source/tpc/tpc_ccmodbus.c +++ b/source/tpc/ccmodbus.c @@ -1,4 +1,4 @@ - + /***************************************************************************** update by cc @201501101001 针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 @@ -29,7 +29,7 @@ msp/uartx.c 底层代码 和cpu相关 ----------------------------------------------------------------------------------------- ********************************************************************************/ -#include "tpc_ccmodbus.h" +#include "ccmodbus.h" #include "../clib/clib.h" #if 0 diff --git a/source/tpc/tpc_ccmodbus.h b/source/tpc/ccmodbus.h similarity index 100% rename from source/tpc/tpc_ccmodbus.h rename to source/tpc/ccmodbus.h diff --git a/source/tpc/tpc_debug.c b/source/tpc/debug.c similarity index 99% rename from source/tpc/tpc_debug.c rename to source/tpc/debug.c index 639cc5f..59a0e4a 100644 --- a/source/tpc/tpc_debug.c +++ b/source/tpc/debug.c @@ -1,4 +1,4 @@ - + /***************************************************************************** update by cc @201501101001 针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 @@ -29,7 +29,7 @@ msp/uartx.c 底层代码 和cpu相关 ----------------------------------------------------------------------------------------- ********************************************************************************/ -#include "tpc_debug.h" +#include "debug.h" #include "../clib/clib.h" //NUM: 0 1 2 3 4 diff --git a/source/tpc/tpc_debug.h b/source/tpc/debug.h similarity index 100% rename from source/tpc/tpc_debug.h rename to source/tpc/debug.h diff --git a/source/tpc/modbus.c b/source/tpc/modbus.c new file mode 100644 index 0000000..f858244 --- /dev/null +++ b/source/tpc/modbus.c @@ -0,0 +1,62 @@ + +/***************************************************************************** +update by cc @201501101001 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情.d + +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 "modbus.h" +#include "../bsp/bsp_config.h" +#include "../ctask/tick.h" +#include "../clib/clib.h" + +//MODBUS协议解析函数 +//超出D_tp_handle_x_len,不继续保存数据 +void L1_s2b_PH4(struct _tp_handler_x *p) +{ + //p->modbusstmp = D_sys_now; + if(p->head == 0) + { + p->head = 1; + p->max = D_TPC_HANDLER_X_LEN; + p->sp = p->buf; + p->num = 0; + p->sp[p->num++] = p->reg; + } + else + { + if(p->num < p->max) + { + p->sp[p->num++] = p->reg; + } + } +} + +/****************************************************************************** +** End Of File +******************************************************************************/ + diff --git a/source/tpc/tpc_modbus.h b/source/tpc/modbus.h similarity index 97% rename from source/tpc/tpc_modbus.h rename to source/tpc/modbus.h index 80e0890..491bf66 100644 --- a/source/tpc/tpc_modbus.h +++ b/source/tpc/modbus.h @@ -49,14 +49,14 @@ typedef struct ts_ph4_modbus { U8 slaver; //从机地址 U8 oper; //功能码 - U8 buf[D_tp_handle_x_len + 8]; + 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_tp_handle_x_len-1]; + U8 buf[D_TPC_HANDLER_X_LEN-1]; }Modbus03Ack; typedef struct s_modbus_06_ack diff --git a/source/tpc/tpc_x.h b/source/tpc/tpc_x.h index b54545d..8956284 100644 --- a/source/tpc/tpc_x.h +++ b/source/tpc/tpc_x.h @@ -1,13 +1,8 @@ -#ifndef TPC_X_H -#define TPC_X_H +#ifndef TPC_CONFIG_H +#define TPC_CONFIG_H #include "../bsp/bsp_config.h" -#if 0 -#include "tpc_debug.h" -#include "tpc_ccmodbus.h" -#include "tpc_modbus.h" -#include "tpc_0d0a.h" -#endif +#include "../clib/type.h" typedef struct _tp_handler_x {//8byte @@ -16,17 +11,14 @@ typedef struct _tp_handler_x vU8 cashe[2]; vU8 head_0; vU8 head_1; - vU8 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围 + vU8 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围 vU8 ok; //接收协议ok标志 vU8 max; //接收到的数目的最大值 - //vU8 __buf[D_tp_handle_x_len+1];//buffer - vU8 buf[D_tp_handle_x_len+16];//array的第一位是 长度 //协议缓冲 + vU8 buf[D_TPC_HANDLER_X_LEN+16];////协议缓冲 vU8 *sp; vU8 *sp2; //备份值,如果协议需要备份,单独提供备份缓冲区 vU8 ocr; vU8 crc[2]; - vU32 modbusstmp; - U8 i; }TP_Handler_X; #endif