diff --git a/driver/drv/b15f.cpp b/driver/drv/b15f.cpp index 78ad9ac..04f85ff 100644 --- a/driver/drv/b15f.cpp +++ b/driver/drv/b15f.cpp @@ -186,6 +186,13 @@ uint8_t B15F::digitalRead1() return usart.readByte(); } +uint8_t B15F::readDipSwitch() +{ + usart.clearInputBuffer(); + usart.writeByte(RQ_DSW); + return usart.readByte(); +} + bool B15F::analogWrite0(uint16_t value) { usart.clearInputBuffer(); diff --git a/driver/drv/b15f.h b/driver/drv/b15f.h index 6bcf7fc..e111a76 100644 --- a/driver/drv/b15f.h +++ b/driver/drv/b15f.h @@ -125,6 +125,13 @@ public: */ uint8_t digitalRead1(void); + /** + * Liest den Wert des digitalen Eingabeports, an dem der DIP-switch angeschlossen ist (S7) + * \return Wert für gesamten Port + * \throws DriverException + */ + uint8_t readDipSwitch(void); + /** * Setzt den Wert des Digital-Analog-Converters (DAC / DAU) 0 * \param port 10-Bit Wert @@ -190,10 +197,11 @@ private: constexpr static uint8_t RQ_BA1 = 6; constexpr static uint8_t RQ_BE0 = 7; constexpr static uint8_t RQ_BE1 = 8; - constexpr static uint8_t RQ_AA0 = 9; - constexpr static uint8_t RQ_AA1 = 10; - constexpr static uint8_t RQ_ADC = 11; - constexpr static uint8_t RQ_ADC_DAC_STROKE = 12; + constexpr static uint8_t RQ_DSW = 9; + constexpr static uint8_t RQ_AA0 = 10; + constexpr static uint8_t RQ_AA1 = 11; + constexpr static uint8_t RQ_ADC = 12; + constexpr static uint8_t RQ_ADC_DAC_STROKE = 13; }; #endif // B15F_H diff --git a/driver/drv/b15f.o b/driver/drv/b15f.o index a6377d6..d78839d 100644 Binary files a/driver/drv/b15f.o and b/driver/drv/b15f.o differ diff --git a/driver/gnuplotscript.gp b/driver/gnuplotscript.gp index 6bdaed1..3a594f7 100644 --- a/driver/gnuplotscript.gp +++ b/driver/gnuplotscript.gp @@ -2,19 +2,36 @@ set margin 10,10 unset key set grid set title '' -set xlabel 'U_{DS} [V]' +set xlabel 'U_{GS} [V]' set ylabel 'I_D [mA]' -set xrange [0:5] +set xrange [5:0] +set x2range [5:0] +set y2range [0:50] set yrange [0:50] -set label at 4,3 'U_{GS} [V] = 460' left -set label at 4,7 'U_{GS} [V] = 480' left -set label at 3,13 'U_{GS} [V] = 500' left -set label at 2,22 'U_{GS} [V] = 520' left -set label at 1,32 'U_{GS} [V] = 540' left -set label at 0,38 'U_{GS} [V] = 560' left -set label at 0,38 'U_{GS} [V] = 580' left -set label at 0,38 'U_{GS} [V] = 600' left +set label at 2,35 'U_{DS} [V] = 300' right +set label at 2,31 'U_{DS} [V] = 325' right +set label at 2,35 'U_{DS} [V] = 350' right +set label at 2,21 'U_{DS} [V] = 375' right +set label at 2,22 'U_{DS} [V] = 400' right +set label at 2,22 'U_{DS} [V] = 425' right +set label at 2,12 'U_{DS} [V] = 450' right +set label at 2,23 'U_{DS} [V] = 475' right +set label at 2,24 'U_{DS} [V] = 500' right +set label at 2,24 'U_{DS} [V] = 525' right +set label at 2,13 'U_{DS} [V] = 550' right +set label at 2,13 'U_{DS} [V] = 550' right +set label at 2,2 'U_{DS} [V] = 600' right +set label at 2,13 'U_{DS} [V] = 625' right +set label at 2,6 'U_{DS} [V] = 650' right +set label at 2,2 'U_{DS} [V] = 675' right +set label at 2,6 'U_{DS} [V] = 700' right +set label at 2,2 'U_{DS} [V] = 725' right +set label at 2,2 'U_{DS} [V] = 750' right +set label at 2,2 'U_{DS} [V] = 750' right +set y2tics +unset ytics +set ytics format '' unset output set terminal qt unset output -plot "/tmp/tempfile0" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 440' w l,"/tmp/tempfile1" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 460' w l,"/tmp/tempfile2" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 480' w l,"/tmp/tempfile3" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 500' w l,"/tmp/tempfile4" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 520' w l,"/tmp/tempfile5" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 540' w l,"/tmp/tempfile6" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 560' w l,"/tmp/tempfile7" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 580' w l,"/tmp/tempfile8" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 600' w l +plot "/tmp/tempfile1" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 300' w l,"/tmp/tempfile2" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 325' w l,"/tmp/tempfile3" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 350' w l,"/tmp/tempfile4" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 375' w l,"/tmp/tempfile5" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 400' w l,"/tmp/tempfile6" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 425' w l,"/tmp/tempfile7" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 450' w l,"/tmp/tempfile8" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 475' w l,"/tmp/tempfile9" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 500' w l,"/tmp/tempfile10" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 525' w l,"/tmp/tempfile11" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 550' w l,"/tmp/tempfile12" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 575' w l,"/tmp/tempfile13" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 600' w l,"/tmp/tempfile14" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 625' w l,"/tmp/tempfile15" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 650' w l,"/tmp/tempfile16" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 675' w l,"/tmp/tempfile17" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 700' w l,"/tmp/tempfile18" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 725' w l,"/tmp/tempfile19" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 750' w l,"/tmp/tempfile20" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 775' w l diff --git a/driver/main b/driver/main index f774480..d5d4996 100755 Binary files a/driver/main and b/driver/main differ diff --git a/driver/main.cpp b/driver/main.cpp index f4f7d16..1de1036 100644 --- a/driver/main.cpp +++ b/driver/main.cpp @@ -7,6 +7,7 @@ void kennlinieErsterQuadrant() { + B15F& drv = B15F::getInstance(); PlottyFile pf; @@ -32,14 +33,14 @@ void kennlinieErsterQuadrant() pf.setParaStepWidth(u_gs_delta); uint8_t curve = 0; + + std::cout << "Erfasse Kennlinie erster Quadrant..." << std::endl << std::flush; + for(uint16_t u_gs = u_gs_start; u_gs <= u_gs_end; u_gs += u_gs_delta) { 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); for(uint16_t k = 0; k < sample_count; k++) { @@ -48,9 +49,13 @@ void kennlinieErsterQuadrant() pf.addDot(Dot(u_ds, i_d, curve)); } + std::cout << "\033[1K\r" << 1e2 * (u_gs - u_gs_start) / (u_gs_end - u_gs_start) << "%" << std::flush; + curve++; } + std::cout << "\033[1K\r" << std::flush; + // speichern und plotty starten pf.writeToFile("test_plot"); pf.startPlotty("test_plot"); @@ -84,6 +89,9 @@ void kennlinieZweiterQuadrant() pf.setParaStepWidth(u_gs_delta); uint8_t curve = 0; + + std::cout << "Erfasse Kennlinie zweiter Quadrant..." << std::endl << std::flush; + for(uint16_t u_gs = u_gs_start; u_gs <= u_gs_end; u_gs += u_gs_delta) { drv.analogWrite1(u_gs); @@ -100,9 +108,12 @@ void kennlinieZweiterQuadrant() } curve++; } - std::cout << "u_gs: " << u_gs << std::endl; + + std::cout << "\033[1K\r" << 1e2 * (u_gs - u_gs_start) / (u_gs_end - u_gs_start) << "%" << std::flush; } + std::cout << "\033[1K\r" << std::flush; + // speichern und plotty starten pf.writeToFile("test_plot"); pf.startPlotty("test_plot"); @@ -112,6 +123,8 @@ void testFunktionen() { B15F& drv = B15F::getInstance(); + std::cout << "DIP-Switch: " << (int) drv.readDipSwitch() << std::endl; + drv.digitalWrite0(0xFF); drv.analogWrite0(128); @@ -131,18 +144,19 @@ void testFunktionen() std::cout << "Kennlinie..." << std::endl; uint16_t a[1024]; - uint16_t b[1024]; + uint16_t b[1024]; drv.analogSequence(0, &a[0], 0, 1, &b[0], 0, 0, 1, 1024); - for(uint16_t i= 0; i < sizeof(a) / sizeof(uint16_t); i++) + + /*for(uint16_t i= 0; i < sizeof(a) / sizeof(uint16_t); i++) { std::cout << (int) i << " : " << a[i] << " " << b[i] << std::endl; - } + }*/ } int main() { - + testFunktionen(); kennlinieZweiterQuadrant(); kennlinieErsterQuadrant(); diff --git a/driver/main.o b/driver/main.o index 551402b..5b54449 100644 Binary files a/driver/main.o and b/driver/main.o differ diff --git a/driver/test_plot b/driver/test_plot index aaca480..9a716f7 100644 Binary files a/driver/test_plot and b/driver/test_plot differ diff --git a/firmware/B15F.elf b/firmware/B15F.elf index 0977134..1acb130 100755 Binary files a/firmware/B15F.elf and b/firmware/B15F.elf differ diff --git a/firmware/B15F.hex b/firmware/B15F.hex index 707add3..8936bcf 100644 --- a/firmware/B15F.hex +++ b/firmware/B15F.hex @@ -1,311 +1,467 @@ -:100000000C945F000C9489000C9489000C94890076 -:100010000C9489000C9489000C9489000C9489003C -:100020000C9489000C9489000C9489000C9489002C -:100030000C9489000C9489000C9489000C9489001C -:100040000C9489000C9489000C9489000C9489000C -:100050000C949B080C9489000C94C5080C9489009E -:100060000C9489000C9489000C9489000C948900EC -:100070000C9489000C9489000C9489000C948900DC -:100080000C9489000C9489000C948900FD000001F7 -:100090000301E900060109010C010F011201E7004B -:1000A000FA001501590956095309310950094D093A -:1000B0004A09470944092F0941095C095F091124CC -:1000C0001FBECFEFD0E4DEBFCDBF11E0A0E0B1E0B6 -:1000D000E0E3F3E100E00BBF02C007900D92AE3207 -:1000E000B107D9F722E0AEE2B1E001C01D92AB3812 -:1000F000B207E1F710E0CFE5D0E004C02197FE01A0 -:100100000E948D09CE35D107C9F70E94EF080C94E3 -:1001100096090C9400008AE892E00E94190160E0C0 -:1001200087E892E00E945C016FEF87E892E00E940E -:100130007D0160E084E892E00E945C016FEF84E85A -:1001400092E00E947D016FEF81E892E00E947D01C4 -:100150008AE792E00E9454028FE291E00E944C03F1 -:100160008FE291E00E946C03789484B7877F84BF0C -:10017000109260000FB6F894A89580916000886195 -:1001800080936000109260000FBE0895CF9398E0B6 -:1001900088E10FB6F894A895809360000FBE909305 -:1001A0006000A8958FE291E00E94E904C82F682FB3 -:1001B00084E892E00E949E018C2F90E0FC01319730 -:1001C000EC30F10530F4EA5BFF4F0C948D090E948E -:1001D000FA078FE291E00E946C030FB6F894A8959D -:1001E00080916000886180936000109260000FBE73 -:1001F000CF9108950E941008ECCF0E944107E9CFEB -:100200000E945A07E6CF0E948107E3CF0E9496071B -:10021000E0CF0E94AC07DDCF0E94C207DACF0E9478 -:10022000D307D7CF0E94E407D4CF0E942608D1CFAE -:10023000089584B1806B84B926988AB18C618AB99B -:1002400080E58CBD81E08DBD8BB1837E8BB95A9AE0 -:100250005B9A5C9A08958BB1837E8BB98BB160FDFC -:1002600010C090E0892B8BB98BB161FD10C090E07C -:10027000892B8BB98BB162FD10C090E0892B8BB9B3 -:10028000089594E0892B8BB98BB161FFF0CF98E092 -:10029000892B8BB98BB162FFF0CF90E1892B8BB9A1 -:1002A00008956EBD0DB407FEFDCF8EB50895FC0117 -:1002B00071836083428308951F93CF93DF93EC0192 -:1002C000162F6A81888199810E942B0188819981EA -:1002D00060E40E9451018881998160E00E9451018F -:1002E00088819981612F0E9451018881998167E0FD -:1002F000DF91CF911F910C942B011F93CF93DF932C -:10030000EC01162F6A81888199810E942B018881D6 -:10031000998160E40E9451018881998161E00E9485 -:10032000510188819981612F0E94510188819981B1 -:1003300067E0DF91CF911F910C942B011F93CF9316 -:10034000DF93EC01162F6A81888199810E942B012D -:100350008881998160E40E9451018881998162E1DC -:100360000E94510188819981612F0E9451018881E9 -:10037000998167E0DF91CF911F910C942B011F931E -:10038000CF93DF93EC01162F6A81888199810E94B7 -:100390002B018881998160E40E94510188819981B3 -:1003A00063E10E94510188819981612F0E9451016E -:1003B0008881998167E0DF91CF911F910C942B0187 -:1003C0001F93CF93DF93EC016A81888199810E940A -:1003D0002B018881998161E40E9451018881998172 -:1003E00062E10E9451018881998160E00E9451017F -:1003F000182F8881998167E00E942B01812FDF915E -:10040000CF911F9108951F93CF93DF93EC016A81E1 -:10041000888199810E942B018881998161E40E94E1 -:1004200051018881998163E10E94510188819981FC -:1004300060E00E945101182F8881998167E00E9435 -:100440002B01812FDF91CF911F910895FC017183C2 -:100450006083428308950F931F93CF93DF93EC0142 -:100460008B016A81888199810E942B018881998101 -:10047000B8010024660F771F001C660F771F001C51 -:10048000672F702D0E94510188819981602F660F1E -:10049000660F0E9451018881998167E0DF91CF91B9 -:1004A0001F910F910C942B0110927C0087E8809390 -:1004B0007A00089580917C00807E682B60937C0098 -:1004C00080917A00806480937A0083EA91E00197BA -:1004D000F1F700C0000080917A0086FDFCCF80918A -:1004E00078009091790008950F931F93CF93DF9335 -:1004F00061E087E892E00E949E01C1E0D0E001E067 -:1005000010E02FEF84E39CE0215080409040E1F721 -:1005100000C00000B8010C2E01C0660F0A94EAF773 -:1005200087E892E00E949E012196C930D10549F7E3 -:10053000DF91CF911F910F9108950F931F93CF9348 -:10054000DF9361E084E892E00E949E01C1E0D0E088 -:1005500001E010E02FEF84E39CE0215080409040C8 -:10056000E1F700C00000B8010C2E01C0660F0A942C -:10057000EAF784E892E00E949E012196C930D105F5 -:1005800049F7DF91CF911F910F910895CF93DF939A -:10059000C0E0D0E0BE018EE792E00E942B0287E827 -:1005A00093E10197F1F700C000002196C11594E096 -:1005B000D90781F72FE78AE196E0215080409040EB -:1005C000E1F700C0000060E070E08EE792E0DF91AC -:1005D000CF910C942B02CF93DF93C0E0D0E0BE010B -:1005E0008BE792E00E942B0287E893E10197F1F7F5 -:1005F00000C000002196C11594E0D90781F72FE7CC -:100600008AE196E0215080409040E1F700C0000070 -:1006100060E070E08BE792E0DF91CF910C942B02C9 -:100620000FB6F894A895809160008861809360006F -:10063000109260000FBE60E08AE792E00E945A02CA -:10064000BC018EE792E00E942B0261E08AE792E013 -:100650000E945A02BC018BE792E00E942B0287E8BD -:1006600092E00E940302682F87E892E00E949E01B8 -:1006700081E892E00E940302682F84E892E00E94E1 -:100680009E01D9CF0E9474020E949D020E94C60260 -:100690000E94EB020E94100322E02093C00028ED8C -:1006A0002093C10026E02093C2001092C50024E1EF -:1006B0002093C400865B9E4FFC01108208958091B8 -:1006C000C6008FE792E00197F1F700C0000080912B -:1006D000C00087FDF4CF089589539F4FFC0110821D -:1006E00008959C01FC01E65BFE4F90819111FDCFC6 -:1006F000F901E85BFE4F10820895DC01A953BF4F5A -:100700002C9131E0320F3C933091C600FC01E20F96 -:10071000F11DE95BFF4F30832C91FC01E95BFF4F3A +:100000000C9461000C948B000C948B000C948B006E +:100010000C948B000C948B000C948B000C948B0034 +:100020000C948B000C948B000C948B000C948B0024 +:100030000C948B000C948B000C948B000C948B0014 +:100040000C948B000C948B000C948B000C948B0004 +:100050000C94820D0C948B000C94AC0D0C948B00C2 +:100060000C948B000C948B000C948B000C948B00E4 +:100070000C948B000C948B000C948B000C948B00D4 +:100080000C948B000C948B000C948B00F500F80002 +:10009000FB00E100FE000101040107010A010D015E +:1000A000DF00F2001001390E360E330E0E0E300E48 +:1000B0002D0E2A0E270E240E210E0C0E1E0E3C0EA7 +:1000C0003F0E11241FBECFEFD0E4DEBFCDBF11E045 +:1000D000A0E0B1E0E0EFFCE100E00BBF02C0079060 +:1000E0000D92A033B107D9F722E0A0E3B1E001C03F +:1000F0001D92AE38B207E1F710E0C1E6D0E004C0CF +:100100002197FE010E946D0EC036D107C9F70E94EB +:10011000D60D0C94760E0C9400008DE892E00E94AF +:10012000140160E08AE892E00E9457016FEF8AE8CC +:1001300092E00E94780160E087E892E00E94570117 +:100140006FEF87E892E00E9478016FEF84E892E019 +:100150000E9478018DE792E00E944F0281E391E0D6 +:100160000E94470381E391E00E946703789484B77B +:10017000877F84BF109260000FB6F894A895809195 +:100180006000886180936000109260000FBE089547 +:10019000CF93A89581E391E00E949008C82F682F23 +:1001A00087E892E00E9499018C2F90E0FC01319742 +:1001B000ED30F10530F4EA5BFF4F0C946D0E0E94B8 +:1001C000E10C81E391E00E9467030FB6F894A895D3 +:1001D00080916000886180936000109260000FBE83 +:1001E000CF9108950E94F70CECCF0E94170CE9CF35 +:1001F0000E94300CE6CF0E94570CE3CF0E946C0C9B +:10020000E0CF0E94820CDDCF0E94980CDACF0E94D2 +:10021000A90CD7CF0E94BA0CD4CF0E94CB0CD1CF5F +:100220000E940D0DCECF089584B1806B84B92698BD +:100230008AB18C618AB980E58CBD81E08DBD8BB1BE +:10024000837E8BB95A9A5B9A5C9A08958BB1837EB0 +:100250008BB98BB160FD10C090E0892B8BB98BB14D +:1002600061FD10C090E0892B8BB98BB162FD10C08D +:1002700090E0892B8BB9089594E0892B8BB98BB1D1 +:1002800061FFF0CF98E0892B8BB98BB162FFF0CF83 +:1002900090E1892B8BB908956EBD0DB407FEFDCF9B +:1002A0008EB50895FC0171836083428308951F9386 +:1002B000CF93DF93EC01162F6A81888199810E9488 +:1002C00026018881998160E40E944C01888199818E +:1002D00060E00E944C0188819981612F0E944C014D +:1002E0008881998167E0DF91CF911F910C9426015D +:1002F0001F93CF93DF93EC01162F6A818881998138 +:100300000E9426018881998160E40E944C018881C5 +:10031000998161E00E944C0188819981612F0E943E +:100320004C018881998167E0DF91CF911F910C94F6 +:1003300026011F93CF93DF93EC01162F6A818881EA +:1003400099810E9426018881998160E40E944C0174 +:100350008881998162E10E944C0188819981612F95 +:100360000E944C018881998167E0DF91CF911F91B4 +:100370000C9426011F93CF93DF93EC01162F6A8113 +:10038000888199810E9426018881998160E40E9478 +:100390004C018881998163E10E944C018881998197 +:1003A000612F0E944C018881998167E0DF91CF9194 +:1003B0001F910C9426011F93CF93DF93EC016A8168 +:1003C000888199810E9426018881998161E40E9437 +:1003D0004C018881998162E10E944C018881998158 +:1003E00060E00E944C01182F8881998167E00E948B +:1003F0002601812FDF91CF911F9108951F93CF93F5 +:10040000DF93EC016A81888199810E9426018881AD +:10041000998161E40E944C018881998163E10E9485 +:100420004C018881998160E00E944C01182F8881DD +:10043000998167E00E942601812FDF91CF911F9162 +:100440000895FC0171836083428308950F931F9385 +:10045000CF93DF93EC018B016A81888199810E949F +:10046000260188819981B8010024660F771F001C3E +:10047000660F771F001C672F702D0E944C0188812A +:100480009981602F660F660F0E944C0188819981C7 +:1004900067E0DF91CF911F910F910C94260110928C +:1004A0007C0087E880937A00089580917C00807EAC +:1004B000682B60937C0080917A00806480937A003E +:1004C00083EA91E00197F1F700C0000080917A0083 +:1004D00086FDFCCF809178009091790008950F936C +:1004E0001F93CF93DF9361E08AE892E00E94990125 +:1004F000C1E0D0E001E010E02FEF84E39CE0215068 +:1005000080409040E1F700C00000B8010C2E01C00F +:10051000660F0A94EAF78AE892E00E949901219610 +:10052000C930D10549F7DF91CF911F910F910895FF +:100530000F931F93CF93DF9361E087E892E00E94CF +:100540009901C1E0D0E001E010E02FEF84E39CE0EE +:10055000215080409040E1F700C00000B8010C2E0F +:1005600001C0660F0A94EAF787E892E00E949901B9 +:100570002196C930D10549F7DF91CF911F910F9195 +:100580000895CF93DF93C0E0D0E0BE0181E892E010 +:100590000E94260287E893E10197F1F700C000006E +:1005A0002196C11594E0D90781F72FE78AE196E0FB +:1005B000215080409040E1F700C0000060E070E012 +:1005C00081E892E0DF91CF910C942602CF93DF93E4 +:1005D000C0E0D0E0BE018EE792E00E94260287E8EC +:1005E00093E10197F1F700C000002196C11594E056 +:1005F000D90781F72FE78AE196E0215080409040AB +:10060000E1F700C0000060E070E08EE792E0DF916B +:10061000CF910C9426020FB6F894A89580916000B3 +:10062000886180936000109260000FBE60E08DE7EB +:1006300092E00E945502BC0181E892E00E942602ED +:1006400061E08DE792E00E945502BC018EE792E0E6 +:100650000E9426028AE892E00E94FE01682F8AE842 +:1006600092E00E94990184E892E00E94FE01682FC6 +:1006700087E892E00E949901D9CF0E946F020E9400 +:1006800098020E94C1020E94E6020E940B0322E02F +:100690002093C00028ED2093C10026E02093C200E3 +:1006A0001092C50024E12093C400855B9E4FFC019D +:1006B000108208958091C6008FE792E00197F1F7CC +:1006C00000C000008091C00087FDF4CF08958953D9 +:1006D0009F4FFC01108208959C01FC01E55BFE4FD9 +:1006E00090819111FDCFF901E85BFE4F10823296A7 +:1006F00010820895DC01A953BF4F2C9131E0320FD5 +:100700003C933091C600FC01E20FF11DE95BFF4F05 +:1007100030832C91213081F02C91FC01E95BFF4F5B :10072000E081F0E0E050FF4F8081281720F01C921C -:1007300081E080932E0108950F931F93CF93DF9351 -:10074000EC018C01085B1E4FF801608187E892E0A4 -:100750000E949E01F801908131968081981740F0A7 -:10076000C65BDE4F1882DF91CF911F910F910895E4 -:100770008091C00085FFFCCFF801808191E0980F47 -:100780009083C80FD11DC853DF4F88818093C60066 -:10079000DF91CF911F910F910895CF92DF92EF9249 -:1007A000FF920F931F93CF93DF93EC01C85BDE4F53 -:1007B0002881211109C0DF91CF911F910F91FF90E6 -:1007C000EF90DF90CF9008958C018881780197EBAE -:1007D000E91A9EEFF90AF701808318826801F6EBA7 -:1007E000CF1AFEEFDF0A81E0F6018083688187E897 -:1007F00092E00E949E019881F7018081981788F409 -:100800009091C00095FFFCCF888191E0980F98836C -:10081000E801C80FD11DC853DF4F88818093C600FF -:10082000CACFF6011082C7CFFC01E85BFE4F2081E2 -:1008300031E0320F3083820F911DFC01E853FF4FEE -:1008400060830895FC01E85BFE4F208131E0320FA8 -:100850003083DC01A20FB11DA853BF4F6C932081E0 -:1008600031E0320F3083820F911DFC01E853FF4FBE -:10087000708308950F931F93CF93DF938C01DC0156 -:10088000A85BBE4F8C9191E0980F9C93F801E80F04 -:10089000F11DE853FF4F40839FEF940F442371F005 -:1008A000EB0139912C9141E0420F4C93F801E20F9A -:1008B000F11DE853FF4F3083915098F7DF91CF91AE -:1008C0001F910F910895EF92FF920F931F93CF9373 -:1008D000DF937C01EC01C85BDE4F888191E0980FCB -:1008E0009883F701E80FF11DE853FF4F40835FEF56 -:1008F000540F442309F46BC0FB0120E041E9BF0120 -:100900003191888191E0980F98838701080F111D1C -:10091000C80188539F4FDC013C93DB018C91282751 -:10092000822F842720FD282F30E035952795842FAE -:10093000822720FD282F30E035952795842F8227A8 -:1009400020FD282F30E035952795842F822720FD24 -:10095000282F30E035952795842F822720FD282FDA -:1009600030E035952795942F922720FD292F30E0F0 -:1009700035952795942F922720FD292F30E0359526 -:100980002795842F822720FD282F2695515008F087 -:10099000B6CF888191E0980F9883F701E80FF11D99 -:1009A000E853FF4F2083F701E953FF4F808191E027 -:1009B000980F9083D701A80FB11DA95BBF4F8C91F1 -:1009C000DF91CF911F910F91FF90EF90089520E05C -:1009D000E0CFFC01E953FF4F208131E0320F30833B -:1009E000820F911DFC01E95BFF4F80810895FC019E -:1009F000E953FF4F208131E0320F3083DC01A20F39 -:100A0000B11DA95BBF4F2C91308141E0430F408362 -:100A1000830F911DFC01E95BFF4F3081822F90E035 -:100A2000932B0895CF93DF93DC01EC01CB5BDF4F79 -:100A3000888199818230910509F469C0A0F40097FA -:100A400009F440C0019749F48C91FD01E80FF11DB4 -:100A5000618382E090E0998388838C918F5F8C938F -:100A6000DF91CF9108958330910509F4D6C00497A2 -:100A7000A1F78091C6008FE792E00197F1F700C0DF -:100A800000008091C00087FDF4CFFD01EC5BFF4FBB -:100A90008081882309F436C19EEFFD01E85BFE4F9B -:100AA000808121E0280F2083FD01E80FF11DE8532C -:100AB000FF4F9083198218828C918F5F8C93DF9106 -:100AC000CF910895613408F41FC18091C6008FE76B -:100AD00092E00197F1F700C000008091C00087FD0F -:100AE000F4CFFD01E85BFE4F808191E0980F908389 -:100AF000FD01E80FF11DE853FF4F8EEF808319824F -:100B000018828C918F5F8C93DF91CF9108958C9197 -:100B1000FD01E80FF11D6183FD01EC5BFF4F80815A -:100B200068276083808180FF04C0908181E98927E4 -:100B30008083808190E0959587958083808180FF78 -:100B400004C0908181E989278083808190E0959518 -:100B500087958083808180FF04C0908181E9892707 -:100B60008083808190E0959587958083808180FF48 -:100B700004C0908181E989278083808190E09595E8 -:100B800087958083808180FF04C0908181E98927D7 -:100B90008083808190E0959587958083808180FF18 -:100BA00004C0908181E989278083808190E09595B8 -:100BB00087958083808180FF04C0908181E98927A7 -:100BC0008083808190E0959587958083808180FFE8 -:100BD00004C0908181E989278083808190E0959588 -:100BE000879580839C9111968C911197981709F4A1 -:100BF00098C09C9111968C911197981708F42DCF5D -:100C00008091C6008FE792E00197F1F700C00000E5 -:100C10008091C00087FDF4CF64CF8C91FD01E80F77 -:100C2000F11D6183FD01EC5BFF4F808168276083CC -:100C3000808180FF04C0908181E989278083808141 -:100C400090E0959587958083808180FF04C0908196 -:100C500081E989278083808190E0959587958083BD -:100C6000808180FF04C0908181E989278083808111 -:100C700090E0959587958083808180FF04C0908166 -:100C800081E989278083808190E09595879580838D -:100C9000808180FF04C0908181E9892780838081E1 -:100CA00090E0959587958083808180FF04C0908136 -:100CB00081E989278083808190E09595879580835D -:100CC000808180FF04C0908181E9892780838081B1 -:100CD00090E0959587958083808180FF04C0908106 -:100CE00081E989278083808190E09595879580832D -:100CF00084E090E0998388838C918F5F8C93DF915F -:100D0000CF9108959FEFC9CE11966C931197FD0175 -:100D1000EC5BFF4F10821C9281E090E09983888306 -:100D20009CCE83E090E09983888397CECF92DF9228 -:100D3000FF920F931F93CF93DF93FC01E953FF4F73 -:100D40009C01285B3E4F6901D1E9640F711DAEEF34 -:100D5000FA2E208131E0320F3083AC01420F511D59 -:100D60009A01295B3F4FD9011C91103809F475C0D5 -:100D7000113408F010E0C0E020E0308141E0430F82 -:100D80004083AC01430F511DDA01A95BBF4F0C91A9 -:100D9000202720FD2D2730E035952795422F20FF75 -:100DA00002C04D2F4227242F30E035952795422F42 -:100DB00020FF02C04D2F422750E055954795242F24 -:100DC00040FF02C02D2F242730E035952795422F74 -:100DD00020FF02C04D2F422750E055954795242F04 -:100DE00040FF02C02D2F242730E035952795422F54 -:100DF00020FF02C04D2F422750E055954795242FE4 -:100E000040FF02C02D2F24272695C117A0F1CF5FE8 -:100E10001C1708F0B2CF3091C600AFE7B2E01197CF -:100E2000F1F700C000003091C00037FDF4CF211170 -:100E300014C0F601208131E0320F3083820F911D02 -:100E4000FC01E853FF4F8FEF8083DF91CF911F911B -:100E50000F91FF90DF90CF900895D6012C9131E053 -:100E6000320F3C93AC01420F511D9A0128533F4F62 -:100E7000D901FC926ECFAB014C0F511DDA010C93DE -:100E8000C6CFCF938FE291E00E9471038FE291E091 -:100E90000E94E904C82F6FEF8FE291E00E941404D2 -:100EA0006C2F8FE291E00E9414048FE291E0CF91C9 -:100EB0000C94CD038FE291E00E94710363E08FE216 -:100EC00091E00E9414044CE062E271E08FE291E054 -:100ED0000E943A0449E069E171E08FE291E00E94EA -:100EE0003A044CE06DE071E08FE291E00E943A0438 -:100EF0006FEF8FE291E00E9414048FE291E00C9476 -:100F0000CD038FE291E00E9471038FE291E00E9495 -:100F1000F704BC01660F771F680F791F8FE291E01D -:100F20000E9422048FE291E00C94CD038FE291E0C5 -:100F30000E9471038FE291E00E94E904682F87E824 -:100F400092E00E949E016FEF8FE291E00E941404F4 -:100F50008FE291E00C94CD038FE291E00E94710347 -:100F60008FE291E00E94E904682F84E892E00E94F9 -:100F70009E016FEF8FE291E00E9414048FE291E0F6 -:100F80000C94CD038FE291E00E94710387E892E018 -:100F90000E940302682F8FE291E00E9414048FE206 -:100FA00091E00C94CD038FE291E00E94710384E8FC -:100FB00092E00E940302682F8FE291E00E941404E5 -:100FC0008FE291E00C94CD038FE291E00E947103D7 -:100FD0008FE291E00E94F704BC018EE792E00E944C -:100FE0002B026FEF8FE291E00E9414048FE291E0F8 -:100FF0000C94CD038FE291E00E9471038FE291E0A7 -:101000000E94F704BC018BE792E00E942B026FEF75 -:101010008FE291E00E9414048FE291E00C94CD03E2 -:101020008FE291E00E9471038FE291E00E94E90457 -:10103000682F8AE792E00E945A02BC018FE291E099 -:101040000E9422048FE291E00C94CD038F929F9234 -:10105000AF92BF92CF92DF92EF92FF920F931F93C6 -:10106000CF93DF938FE291E00E94E904882E8FE214 -:1010700091E00E94E904982E8FE291E00E94F7042B -:10108000EC018FE291E00E94F7045C018FE291E0B5 -:101090000E94F704A89E6001A99ED00CB89ED00CB7 -:1010A00011246FEF84E892E00E949E01CC15DD05CB -:1010B0004CF5BE018EE792E00E942B02A895682DA8 -:1010C0008AE792E00E945A027C01692D8AE792E049 -:1010D0000E945A028C018FE291E00E947103B701D5 -:1010E0008FE291E00E942204B8018FE291E00E9419 -:1010F00022048FE291E00E94CD03CA0DDB1DCC15C6 -:10110000DD05BCF28FE291E00E9471036FEF8FE288 -:1011100091E00E9414048FE291E0DF91CF911F9142 -:101120000F91FF90EF90DF90CF90BF90AF909F9086 -:101130008F900C94CD031F920F920FB60F92112433 -:101140000BB60F922F933F934F935F936F937F93C1 -:101150008F939F93AF93BF93EF93FF938FE291E0B1 -:101160000E947D03FF91EF91BF91AF919F918F916D -:101170007F916F915F914F913F912F910F900BBE97 -:101180000F900FBE0F901F9018951F920F920FB6E1 -:101190000F9211240BB60F922F933F934F935F93AF -:1011A0006F937F938F939F93AF93BF93EF93FF932F -:1011B0008FE291E00E949C03FF91EF91BF91AF916C -:1011C0009F918F917F916F915F914F913F912F915F -:1011D0000F900BBE0F900FBE0F901F9018950E949E -:1011E0008B006FEF87E892E00E949E012FE78AE173 -:1011F00096E0215080409040E1F700C0000060E0A0 -:1012000087E892E00E949E0118E1D8E004C026E041 -:101210002A95F1F700C080912E018823C1F3109226 -:101220002E010FB6F894A895109360000FBED093CE -:101230006000A8958FE291E00E94E904C82F682F12 -:1012400084E892E00E949E018C2F90E0FC0131978F -:10125000EC30F10530F4EE5AFF4F0C948D090E94EA -:10126000FA078FE291E00E946C030FB6F894A895FC -:1012700080916000886180936000109260000FBED2 -:10128000C6CF0E941008EDCF0E94E407EACF0E946B -:10129000D307E7CF0E94C207E4CF0E94AC07E1CF9B -:1012A0000E949607DECF0E948107DBCF0E945A077B -:1012B000D8CF0E944107D5CF0E942608D2CF8AE816 -:1012C00092E00E94180142E06AE872E087E892E04A -:1012D0000E94570143E06AE872E084E892E00E94CD -:1012E000570145E06AE872E081E892E00E94570108 -:1012F00040E06AE872E08EE792E00E94260241E058 -:101300006AE872E08BE792E00E94260210922F01B9 -:1013100010927501109274010895EE0FFF1F0024C2 -:10132000001C0BBE0790F691E02D0994F894FFCFB6 -:1013300001020103000202010103030209626F615D -:101340007264696E666F2E680030383A33393A3508 -:0E1350003700417072202033203230313900D6 +:1007300081E080933001089538E028E10FB6F89405 +:10074000A895209360000FBE30936000A895E4CF79 +:100750000F931F93CF93DF93EC018C01085B1E4F27 +:10076000F80160818AE892E00E949901F801908185 +:1007700031968081981740F0C55BDE4F1882DF917B +:10078000CF911F910F9108958091C00085FFFCCFFC +:10079000F801808191E0980F9083C80FD11DC85354 +:1007A000DF4F88818093C600DF91CF911F910F9119 +:1007B0000895CF92DF92EF92FF920F931F93CF9302 +:1007C000DF93EC01C85BDE4F2881211109C0DF9166 +:1007D000CF911F910F91FF90EF90DF90CF900895F0 +:1007E0008C018881780197EBE91A9EEFF90AF701ED +:1007F000808318826801F5EBCF1AFEEFDF0A81E0F3 +:10080000F601808368818AE892E00E9499019881CC +:10081000F7018081981788F49091C00095FFFCCF74 +:10082000888191E0980F9883E801C80FD11DC853C3 +:10083000DF4F88818093C600CACFF6011082C7CFF0 +:10084000FC01E85BFE4F208131E0320F3083FC0178 +:10085000E20FF11DE853FF4F6083FC01E65BFE4FA2 +:10086000808168276083808180FF04C0908181E956 +:1008700089278083808190E095958795808380810A +:1008800080FF04C0908181E989278083808190E086 +:10089000959587958083808180FF04C0908181E950 +:1008A00089278083808190E09595879580838081DA +:1008B00080FF04C0908181E989278083808190E056 +:1008C000959587958083808180FF04C0908181E920 +:1008D00089278083808190E09595879580838081AA +:1008E00080FF04C0908181E989278083808190E026 +:1008F000959587958083808180FF04C0908181E9F0 +:1009000089278083808190E0959587958083808179 +:1009100080FF04C0908181E989278083808190E0F5 +:100920009595879580830895DC01A85BBE4F2C9137 +:1009300031E0320F3C93FC01E20FF11DE853FF4F11 +:100940006083FC01E65BFE4F20816227608320818B +:1009500020FF04C0308121E923272083208130E05B +:10096000359527952083208120FF04C0308121E91F +:1009700023272083208130E035952795208320810F +:1009800020FF04C0308121E923272083208130E02B +:10099000359527952083208120FF04C0308121E9EF +:1009A00023272083208130E03595279520832081DF +:1009B00020FF04C0308121E923272083208130E0FB +:1009C000359527952083208120FF04C0308121E9BF +:1009D00023272083208130E03595279520832081AF +:1009E00020FF04C0308121E923272083208130E0CB +:1009F000359527952083208120FF04C0308121E98F +:100A000023272083208130E03595279520832C9162 +:100A100031E0320F3C93820F911DDC01A853BF4F90 +:100A20007C93808178277083808180FF04C09081CF +:100A300081E989278083808190E0959587958083DF +:100A4000808180FF04C0908181E989278083808133 +:100A500090E0959587958083808180FF04C0908188 +:100A600081E989278083808190E0959587958083AF +:100A7000808180FF04C0908181E989278083808103 +:100A800090E0959587958083808180FF04C0908158 +:100A900081E989278083808190E09595879580837F +:100AA000808180FF04C0908181E9892780838081D3 +:100AB00090E0959587958083808180FF04C0908128 +:100AC00081E989278083808190E09595879580834F +:100AD000808180FF04C0908181E9892780838081A3 +:100AE00090E095958795808308950F931F93CF93FA +:100AF000DF93DC01A85BBE4F2C9131E0320F3C93B9 +:100B0000FC01E20FF11DE853FF4F4083FC01E65B5F +:100B1000FE4F208124272083208120FF04C03081C4 +:100B200021E923272083208130E0359527952083F4 +:100B3000208120FF04C0308121E9232720832081E8 +:100B400030E0359527952083208120FF04C0308137 +:100B500021E923272083208130E0359527952083C4 +:100B6000208120FF04C0308121E9232720832081B8 +:100B700030E0359527952083208120FF04C0308107 +:100B800021E923272083208130E035952795208394 +:100B9000208120FF04C0308121E923272083208188 +:100BA00030E0359527952083208120FF04C03081D7 +:100BB00021E923272083208130E035952795208364 +:100BC000208120FF04C0308121E923272083208158 +:100BD00030E03595279520835FEF540F442309F4C7 +:100BE0006EC08B0141E9E80139918E012C9161E0E1 +:100BF000620F6C93BC01620F711D68537F4FEB0154 +:100C00003883208123272083208120FF03C0208177 +:100C100024272083208130E035952795208320816B +:100C200020FF03C0208124272083208130E03595D8 +:100C300027952083208120FF03C020812427208343 +:100C4000208130E0359527952083208120FF03C047 +:100C5000208124272083208130E03595279520832B +:100C6000208120FF03C0208124272083208130E0C1 +:100C7000359527952083208120FF03C020812427DC +:100C80002083208130E0359527952083208120FF27 +:100C900003C0208124272083208130E035952795CB +:100CA0002083208120FF03C02081242720832081EE +:100CB00030E0359527952083515008F094CFDF918F +:100CC000CF911F910F910895FC01E65BFE4F2081AB +:100CD000DC01A85BBE4F3C9141E0430F4C93830F76 +:100CE000911DDC01A853BF4F2C9380818227808304 +:100CF000808180FF04C0908181E989278083808181 +:100D000090E0959587958083808180FF04C09081D5 +:100D100081E989278083808190E0959587958083FC +:100D2000808180FF04C0908181E989278083808150 +:100D300090E0959587958083808180FF04C09081A5 +:100D400081E989278083808190E0959587958083CC +:100D5000808180FF04C0908181E989278083808120 +:100D600090E0959587958083808180FF04C0908175 +:100D700081E989278083808190E09595879580839C +:100D8000808180FF04C0908181E9892780838081F0 +:100D900090E0959587958083808180FF04C0908145 +:100DA00081E989278083808190E09595879580836C +:100DB0000895CF92DF92EF92FF920F931F93CF93FC +:100DC000DF936C018C01085B1E4FD8018C9191E080 +:100DD000980F9C93F601E80FF11DE853FF4F4083F5 +:100DE000F601E65BFE4F808184278083808180FF4F +:100DF00004C0908181E989278083808190E0959566 +:100E000087958083808180FF04C0908181E9892754 +:100E10008083808190E0959587958083808180FF95 +:100E200004C0908181E989278083808190E0959535 +:100E300087958083808180FF04C0908181E9892724 +:100E40008083808190E0959587958083808180FF65 +:100E500004C0908181E989278083808190E0959505 +:100E600087958083808180FF04C0908181E98927F4 +:100E70008083808190E0959587958083808180FF35 +:100E800004C0908181E989278083808190E09595D5 +:100E900087958083808180FF04C0908181E98927C4 +:100EA0008083808190E09595879580835FEF540FD4 +:100EB000442309F433C1DB0120E041E9BD019C91E9 +:100EC000E801888131E0380F38837601E80EF11CA3 +:100ED000D8ECED0EF11CE70198838081892780838F +:100EE000808180FF03C0808184278083808190E09F +:100EF000959587958083808180FF03C080818427BA +:100F00008083808190E0959587958083808180FFA4 +:100F100003C0808184278083808190E095958795A8 +:100F20008083808180FF03C08081842780838081CB +:100F300090E0959587958083808180FF03C08081B4 +:100F400084278083808190E0959587958083808138 +:100F500080FF03C0808184278083808190E0959505 +:100F600087958083808180FF03C080818427808370 +:100F7000808190E0959587958083808180FF03C074 +:100F8000808184278083808190E0959587958083F8 +:100F90001196EB019881292720FD242730E0359513 +:100FA0002795822F20FF02C0842F822790E09595FD +:100FB0008795282F80FF02C0242F282730E0359501 +:100FC0002795822F20FF02C0842F822790E09595DD +:100FD0008795282F80FF02C0242F282730E03595E1 +:100FE0002795822F20FF02C0842F822790E09595BD +:100FF0008795682F80FF02C0642F682770E0759581 +:101000006795262F60FF02C0242F26272695515072 +:1010100008F054CFD8018C9191E0980F9C93D601A1 +:10102000A80FB11DA853BF4F2C9380812827208380 +:10103000808180FF04C0908181E98927808380813D +:1010400090E0959587958083808180FF04C0908192 +:1010500081E989278083808190E0959587958083B9 +:10106000808180FF04C0908181E98927808380810D +:1010700090E0959587958083808180FF04C0908162 +:1010800081E989278083808190E095958795808389 +:10109000808180FF04C0908181E9892780838081DD +:1010A00090E0959587958083808180FF04C0908132 +:1010B00081E989278083808190E095958795808359 +:1010C000808180FF04C0908181E9892780838081AD +:1010D00090E0959587958083808180FF04C0908102 +:1010E00081E989278083808190E095958795808329 +:1010F000F601E953FF4F808191E0980F9083E6015C +:10110000C80FD11DC95BDF4F8881DF91CF911F913F +:101110000F91FF90EF90DF90CF90089520E07ACF6D +:10112000FC01E953FF4F208131E0320F3083820F01 +:10113000911DFC01E95BFF4F80810895FC01E9539B +:10114000FF4F208131E0320F3083DC01A20FB11D4F +:10115000A95BBF4F2C91308141E0430F4083830F47 +:10116000911DFC01E95BFF4F3081822F90E0932BB2 +:101170000895CF93DF93DC01EC01CB5BDF4F8881D7 +:1011800099818230910509F446C1A0F4009709F4D1 +:101190001BC1019749F48C91FD01E80FF11D61839A +:1011A00082E090E0998388838C918F5F8C93DF91AC +:1011B000CF9108958330910509F491C00497A1F768 +:1011C0008091C6008FE792E00197F1F700C0000020 +:1011D0008091C00087FDF4CFFD01EC5BFF4F808163 +:1011E000882309F49DC19EEFFD01E85BFE4F8081DD +:1011F00021E0280F2083FD01E80FF11DE853FF4F88 +:101200009083FD01E65BFE4F80818927808380818A +:1012100080FF04C0908181E989278083808190E0EC +:10122000959587958083808180FF04C0908181E9B6 +:1012300089278083808190E0959587958083808140 +:1012400080FF04C0908181E989278083808190E0BC +:10125000959587958083808180FF04C0908181E986 +:1012600089278083808190E0959587958083808110 +:1012700080FF04C0908181E989278083808190E08C +:10128000959587958083808180FF04C0908181E956 +:1012900089278083808190E09595879580838081E0 +:1012A00080FF04C0908181E989278083808190E05C +:1012B000959587958083808180FF04C0908181E926 +:1012C00089278083808190E0959587958083198216 +:1012D00018828C918F5F8C93DF91CF9108958C91C0 +:1012E000FD01E80FF11D6183FD01EC5BFF4F808183 +:1012F00068276083808180FF04C0908181E989270D +:101300008083808190E0959587958083808180FFA0 +:1013100004C0908181E989278083808190E0959540 +:1013200087958083808180FF04C0908181E989272F +:101330008083808190E0959587958083808180FF70 +:1013400004C0908181E989278083808190E0959510 +:1013500087958083808180FF04C0908181E98927FF +:101360008083808190E0959587958083808180FF40 +:1013700004C0908181E989278083808190E09595E0 +:1013800087958083808180FF04C0908181E98927CF +:101390008083808190E0959587958083808180FF10 +:1013A00004C0908181E989278083808190E09595B0 +:1013B0008795808384E090E0998388838C918F5F08 +:1013C0008C93DF91CF910895613408F4ABC0809184 +:1013D000C6008FE792E00197F1F700C0000080910E +:1013E000C00087FDF4CFFD01E85BFE4F808191E0F6 +:1013F000980F9083FD01E80FF11DE853FF4F8EEF2A +:101400008083FD01E65BFE4F908189278083808188 +:1014100080FF04CFFFCE8C91FD01E80FF11D6183A9 +:10142000FD01EC5BFF4F808168276083808180FF36 +:1014300004C0908181E989278083808190E095951F +:1014400087958083808180FF04C0908181E989270E +:101450008083808190E0959587958083808180FF4F +:1014600004C0908181E989278083808190E09595EF +:1014700087958083808180FF04C0908181E98927DE +:101480008083808190E0959587958083808180FF1F +:1014900004C0908181E989278083808190E09595BF +:1014A00087958083808180FF04C0908181E98927AE +:1014B0008083808190E0959587958083808180FFEF +:1014C00004C0908181E989278083808190E095958F +:1014D00087958083808180FF04C0908181E989277E +:1014E0008083808190E09595879580839C9111966B +:1014F0008C911197981719F19C9111968C911197D5 +:10150000981708F451CE8091C6008FE792E00197BA +:10151000F1F700C000008091C00087FDF4CF63CFD9 +:101520009FEF62CE11966C931197FD01EC5BFF4F1C +:1015300010821C9281E090E09983888335CE83E00D +:1015400090E09983888330CE8F929F92AF92BF9222 +:10155000DF92EF920F931F93CF93DF93DC01A95398 +:10156000BF4F9C01285B3E4F4901FC01E65BFE4FEB +:1015700011E95B01A40EB11C2EEFD22E2C9131E0AB +:10158000320F3C93AC01420F511D9A01295B3F4F32 +:10159000E9016881603809F4DBC0613408F060E07B +:1015A00000E020E03C9141E0430F4C93AC01430F3D +:1015B000511DEA01C95BDF4FE8802E2520FD212760 +:1015C00030E035952795422F20FF02C0412F42275A +:1015D000242F30E035952795422F20FF02C0412F60 +:1015E000422750E055954795242F40FF02C0212FF8 +:1015F000242730E035952795422F20FF02C0412F48 +:10160000422750E055954795242F40FF02C0212FD7 +:10161000242730E035952795422F20FF02C0412F27 +:10162000422750E055954795242F40FF02C0212FB7 +:1016300024272695061708F4F4C00F5F601708F0FA +:10164000B1CF3091C600CFE7D2E02197F1F700C0CB +:1016500000003091C00037FDF4CF222309F476C09A +:101660000EEFE401488131E0340F3883BC01640F90 +:10167000711DAB0148535F4FEA0108833081302769 +:101680003083308130FF03C0308131273083408187 +:1016900050E0559547954083308130FF03C030813D +:1016A00031273083408150E0559547954083308104 +:1016B00030FF03C0308131273083408150E05595A1 +:1016C00047954083308130FF03C03081312730831C +:1016D000408150E0559547954083308130FF03C0ED +:1016E000308131273083408150E0559547954083C4 +:1016F000308130FF03C0308131273083408150E09A +:10170000559547954083308130FF03C030813127A4 +:101710003083408150E0559547954083308130FFBC +:1017200003C0308131273083408150E05595479583 +:101730004083211123CFDF91CF911F910F91EF9023 +:10174000DF90BF90AF909F908F9008950FEF89CF5B +:10175000E401288131E0320F3883AC01420F511D82 +:101760009A0128533F4FE901D88220812D252083FB +:10177000208120FF03C0208121272083208130E0A9 +:10178000359527952083208120FF03C020812127C4 +:101790002083208130E0359527952083208120FF0C +:1017A00003C0208121272083208130E035952795B3 +:1017B0002083208120FF03C02081212720832081D6 +:1017C00030E0359527952083208120FF03C02081BC +:1017D00021272083208130E03595279520832081A3 +:1017E00020FF03C0208121272083208130E0359510 +:1017F00027952083208120FF03C02081212720837B +:10180000208130E0359527952083208120FF03C07B +:10181000208121272083208130E035952795208362 +:10182000ADCEA501400F511DEA01E88206CFCF934E +:1018300081E391E00E946C0381E391E00E949008B3 +:10184000C82F6FEF81E391E00E9420046C2F81E3A9 +:1018500091E00E94200481E391E0CF910C94D903A0 +:1018600081E391E00E946C0363E081E391E00E94D8 +:1018700020044CE063E271E081E391E00E94750591 +:1018800049E06AE171E081E391E00E9475054CE076 +:101890006EE071E081E391E00E9475056FEF81E3F6 +:1018A00091E00E94200481E391E00C94D90381E34C +:1018B00091E00E946C0381E391E00E949E08BC01CC +:1018C000660F771F680F791F81E391E00E949404EF +:1018D00081E391E00C94D90381E391E00E946C03D1 +:1018E00081E391E00E949008682F8AE892E00E94CC +:1018F00099016FEF81E391E00E94200481E391E080 +:101900000C94D90381E391E00E946C0381E391E0A0 +:101910000E949008682F87E892E00E9499016FEF7B +:1019200081E391E00E94200481E391E00C94D903CB +:1019300081E391E00E946C038AE892E00E94FE013C +:10194000682F81E391E00E94200481E391E00C94F0 +:10195000D90381E391E00E946C0387E892E00E9442 +:10196000FE01682F81E391E00E94200481E391E071 +:101970000C94D90381E391E00E946C0384E892E027 +:101980000E94FE01682F81E391E00E94200481E320 +:1019900091E00C94D90381E391E00E946C0381E310 +:1019A00091E00E949E08BC0181E892E00E9426021C +:1019B0006FEF81E391E00E94200481E391E00C94B9 +:1019C000D90381E391E00E946C0381E391E00E94DE +:1019D0009E08BC018EE792E00E9426026FEF81E331 +:1019E00091E00E94200481E391E00C94D90381E30B +:1019F00091E00E946C0381E391E00E949008682FBF +:101A00008DE792E00E945502BC0181E391E00E94C3 +:101A1000940481E391E00C94D9038F929F92AF924A +:101A2000BF92CF92DF92EF92FF920F931F93CF93CB +:101A3000DF9381E391E00E949008882E81E391E09A +:101A40000E949008982E81E391E00E949E08EC018C +:101A500081E391E00E949E085C0181E391E00E9495 +:101A60009E08A89E6001A99ED00CB89ED00C11249F +:101A70006FEF87E892E00E949901CC15DD054CF5E7 +:101A8000BE0181E892E00E942602A895682D8DE7AC +:101A900092E00E9455027C01692D8DE792E00E9440 +:101AA00055028C0181E391E00E946C03B70181E350 +:101AB00091E00E949404B80181E391E00E949404B3 +:101AC00081E391E00E94D903CA0DDB1DCC15DD0531 +:101AD000BCF281E391E00E946C036FEF81E391E03F +:101AE0000E94200481E391E0DF91CF911F910F913B +:101AF000FF90EF90DF90CF90BF90AF909F908F902E +:101B00000C94D9031F920F920FB60F9211240BB6AB +:101B10000F922F933F934F935F936F937F938F9386 +:101B20009F93AF93BF93EF93FF9381E391E00E9464 +:101B30007A03FF91EF91BF91AF919F918F917F9128 +:101B40006F915F914F913F912F910F900BBE0F902E +:101B50000FBE0F901F9018951F920F920FB60F9205 +:101B600011240BB60F922F933F934F935F936F9374 +:101B70007F938F939F93AF93BF93EF93FF9381E3F3 +:101B800091E00E94A803FF91EF91BF91AF919F91C7 +:101B90008F917F916F915F914F913F912F910F9016 +:101BA0000BBE0F900FBE0F901F9018950E948D00D6 +:101BB0006FEF8AE892E00E9499012FE78AE196E0B0 +:101BC000215080409040E1F700C0000060E08AE8CA +:101BD00092E00E94990104C026E02A95F1F700C026 +:101BE000809130018823C1F310923001A89581E3E0 +:101BF00091E00E949008C82F682F87E892E00E9429 +:101C000099018C2F90E0FC013197ED30F10530F413 +:101C1000ED5AFF4F0C946D0E0E94E10C81E391E0B0 +:101C20000E9467030FB6F894A895809160008861C0 +:101C300080936000109260000FBECECF0E94F70C20 +:101C4000EDCF0E94CB0CEACF0E94BA0CE7CF0E94E6 +:101C5000A90CE4CF0E94980CE1CF0E94820CDECF49 +:101C60000E946C0CDBCF0E94570CD8CF0E94300C26 +:101C7000D5CF0E94170CD2CF0E940D0DCFCF8DE88B +:101C800092E00E94130142E06DE872E08AE892E07F +:101C90000E94520143E06DE872E087E892E00E9402 +:101CA000520145E06DE872E084E892E00E94520142 +:101CB00040E06DE872E081E892E00E94210241E09C +:101CC0006DE872E08EE792E00E94210210923101ED +:101CD00010927701109276010895EE0FFF1F0024F5 +:101CE000001C0BBE0790F691E02D0994F894FFCFED +:101CF0000102010300020201010103030209626FF4 +:101D0000617264696E666F2E680030393A32383A13 +:101D100034370041707220203320323031390000D6 :00000001FF diff --git a/firmware/Makefile b/firmware/Makefile index 3dbbf94..87bce57 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -11,7 +11,7 @@ OBJCOPY_PATH = avr-objcopy OUTPUT = B15F.elf HEX = B15F.hex MCU = atmega1284p -CFLAGS = -Wall -Wextra -std=c++14 -O3 -mmcu=$(MCU) -DF_CPU=20000000 +CFLAGS = -Wall -Wextra -std=c++14 -O3 -mmcu=$(MCU) -DF_CPU=20000000 -DB15F_DEBUG LDFLAGS = OBJECTS = main.o spi.o mcp23s17.o tlc5615.o adu.o selftest.o global_vars.o usart.o requests.o interrupts.o diff --git a/firmware/global_vars.h b/firmware/global_vars.h index 60bab49..749948c 100644 --- a/firmware/global_vars.h +++ b/firmware/global_vars.h @@ -6,6 +6,9 @@ #include "adu.h" #include "usart.h" + +#define WDT_TIMEOUT WDTO_15MS + extern volatile SPI spi; extern volatile MCP23S17 dio0; extern volatile MCP23S17 dio1; diff --git a/firmware/main.cpp b/firmware/main.cpp index f8dcda3..f119ba8 100644 --- a/firmware/main.cpp +++ b/firmware/main.cpp @@ -7,8 +7,6 @@ #include "requests.h" -#define WDT_TIMEOUT WDTO_15MS - void initAll() { spi.init(); @@ -34,12 +32,15 @@ void initAll() void handleRequest() { - // starte WDT - wdt_enable(WDT_TIMEOUT); wdt_reset(); const uint8_t req = usart.readByte(); + + +#ifdef B15F_DEBUG dio1.writePortA(req); +#endif + switch(req) { @@ -73,6 +74,10 @@ void handleRequest() case RQ_BE1: rqDigitalRead1(); break; + + case RQ_DSW: + rqReadDipSwitch(); + break; case RQ_AA0: rqAnalogWrite0(); @@ -103,10 +108,12 @@ int main() { initAll(); +#ifdef B15F_DEBUG // Reset anzeigen dio0.writePortA(0xFF); _delay_ms(100); dio0.writePortA(0x00); +#endif while(1) { diff --git a/firmware/requests.cpp b/firmware/requests.cpp index 052b1c5..ecb923a 100644 --- a/firmware/requests.cpp +++ b/firmware/requests.cpp @@ -64,6 +64,14 @@ void rqDigitalRead1() usart.flush(); } +void rqReadDipSwitch() +{ + usart.initTX(); + uint8_t port = dsw.readPortB(); + usart.writeByte(port); + usart.flush(); +} + void rqAnalogWrite0() { usart.initTX(); @@ -101,8 +109,6 @@ void rqAdcDacStroke() int16_t start = static_cast(usart.readInt()); int16_t delta = static_cast(usart.readInt()); int16_t count = static_cast(usart.readInt()); - - //usart.writeByte(USART::MSG_OK); count *= delta; dio1.writePortA(0xFF); diff --git a/firmware/requests.h b/firmware/requests.h index 2644a82..271e2f3 100644 --- a/firmware/requests.h +++ b/firmware/requests.h @@ -13,10 +13,11 @@ constexpr static uint8_t RQ_BA0 = 5; constexpr static uint8_t RQ_BA1 = 6; constexpr static uint8_t RQ_BE0 = 7; constexpr static uint8_t RQ_BE1 = 8; -constexpr static uint8_t RQ_AA0 = 9; -constexpr static uint8_t RQ_AA1 = 10; -constexpr static uint8_t RQ_ADC = 11; -constexpr static uint8_t RQ_ADC_DAC_STROKE = 12; +constexpr static uint8_t RQ_DSW = 9; +constexpr static uint8_t RQ_AA0 = 10; +constexpr static uint8_t RQ_AA1 = 11; +constexpr static uint8_t RQ_ADC = 12; +constexpr static uint8_t RQ_ADC_DAC_STROKE = 13; uint8_t const rq_len[] = { /* RQ_DISC */ 1, @@ -28,6 +29,7 @@ uint8_t const rq_len[] = { /* RQ_BA1 */ 2, /* RQ_BE0 */ 1, /* RQ_BE1 */ 1, + /* RQ_DSW */ 1, /* RQ_AA0 */ 3, /* RQ_AA1 */ 3, /* RQ_ADC */ 2, @@ -42,6 +44,7 @@ void rqDigitalWrite0(void); void rqDigitalWrite1(void); void rqDigitalRead0(void); void rqDigitalRead1(void); +void rqReadDipSwitch(void); void rqAnalogWrite0(void); void rqAnalogWrite1(void); void rqAnalogRead(void); diff --git a/firmware/usart.cpp b/firmware/usart.cpp index 49868da..27f8ec3 100644 --- a/firmware/usart.cpp +++ b/firmware/usart.cpp @@ -22,7 +22,7 @@ void USART::clearInputBuffer() volatile do { dummy = UDR0; - _delay_us((1000000 / BAUDRATE) * 16); // Warte Übertragungszeit von 16 Bit ab + _delay_us(US_PER_BIT * 16); // Warte Übertragungszeit von 16 Bit ab } while (UCSR0A & (1<= rq_len[receive_buffer[0]]) // last byte of request { receive_pos = 0; @@ -84,6 +91,15 @@ void USART::flush(void) volatile void USART::writeByte(uint8_t b) volatile { send_buffer[send_pos++] = b; + + // calc crc + send_crc ^= b; + for (uint8_t i = 0; i < 8; i++) + { + if (send_crc & 1) + send_crc ^= CRC7_POLY; + send_crc >>= 1; + } } @@ -101,6 +117,11 @@ void USART::writeStr(const char* str, uint8_t len) volatile writeByte(*str++); } +void USART::writeCRC(void) volatile +{ + writeByte(send_crc); +} + uint8_t USART::writeBlock(uint8_t* ptr, uint8_t len) volatile { writeByte(len); diff --git a/firmware/usart.h b/firmware/usart.h index e490c89..1cca1e4 100644 --- a/firmware/usart.h +++ b/firmware/usart.h @@ -29,13 +29,14 @@ public: void initRX(void) volatile; void initTX(void) volatile; void handleRX(void) volatile; - void handleTX(void) volatile; + void handleTX(void) volatile; void flush(void) volatile; // Sendefunktionen void writeByte(uint8_t) volatile; void writeInt(uint16_t) volatile; void writeStr(const char*, uint8_t) volatile; + void writeCRC(void) volatile; // Empfangsfunktionen uint8_t readByte(void) volatile; @@ -52,24 +53,26 @@ public: // constants - constexpr static uint8_t MSG_OK = 0xFF; - constexpr static uint8_t MSG_FAIL = 0xFE; + constexpr static uint8_t MSG_OK = 0xFF; + constexpr static uint8_t MSG_FAIL = 0xFE; constexpr static uint32_t BAUDRATE = 115200; // 38400 constexpr static uint8_t CRC7_POLY = 0x91; constexpr static uint8_t MAX_BLOCK_SIZE = 64; constexpr static uint8_t BLOCK_END = 0x80; + constexpr static uint16_t US_PER_BIT = 1000000 / BAUDRATE; private: uint8_t block_buffer[MAX_BLOCK_SIZE + 3]; // don't store BLOCK_END byte uint8_t crc; - BlockSequence seq = BlockSequence::IDLE; + volatile BlockSequence seq = BlockSequence::IDLE; volatile uint8_t receive_buffer[128]; volatile uint8_t receive_pos; volatile uint8_t send_buffer[128]; volatile uint8_t send_pos; volatile uint8_t send_len; + volatile uint8_t send_crc; volatile bool send_active; };