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 9a716f7..f98a2e7 100644 Binary files a/driver/test_plot and b/driver/test_plot differ diff --git a/firmware/B15F.elf b/firmware/B15F.elf index 1acb130..41f304a 100755 Binary files a/firmware/B15F.elf and b/firmware/B15F.elf differ 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); }