fancy tests

This commit is contained in:
Tristan Krause 2019-04-03 09:34:22 +02:00
parent de7143887d
commit 266d90df56
17 changed files with 594 additions and 349 deletions

View file

@ -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();

View file

@ -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

Binary file not shown.

View file

@ -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

Binary file not shown.

View file

@ -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();

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -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

View file

@ -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

View file

@ -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;

View file

@ -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)
{

View file

@ -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<int16_t>(usart.readInt());
int16_t delta = static_cast<int16_t>(usart.readInt());
int16_t count = static_cast<int16_t>(usart.readInt());
//usart.writeByte(USART::MSG_OK);
count *= delta;
dio1.writePortA(0xFF);

View file

@ -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);

View file

@ -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<<RXC0));
@ -39,14 +39,21 @@ void USART::initRX(void) volatile
void USART::initTX(void) volatile
{
while(send_active);
send_pos = 0;
send_crc = 0;
}
void USART::handleRX(void) volatile
{
receive_buffer[receive_pos++] = UDR0;
if(receive_pos == 1)
{
// starte WDT, da neue Request angekommen ist
wdt_enable(WDT_TIMEOUT);
wdt_reset();
}
if(receive_pos >= 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);

View file

@ -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;
};