make it volatile

This commit is contained in:
Tristan Krause 2019-04-03 08:40:14 +02:00
parent 4d2ea6013c
commit de7143887d
25 changed files with 368 additions and 377 deletions

View file

@ -136,13 +136,12 @@ std::vector<std::string> B15F::getBoardInfo(void)
while(n--) while(n--)
{ {
uint8_t len = usart.readByte(); uint8_t len = usart.readByte();
std::cout << (int) len << std::endl;
std::string str; std::string str;
while(len--) while(len--) {
str += static_cast<char>(usart.readByte()); str += static_cast<char>(usart.readByte());
}
std::cout << str << std::endl;
info.push_back(str); info.push_back(str);
} }
@ -215,7 +214,7 @@ uint16_t B15F::analogRead(uint8_t channel)
return usart.readInt(); return usart.readInt();
} }
bool B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count) void B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count)
{ {
buffer_a += offset_a; buffer_a += offset_a;
buffer_b += offset_b; buffer_b += offset_b;
@ -239,13 +238,15 @@ bool B15F::analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset
{ {
buffer_a[i] = usart.readInt(); buffer_a[i] = usart.readInt();
buffer_b[i] = usart.readInt(); buffer_b[i] = usart.readInt();
if(buffer_a[i] > 1023 || buffer_b[i] > 1023)
std::cout << PRE << "bad data detected" << std::endl;
} }
uint8_t aw = usart.readByte(); uint8_t aw = usart.readByte();
if(aw == MSG_OK) if(aw != MSG_OK)
return aw; throw DriverException("Sequenz unterbrochen");
throw DriverException("Sequenz unterbrochen"); delay_us(1);
} }
void B15F::delay_ms(uint16_t ms) void B15F::delay_ms(uint16_t ms)

View file

@ -162,7 +162,7 @@ public:
* \param count Anzahl an Inkrementierungen * \param count Anzahl an Inkrementierungen
* \throws DriverException * \throws DriverException
*/ */
bool analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count); void analogSequence(uint8_t channel_a, uint16_t* buffer_a, uint32_t offset_a, uint8_t channel_b, uint16_t* buffer_b, uint32_t offset_b, uint16_t start, int16_t delta, uint16_t count);
/*************************/ /*************************/

Binary file not shown.

View file

@ -132,7 +132,7 @@ private:
int file_desc = -1; // Linux Dateideskriptor int file_desc = -1; // Linux Dateideskriptor
uint32_t baudrate = 9600; uint32_t baudrate = 9600;
int TEST = 0; int TEST = 0;
uint8_t timeout = 10; // in Dezisekunden uint8_t timeout = 5; // in Dezisekunden
uint8_t block_buffer[MAX_BLOCK_SIZE + 3]; uint8_t block_buffer[MAX_BLOCK_SIZE + 3];
// debug statistics // debug statistics

View file

@ -2,35 +2,19 @@ set margin 10,10
unset key unset key
set grid set grid
set title '' set title ''
set xlabel 'U_{GS} [V]' set xlabel 'U_{DS} [V]'
set ylabel 'I_D [mA]' set ylabel 'I_D [mA]'
set xrange [5:0] set xrange [0:5]
set x2range [5:0]
set y2range [0:50]
set yrange [0:50] set yrange [0:50]
set label at 2,36 'U_{DS} [V] = 300' right set label at 4,3 'U_{GS} [V] = 460' left
set label at 2,33 'U_{DS} [V] = 325' right set label at 4,7 'U_{GS} [V] = 480' left
set label at 2,21 'U_{DS} [V] = 350' right set label at 3,13 'U_{GS} [V] = 500' left
set label at 2,38 'U_{DS} [V] = 375' right set label at 2,22 'U_{GS} [V] = 520' left
set label at 2,23 'U_{DS} [V] = 400' right set label at 1,32 'U_{GS} [V] = 540' left
set label at 2,23 'U_{DS} [V] = 425' right set label at 0,38 'U_{GS} [V] = 560' left
set label at 2,24 'U_{DS} [V] = 450' right set label at 0,38 'U_{GS} [V] = 580' left
set label at 2,24 'U_{DS} [V] = 475' right set label at 0,38 'U_{GS} [V] = 600' left
set label at 2,25 'U_{DS} [V] = 500' right
set label at 2,5 'U_{DS} [V] = 525' right
set label at 2,6 'U_{DS} [V] = 550' right
set label at 2,13 'U_{DS} [V] = 575' right
set label at 2,13 'U_{DS} [V] = 600' right
set label at 2,13 'U_{DS} [V] = 625' right
set label at 2,2 'U_{DS} [V] = 650' right
set label at 2,2 'U_{DS} [V] = 675' right
set label at 2,6 'U_{DS} [V] = 700' right
set label at 2,2 'U_{DS} [V] = 725' right
set label at 2,2 'U_{DS} [V] = 725' right
set y2tics
unset ytics
set ytics format ''
unset output unset output
set terminal qt set terminal qt
unset output unset output
plot "/tmp/tempfile1" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 300' w l,"/tmp/tempfile2" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 325' w l,"/tmp/tempfile3" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 350' w l,"/tmp/tempfile4" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 375' w l,"/tmp/tempfile5" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 400' w l,"/tmp/tempfile6" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 425' w l,"/tmp/tempfile7" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 450' w l,"/tmp/tempfile8" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 475' w l,"/tmp/tempfile9" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 500' w l,"/tmp/tempfile10" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 525' w l,"/tmp/tempfile11" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 550' w l,"/tmp/tempfile12" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 575' w l,"/tmp/tempfile13" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 600' w l,"/tmp/tempfile14" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 625' w l,"/tmp/tempfile15" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 650' w l,"/tmp/tempfile16" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 675' w l,"/tmp/tempfile17" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 700' w l,"/tmp/tempfile18" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 725' w l,"/tmp/tempfile19" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{DS} [V] = 750' w l plot "/tmp/tempfile0" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 440' w l,"/tmp/tempfile1" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 460' w l,"/tmp/tempfile2" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 480' w l,"/tmp/tempfile3" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 500' w l,"/tmp/tempfile4" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 520' w l,"/tmp/tempfile5" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 540' w l,"/tmp/tempfile6" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 560' w l,"/tmp/tempfile7" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 580' w l,"/tmp/tempfile8" using ($1*0.004888):($2*0.048876) binary format="%int16%int16" endian=big title 'U_{GS} [V] = 600' w l

Binary file not shown.

View file

