From fd2cb56ef363f76f58e04e6a15e17a60e2669fce Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Wed, 3 Apr 2019 11:38:15 +0200 Subject: [PATCH] SPI macht interrupt --- driver/drv/b15f.h | 3 +- driver/gnuplotscript.gp | 39 +- driver/test_plot | Bin 1044 -> 37120 bytes firmware/B15F.elf | Bin 18748 -> 19168 bytes firmware/B15F.hex | 910 ++++++++++++++++++++-------------------- firmware/interrupts.cpp | 17 + firmware/main.cpp | 19 +- firmware/mcp23s17.cpp | 62 ++- firmware/spi.cpp | 59 ++- firmware/spi.h | 27 +- firmware/tlc5615.cpp | 7 +- 11 files changed, 605 insertions(+), 538 deletions(-) diff --git a/driver/drv/b15f.h b/driver/drv/b15f.h index e111a76..c25b028 100644 --- a/driver/drv/b15f.h +++ b/driver/drv/b15f.h @@ -174,14 +174,13 @@ public: /*************************/ private: - USART usart; + USART usart; static B15F* instance; // CONSTANTS const std::string PRE = "[B15F] "; - const std::string SERIAL_DEVICE = "/dev/ttyUSB0"; constexpr static uint8_t MSG_OK = 0xFF; constexpr static uint8_t MSG_FAIL = 0xFE; constexpr static uint16_t RECONNECT_TIMEOUT = 64; // ms diff --git a/driver/gnuplotscript.gp b/driver/gnuplotscript.gp index 3a594f7..5b0e0d3 100644 --- a/driver/gnuplotscript.gp +++ b/driver/gnuplotscript.gp @@ -2,36 +2,19 @@ set margin 10,10 unset key set grid set title '' -set xlabel 'U_{GS} [V]' +set xlabel 'U_{DS} [V]' set ylabel 'I_D [mA]' -set xrange [5:0] -set x2range [5:0] -set y2range [0:50] +set xrange [0:5] set yrange [0:50] -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 '' +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,41 'U_{GS} [V] = 560' left +set label at 0,42 'U_{GS} [V] = 580' left +set label at 0,42 'U_{GS} [V] = 600' left unset output set terminal qt unset output -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 +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 diff --git a/driver/test_plot b/driver/test_plot index 9a716f70b0600c13d3e9282481794c3461d05062..f98a2e78b7db5b05ce06e9db5587d25d08f75dad 100644 GIT binary patch literal 37120 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 diff --git a/firmware/B15F.elf b/firmware/B15F.elf index 1acb1307e1ac7e7d639e8eb72467b5e35ac843d9..41f304a70562e54735f3d9b7fb72941b8db29ee3 100755 GIT binary patch delta 4553 zcmbW53s6+o8OP7PyNipxdw0>`16Wv5sU;}j1C66rO(>wmHVLuuQM2oFMXS*`K00ac zu7Ieh<8l^*m@>xBIG9>TByBW7M5oilGzyw%Fj2f1N4E|J$=GI0RQf;nv3t9tsnaua z&z|3RzVn^$`_AKDXsqPqDsHEXZ_5v)rsk$66T%(~A%w@n;b{UB&Zo$;&}2^x6KT&k z=+8nwdsy)Xw#*XqMIm_CCIl;p5KI;Wccx`u6h9MN#XpH>#81SJ#J`Cr#U}B9_@Q`7 zye!5INoi{7YQ5fm;>?LSd9PeA-@5jYF5?nM);)8iSI2h_`Q(jO+1xznt%sZ#>}_w( zIoIp-cVcigX6b7ef`pX5UoMrNa8$YpoyYf+wudTZF*tx*A9TxGmG%{GWtZBz$GPS5 zuuN^;LvN`fyT@(6$;O`K{a*+0d(6ash2SMq3$3eCWqj<%nchrwWIXSx*_OFezRzX9 zbvvuul6CjioF2z71$Ze2U$UtKF45ocPHCyFvqcPU5&nsKpKt^9Y2jD6Rv9#)~_1ipKkNIwIJMIr{ zKVDH^@@B=c*)?-&=GIuN?sFT}9<14$$)!FNvZ%YAR*&unC-Bmu~FRCbmy2|`z z!}>e!IAFH+xV0+UgbyYTbZ;#4$31BA%Nxtp{yp{X2TwQq5f&?F)z=cxXY|n+3&02dt+P)4poo?12ccCTP*~+p2-1Ly#z~KuaDK=CH{pW+F-{GSIqwMvCq*W6hy7JsYMde>WJAQ@pSh6# zp1(wi+*Wy(IIs;d*Y|nTzdQj zXG=n}Eidr#JiTa1v#LiNaKw_T$}-rGIVP2>rK@6wJN-E2Y%zskEzg2#mRsc}ZijN_ znZ{VYmSjA9$CE@m`qdW)!AO>y_x#F>LtP?`t@)Lr?-R0$u^0> zQFva#^Lsj|*A@6xY2AyuVV`xFLuywp8ZpQ&mz7=Wy-{gio~gIkFLQgkS(UV#7RY*E zp}gSQDvfSh3gqIB2o=gJ7+=He_KK00=r&f)y{60=2vI39OP~|L8eQn{=66Ln9RFZ2*iyYOUpn?c{XN=7w8!wQlY}ZL4q;Pu!4|U3wBfjlW_k z{8v*rg1Rd2aDCD@xTWFtHqBDI>3yvgV>y};ZmJVbH-BRL%E?SNeyd8_P2ni%y2KQI zx|wz+W^kQ!VA4-ni%&4qgrqby)2!;dHl2fDBs*&}k`mZYaZ+;jkH08y&+d7|d$RwO zGdM9zZMRWRwB16TVY`Vs(RLkmZ(9fIyFxqacHt}3r-e4u`-BUqw+QD^OVsY{|4bYA zto+;1YVB3u#^oxc?v6HYvO?Q-SPZU zXG8j^LmWRWnSMEXQfd}HkA~oDrw_i93h*g3A&HP8jb8>Yj-lhnjF6s6AS6{2Z-;nh zA3`pg)M0-FR}RDnm)8GRa7I5uZoo7%+XDUoy5qF|5cny4dA+Fdzro)c`t2Ae^d{sK zj9%!CwDXHH_=yk4-V^#suKJuS#d;nS08an2;Zx)*&n zXM{AHeg2_1NO#X*%(fb1(!gwnG2jXKR{Vv=Gr&{v4A9tvc0YK-iVOP7qj)`dB*w#O z#oi9^5!lyxpNUAMnTc0YJ-?OZ+0J^}ZR8;K!0IueJ zio`)o#Ddi9fJ37pVfF@^rT>m#C=>{LP?*69Xs01_y2troW5h+^t(XAwkT}${z=r|4 z{%cYCZ-8|NS;k5v2xc1wP;dyFMvu4-oQ*HPtj|z!*^lSpQqYfxkj_fgi%4KEb+!xZL1SM^yi9F#ERwE9{tl5AK6qKN8F)bijGzgh^nm zmQt9*qrk5ukn!QyXFde#ekbMQ^cbVXh|dv(_2rCQj(M7;E5-eCTlWO^eH zhd+gi`DvEPDR|>kPkvuonD5}vr_p&3{xBS;m9EO`OW%etegr)P;ji6-p+QOd+vq`45o{B}@PS delta 4282 zcmbW5e{>Yp702J3-E7t}JNW?-#Dx4HZYhTBf=ECphR~o%Q^Zh3*)!W(k7t_90CE)=|QAywABI@myYJnZ*=UV?e~>q%Nn;-gWMt%DNoI_$7{-`{i{q+Jp+==H_oGRdi$vzN z8+t$VbWxcfcxARy%jD2Hj~t@=PEX)U;php=B~wXPWM!B#NqJaF z$V@#D?(I5%=HQRIwR)D^OZdYyb4^;Y>5>K*c5QSX!g zg8E(gJ=7l0@vytGy0!Az>b>5rHLaUUYxY+DeN#u3R@YJ6x_)i#-lw9G1^{UGpft*;f4+xJ!RfN(?tYOO4KYQqQx_)a|{TX3fyhMX2^Z7y6=^`~Om9o9;ntzEyp z|Kz@5xWQfSi<}ih7K!1j!R^7{1rG+p!Lz~MU|-NW_^LH{W46`WYPOo)m$@NpcF*l^ zwKSLT9nD?x9$X2T%X+Qw9!okMQ}pix{cCG!EFWdL^JBiGzrD${RN;7wT4RvmA?F@b zX!xt(upRY$ltL!=e`dH);pkt#n3J3;opgw<2g~oH_ISc!QA;v5}_!P4J^hj9q|fG8-m6+IgnF2kgfOPqE2gfUnr}acGaY zi?PFy)A;)&CQ@_Kr_6|DtjruUAAPQ4{%Iz!2H%bTRMIf!W$+q&Gz|iijR5IIRZgmO zC0YD3XR@^0B|gr{R@3NP3niXi?Hdkz^%&y?)0hXrMb3zy)4}#RW=HWta31=9!yNx3 z@Nw9)_*HNxbX4MD{}&FX-ePbkI(&*iXQ2Z*Z~$zd@F&*aEJyP584YeM=PYj^cyh9({3Gpd_*5 z;4$z%&s?DTPY5stRfvF-eF;7yGj<6~Ayep_+RlCk*ebM#S>Q>?g>h#8DPVhuzX!Iy z)8p|4{}g!W(0=u1zCq*lMHpN7NAM{q6CtJ*e*iv# zinV1DpUJT%@n`#%V_ zM<5q$&x$9(L$Tc}slSQ|${<)_-xF{fQoY_Z7zDow{WOz*3${uc4(%SWeZsfFTX86{ zi~0giMCs4bcr#)uoq8uGE5d*xbHHHmVcRLaA6zX(PQ4FopKv1ha~Pd#j(Sg$(&mAzleVn}@NbSS4`)Y^4nyvh7j)8*pDPW<#L}w1Y1p2hSj^H2xU40qxDu z6Q2b~wv4lxnA~_yAphyqUqA{l(Ca z3h6VzPTQ+B8+^uz2dDKCoYdYidA_4PJ8w7_rBkQ3ADudpi+l3l8Tj<{C%^l^%ozpa zpMUAa^1Rh67Uq|?Yx!vo(f4SARGlIc3r5mAZE`_I4EsT`PQewRps@3p0lN;M+)k-F@AA1j8u* E0k&qkZU6uP diff --git a/firmware/B15F.hex b/firmware/B15F.hex index 8936bcf..4c49a26 100644 --- a/firmware/B15F.hex +++ b/firmware/B15F.hex @@ -2,225 +2,225 @@ :100010000C948B000C948B000C948B000C948B0034 :100020000C948B000C948B000C948B000C948B0024 :100030000C948B000C948B000C948B000C948B0014 -:100040000C948B000C948B000C948B000C948B0004 -:100050000C94820D0C948B000C94AC0D0C948B00C2 +:100040000C948B000C948B000C948B000C94480E39 +:100050000C94F40D0C948B000C941E0E0C948B00DD :100060000C948B000C948B000C948B000C948B00E4 :100070000C948B000C948B000C948B000C948B00D4 :100080000C948B000C948B000C948B00F500F80002 :10009000FB00E100FE000101040107010A010D015E -:1000A000DF00F2001001390E360E330E0E0E300E48 -:1000B0002D0E2A0E270E240E210E0C0E1E0E3C0EA7 -:1000C0003F0E11241FBECFEFD0E4DEBFCDBF11E045 -:1000D000A0E0B1E0E0EFFCE100E00BBF02C0079060 +:1000A000DF00F2001001D60ED30ED00EAB0ECD0E37 +:1000B000CA0EC70EC40EC10EBE0EA90EBB0ED90EBF +:1000C000DC0E11241FBECFEFD0E4DEBFCDBF11E0A8 +:1000D000A0E0B1E0EAE2FEE100E00BBF02C0079061 :1000E0000D92A033B107D9F722E0A0E3B1E001C03F -:1000F0001D92AE38B207E1F710E0C1E6D0E004C0CF -:100100002197FE010E946D0EC036D107C9F70E94EB -:10011000D60D0C94760E0C9400008DE892E00E94AF -:10012000140160E08AE892E00E9457016FEF8AE8CC -:1001300092E00E94780160E087E892E00E94570117 -:100140006FEF87E892E00E9478016FEF84E892E019 -:100150000E9478018DE792E00E944F0281E391E0D6 -:100160000E94470381E391E00E946703789484B77B -:10017000877F84BF109260000FB6F894A895809195 -:100180006000886180936000109260000FBE089547 -:10019000CF93A89581E391E00E949008C82F682F23 -:1001A00087E892E00E9499018C2F90E0FC01319742 -:1001B000ED30F10530F4EA5BFF4F0C946D0E0E94B8 -:1001C000E10C81E391E00E9467030FB6F894A895D3 +:1000F0001D92A839B207E1F710E0C1E6D0E004C0D4 +:100100002197FE010E940A0FC036D107C9F70E944D +:10011000720E0C94130F0C94000084B7877F84BF79 +:10012000109260000FB6F894A895809160008861E5 +:1001300080936000109260000FBE8DE892E00E94F4 +:100140001801789460E08AE892E00E94DD016FEF88 +:100150008AE892E00E94F90160E087E892E00E945C +:10016000DD016FEF87E892E00E94F9016FEF84E80C +:1001700092E00E94F9018DE792E00E94C10281E3C2 +:1001800091E00E94B90381E391E00C94D903CF93ED +:10019000A89581E391E00E940209C82F682F87E8A3 +:1001A00092E00E941502209A8C2F90E0FC0131977A +:1001B000ED30F10530F4EA5BFF4F0C940A0F0E941A +:1001C000530D81E391E00E94D9030FB6F894A895EE :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 -: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 +:1001E000CF9108950E94690DECCF0E94890CE9CF50 +:1001F0000E94A20CE6CF0E94C90CE3CF0E94DE0C45 +:10020000E0CF0E94F40CDDCF0E940A0DDACF0E94ED +:100210001B0DD7CF0E942C0DD4CF0E943D0DD1CF06 +:100220000E947F0DCECFFC011086118612860895A4 +:1002300084B1806B84B926988AB18C618AB980EDCB +:100240008CBD81E88DBD8BB1837E8BB95A9A5B9A48 +:100250005C9A0895FC0182858823B1F08085DF01D6 +:10026000A80FB11D9C91808521E0280F20872EB515 +:10027000DF01A80FB11D2C9320858185281710F070 +:10028000108612869EBD08958BB1837E8BB95A9AD3 +:100290005B9A5C9A0895FC0180858823A9F1828588 +:1002A0008111FDCF81E082878BB1837E8BB99BB1B9 +:1002B00060FD2BC080E0892B8BB99BB161FD2BC009 +:1002C00080E0892B8BB99BB162FD2BC080E0892B2C +:1002D0008BB98085818710868285882359F1808536 +:1002E000DF01A80FB11D9C91808521E0280F208798 +:1002F0002EB5DF01A80FB11D2C932085818528170D +:1003000010F0108612869EBD089584E0892B8BB96B +:100310009BB161FFD5CF88E0892B8BB99BB162FF80 +:10032000D5CF80E1892B8BB9808581871086828526 +:100330008111D5CF8BB1837E8BB95A9A5B9A5C9A27 +:100340000895FC0192859111FDCF808591E0980F71 +:100350009087E80FF11D60830895FC01928591114B +:10036000FDCF08958BB1837E8BB98BB160FD10C03A +:1003700090E0892B8BB98BB161FD10C090E0892B87 +:100380008BB98BB162FD10C090E0892B8BB90895B9 +:1003900094E0892B8BB98BB161FFF0CF98E0892B6A +:1003A0008BB98BB162FFF0CF90E1892B8BB90895A7 +:1003B000FC0171836083428308951F93CF93DF9381 +:1003C000EC01162F8881998160E40E94A101888147 +:1003D000998160E00E94A10188819981612F0E942A +:1003E000A1016A8188819981DF91CF911F910C943D +:1003F0004B011F93CF93DF93EC01162F88819981D6 +:1004000060E40E94A1018881998161E00E94A101BC +:1004100088819981612F0E94A1016A8188819981D7 +:10042000DF91CF911F910C944B011F93CF93DF93DA +:10043000EC01162F8881998160E40E94A1018881D6 +:10044000998162E10E94A10188819981612F0E94B6 +:10045000A1016A8188819981DF91CF911F910C94CC +:100460004B011F93CF93DF93EC01162F8881998165 +:1004700060E40E94A1018881998163E10E94A10149 +:1004800088819981612F0E94A1016A818881998167 +:10049000DF91CF911F910C944B01CF93DF93EC012F +:1004A0008881998161E40E94A1018881998162E13A +:1004B0000E94A1018881998160E00E94A101888148 +:1004C000998160E00E94A1016A81888199810E94DE +:1004D0004B01888199810E94AD01E881F981838176 +:1004E000DF91CF910895CF93DF93EC0188819981BB +:1004F00061E40E94A1018881998163E10E94A101C8 +:100500008881998160E00E94A1018881998160E0E1 +:100510000E94A1016A81888199810E944B01888192 +:1005200099810E94AD01E881F9818381DF91CF91AA +:100530000895FC0171836083428308950F931F9394 +:10054000CF93DF93EC018B01888199810024660FA2 +:10055000771F001C660F771F001C672F702D0E94ED +:10056000A10188819981602F660F660F0E94A10109 +:100570006A8188819981DF91CF911F910F910C94AD +:100580004B0110927C0087E880937A000895809157 +:100590007C00807E682B60937C0080917A00806470 +:1005A00080937A0083EA91E00197F1F700C00000A0 +:1005B00080917A0086FDFCCF80917800909179003F +:1005C00008950F931F93CF93DF9361E08AE892E041 +:1005D0000E941502C1E0D0E001E010E02FEF84E3BB +:1005E0009CE0215080409040E1F700C00000B8013D +:1005F0000C2E01C0660F0A94EAF78AE892E00E9486 +:1006000015022196C930D10549F7DF91CF911F918D +:100610000F9108950F931F93CF93DF9361E087E8C5 +:1006200092E00E941502C1E0D0E001E010E02FEF5F +:1006300084E39CE0215080409040E1F700C000003E +:10064000B8010C2E01C0660F0A94EAF787E892E021 +:100650000E9415022196C930D10549F7DF91CF914B +:100660001F910F910895CF93DF93C0E0D0E0BE01BA +:1006700081E892E00E949E0287E893E10197F1F7FA +:1006800000C000002196C11594E0D90781F72FE73B +:100690008AE196E0215080409040E1F700C00000E0 +:1006A00060E070E081E892E0DF91CF910C949E02CF +:1006B000CF93DF93C0E0D0E0BE018EE792E00E94CE +:1006C0009E0287E893E10197F1F700C000002196B0 +:1006D000C11594E0D90781F72FE78AE196E0215010 +:1006E00080409040E1F700C0000060E070E08EE7DD +:1006F00092E0DF91CF910C949E020FB6F894A895EA +:1007000080916000886180936000109260000FBE4D +:1007100060E08DE792E00E94C702BC0181E892E0B0 +:100720000E949E0261E08DE792E00E94C702BC0138 +:100730008EE792E00E949E028AE892E00E94730295 +:10074000682F8AE892E00E94150284E892E00E94F5 +:100750007302682F87E892E00E941502D9CF0E94A9 +:10076000E1020E940A030E9433030E9458030E9480 +:100770007D0322E02093C00028ED2093C10026E0F5 +:100780002093C2001092C50024E12093C400855B31 +:100790009E4FFC01108208958091C6008FE792E081 +:1007A0000197F1F700C000008091C00087FDF4CFF1 +:1007B000089589539F4FFC01108208959C01FC010C +:1007C000E55BFE4F90819111FDCFF901E85BFE4F93 +:1007D0001082329610820895DC01A953BF4F2C91EC +:1007E00031E0320F3C933091C600FC01E20FF11D65 +:1007F000E95BFF4F30832C91213081F02C91FC017B +:10080000E95BFF4FE081F0E0E050FF4F8081281767 +:1008100020F01C9281E080933001089538E028E1B7 +:100820000FB6F894A895209360000FBE3093600037 +:10083000A895E4CF0F931F93CF93DF93EC018C0126 +:10084000085B1E4FF80160818AE892E00E94150261 +:10085000F801908131968081981740F0C55BDE4F9A +:100860001882DF91CF911F910F9108958091C00060 +:1008700085FFFCCFF801808191E0980F9083C80F2D +:10088000D11DC853DF4F88818093C600DF91CF917F +:100890001F910F910895CF92DF92EF92FF920F93E5 +:1008A0001F93CF93DF93EC01C85BDE4F28812111AA +:1008B00009C0DF91CF911F910F91FF90EF90DF90D2 +:1008C000CF9008958C018881780197EBE91A9EEF0B +:1008D000F90AF701808318826801F5EBCF1AFEEF61 +:1008E000DF0A81E0F601808368818AE892E00E9455 +:1008F00015029881F7018081981788F49091C000C3 +:1009000095FFFCCF888191E0980F9883E801C80F8C +:10091000D11DC853DF4F88818093C600CACFF6012E +:100920001082C7CFFC01E85BFE4F208131E0320F1F +:100930003083FC01E20FF11DE853FF4F6083FC019F +:10094000E65BFE4F808168276083808180FF04C062 +:10095000908181E989278083808190E095958795B2 +:100960008083808180FF04C0908181E98927808312 +:10097000808190E0959587958083808180FF04C079 +:10098000908181E989278083808190E09595879582 +:100990008083808180FF04C0908181E989278083E2 +:1009A000808190E0959587958083808180FF04C049 +:1009B000908181E989278083808190E09595879552 +:1009C0008083808180FF04C0908181E989278083B2 +:1009D000808190E0959587958083808180FF04C019 +:1009E000908181E989278083808190E09595879522 +:1009F0008083808180FF04C0908181E98927808382 +:100A0000808190E09595879580830895DC01A85BAF +:100A1000BE4F2C9131E0320F3C93FC01E20FF11DEF +:100A2000E853FF4F6083FC01E65BFE4F20816227A5 +:100A30006083208120FF04C0308121E923272083A7 +:100A4000208130E0359527952083208120FF04C048 +:100A5000308121E923272083208130E035952795B7 +:100A60002083208120FF04C0308121E923272083B7 +:100A7000208130E0359527952083208120FF04C018 +:100A8000308121E923272083208130E03595279587 +:100A90002083208120FF04C0308121E92327208387 +:100AA000208130E0359527952083208120FF04C0E8 +:100AB000308121E923272083208130E03595279557 +:100AC0002083208120FF04C0308121E92327208357 +:100AD000208130E0359527952083208120FF04C0B8 +:100AE000308121E923272083208130E03595279527 +:100AF00020832C9131E0320F3C93820F911DDC0159 +:100B0000A853BF4F7C93808178277083808180FFBA +:100B100004C0908181E989278083808190E0959548 +:100B200087958083808180FF04C0908181E9892737 +:100B30008083808190E0959587958083808180FF78 +:100B400004C0908181E989278083808190E0959518 +:100B500087958083808180FF04C0908181E9892707 +:100B60008083808190E0959587958083808180FF48 +:100B700004C0908181E989278083808190E09595E8 +:100B800087958083808180FF04C0908181E98927D7 +:100B90008083808190E0959587958083808180FF18 +:100BA00004C0908181E989278083808190E09595B8 +:100BB00087958083808180FF04C0908181E98927A7 +:100BC0008083808190E095958795808308950F9329 +:100BD0001F93CF93DF93DC01A85BBE4F2C9131E0D4 +:100BE000320F3C93FC01E20FF11DE853FF4F4083AD +:100BF000FC01E65BFE4F208124272083208120FF1B +:100C000004C0308121E923272083208130E03595FD +:100C100027952083208120FF04C0308121E92327EC +:100C20002083208130E0359527952083208120FF87 +:100C300004C0308121E923272083208130E03595CD +:100C400027952083208120FF04C0308121E92327BC +:100C50002083208130E0359527952083208120FF57 +:100C600004C0308121E923272083208130E035959D +:100C700027952083208120FF04C0308121E923278C :100C80002083208130E0359527952083208120FF27 -:100C900003C0208124272083208130E035952795CB -:100CA0002083208120FF03C02081242720832081EE -:100CB00030E0359527952083515008F094CFDF918F -:100CC000CF911F910F910895FC01E65BFE4F2081AB -:100CD000DC01A85BBE4F3C9141E0430F4C93830F76 -:100CE000911DDC01A853BF4F2C9380818227808304 -:100CF000808180FF04C0908181E989278083808181 -:100D000090E0959587958083808180FF04C09081D5 -:100D100081E989278083808190E0959587958083FC -:100D2000808180FF04C0908181E989278083808150 -:100D300090E0959587958083808180FF04C09081A5 -:100D400081E989278083808190E0959587958083CC -:100D5000808180FF04C0908181E989278083808120 -:100D600090E0959587958083808180FF04C0908175 -:100D700081E989278083808190E09595879580839C -:100D8000808180FF04C0908181E9892780838081F0 -:100D900090E0959587958083808180FF04C0908145 -:100DA00081E989278083808190E09595879580836C -:100DB0000895CF92DF92EF92FF920F931F93CF93FC -:100DC000DF936C018C01085B1E4FD8018C9191E080 -:100DD000980F9C93F601E80FF11DE853FF4F4083F5 -:100DE000F601E65BFE4F808184278083808180FF4F +:100C900004C0308121E923272083208130E035956D +:100CA00027952083208120FF04C0308121E923275C +:100CB0002083208130E03595279520835FEF540F06 +:100CC000442309F46EC08B0141E9E80139918E019A +:100CD0002C9161E0620F6C93BC01620F711D68532F +:100CE0007F4FEB013883208123272083208120FF41 +:100CF00003C0208124272083208130E0359527956B +:100D00002083208120FF03C020812427208320818D +:100D100030E0359527952083208120FF03C0208176 +:100D200024272083208130E035952795208320815A +:100D300020FF03C0208124272083208130E03595C7 +:100D400027952083208120FF03C020812427208332 +:100D5000208130E0359527952083208120FF03C036 +:100D6000208124272083208130E03595279520831A +:100D7000208120FF03C0208124272083208130E0B0 +:100D8000359527952083208120FF03C020812427CB +:100D90002083208130E0359527952083515008F03D +:100DA00094CFDF91CF911F910F910895FC01E65BE5 +:100DB000FE4F2081DC01A85BBE4F3C9141E0430F18 +:100DC0004C93830F911DDC01A853BF4F2C9380815E +:100DD00082278083808180FF04C0908181E98927F8 +:100DE0008083808190E0959587958083808180FFC6 :100DF00004C0908181E989278083808190E0959566 :100E000087958083808180FF04C0908181E9892754 :100E10008083808190E0959587958083808180FF95 @@ -231,237 +231,257 @@ :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 +:100E9000879580830895CF92DF92EF92FF920F9310 +:100EA0001F93CF93DF936C018C01085B1E4FD80119 +:100EB0008C9191E0980F9C93F601E80FF11DE85397 +:100EC000FF4F4083F601E65BFE4F808184278083DD +:100ED000808180FF04C0908181E98927808380819F +:100EE00090E0959587958083808180FF04C09081F4 +:100EF00081E989278083808190E09595879580831B +:100F0000808180FF04C0908181E98927808380816E +:100F100090E0959587958083808180FF04C09081C3 +:100F200081E989278083808190E0959587958083EA +:100F3000808180FF04C0908181E98927808380813E +:100F400090E0959587958083808180FF04C0908193 +:100F500081E989278083808190E0959587958083BA +:100F6000808180FF04C0908181E98927808380810E +:100F700090E0959587958083808180FF04C0908163 +:100F800081E989278083808190E09595879580838A +:100F90005FEF540F442309F433C1DB0120E041E942 +:100FA000BD019C91E801888131E0380F38837601DA +:100FB000E80EF11CD8ECED0EF11CE701988380815E +:100FC00089278083808180FF03C08081842780837C +:100FD000808190E0959587958083808180FF03C014 +:100FE000808184278083808190E095958795808398 +:100FF000808180FF03C0808184278083808190E08E +:10100000959587958083808180FF03C080818427A8 +:101010008083808190E0959587958083808180FF93 +:1010200003C0808184278083808190E09595879597 +:101030008083808180FF03C08081842780838081BA +:1010400090E0959587958083808180FF03C08081A3 +:1010500084278083808190E0959587958083808127 +:1010600080FF03C0808184278083808190E09595F4 +:10107000879580831196EB019881292720FD2427ED +:1010800030E035952795822F20FF02C0842F8227DC +:1010900090E095958795282F80FF02C0242F282760 +:1010A00030E035952795822F20FF02C0842F8227BC +:1010B00090E095958795282F80FF02C0242F282740 +:1010C00030E035952795822F20FF02C0842F82279C +:1010D00090E095958795682F80FF02C0642F682760 +:1010E00070E075956795262F60FF02C0242F262794 +:1010F0002695515008F054CFD8018C9191E0980F6B +:101100009C93D601A80FB11DA853BF4F2C9380818B +:1011100028272083808180FF04C0908181E989276E +:101120008083808190E0959587958083808180FF82 +:1011300004C0908181E989278083808190E0959522 +:1011400087958083808180FF04C0908181E9892711 +:101150008083808190E0959587958083808180FF52 +:1011600004C0908181E989278083808190E09595F2 +:1011700087958083808180FF04C0908181E98927E1 +:101180008083808190E0959587958083808180FF22 +:1011900004C0908181E989278083808190E09595C2 +:1011A00087958083808180FF04C0908181E98927B1 +:1011B0008083808190E0959587958083808180FFF2 +:1011C00004C0908181E989278083808190E0959592 +:1011D00087958083F601E953FF4F808191E0980F56 +:1011E0009083E601C80FD11DC95BDF4F8881DF9175 +:1011F000CF911F910F91FF90EF90DF90CF900895C6 +:1012000020E07ACFFC01E953FF4F208131E0320F1B +:101210003083820F911DFC01E95BFF4F80810895AF +:10122000FC01E953FF4F208131E0320F3083DC01B4 +:10123000A20FB11DA95BBF4F2C91308141E0430F3C +:101240004083830F911DFC01E95BFF4F3081822FAA +:1012500090E0932B0895CF93DF93DC01EC01CB5BFF +:10126000DF4F888199818230910509F446C1A0F44D +:10127000009709F41BC1019749F48C91FD01E80F17 +:10128000F11D618382E090E0998388838C918F5F68 +:101290008C93DF91CF9108958330910509F491C02B +:1012A0000497A1F78091C6008FE792E00197F1F7CC +:1012B00000C000008091C00087FDF4CFFD01EC5B11 +:1012C000FF4F8081882309F49DC19EEFFD01E85BFB +:1012D000FE4F808121E0280F2083FD01E80FF11DE2 +:1012E000E853FF4F9083FD01E65BFE4F8081892725 +:1012F0008083808180FF04C0908181E98927808379 +:10130000808190E0959587958083808180FF04C0DF +:10131000908181E989278083808190E095958795E8 +:101320008083808180FF04C0908181E98927808348 +:10133000808190E0959587958083808180FF04C0AF +:10134000908181E989278083808190E095958795B8 +:101350008083808180FF04C0908181E98927808318 +:10136000808190E0959587958083808180FF04C07F +:10137000908181E989278083808190E09595879588 +:101380008083808180FF04C0908181E989278083E8 +:10139000808190E0959587958083808180FF04C04F +:1013A000908181E989278083808190E09595879558 +:1013B0008083198218828C918F5F8C93DF91CF91FB +:1013C00008958C91FD01E80FF11D6183FD01EC5B37 +:1013D000FF4F808168276083808180FF04C09081F7 +:1013E00081E989278083808190E095958795808326 +:1013F000808180FF04C0908181E98927808380817A +:1014000090E0959587958083808180FF04C09081CE +:1014100081E989278083808190E0959587958083F5 +:10142000808180FF04C0908181E989278083808149 +:1014300090E0959587958083808180FF04C090819E +:1014400081E989278083808190E0959587958083C5 +:10145000808180FF04C0908181E989278083808119 +:1014600090E0959587958083808180FF04C090816E +:1014700081E989278083808190E095958795808395 +:10148000808180FF04C0908181E9892780838081E9 +:1014900090E095958795808384E090E09983888398 +:1014A0008C918F5F8C93DF91CF910895613408F414 +:1014B000ABC08091C6008FE792E00197F1F700C0C2 +:1014C00000008091C00087FDF4CFFD01E85BFE4F76 +:1014D000808191E0980F9083FD01E80FF11DE853A2 +:1014E000FF4F8EEF8083FD01E65BFE4F90818927E1 +:1014F0008083808180FF04CFFFCE8C91FD01E80FB7 +:10150000F11D6183FD01EC5BFF4F808168276083E3 +:10151000808180FF04C0908181E989278083808158 +:1015200090E0959587958083808180FF04C09081AD +:1015300081E989278083808190E0959587958083D4 +:10154000808180FF04C0908181E989278083808128 +:1015500090E0959587958083808180FF04C090817D +:1015600081E989278083808190E0959587958083A4 +:10157000808180FF04C0908181E9892780838081F8 +:1015800090E0959587958083808180FF04C090814D +:1015900081E989278083808190E095958795808374 +:1015A000808180FF04C0908181E9892780838081C8 +:1015B00090E0959587958083808180FF04C090811D +:1015C00081E989278083808190E095958795808344 +:1015D0009C9111968C911197981719F19C911196E5 +:1015E0008C911197981708F451CE8091C6008FE71F +:1015F00092E00197F1F700C000008091C00087FDE4 +:10160000F4CF63CF9FEF62CE11966C931197FD01DB +:10161000EC5BFF4F10821C9281E090E099838883FD +:1016200035CE83E090E09983888330CE8F929F926D +:10163000AF92BF92DF92EF920F931F93CF93DF93FE +:10164000DC01A953BF4F9C01285B3E4F4901FC01BF +:10165000E65BFE4F11E95B01A40EB11C2EEFD22E0A +:101660002C9131E0320F3C93AC01420F511D9A0195 +:10167000295B3F4FE9016881603809F4DBC06134C0 +:1016800008F060E000E020E03C9141E0430F4C9323 +:10169000AC01430F511DEA01C95BDF4FE8802E25E5 +:1016A00020FD212730E035952795422F20FF02C0ED +:1016B000412F4227242F30E035952795422F20FFD8 +:1016C00002C0412F422750E055954795242F40FFF7 +:1016D00002C0212F242730E035952795422F20FF87 +:1016E00002C0412F422750E055954795242F40FFD7 +:1016F00002C0212F242730E035952795422F20FF67 +:1017000002C0412F422750E055954795242F40FFB6 +:1017100002C0212F24272695061708F4F4C00F5F76 +:10172000601708F0B1CF3091C600CFE7D2E0219723 +:10173000F1F700C000003091C00037FDF4CF222344 +:1017400009F476C00EEFE401488131E0340F3883AC +:10175000BC01640F711DAB0148535F4FEA01088360 +:10176000308130273083308130FF03C03081312712 +:101770003083408150E0559547954083308130FF5C +:1017800003C0308131273083408150E05595479523 +:101790004083308130FF03C0308131273083408166 +:1017A00050E0559547954083308130FF03C030812C +:1017B00031273083408150E05595479540833081F3 +:1017C00030FF03C0308131273083408150E0559590 +:1017D00047954083308130FF03C03081312730830B +:1017E000408150E0559547954083308130FF03C0DC +:1017F000308131273083408150E0559547954083B3 +:10180000308130FF03C0308131273083408150E088 +:10181000559547954083211123CFDF91CF911F919B +:101820000F91EF90DF90BF90AF909F908F900895B1 +:101830000FEF89CFE401288131E0320F3883AC010A +:10184000420F511D9A0128533F4FE901D882208150 +:101850002D252083208120FF03C020812127208384 +:10186000208130E0359527952083208120FF03C01B +:10187000208121272083208130E035952795208302 +:10188000208120FF03C0208121272083208130E098 +:10189000359527952083208120FF03C020812127B3 +:1018A0002083208130E0359527952083208120FFFB +:1018B00003C0208121272083208130E035952795A2 +:1018C0002083208120FF03C02081212720832081C5 +:1018D00030E0359527952083208120FF03C02081AB +:1018E00021272083208130E0359527952083208192 +:1018F00020FF03C0208121272083208130E03595FF +:1019000027952083ADCEA501400F511DEA01E88245 +:1019100006CFCF9381E391E00E94DE0381E391E063 +:101920000E940209C82F6FEF81E391E00E949204A8 +:101930006C2F81E391E00E94920481E391E0CF91CA +:101940000C944B0481E391E00E94DE0363E081E3A9 +:1019500091E00E9492044CE063E271E081E391E047 +:101960000E94E70549E06AE171E081E391E00E94AD +:10197000E7054CE06EE071E081E391E00E94E7054D +:101980006FEF81E391E00E94920481E391E00C9477 +:101990004B0481E391E00E94DE0381E391E00E9429 +:1019A0001009BC01660F771F680F791F81E391E072 +:1019B0000E94060581E391E00C944B0481E391E0E1 +:1019C0000E94DE0381E391E00E940209682F8AE809 +:1019D00092E00E9415026FEF81E391E00E94920471 +:1019E00081E391E00C944B0481E391E00E94DE03DB +:1019F00081E391E00E940209682F87E892E00E944B +:101A000015026FEF81E391E00E94920481E391E07F +:101A10000C944B0481E391E00E94DE038AE892E09B +:101A20000E947302682F81E391E00E94920481E397 +:101A300091E00C944B0481E391E00E94DE0387E87F +:101A400092E00E947302682F81E391E00E94920469 +:101A500081E391E00C944B0481E391E00E94DE036A +:101A600084E892E00E947302682F81E391E00E9473 +:101A7000920481E391E00C944B0481E391E00E9495 +:101A8000DE0381E391E00E941009BC0181E892E04D +:101A90000E949E026FEF81E391E00E94920481E335 +:101AA00091E00C944B0481E391E00E94DE0381E31A +:101AB00091E00E941009BC018EE792E00E949E0214 +:101AC0006FEF81E391E00E94920481E391E00C9436 +:101AD0004B0481E391E00E94DE0381E391E00E94E8 +:101AE0000209682F8DE792E00E94C702BC0181E3E2 +:101AF00091E00E94060581E391E00C944B048F92E3 +:101B00009F92AF92BF92CF92DF92EF92FF920F938C +:101B10001F93CF93DF9381E391E00E940209882E07 +:101B200081E391E00E940209982E81E391E00E94F6 +:101B30001009EC0181E391E00E9410095C0181E34E +:101B400091E00E941009A89E6001A99ED00CB89E49 +:101B5000D00C11246FEF87E892E00E941502CC159B +:101B6000DD054CF5BE0181E892E00E949E02A89539 +:101B7000682D8DE792E00E94C7027C01692D8DE7F8 +:101B800092E00E94C7028C0181E391E00E94DE0393 +:101B9000B70181E391E00E940605B80181E391E07D +:101BA0000E94060581E391E00E944B04CA0DDB1DF3 +:101BB000CC15DD05BCF281E391E00E94DE036FEFFE +:101BC00081E391E00E94920481E391E0DF91CF9163 +:101BD0001F910F91FF90EF90DF90CF90BF90AF904B +:101BE0009F908F900C944B041F920F920FB60F9200 +:101BF00011240BB60F922F933F934F935F936F93E4 +:101C00007F938F939F93AF93BF93EF93FF9381E362 +:101C100091E00E94EC03FF91EF91BF91AF919F91F2 +:101C20008F917F916F915F914F913F912F910F9085 +:101C30000BBE0F900FBE0F901F9018951F920F9222 +:101C40000FB60F9211240BB60F922F933F934F9321 +:101C50005F936F937F938F939F93AF93BF93EF9314 +:101C6000FF9381E391E00E941A04FF91EF91BF91ED +:101C7000AF919F918F917F916F915F914F913F9124 +:101C80002F910F900BBE0F900FBE0F901F901895C5 +:101C90001F920F920FB60F9211240BB60F922F9333 +:101CA0003F934F935F936F937F938F939F93AF93E4 +:101CB000BF93EF93FF938DE892E00E942A01FF917A +:101CC000EF91BF91AF919F918F917F916F915F91B4 +:101CD0004F913F912F910F900BBE0F900FBE0F9021 +:101CE0001F9018950E948D006FEF8AE892E00E9485 +:101CF00015022FE78AE196E0215080409040E1F7FD +:101D000000C0000060E08AE892E00E94150204C072 +:101D100026E02A95F1F700C0809130018823C1F3B5 +:101D200010923001A89581E391E00E940209C82F2A +:101D3000682F87E892E00E941502209A8C2F90E08D +:101D4000FC013197ED30F10530F4ED5AFF4F0C9462 +:101D50000A0F0E94530D81E391E00E94D9030FB650 +:101D6000F894A8958091600088618093600010923B +:101D700060000FBECDCF0E94690DEDCF0E943D0DDA +:101D8000EACF0E942C0DE7CF0E941B0DE4CF0E94EA +:101D90000A0DE1CF0E94F40CDECF0E94DE0CDBCFF7 +:101DA0000E94C90CD8CF0E94A20CD5CF0E94890CEA +:101DB000D2CF0E947F0DCFCF8DE892E00E94130119 +:101DC00042E06DE872E08AE892E00E94D80143E0C8 +:101DD0006DE872E087E892E00E94D80145E06DE886 +:101DE00072E084E892E00E94D80140E06DE872E081 +:101DF00081E892E00E94990241E06DE872E08EE78E +:101E000092E00E9499021092310110927701109293 +:101E100076010895EE0FFF1F0024001C0BBE0790F3 +:0A1E2000F691E02D0994F894FFCF2D +:101E2A000102010300020201010103030209626FB8 +:101E3A00617264696E666F2E680031313A33373ADF +:101E4A00303800417072202033203230313900009E :00000001FF diff --git a/firmware/interrupts.cpp b/firmware/interrupts.cpp index c699fe8..2eadc32 100644 --- a/firmware/interrupts.cpp +++ b/firmware/interrupts.cpp @@ -10,3 +10,20 @@ ISR(USART0_TX_vect) { usart.handleTX(); } + +ISR(SPI_STC_vect) +{ + spi.handleTransfer(); +} + +/* +ISR(BADISR_vect) +{ + DDRB |= _BV(PB0); + while(1) + { + PORTB ^= _BV(PB0); + _delay_ms(100); + } +} +*/ diff --git a/firmware/main.cpp b/firmware/main.cpp index f119ba8..4d19e87 100644 --- a/firmware/main.cpp +++ b/firmware/main.cpp @@ -9,25 +9,25 @@ void initAll() { + // deaktiviere WDT VOLLSTAENDIG + MCUSR &= ~_BV(WDRF); + WDTCSR = 0; + wdt_disable(); + spi.init(); + // aktiviere Interrupts + sei(); + dio0.setDirA(0x00); // alle Ausgang dio0.setDirB(0xFF); // alle Eingang dio1.setDirA(0x00); // alle Ausgang dio1.setDirB(0xFF); // alle Eingang dsw.setDirB(0xFF); // alle Eingang - adu.init(); + usart.init(); usart.initRX(); - - // aktiviere Interrupts - sei(); - - // deaktiviere WDT VOLLSTAENDIG - MCUSR &= ~_BV(WDRF); - WDTCSR = 0; - wdt_disable(); } void handleRequest() @@ -39,6 +39,7 @@ void handleRequest() #ifdef B15F_DEBUG dio1.writePortA(req); + DDRB |= _BV(PB0); #endif diff --git a/firmware/mcp23s17.cpp b/firmware/mcp23s17.cpp index 18cfbe0..fd02181 100644 --- a/firmware/mcp23s17.cpp +++ b/firmware/mcp23s17.cpp @@ -6,56 +6,54 @@ MCP23S17::MCP23S17(volatile SPI& spi, uint8_t adr) : spi(spi), adr(adr) void MCP23S17::setDirA(uint8_t dir) const volatile { - spi.setAdr(adr); - spi.pushByte(MCP23S17_OPCODE | MCP23S17_WRITE); - spi.pushByte(MCP23S17_DIRA); - spi.pushByte(dir); - spi.setAdr(SPIADR::NONE); + spi.addByte(MCP23S17_OPCODE | MCP23S17_WRITE); + spi.addByte(MCP23S17_DIRA); + spi.addByte(dir); + spi.transfer(adr); } void MCP23S17::setDirB(uint8_t dir) const volatile { - spi.setAdr(adr); - spi.pushByte(MCP23S17_OPCODE | MCP23S17_WRITE); - spi.pushByte(MCP23S17_DIRB); - spi.pushByte(dir); - spi.setAdr(SPIADR::NONE); + spi.addByte(MCP23S17_OPCODE | MCP23S17_WRITE); + spi.addByte(MCP23S17_DIRB); + spi.addByte(dir); + spi.transfer(adr); } void MCP23S17::writePortA(uint8_t port) const volatile { - spi.setAdr(adr); - spi.pushByte(MCP23S17_OPCODE | MCP23S17_WRITE); - spi.pushByte(MCP23S17_PORTA); - spi.pushByte(port); - spi.setAdr(SPIADR::NONE); + spi.addByte(MCP23S17_OPCODE | MCP23S17_WRITE); + spi.addByte(MCP23S17_PORTA); + spi.addByte(port); + spi.transfer(adr); } void MCP23S17::writePortB(uint8_t port) const volatile { - spi.setAdr(adr); - spi.pushByte(MCP23S17_OPCODE | MCP23S17_WRITE); - spi.pushByte(MCP23S17_PORTB); - spi.pushByte(port); - spi.setAdr(SPIADR::NONE); + spi.addByte(MCP23S17_OPCODE | MCP23S17_WRITE); + spi.addByte(MCP23S17_PORTB); + spi.addByte(port); + spi.transfer(adr); } uint8_t MCP23S17::readPortA(void) const volatile { - spi.setAdr(adr); - spi.pushByte(MCP23S17_OPCODE | MCP23S17_READ); - spi.pushByte(MCP23S17_PORTA); - uint8_t port = spi.pushByte(0); - spi.setAdr(SPIADR::NONE); - return port; + spi.addByte(MCP23S17_OPCODE | MCP23S17_READ); + spi.addByte(MCP23S17_PORTA); + spi.addByte(0); + spi.addByte(0); + spi.transfer(adr); + spi.wait(); + return spi.buffer[3]; } uint8_t MCP23S17::readPortB(void) const volatile { - spi.setAdr(adr); - spi.pushByte(MCP23S17_OPCODE | MCP23S17_READ); - spi.pushByte(MCP23S17_PORTB); - uint8_t port = spi.pushByte(0); - spi.setAdr(SPIADR::NONE); - return port; + spi.addByte(MCP23S17_OPCODE | MCP23S17_READ); + spi.addByte(MCP23S17_PORTB); + spi.addByte(0); + spi.addByte(0); + spi.transfer(adr); + spi.wait(); + return spi.buffer[3]; } diff --git a/firmware/spi.cpp b/firmware/spi.cpp index 3ab2b41..4390cec 100644 --- a/firmware/spi.cpp +++ b/firmware/spi.cpp @@ -6,7 +6,6 @@ SPI::SPI(void) void SPI::init(void) const volatile { - // Konfiguriere SPI DDRs DDRB |= _BV(SLSL) | _BV(MOSI) | _BV(SCLK); DDRB &= ~_BV(MISO); @@ -16,13 +15,60 @@ void SPI::init(void) const volatile // aktiviere SPI, Master Modus, SPI Modus 0 // F_SPI = F_CPU / 2 (prescaler 2) - SPCR = _BV(SPE) | _BV(MSTR); - SPSR = _BV(SPI2X); + SPCR = _BV(SPE) | _BV(MSTR) | _BV(SPIE); + SPSR = _BV(SPI2X) | _BV(SPIF); // waehle keinen SPI Slave aus setAdr(SPIADR::NONE); } +void SPI::handleTransfer() volatile +{ + if(!active) + { + setAdr(SPIADR::NONE); + return; + } + + uint8_t next = buffer[index]; + buffer[index++] = SPDR; + + if(index >= length) + { + index = 0; + active = false; + } + + SPDR = next; +} + +void SPI::transfer(uint8_t adr) volatile +{ + if(!index) + return; + + wait(); + active = true; + + setAdr(adr); + + this->length = index; + this->index = 0; + + handleTransfer(); +} + +void SPI::addByte(uint8_t b) volatile +{ + wait(); + buffer[index++] = b; +} + +void SPI::wait() volatile +{ + while(active); +} + void SPI::setAdr(uint8_t adr) const volatile { PORTD &= ~(_BV(DMUX1) | _BV(DMUX2) | _BV(DMUX3)); @@ -30,10 +76,3 @@ void SPI::setAdr(uint8_t adr) const volatile PORTD |= (adr & 0x02) ? _BV(DMUX2) : 0; PORTD |= (adr & 0x04) ? _BV(DMUX3) : 0; } - -uint8_t SPI::pushByte(uint8_t b) const volatile -{ - SPDR = b; - while(!(SPSR & _BV(SPIF))); - return SPDR; -} diff --git a/firmware/spi.h b/firmware/spi.h index 13f1286..4245ec3 100644 --- a/firmware/spi.h +++ b/firmware/spi.h @@ -15,13 +15,13 @@ #define DMUX3 PD4 enum SPIADR { - AA0 = 0, - AA1 = 1, - BEBA0 = 2, - BEBA1 = 3, - EXT = 4, + AA0 = 0, + AA1 = 1, + BEBA0 = 2, + BEBA1 = 3, + EXT = 4, SWITCH = 5, - NONE = 7, + NONE = 7, }; class SPI @@ -29,9 +29,20 @@ class SPI public: SPI(void); void init(void) const volatile; - void setAdr(uint8_t) const volatile; - uint8_t pushByte(uint8_t) const volatile; + void handleTransfer() volatile; + void transfer(uint8_t adr) volatile; + void addByte(uint8_t b) volatile; + void wait(void) volatile; + + constexpr static uint8_t BUFFER_SIZE = 8; + volatile uint8_t buffer[BUFFER_SIZE]; +private: + void setAdr(uint8_t) const volatile; + + volatile uint8_t index = 0; + volatile uint8_t length = 0; + volatile bool active = false; }; #endif // SPI_H diff --git a/firmware/tlc5615.cpp b/firmware/tlc5615.cpp index 1438cea..b9f31fc 100644 --- a/firmware/tlc5615.cpp +++ b/firmware/tlc5615.cpp @@ -6,8 +6,7 @@ TLC5615::TLC5615(volatile SPI& spi, uint8_t adr) : spi(spi), adr(adr) void TLC5615::setValue(uint16_t val) const volatile { - spi.setAdr(adr); - spi.pushByte(val >> 6); - spi.pushByte(val << 2); - spi.setAdr(SPIADR::NONE); + spi.addByte(static_cast(val >> 6)); + spi.addByte(static_cast(val << 2)); + spi.transfer(adr); }