From 266d90df56a15c7f399f302d277fa6bee609df5d Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Wed, 3 Apr 2019 09:34:22 +0200 Subject: [PATCH] fancy tests --- driver/drv/b15f.cpp | 7 + driver/drv/b15f.h | 16 +- driver/drv/b15f.o | Bin 31528 -> 31736 bytes driver/gnuplotscript.gp | 39 +- driver/main | Bin 65928 -> 65976 bytes driver/main.cpp | 30 +- driver/main.o | Bin 16552 -> 18472 bytes driver/test_plot | Bin 37120 -> 1044 bytes firmware/B15F.elf | Bin 16172 -> 18748 bytes firmware/B15F.hex | 774 ++++++++++++++++++++++++---------------- firmware/Makefile | 2 +- firmware/global_vars.h | 3 + firmware/main.cpp | 15 +- firmware/requests.cpp | 10 +- firmware/requests.h | 11 +- firmware/usart.cpp | 25 +- firmware/usart.h | 11 +- 17 files changed, 594 insertions(+), 349 deletions(-) diff --git a/driver/drv/b15f.cpp b/driver/drv/b15f.cpp index 78ad9ac..04f85ff 100644 --- a/driver/drv/b15f.cpp +++ b/driver/drv/b15f.cpp @@ -186,6 +186,13 @@ uint8_t B15F::digitalRead1() return usart.readByte(); } +uint8_t B15F::readDipSwitch() +{ + usart.clearInputBuffer(); + usart.writeByte(RQ_DSW); + return usart.readByte(); +} + bool B15F::analogWrite0(uint16_t value) { usart.clearInputBuffer(); diff --git a/driver/drv/b15f.h b/driver/drv/b15f.h index 6bcf7fc..e111a76 100644 --- a/driver/drv/b15f.h +++ b/driver/drv/b15f.h @@ -125,6 +125,13 @@ public: */ uint8_t digitalRead1(void); + /** + * Liest den Wert des digitalen Eingabeports, an dem der DIP-switch angeschlossen ist (S7) + * \return Wert für gesamten Port + * \throws DriverException + */ + uint8_t readDipSwitch(void); + /** * Setzt den Wert des Digital-Analog-Converters (DAC / DAU) 0 * \param port 10-Bit Wert @@ -190,10 +197,11 @@ private: constexpr static uint8_t RQ_BA1 = 6; constexpr static uint8_t RQ_BE0 = 7; constexpr static uint8_t RQ_BE1 = 8; - constexpr static uint8_t RQ_AA0 = 9; - constexpr static uint8_t RQ_AA1 = 10; - constexpr static uint8_t RQ_ADC = 11; - constexpr static uint8_t RQ_ADC_DAC_STROKE = 12; + constexpr static uint8_t RQ_DSW = 9; + constexpr static uint8_t RQ_AA0 = 10; + constexpr static uint8_t RQ_AA1 = 11; + constexpr static uint8_t RQ_ADC = 12; + constexpr static uint8_t RQ_ADC_DAC_STROKE = 13; }; #endif // B15F_H diff --git a/driver/drv/b15f.o b/driver/drv/b15f.o index a6377d654c741023bd88db829282f6b4dab588a7..d78839da6bf9fc79760f6b74271d898ea8d466d6 100644 GIT binary patch delta 4561 zcmZ`-3vg7`8Q!yGF_A|0Gx=xE zchC90|8dTJ?7e4?{afAmkJ^*(@AyH_v;zSg38bkMoCr+CxRE9P(Wj6Vn21|}OqGi2 zk^59y@8=^kvjUkupKmVCPu2VKl2i?5c)tgw)5lSx{yQ9Kqsg_uy(y5}F&5dbdnV z8rAu2s>`-3;PZ{~rTWt8$TrtK_O3NZ9~r!4@GC}V1kHj^Pyd~6lJ!aMF$X>5zt&(Y zqw{O)Sw7nJc%N#soi{$C5uT&f5`&L37X6$ua^@`U`ki$TzTXVP|IzYS@%o%Rb9$GCAsf*mt?osTaK7oU>x~xe4y50|p&?p7zp1&hy{UC|?r^T#HS!@!?bdDA{0Nq6=Uesy4^<0TO`9#$W~?jKc(OFrsTHiuNLQ0$ zT7}w-^ET#?U}enf9HV|=@IGWO)+&Su;UflX4K^Z9Osm1C8Jz^(Rct)#CTiZA&S8K& zKSRb6t-fS*GVFEZ6S`b@PC$&*i9*d0>I|bUvnp3vE7aBKrr7;LZ4l}a^pV;l)Ht`VxwK3lw&DS{s*_!_~F5qzoO9l<{?_-vQQ@5(Zq>DGtW z{-p4kjlnXV)-BXJ%qZ8GUY_do3AReaWFu0pouK^%;Eaz6HG+7#4z^j9*EUtCM@7^& z!B4_KIX?~Ih<3h9&k`GFj#KmQhDKyWblN(hK7*|hJw^I-33ZW(eGxIrd{C(JN*qRa zL?g2z^}+2TrpJ0uBkozjpSC=&ZHM6BfvV8X??nxH);>Xy)PhkIK*noZMa^4V5YY;) z>J1)abS?_d-NJJd5*4}xsYH=+9(lK3vpmmj7d0>cs5Baov3~_MkDr3}1YVF)@-yK|~ zTI88*)VyKThdG0DRH*X&pGBft2M4XntJ^9v2hwRk#uXP)^VT&P*-LdvP^kNb`tUIP ziedOI$aqw%IO0pSv(x(UOlF9j2U%4=F?az3)W3unMO`zoH%+WBg96An_FihGl<;Q|a0MiC)gXRr-%>eKs; z@MYuKZ9HEyo*x>Y0c0%K!7pqrJ~J^9~t~B5)^gW^lvkkj2uU< zWIXfxsd+P>V0oV53c;5MUd}v%NUc_z5hvVh@Ku8v1GUiC`+d`zn_6yYPt zUa3_Dg4C}=g!=URPyHtlr+y3eQh%56-^>2a0a3R~WIkzpe#O<*Z#k#)2Qi252+u#6 zDi=(Zi>AsIQ)Q52qyH6A@-1+e{RZZ%CVwF_1uwsPj$5A3z&=s^9Kx%#`joNr?;>`o z@cCNAzAX4jyb~kiIXp+rJLktNKeX1*1TXWv@ACL`RR- zVL`*pz!7585osB#4&#Let-7(eMfbkdkmT>I$gepT%dp&+iAobb!Wd&?K{P& znS2GwxU&6aHsfr;bGCBB((7FC9OG^EVuEM?4(tDx%XfaW3~$Hx?vQ{}Ho!aY-s$jm zd``f1V4e%)DR=B$56}OqykM|BM9TcBs~nI*2ggY{Xkb{?v&$(^{-nLA8baCs*U4wqo@T z;%y;y0|~-eP#Z)3{CYgJv6$YeaT;_q;0z6D0_`FC6bf$|i>mhNG?jRJ$e)~xGwsFx ztTpg=6w`FV9U*_?8azXTawIxJ{9fL~YY7w5O+ok%BsPUoKF@Vmd>Sd63sd^}L!9gw jN@#S1pChta*hQlcirmpQoZDP@=gzh6=wBnSC^qSTpu$Iu delta 4529 zcmZ`-3vg7`8NO#>fyf5gkoIr^EfFLkps*DTsgO0T4#XxVn}@t3TayUXYBu4qJe(Ls z2~;G@=L4uvb|^D2opy*jEzpsXROnP|Yu2$dO{cYB#||B9+bAzvp#A@I&t?8$CTHe+ z_uTLMU+3Jr=ia+lE~~?rRCiI}@b`L(Uk&1HFn?r@<2dK3JGUOg#Nch1Fl;O?1S|0L zu*bFqWNk!_7xT8oEpM0 z9j6(wDPwT9Xo7kM*NUoDAF8I-smVwaCUJ3UR2|3c;_6^N*>1tM;%Vq>8Jc;sc<9KE zxh8<)bOjwJ&j~p*>B!CJ)0S_we2FJJ$1Q)<@+$+L@R8*wj_}T3vG$)^{*>j{di*$N z*f1~g{k%rhHYx8|fyBL9RU3TS;9i4igKru9qroo><{(m{)w75b_A$D*Q>r_h0xuk4 z!md^ZDY7|X@HYng8Qs5=JuktjTRfMihI+>w6wJ}8#^4f0_aN137VB2e;&;QnW5(EA zG&l>LmZh|By1;F0~C}4#SZs)o%Vs zhvr*&L&&qEVpdfhW2Ub(8N{Y&DD!0W<6!3D2fs1gy=o`QhdA}C|MOZ7(v> zTk(@hjZjs{ohw-BQ(=7Sh1!bTD$i%LV5QGC_EE1G%tLRLR$s#a;WUGD4K6^z!&=oF zT*2t3>Biy4b*-ZASA7JXWcf?<5Wde?F<>ou-IfT;OCrKj!Cw>hlLViObCkE#UTn_0 zTBzSbd9`-e2(?+L&mci+N~p_)nns$`cZK?0p}vo7weIK_YKu_MTApWjr{F&o{35}B zF8E5pe<}FK1+TncEFP~3yCM7Q<+(p0Z1Rz+(Qc7>~}FRtwNWScP+hiGT=x!?*XoMxLVZ^FrYv7f+;f8Gt$-WPXbW|}wgX7lYAmV^<;u1B z8M0JC4*jgT@qAWL_kF@pby_`Ou#3?>Ei7LWmWvUu(-rNs199Ux^4|Q=@?29FbwB>6 z!oF7ULG)6tS-C_}W3R2$eJ}dGl3H$6&Lw9=+i1OZ7h089XQ%LOM2yrmBJ%S>-Gok3 zcZkT{Lj4nZ>b07ObA&aF?!r+dQ{xINsrwZ+BHTb%-Kt#SN};x)oYWmctrO}=6Zwo# zpAc$4(hXXjXPd|+k$sx5`LFP85PSex$~)XXQn)IqPC?`m?QRvSydnn?CpBwTp6_N6 z`4jey2SyV`jU(@(?yp8z@DTizLHPRy;g_Ljp;mDeEY$8wYr~b?C1NI7Roe}oL?>CE z5z&?j%MVSoeiQAih<3NI`8TWaD}zJ`hRKu~&-Z2O{(PGS&u=F_pA`HPMK=^M?71Eh86fOkRf>BIZ#0WairBlP81}#c>f^qSZw7 z()dnv(zqN0G_Eq(fC6IZ8A!O%SaurA7mVc_#-p$QbY&45IEZ>h3|*Um@J6=l#{HTz{R&ds*=EP2swT zHVwBmYHV%{(fyQqRI37{8~L58m&RX5md5iiKx2A-5Plm4EBF;LLgQ7&KEd|xy03aO z=L+OL-fe95qMYLVh-11xww8R=XNy{YZnB&-Sx%cQ@0l!F_KkcbyyR2lpCYf^VXv^4 zyTiUnbFP%gbp+>V7RMMn-m*4a`6I&S&%$?);I9k&ZG!I_ODEKB&b3qUGR{vu9_!;_ z^(GQ=t=>VJFpCrM`RZWC{m%G++J@OpJ82_4(=G9vZA^4wt^*1^AUwz93&k3e_ah=x@TctZr z3)P<`8(bB<-D!+ITcdvEm$|P2|2i5cVPogB}>;qoB-RMu0s6z<1Mb%-%2#+E~cnaCJD7xE5U~K!GKr)Wn_A=!l z)gBF;isJ)1nS=0}sA@%wa3WHKv{Mr%5ndZr`G~EJ2L3StyVjPe`;jH;3S#YJFnQf{ zbpWw-QDResqmf+~4YWRny!B=D)QqjC1WnjQCsYER)HEY6Sw3mU?GR*t4nRmgD@)qW0MkjBC67|Kf;1LI3~& diff --git a/driver/gnuplotscript.gp b/driver/gnuplotscript.gp index 6bdaed1..3a594f7 100644 --- a/driver/gnuplotscript.gp +++ b/driver/gnuplotscript.gp @@ -2,19 +2,36 @@ set margin 10,10 unset key set grid set title '' -set xlabel 'U_{DS} [V]' +set xlabel 'U_{GS} [V]' set ylabel 'I_D [mA]' -set xrange [0:5] +set xrange [5:0] +set x2range [5:0] +set y2range [0:50] set yrange [0:50] -set label at 4,3 'U_{GS} [V] = 460' left -set label at 4,7 'U_{GS} [V] = 480' left -set label at 3,13 'U_{GS} [V] = 500' left -set label at 2,22 'U_{GS} [V] = 520' left -set label at 1,32 'U_{GS} [V] = 540' left -set label at 0,38 'U_{GS} [V] = 560' left -set label at 0,38 'U_{GS} [V] = 580' left -set label at 0,38 'U_{GS} [V] = 600' left +set label at 2,35 'U_{DS} [V] = 300' right +set label at 2,31 'U_{DS} [V] = 325' right +set label at 2,35 'U_{DS} [V] = 350' right +set label at 2,21 'U_{DS} [V] = 375' right +set label at 2,22 'U_{DS} [V] = 400' right +set label at 2,22 'U_{DS} [V] = 425' right +set label at 2,12 'U_{DS} [V] = 450' right +set label at 2,23 'U_{DS} [V] = 475' right +set label at 2,24 'U_{DS} [V] = 500' right +set label at 2,24 'U_{DS} [V] = 525' right +set label at 2,13 'U_{DS} [V] = 550' right +set label at 2,13 'U_{DS} [V] = 550' right +set label at 2,2 'U_{DS} [V] = 600' right +set label at 2,13 'U_{DS} [V] = 625' right +set label at 2,6 'U_{DS} [V] = 650' right +set label at 2,2 'U_{DS} [V] = 675' right +set label at 2,6 'U_{DS} [V] = 700' right +set label at 2,2 'U_{DS} [V] = 725' right +set label at 2,2 'U_{DS} [V] = 750' right +set label at 2,2 'U_{DS} [V] = 750' right +set y2tics +unset ytics +set ytics format '' unset output set terminal qt unset output -plot "/tmp/tempfile0" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 440' w l,"/tmp/tempfile1" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 460' w l,"/tmp/tempfile2" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 480' w l,"/tmp/tempfile3" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 500' w l,"/tmp/tempfile4" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 520' w l,"/tmp/tempfile5" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 540' w l,"/tmp/tempfile6" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 560' w l,"/tmp/tempfile7" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 580' w l,"/tmp/tempfile8" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 600' w l +plot "/tmp/tempfile1" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 300' w l,"/tmp/tempfile2" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 325' w l,"/tmp/tempfile3" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 350' w l,"/tmp/tempfile4" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 375' w l,"/tmp/tempfile5" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 400' w l,"/tmp/tempfile6" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 425' w l,"/tmp/tempfile7" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 450' w l,"/tmp/tempfile8" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 475' w l,"/tmp/tempfile9" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 500' w l,"/tmp/tempfile10" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 525' w l,"/tmp/tempfile11" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 550' w l,"/tmp/tempfile12" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 575' w l,"/tmp/tempfile13" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 600' w l,"/tmp/tempfile14" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 625' w l,"/tmp/tempfile15" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 650' w l,"/tmp/tempfile16" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 675' w l,"/tmp/tempfile17" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 700' w l,"/tmp/tempfile18" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 725' w l,"/tmp/tempfile19" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 750' w l,"/tmp/tempfile20" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 775' w l diff --git a/driver/main b/driver/main index f774480492c57e20dae986ec3c7b8be1cebe82b6..d5d4996d1f27da40b066830ac64c8269e90e2cb5 100755 GIT binary patch delta 18609 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 vb!_63?hP`xNzYyMU7WQ&aa!G)3y6QR_4~R delta 17978 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 PDvz6cD5WL=)2Z@*EnDgb literal 16552 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 Ef13~Sl>h($ diff --git a/driver/test_plot b/driver/test_plot index aaca480b2056f7ed099a794213811702ed517feb..9a716f70b0600c13d3e9282481794c3461d05062 100644 GIT binary patch literal 1044 zcmc)F&1%$890l-mXC^a~v{#*K3Q-1)lF^hznd%@BLkad`qh?Y3s0&H8u5~45QHm?K zlE*Nw;4&^mRInRC^8$hkL9+0x=$Se#=nEM5asD^ld$_m1bZzCbzqE4Y&RVi409M?rHHyJ$#(LMNn1 zp{o@1m=XnJnY0vQOedMLlgt!Ni~1=vd%|J5hv|qcakN+B7&&H%fmPx-ov=&H`6YZhIVy1~C^3vm z%+qN_F(oC=&{?g*CB4E;S>YC?bh}q!jqchN?mHD8_!S-o71qbX3L9gp!XvH5Q(5CZ zeW1#$@yV+3rC;NlU1Q6sMZ>K{*RO?6Mo^2{wiM^+JcYDCks-z787ZF4O7Z%j6z`5o t@o^x<=Q%09wg=n3Gk?%e+M-{^pz&nSpt0FrXgsGE^palDn~Ar~&EJT>uWkSU literal 37120 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 Z?Ym^wcl_^p_dfQ$?SAea+obzP{|h~qo>%|? diff --git a/firmware/B15F.elf b/firmware/B15F.elf index 09771342b1952dc6ef2c740a857b8e526f71b183..1acb1307e1ac7e7d639e8eb72467b5e35ac843d9 100755 GIT binary patch literal 18748 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 U(Rqo(OD7SM2v^i1Zvi3y0fmp2i~s-t diff --git a/firmware/B15F.hex b/firmware/B15F.hex index 707add3..8936bcf 100644 --- a/firmware/B15F.hex +++ b/firmware/B15F.hex @@ -1,311 +1,467 @@ -:100000000C945F000C9489000C9489000C94890076 -:100010000C9489000C9489000C9489000C9489003C -:100020000C9489000C9489000C9489000C9489002C -:100030000C9489000C9489000C9489000C9489001C -:100040000C9489000C9489000C9489000C9489000C -:100050000C949B080C9489000C94C5080C9489009E -:100060000C9489000C9489000C9489000C948900EC -:100070000C9489000C9489000C9489000C948900DC -:100080000C9489000C9489000C948900FD000001F7 -:100090000301E900060109010C010F011201E7004B -:1000A000FA001501590956095309310950094D093A -:1000B0004A09470944092F0941095C095F091124CC -:1000C0001FBECFEFD0E4DEBFCDBF11E0A0E0B1E0B6 -:1000D000E0E3F3E100E00BBF02C007900D92AE3207 -:1000E000B107D9F722E0AEE2B1E001C01D92AB3812 -:1000F000B207E1F710E0CFE5D0E004C02197FE01A0 -:100100000E948D09CE35D107C9F70E94EF080C94E3 -:1001100096090C9400008AE892E00E94190160E0C0 -:1001200087E892E00E945C016FEF87E892E00E940E -:100130007D0160E084E892E00E945C016FEF84E85A -:1001400092E00E947D016FEF81E892E00E947D01C4 -:100150008AE792E00E9454028FE291E00E944C03F1 -:100160008FE291E00E946C03789484B7877F84BF0C -:10017000109260000FB6F894A89580916000886195 -:1001800080936000109260000FBE0895CF9398E0B6 -:1001900088E10FB6F894A895809360000FBE909305 -:1001A0006000A8958FE291E00E94E904C82F682FB3 -:1001B00084E892E00E949E018C2F90E0FC01319730 -:1001C000EC30F10530F4EA5BFF4F0C948D090E948E -:1001D000FA078FE291E00E946C030FB6F894A8959D -:1001E00080916000886180936000109260000FBE73 -:1001F000CF9108950E941008ECCF0E944107E9CFEB -:100200000E945A07E6CF0E948107E3CF0E9496071B -:10021000E0CF0E94AC07DDCF0E94C207DACF0E9478 -:10022000D307D7CF0E94E407D4CF0E942608D1CFAE -:10023000089584B1806B84B926988AB18C618AB99B -:1002400080E58CBD81E08DBD8BB1837E8BB95A9AE0 -:100250005B9A5C9A08958BB1837E8BB98BB160FDFC -:1002600010C090E0892B8BB98BB161FD10C090E07C -:10027000892B8BB98BB162FD10C090E0892B8BB9B3 -:10028000089594E0892B8BB98BB161FFF0CF98E092 -:10029000892B8BB98BB162FFF0CF90E1892B8BB9A1 -:1002A00008956EBD0DB407FEFDCF8EB50895FC0117 -:1002B00071836083428308951F93CF93DF93EC0192 -:1002C000162F6A81888199810E942B0188819981EA -:1002D00060E40E9451018881998160E00E9451018F -:1002E00088819981612F0E9451018881998167E0FD -:1002F000DF91CF911F910C942B011F93CF93DF932C -:10030000EC01162F6A81888199810E942B018881D6 -:10031000998160E40E9451018881998161E00E9485 -:10032000510188819981612F0E94510188819981B1 -:1003300067E0DF91CF911F910C942B011F93CF9316 -:10034000DF93EC01162F6A81888199810E942B012D -:100350008881998160E40E9451018881998162E1DC -:100360000E94510188819981612F0E9451018881E9 -:10037000998167E0DF91CF911F910C942B011F931E -:10038000CF93DF93EC01162F6A81888199810E94B7 -:100390002B018881998160E40E94510188819981B3 -:1003A00063E10E94510188819981612F0E9451016E -:1003B0008881998167E0DF91CF911F910C942B0187 -:1003C0001F93CF93DF93EC016A81888199810E940A -:1003D0002B018881998161E40E9451018881998172 -:1003E00062E10E9451018881998160E00E9451017F -:1003F000182F8881998167E00E942B01812FDF915E -:10040000CF911F9108951F93CF93DF93EC016A81E1 -:10041000888199810E942B018881998161E40E94E1 -:1004200051018881998163E10E94510188819981FC -:1004300060E00E945101182F8881998167E00E9435 -:100440002B01812FDF91CF911F910895FC017183C2 -:100450006083428308950F931F93CF93DF93EC0142 -:100460008B016A81888199810E942B018881998101 -:10047000B8010024660F771F001C660F771F001C51 -:10048000672F702D0E94510188819981602F660F1E -:10049000660F0E9451018881998167E0DF91CF91B9 -:1004A0001F910F910C942B0110927C0087E8809390 -:1004B0007A00089580917C00807E682B60937C0098 -:1004C00080917A00806480937A0083EA91E00197BA -:1004D000F1F700C0000080917A0086FDFCCF80918A -:1004E00078009091790008950F931F93CF93DF9335 -:1004F00061E087E892E00E949E01C1E0D0E001E067 -:1005000010E02FEF84E39CE0215080409040E1F721 -:1005100000C00000B8010C2E01C0660F0A94EAF773 -:1005200087E892E00E949E012196C930D10549F7E3 -:10053000DF91CF911F910F9108950F931F93CF9348 -:10054000DF9361E084E892E00E949E01C1E0D0E088 -:1005500001E010E02FEF84E39CE0215080409040C8 -:10056000E1F700C00000B8010C2E01C0660F0A942C -:10057000EAF784E892E00E949E012196C930D105F5 -:1005800049F7DF91CF911F910F910895CF93DF939A -:10059000C0E0D0E0BE018EE792E00E942B0287E827 -:1005A00093E10197F1F700C000002196C11594E096 -:1005B000D90781F72FE78AE196E0215080409040EB -:1005C000E1F700C0000060E070E08EE792E0DF91AC -:1005D000CF910C942B02CF93DF93C0E0D0E0BE010B -:1005E0008BE792E00E942B0287E893E10197F1F7F5 -:1005F00000C000002196C11594E0D90781F72FE7CC -:100600008AE196E0215080409040E1F700C0000070 -:1006100060E070E08BE792E0DF91CF910C942B02C9 -:100620000FB6F894A895809160008861809360006F -:10063000109260000FBE60E08AE792E00E945A02CA -:10064000BC018EE792E00E942B0261E08AE792E013 -:100650000E945A02BC018BE792E00E942B0287E8BD -:1006600092E00E940302682F87E892E00E949E01B8 -:1006700081E892E00E940302682F84E892E00E94E1 -:100680009E01D9CF0E9474020E949D020E94C60260 -:100690000E94EB020E94100322E02093C00028ED8C -:1006A0002093C10026E02093C2001092C50024E1EF -:1006B0002093C400865B9E4FFC01108208958091B8 -:1006C000C6008FE792E00197F1F700C0000080912B -:1006D000C00087FDF4CF089589539F4FFC0110821D -:1006E00008959C01FC01E65BFE4F90819111FDCFC6 -:1006F000F901E85BFE4F10820895DC01A953BF4F5A -:100700002C9131E0320F3C933091C600FC01E20F96 -:10071000F11DE95BFF4F30832C91FC01E95BFF4F3A +:100000000C9461000C948B000C948B000C948B006E +:100010000C948B000C948B000C948B000C948B0034 +:100020000C948B000C948B000C948B000C948B0024 +:100030000C948B000C948B000C948B000C948B0014 +:100040000C948B000C948B000C948B000C948B0004 +:100050000C94820D0C948B000C94AC0D0C948B00C2 +:100060000C948B000C948B000C948B000C948B00E4 +:100070000C948B000C948B000C948B000C948B00D4 +:100080000C948B000C948B000C948B00F500F80002 +:10009000FB00E100FE000101040107010A010D015E +:1000A000DF00F2001001390E360E330E0E0E300E48 +:1000B0002D0E2A0E270E240E210E0C0E1E0E3C0EA7 +:1000C0003F0E11241FBECFEFD0E4DEBFCDBF11E045 +:1000D000A0E0B1E0E0EFFCE100E00BBF02C0079060 +:1000E0000D92A033B107D9F722E0A0E3B1E001C03F +:1000F0001D92AE38B207E1F710E0C1E6D0E004C0CF +:100100002197FE010E946D0EC036D107C9F70E94EB +:10011000D60D0C94760E0C9400008DE892E00E94AF +:10012000140160E08AE892E00E9457016FEF8AE8CC +:1001300092E00E94780160E087E892E00E94570117 +:100140006FEF87E892E00E9478016FEF84E892E019 +:100150000E9478018DE792E00E944F0281E391E0D6 +:100160000E94470381E391E00E946703789484B77B +:10017000877F84BF109260000FB6F894A895809195 +:100180006000886180936000109260000FBE089547 +:10019000CF93A89581E391E00E949008C82F682F23 +:1001A00087E892E00E9499018C2F90E0FC01319742 +:1001B000ED30F10530F4EA5BFF4F0C946D0E0E94B8 +:1001C000E10C81E391E00E9467030FB6F894A895D3 +:1001D00080916000886180936000109260000FBE83 +:1001E000CF9108950E94F70CECCF0E94170CE9CF35 +:1001F0000E94300CE6CF0E94570CE3CF0E946C0C9B +:10020000E0CF0E94820CDDCF0E94980CDACF0E94D2 +:10021000A90CD7CF0E94BA0CD4CF0E94CB0CD1CF5F +:100220000E940D0DCECF089584B1806B84B92698BD +:100230008AB18C618AB980E58CBD81E08DBD8BB1BE +:10024000837E8BB95A9A5B9A5C9A08958BB1837EB0 +:100250008BB98BB160FD10C090E0892B8BB98BB14D +:1002600061FD10C090E0892B8BB98BB162FD10C08D +:1002700090E0892B8BB9089594E0892B8BB98BB1D1 +:1002800061FFF0CF98E0892B8BB98BB162FFF0CF83 +:1002900090E1892B8BB908956EBD0DB407FEFDCF9B +:1002A0008EB50895FC0171836083428308951F9386 +:1002B000CF93DF93EC01162F6A81888199810E9488 +:1002C00026018881998160E40E944C01888199818E +:1002D00060E00E944C0188819981612F0E944C014D +:1002E0008881998167E0DF91CF911F910C9426015D +:1002F0001F93CF93DF93EC01162F6A818881998138 +:100300000E9426018881998160E40E944C018881C5 +:10031000998161E00E944C0188819981612F0E943E +:100320004C018881998167E0DF91CF911F910C94F6 +:1003300026011F93CF93DF93EC01162F6A818881EA +:1003400099810E9426018881998160E40E944C0174 +:100350008881998162E10E944C0188819981612F95 +:100360000E944C018881998167E0DF91CF911F91B4 +:100370000C9426011F93CF93DF93EC01162F6A8113 +:10038000888199810E9426018881998160E40E9478 +:100390004C018881998163E10E944C018881998197 +:1003A000612F0E944C018881998167E0DF91CF9194 +:1003B0001F910C9426011F93CF93DF93EC016A8168 +:1003C000888199810E9426018881998161E40E9437 +:1003D0004C018881998162E10E944C018881998158 +:1003E00060E00E944C01182F8881998167E00E948B +:1003F0002601812FDF91CF911F9108951F93CF93F5 +:10040000DF93EC016A81888199810E9426018881AD +:10041000998161E40E944C018881998163E10E9485 +:100420004C018881998160E00E944C01182F8881DD +:10043000998167E00E942601812FDF91CF911F9162 +:100440000895FC0171836083428308950F931F9385 +:10045000CF93DF93EC018B016A81888199810E949F +:10046000260188819981B8010024660F771F001C3E +:10047000660F771F001C672F702D0E944C0188812A +:100480009981602F660F660F0E944C0188819981C7 +:1004900067E0DF91CF911F910F910C94260110928C +:1004A0007C0087E880937A00089580917C00807EAC +:1004B000682B60937C0080917A00806480937A003E +:1004C00083EA91E00197F1F700C0000080917A0083 +:1004D00086FDFCCF809178009091790008950F936C +:1004E0001F93CF93DF9361E08AE892E00E94990125 +:1004F000C1E0D0E001E010E02FEF84E39CE0215068 +:1005000080409040E1F700C00000B8010C2E01C00F +:10051000660F0A94EAF78AE892E00E949901219610 +:10052000C930D10549F7DF91CF911F910F910895FF +:100530000F931F93CF93DF9361E087E892E00E94CF +:100540009901C1E0D0E001E010E02FEF84E39CE0EE +:10055000215080409040E1F700C00000B8010C2E0F +:1005600001C0660F0A94EAF787E892E00E949901B9 +:100570002196C930D10549F7DF91CF911F910F9195 +:100580000895CF93DF93C0E0D0E0BE0181E892E010 +:100590000E94260287E893E10197F1F700C000006E +:1005A0002196C11594E0D90781F72FE78AE196E0FB +:1005B000215080409040E1F700C0000060E070E012 +:1005C00081E892E0DF91CF910C942602CF93DF93E4 +:1005D000C0E0D0E0BE018EE792E00E94260287E8EC +:1005E00093E10197F1F700C000002196C11594E056 +:1005F000D90781F72FE78AE196E0215080409040AB +:10060000E1F700C0000060E070E08EE792E0DF916B +:10061000CF910C9426020FB6F894A89580916000B3 +:10062000886180936000109260000FBE60E08DE7EB +:1006300092E00E945502BC0181E892E00E942602ED +:1006400061E08DE792E00E945502BC018EE792E0E6 +:100650000E9426028AE892E00E94FE01682F8AE842 +:1006600092E00E94990184E892E00E94FE01682FC6 +:1006700087E892E00E949901D9CF0E946F020E9400 +:1006800098020E94C1020E94E6020E940B0322E02F +:100690002093C00028ED2093C10026E02093C200E3 +:1006A0001092C50024E12093C400855B9E4FFC019D +:1006B000108208958091C6008FE792E00197F1F7CC +:1006C00000C000008091C00087FDF4CF08958953D9 +:1006D0009F4FFC01108208959C01FC01E55BFE4FD9 +:1006E00090819111FDCFF901E85BFE4F10823296A7 +:1006F00010820895DC01A953BF4F2C9131E0320FD5 +:100700003C933091C600FC01E20FF11DE95BFF4F05 +:1007100030832C91213081F02C91FC01E95BFF4F5B :10072000E081F0E0E050FF4F8081281720F01C921C -:1007300081E080932E0108950F931F93CF93DF9351 -:10074000EC018C01085B1E4FF801608187E892E0A4 -:100750000E949E01F801908131968081981740F0A7 -:10076000C65BDE4F1882DF91CF911F910F910895E4 -:100770008091C00085FFFCCFF801808191E0980F47 -:100780009083C80FD11DC853DF4F88818093C60066 -:10079000DF91CF911F910F910895CF92DF92EF9249 -:1007A000FF920F931F93CF93DF93EC01C85BDE4F53 -:1007B0002881211109C0DF91CF911F910F91FF90E6 -:1007C000EF90DF90CF9008958C018881780197EBAE -:1007D000E91A9EEFF90AF701808318826801F6EBA7 -:1007E000CF1AFEEFDF0A81E0F6018083688187E897 -:1007F00092E00E949E019881F7018081981788F409 -:100800009091C00095FFFCCF888191E0980F98836C -:10081000E801C80FD11DC853DF4F88818093C600FF -:10082000CACFF6011082C7CFFC01E85BFE4F2081E2 -:1008300031E0320F3083820F911DFC01E853FF4FEE -:1008400060830895FC01E85BFE4F208131E0320FA8 -:100850003083DC01A20FB11DA853BF4F6C932081E0 -:1008600031E0320F3083820F911DFC01E853FF4FBE -:10087000708308950F931F93CF93DF938C01DC0156 -:10088000A85BBE4F8C9191E0980F9C93F801E80F04 -:10089000F11DE853FF4F40839FEF940F442371F005 -:1008A000EB0139912C9141E0420F4C93F801E20F9A -:1008B000F11DE853FF4F3083915098F7DF91CF91AE -:1008C0001F910F910895EF92FF920F931F93CF9373 -:1008D000DF937C01EC01C85BDE4F888191E0980FCB -:1008E0009883F701E80FF11DE853FF4F40835FEF56 -:1008F000540F442309F46BC0FB0120E041E9BF0120 -:100900003191888191E0980F98838701080F111D1C -:10091000C80188539F4FDC013C93DB018C91282751 -:10092000822F842720FD282F30E035952795842FAE -:10093000822720FD282F30E035952795842F8227A8 -:1009400020FD282F30E035952795842F822720FD24 -:10095000282F30E035952795842F822720FD282FDA -:1009600030E035952795942F922720FD292F30E0F0 -:1009700035952795942F922720FD292F30E0359526 -:100980002795842F822720FD282F2695515008F087 -:10099000B6CF888191E0980F9883F701E80FF11D99 -:1009A000E853FF4F2083F701E953FF4F808191E027 -:1009B000980F9083D701A80FB11DA95BBF4F8C91F1 -:1009C000DF91CF911F910F91FF90EF90089520E05C -:1009D000E0CFFC01E953FF4F208131E0320F30833B -:1009E000820F911DFC01E95BFF4F80810895FC019E -:1009F000E953FF4F208131E0320F3083DC01A20F39 -:100A0000B11DA95BBF4F2C91308141E0430F408362 -:100A1000830F911DFC01E95BFF4F3081822F90E035 -:100A2000932B0895CF93DF93DC01EC01CB5BDF4F79 -:100A3000888199818230910509F469C0A0F40097FA -:100A400009F440C0019749F48C91FD01E80FF11DB4 -:100A5000618382E090E0998388838C918F5F8C938F -:100A6000DF91CF9108958330910509F4D6C00497A2 -:100A7000A1F78091C6008FE792E00197F1F700C0DF -:100A800000008091C00087FDF4CFFD01EC5BFF4FBB -:100A90008081882309F436C19EEFFD01E85BFE4F9B -:100AA000808121E0280F2083FD01E80FF11DE8532C -:100AB000FF4F9083198218828C918F5F8C93DF9106 -:100AC000CF910895613408F41FC18091C6008FE76B -:100AD00092E00197F1F700C000008091C00087FD0F -:100AE000F4CFFD01E85BFE4F808191E0980F908389 -:100AF000FD01E80FF11DE853FF4F8EEF808319824F -:100B000018828C918F5F8C93DF91CF9108958C9197 -:100B1000FD01E80FF11D6183FD01EC5BFF4F80815A -:100B200068276083808180FF04C0908181E98927E4 -:100B30008083808190E0959587958083808180FF78 -:100B400004C0908181E989278083808190E0959518 -:100B500087958083808180FF04C0908181E9892707 -:100B60008083808190E0959587958083808180FF48 -:100B700004C0908181E989278083808190E09595E8 -:100B800087958083808180FF04C0908181E98927D7 -:100B90008083808190E0959587958083808180FF18 -:100BA00004C0908181E989278083808190E09595B8 -:100BB00087958083808180FF04C0908181E98927A7 -:100BC0008083808190E0959587958083808180FFE8 -:100BD00004C0908181E989278083808190E0959588 -:100BE000879580839C9111968C911197981709F4A1 -:100BF00098C09C9111968C911197981708F42DCF5D -:100C00008091C6008FE792E00197F1F700C00000E5 -:100C10008091C00087FDF4CF64CF8C91FD01E80F77 -:100C2000F11D6183FD01EC5BFF4F808168276083CC -:100C3000808180FF04C0908181E989278083808141 -:100C400090E0959587958083808180FF04C0908196 -:100C500081E989278083808190E0959587958083BD -:100C6000808180FF04C0908181E989278083808111 -:100C700090E0959587958083808180FF04C0908166 -:100C800081E989278083808190E09595879580838D -:100C9000808180FF04C0908181E9892780838081E1 -:100CA00090E0959587958083808180FF04C0908136 -:100CB00081E989278083808190E09595879580835D -:100CC000808180FF04C0908181E9892780838081B1 -:100CD00090E0959587958083808180FF04C0908106 -:100CE00081E989278083808190E09595879580832D -:100CF00084E090E0998388838C918F5F8C93DF915F -:100D0000CF9108959FEFC9CE11966C931197FD0175 -:100D1000EC5BFF4F10821C9281E090E09983888306 -:100D20009CCE83E090E09983888397CECF92DF9228 -:100D3000FF920F931F93CF93DF93FC01E953FF4F73 -:100D40009C01285B3E4F6901D1E9640F711DAEEF34 -:100D5000FA2E208131E0320F3083AC01420F511D59 -:100D60009A01295B3F4FD9011C91103809F475C0D5 -:100D7000113408F010E0C0E020E0308141E0430F82 -:100D80004083AC01430F511DDA01A95BBF4F0C91A9 -:100D9000202720FD2D2730E035952795422F20FF75 -:100DA00002C04D2F4227242F30E035952795422F42 -:100DB00020FF02C04D2F422750E055954795242F24 -:100DC00040FF02C02D2F242730E035952795422F74 -:100DD00020FF02C04D2F422750E055954795242F04 -:100DE00040FF02C02D2F242730E035952795422F54 -:100DF00020FF02C04D2F422750E055954795242FE4 -:100E000040FF02C02D2F24272695C117A0F1CF5FE8 -:100E10001C1708F0B2CF3091C600AFE7B2E01197CF -:100E2000F1F700C000003091C00037FDF4CF211170 -:100E300014C0F601208131E0320F3083820F911D02 -:100E4000FC01E853FF4F8FEF8083DF91CF911F911B -:100E50000F91FF90DF90CF900895D6012C9131E053 -:100E6000320F3C93AC01420F511D9A0128533F4F62 -:100E7000D901FC926ECFAB014C0F511DDA010C93DE -:100E8000C6CFCF938FE291E00E9471038FE291E091 -:100E90000E94E904C82F6FEF8FE291E00E941404D2 -:100EA0006C2F8FE291E00E9414048FE291E0CF91C9 -:100EB0000C94CD038FE291E00E94710363E08FE216 -:100EC00091E00E9414044CE062E271E08FE291E054 -:100ED0000E943A0449E069E171E08FE291E00E94EA -:100EE0003A044CE06DE071E08FE291E00E943A0438 -:100EF0006FEF8FE291E00E9414048FE291E00C9476 -:100F0000CD038FE291E00E9471038FE291E00E9495 -:100F1000F704BC01660F771F680F791F8FE291E01D -:100F20000E9422048FE291E00C94CD038FE291E0C5 -:100F30000E9471038FE291E00E94E904682F87E824 -:100F400092E00E949E016FEF8FE291E00E941404F4 -:100F50008FE291E00C94CD038FE291E00E94710347 -:100F60008FE291E00E94E904682F84E892E00E94F9 -:100F70009E016FEF8FE291E00E9414048FE291E0F6 -:100F80000C94CD038FE291E00E94710387E892E018 -:100F90000E940302682F8FE291E00E9414048FE206 -:100FA00091E00C94CD038FE291E00E94710384E8FC -:100FB00092E00E940302682F8FE291E00E941404E5 -:100FC0008FE291E00C94CD038FE291E00E947103D7 -:100FD0008FE291E00E94F704BC018EE792E00E944C -:100FE0002B026FEF8FE291E00E9414048FE291E0F8 -:100FF0000C94CD038FE291E00E9471038FE291E0A7 -:101000000E94F704BC018BE792E00E942B026FEF75 -:101010008FE291E00E9414048FE291E00C94CD03E2 -:101020008FE291E00E9471038FE291E00E94E90457 -:10103000682F8AE792E00E945A02BC018FE291E099 -:101040000E9422048FE291E00C94CD038F929F9234 -:10105000AF92BF92CF92DF92EF92FF920F931F93C6 -:10106000CF93DF938FE291E00E94E904882E8FE214 -:1010700091E00E94E904982E8FE291E00E94F7042B -:10108000EC018FE291E00E94F7045C018FE291E0B5 -:101090000E94F704A89E6001A99ED00CB89ED00CB7 -:1010A00011246FEF84E892E00E949E01CC15DD05CB -:1010B0004CF5BE018EE792E00E942B02A895682DA8 -:1010C0008AE792E00E945A027C01692D8AE792E049 -:1010D0000E945A028C018FE291E00E947103B701D5 -:1010E0008FE291E00E942204B8018FE291E00E9419 -:1010F00022048FE291E00E94CD03CA0DDB1DCC15C6 -:10110000DD05BCF28FE291E00E9471036FEF8FE288 -:1011100091E00E9414048FE291E0DF91CF911F9142 -:101120000F91FF90EF90DF90CF90BF90AF909F9086 -:101130008F900C94CD031F920F920FB60F92112433 -:101140000BB60F922F933F934F935F936F937F93C1 -:101150008F939F93AF93BF93EF93FF938FE291E0B1 -:101160000E947D03FF91EF91BF91AF919F918F916D -:101170007F916F915F914F913F912F910F900BBE97 -:101180000F900FBE0F901F9018951F920F920FB6E1 -:101190000F9211240BB60F922F933F934F935F93AF -:1011A0006F937F938F939F93AF93BF93EF93FF932F -:1011B0008FE291E00E949C03FF91EF91BF91AF916C -:1011C0009F918F917F916F915F914F913F912F915F -:1011D0000F900BBE0F900FBE0F901F9018950E949E -:1011E0008B006FEF87E892E00E949E012FE78AE173 -:1011F00096E0215080409040E1F700C0000060E0A0 -:1012000087E892E00E949E0118E1D8E004C026E041 -:101210002A95F1F700C080912E018823C1F3109226 -:101220002E010FB6F894A895109360000FBED093CE -:101230006000A8958FE291E00E94E904C82F682F12 -:1012400084E892E00E949E018C2F90E0FC0131978F -:10125000EC30F10530F4EE5AFF4F0C948D090E94EA -:10126000FA078FE291E00E946C030FB6F894A895FC -:1012700080916000886180936000109260000FBED2 -:10128000C6CF0E941008EDCF0E94E407EACF0E946B -:10129000D307E7CF0E94C207E4CF0E94AC07E1CF9B -:1012A0000E949607DECF0E948107DBCF0E945A077B -:1012B000D8CF0E944107D5CF0E942608D2CF8AE816 -:1012C00092E00E94180142E06AE872E087E892E04A -:1012D0000E94570143E06AE872E084E892E00E94CD -:1012E000570145E06AE872E081E892E00E94570108 -:1012F00040E06AE872E08EE792E00E94260241E058 -:101300006AE872E08BE792E00E94260210922F01B9 -:1013100010927501109274010895EE0FFF1F0024C2 -:10132000001C0BBE0790F691E02D0994F894FFCFB6 -:1013300001020103000202010103030209626F615D -:101340007264696E666F2E680030383A33393A3508 -:0E1350003700417072202033203230313900D6 +:1007300081E080933001089538E028E10FB6F89405 +:10074000A895209360000FBE30936000A895E4CF79 +:100750000F931F93CF93DF93EC018C01085B1E4F27 +:10076000F80160818AE892E00E949901F801908185 +:1007700031968081981740F0C55BDE4F1882DF917B +:10078000CF911F910F9108958091C00085FFFCCFFC +:10079000F801808191E0980F9083C80FD11DC85354 +:1007A000DF4F88818093C600DF91CF911F910F9119 +:1007B0000895CF92DF92EF92FF920F931F93CF9302 +:1007C000DF93EC01C85BDE4F2881211109C0DF9166 +:1007D000CF911F910F91FF90EF90DF90CF900895F0 +:1007E0008C018881780197EBE91A9EEFF90AF701ED +:1007F000808318826801F5EBCF1AFEEFDF0A81E0F3 +:10080000F601808368818AE892E00E9499019881CC +:10081000F7018081981788F49091C00095FFFCCF74 +:10082000888191E0980F9883E801C80FD11DC853C3 +:10083000DF4F88818093C600CACFF6011082C7CFF0 +:10084000FC01E85BFE4F208131E0320F3083FC0178 +:10085000E20FF11DE853FF4F6083FC01E65BFE4FA2 +:10086000808168276083808180FF04C0908181E956 +:1008700089278083808190E095958795808380810A +:1008800080FF04C0908181E989278083808190E086 +:10089000959587958083808180FF04C0908181E950 +:1008A00089278083808190E09595879580838081DA +:1008B00080FF04C0908181E989278083808190E056 +:1008C000959587958083808180FF04C0908181E920 +:1008D00089278083808190E09595879580838081AA +:1008E00080FF04C0908181E989278083808190E026 +:1008F000959587958083808180FF04C0908181E9F0 +:1009000089278083808190E0959587958083808179 +:1009100080FF04C0908181E989278083808190E0F5 +:100920009595879580830895DC01A85BBE4F2C9137 +:1009300031E0320F3C93FC01E20FF11DE853FF4F11 +:100940006083FC01E65BFE4F20816227608320818B +:1009500020FF04C0308121E923272083208130E05B +:10096000359527952083208120FF04C0308121E91F +:1009700023272083208130E035952795208320810F +:1009800020FF04C0308121E923272083208130E02B +:10099000359527952083208120FF04C0308121E9EF +:1009A00023272083208130E03595279520832081DF +:1009B00020FF04C0308121E923272083208130E0FB +:1009C000359527952083208120FF04C0308121E9BF +:1009D00023272083208130E03595279520832081AF +:1009E00020FF04C0308121E923272083208130E0CB +:1009F000359527952083208120FF04C0308121E98F +:100A000023272083208130E03595279520832C9162 +:100A100031E0320F3C93820F911DDC01A853BF4F90 +:100A20007C93808178277083808180FF04C09081CF +:100A300081E989278083808190E0959587958083DF +:100A4000808180FF04C0908181E989278083808133 +:100A500090E0959587958083808180FF04C0908188 +:100A600081E989278083808190E0959587958083AF +:100A7000808180FF04C0908181E989278083808103 +:100A800090E0959587958083808180FF04C0908158 +:100A900081E989278083808190E09595879580837F +:100AA000808180FF04C0908181E9892780838081D3 +:100AB00090E0959587958083808180FF04C0908128 +:100AC00081E989278083808190E09595879580834F +:100AD000808180FF04C0908181E9892780838081A3 +:100AE00090E095958795808308950F931F93CF93FA +:100AF000DF93DC01A85BBE4F2C9131E0320F3C93B9 +:100B0000FC01E20FF11DE853FF4F4083FC01E65B5F +:100B1000FE4F208124272083208120FF04C03081C4 +:100B200021E923272083208130E0359527952083F4 +:100B3000208120FF04C0308121E9232720832081E8 +:100B400030E0359527952083208120FF04C0308137 +:100B500021E923272083208130E0359527952083C4 +:100B6000208120FF04C0308121E9232720832081B8 +:100B700030E0359527952083208120FF04C0308107 +:100B800021E923272083208130E035952795208394 +:100B9000208120FF04C0308121E923272083208188 +:100BA00030E0359527952083208120FF04C03081D7 +:100BB00021E923272083208130E035952795208364 +:100BC000208120FF04C0308121E923272083208158 +:100BD00030E03595279520835FEF540F442309F4C7 +:100BE0006EC08B0141E9E80139918E012C9161E0E1 +:100BF000620F6C93BC01620F711D68537F4FEB0154 +:100C00003883208123272083208120FF03C0208177 +:100C100024272083208130E035952795208320816B +:100C200020FF03C0208124272083208130E03595D8 +:100C300027952083208120FF03C020812427208343 +:100C4000208130E0359527952083208120FF03C047 +:100C5000208124272083208130E03595279520832B +:100C6000208120FF03C0208124272083208130E0C1 +:100C7000359527952083208120FF03C020812427DC +:100C80002083208130E0359527952083208120FF27 +:100C900003C0208124272083208130E035952795CB +:100CA0002083208120FF03C02081242720832081EE +:100CB00030E0359527952083515008F094CFDF918F +:100CC000CF911F910F910895FC01E65BFE4F2081AB +:100CD000DC01A85BBE4F3C9141E0430F4C93830F76 +:100CE000911DDC01A853BF4F2C9380818227808304 +:100CF000808180FF04C0908181E989278083808181 +:100D000090E0959587958083808180FF04C09081D5 +:100D100081E989278083808190E0959587958083FC +:100D2000808180FF04C0908181E989278083808150 +:100D300090E0959587958083808180FF04C09081A5 +:100D400081E989278083808190E0959587958083CC +:100D5000808180FF04C0908181E989278083808120 +:100D600090E0959587958083808180FF04C0908175 +:100D700081E989278083808190E09595879580839C +:100D8000808180FF04C0908181E9892780838081F0 +:100D900090E0959587958083808180FF04C0908145 +:100DA00081E989278083808190E09595879580836C +:100DB0000895CF92DF92EF92FF920F931F93CF93FC +:100DC000DF936C018C01085B1E4FD8018C9191E080 +:100DD000980F9C93F601E80FF11DE853FF4F4083F5 +:100DE000F601E65BFE4F808184278083808180FF4F +:100DF00004C0908181E989278083808190E0959566 +:100E000087958083808180FF04C0908181E9892754 +:100E10008083808190E0959587958083808180FF95 +:100E200004C0908181E989278083808190E0959535 +:100E300087958083808180FF04C0908181E9892724 +:100E40008083808190E0959587958083808180FF65 +:100E500004C0908181E989278083808190E0959505 +:100E600087958083808180FF04C0908181E98927F4 +:100E70008083808190E0959587958083808180FF35 +:100E800004C0908181E989278083808190E09595D5 +:100E900087958083808180FF04C0908181E98927C4 +:100EA0008083808190E09595879580835FEF540FD4 +:100EB000442309F433C1DB0120E041E9BD019C91E9 +:100EC000E801888131E0380F38837601E80EF11CA3 +:100ED000D8ECED0EF11CE70198838081892780838F +:100EE000808180FF03C0808184278083808190E09F +:100EF000959587958083808180FF03C080818427BA +:100F00008083808190E0959587958083808180FFA4 +:100F100003C0808184278083808190E095958795A8 +:100F20008083808180FF03C08081842780838081CB +:100F300090E0959587958083808180FF03C08081B4 +:100F400084278083808190E0959587958083808138 +:100F500080FF03C0808184278083808190E0959505 +:100F600087958083808180FF03C080818427808370 +:100F7000808190E0959587958083808180FF03C074 +:100F8000808184278083808190E0959587958083F8 +:100F90001196EB019881292720FD242730E0359513 +:100FA0002795822F20FF02C0842F822790E09595FD +:100FB0008795282F80FF02C0242F282730E0359501 +:100FC0002795822F20FF02C0842F822790E09595DD +:100FD0008795282F80FF02C0242F282730E03595E1 +:100FE0002795822F20FF02C0842F822790E09595BD +:100FF0008795682F80FF02C0642F682770E0759581 +:101000006795262F60FF02C0242F26272695515072 +:1010100008F054CFD8018C9191E0980F9C93D601A1 +:10102000A80FB11DA853BF4F2C9380812827208380 +:10103000808180FF04C0908181E98927808380813D +:1010400090E0959587958083808180FF04C0908192 +:1010500081E989278083808190E0959587958083B9 +:10106000808180FF04C0908181E98927808380810D +:1010700090E0959587958083808180FF04C0908162 +:1010800081E989278083808190E095958795808389 +:10109000808180FF04C0908181E9892780838081DD +:1010A00090E0959587958083808180FF04C0908132 +:1010B00081E989278083808190E095958795808359 +:1010C000808180FF04C0908181E9892780838081AD +:1010D00090E0959587958083808180FF04C0908102 +:1010E00081E989278083808190E095958795808329 +:1010F000F601E953FF4F808191E0980F9083E6015C +:10110000C80FD11DC95BDF4F8881DF91CF911F913F +:101110000F91FF90EF90DF90CF90089520E07ACF6D +:10112000FC01E953FF4F208131E0320F3083820F01 +:10113000911DFC01E95BFF4F80810895FC01E9539B +:10114000FF4F208131E0320F3083DC01A20FB11D4F +:10115000A95BBF4F2C91308141E0430F4083830F47 +:10116000911DFC01E95BFF4F3081822F90E0932BB2 +:101170000895CF93DF93DC01EC01CB5BDF4F8881D7 +:1011800099818230910509F446C1A0F4009709F4D1 +:101190001BC1019749F48C91FD01E80FF11D61839A +:1011A00082E090E0998388838C918F5F8C93DF91AC +:1011B000CF9108958330910509F491C00497A1F768 +:1011C0008091C6008FE792E00197F1F700C0000020 +:1011D0008091C00087FDF4CFFD01EC5BFF4F808163 +:1011E000882309F49DC19EEFFD01E85BFE4F8081DD +:1011F00021E0280F2083FD01E80FF11DE853FF4F88 +:101200009083FD01E65BFE4F80818927808380818A +:1012100080FF04C0908181E989278083808190E0EC +:10122000959587958083808180FF04C0908181E9B6 +:1012300089278083808190E0959587958083808140 +:1012400080FF04C0908181E989278083808190E0BC +:10125000959587958083808180FF04C0908181E986 +:1012600089278083808190E0959587958083808110 +:1012700080FF04C0908181E989278083808190E08C +:10128000959587958083808180FF04C0908181E956 +:1012900089278083808190E09595879580838081E0 +:1012A00080FF04C0908181E989278083808190E05C +:1012B000959587958083808180FF04C0908181E926 +:1012C00089278083808190E0959587958083198216 +:1012D00018828C918F5F8C93DF91CF9108958C91C0 +:1012E000FD01E80FF11D6183FD01EC5BFF4F808183 +:1012F00068276083808180FF04C0908181E989270D +:101300008083808190E0959587958083808180FFA0 +:1013100004C0908181E989278083808190E0959540 +:1013200087958083808180FF04C0908181E989272F +:101330008083808190E0959587958083808180FF70 +:1013400004C0908181E989278083808190E0959510 +:1013500087958083808180FF04C0908181E98927FF +:101360008083808190E0959587958083808180FF40 +:1013700004C0908181E989278083808190E09595E0 +:1013800087958083808180FF04C0908181E98927CF +:101390008083808190E0959587958083808180FF10 +:1013A00004C0908181E989278083808190E09595B0 +:1013B0008795808384E090E0998388838C918F5F08 +:1013C0008C93DF91CF910895613408F4ABC0809184 +:1013D000C6008FE792E00197F1F700C0000080910E +:1013E000C00087FDF4CFFD01E85BFE4F808191E0F6 +:1013F000980F9083FD01E80FF11DE853FF4F8EEF2A +:101400008083FD01E65BFE4F908189278083808188 +:1014100080FF04CFFFCE8C91FD01E80FF11D6183A9 +:10142000FD01EC5BFF4F808168276083808180FF36 +:1014300004C0908181E989278083808190E095951F +:1014400087958083808180FF04C0908181E989270E +:101450008083808190E0959587958083808180FF4F +:1014600004C0908181E989278083808190E09595EF +:1014700087958083808180FF04C0908181E98927DE +:101480008083808190E0959587958083808180FF1F +:1014900004C0908181E989278083808190E09595BF +:1014A00087958083808180FF04C0908181E98927AE +:1014B0008083808190E0959587958083808180FFEF +:1014C00004C0908181E989278083808190E095958F +:1014D00087958083808180FF04C0908181E989277E +:1014E0008083808190E09595879580839C9111966B +:1014F0008C911197981719F19C9111968C911197D5 +:10150000981708F451CE8091C6008FE792E00197BA +:10151000F1F700C000008091C00087FDF4CF63CFD9 +:101520009FEF62CE11966C931197FD01EC5BFF4F1C +:1015300010821C9281E090E09983888335CE83E00D +:1015400090E09983888330CE8F929F92AF92BF9222 +:10155000DF92EF920F931F93CF93DF93DC01A95398 +:10156000BF4F9C01285B3E4F4901FC01E65BFE4FEB +:1015700011E95B01A40EB11C2EEFD22E2C9131E0AB +:10158000320F3C93AC01420F511D9A01295B3F4F32 +:10159000E9016881603809F4DBC0613408F060E07B +:1015A00000E020E03C9141E0430F4C93AC01430F3D +:1015B000511DEA01C95BDF4FE8802E2520FD212760 +:1015C00030E035952795422F20FF02C0412F42275A +:1015D000242F30E035952795422F20FF02C0412F60 +:1015E000422750E055954795242F40FF02C0212FF8 +:1015F000242730E035952795422F20FF02C0412F48 +:10160000422750E055954795242F40FF02C0212FD7 +:10161000242730E035952795422F20FF02C0412F27 +:10162000422750E055954795242F40FF02C0212FB7 +:1016300024272695061708F4F4C00F5F601708F0FA +:10164000B1CF3091C600CFE7D2E02197F1F700C0CB +:1016500000003091C00037FDF4CF222309F476C09A +:101660000EEFE401488131E0340F3883BC01640F90 +:10167000711DAB0148535F4FEA0108833081302769 +:101680003083308130FF03C0308131273083408187 +:1016900050E0559547954083308130FF03C030813D +:1016A00031273083408150E0559547954083308104 +:1016B00030FF03C0308131273083408150E05595A1 +:1016C00047954083308130FF03C03081312730831C +:1016D000408150E0559547954083308130FF03C0ED +:1016E000308131273083408150E0559547954083C4 +:1016F000308130FF03C0308131273083408150E09A +:10170000559547954083308130FF03C030813127A4 +:101710003083408150E0559547954083308130FFBC +:1017200003C0308131273083408150E05595479583 +:101730004083211123CFDF91CF911F910F91EF9023 +:10174000DF90BF90AF909F908F9008950FEF89CF5B +:10175000E401288131E0320F3883AC01420F511D82 +:101760009A0128533F4FE901D88220812D252083FB +:10177000208120FF03C0208121272083208130E0A9 +:10178000359527952083208120FF03C020812127C4 +:101790002083208130E0359527952083208120FF0C +:1017A00003C0208121272083208130E035952795B3 +:1017B0002083208120FF03C02081212720832081D6 +:1017C00030E0359527952083208120FF03C02081BC +:1017D00021272083208130E03595279520832081A3 +:1017E00020FF03C0208121272083208130E0359510 +:1017F00027952083208120FF03C02081212720837B +:10180000208130E0359527952083208120FF03C07B +:10181000208121272083208130E035952795208362 +:10182000ADCEA501400F511DEA01E88206CFCF934E +:1018300081E391E00E946C0381E391E00E949008B3 +:10184000C82F6FEF81E391E00E9420046C2F81E3A9 +:1018500091E00E94200481E391E0CF910C94D903A0 +:1018600081E391E00E946C0363E081E391E00E94D8 +:1018700020044CE063E271E081E391E00E94750591 +:1018800049E06AE171E081E391E00E9475054CE076 +:101890006EE071E081E391E00E9475056FEF81E3F6 +:1018A00091E00E94200481E391E00C94D90381E34C +:1018B00091E00E946C0381E391E00E949E08BC01CC +:1018C000660F771F680F791F81E391E00E949404EF +:1018D00081E391E00C94D90381E391E00E946C03D1 +:1018E00081E391E00E949008682F8AE892E00E94CC +:1018F00099016FEF81E391E00E94200481E391E080 +:101900000C94D90381E391E00E946C0381E391E0A0 +:101910000E949008682F87E892E00E9499016FEF7B +:1019200081E391E00E94200481E391E00C94D903CB +:1019300081E391E00E946C038AE892E00E94FE013C +:10194000682F81E391E00E94200481E391E00C94F0 +:10195000D90381E391E00E946C0387E892E00E9442 +:10196000FE01682F81E391E00E94200481E391E071 +:101970000C94D90381E391E00E946C0384E892E027 +:101980000E94FE01682F81E391E00E94200481E320 +:1019900091E00C94D90381E391E00E946C0381E310 +:1019A00091E00E949E08BC0181E892E00E9426021C +:1019B0006FEF81E391E00E94200481E391E00C94B9 +:1019C000D90381E391E00E946C0381E391E00E94DE +:1019D0009E08BC018EE792E00E9426026FEF81E331 +:1019E00091E00E94200481E391E00C94D90381E30B +:1019F00091E00E946C0381E391E00E949008682FBF +:101A00008DE792E00E945502BC0181E391E00E94C3 +:101A1000940481E391E00C94D9038F929F92AF924A +:101A2000BF92CF92DF92EF92FF920F931F93CF93CB +:101A3000DF9381E391E00E949008882E81E391E09A +:101A40000E949008982E81E391E00E949E08EC018C +:101A500081E391E00E949E085C0181E391E00E9495 +:101A60009E08A89E6001A99ED00CB89ED00C11249F +:101A70006FEF87E892E00E949901CC15DD054CF5E7 +:101A8000BE0181E892E00E942602A895682D8DE7AC +:101A900092E00E9455027C01692D8DE792E00E9440 +:101AA00055028C0181E391E00E946C03B70181E350 +:101AB00091E00E949404B80181E391E00E949404B3 +:101AC00081E391E00E94D903CA0DDB1DCC15DD0531 +:101AD000BCF281E391E00E946C036FEF81E391E03F +:101AE0000E94200481E391E0DF91CF911F910F913B +:101AF000FF90EF90DF90CF90BF90AF909F908F902E +:101B00000C94D9031F920F920FB60F9211240BB6AB +:101B10000F922F933F934F935F936F937F938F9386 +:101B20009F93AF93BF93EF93FF9381E391E00E9464 +:101B30007A03FF91EF91BF91AF919F918F917F9128 +:101B40006F915F914F913F912F910F900BBE0F902E +:101B50000FBE0F901F9018951F920F920FB60F9205 +:101B600011240BB60F922F933F934F935F936F9374 +:101B70007F938F939F93AF93BF93EF93FF9381E3F3 +:101B800091E00E94A803FF91EF91BF91AF919F91C7 +:101B90008F917F916F915F914F913F912F910F9016 +:101BA0000BBE0F900FBE0F901F9018950E948D00D6 +:101BB0006FEF8AE892E00E9499012FE78AE196E0B0 +:101BC000215080409040E1F700C0000060E08AE8CA +:101BD00092E00E94990104C026E02A95F1F700C026 +:101BE000809130018823C1F310923001A89581E3E0 +:101BF00091E00E949008C82F682F87E892E00E9429 +:101C000099018C2F90E0FC013197ED30F10530F413 +:101C1000ED5AFF4F0C946D0E0E94E10C81E391E0B0 +:101C20000E9467030FB6F894A895809160008861C0 +:101C300080936000109260000FBECECF0E94F70C20 +:101C4000EDCF0E94CB0CEACF0E94BA0CE7CF0E94E6 +:101C5000A90CE4CF0E94980CE1CF0E94820CDECF49 +:101C60000E946C0CDBCF0E94570CD8CF0E94300C26 +:101C7000D5CF0E94170CD2CF0E940D0DCFCF8DE88B +:101C800092E00E94130142E06DE872E08AE892E07F +:101C90000E94520143E06DE872E087E892E00E9402 +:101CA000520145E06DE872E084E892E00E94520142 +:101CB00040E06DE872E081E892E00E94210241E09C +:101CC0006DE872E08EE792E00E94210210923101ED +:101CD00010927701109276010895EE0FFF1F0024F5 +:101CE000001C0BBE0790F691E02D0994F894FFCFED +:101CF0000102010300020201010103030209626FF4 +:101D0000617264696E666F2E680030393A32383A13 +:101D100034370041707220203320323031390000D6 :00000001FF diff --git a/firmware/Makefile b/firmware/Makefile index 3dbbf94..87bce57 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -11,7 +11,7 @@ OBJCOPY_PATH = avr-objcopy OUTPUT = B15F.elf HEX = B15F.hex MCU = atmega1284p -CFLAGS = -Wall -Wextra -std=c++14 -O3 -mmcu=$(MCU) -DF_CPU=20000000 +CFLAGS = -Wall -Wextra -std=c++14 -O3 -mmcu=$(MCU) -DF_CPU=20000000 -DB15F_DEBUG LDFLAGS = OBJECTS = main.o spi.o mcp23s17.o tlc5615.o adu.o selftest.o global_vars.o usart.o requests.o interrupts.o diff --git a/firmware/global_vars.h b/firmware/global_vars.h index 60bab49..749948c 100644 --- a/firmware/global_vars.h +++ b/firmware/global_vars.h @@ -6,6 +6,9 @@ #include "adu.h" #include "usart.h" + +#define WDT_TIMEOUT WDTO_15MS + extern volatile SPI spi; extern volatile MCP23S17 dio0; extern volatile MCP23S17 dio1; diff --git a/firmware/main.cpp b/firmware/main.cpp index f8dcda3..f119ba8 100644 --- a/firmware/main.cpp +++ b/firmware/main.cpp @@ -7,8 +7,6 @@ #include "requests.h" -#define WDT_TIMEOUT WDTO_15MS - void initAll() { spi.init(); @@ -34,12 +32,15 @@ void initAll() void handleRequest() { - // starte WDT - wdt_enable(WDT_TIMEOUT); wdt_reset(); const uint8_t req = usart.readByte(); + + +#ifdef B15F_DEBUG dio1.writePortA(req); +#endif + switch(req) { @@ -73,6 +74,10 @@ void handleRequest() case RQ_BE1: rqDigitalRead1(); break; + + case RQ_DSW: + rqReadDipSwitch(); + break; case RQ_AA0: rqAnalogWrite0(); @@ -103,10 +108,12 @@ int main() { initAll(); +#ifdef B15F_DEBUG // Reset anzeigen dio0.writePortA(0xFF); _delay_ms(100); dio0.writePortA(0x00); +#endif while(1) { diff --git a/firmware/requests.cpp b/firmware/requests.cpp index 052b1c5..ecb923a 100644 --- a/firmware/requests.cpp +++ b/firmware/requests.cpp @@ -64,6 +64,14 @@ void rqDigitalRead1() usart.flush(); } +void rqReadDipSwitch() +{ + usart.initTX(); + uint8_t port = dsw.readPortB(); + usart.writeByte(port); + usart.flush(); +} + void rqAnalogWrite0() { usart.initTX(); @@ -101,8 +109,6 @@ void rqAdcDacStroke() int16_t start = static_cast(usart.readInt()); int16_t delta = static_cast(usart.readInt()); int16_t count = static_cast(usart.readInt()); - - //usart.writeByte(USART::MSG_OK); count *= delta; dio1.writePortA(0xFF); diff --git a/firmware/requests.h b/firmware/requests.h index 2644a82..271e2f3 100644 --- a/firmware/requests.h +++ b/firmware/requests.h @@ -13,10 +13,11 @@ constexpr static uint8_t RQ_BA0 = 5; constexpr static uint8_t RQ_BA1 = 6; constexpr static uint8_t RQ_BE0 = 7; constexpr static uint8_t RQ_BE1 = 8; -constexpr static uint8_t RQ_AA0 = 9; -constexpr static uint8_t RQ_AA1 = 10; -constexpr static uint8_t RQ_ADC = 11; -constexpr static uint8_t RQ_ADC_DAC_STROKE = 12; +constexpr static uint8_t RQ_DSW = 9; +constexpr static uint8_t RQ_AA0 = 10; +constexpr static uint8_t RQ_AA1 = 11; +constexpr static uint8_t RQ_ADC = 12; +constexpr static uint8_t RQ_ADC_DAC_STROKE = 13; uint8_t const rq_len[] = { /* RQ_DISC */ 1, @@ -28,6 +29,7 @@ uint8_t const rq_len[] = { /* RQ_BA1 */ 2, /* RQ_BE0 */ 1, /* RQ_BE1 */ 1, + /* RQ_DSW */ 1, /* RQ_AA0 */ 3, /* RQ_AA1 */ 3, /* RQ_ADC */ 2, @@ -42,6 +44,7 @@ void rqDigitalWrite0(void); void rqDigitalWrite1(void); void rqDigitalRead0(void); void rqDigitalRead1(void); +void rqReadDipSwitch(void); void rqAnalogWrite0(void); void rqAnalogWrite1(void); void rqAnalogRead(void); diff --git a/firmware/usart.cpp b/firmware/usart.cpp index 49868da..27f8ec3 100644 --- a/firmware/usart.cpp +++ b/firmware/usart.cpp @@ -22,7 +22,7 @@ void USART::clearInputBuffer() volatile do { dummy = UDR0; - _delay_us((1000000 / BAUDRATE) * 16); // Warte Übertragungszeit von 16 Bit ab + _delay_us(US_PER_BIT * 16); // Warte Übertragungszeit von 16 Bit ab } while (UCSR0A & (1<= rq_len[receive_buffer[0]]) // last byte of request { receive_pos = 0; @@ -84,6 +91,15 @@ void USART::flush(void) volatile void USART::writeByte(uint8_t b) volatile { send_buffer[send_pos++] = b; + + // calc crc + send_crc ^= b; + for (uint8_t i = 0; i < 8; i++) + { + if (send_crc & 1) + send_crc ^= CRC7_POLY; + send_crc >>= 1; + } } @@ -101,6 +117,11 @@ void USART::writeStr(const char* str, uint8_t len) volatile writeByte(*str++); } +void USART::writeCRC(void) volatile +{ + writeByte(send_crc); +} + uint8_t USART::writeBlock(uint8_t* ptr, uint8_t len) volatile { writeByte(len); diff --git a/firmware/usart.h b/firmware/usart.h index e490c89..1cca1e4 100644 --- a/firmware/usart.h +++ b/firmware/usart.h @@ -29,13 +29,14 @@ public: void initRX(void) volatile; void initTX(void) volatile; void handleRX(void) volatile; - void handleTX(void) volatile; + void handleTX(void) volatile; void flush(void) volatile; // Sendefunktionen void writeByte(uint8_t) volatile; void writeInt(uint16_t) volatile; void writeStr(const char*, uint8_t) volatile; + void writeCRC(void) volatile; // Empfangsfunktionen uint8_t readByte(void) volatile; @@ -52,24 +53,26 @@ public: // constants - constexpr static uint8_t MSG_OK = 0xFF; - constexpr static uint8_t MSG_FAIL = 0xFE; + constexpr static uint8_t MSG_OK = 0xFF; + constexpr static uint8_t MSG_FAIL = 0xFE; constexpr static uint32_t BAUDRATE = 115200; // 38400 constexpr static uint8_t CRC7_POLY = 0x91; constexpr static uint8_t MAX_BLOCK_SIZE = 64; constexpr static uint8_t BLOCK_END = 0x80; + constexpr static uint16_t US_PER_BIT = 1000000 / BAUDRATE; private: uint8_t block_buffer[MAX_BLOCK_SIZE + 3]; // don't store BLOCK_END byte uint8_t crc; - BlockSequence seq = BlockSequence::IDLE; + volatile BlockSequence seq = BlockSequence::IDLE; volatile uint8_t receive_buffer[128]; volatile uint8_t receive_pos; volatile uint8_t send_buffer[128]; volatile uint8_t send_pos; volatile uint8_t send_len; + volatile uint8_t send_crc; volatile bool send_active; };