diff --git a/driver/drv/b15f.cpp b/driver/drv/b15f.cpp index fc3f804..18cc93b 100644 --- a/driver/drv/b15f.cpp +++ b/driver/drv/b15f.cpp @@ -28,11 +28,12 @@ void B15F::init() // Temporärer Test - uint8_t block[] = {0, 1, 2, 3}; + uint8_t block[16]; while(1) { usart.writeBlock(&block[0], 0, sizeof(block)); usart.printStatistics(); + usleep(1000); } throw std::runtime_error("SCHLUSS"); diff --git a/driver/drv/b15f.o b/driver/drv/b15f.o index 79f3e7b..bffe005 100644 Binary files a/driver/drv/b15f.o and b/driver/drv/b15f.o differ diff --git a/driver/drv/usart.cpp b/driver/drv/usart.cpp index 1516c59..93362ff 100644 --- a/driver/drv/usart.cpp +++ b/driver/drv/usart.cpp @@ -2,7 +2,7 @@ void USART::openDevice(std::string device) { - file_desc = open(device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY); + file_desc = open(device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY /* | O_NONBLOCK*/); if(file_desc <= 0) throw USARTException("Fehler beim Öffnen des Gerätes"); @@ -96,7 +96,7 @@ int USART::read_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t elapsed = std::chrono::duration_cast(end - start).count(); } - return n_read; + return 0; } int USART::write_timeout(uint8_t* buffer, uint16_t offset, uint8_t len, uint32_t timeout) @@ -150,23 +150,35 @@ void USART::writeBlock(uint8_t* buffer, uint16_t offset, uint8_t len) block_buffer[len + 2] = BLOCK_END; // send block + clearOutputBuffer(); + clearInputBuffer(); int n_sent = write_timeout(&block_buffer[0], 0, len + 3, us_per_bit * n_total); if(n_sent != n_total) throw std::runtime_error("fatal (send): " + std::to_string(n_sent)); + + /*for(uint8_t i = 0; i < len + 3; i++) + { + write_timeout(&block_buffer[i], 0, 1, us_per_bit * n_total); + //tcdrain(file_desc); + //usleep(1000); + }*/ // flush output data tcdrain(file_desc); - usleep(us_per_bit * n_total); + //usleep(us_per_bit * n_total * 10); // check response - int n_read = read_timeout(&aw, 0, 1, us_per_bit); + int n_read = read_timeout(&aw, 0, 1, us_per_bit * n_blocks_total * 10); for(uint16_t i = 0; i < 255 && n_read != 1; i++) { writeByte(0x80); // Stoppzeichen für Block - tcdrain(file_desc); + if(tcdrain(file_desc)) + { + std::cout << "drain failed" << std::endl; + } std::cout << "WARNING: read error (" << n_read << "), retry #" << (int) i << std::endl; - usleep(us_per_bit); + usleep(us_per_bit*100); n_read = read_timeout(&aw, 0, 1, us_per_bit); } diff --git a/driver/drv/usart.h b/driver/drv/usart.h index e375e8c..1659316 100644 --- a/driver/drv/usart.h +++ b/driver/drv/usart.h @@ -125,7 +125,7 @@ public: /***************************************/ constexpr static uint8_t CRC7_POLY = 0x91; - constexpr static uint8_t MAX_BLOCK_SIZE = 16; + constexpr static uint8_t MAX_BLOCK_SIZE = 64; constexpr static uint8_t BLOCK_END = 0x80; private: diff --git a/driver/drv/usart.o b/driver/drv/usart.o index ed30f7a..a00541e 100644 Binary files a/driver/drv/usart.o and b/driver/drv/usart.o differ diff --git a/driver/main b/driver/main index 307f0d1..1fb9afc 100755 Binary files a/driver/main and b/driver/main differ diff --git a/firmware/B15F.elf b/firmware/B15F.elf index c37872f..c153cbd 100644 Binary files a/firmware/B15F.elf and b/firmware/B15F.elf differ diff --git a/firmware/B15F.hex b/firmware/B15F.hex index 507edfe..582abad 100644 --- a/firmware/B15F.hex +++ b/firmware/B15F.hex @@ -3,190 +3,235 @@ :100020000C947D000C947D000C947D000C947D005C :100030000C947D000C947D000C947D000C947D004C :100040000C947D000C947D000C947D000C947D003C -:100050000C947D000C947D000C947D000C947D002C +:100050000C947F000C947D000C947D000C947D002A :100060000C947D000C947D000C947D000C947D001C :100070000C947D000C947D000C947D000C947D000C -:100080000C947D000C947D000C947D00EC00EF003E -:10009000F200E300F500F800FB00FE00010104019E -:1000A000E9000701AA0511241FBECFEFD0E4DEBF8F -:1000B000CDBF11E0A0E0B1E0E8EBFBE000E00BBF5A +:100080000C947D000C947D000C947D0023012601CE +:1000900029011A012C012F013201350138013B01E0 +:1000A00020013E010D0711241FBECFEFD0E4DEBFBB +:1000B000CDBF11E0A0E0B1E0ECE8FEE000E00BBF56 :1000C00002C007900D92A232B107D9F721E0A2E257 -:1000D000B1E001C01D92A433B207E1F710E0C3E51F -:1000E000D0E004C02197FE010E94D105C235D1079E -:1000F000C9F70E947A050C94DA050C94000083E39A -:1001000091E00E940B0160E080E391E00E944E01CB -:100110006FEF80E391E00E946F0160E08DE291E07B -:100120000E944E016FEF8DE291E00E946F016FEF30 -:100130008AE291E00E946F0183E291E00E94460210 -:1001400082E291E00E943E03789484B7877F84BF67 -:10015000109260000FB6F894A895809160008861B5 -:1001600080936000109260000FBE0895CF930FB689 -:10017000F894A89580916000886180936000109247 -:1001800060000FBE6FEF8DE291E00E94900182E26D -:1001900091E00E94EC03C82F60E08DE291E00E94A4 -:1001A000900198E088E10FB6F894A89580936000DC -:1001B0000FBE90936000A8958C2F90E0FC013197C2 -:1001C000EC30F10510F0CF910895EA5BFF4F0C94ED -:1001D000D105CF910C940605CF910C947F04CF915B -:1001E0000C949004CF910C94AF04CF910C94BC0468 -:1001F000CF910C94CA04CF910C94D804CF910C9455 -:10020000E104CF910C94EA04CF910C94F804CF91BF -:100210000C941405089584B1806B84B926988AB132 -:100220008C618AB980E58CBD81E08DBD8BB1837E08 -:100230008BB95A9A5B9A5C9A08958BB1837E8BB97D -:100240008BB160FD10C090E0892B8BB98BB161FD43 -:1002500010C090E0892B8BB98BB162FD10C090E08B -:10026000892B8BB9089594E0892B8BB98BB161FFF1 -:10027000F0CF98E0892B8BB98BB162FFF0CF90E182 -:10028000892B8BB908956EBD0DB407FEFDCF8EB5D9 -:100290000895FC0171836083428308951F93CF9377 -:1002A000DF93EC01162F6A81888199810E941D01DC -:1002B00060E4888199810E94430160E0888199818E -:1002C0000E944301612F888199810E94430167E068 -:1002D00088819981DF91CF911F910C941D011F930B -:1002E000CF93DF93EC01162F6A81888199810E9458 -:1002F0001D0160E4888199810E94430161E0888149 -:1003000099810E944301612F888199810E94430154 -:1003100067E088819981DF91CF911F910C941D0135 -:100320001F93CF93DF93EC01162F6A818881998107 -:100330000E941D0160E4888199810E94430162E16D -:10034000888199810E944301612F888199810E944F -:10035000430167E088819981DF91CF911F910C94CF -:100360001D011F93CF93DF93EC01162F6A818881C3 -:1003700099810E941D0160E4888199810E94430156 -:1003800063E1888199810E944301612F888199816D -:100390000E94430167E088819981DF91CF911F918D -:1003A0000C941D011F93CF93DF93EC016A81888128 -:1003B00099810E941D0161E4888199810E94430115 -:1003C00062E1888199810E94430160E0888199817E -:1003D0000E944301182F67E0888199810E941D01C6 -:1003E000812FDF91CF911F9108951F93CF93DF93BA -:1003F000EC016A81888199810E941D0161E48881F4 -:1004000099810E94430163E1888199810E9443019F -:1004100060E0888199810E944301182F67E08881FC -:1004200099810E941D01812FDF91CF911F91089525 -:10043000FC0171836083428308950F931F93CF93D0 -:10044000DF93EC018B016A81888199810E941D01F3 -:10045000B8010024660F771F001C660F771F001C71 -:10046000672F702D888199810E944301602F660F4C -:10047000660F888199810E94430167E08881998194 -:10048000DF91CF911F910F910C941D0110927C0070 -:1004900087E880937A00089580917C00807E682BA5 -:1004A00060937C0080917A00806480937A0083EA74 -:1004B00091E00197F1F700C0000080917A0086FD7D -:1004C000FCCF809178009091790008950F931F934D -:1004D000CF93DF9361E080E391E00E949001C1E05F -:1004E000D0E001E010E02FEF84E39CE02150804059 -:1004F0009040E1F700C00000B8010C2E01C0660F6B -:100500000A94EAF780E391E00E9490012196C930B5 -:10051000D10549F7DF91CF911F910F9108950F9366 -:100520001F93CF93DF9361E08DE291E00E949001F1 -:10053000C1E0D0E001E010E02FEF84E39CE0215027 -:1005400080409040E1F700C00000B8010C2E01C0CF -:10055000660F0A94EAF78DE291E00E9490012196DD -:10056000C930D10549F7DF91CF911F910F910895BF -:10057000CF93DF93C0E0D0E0BE0187E291E00E941C -:100580001D0287E893E10197F1F700C00000219672 -:10059000C11594E0D90781F72FE78AE196E0215051 -:1005A00080409040E1F700C0000060E070E087E22A -:1005B00091E0DF91CF910C941D02CF93DF93C0E0C7 -:1005C000D0E0BE0184E291E00E941D0287E893E141 -:1005D0000197F1F700C000002196C11594E0D907FA -:1005E00081F72FE78AE196E0215080409040E1F7C3 -:1005F00000C0000060E070E084E291E0DF91CF9104 -:100600000C941D020FB6F894A89580916000886143 -:1006100080936000109260000FBE60E083E291E082 -:100620000E944C02BC0187E291E00E941D0261E041 -:1006300083E291E00E944C02BC0184E291E00E94BE -:100640001D0280E391E00E94F501682F80E391E0B4 -:100650000E9490018AE291E00E94F501682F8DE2EC -:1006600091E00E949001D9CF0E9466020E948F0201 -:100670000E94B8020E94DD020E94020382E0809381 -:10068000C00088E18093C10086E08093C200109290 -:10069000C50084E18093C40008958091C6008FE76F -:1006A00092E00197F1F700C000008091C00087FD43 -:1006B000F4CF08958091C00085FFFCCF6093C60001 -:1006C00008958091C00085FFFCCF6093C6008091A3 -:1006D000C00085FFFCCF7093C60008958091C000D4 -:1006E00085FFFCCF4093C6009FEF940F442351F049 -:1006F000FB0121918091C00085FFFCCF2093C600B3 -:100700009150B8F708958091C00085FFFCCF4093C9 -:10071000C6005FEF540F442309F45CC0FB0120E0E6 -:1007200041E9DF0190818091C00085FFFCCF90936B -:10073000C60031969C91822F892780FD842790E006 -:1007400095958795282F80FF02C0242F2827822F78 -:1007500090E095958795282F80FF02C0242F2827A9 -:1007600030E035952795822F20FF02C0842F822705 -:1007700090E095958795282F80FF02C0242F282789 -:1007800030E035952795822F20FF02C0842F8227E5 -:1007900090E095958795282F80FF02C0242F282769 -:1007A00030E035952795822F20FF02C0842F8227C5 -:1007B000282F2695515008F0B4CF8091C00085FFB6 -:1007C000FCCF2093C6008091C00087FFFCCF8091B2 -:1007D000C600089520E0F1CF8091C00087FFFCCFD4 -:1007E0008091C60008958091C00087FFFCCF2091C2 -:1007F000C60030E09091C00097FFFCCF8091C6000A -:10080000A901582BCA010895CB0171E99C01240F5D -:10081000311DA9018091C00087FFFCCFE091C60087 -:10082000E13108F0E0E060E090E08091C00087FFF7 -:10083000FCCFF091C6008F2F892780FD872790E09D -:1008400095958795282F80FF02C0272F2827822F74 -:1008500090E095958795282F80FF02C0272F2827A5 -:1008600030E035952795822F20FF02C0872F822701 -:1008700090E095958795282F80FF02C0272F282785 -:1008800030E035952795822F20FF02C0872F8227E1 -:1008900090E095958795282F80FF02C0272F282765 -:1008A00030E035952795822F20FF02C0872F8227C1 -:1008B000982F96956E17F0F06F5FE61708F0B5CF9A -:1008C0008091C600EFE7F2E03197F1F700C0000039 -:1008D0008091C00087FDF4CF992351F02EEF8091D5 -:1008E000C00085FFFCCF2093C600911193CF0895DF -:1008F0002FEFF5CFDA01A60FB11DFC93DDCFCF931B -:1009000082E291E00E94EC03C82F6FEF82E291E057 -:100910000E945A036C2F82E291E0CF910C945A030B -:1009200063E082E291E00E945A034CE065E171E0ED -:1009300082E291E00E946E0349E06CE071E082E2A5 -:1009400091E00E946E034CE060E071E082E291E091 -:100950000E946E036FEF82E291E00C945A0382E2F0 -:1009600091E00E94F303BC01660F771F680F791FA7 -:1009700082E291E00C94610382E291E00E94EC0338 -:10098000682F80E391E00E9490016FEF82E291E096 -:100990000C945A0382E291E00E94EC03682F8DE2EE -:1009A00091E00E9490016FEF82E291E00C945A0373 -:1009B00080E391E00E94F501682F82E291E00C94BF -:1009C0005A038DE291E00E94F501682F82E291E0E6 -:1009D0000C945A0382E291E00E94F303BC0187E287 -:1009E00091E00E941D026FEF82E291E00C945A03A5 -:1009F00082E291E00E94F303BC0184E291E00E9454 -:100A00001D026FEF82E291E00C945A0382E291E0C2 -:100A10000E94EC03682F83E291E00E944C02BC012B -:100A200082E291E00C9461038F929F92AF92BF9209 -:100A3000CF92DF92EF92FF920F931F93CF93DF93AA -:100A400082E291E00E94EC03882E82E291E00E9413 -:100A5000EC03982E82E291E00E94F303EC0182E223 -:100A600091E00E94F3035C0182E291E00E94F303B3 -:100A70008C016FEF82E291E00E945A03A09E600118 -:100A8000A19ED00CB09ED00C1124CC15DD050CF528 -:100A9000BE0187E291E00E941D02A895682D83E2C5 -:100AA00091E00E944C027C01692D83E291E00E945A -:100AB0004C028C01B70182E291E00E946103B8010F -:100AC00082E291E00E946103CA0DDB1DCC15DD05B9 -:100AD000FCF26FEF82E291E0DF91CF911F910F91D5 -:100AE000FF90EF90DF90CF90BF90AF909F908F904E -:100AF0000C945A03CF93DF93CDB7DEB760970FB650 -:100B0000F894DEBF0FBECDBF0E947F006FEF80E381 -:100B100091E00E9490012FE78AE196E02150804009 -:100B20009040E1F700C0000060E080E391E00E94A7 -:100B3000900160E011E0160F80E391E00E949001C7 -:100B400040E0BE016F5F7F4F82E291E00E940404AB -:100B5000612FF0CF83E391E00E940A0142E063E35A -:100B600071E080E391E00E94490143E063E371E0BA -:100B70008DE291E00E94490145E063E371E08AE281 -:100B800091E00E94490140E063E371E087E291E077 -:100B90000E94180241E063E371E084E291E00C946A -:100BA0001802EE0FFF1F0024001C0BBE0790F691E9 -:080BB000E02D0994F894FFCF39 -:100BB800626F617264696E666F2E680031353A3211 -:100BC800393A3032004170722020312032303139C8 -:020BD80000001B +:1000D000B1E001C01D92AA37B207E1F710E0C3E515 +:1000E000D0E004C02197FE010E943B07C235D10732 +:1000F000C9F70E94F1060C9444070C9400001F926B +:100100000F920FB60F9211240BB60F922F933F93BD +:100110004F935F936F937F938F939F93AF93BF930F +:10012000EF93FF938091C00083FF05C06FEF86E7D8 +:1001300091E00E94C701F8946091C60082E291E0CC +:100140000E943B047894FF91EF91BF91AF919F91F2 +:100150008F917F916F915F914F913F912F910F9070 +:100160000BBE0F900FBE0F901F90189589E791E07E +:100170000E94420160E086E791E00E9485016FEFF6 +:1001800086E791E00E94A60160E083E791E00E948B +:1001900085016FEF83E791E00E94A6016FEF80E792 +:1001A00091E00E94A60189E691E00E947D0282E230 +:1001B00091E00E947503789484B7877F84BF109282 +:1001C00060000FB6F894A8958091600088618093D4 +:1001D0006000109260000FBE0895CF930FB6F894A0 +:1001E000A895809160008861809360001092600003 +:1001F0000FBE6FEF83E791E00E94C70182E291E0BA +:100200000E942304C82F60E083E791E00E94C701A9 +:1002100098E088E10FB6F894A895809360000FBE2F +:1002200090936000A8958C2F90E0FC013197EC3002 +:10023000F10510F0CF910895EA5BFF4F0C943B0756 +:10024000CF910C947D06CF910C94F605CF910C9430 +:100250000706CF910C942606CF910C943306CF91CC +:100260000C944106CF910C944F06CF910C945806F4 +:10027000CF910C946106CF910C946F06CF910C94A2 +:100280008B06089584B1806B84B926988AB18C61FD +:100290008AB980E58CBD81E08DBD8BB1837E8BB941 +:1002A0005A9A5B9A5C9A08958BB1837E8BB98BB115 +:1002B00060FD10C090E0892B8BB98BB161FD10C03F +:1002C00090E0892B8BB98BB162FD10C090E0892B37 +:1002D0008BB9089594E0892B8BB98BB161FFF0CF76 +:1002E00098E0892B8BB98BB162FFF0CF90E1892B1D +:1002F0008BB908956EBD0DB407FEFDCF8EB5089580 +:10030000FC0171836083428308951F93CF93DF9331 +:10031000EC01162F6A81888199810E94540160E462 +:10032000888199810E947A0160E0888199810E9488 +:100330007A01612F888199810E947A0167E0888122 +:100340009981DF91CF911F910C9454011F93CF930A +:10035000DF93EC01162F6A81888199810E945401F4 +:1003600060E4888199810E947A0161E088819981A5 +:100370000E947A01612F888199810E947A0167E049 +:1003800088819981DF91CF911F910C9454011F9323 +:10039000CF93DF93EC01162F6A81888199810E94A7 +:1003A000540160E4888199810E947A0162E1888128 +:1003B00099810E947A01612F888199810E947A0136 +:1003C00067E088819981DF91CF911F910C9454014E +:1003D0001F93CF93DF93EC01162F6A818881998157 +:1003E0000E94540160E4888199810E947A0163E14E +:1003F000888199810E947A01612F888199810E9468 +:100400007A0167E088819981DF91CF911F910C94E7 +:1004100054011F93CF93DF93EC016A818881998106 +:100420000E94540161E4888199810E947A0162E10D +:10043000888199810E947A0160E0888199810E9477 +:100440007A01182F67E0888199810E945401812FD9 +:10045000DF91CF911F9108951F93CF93DF93EC010C +:100460006A81888199810E94540161E4888199811F +:100470000E947A0163E1888199810E947A0160E09B +:10048000888199810E947A01182F67E0888199817B +:100490000E945401812FDF91CF911F910895FC019B +:1004A00071836083428308950F931F93CF93DF93EB +:1004B000EC018B016A81888199810E945401B80105 +:1004C0000024660F771F001C660F771F001C672F24 +:1004D000702D888199810E947A01602F660F660FC6 +:1004E000888199810E947A0167E088819981DF91F2 +:1004F000CF911F910F910C94540110927C0087E8CA +:1005000080937A00089580917C00807E682B6093B0 +:100510007C0080917A00806480937A0083EA91E085 +:100520000197F1F700C0000080917A0086FDFCCFB2 +:10053000809178009091790008950F931F93CF9345 +:10054000DF9361E086E791E00E94C701C1E0D0E05F +:1005500001E010E02FEF84E39CE0215080409040C8 +:10056000E1F700C00000B8010C2E01C0660F0A942C +:10057000EAF786E791E00E94C7012196C930D105CC +:1005800049F7DF91CF911F910F9108950F931F931A +:10059000CF93DF9361E083E791E00E94C701C1E060 +:1005A000D0E001E010E02FEF84E39CE02150804098 +:1005B0009040E1F700C00000B8010C2E01C0660FAA +:1005C0000A94EAF783E791E00E94C7012196C930B7 +:1005D000D10549F7DF91CF911F910F910895CF93E6 +:1005E000DF93C0E0D0E0BE018DE691E00E945402AE +:1005F00087E893E10197F1F700C000002196C1154B +:1006000094E0D90781F72FE78AE196E021508040F6 +:100610009040E1F700C0000060E070E08DE691E0FE +:10062000DF91CF910C945402CF93DF93C0E0D0E0E0 +:10063000BE018AE691E00E94540287E893E10197A7 +:10064000F1F700C000002196C11594E0D90781F7A9 +:100650002FE78AE196E0215080409040E1F700C00A +:10066000000060E070E08AE691E0DF91CF910C94A9 +:1006700054020FB6F894A895809160008861809329 +:100680006000109260000FBE60E089E691E00E9479 +:100690008302BC018DE691E00E94540261E089E68C +:1006A00091E00E948302BC018AE691E00E9454021C +:1006B00086E791E00E942C02682F86E791E00E9475 +:1006C000C70180E791E00E942C02682F83E791E048 +:1006D0000E94C701D9CF0E949D020E94C6020E94BB +:1006E000EF020E9414030E94390382E08093C0004D +:1006F00088E98093C10086E08093C2001092C50013 +:1007000084E18093C40008958091C6008FE792E051 +:100710000197F1F700C000008091C00087FDF4CF81 +:1007200008958091C00085FFFCCF6093C6000895B6 +:100730008091C00085FFFCCF6093C6008091C0000F +:1007400085FFFCCF7093C60008958091C00085FF9F +:10075000FCCF4093C6009FEF940F442351F0FB0160 +:1007600021918091C00085FFFCCF2093C60091505D +:10077000B8F708958091C00085FFFCCF4093C60074 +:100780005FEF540F442309F45CC0FB0120E041E912 +:10079000DF0190818091C00085FFFCCF9093C6005F +:1007A00031969C91822F892780FD842790E0959532 +:1007B0008795282F80FF02C0242F2827822F90E0C2 +:1007C00095958795282F80FF02C0242F282730E099 +:1007D00035952795822F20FF02C0842F822790E035 +:1007E00095958795282F80FF02C0242F282730E079 +:1007F00035952795822F20FF02C0842F822790E015 +:1008000095958795282F80FF02C0242F282730E058 +:1008100035952795822F20FF02C0842F8227282F0D +:100820002695515008F0B4CF8091C00085FFFCCFD1 +:100830002093C6008091C00087FFFCCF8091C60046 +:10084000089520E0F1CF8091C00087FFFCCF809118 +:10085000C60008958091C00087FFFCCF2091C6009C +:1008600030E09091C00097FFFCCF8091C600A901B5 +:10087000582BCA010895CF93DF93FC01DC01AB5BD9 +:10088000BF4F8D919C9111978230910509F4ACC0B6 +:1008900098F4009709F48AC0019771F58081EF01FF +:1008A000C80FD11D698322E030E02D933C938F5F08 +:1008B0008083DF91CF9108958330910519F10497DA +:1008C000D9F48091C6008FE792E00197F1F700C05C +:1008D00000008091C00087FDF4CFEF01CC5BDF4FBB +:1008E00088818111E7C09FEF8091C00085FFFCCF18 +:1008F0009093C6001D921C9280818F5F8083DF9150 +:10090000CF9108958081EF01C80FD11D6983EF0158 +:10091000CC5BDF4F9881692760FF02C091E96927AE +:1009200070E075956795462F60FF02C041E9462744 +:1009300050E055954795242F40FF02C021E9242718 +:1009400030E035952795422F20FF02C041E942272C +:1009500050E055954795242F40FF02C021E92427F8 +:1009600030E035952795422F20FF02C041E942270C +:1009700050E055954795242F40FF02C021E92427D8 +:1009800030E035952795922F20FF02C091E99227FC +:10099000292F30E035952795288324E030E02D93EA +:1009A0003C938F5F8083DF91CF910895613408F489 +:1009B00083C08091C6008FE792E00197F1F700C0F5 +:1009C00000008091C00087FDF4CF8091C00085FFBA +:1009D000FCCF8EEF8093C6001D921C9280818F5FAA +:1009E0008083DF91CF9108958081EF01C80FD11DE1 +:1009F0006983EF01CC5BDF4F9881692760FF02C0FC +:100A000091E9692770E075956795462F60FF02C0F0 +:100A100041E9462750E055954795242F40FF02C0F5 +:100A200021E9242730E035952795422F20FF02C089 +:100A300041E9422750E055954795242F40FF02C0D9 +:100A400021E9242730E035952795422F20FF02C069 +:100A500041E9422750E055954795242F40FF02C0B9 +:100A600021E9242730E035952795922F20FF02C0F9 +:100A700091E99227292F30E0359527952883918198 +:100A8000891721F1891708F438CF8091C6008FE7C4 +:100A900092E00197F1F700C000008091C00087FD4F +:100AA000F4CF8091C00085FD94CF8091C00085FF78 +:100AB000F8CF8FCF9EEF18CF6183EF01CC5BDF4F74 +:100AC000188281E090E08D939C9318CF23E030E072 +:100AD0002D933C938F5F12CFCF93DF93CB0171E9BE +:100AE0009C01240F311DA901AEEF8091C00087FF4A +:100AF000FCCFE091C600E03809F46AC0E13408F0A8 +:100B0000E0E060E090E08091C00087FFFCCFF091D2 +:100B1000C6008F2F892780FD872790E095958795C0 +:100B2000282F80FF02C0272F2827822F90E095953D +:100B30008795282F80FF02C0272F282730E0359582 +:100B40002795822F20FF02C0872F822790E095955E +:100B50008795282F80FF02C0272F282730E0359562 +:100B60002795822F20FF02C0872F822790E095953E +:100B70008795282F80FF02C0272F282730E0359542 +:100B80002795822F20FF02C0872F8227982F9695C6 +:100B90006E1738F16F5FE61708F0B5CF8091C60089 +:100BA000EFE7F2E03197F1F700C000008091C0005C +:100BB00087FDF4CF992399F02EEF8091C00085FF37 +:100BC000FCCF2093C600911190CFDF91CF91089573 +:100BD0008091C00085FFFCCFA093C60086CF2FEF89 +:100BE000ECCFEA01C60FD11DF883D4CFCF9382E2B8 +:100BF00091E00E942304C82F6FEF82E291E00E94EF +:100C000091036C2F82E291E0CF910C94910363E009 +:100C100082E291E00E9491034CE065E171E082E2A2 +:100C200091E00E94A50349E06CE071E082E291E06E +:100C30000E94A5034CE060E071E082E291E00E9436 +:100C4000A5036FEF82E291E00C94910382E291E0C0 +:100C50000E942A04BC01660F771F680F791F82E289 +:100C600091E00C94980382E291E00E942304682FA3 +:100C700086E791E00E94C7016FEF82E291E00C9459 +:100C8000910382E291E00E942304682F83E791E0C0 +:100C90000E94C7016FEF82E291E00C94910386E716 +:100CA00091E00E942C02682F82E291E00C94910363 +:100CB00083E791E00E942C02682F82E291E00C947D +:100CC000910382E291E00E942A04BC018DE691E04A +:100CD0000E9454026FEF82E291E00C94910382E251 +:100CE00091E00E942A04BC018AE691E00E9454022D +:100CF0006FEF82E291E00C94910382E291E00E9416 +:100D00002304682F89E691E00E948302BC0182E2FD +:100D100091E00C9498038F929F92AF92BF92CF92E2 +:100D2000DF92EF92FF920F931F93CF93DF9382E2B4 +:100D300091E00E942304882E82E291E00E94230425 +:100D4000982E82E291E00E942A04EC0182E291E076 +:100D50000E942A045C0182E291E00E942A048C0134 +:100D60006FEF82E291E00E949103A09E6001A19E3C +:100D7000D00CB09ED00C1124CC15DD050CF5BE01B5 +:100D80008DE691E00E945402A895682D89E691E0D5 +:100D90000E9483027C01692D89E691E00E94830212 +:100DA0008C01B70182E291E00E949803B80182E2CF +:100DB00091E00E949803CA0DDB1DCC15DD05FCF205 +:100DC0006FEF82E291E0DF91CF911F910F91FF9041 +:100DD000EF90DF90CF90BF90AF909F908F900C944A +:100DE00091030E94B6006FEF86E791E00E94C70171 +:100DF0002FE78AE196E0215080409040E1F700C063 +:100E0000000060E086E791E00E94C70187E893E177 +:100E10000197F1F700C00000F9CF89E791E00E9447 +:100E2000410142E069E771E086E791E00E948001BC +:100E300043E069E771E083E791E00E94800145E0CB +:100E400069E771E080E791E00E94800140E069E796 +:100E500071E08DE691E00E944F0241E069E771E0A8 +:100E60008AE691E00E944F021092220110926801DE +:100E7000109267010895EE0FFF1F0024001C0BBEA7 +:0C0E80000790F691E02D0994F894FFCF44 +:100E8C00626F617264696E666F2E680031303A343D +:100E9C00333A3130004170722020322032303139F7 +:020EAC00000044 :00000001FF diff --git a/firmware/global_vars.cpp b/firmware/global_vars.cpp index 35b855c..88e73ca 100644 --- a/firmware/global_vars.cpp +++ b/firmware/global_vars.cpp @@ -1,11 +1,11 @@ #include "global_vars.h" -SPI spi; -MCP23S17 beba0(spi, SPIADR::BEBA0); -MCP23S17 beba1(spi, SPIADR::BEBA1); -MCP23S17 sw(spi, SPIADR::SWITCH); -TLC5615 dac0(spi, SPIADR::AA0); -TLC5615 dac1(spi, SPIADR::AA1); -ADU adu; -USART usart; +volatile SPI spi; +volatile MCP23S17 beba0(*((SPI*) &spi), SPIADR::BEBA0); +volatile MCP23S17 beba1(*((SPI*) &spi), SPIADR::BEBA1); +volatile MCP23S17 sw(*((SPI*) &spi), SPIADR::SWITCH); +volatile TLC5615 dac0(*((SPI*) &spi), SPIADR::AA0); +volatile TLC5615 dac1(*((SPI*) &spi), SPIADR::AA1); +volatile ADU adu; +volatile USART usart; diff --git a/firmware/global_vars.h b/firmware/global_vars.h index c7ecd0c..94511ec 100644 --- a/firmware/global_vars.h +++ b/firmware/global_vars.h @@ -6,13 +6,13 @@ #include "adu.h" #include "usart.h" -extern SPI spi; -extern MCP23S17 beba0; -extern MCP23S17 beba1; -extern MCP23S17 sw; -extern TLC5615 dac0; -extern TLC5615 dac1; -extern ADU adu; -extern USART usart; +extern volatile SPI spi; +extern volatile MCP23S17 beba0; +extern volatile MCP23S17 beba1; +extern volatile MCP23S17 sw; +extern volatile TLC5615 dac0; +extern volatile TLC5615 dac1; +extern volatile ADU adu; +extern volatile USART usart; #endif // GLOBAL_VARS_H diff --git a/firmware/main.cpp b/firmware/main.cpp index a1eb489..a243042 100644 --- a/firmware/main.cpp +++ b/firmware/main.cpp @@ -9,18 +9,29 @@ #define WDT_TIMEOUT WDTO_15MS +ISR(USART0_RX_vect) +{ + if(UCSR0A & _BV(DOR0)) + { + ((MCP23S17*) &beba0)->writePortA(0xFF); + } + cli(); + ((USART*) &usart)->nextByte(UDR0); + sei(); +} + void initAll() { - spi.init(); + ((SPI*) &spi)->init(); - beba0.setDirA(0x00); // alle Ausgang - beba0.setDirB(0xFF); // alle Eingang - beba1.setDirA(0x00); // alle Ausgang - beba1.setDirB(0xFF); // alle Eingang - sw.setDirB(0xFF); // alle Eingang + ((MCP23S17*) &beba0)->setDirA(0x00); // alle Ausgang + ((MCP23S17*) &beba0)->setDirB(0xFF); // alle Eingang + ((MCP23S17*) &beba1)->setDirA(0x00); // alle Ausgang + ((MCP23S17*) &beba1)->setDirB(0xFF); // alle Eingang + ((MCP23S17*) &sw)->setDirB(0xFF); // alle Eingang - adu.init(); - usart.init(); + ((ADU*) &adu)->init(); + ((USART*) &usart)->init(); // aktiviere Interrupts sei(); @@ -35,9 +46,9 @@ void handleRequest() { wdt_disable(); - beba1.writePortA(0xFF); - const uint8_t req = usart.readByte(); - beba1.writePortA(0x00); + ((MCP23S17*) &beba1)->writePortA(0xFF); + const uint8_t req = ((USART*) &usart)->readByte(); + ((MCP23S17*) &beba1)->writePortA(0x00); // starte WDT wdt_enable(WDT_TIMEOUT); @@ -104,16 +115,16 @@ int main() // Reset anzeigen - beba0.writePortA(0xFF); + ((MCP23S17*) &beba0)->writePortA(0xFF); _delay_ms(100); - beba0.writePortA(0x00); + ((MCP23S17*) &beba0)->writePortA(0x00); uint8_t n = 0; uint8_t block[16]; while(1) { - beba0.writePortA(n++ & 0xFF); - usart.readBlock(&block[0], 0); + //testAll(); + _delay_ms(1); } while(1) diff --git a/firmware/requests.cpp b/firmware/requests.cpp index 3ab761b..4d870e7 100644 --- a/firmware/requests.cpp +++ b/firmware/requests.cpp @@ -2,99 +2,99 @@ void rqTestConnection() { - uint8_t dummy = usart.readByte(); - usart.writeByte(USART::MSG_OK); - usart.writeByte(dummy); + uint8_t dummy = ((USART*) &usart)->readByte(); + ((USART*) &usart)->writeByte(USART::MSG_OK); + ((USART*) &usart)->writeByte(dummy); } void rqBoardInfo() { - usart.writeByte(3); // Anzahl an Strings + ((USART*) &usart)->writeByte(3); // Anzahl an Strings - usart.writeStr(DATE, sizeof(DATE)); - usart.writeStr(TIME, sizeof(TIME)); - usart.writeStr(FSRC, sizeof(FSRC)); - usart.writeByte(USART::MSG_OK); + ((USART*) &usart)->writeStr(DATE, sizeof(DATE)); + ((USART*) &usart)->writeStr(TIME, sizeof(TIME)); + ((USART*) &usart)->writeStr(FSRC, sizeof(FSRC)); + ((USART*) &usart)->writeByte(USART::MSG_OK); } void rqTestIntConv() { - usart.writeInt(usart.readInt() * 3); + ((USART*) &usart)->writeInt(((USART*) &usart)->readInt() * 3); } void rqDigitalWrite0() { - uint8_t port = usart.readByte(); - beba0.writePortA(port); + uint8_t port = ((USART*) &usart)->readByte(); + ((MCP23S17*) &beba0)->writePortA(port); - usart.writeByte(USART::MSG_OK); + ((USART*) &usart)->writeByte(USART::MSG_OK); } void rqDigitalWrite1() { - uint8_t port = usart.readByte(); - beba1.writePortA(port); + uint8_t port = ((USART*) &usart)->readByte(); + ((MCP23S17*) &beba1)->writePortA(port); - usart.writeByte(USART::MSG_OK); + ((USART*) &usart)->writeByte(USART::MSG_OK); } void rqDigitalRead0() { - uint8_t port = beba0.readPortB(); - usart.writeByte(port); + uint8_t port = ((MCP23S17*) &beba0)->readPortB(); + ((USART*) &usart)->writeByte(port); } void rqDigitalRead1() { - uint8_t port = beba1.readPortB(); - usart.writeByte(port); + uint8_t port = ((MCP23S17*) &beba1)->readPortB(); + ((USART*) &usart)->writeByte(port); } void rqAnalogWrite0() { - uint16_t value = usart.readInt(); - dac0.setValue(value); + uint16_t value = ((USART*) &usart)->readInt(); + ((TLC5615*) &dac0)->setValue(value); - usart.writeByte(USART::MSG_OK); + ((USART*) &usart)->writeByte(USART::MSG_OK); } void rqAnalogWrite1() { - uint16_t value = usart.readInt(); - dac1.setValue(value); + uint16_t value = ((USART*) &usart)->readInt(); + ((TLC5615*) &dac1)->setValue(value); - usart.writeByte(USART::MSG_OK); + ((USART*) &usart)->writeByte(USART::MSG_OK); } void rqAnalogRead() { - uint8_t channel = usart.readByte(); - uint16_t value = adu.getValue(channel); - usart.writeInt(value); + uint8_t channel = ((USART*) &usart)->readByte(); + uint16_t value = ((ADU*) &adu)->getValue(channel); + ((USART*) &usart)->writeInt(value); } void rqAdcDacStroke() { - uint8_t channel_a = usart.readByte(); - uint8_t channel_b = usart.readByte(); + uint8_t channel_a = ((USART*) &usart)->readByte(); + uint8_t channel_b = ((USART*) &usart)->readByte(); - int16_t start = static_cast(usart.readInt()); - int16_t delta = static_cast(usart.readInt()); - int16_t count = static_cast(usart.readInt()); + int16_t start = static_cast(((USART*) &usart)->readInt()); + int16_t delta = static_cast(((USART*) &usart)->readInt()); + int16_t count = static_cast(((USART*) &usart)->readInt()); - usart.writeByte(USART::MSG_OK); + ((USART*) &usart)->writeByte(USART::MSG_OK); count *= delta; for(int16_t i = start; i < count; i += delta) { - dac0.setValue(i); + ((TLC5615*) &dac0)->setValue(i); wdt_reset(); - uint16_t val_a = adu.getValue(channel_a); - uint16_t val_b = adu.getValue(channel_b); - usart.writeInt(val_a); - usart.writeInt(val_b); + uint16_t val_a = ((ADU*) &adu)->getValue(channel_a); + uint16_t val_b = ((ADU*) &adu)->getValue(channel_b); + ((USART*) &usart)->writeInt(val_a); + ((USART*) &usart)->writeInt(val_b); /*union doubleword { @@ -103,19 +103,19 @@ void rqAdcDacStroke() }; union doubleword dw; - dw.word[0] = adu.getValue(channel_a); - dw.word[1] = adu.getValue(channel_b); + dw.word[0] = ((ADU*) &adu)->getValue(channel_a); + dw.word[1] = ((ADU*) &adu)->getValue(channel_b); uint8_t ret = 0; do { wdt_reset(); - ret = usart.writeBlock(&(dw.byte[0]), 4); + ret = ((USART*) &usart)->writeBlock(&(dw.byte[0]), 4); if(ret == 0) return; } while(ret != USART::MSG_OK);*/ } - usart.writeByte(USART::MSG_OK); + ((USART*) &usart)->writeByte(USART::MSG_OK); } diff --git a/firmware/selftest.cpp b/firmware/selftest.cpp index 2cf7bd2..c75a77d 100644 --- a/firmware/selftest.cpp +++ b/firmware/selftest.cpp @@ -13,7 +13,7 @@ void testBEBA0(void) { for(uint8_t i = 0; i < 9; i++) { - beba0.writePortA(_BV(i)); + ((MCP23S17*) &beba0)->writePortA(_BV(i)); if(i < 8) _delay_ms(200); @@ -24,7 +24,7 @@ void testBEBA1(void) { for(uint8_t i = 0; i < 9; i++) { - beba1.writePortA(_BV(i)); + ((MCP23S17*) &beba1)->writePortA(_BV(i)); if(i < 8) _delay_ms(200); @@ -35,22 +35,22 @@ void testDAC0(void) { for(uint16_t i = 0; i < 1024; i++) { - dac0.setValue(i); + ((TLC5615*) &dac0)->setValue(i); _delay_ms(1); } _delay_ms(100); - dac0.setValue(0); + ((TLC5615*) &dac0)->setValue(0); } void testDAC1(void) { for(uint16_t i = 0; i < 1024; i++) { - dac1.setValue(i); + ((TLC5615*) &dac1)->setValue(i); _delay_ms(1); } _delay_ms(100); - dac1.setValue(0); + ((TLC5615*) &dac1)->setValue(0); } void testMirror() @@ -61,9 +61,9 @@ void testMirror() // Endlosschleife while(1) { - dac0.setValue(adu.getValue(0)); - dac1.setValue(adu.getValue(1)); - beba0.writePortA(beba0.readPortB()); - beba1.writePortA(sw.readPortB()); + ((TLC5615*) &dac0)->setValue(((ADU*) &adu)->getValue(0)); + ((TLC5615*) &dac1)->setValue(((ADU*) &adu)->getValue(1)); + ((MCP23S17*) &beba0)->writePortA(((MCP23S17*) &beba0)->readPortB()); + ((MCP23S17*) &beba1)->writePortA(((MCP23S17*) &sw)->readPortB()); } } diff --git a/firmware/usart.cpp b/firmware/usart.cpp index d03149d..dc78264 100644 --- a/firmware/usart.cpp +++ b/firmware/usart.cpp @@ -4,7 +4,7 @@ void USART::init() { UCSR0A = _BV(U2X0); - UCSR0B = _BV(RXEN0) | _BV(TXEN0); + UCSR0B = _BV(RXEN0) | _BV(TXEN0) | _BV(RXCIE0); // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit UCSR0C = _BV(UCSZ00) |_BV(UCSZ01);// (1< MAX_BLOCK_SIZE) + { + clearInputBuffer(); + writeByte(MSG_FAIL); + seq = BlockSequence::IDLE; + } + else + { + block_buffer[0] = byte; + crc = 0; + block_pos = 0; + seq = BlockSequence::LEN; + } + break; + } + case LEN: + { + block_buffer[block_pos] = byte; + seq = BlockSequence::DATA; + break; + } + case DATA: + { + block_buffer[block_pos] = byte; + crc ^= byte; + for (uint8_t i = 0; i < 8; i++) + { + if (crc & 1) + crc ^= CRC7_POLY; + crc >>= 1; + } + if(block_pos == block_buffer[0]) + seq = BlockSequence::CRC; + else if(block_pos >= block_buffer[0]) + { + clearInputBuffer(); + writeByte(MSG_FAIL); + seq = BlockSequence::IDLE; + } + break; + } + case CRC: + { + block_buffer[block_pos] = byte; + crc ^= byte; + for (uint8_t i = 0; i < 8; i++) + { + if (crc & 1) + crc ^= CRC7_POLY; + crc >>= 1; + } + seq = BlockSequence::END; + break; + } + case END: + { + clearInputBuffer(); + writeByte(crc == 0 ? MSG_OK : MSG_FAIL); + seq = BlockSequence::IDLE; + break; + } + + + } + block_pos++; +} + void USART::readBlock(uint8_t* ptr, uint8_t offset) { ptr += offset; @@ -129,7 +202,7 @@ void USART::readBlock(uint8_t* ptr, uint8_t offset) } - flush(); // leere Eingangspuffer + clearInputBuffer(); // leere Eingangspuffer writeByte(crc == 0 ? MSG_OK : MSG_FAIL); } diff --git a/firmware/usart.h b/firmware/usart.h index f427f3b..ab5022e 100644 --- a/firmware/usart.h +++ b/firmware/usart.h @@ -5,15 +5,20 @@ #include #include -constexpr uint32_t BAUDRATE = 115200; // 38400 -constexpr uint8_t CRC7_POLY = 0x91; -constexpr uint8_t MAX_BLOCK_SIZE = 16; +enum BlockSequence +{ + IDLE = 0, + LEN = 1, + DATA = 2, + CRC = 3, + END = 4, +}; class USART { public: void init(void); - void flush(void); + void clearInputBuffer(void); void writeByte(uint8_t); void writeInt(uint16_t); @@ -23,10 +28,24 @@ public: uint8_t readByte(void); uint16_t readInt(void); uint32_t readLong(void); + + void nextByte(uint8_t byte); void readBlock(uint8_t*, uint8_t); constexpr static uint8_t MSG_OK = 0xFF; constexpr static uint8_t MSG_FAIL = 0xFE; + + uint8_t block_pos = 0; + + // constants + 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; +private: + uint8_t block_buffer[MAX_BLOCK_SIZE + 3]; // don't store BLOCK_END byte + uint8_t crc; + BlockSequence seq = BlockSequence::IDLE; }; #endif // USART_H