From de7143887d31a393ac326681eb7359be71b2d2a9 Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Wed, 3 Apr 2019 08:40:14 +0200 Subject: [PATCH] make it volatile --- driver/drv/b15f.cpp | 19 +- driver/drv/b15f.h | 2 +- driver/drv/b15f.o | Bin 31512 -> 31528 bytes driver/drv/usart.h | 2 +- driver/gnuplotscript.gp | 38 +-- driver/main | Bin 65928 -> 65928 bytes driver/main.cpp | 21 +- driver/main.o | Bin 16720 -> 16552 bytes driver/test_plot | Bin 1080 -> 37120 bytes firmware/B15F.elf | Bin 16112 -> 16172 bytes firmware/B15F.hex | 502 ++++++++++++++++++++------------------- firmware/adu.cpp | 4 +- firmware/adu.h | 4 +- firmware/global_vars.cpp | 10 +- firmware/global_vars.h | 6 +- firmware/main.cpp | 20 +- firmware/mcp23s17.cpp | 14 +- firmware/mcp23s17.h | 33 +-- firmware/requests.cpp | 26 +- firmware/selftest.cpp | 20 +- firmware/spi.cpp | 6 +- firmware/spi.h | 6 +- firmware/tlc5615.cpp | 4 +- firmware/tlc5615.h | 6 +- firmware/usart.cpp | 2 +- 25 files changed, 368 insertions(+), 377 deletions(-) diff --git a/driver/drv/b15f.cpp b/driver/drv/b15f.cpp index 1130b0b..78ad9ac 100644 --- a/driver/drv/b15f.cpp +++ b/driver/drv/b15f.cpp @@ -136,13 +136,12 @@ std::vector B15F::getBoardInfo(void) while(n--) { uint8_t len = usart.readByte(); - std::cout << (int) len << std::endl; std::string str; - while(len--) + while(len--) { str += static_cast(usart.readByte()); - - std::cout << str << std::endl; + } + info.push_back(str); } @@ -215,7 +214,7 @@ uint16_t B15F::analogRead(uint8_t channel) return usart.readInt(); } -bool B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count) +void B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count) { buffer_a += offset_a; buffer_b += offset_b; @@ -239,13 +238,15 @@ bool B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset { buffer_a[i] = usart.readInt(); buffer_b[i] = usart.readInt(); + if(buffer_a[i] > 1023 || buffer_b[i] > 1023) + std::cout << PRE << "bad data detected" << std::endl; } uint8_t aw = usart.readByte(); - if(aw == MSG_OK) - return aw; - - throw DriverException("Sequenz unterbrochen"); + if(aw != MSG_OK) + throw DriverException("Sequenz unterbrochen"); + + delay_us(1); } void B15F::delay_ms(uint16_t ms) diff --git a/driver/drv/b15f.h b/driver/drv/b15f.h index 8b1b465..6bcf7fc 100644 --- a/driver/drv/b15f.h +++ b/driver/drv/b15f.h @@ -162,7 +162,7 @@ public: * \param count Anzahl an Inkrementierungen * \throws DriverException */ - bool analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count); + void analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count); /*************************/ diff --git a/driver/drv/b15f.o b/driver/drv/b15f.o index 31747e13933dda0da3ab7896c5d1bfb3fa6975b7..a6377d654c741023bd88db829282f6b4dab588a7 100644 GIT binary patch delta 9526 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 diff --git a/driver/drv/usart.h b/driver/drv/usart.h index 1659316..c4bba52 100644 --- a/driver/drv/usart.h +++ b/driver/drv/usart.h @@ -132,7 +132,7 @@ private: int file_desc = -1; // Linux Dateideskriptor uint32_t baudrate = 9600; int TEST = 0; - uint8_t timeout = 10; // in Dezisekunden + uint8_t timeout = 5; // in Dezisekunden uint8_t block_buffer[MAX_BLOCK_SIZE + 3]; // debug statistics diff --git a/driver/gnuplotscript.gp b/driver/gnuplotscript.gp index 752e2b8..6bdaed1 100644 --- a/driver/gnuplotscript.gp +++ b/driver/gnuplotscript.gp @@ -2,35 +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,36 'U_{DS} [V] = 300' right -set label at 2,33 'U_{DS} [V] = 325' right -set label at 2,21 'U_{DS} [V] = 350' right -set label at 2,38 'U_{DS} [V] = 375' right -set label at 2,23 'U_{DS} [V] = 400' right -set label at 2,23 'U_{DS} [V] = 425' right -set label at 2,24 'U_{DS} [V] = 450' right -set label at 2,24 'U_{DS} [V] = 475' right -set label at 2,25 'U_{DS} [V] = 500' right -set label at 2,5 'U_{DS} [V] = 525' right -set label at 2,6 'U_{DS} [V] = 550' right -set label at 2,13 'U_{DS} [V] = 575' right -set label at 2,13 'U_{DS} [V] = 600' right -set label at 2,13 'U_{DS} [V] = 625' right -set label at 2,2 '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] = 725' 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,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 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 +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/main b/driver/main index 289cfc64e05f4c5ee3e1a7b5e36eb5cca2d9f708..f774480492c57e20dae986ec3c7b8be1cebe82b6 100755 GIT binary patch delta 14050 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
#v|2+dx5SKEiE21XT4&Z`t_^jg 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 RB6pjjr=D&p*#5Lq^*>wp4G{nU diff --git a/driver/main.cpp b/driver/main.cpp index 320629e..f4f7d16 100644 --- a/driver/main.cpp +++ b/driver/main.cpp @@ -13,8 +13,8 @@ void kennlinieErsterQuadrant() uint16_t ba[1024]; uint16_t bb[1024]; - const uint16_t sample_count = 100; - const uint16_t delta = 10; + const uint16_t sample_count = 1024; + const uint16_t delta = 1; const uint16_t u_gs_start = 440; const uint16_t u_gs_delta = 20; @@ -37,11 +37,11 @@ void kennlinieErsterQuadrant() drv.analogWrite1(u_gs); drv.analogSequence(0, &ba[0], 0, 1, &bb[0], 0, 0, delta, sample_count); - drv.delay_ms(10); - drv.discard(); - drv.delay_ms(10); + //drv.delay_ms(10); + //drv.discard(); + //drv.delay_ms(10); - for(uint16_t k = 0; k < sample_count+1; k++) + for(uint16_t k = 0; k < sample_count; k++) { uint16_t i_d = ba[k] - bb[k]; uint16_t u_ds = bb[k]; @@ -64,7 +64,7 @@ void kennlinieZweiterQuadrant() uint16_t ba[1024]; uint16_t bb[1024]; - const uint16_t sample_count = 1000; + const uint16_t sample_count = 1024; const uint16_t delta = 1; const uint16_t u_gs_start = 300; @@ -91,9 +91,9 @@ void kennlinieZweiterQuadrant() drv.analogSequence(0, &ba[0], 0, 1, &bb[0], 0, 0, delta, sample_count); curve = 0; - for(uint16_t k = 0; k < sample_count + 1; k++) + for(uint16_t k = 0; k < sample_count; k++) { - if(ba[k] > bb[k] && bb[k] % 50 == 0 && bb[k] > 0) + if(ba[k] > bb[k] && bb[k] % 50 == 0 && bb[k] != 0) { uint16_t i_d = ba[k] - bb[k]; pf.addDot(Dot(u_gs, i_d, bb[k] / 50)); @@ -143,7 +143,8 @@ void testFunktionen() int main() { - testFunktionen(); + kennlinieZweiterQuadrant(); + kennlinieErsterQuadrant(); std::cout << "Schluss." << std::endl; } diff --git a/driver/main.o b/driver/main.o index d905bc5c9ed73dc14e09f34c8212fee093d1d834..551402bd3d66e8aa4f05f2aa90f1fa67135cbc9b 100644 GIT binary patch delta 3619 zcmZ`*Yiv|S6rS1cw%xYNcH7eFO`)wIuv_T1w?KD!?4#HywIT8SAU3i75LzF!Q6eSE zwp0*BpzR5X@sR+DgbIpfF(DXDn?Rz$2S|KJQhs3o5r~Qsu+GfA8$OD6lKb7A?|kRX zIcMhHy~o${J-xg?$b-Y77PoIDb2HX>h%?4IIIVMwZ1d+Q{gqAhsr!L4mdn`cJ&k=w zdEbVn3*+M@jeXa>{tYeZYR{5v7jx6I`KF8I($4%1@|F%3w0ax9Enp*V&&xjcs>id@ z$HqLKO+I!o+w+=_ZO-w$?ql!goZ?%3>`$+UeC)G4&t4xJFQAVnZ>3&;2|ZFeCCgvg zLob$|=Le`=OwB8ChpV0rv#ftO^^1ev1u|3CG^z0U^s=(qS^Pk{yL=Vr!_+lJ@Gmu1 zQrlF)yEOJFr2eU8#(=D|NESPitpYH%FUPv?*SfDX{-ALt-BuxZLSu`@M>VchXbgI+ zIGvL${~jM<+^CZ!sG)9Qd0iW~#$#j#h4~6t>%jUK@Fwv2G#V5}vz@*Y)q}N7 zS@~Lxq;a3dqZ&_XyrR)Zy&=J;X`HLEQ(pNY1!%HqXSFaYypobbML_F)bV6D?9IX3@&lbiJ2Wu9Y z(psLU1K$$4mD;3rwS#p%4M^)YuvW`3nY!Ml(b*z31lBoV9Rt1w_?-M3nc$h}1ilvZ zZvl^|C~fid@SH&Eu&q%$8wKAZ;HwUJCi8C`^xuPiA?Wi8ZX3`CO5~B41k6qdf{1VU)T6__k*s?cOTIMlu!?aEUk7@m+8k9P1TPMam z2VU5+zk$b=jXT82DU=n+p|%INGivb^F$2v>&|rqkfKN*Q%=Rn?9vk-rjhe!2x2+Q^ z>H;s!WEYvHh`k3^%wZU!1t5n*z(=X3Uih#}U(+So+wV{VzNcU<%*3x2kVEwfcTfP2 zxmDP_sI58@^Oy4*UuSz8m;*Sbm+&Lm3tN^I;8vW2z0Uw}& zh60k& z5xRFlE$>YCE?DK_23=Yd$-6ki^0?@y`o#^d?h-n&u#|ch2R+@YWIB;3rV%;ov1ZBQ z!B|j!_=jQ%*VugOh{gGG8j_PgCev9tsiIIk;XS09BS)0F;t{DHiYHtbBXl+%=WkFb zk>I)1E^!A9B@(VlKB_q6$LXETj E1NI2RdjJ3c delta 3643 zcmZ`+eQZ-z6u-A?>DsM~j*q(rMh6I^`{-6+dmCH7<~o@uvVa6X2rkZLpacaaN+hKq zK_Kezga{aLQv(A*fkMEK7$B0!mof+j@ehZAh=GWJXkujZ-1}bTtmNI~{oda1{LZ<* zd*1DB*OlOBR`B-m{LEh8RI77-OY{(DjLmmK!YX`UJMr%+Ykt0pxBu_`$iPoI-sOzJ zR_n~X6DWG6E4uO+U%9IO_rAU%(Uo@{Ijf43PFvjo%he2+mKCs^wL>Cn72cAW*>fC~ zce2@GtL0(!%wv#UQfeYRr z`Zl!Y7iAM2O_)c@9|_%Vk#9Ge8z&Y?ocX|Dbet z6!s~66uL3LRpBCq%N2G?^n7m9>$DHl^LOC09H*7$SA`62juhOZaEwIHWSljZxpXO_ zS`psEO0!hqy9#&0D6hb^VODawcU#7oNp*pWhN_n5UTA)8?t;a!m)YDWrzuWrnYZ}a z=0z>BCCOW(do9TuWA}1i3Y~?*6T-#HA#Y`P{oALH2Iwvn%`;4*uM<8%vbGa`0^x@l zOPAq^gf9j@UU=q_s9bK!LqbORW`#+GrxadM*sD;$P1KYstW!8cVY|fmM&lJ)u&S3- z?l5@ir-Ja`5x$b}S;iKS`q6}kOnks0`D(mU&d=#Q9Q3(8*NA2$(TsyjKJ32(DIBr_ zjV=Ork?^cFiJpQeMlYL0$G}S%t&yK-9O;#pK_^Bxm_$E>Zj63LqD5FEwXUy#7mN6D z5-lN7mL=!YXDr2gDyxw2e!{mCp6;SA2~T&?Ih}|1irw*xhDN^G$)x6Gl3PRgTPFIy ziN2QTi?Z4F# zE8M7Xx5A?e&q)m2H4X`BF-)A;jq^sfW;o#k&{--x)kaii(XBrlx=RJ02LZnbyh$|l zV{m}*^kZ-gn*9O~yrBl;NJ^^38z-J^4`1PnOz^F3O zyw6BZxBdkwN=;lNJT-Bf@YKXVszH1ZPLCsfmMrMT2IU!1>613dYm!w+^wisI!c%Y0 z5T1Hlp!1*w+Wv zCj2JC(*t6w!ArNa!`pOT-_W$hCn1WqE}NuXCp^tkE5<3(U$b3y0*9QQZm)p`FZF}* zN;PYw&g(}pJ?l$IA$q1y1U^Z`A0$zlHJ$J@YZ>9`F?-&G?=g63mv+}Ky)zb9>!XEo z^?>RJO{g|_*$=9(H_<TaAHUbYEhY(F{Sxl!zc`LY1IE#zn5ni8u?@CVc4PxJ{1mVW&9Dif~djJD&Re^qpFOzCx5J3XyMh+Sfe@H z#_4%ggJ5k}bm~T!15@ RIXb-h(>Kr<(PVz4@IUV;)|LPO diff --git a/driver/test_plot b/driver/test_plot index 9dbebdd9681e1add841d03d2452a51e976125eb2..aaca480b2056f7ed099a794213811702ed517feb 100644 GIT binary patch literal 37120 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 Z?Ym^wcl_^p_dfQ$?SAea+obzP{|h~qo>%|? literal 1080 zcmc)EO>5Lp6b9h;&P+0sw6~gRQ=Mvrh%-8xps7a4Vvt~?jdgJ0M;F4BiXbZDMhSit zapO80e?%5iL02yG2NYap)0K!t>mmy`f^VC)pnt%?!#OA1^Kz{DYl{o+{Nm;1Tf;d4 z;CxNNEF96n4V~lGcYW#E#j7j3}Pc5wk|TjjT$;9x-nOwNEa2c8X>{h31k+ zJ_RZCL5i`Eq7>sX4N1wMX&H1Hla+BJ!?>A2b}~#@WM|mZ&0zG&&CvG9&oCKem>N)+ z!HhCY$224*$3ZQJEpr?(a`em`M>{!=QQyjO+|F^r&2iGpamuG4$1I&5P?+OPoa5{! zrNEG`Xa#P{0?TyUC~$}Fng#CB{Z4_0c7aFqxLY9U7kENX-2%_O%8FlL(~F?M%c#IB zrNkRrrMFs%&$7gtQDU7oIwgKvr4UrNOQCtCn4)RgNBjL!%mk%4ph|Ip=IIhG&}ChU z*Ar5FXiM>tK21xpHY3IQAt}nkQvB-4TAdnduO?}N_L4zun$ml#X1D2W`;LKY?7gX8-^I diff --git a/firmware/B15F.elf b/firmware/B15F.elf index 36bfda57904dcfd16d92adcbe2a664d9f1ee5ac9..09771342b1952dc6ef2c740a857b8e526f71b183 100755 GIT binary patch delta 5489 zcma)=3tUuH9>>oa24=>PnE_0E5F;2`q6{EUMIDezL(xzy(EtU5VtpW5uIVt0eMBW? zI3VPjz4lYKxo&3b_W7(Sx~-wDPOmL1A6Ih|(sk5j#r#mSzjGfmcgNiJez=G8{h$B& zzs@=LUbwnu*V-nFW_Y$MHa6NCK?uKt2_YKX6!!;ULhFdtRW>mEI$#Wd-~5_ST^r{a zexna<*+4>D{_65f8T6Q;$WUlVGR!bcGfXu+XqaqBG}sLD3?*zPjj#*f{_7kO?mDRH z&^7gM-krQh_f>DKu>1TTfp$bUzm@Th?p&`)aR1|DLEAB`?I#-6^1R_h>L&4zYy2K;()FzOIxYl7&;i|jl4=!kA@XJTcd zG`@p2CN>FuG^y>f^;)pC=lf!BK`8u&wcKJKhR0;PUHaCr7L)$6JFLZ~>qa|Q_Z?b? z?pw55bpqO5y3=S6>%K<&neI!p7j&Pajc126FAZ;Syx=Ik5Y{r2iao?G^~w^J-V*}T zYwrnAEc<^I7o1b<{DQ@WKd(4dJ2ak0R_2S*Z?RMiA}W!OBg#gtB|z10GeGrI?HDbe z)f^ldrNmd7xX8H3s1WQ~gXhpL_H}TAW_=gi7aS+TXter}IC_yKgruM?4H+QzlQo+z zvfqWow;F5J+%%scI6z^aU>tgc? zUn=OMrh0wrcG^e3EB>jV$>B2p=>CCrq0i-~=$nNH3ldyOLb7o@v$~FuK6>7GExH?9 z#p+CO_0jHP_Kt4EJ;nDF+@z%r#oFSZPfWn#;9*;x^+s1TB!%9BQm4MvH)ax@NTZo^`ohF)kwxm8aR;Y-FP(v(M7Yw6pk3fs#|N%4~^e7R(xY zo?=fK2I)I#0~YKQWetXB?E8F0@K3NfduccP)rsY4a(+p7BDXh-4Cu5}JxB=wk7BW@?bWp&tuT;rr1r&Fw|xDg!nc#g19`c_`1Q^@C|Vk|XI zK)ux!Z0M=#c)5qP8G0sl(6%W(jjkWX49nP|enaRN>~ud%yy&$7iKZRe;lVI=U!7x^ zFw$soO3J*7O)TcF0kdKb)nONI!B(ej*Lq0@A$8ak>woNVEA#m3G^yro_S88C)koDg zy0(-wGF}ILt1k%XT`pz~cOAjdfGd-yA;y*jCSA2VY&M@Go9@5{&!a$ zJz?Hj&CG4wwioAUXtP6T5?*jNIJcj0%DuJ|?&h=NK9IJ7RPpU}WbuT8D*8!xxp7(a zZqKbT%KGf0ImVgM+vt786AQkgLtUl}L(d9!y8lpG%x?9sqc5}7VR3^ZJ8n>AhJV{{ z@zk-sVZ-d(=*U7oyRUh%`z@LedtcK~cEs&wTh6=iU|AL<{pK%;B_63CsjW^_di=NB z720xK)>{^|P*BG5g$3uA$&{s?B2=C8Q@-#k0c01QWNH1T`DC>@$yl#;KV4*eI;PUN zDn^pTYJXm{TkC(u{gTygt=<3PyR)+Y;VHR}yv?=r^5hTGJ84LAo`&+67X6i@#J8LC zD=W|MI|nD}@~r(&eM#o45Zhylv3F}5#wfb&a<5l=nJT{K`FcBdl+rhMd>r~7Zu9UZ z9_7p6Zv##T=l}bFFM*w{m7^7(&(bPizfrcdEa*>iFIM}W$=8(}9%m)yAvBV$Hpgg= z2eGT>1lDPG;$4>?J_K!Lc*g(yF1a#S{aq4gH|hT=erJ4-_A}i@w1;&U(C*TmL%UUX z2CYN)4cfW7lW1+azoU)Uf9jULpQ31v@MKqw{0%jS=87a`K8NOsB)u``&`Bam%NVb* zaf%eAg^JghniHw1c?IrTwk86vnvATJ%&gROVq02cv81pA5m9?jMwAYq2li&(_XkSH zu0ot0_QwJQ72teKz_N(}tOlQiL4~(~)fvAM zFn<@=Vj?6#o_`=<{216@p=);UDF_ZgnO{7^F7PH~C~*+E4t^H_jfH?$gfEvmgK#k6 zH!i-$_n~h^)$k+grv~WT!0TZjW>Il_5P1NC-OyGtoF6cu3akXkcl}cEqu9kthR=Z$ zv4js}4fzso3YgypUh8uhM7FEP?J&4gEdcXu)fpZHUl6lHh8hhy0UnR=bL0#!feCT& z1{Khfo8Z?~$1oHpNV#~0?*?Bn5RwL=otJbJ1Zs!rVC8R16Sig!I3H{JJtlDdBCvAt ziaZf8zb1g!f|!s(>~JjBf+;{|WJn zAJaF$^*9B|U~cdI0R5w2{?y|aKXn3lwDh2q1icWXsowuVII~^IKv^R5-n^8DsB!M} zqK8uoXG|GewYaJ_ZzbC_cEbROGN$FuNKPqCN>5*2Q9HS+#+JuSsgaSl$#e25SxoB8 zAedoqWLelVspHs3sdHFrTI^(QI(=4tZfaUmY6i>{l~u2($a|8Ml&q{+Si7XAB+cJV zNg^e4rz_gINqLVH@u(_Uby^-fo;Efd#!_sPXJ#OkcdY$-b#s z=~koSDk+7Omo2oi*VD%i;c@x&ldMnIRMl3@SW;7KLoO%NFR^bj=2ZGa@!5l$bY3J| zb@fW_^5>19AmU)^>_Xckvr-pTuUKB07pR|EQ&Cnfx@7Y*2S;#QJll+=P|jIZTY*4o zGZRg+I1RP4mDfP{a^?VI`SPdzWlK(Cf608*Qc{j`E-zVLTUJwxL0;VDB^8Uy(T8l| zQ*3EgdW0`!RdwIbN*IE=h{Z3GLe3QHAxANM+^{gY^2!Fu9XDEwswc5m#wD?fNHKzn$|bTbUh8ud^4jM`*N> z>~MBGoy@wkN8nF(^Mn!9%Q7d7&?!}49tw+%m8YjApcAa(HTJg3MwFb(nv&1(=}mK6wOkB$la5T!?6B~ zHD)d#b_#bp?H>QFX|=m{)?>7%^^}^Em7AI7V{A)JMK_Z2pzQa)KQk}N+IM=F`?>e` z|K4}!=DufdtZ$ANF6Frs6Jv!)Liig@@E0$|+Xg0d0}q29r zA*^K!32WK!?w%f9Xq;lqGY&WA7&DFOMw@ZGG0K>1EH*yK%4np+Cw|jK#L%~dPJQ!W z&;GQ7`cHck#r?j6BJGUz>`i-3-_>goz5n?@)O99oze`Om^~RGKr}Xdjnp)1ljl&q$ zLdaI1M>MrW(@JrZ)LTebcgwx?7;E&8$-VWMbxLFFgXq>S_9cCE%xT@b)@rLf-$9$K z&0-%--G0?}GuYO1<=6eCVeo5exyY)7`?J2+U-g<=lJ%F-7U{o4yHbAtbr|G$EZyHq>B zU~$R41!w4DM%(={1}p}mjj}3HHtFIuq5+#fA^M?ig6$9`qn4SUjw3O0yWF~Fyc%z% zb(wjYStZ53EqEUFv9rM`!X_X4TX2#Du{|M4MO}O+ zED#RUZBlQXU>CRg$DUKhCjR9od<2bK2&A8GV4i#|sv+sPi%Cl;6OEbXI~21DzM zw2yvS)?eD}bcf&Zeorr<&&SWv-DPi;rnpnZG;NDSryg4^qk zbDQ1$&E3rxn!U}2)+V~yxsL9*e%W+0rk8GTMKx5@+t zvCupf!Tb}!o2Wz zHHgjP4%cQ^ll%FKCdTtNw7Mj}l_O(an2?9-Egf z3XK|43u?Pic(Xl5Om%?F^r2xM2}H#duLI^gdc-E{i=&v2O9E4RizhqbX@< zMCUE4uAIC@t=$RiyeYwP7Q3O(Q{&xBOC+^0cFgN#&->gs3)Tk7fB6Z&x?Ap>bgQgt zkN@?$!&;6ja%+Q@i0WL4xY)N=A**h>xS}gSCE^pJLXH-zE?}A~Yt6~VF6s_be(+VB ze-kH<4A=d%~Pmsq?>)MsxMcq}Z`daAk?dqtcyE{Gz zJA^lU)aq{aXZ^&`^T8$G9`PrztF?N(>hl@8!ryOFEUgXtyV4u3J7n>9WrxSv@54t> z6WbjgCmauABO_ASt#B89o_-rK0&QDF_Rn4_t}h5&D!z?Ka(u79CS4V-NY{q1(C*cL zfwooOh1Q|}9PLW|XK0J`XV50=Pop&(KJ?0$pD0==uJqL?7od5xNFq7&d9+v}`A2RZ zohp&MjH87DPD4a_p+*Z9kCj?H-{S3Idn41#sTsK$Il1XMq+m@=e0&p1n!B`a7}E&m2rl`W#9;Yb;J{o`NsxuHF&O>kVMRL z{b#^^MnVP!$?O4tY$7CCng0_wWH2E!@t4aVp~OLQ;c&JhZ~_w(4FLro7sSgS9>8_p z@0XBR$j$y>+-Ul^+9c3?XEQGM^5P2QO8)NN^BxShfd)0+|N^esAUv z=SAS#cniVYK|T6f2Mq&w8<=0Id7R-Sh`azk0*AvD{Wmr8-2QtG3=9_n3h#s8(4h*7 zf(W+x1G?FN1KbXSqm_Aqms(Sy!2>uNdsA^@ODL!zX4VsULlGvPStntfiTSg=P2+VIE+yYOaN<_Xa@Ld1P?~e zXg>HZzH@cYJPAI8^;7rEMzD6%wSbi+c1Rih0RtOhV5Z{mAov*i{IlUD>jVcf3?e7M z2XJtSiu@_Cnh{Un9C#SMih5=K5;zS3jZ*kKa2w8zjW~a#07CJJs82i&mSJG6!Gr;v z!sV5+@`LDM@KMdCvk#De0-PWO_S72iZM>7=UkYF&KB-~RqzNQP~tbhF$g#c@;rg#;8B|SmoT0zI08rSDF{gQM9bIo z3Rrc>H{lJic8U7HzL0Bn|v50xpDo9?(oK??4Ip!!ulf0sap( z{Ndm6a_}5{6=`6uupS&Zxdh_j1~mE|V18)vhbQn?Fo7O_IG+G(1M-2#8#KTF*D-Jj z>ogk*++iPhjHYD5>ub{=r0m$lO`$n;Rkd}6#f1f_^=w;48M~cPG;G1lhq50onw6Gb zo|=_aTU9r0MNMIGHJg+Y7R24=&nWLCDGn(DaED#pVWFO=V z4JyEJepV*il$FcQXIaNCn3*-Fq$ndZHKQoCcy@aEtm)OHqN2WPN!{w2iqv$n)V{<< zDxmyk=16vbb~0O)efg(?;C9P%<`-tIcydKu!KzjDTinit(); + spi.init(); - ((MCP23S17*) &beba0)->setDirA(0x00); // alle Ausgang - ((MCP23S17*) &beba0)->setDirB(0xFF); // alle Eingang - ((MCP23S17*) &beba1)->setDirA(0x00); // alle Ausgang - ((MCP23S17*) &beba1)->setDirB(0xFF); // alle Eingang - ((MCP23S17*) &sw)->setDirB(0xFF); // alle Eingang + 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*) &adu)->init(); + adu.init(); usart.init(); usart.initRX(); @@ -39,7 +39,7 @@ void handleRequest() wdt_reset(); const uint8_t req = usart.readByte(); - ((MCP23S17*) &beba1)->writePortA(req); + dio1.writePortA(req); switch(req) { @@ -104,9 +104,9 @@ int main() initAll(); // Reset anzeigen - ((MCP23S17*) &beba0)->writePortA(0xFF); + dio0.writePortA(0xFF); _delay_ms(100); - ((MCP23S17*) &beba0)->writePortA(0x00); + dio0.writePortA(0x00); while(1) { diff --git a/firmware/mcp23s17.cpp b/firmware/mcp23s17.cpp index 251ead8..18cfbe0 100644 --- a/firmware/mcp23s17.cpp +++ b/firmware/mcp23s17.cpp @@ -1,10 +1,10 @@ #include "mcp23s17.h" -MCP23S17::MCP23S17(SPI& spi, uint8_t adr) : spi(spi), adr(adr) +MCP23S17::MCP23S17(volatile SPI& spi, uint8_t adr) : spi(spi), adr(adr) { } -void MCP23S17::setDirA(uint8_t dir) const +void MCP23S17::setDirA(uint8_t dir) const volatile { spi.setAdr(adr); spi.pushByte(MCP23S17_OPCODE | MCP23S17_WRITE); @@ -13,7 +13,7 @@ void MCP23S17::setDirA(uint8_t dir) const spi.setAdr(SPIADR::NONE); } -void MCP23S17::setDirB(uint8_t dir) const +void MCP23S17::setDirB(uint8_t dir) const volatile { spi.setAdr(adr); spi.pushByte(MCP23S17_OPCODE | MCP23S17_WRITE); @@ -22,7 +22,7 @@ void MCP23S17::setDirB(uint8_t dir) const spi.setAdr(SPIADR::NONE); } -void MCP23S17::writePortA(uint8_t port) const +void MCP23S17::writePortA(uint8_t port) const volatile { spi.setAdr(adr); spi.pushByte(MCP23S17_OPCODE | MCP23S17_WRITE); @@ -31,7 +31,7 @@ void MCP23S17::writePortA(uint8_t port) const spi.setAdr(SPIADR::NONE); } -void MCP23S17::writePortB(uint8_t port) const +void MCP23S17::writePortB(uint8_t port) const volatile { spi.setAdr(adr); spi.pushByte(MCP23S17_OPCODE | MCP23S17_WRITE); @@ -40,7 +40,7 @@ void MCP23S17::writePortB(uint8_t port) const spi.setAdr(SPIADR::NONE); } -uint8_t MCP23S17::readPortA(void) const +uint8_t MCP23S17::readPortA(void) const volatile { spi.setAdr(adr); spi.pushByte(MCP23S17_OPCODE | MCP23S17_READ); @@ -50,7 +50,7 @@ uint8_t MCP23S17::readPortA(void) const return port; } -uint8_t MCP23S17::readPortB(void) const +uint8_t MCP23S17::readPortB(void) const volatile { spi.setAdr(adr); spi.pushByte(MCP23S17_OPCODE | MCP23S17_READ); diff --git a/firmware/mcp23s17.h b/firmware/mcp23s17.h index 4179c0f..c25491a 100644 --- a/firmware/mcp23s17.h +++ b/firmware/mcp23s17.h @@ -3,28 +3,31 @@ #include "spi.h" -constexpr uint8_t MCP23S17_DIRA = 0x00; -constexpr uint8_t MCP23S17_DIRB = 0x01; -constexpr uint8_t MCP23S17_PORTA = 0x12; -constexpr uint8_t MCP23S17_PORTB = 0x13; -constexpr uint8_t MCP23S17_READ = 0x01; -constexpr uint8_t MCP23S17_WRITE = 0x00; -constexpr uint8_t MCP23S17_OPCODE = 0x40; + class MCP23S17 { public: - MCP23S17(SPI&, uint8_t); - void setDirA(uint8_t dir) const; - void setDirB(uint8_t dir) const; - void writePortA(uint8_t) const; - void writePortB(uint8_t) const; - uint8_t readPortA(void) const; - uint8_t readPortB(void) const; + MCP23S17(volatile SPI&, uint8_t); + void setDirA(uint8_t dir) const volatile; + void setDirB(uint8_t dir) const volatile; + void writePortA(uint8_t) const volatile; + void writePortB(uint8_t) const volatile; + uint8_t readPortA(void) const volatile; + uint8_t readPortB(void) const volatile; private: - SPI& spi; + volatile SPI& spi; const uint8_t adr; + + // constants + constexpr static uint8_t MCP23S17_DIRA = 0x00; + constexpr static uint8_t MCP23S17_DIRB = 0x01; + constexpr static uint8_t MCP23S17_PORTA = 0x12; + constexpr static uint8_t MCP23S17_PORTB = 0x13; + constexpr static uint8_t MCP23S17_READ = 0x01; + constexpr static uint8_t MCP23S17_WRITE = 0x00; + constexpr static uint8_t MCP23S17_OPCODE = 0x40; }; #endif // MCP23S17_H diff --git a/firmware/requests.cpp b/firmware/requests.cpp index e3a2960..052b1c5 100644 --- a/firmware/requests.cpp +++ b/firmware/requests.cpp @@ -32,7 +32,7 @@ void rqDigitalWrite0() { usart.initTX(); uint8_t port = usart.readByte(); - ((MCP23S17*) &beba0)->writePortA(port); + dio0.writePortA(port); usart.writeByte(USART::MSG_OK); usart.flush(); @@ -42,7 +42,7 @@ void rqDigitalWrite1() { usart.initTX(); uint8_t port = usart.readByte(); - ((MCP23S17*) &beba1)->writePortA(port); + dio1.writePortA(port); usart.writeByte(USART::MSG_OK); usart.flush(); @@ -51,7 +51,7 @@ void rqDigitalWrite1() void rqDigitalRead0() { usart.initTX(); - uint8_t port = ((MCP23S17*) &beba0)->readPortB(); + uint8_t port = dio0.readPortB(); usart.writeByte(port); usart.flush(); } @@ -59,7 +59,7 @@ void rqDigitalRead0() void rqDigitalRead1() { usart.initTX(); - uint8_t port = ((MCP23S17*) &beba1)->readPortB(); + uint8_t port = dio1.readPortB(); usart.writeByte(port); usart.flush(); } @@ -68,7 +68,7 @@ void rqAnalogWrite0() { usart.initTX(); uint16_t value = usart.readInt(); - ((TLC5615*) &dac0)->setValue(value); + dac0.setValue(value); usart.writeByte(USART::MSG_OK); usart.flush(); @@ -78,7 +78,7 @@ void rqAnalogWrite1() { usart.initTX(); uint16_t value = usart.readInt(); - ((TLC5615*) &dac1)->setValue(value); + dac1.setValue(value); usart.writeByte(USART::MSG_OK); usart.flush(); @@ -88,7 +88,7 @@ void rqAnalogRead() { usart.initTX(); uint8_t channel = usart.readByte(); - uint16_t value = ((ADU*) &adu)->getValue(channel); + uint16_t value = adu.getValue(channel); usart.writeInt(value); usart.flush(); } @@ -105,15 +105,15 @@ void rqAdcDacStroke() //usart.writeByte(USART::MSG_OK); count *= delta; - ((MCP23S17*) &beba1)->writePortA(0xFF); + dio1.writePortA(0xFF); for(int16_t i = start; i < count; i += delta) { - ((TLC5615*) &dac0)->setValue(i); + dac0.setValue(i); wdt_reset(); - uint16_t val_a = ((ADU*) &adu)->getValue(channel_a); - uint16_t val_b = ((ADU*) &adu)->getValue(channel_b); + uint16_t val_a = adu.getValue(channel_a); + uint16_t val_b = adu.getValue(channel_b); usart.initTX(); usart.writeInt(val_a); @@ -127,8 +127,8 @@ void rqAdcDacStroke() }; union doubleword dw; - dw.word[0] = ((ADU*) &adu)->getValue(channel_a); - dw.word[1] = ((ADU*) &adu)->getValue(channel_b); + dw.word[0] = adu.getValue(channel_a); + dw.word[1] = adu.getValue(channel_b); uint8_t ret = 0; do diff --git a/firmware/selftest.cpp b/firmware/selftest.cpp index c75a77d..5bb0680 100644 --- a/firmware/selftest.cpp +++ b/firmware/selftest.cpp @@ -13,7 +13,7 @@ void testBEBA0(void) { for(uint8_t i = 0; i < 9; i++) { - ((MCP23S17*) &beba0)->writePortA(_BV(i)); + dio0.writePortA(_BV(i)); if(i < 8) _delay_ms(200); @@ -24,7 +24,7 @@ void testBEBA1(void) { for(uint8_t i = 0; i < 9; i++) { - ((MCP23S17*) &beba1)->writePortA(_BV(i)); + dio1.writePortA(_BV(i)); if(i < 8) _delay_ms(200); @@ -35,22 +35,22 @@ void testDAC0(void) { for(uint16_t i = 0; i < 1024; i++) { - ((TLC5615*) &dac0)->setValue(i); + dac0.setValue(i); _delay_ms(1); } _delay_ms(100); - ((TLC5615*) &dac0)->setValue(0); + dac0.setValue(0); } void testDAC1(void) { for(uint16_t i = 0; i < 1024; i++) { - ((TLC5615*) &dac1)->setValue(i); + dac1.setValue(i); _delay_ms(1); } _delay_ms(100); - ((TLC5615*) &dac1)->setValue(0); + dac1.setValue(0); } void testMirror() @@ -61,9 +61,9 @@ void testMirror() // Endlosschleife while(1) { - ((TLC5615*) &dac0)->setValue(((ADU*) &adu)->getValue(0)); - ((TLC5615*) &dac1)->setValue(((ADU*) &adu)->getValue(1)); - ((MCP23S17*) &beba0)->writePortA(((MCP23S17*) &beba0)->readPortB()); - ((MCP23S17*) &beba1)->writePortA(((MCP23S17*) &sw)->readPortB()); + dac0.setValue(adu.getValue(0)); + dac1.setValue(adu.getValue(1)); + dio0.writePortA(dio0.readPortB()); + dio1.writePortA(dsw.readPortB()); } } diff --git a/firmware/spi.cpp b/firmware/spi.cpp index 699b8d8..3ab2b41 100644 --- a/firmware/spi.cpp +++ b/firmware/spi.cpp @@ -4,7 +4,7 @@ SPI::SPI(void) { } -void SPI::init(void) const +void SPI::init(void) const volatile { // Konfiguriere SPI DDRs @@ -23,7 +23,7 @@ void SPI::init(void) const setAdr(SPIADR::NONE); } -void SPI::setAdr(uint8_t adr) const +void SPI::setAdr(uint8_t adr) const volatile { PORTD &= ~(_BV(DMUX1) | _BV(DMUX2) | _BV(DMUX3)); PORTD |= (adr & 0x01) ? _BV(DMUX1) : 0; @@ -31,7 +31,7 @@ void SPI::setAdr(uint8_t adr) const PORTD |= (adr & 0x04) ? _BV(DMUX3) : 0; } -uint8_t SPI::pushByte(uint8_t b) const +uint8_t SPI::pushByte(uint8_t b) const volatile { SPDR = b; while(!(SPSR & _BV(SPIF))); diff --git a/firmware/spi.h b/firmware/spi.h index 4468c3e..13f1286 100644 --- a/firmware/spi.h +++ b/firmware/spi.h @@ -28,9 +28,9 @@ class SPI { public: SPI(void); - void init(void) const; - void setAdr(uint8_t) const; - uint8_t pushByte(uint8_t) const; + void init(void) const volatile; + void setAdr(uint8_t) const volatile; + uint8_t pushByte(uint8_t) const volatile; }; diff --git a/firmware/tlc5615.cpp b/firmware/tlc5615.cpp index 521bef0..1438cea 100644 --- a/firmware/tlc5615.cpp +++ b/firmware/tlc5615.cpp @@ -1,10 +1,10 @@ #include "tlc5615.h" -TLC5615::TLC5615(SPI& spi, uint8_t adr) : spi(spi), adr(adr) +TLC5615::TLC5615(volatile SPI& spi, uint8_t adr) : spi(spi), adr(adr) { } -void TLC5615::setValue(uint16_t val) const +void TLC5615::setValue(uint16_t val) const volatile { spi.setAdr(adr); spi.pushByte(val >> 6); diff --git a/firmware/tlc5615.h b/firmware/tlc5615.h index 6709308..6194c8d 100644 --- a/firmware/tlc5615.h +++ b/firmware/tlc5615.h @@ -6,12 +6,12 @@ class TLC5615 { public: - TLC5615(SPI&, uint8_t); - void setValue(uint16_t) const; + TLC5615(volatile SPI&, uint8_t); + void setValue(uint16_t) const volatile; private: - SPI& spi; + volatile SPI& spi; const uint8_t adr; }; diff --git a/firmware/usart.cpp b/firmware/usart.cpp index 9057a92..49868da 100644 --- a/firmware/usart.cpp +++ b/firmware/usart.cpp @@ -56,7 +56,7 @@ void USART::handleRX(void) volatile void USART::handleTX(void) volatile { - ((MCP23S17*) &beba0)->writePortA(send_pos); + dio0.writePortA(send_pos); if(send_pos < send_len) { while (!(UCSR0A & (1<