@ -13,8 +13,8 @@ void kennlinieErsterQuadrant()
uint16_t ba[1024]; uint16_t ba[1024];
uint16_t bb[1024]; uint16_t bb[1024];
const uint16_t sample_count = 100; const uint16_t sample_count = 1024;
const uint16_t delta = 10; const uint16_t delta = 1;
const uint16_t u_gs_start = 440; const uint16_t u_gs_start = 440;
const uint16_t u_gs_delta = 20; const uint16_t u_gs_delta = 20;
@ -37,11 +37,11 @@ void kennlinieErsterQuadrant()
drv.analogWrite1(u_gs); drv.analogWrite1(u_gs);
drv.analogSequence(0, &ba[0], 0, 1, &bb[0], 0, 0, delta, sample_count); drv.analogSequence(0, &ba[0], 0, 1, &bb[0], 0, 0, delta, sample_count);
drv.delay_ms(10); //drv.delay_ms(10);
drv.discard(); //drv.discard();
drv.delay_ms(10); //drv.delay_ms(10);
for(uint16_t k = 0; k < sample_count+1; k++) for(uint16_t k = 0; k < sample_count; k++)
{ {
uint16_t i_d = ba[k] - bb[k]; uint16_t i_d = ba[k] - bb[k];
uint16_t u_ds = bb[k]; uint16_t u_ds = bb[k];
@ -64,7 +64,7 @@ void kennlinieZweiterQuadrant()
uint16_t ba[1024]; uint16_t ba[1024];
uint16_t bb[1024]; uint16_t bb[1024];
const uint16_t sample_count = 1000; const uint16_t sample_count = 1024;
const uint16_t delta = 1; const uint16_t delta = 1;
const uint16_t u_gs_start = 300; const uint16_t u_gs_start = 300;
@ -91,9 +91,9 @@ void kennlinieZweiterQuadrant()
drv.analogSequence(0, &ba[0], 0, 1, &bb[0], 0, 0, delta, sample_count); drv.analogSequence(0, &ba[0], 0, 1, &bb[0], 0, 0, delta, sample_count);
curve = 0; curve = 0;
for(uint16_t k = 0; k < sample_count + 1; k++) for(uint16_t k = 0; k < sample_count; k++)
{ {
if(ba[k] > bb[k] && bb[k] % 50 == 0 && bb[k] > 0) if(ba[k] > bb[k] && bb[k] % 50 == 0 && bb[k] != 0)
{ {
uint16_t i_d = ba[k] - bb[k]; uint16_t i_d = ba[k] - bb[k];
pf.addDot(Dot(u_gs, i_d, bb[k] / 50)); pf.addDot(Dot(u_gs, i_d, bb[k] / 50));
@ -143,7 +143,8 @@ void testFunktionen()
int main() int main()
{ {
testFunktionen(); kennlinieZweiterQuadrant();
kennlinieErsterQuadrant();
std::cout << "Schluss." << std::endl; std::cout << "Schluss." << std::endl;
} }

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -3,36 +3,36 @@
:100020000C9489000C9489000C9489000C9489002C :100020000C9489000C9489000C9489000C9489002C
:100030000C9489000C9489000C9489000C9489001C :100030000C9489000C9489000C9489000C9489001C
:100040000C9489000C9489000C9489000C9489000C :100040000C9489000C9489000C9489000C9489000C
:100050000C9484080C9489000C94AE080C948900CC :100050000C949B080C9489000C94C5080C9489009E
:100060000C9489000C9489000C9489000C948900EC :100060000C9489000C9489000C9489000C948900EC
:100070000C9489000C9489000C9489000C948900DC :100070000C9489000C9489000C9489000C948900DC
:100080000C9489000C9489000C948900FD000001F7 :100080000C9489000C9489000C948900FD000001F7
:100090000301E900060109010C010F011201E7004B :100090000301E900060109010C010F011201E7004B
:1000A000FA00150142093F093C091A0939093609C4 :1000A000FA001501590956095309310950094D093A
:1000B000330930092D0918092A094509480911246D :1000B0004A09470944092F0941095C095F091124CC
:1000C0001FBECFEFD0E4DEBFCDBF11E0A0E0B1E0B6 :1000C0001FBECFEFD0E4DEBFCDBF11E0A0E0B1E0B6
:1000D000E2E0F3E100E00BBF02C007900D92AE3208 :1000D000E0E3F3E100E00BBF02C007900D92AE3207
:1000E000B107D9F722E0AEE2B1E001C01D92AB3218 :1000E000B107D9F722E0AEE2B1E001C01D92AB3812
:1000F000B207E1F710E0CFE5D0E004C02197FE01A0 :1000F000B207E1F710E0CFE5D0E004C02197FE01A0
:100100000E947609CE35D107C9F70E94D8080C9411 :100100000E948D09CE35D107C9F70E94EF080C94E3
:100110007F090C9400008AE292E00E94190160E0DD :1001100096090C9400008AE892E00E94190160E0C0
:1001200087E292E00E945C016FEF87E292E00E941A :1001200087E892E00E945C016FEF87E892E00E940E
:100130007D0160E084E292E00E945C016FEF84E266 :100130007D0160E084E892E00E945C016FEF84E85A
:1001400092E00E947D016FEF81E292E00E947D01CA :1001400092E00E947D016FEF81E892E00E947D01C4
:100150008AE192E00E9454028FE291E00E944C03F7 :100150008AE792E00E9454028FE291E00E944C03F1
:100160008FE291E00E946C03789484B7877F84BF0C :100160008FE291E00E946C03789484B7877F84BF0C
:10017000109260000FB6F894A89580916000886195 :10017000109260000FB6F894A89580916000886195
:1001800080936000109260000FBE0895CF9398E0B6 :1001800080936000109260000FBE0895CF9398E0B6
:1001900088E10FB6F894A895809360000FBE909305 :1001900088E10FB6F894A895809360000FBE909305
:1001A0006000A8958FE291E00E94D504C82F682FC7 :1001A0006000A8958FE291E00E94E904C82F682FB3
:1001B00084E292E00E949E018C2F90E0FC01319736 :1001B00084E892E00E949E018C2F90E0FC01319730
:1001C000EC30F10530F4EA5BFF4F0C9476090E94A5 :1001C000EC30F10530F4EA5BFF4F0C948D090E948E
:1001D000E3078FE291E00E946C030FB6F894A895B4 :1001D000FA078FE291E00E946C030FB6F894A8959D
:1001E00080916000886180936000109260000FBE73 :1001E00080916000886180936000109260000FBE73
:1001F000CF9108950E94F907ECCF0E942A07E9CF1A :1001F000CF9108950E941008ECCF0E944107E9CFEB
:100200000E944307E6CF0E946A07E3CF0E947F0760 :100200000E945A07E6CF0E948107E3CF0E9496071B
:10021000E0CF0E949507DDCF0E94AB07DACF0E94A6 :10021000E0CF0E94AC07DDCF0E94C207DACF0E9478
:10022000BC07D7CF0E94CD07D4CF0E940F08D1CFF3 :10022000D307D7CF0E94E407D4CF0E942608D1CFAE
:10023000089584B1806B84B926988AB18C618AB99B :10023000089584B1806B84B926988AB18C618AB99B
:1002400080E58CBD81E08DBD8BB1837E8BB95A9AE0 :1002400080E58CBD81E08DBD8BB1837E8BB95A9AE0
:100250005B9A5C9A08958BB1837E8BB98BB160FDFC :100250005B9A5C9A08958BB1837E8BB98BB160FDFC
@ -42,268 +42,270 @@
:10029000892B8BB98BB162FFF0CF90E1892B8BB9A1 :10029000892B8BB98BB162FFF0CF90E1892B8BB9A1
:1002A00008956EBD0DB407FEFDCF8EB50895FC0117 :1002A00008956EBD0DB407FEFDCF8EB50895FC0117
:1002B00071836083428308951F93CF93DF93EC0192 :1002B00071836083428308951F93CF93DF93EC0192
:1002C000162F6A81888199810E942B0160E48881C0 :1002C000162F6A81888199810E942B0188819981EA
:1002D00099810E94510160E0888199810E945101B9 :1002D00060E40E9451018881998160E00E9451018F
:1002E000612F888199810E94510167E088819981FD :1002E00088819981612F0E9451018881998167E0FD
:1002F000DF91CF911F910C942B011F93CF93DF932C :1002F000DF91CF911F910C942B011F93CF93DF932C
:10030000EC01162F6A81888199810E942B0160E49B :10030000EC01162F6A81888199810E942B018881D6
:10031000888199810E94510161E0888199810E94C0 :10031000998160E40E9451018881998161E00E9485
:100320005101612F888199810E94510167E0888184 :10032000510188819981612F0E94510188819981B1
:100330009981DF91CF911F910C942B011F93CF9343 :1003300067E0DF91CF911F910C942B011F93CF9316
:10034000DF93EC01162F6A81888199810E942B012D :10034000DF93EC01162F6A81888199810E942B012D
:1003500060E4888199810E94510162E188819981DC :100350008881998160E40E9451018881998162E1DC
:100360000E945101612F888199810E94510167E0AB :100360000E94510188819981612F0E9451018881E9
:1003700088819981DF91CF911F910C942B011F935C :10037000998167E0DF91CF911F910C942B011F931E
:10038000CF93DF93EC01162F6A81888199810E94B7 :10038000CF93DF93EC01162F6A81888199810E94B7
:100390002B0160E4888199810E94510163E1888189 :100390002B018881998160E40E94510188819981B3
:1003A00099810E945101612F888199810E94510198 :1003A00063E10E94510188819981612F0E9451016E
:1003B00067E088819981DF91CF911F910C942B0187 :1003B0008881998167E0DF91CF911F910C942B0187
:1003C0001F93CF93DF93EC016A81888199810E940A :1003C0001F93CF93DF93EC016A81888199810E940A
:1003D0002B0161E4888199810E94510162E1888149 :1003D0002B018881998161E40E9451018881998172
:1003E00099810E94510160E0888199810E945101A8 :1003E00062E10E9451018881998160E00E9451017F
:1003F000182F67E0888199810E942B01812FDF915E :1003F000182F8881998167E00E942B01812FDF915E
:10040000CF911F9108951F93CF93DF93EC016A81E1 :10040000CF911F9108951F93CF93DF93EC016A81E1
:10041000888199810E942B0161E4888199810E94E1 :10041000888199810E942B018881998161E40E94E1
:10042000510163E1888199810E94510160E08881D6 :1004200051018881998163E10E94510188819981FC
:1004300099810E945101182F67E0888199810E945B :1004300060E00E945101182F8881998167E00E9435
:100440002B01812FDF91CF911F910895FC017183C2 :100440002B01812FDF91CF911F910895FC017183C2
:100450006083428308950F931F93CF93DF93EC0142 :100450006083428308950F931F93CF93DF93EC0142
:100460008B016A81888199810E942B01B801002447 :100460008B016A81888199810E942B018881998101
:10047000660F771F001C660F771F001C672F702DFB :10047000B8010024660F771F001C660F771F001C51
:10048000888199810E945101602F660F660F8881D3 :10048000672F702D0E94510188819981602F660F1E
:1004900099810E94510167E088819981DF91CF9114 :10049000660F0E9451018881998167E0DF91CF91B9
:1004A0001F910F910C942B0110927C0087E8809390 :1004A0001F910F910C942B0110927C0087E8809390
:1004B0007A00089580917C00807E682B60937C0098 :1004B0007A00089580917C00807E682B60937C0098
:1004C00080917A00806480937A0083EA91E00197BA :1004C00080917A00806480937A0083EA91E00197BA
:1004D000F1F700C0000080917A0086FDFCCF80918A :1004D000F1F700C0000080917A0086FDFCCF80918A
:1004E00078009091790008950F931F93CF93DF9335 :1004E00078009091790008950F931F93CF93DF9335
:1004F00061E087E292E00E949E01C1E0D0E001E06D :1004F00061E087E892E00E949E01C1E0D0E001E067
:1005000010E02FEF84E39CE0215080409040E1F721 :1005000010E02FEF84E39CE0215080409040E1F721
:1005100000C00000B8010C2E01C0660F0A94EAF773 :1005100000C00000B8010C2E01C0660F0A94EAF773
:1005200087E292E00E949E012196C930D10549F7E9 :1005200087E892E00E949E012196C930D10549F7E3
:10053000DF91CF911F910F9108950F931F93CF9348 :10053000DF91CF911F910F9108950F931F93CF9348
:10054000DF9361E084E292E00E949E01C1E0D0E08E :10054000DF9361E084E892E00E949E01C1E0D0E088
:1005500001E010E02FEF84E39CE0215080409040C8 :1005500001E010E02FEF84E39CE0215080409040C8
:10056000E1F700C00000B8010C2E01C0660F0A942C :10056000E1F700C00000B8010C2E01C0660F0A942C
:10057000EAF784E292E00E949E012196C930D105FB :10057000EAF784E892E00E949E012196C930D105F5
:1005800049F7DF91CF911F910F910895CF93DF939A :1005800049F7DF91CF911F910F910895CF93DF939A
:10059000C0E0D0E0BE018EE192E00E942B0287E82D :10059000C0E0D0E0BE018EE792E00E942B0287E827
:1005A00093E10197F1F700C000002196C11594E096 :1005A00093E10197F1F700C000002196C11594E096
:1005B000D90781F72FE78AE196E0215080409040EB :1005B000D90781F72FE78AE196E0215080409040EB
:1005C000E1F700C0000060E070E08EE192E0DF91B2 :1005C000E1F700C0000060E070E08EE792E0DF91AC
:1005D000CF910C942B02CF93DF93C0E0D0E0BE010B :1005D000CF910C942B02CF93DF93C0E0D0E0BE010B
:1005E0008BE192E00E942B0287E893E10197F1F7FB :1005E0008BE792E00E942B0287E893E10197F1F7F5
:1005F00000C000002196C11594E0D90781F72FE7CC :1005F00000C000002196C11594E0D90781F72FE7CC
:100600008AE196E0215080409040E1F700C0000070 :100600008AE196E0215080409040E1F700C0000070
:1006100060E070E08BE192E0DF91CF910C942B02CF :1006100060E070E08BE792E0DF91CF910C942B02C9
:100620000FB6F894A895809160008861809360006F :100620000FB6F894A895809160008861809360006F
:10063000109260000FBE60E08AE192E00E945A02D0 :10063000109260000FBE60E08AE792E00E945A02CA
:10064000BC018EE192E00E942B0261E08AE192E01F :10064000BC018EE792E00E942B0261E08AE792E013
:100650000E945A02BC018BE192E00E942B0287E2C9 :100650000E945A02BC018BE792E00E942B0287E8BD
:1006600092E00E940302682F87E292E00E949E01BE :1006600092E00E940302682F87E892E00E949E01B8
:1006700081E292E00E940302682F84E292E00E94ED :1006700081E892E00E940302682F84E892E00E94E1
:100680009E01D9CF0E9474020E949D020E94C60260 :100680009E01D9CF0E9474020E949D020E94C60260
:100690000E94EB020E94100322E02093C00028ED8C :100690000E94EB020E94100322E02093C00028ED8C
:1006A0002093C10026E02093C2001092C50024E1EF :1006A0002093C10026E02093C2001092C50024E1EF
:1006B0002093C40086519F4FFC01108208958091C1 :1006B0002093C400865B9E4FFC01108208958091B8
:1006C000C6008FE792E00197F1F700C0000080912B :1006C000C6008FE792E00197F1F700C0000080912B
:1006D000C00087FDF4CF089589519F4FFC0110821F :1006D000C00087FDF4CF089589539F4FFC0110821D
:1006E00008959C01FC01E651FF4F90819111FDCFCF :1006E00008959C01FC01E65BFE4F90819111FDCFC6
:1006F000F901E851FF4F10820895DC01A951BF4F65 :1006F000F901E85BFE4F10820895DC01A953BF4F5A
:100700002C9131E0320F3C933091C600FC01E20F96 :100700002C9131E0320F3C933091C600FC01E20F96
:10071000F11DE953FF4F30832C91FC01E953FF4F4A :10071000F11DE95BFF4F30832C91FC01E95BFF4F3A
:10072000E081F0E0E050FF4F8081281720F01C921C :10072000E081F0E0E050FF4F8081281720F01C921C
:1007300081E080932E0108950F931F93CF93DF9351 :1007300081E080932E0108950F931F93CF93DF9351
:10074000EC018C0108511F4FF801608187E292E0B3 :10074000EC018C01085B1E4FF801608187E892E0A4
:100750000E949E01F801908131968081981740F0A7 :100750000E949E01F801908131968081981740F0A7
:10076000C651DF4F1882DF91CF911F910F910895ED :10076000C65BDE4F1882DF91CF911F910F910895E4
:100770008091C00085FFFCCFF801808191E0980F47 :100770008091C00085FFFCCFF801808191E0980F47
:100780009083C80FD11D89818093C600DF91CF91DE :100780009083C80FD11DC853DF4F88818093C60066
:100790001F910F910895CF92DF92EF92FF920F93E6 :10079000DF91CF911F910F910895CF92DF92EF9249
:1007A0001F93CF93DF93EC01C851DF4F28812111B4 :1007A000FF920F931F93CF93DF93EC01C85BDE4F53
:1007B00009C0DF91CF911F910F91FF90EF90DF90D3 :1007B0002881211109C0DF91CF911F910F91FF90E6
:1007C000CF9008958C018881780199EEE90EF11C93 :1007C000EF90DF90CF9008958C018881780197EBAE
:1007D000F701808318826801FAEECF0ED11C81E008 :1007D000E91A9EEFF90AF701808318826801F6EBA7
:1007E000F6018083688187E292E00E949E019881F1 :1007E000CF1AFEEFDF0A81E0F6018083688187E897
:1007F000F7018081981778F49091C00095FFFCCFA5 :1007F00092E00E949E019881F7018081981788F409
:10080000888191E0980F9883E801C80FD11D8981F4 :100800009091C00095FFFCCF888191E0980F98836C
:100810008093C600CECFF6011082CBCFFC01E85109 :10081000E801C80FD11DC853DF4F88818093C600FF
:10082000FF4F208131E0320F3083FC01E20FF11DD8 :10082000CACFF6011082C7CFFC01E85BFE4F2081E2
:1008300061830895FC01E851FF4F208131E0320FC0 :1008300031E0320F3083820F911DFC01E853FF4FEE
:100840003083DC01A20FB11D11966C93208131E041 :1008400060830895FC01E85BFE4F208131E0320FA8
:10085000320F3083FC01E20FF11D718308950F9375 :100850003083DC01A20FB11DA853BF4F6C932081E0
:100860001F93CF93DF938C01FC01E851FF4F8081F0 :1008600031E0320F3083820F911DFC01E853FF4FBE
:1008700091E0980F9083D801A80FB11D11964C9369 :10087000708308950F931F93CF93DF938C01DC0156
:100880009FEF940F442361F0DB013D91208141E013 :10088000A85BBE4F8C9191E0980F9C93F801E80F04
:10089000420F4083E801C20FD11D39839150A8F760 :10089000F11DE853FF4F40839FEF940F442371F005
:1008A000DF91CF911F910F910895EF92FF920F93D7 :1008A000EB0139912C9141E0420F4C93F801E20F9A
:1008B0001F93CF93DF937C01EC01C851DF4F8881F8 :1008B000F11DE853FF4F3083915098F7DF91CF91AE
:1008C00091E0980F9883F701E80FF11D41835FEFE6 :1008C0001F910F910895EF92FF920F931F93CF9373
:1008D000540F442309F467C0FB0120E041E9BF0144 :1008D000DF937C01EC01C85BDE4F888191E0980FCB
:1008E0003191888191E0980F98838701080F111D3D :1008E0009883F701E80FF11DE853FF4F40835FEF56
:1008F000D80111963C93DB018C912827822F842705 :1008F000540F442309F46BC0FB0120E041E9BF0120
:1009000020FD282F30E035952795842F822720FD64 :100900003191888191E0980F98838701080F111D1C
:10091000282F30E035952795842F822720FD282F1A :10091000C80188539F4FDC013C93DB018C91282751
:1009200030E035952795842F822720FD282F30E051 :10092000822F842720FD282F30E035952795842FAE
:1009300035952795842F822720FD282F30E0359587 :10093000822720FD282F30E035952795842F8227A8
:100940002795942F922720FD292F30E03595279564 :1009400020FD282F30E035952795842F822720FD24
:10095000942F922720FD292F30E035952795842F5D :10095000282F30E035952795842F822720FD282FDA
:10096000822720FD282F2695515008F0B8CF888186 :1009600030E035952795942F922720FD292F30E0F0
:1009700091E0980F9883F701E80FF11D2183F701AB :1009700035952795942F922720FD292F30E0359526
:10098000E951FF4F808191E0980F9083D701A80F24 :100980002795842F822720FD282F2695515008F087
:10099000B11DA953BF4F8C91DF91CF911F910F9142 :10099000B6CF888191E0980F9883F701E80FF11D99
:1009A000FF90EF90089520E0E2CFFC01E951FF4F66 :1009A000E853FF4F2083F701E953FF4F808191E027
:1009B000208131E0320F3083820F911DFC01E95319 :1009B000980F9083D701A80FB11DA95BBF4F8C91F1
:1009C000FF4F80810895FC01E951FF4F208131E004 :1009C000DF91CF911F910F91FF90EF90089520E05C
:1009D000320F3083DC01A20FB11DA953BF4F2C9100 :1009D000E0CFFC01E953FF4F208131E0320F30833B
:1009E000308141E0430F4083830F911DFC01E953A7 :1009E000820F911DFC01E95BFF4F80810895FC019E
:1009F000FF4F3081822F90E0932B0895CF93DF93A8 :1009F000E953FF4F208131E0320F3083DC01A20F39
:100A0000DC01EC01CB53DF4F888199818230910565 :100A0000B11DA95BBF4F2C91308141E0430F408362
:100A100009F467C0B0F4009709F440C0019759F495 :100A1000830F911DFC01E95BFF4F3081822F90E035
:100A20008C91FD01E80FF11DEF57FF4F608382E0CD :100A2000932B0895CF93DF93DC01EC01CB5BDF4F79
:100A300090E0998388838C918F5F8C93DF91CF9125 :100A3000888199818230910509F469C0A0F40097FA
:100A400008958330910509F4D3C00497A1F78091EC :100A400009F440C0019749F48C91FD01E80FF11DB4
:100A5000C6008FE792E00197F1F700C00000809197 :100A5000618382E090E0998388838C918F5F8C938F
:100A6000C00087FDF4CFFD01EC53FF4F8081882348 :100A6000DF91CF9108958330910509F4D6C00497A2
:100A700009F435C19EEFFD01E851FF4F808121E06F :100A7000A1F78091C6008FE792E00197F1F700C0DF
:100A8000280F2083FD01E80FF11D91831982188240 :100A800000008091C00087FDF4CFFD01EC5BFF4FBB
:100A90008C918F5F8C93DF91CF910895613408F42E :100A90008081882309F436C19EEFFD01E85BFE4F9B
:100AA00020C18091C6008FE792E00197F1F700C066 :100AA000808121E0280F2083FD01E80FF11DE8532C
:100AB00000008091C00087FDF4CFFD01E851FF4F99 :100AB000FF4F9083198218828C918F5F8C93DF9106
:100AC000808191E0980F9083FD01E80FF11D8EEF7A :100AC000CF910895613408F41FC18091C6008FE76B
:100AD0008183198218828C918F5F8C93DF91CF91E3 :100AD00092E00197F1F700C000008091C00087FD0F
:100AE00008958C91FD01E80FF11DEF57FF4F6083D2 :100AE000F4CFFD01E85BFE4F808191E0980F908389
:100AF000FD01EC53FF4F808168276083808180FF78 :100AF000FD01E80FF11DE853FF4F8EEF808319824F
:100B000004C0908181E989278083808190E0959558 :100B000018828C918F5F8C93DF91CF9108958C9197
:100B100087958083808180FF04C0908181E9892747 :100B1000FD01E80FF11D6183FD01EC5BFF4F80815A
:100B20008083808190E0959587958083808180FF88 :100B200068276083808180FF04C0908181E98927E4
:100B300004C0908181E989278083808190E0959528 :100B30008083808190E0959587958083808180FF78
:100B400087958083808180FF04C0908181E9892717 :100B400004C0908181E989278083808190E0959518
:100B50008083808190E0959587958083808180FF58 :100B500087958083808180FF04C0908181E9892707
:100B600004C0908181E989278083808190E09595F8 :100B60008083808190E0959587958083808180FF48
:100B700087958083808180FF04C0908181E98927E7 :100B700004C0908181E989278083808190E09595E8
:100B80008083808190E0959587958083808180FF28 :100B800087958083808180FF04C0908181E98927D7
:100B900004C0908181E989278083808190E09595C8 :100B90008083808190E0959587958083808180FF18
:100BA00087958083808180FF04C0908181E98927B7 :100BA00004C0908181E989278083808190E09595B8
:100BB0008083808190E09595879580839C91FD014D :100BB00087958083808180FF04C0908181E98927A7
:100BC000EF57FF4F8081981709F498C09C9180815E :100BC0008083808190E0959587958083808180FFE8
:100BD000981708F430CF8091C6008FE792E0019714 :100BD00004C0908181E989278083808190E0959588
:100BE000F1F700C000008091C00087FDF4CF65CF11 :100BE000879580839C9111968C911197981709F4A1
:100BF0008C91FD01E80FF11DEF57FF4F6083FD0160 :100BF00098C09C9111968C911197981708F42DCF5D
:100C0000EC53FF4F808168276083808180FF04C0A0 :100C00008091C6008FE792E00197F1F700C00000E5
:100C1000908181E989278083808190E095958795EF :100C10008091C00087FDF4CF64CF8C91FD01E80F77
:100C20008083808180FF04C0908181E9892780834F :100C2000F11D6183FD01EC5BFF4F808168276083CC
:100C3000808190E0959587958083808180FF04C0B6 :100C3000808180FF04C0908181E989278083808141
:100C4000908181E989278083808190E095958795BF :100C400090E0959587958083808180FF04C0908196
:100C50008083808180FF04C0908181E9892780831F :100C500081E989278083808190E0959587958083BD
:100C6000808190E0959587958083808180FF04C086 :100C6000808180FF04C0908181E989278083808111
:100C7000908181E989278083808190E0959587958F :100C700090E0959587958083808180FF04C0908166
:100C80008083808180FF04C0908181E989278083EF :100C800081E989278083808190E09595879580838D
:100C9000808190E0959587958083808180FF04C056 :100C9000808180FF04C0908181E9892780838081E1
:100CA000908181E989278083808190E0959587955F :100CA00090E0959587958083808180FF04C0908136
:100CB0008083808180FF04C0908181E989278083BF :100CB00081E989278083808190E09595879580835D
:100CC000808190E095958795808384E090E099837A :100CC000808180FF04C0908181E9892780838081B1
:100CD00088838C918F5F8C93DF91CF9108959FEFE4 :100CD00090E0959587958083808180FF04C0908106
:100CE000CACEFD01EF57FF4F6083ED5BFF4F1082CF :100CE00081E989278083808190E09595879580832D
:100CF0001C9281E090E0998388839DCE83E090E010 :100CF00084E090E0998388838C918F5F8C93DF915F
:100D00009983888398CECF92DF92FF920F931F939F :100D0000CF9108959FEFC9CE11966C931197FD0175
:100D1000CF93DF93FC01E951FF4F9C0128513F4FD6 :100D1000EC5BFF4F10821C9281E090E09983888306
:100D20006901D1E9640F711DAEEFFA2E208131E027 :100D20009CCE83E090E09983888397CECF92DF9228
:100D3000320F3083AC01420F511D9A0129533F4FAE :100D3000FF920F931F93CF93DF93FC01E953FF4F73
:100D4000D9011C91103809F473C0113408F010E077 :100D40009C01285B3E4F6901D1E9640F711DAEEF34
:100D5000C0E020E0308141E0430F4083AC01430F0D :100D5000FA2E208131E0320F3083AC01420F511D59
:100D6000511DDA01A953BF4F0C91202720FD2D27DB :100D60009A01295B3F4FD9011C91103809F475C0D5
:100D700030E035952795422F20FF02C04D2F4227A6 :100D7000113408F010E0C0E020E0308141E0430F82
:100D8000242F30E035952795422F20FF02C04D2FAC :100D80004083AC01430F511DDA01A95BBF4F0C91A9
:100D9000422750E055954795242F40FF02C02D2F44 :100D9000202720FD2D2730E035952795422F20FF75
:100DA000242730E035952795422F20FF02C04D2F94 :100DA00002C04D2F4227242F30E035952795422F42
:100DB000422750E055954795242F40FF02C02D2F24 :100DB00020FF02C04D2F422750E055954795242F24
:100DC000242730E035952795422F20FF02C04D2F74 :100DC00040FF02C02D2F242730E035952795422F74
:100DD000422750E055954795242F40FF02C02D2F04 :100DD00020FF02C04D2F422750E055954795242F04
:100DE00024272695C11780F1CF5F1C1708F0B2CFDA :100DE00040FF02C02D2F242730E035952795422F54
:100DF0003091C600AFE7B2E01197F1F700C00000F4 :100DF00020FF02C04D2F422750E055954795242FE4
:100E00003091C00037FDF4CF211112C0F6012081CE :100E000040FF02C02D2F24272695C117A0F1CF5FE8
:100E100031E0320F3083FC01E20FF11D2FEF21830F :100E10001C1708F0B2CF3091C600AFE7B2E01197CF
:100E2000DF91CF911F910F91FF90DF90CF900895A8 :100E2000F1F700C000003091C00037FDF4CF211170
:100E3000D6012C9131E0320F3C93AC01420F511D91 :100E300014C0F601208131E0320F3083820F911D02
:100E4000DA011196FC9272CFAB014C0F511DDA0101 :100E4000FC01E853FF4F8FEF8083DF91CF911F911B
:100E50000C93CACFCF938FE291E00E9471038FE28F :100E50000F91FF90DF90CF900895D6012C9131E053
:100E600091E00E94D504C82F6FEF8FE291E00E94BD :100E6000320F3C93AC01420F511D9A0128533F4F62
:100E70000E046C2F8FE291E00E940E048FE291E04D :100E7000D901FC926ECFAB014C0F511DDA010C93DE
:100E8000CF910C94CB038FE291E00E94710363E059 :100E8000C6CFCF938FE291E00E9471038FE291E091
:100E90008FE291E00E940E044CE062E271E08FE28A :100E90000E94E904C82F6FEF8FE291E00E941404D2
:100EA00091E00E942F0449E069E171E08FE291E056 :100EA0006C2F8FE291E00E9414048FE291E0CF91C9
:100EB0000E942F044CE06DE071E08FE291E00E940F :100EB0000C94CD038FE291E00E94710363E08FE216
:100EC0002F046FEF8FE291E00E940E048FE291E019 :100EC00091E00E9414044CE062E271E08FE291E054
:100ED0000C94CB038FE291E00E9471038FE291E0CA :100ED0000E943A0449E069E171E08FE291E00E94EA
:100EE0000E94E304BC01660F771F680F791F8FE231 :100EE0003A044CE06DE071E08FE291E00E943A0438
:100EF00091E00E941A048FE291E00C94CB038FE200 :100EF0006FEF8FE291E00E9414048FE291E00C9476
:100F000091E00E9471038FE291E00E94D504682F66 :100F0000CD038FE291E00E9471038FE291E00E9495
:100F100087E292E00E949E016FEF8FE291E00E94D3 :100F1000F704BC01660F771F680F791F8FE291E01D
:100F20000E048FE291E00C94CB038FE291E00E94DB :100F20000E9422048FE291E00C94CD038FE291E0C5
:100F300071038FE291E00E94D504682F84E292E071 :100F30000E9471038FE291E00E94E904682F87E824
:100F40000E949E016FEF8FE291E00E940E048FE2FB :100F400092E00E949E016FEF8FE291E00E941404F4
:100F500091E00C94CB038FE291E00E94710387E251 :100F50008FE291E00C94CD038FE291E00E94710347
:100F600092E00E940302682F8FE291E00E940E043B :100F60008FE291E00E94E904682F84E892E00E94F9
:100F70008FE291E00C94CB038FE291E00E94710329 :100F70009E016FEF8FE291E00E9414048FE291E0F6
:100F800084E292E00E940302682F8FE291E00E94C7 :100F80000C94CD038FE291E00E94710387E892E018
:100F90000E048FE291E00C94CB038FE291E00E946B :100F90000E940302682F8FE291E00E9414048FE206
:100FA00071038FE291E00E94E304BC018EE192E0C4 :100FA00091E00C94CD038FE291E00E94710384E8FC
:100FB0000E942B026FEF8FE291E00E940E048FE2FD :100FB00092E00E940302682F8FE291E00E941404E5
:100FC00091E00C94CB038FE291E00E9471038FE2D9 :100FC0008FE291E00C94CD038FE291E00E947103D7
:100FD00091E00E94E304BC018BE192E00E942B02AD :100FD0008FE291E00E94F704BC018EE792E00E944C
:100FE0006FEF8FE291E00E940E048FE291E00C948B :100FE0002B026FEF8FE291E00E9414048FE291E0F8
:100FF000CB038FE291E00E9471038FE291E00E94A7 :100FF0000C94CD038FE291E00E9471038FE291E0A7
:10100000D504682F8AE192E00E945A02BC018FE267 :101000000E94F704BC018BE792E00E942B026FEF75
:1010100091E00E941A048FE291E00C94CB038F922E :101010008FE291E00E9414048FE291E00C94CD03E2
:101020009F92AF92BF92CF92DF92EF92FF920F9377 :101020008FE291E00E9471038FE291E00E94E90457
:101030001F93CF93DF938FE291E00E94D504882E17 :10103000682F8AE792E00E945A02BC018FE291E099
:101040008FE291E00E94D504982E8FE291E00E94F9 :101040000E9422048FE291E00C94CD038F929F9234
:10105000E304EC018FE291E00E94E3045C018FE283 :10105000AF92BF92CF92DF92EF92FF920F931F93C6
:1010600091E00E94E304A89E6001A99ED00CB89E66 :10106000CF93DF938FE291E00E94E904882E8FE214
:10107000D00C11246FEF84E292E00E949E01CC1507 :1010700091E00E94E904982E8FE291E00E94F7042B
:10108000DD054CF5BE018EE192E00E942B02A89591 :10108000EC018FE291E00E94F7045C018FE291E0B5
:10109000682D8AE192E00E945A027C01692D8AE162 :101090000E94F704A89E6001A99ED00CB89ED00CB7
:1010A00092E00E945A028C018FE291E00E9471034B :1010A00011246FEF84E892E00E949E01CC15DD05CB
:1010B000B7018FE291E00E941A04B8018FE291E03B :1010B0004CF5BE018EE792E00E942B02A895682DA8
:1010C0000E941A048FE291E00E94CB03CA0DDB1D3F :1010C0008AE792E00E945A027C01692D8AE792E049
:1010D000CC15DD05BCF28FE291E00E9471036FEF49 :1010D0000E945A028C018FE291E00E947103B701D5
:1010E0008FE291E00E940E048FE291E0DF91CF91B8 :1010E0008FE291E00E942204B8018FE291E00E9419
:1010F0001F910F91FF90EF90DF90CF90BF90AF9036 :1010F00022048FE291E00E94CD03CA0DDB1DCC15C6
:101100009F908F900C94CB031F920F920FB60F926B :10110000DD05BCF28FE291E00E9471036FEF8FE288
:1011100011240BB60F922F933F934F935F936F93CE :1011100091E00E9414048FE291E0DF91CF911F9142
:101120007F938F939F93AF93BF93EF93FF938FE240 :101120000F91FF90EF90DF90CF90BF90AF909F9086
:1011300091E00E947D03FF91EF91BF91AF919F914C :101130008F900C94CD031F920F920FB60F92112433
:101140008F917F916F915F914F913F912F910F9070 :101140000BB60F922F933F934F935F936F937F93C1
:101150000BBE0F900FBE0F901F9018951F920F920D :101150008F939F93AF93BF93EF93FF938FE291E0B1
:101160000FB60F9211240BB60F922F933F934F930C :101160000E947D03FF91EF91BF91AF919F918F916D
:101170005F936F937F938F939F93AF93BF93EF93FF :101170007F916F915F914F913F912F910F900BBE97
:10118000FF938FE291E00E949C03FF91EF91BF914A :101180000F900FBE0F901F9018951F920F920FB6E1
:10119000AF919F918F917F916F915F914F913F910F :101190000F9211240BB60F922F933F934F935F93AF
:1011A0002F910F900BBE0F900FBE0F901F901895B0 :1011A0006F937F938F939F93AF93BF93EF93FF932F
:1011B0000E948B006FEF87E292E00E949E012FE772 :1011B0008FE291E00E949C03FF91EF91BF91AF916C
:1011C0008AE196E0215080409040E1F700C00000A5 :1011C0009F918F917F916F915F914F913F912F915F
:1011D00060E087E292E00E949E0118E1D8E004C03E :1011D0000F900BBE0F900FBE0F901F9018950E949E
:1011E00026E02A95F1F700C080912E018823C1F3F3 :1011E0008B006FEF87E892E00E949E012FE78AE173
:1011F00010922E010FB6F894A895109360000FBEC0 :1011F00096E0215080409040E1F700C0000060E0A0
:10120000D0936000A8958FE291E00E94D504C82F8A :1012000087E892E00E949E0118E1D8E004C026E041
:10121000682F84E292E00E949E018C2F90E0FC01F6 :101210002A95F1F700C080912E018823C1F3109226
:101220003197EC30F10530F4EE5AFF4F0C9476090B :101220002E010FB6F894A895109360000FBED093CE
:101230000E94E3078FE291E00E946C030FB6F894DE :101230006000A8958FE291E00E94E904C82F682F12
:10124000A895809160008861809360001092600092 :1012400084E892E00E949E018C2F90E0FC0131978F
:101250000FBEC6CF0E94F907EDCF0E94CD07EACF9F :10125000EC30F10530F4EE5AFF4F0C948D090E94EA
:101260000E94BC07E7CF0E94AB07E4CF0E9495071E :10126000FA078FE291E00E946C030FB6F894A895FC
:10127000E1CF0E947F07DECF0E946A07DBCF0E948A :1012700080916000886180936000109260000FBED2
:101280004307D8CF0E942A07D5CF0E940F08D2CF9C :10128000C6CF0E941008EDCF0E94E407EACF0E946B
:101290008AE292E00E94180142E06AE272E087E28C :10129000D307E7CF0E94C207E4CF0E94AC07E1CF9B
:1012A00092E00E94570143E06AE272E084E292E039 :1012A0000E949607DECF0E948107DBCF0E945A077B
:1012B0000E94570145E06AE272E081E292E00E94FA :1012B000D8CF0E944107D5CF0E942608D2CF8AE816
:1012C000570140E06AE272E08EE192E00E9426025D :1012C00092E00E94180142E06AE872E087E892E04A
:1012D00041E06AE272E08BE192E00E942602109205 :1012D0000E94570143E06AE872E084E892E00E94CD
:1012E0002F011092F5011092F4010895EE0FFF1FE7 :1012E000570145E06AE872E081E892E00E94570108
:1012F0000024001C0BBE0790F691E02D0994F89491 :1012F00040E06AE872E08EE792E00E94260241E058
:02130000FFCF1D :101300006AE872E08BE792E00E94260210922F01B9
:1013020001020103000202010103030209626F618B :1013100010927501109274010895EE0FFF1F0024C2
:101312007264696E666F2E680031353A35393A3338 :10132000001C0BBE0790F691E02D0994F894FFCFB6
:0E132200390041707220203220323031390003 :1013300001020103000202010103030209626F615D
:101340007264696E666F2E680030383A33393A3508
:0E1350003700417072202033203230313900D6
:00000001FF :00000001FF

View file

@ -1,6 +1,6 @@
#include "adu.h" #include "adu.h"
void ADU::init() void ADU::init() volatile
{ {
// externe Referenz an AREF // externe Referenz an AREF
ADMUX = 0; ADMUX = 0;
@ -9,7 +9,7 @@ void ADU::init()
ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);
} }
uint16_t ADU::getValue(uint8_t channel) uint16_t ADU::getValue(uint8_t channel) volatile
{ {
// lege Kanal fest // lege Kanal fest
ADMUX = (ADMUX & 0xE0) | channel; ADMUX = (ADMUX & 0xE0) | channel;

View file

@ -8,8 +8,8 @@
class ADU class ADU
{ {
public: public:
void init(void); void init(void) volatile;
uint16_t getValue(uint8_t); uint16_t getValue(uint8_t) volatile;
}; };
#endif // ADC_H #endif // ADC_H

View file

@ -1,11 +1,11 @@
#include "global_vars.h" #include "global_vars.h"
volatile SPI spi; volatile SPI spi;
volatile MCP23S17 beba0(*((SPI*) &spi), SPIADR::BEBA0); volatile MCP23S17 dio0(spi, SPIADR::BEBA0);
volatile MCP23S17 beba1(*((SPI*) &spi), SPIADR::BEBA1); volatile MCP23S17 dio1(spi, SPIADR::BEBA1);
volatile MCP23S17 sw(*((SPI*) &spi), SPIADR::SWITCH); volatile MCP23S17 dsw(spi, SPIADR::SWITCH);
volatile TLC5615 dac0(*((SPI*) &spi), SPIADR::AA0); volatile TLC5615 dac0(spi, SPIADR::AA0);
volatile TLC5615 dac1(*((SPI*) &spi), SPIADR::AA1); volatile TLC5615 dac1(spi, SPIADR::AA1);
volatile ADU adu; volatile ADU adu;
volatile USART usart; volatile USART usart;
volatile bool nextRequest = false; volatile bool nextRequest = false;

View file

@ -7,9 +7,9 @@
#include "usart.h" #include "usart.h"
extern volatile SPI spi; extern volatile SPI spi;
extern volatile MCP23S17 beba0; extern volatile MCP23S17 dio0;
extern volatile MCP23S17 beba1; extern volatile MCP23S17 dio1;
extern volatile MCP23S17 sw; extern volatile MCP23S17 dsw;
extern volatile TLC5615 dac0; extern volatile TLC5615 dac0;
extern volatile TLC5615 dac1; extern volatile TLC5615 dac1;
extern volatile ADU adu; extern volatile ADU adu;

View file

@ -11,15 +11,15 @@
void initAll() void initAll()
{ {
((SPI*) &spi)->init(); spi.init();
((MCP23S17*) &beba0)->setDirA(0x00); // alle Ausgang dio0.setDirA(0x00); // alle Ausgang
((MCP23S17*) &beba0)->setDirB(0xFF); // alle Eingang dio0.setDirB(0xFF); // alle Eingang
((MCP23S17*) &beba1)->setDirA(0x00); // alle Ausgang dio1.setDirA(0x00); // alle Ausgang
((MCP23S17*) &beba1)->setDirB(0xFF); // alle Eingang dio1.setDirB(0xFF); // alle Eingang
((MCP23S17*) &sw)->setDirB(0xFF); // alle Eingang dsw.setDirB(0xFF); // alle Eingang
((ADU*) &adu)->init(); adu.init();
usart.init(); usart.init();
usart.initRX(); usart.initRX();
@ -39,7 +39,7 @@ void handleRequest()
wdt_reset(); wdt_reset();
const uint8_t req = usart.readByte(); const uint8_t req = usart.readByte();
((MCP23S17*) &beba1)->writePortA(req); dio1.writePortA(req);
switch(req) switch(req)
{ {
@ -104,9 +104,9 @@ int main()
initAll(); initAll();
// Reset anzeigen // Reset anzeigen
((MCP23S17*) &beba0)->writePortA(0xFF); dio0.writePortA(0xFF);
_delay_ms(100); _delay_ms(100);
((MCP23S17*) &beba0)->writePortA(0x00); dio0.writePortA(0x00);
while(1) while(1)
{ {

View file

@ -1,10 +1,10 @@
#include "mcp23s17.h" #include "mcp23s17.h"
MCP23S17::MCP23S17(SPI& spi, uint8_t adr) : spi(spi), adr(adr) MCP23S17::MCP23S17(volatile SPI& spi, uint8_t adr) : spi(spi), adr(adr)
{ {
} }
void MCP23S17::setDirA(uint8_t dir) const void MCP23S17::setDirA(uint8_t dir) const volatile
{ {
spi.setAdr(adr); spi.setAdr(adr);
spi.pushByte(MCP23S17_OPCODE | MCP23S17_WRITE); spi.pushByte(MCP23S17_OPCODE | MCP23S17_WRITE);
@ -13,7 +13,7 @@ void MCP23S17::setDirA(uint8_t dir) const
spi.setAdr(SPIADR::NONE); spi.setAdr(SPIADR::NONE);
} }
void MCP23S17::setDirB(uint8_t dir) const void MCP23S17::setDirB(uint8_t dir) const volatile
{ {
spi.setAdr(adr); spi.setAdr(adr);
spi.pushByte(MCP23S17_OPCODE | MCP23S17_WRITE); spi.pushByte(MCP23S17_OPCODE | MCP23S17_WRITE);
@ -22,7 +22,7 @@ void MCP23S17::setDirB(uint8_t dir) const
spi.setAdr(SPIADR::NONE); spi.setAdr(SPIADR::NONE);
} }
void MCP23S17::writePortA(uint8_t port) const void MCP23S17::writePortA(uint8_t port) const volatile
{ {
spi.setAdr(adr); spi.setAdr(adr);
spi.pushByte(MCP23S17_OPCODE | MCP23S17_WRITE); spi.pushByte(MCP23S17_OPCODE | MCP23S17_WRITE);
@ -31,7 +31,7 @@ void MCP23S17::writePortA(uint8_t port) const
spi.setAdr(SPIADR::NONE); spi.setAdr(SPIADR::NONE);
} }
void MCP23S17::writePortB(uint8_t port) const void MCP23S17::writePortB(uint8_t port) const volatile
{ {
spi.setAdr(adr); spi.setAdr(adr);
spi.pushByte(MCP23S17_OPCODE | MCP23S17_WRITE); spi.pushByte(MCP23S17_OPCODE | MCP23S17_WRITE);
@ -40,7 +40,7 @@ void MCP23S17::writePortB(uint8_t port) const
spi.setAdr(SPIADR::NONE); spi.setAdr(SPIADR::NONE);
} }
uint8_t MCP23S17::readPortA(void) const uint8_t MCP23S17::readPortA(void) const volatile
{ {
spi.setAdr(adr); spi.setAdr(adr);
spi.pushByte(MCP23S17_OPCODE | MCP23S17_READ); spi.pushByte(MCP23S17_OPCODE | MCP23S17_READ);
@ -50,7 +50,7 @@ uint8_t MCP23S17::readPortA(void) const
return port; return port;
} }
uint8_t MCP23S17::readPortB(void) const uint8_t MCP23S17::readPortB(void) const volatile
{ {
spi.setAdr(adr); spi.setAdr(adr);
spi.pushByte(MCP23S17_OPCODE | MCP23S17_READ); spi.pushByte(MCP23S17_OPCODE | MCP23S17_READ);

View file

@ -3,28 +3,31 @@
#include "spi.h" #include "spi.h"
constexpr uint8_t MCP23S17_DIRA = 0x00;
constexpr uint8_t MCP23S17_DIRB = 0x01;
constexpr uint8_t MCP23S17_PORTA = 0x12;
constexpr uint8_t MCP23S17_PORTB = 0x13;
constexpr uint8_t MCP23S17_READ = 0x01;
constexpr uint8_t MCP23S17_WRITE = 0x00;
constexpr uint8_t MCP23S17_OPCODE = 0x40;
class MCP23S17 class MCP23S17
{ {
public: public:
MCP23S17(SPI&, uint8_t); MCP23S17(volatile SPI&, uint8_t);
void setDirA(uint8_t dir) const; void setDirA(uint8_t dir) const volatile;
void setDirB(uint8_t dir) const; void setDirB(uint8_t dir) const volatile;
void writePortA(uint8_t) const; void writePortA(uint8_t) const volatile;
void writePortB(uint8_t) const; void writePortB(uint8_t) const volatile;
uint8_t readPortA(void) const; uint8_t readPortA(void) const volatile;
uint8_t readPortB(void) const; uint8_t readPortB(void) const volatile;
private: private:
SPI& spi; volatile SPI& spi;
const uint8_t adr; const uint8_t adr;
// constants
constexpr static uint8_t MCP23S17_DIRA = 0x00;
constexpr static uint8_t MCP23S17_DIRB = 0x01;
constexpr static uint8_t MCP23S17_PORTA = 0x12;
constexpr static uint8_t MCP23S17_PORTB = 0x13;
constexpr static uint8_t MCP23S17_READ = 0x01;
constexpr static uint8_t MCP23S17_WRITE = 0x00;
constexpr static uint8_t MCP23S17_OPCODE = 0x40;
}; };
#endif // MCP23S17_H #endif // MCP23S17_H

View file

@ -32,7 +32,7 @@ void rqDigitalWrite0()
{ {
usart.initTX(); usart.initTX();
uint8_t port = usart.readByte(); uint8_t port = usart.readByte();
((MCP23S17*) &beba0)->writePortA(port); dio0.writePortA(port);
usart.writeByte(USART::MSG_OK); usart.writeByte(USART::MSG_OK);
usart.flush(); usart.flush();
@ -42,7 +42,7 @@ void rqDigitalWrite1()
{ {
usart.initTX(); usart.initTX();
uint8_t port = usart.readByte(); uint8_t port = usart.readByte();
((MCP23S17*) &beba1)->writePortA(port); dio1.writePortA(port);
usart.writeByte(USART::MSG_OK); usart.writeByte(USART::MSG_OK);
usart.flush(); usart.flush();
@ -51,7 +51,7 @@ void rqDigitalWrite1()
void rqDigitalRead0() void rqDigitalRead0()
{ {
usart.initTX(); usart.initTX();
uint8_t port = ((MCP23S17*) &beba0)->readPortB(); uint8_t port = dio0.readPortB();
usart.writeByte(port); usart.writeByte(port);
usart.flush(); usart.flush();
} }
@ -59,7 +59,7 @@ void rqDigitalRead0()
void rqDigitalRead1() void rqDigitalRead1()
{ {
usart.initTX(); usart.initTX();
uint8_t port = ((MCP23S17*) &beba1)->readPortB(); uint8_t port = dio1.readPortB();
usart.writeByte(port); usart.writeByte(port);
usart.flush(); usart.flush();
} }
@ -68,7 +68,7 @@ void rqAnalogWrite0()
{ {
usart.initTX(); usart.initTX();
uint16_t value = usart.readInt(); uint16_t value = usart.readInt();
((TLC5615*) &dac0)->setValue(value); dac0.setValue(value);
usart.writeByte(USART::MSG_OK); usart.writeByte(USART::MSG_OK);
usart.flush(); usart.flush();
@ -78,7 +78,7 @@ void rqAnalogWrite1()
{ {
usart.initTX(); usart.initTX();
uint16_t value = usart.readInt(); uint16_t value = usart.readInt();
((TLC5615*) &dac1)->setValue(value); dac1.setValue(value);
usart.writeByte(USART::MSG_OK); usart.writeByte(USART::MSG_OK);
usart.flush(); usart.flush();
@ -88,7 +88,7 @@ void rqAnalogRead()
{ {
usart.initTX(); usart.initTX();
uint8_t channel = usart.readByte(); uint8_t channel = usart.readByte();
uint16_t value = ((ADU*) &adu)->getValue(channel); uint16_t value = adu.getValue(channel);
usart.writeInt(value); usart.writeInt(value);
usart.flush(); usart.flush();
} }
@ -105,15 +105,15 @@ void rqAdcDacStroke()
//usart.writeByte(USART::MSG_OK); //usart.writeByte(USART::MSG_OK);
count *= delta; count *= delta;
((MCP23S17*) &beba1)->writePortA(0xFF); dio1.writePortA(0xFF);
for(int16_t i = start; i < count; i += delta) for(int16_t i = start; i < count; i += delta)
{ {
((TLC5615*) &dac0)->setValue(i); dac0.setValue(i);
wdt_reset(); wdt_reset();
uint16_t val_a = ((ADU*) &adu)->getValue(channel_a); uint16_t val_a = adu.getValue(channel_a);
uint16_t val_b = ((ADU*) &adu)->getValue(channel_b); uint16_t val_b = adu.getValue(channel_b);
usart.initTX(); usart.initTX();
usart.writeInt(val_a); usart.writeInt(val_a);
@ -127,8 +127,8 @@ void rqAdcDacStroke()
}; };
union doubleword dw; union doubleword dw;
dw.word[0] = ((ADU*) &adu)->getValue(channel_a); dw.word[0] = adu.getValue(channel_a);
dw.word[1] = ((ADU*) &adu)->getValue(channel_b); dw.word[1] = adu.getValue(channel_b);
uint8_t ret = 0; uint8_t ret = 0;
do do

View file

@ -13,7 +13,7 @@ void testBEBA0(void)
{ {
for(uint8_t i = 0; i < 9; i++) for(uint8_t i = 0; i < 9; i++)
{ {
((MCP23S17*) &beba0)->writePortA(_BV(i)); dio0.writePortA(_BV(i));
if(i < 8) if(i < 8)
_delay_ms(200); _delay_ms(200);
@ -24,7 +24,7 @@ void testBEBA1(void)
{ {
for(uint8_t i = 0; i < 9; i++) for(uint8_t i = 0; i < 9; i++)
{ {
((MCP23S17*) &beba1)->writePortA(_BV(i)); dio1.writePortA(_BV(i));
if(i < 8) if(i < 8)
_delay_ms(200); _delay_ms(200);
@ -35,22 +35,22 @@ void testDAC0(void)
{ {
for(uint16_t i = 0; i < 1024; i++) for(uint16_t i = 0; i < 1024; i++)
{ {
((TLC5615*) &dac0)->setValue(i); dac0.setValue(i);
_delay_ms(1); _delay_ms(1);
} }
_delay_ms(100); _delay_ms(100);
((TLC5615*) &dac0)->setValue(0); dac0.setValue(0);
} }
void testDAC1(void) void testDAC1(void)
{ {
for(uint16_t i = 0; i < 1024; i++) for(uint16_t i = 0; i < 1024; i++)
{ {
((TLC5615*) &dac1)->setValue(i); dac1.setValue(i);
_delay_ms(1); _delay_ms(1);
} }
_delay_ms(100); _delay_ms(100);
((TLC5615*) &dac1)->setValue(0); dac1.setValue(0);
} }
void testMirror() void testMirror()
@ -61,9 +61,9 @@ void testMirror()
// Endlosschleife // Endlosschleife
while(1) while(1)
{ {
((TLC5615*) &dac0)->setValue(((ADU*) &adu)->getValue(0)); dac0.setValue(adu.getValue(0));
((TLC5615*) &dac1)->setValue(((ADU*) &adu)->getValue(1)); dac1.setValue(adu.getValue(1));
((MCP23S17*) &beba0)->writePortA(((MCP23S17*) &beba0)->readPortB()); dio0.writePortA(dio0.readPortB());
((MCP23S17*) &beba1)->writePortA(((MCP23S17*) &sw)->readPortB()); dio1.writePortA(dsw.readPortB());
} }
} }

View file

@ -4,7 +4,7 @@ SPI::SPI(void)
{ {
} }
void SPI::init(void) const void SPI::init(void) const volatile
{ {
// Konfiguriere SPI DDRs // Konfiguriere SPI DDRs
@ -23,7 +23,7 @@ void SPI::init(void) const
setAdr(SPIADR::NONE); setAdr(SPIADR::NONE);
} }
void SPI::setAdr(uint8_t adr) const void SPI::setAdr(uint8_t adr) const volatile
{ {
PORTD &= ~(_BV(DMUX1) | _BV(DMUX2) | _BV(DMUX3)); PORTD &= ~(_BV(DMUX1) | _BV(DMUX2) | _BV(DMUX3));
PORTD |= (adr & 0x01) ? _BV(DMUX1) : 0; PORTD |= (adr & 0x01) ? _BV(DMUX1) : 0;
@ -31,7 +31,7 @@ void SPI::setAdr(uint8_t adr) const
PORTD |= (adr & 0x04) ? _BV(DMUX3) : 0; PORTD |= (adr & 0x04) ? _BV(DMUX3) : 0;
} }
uint8_t SPI::pushByte(uint8_t b) const uint8_t SPI::pushByte(uint8_t b) const volatile
{ {
SPDR = b; SPDR = b;
while(!(SPSR & _BV(SPIF))); while(!(SPSR & _BV(SPIF)));

View file

@ -28,9 +28,9 @@ class SPI
{ {
public: public:
SPI(void); SPI(void);
void init(void) const; void init(void) const volatile;
void setAdr(uint8_t) const; void setAdr(uint8_t) const volatile;
uint8_t pushByte(uint8_t) const; uint8_t pushByte(uint8_t) const volatile;
}; };

View file

@ -1,10 +1,10 @@
#include "tlc5615.h" #include "tlc5615.h"
TLC5615::TLC5615(SPI& spi, uint8_t adr) : spi(spi), adr(adr) TLC5615::TLC5615(volatile SPI& spi, uint8_t adr) : spi(spi), adr(adr)
{ {
} }
void TLC5615::setValue(uint16_t val) const void TLC5615::setValue(uint16_t val) const volatile
{ {
spi.setAdr(adr); spi.setAdr(adr);
spi.pushByte(val >> 6); spi.pushByte(val >> 6);

View file

@ -6,12 +6,12 @@
class TLC5615 class TLC5615
{ {
public: public:
TLC5615(SPI&, uint8_t); TLC5615(volatile SPI&, uint8_t);
void setValue(uint16_t) const; void setValue(uint16_t) const volatile;
private: private:
SPI& spi; volatile SPI& spi;
const uint8_t adr; const uint8_t adr;
}; };

View file

@ -56,7 +56,7 @@ void USART::handleRX(void) volatile
void USART::handleTX(void) volatile void USART::handleTX(void) volatile
{ {
((MCP23S17*) &beba0)->writePortA(send_pos); dio0.writePortA(send_pos);
if(send_pos < send_len) if(send_pos < send_len)
{ {
while (!(UCSR0A & (1<<UDRE0))); while (!(UCSR0A & (1<<UDRE0)));