initial
This commit is contained in:
8
Firmware/.gitignore
vendored
Normal file
8
Firmware/.gitignore
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
depends
|
||||
.pio
|
||||
.vscode
|
||||
|
||||
.vscode/.browse.c_cpp.db*
|
||||
.vscode/c_cpp_properties.json
|
||||
.vscode/launch.json
|
||||
.vscode/ipch
|
||||
BIN
Firmware/Builds/main.elf
Executable file
BIN
Firmware/Builds/main.elf
Executable file
Binary file not shown.
300
Firmware/Builds/main.hex
Normal file
300
Firmware/Builds/main.hex
Normal file
@@ -0,0 +1,300 @@
|
||||
:100000000C9446030C9465030C9465030C946503EF
|
||||
:100010000C9465030C9465030C9465030C946503C0
|
||||
:100020000C9465030C9402040C9465030C94650312
|
||||
:100030000C9465030C9465030C9465030C946503A0
|
||||
:100040000C9465030C9465030C9465030C94650390
|
||||
:100050000C9439040C9465040C9465030C946503AA
|
||||
:100060000C9465030C9465030C9465030C94650370
|
||||
:100070000C9465030C9465030C9465030C94650360
|
||||
:100080000C9465030C9465030C9465030000000058
|
||||
:100090000000003E4551453E003E6B6F6B3E001C2C
|
||||
:1000A0003E7C3E1C00183C7E3C180030367F3630CB
|
||||
:1000B00000185C7E5C1800000000000000000000DA
|
||||
:1000C0000000000000000000000000000000003000
|
||||
:1000D000484A360E00062979290600000000000073
|
||||
:1000E00000607E0A353F002A1C361C2A00007F3E35
|
||||
:1000F0001C0800081C3E7F000014367F36140000E8
|
||||
:100100005F005F000006097F017F00224D555922E4
|
||||
:100110000060606060000014B6FFB6140004067F43
|
||||
:1001200006040010307F30100008083E1C0800084C
|
||||
:100130001C3E080800784040404000083E083E0849
|
||||
:1001400000303C3F3C3000030F3F0F030000000035
|
||||
:1001500000000000065F06000007030007030024FC
|
||||
:100160007E247E2400242B6A12000063130864633B
|
||||
:1001700000364956205000000703000000003E41B1
|
||||
:1001800000000000413E000000083E1C3E08000840
|
||||
:10019000083E08080000E0600000000808080808A1
|
||||
:1001A000000060600000002010080402003E514979
|
||||
:1001B000453E0000427F400000625149494600220E
|
||||
:1001C00049494936001814127F10002F4949493116
|
||||
:1001D000003C4A494930000171090503003649498C
|
||||
:1001E000493600064949291E00006C6C00000000D9
|
||||
:1001F000EC6C000000081422410000242424242474
|
||||
:10020000000041221408000201590906003E415D28
|
||||
:10021000551E007E1111117E007F49494936003E6E
|
||||
:1002200041414122007F4141413E007F49494941CE
|
||||
:10023000007F09090901003E4149497A007F080809
|
||||
:10024000087F0000417F410000304040403F007F78
|
||||
:1002500008142241007F40404040007F0204027F9A
|
||||
:10026000007F0204087F003E4141413E007F0909B2
|
||||
:100270000906003E4151215E007F090919660026EA
|
||||
:10028000494949320001017F0101003F4040403FA0
|
||||
:10029000001F2040201F003F403C403F00631408E7
|
||||
:1002A0001463000708700807007149454300000007
|
||||
:1002B0007F414100000204081020000041417F00FE
|
||||
:1002C0000004020102048080808080800000030717
|
||||
:1002D0000000002054545478007F444444380038CF
|
||||
:1002E0004444442800384444447F0038545454085B
|
||||
:1002F00000087E0909000018A4A4A47C007F04045F
|
||||
:1003000078000000007D4000004080847D00007F78
|
||||
:10031000102844000000007F4000007C041804788E
|
||||
:10032000007C0404780000384444443800FC444411
|
||||
:1003300044380038444444FC00447844040800082D
|
||||
:100340005454542000043E442400003C40207C00CF
|
||||
:10035000001C2040201C003C6030603C006C1010F1
|
||||
:100360006C00009CA0603C00006454544C000008E9
|
||||
:100370003E414100000000770000000041413E087E
|
||||
:10038000000201020100003C2623263C001EA1E1E0
|
||||
:100390002112003D40207D000038545455090020B2
|
||||
:1003A00055555578002055545578002055555478AA
|
||||
:1003B000002057555778001CA2E2221400385555EA
|
||||
:1003C0005508003855545508003855555408000054
|
||||
:1003D000017C41000000017D41000000017C4000E3
|
||||
:1003E00000702924297000782F252F78007C545420
|
||||
:1003F00055450034547C5458007E097F49490038E3
|
||||
:100400004545390000384544390000394544380035
|
||||
:10041000003C41217D00003D41207C00009CA1600A
|
||||
:100420003D00003D42423D00003C41403D008070A7
|
||||
:100430006858380400483E494962007E615D433F88
|
||||
:100440000022140814220040887E0902002054551E
|
||||
:1004500055780000007D4100003844453900003CDB
|
||||
:1004600040217D00007A090A7100007A112279008A
|
||||
:1004700000085555555E004E51514E000030484D14
|
||||
:1004800040203E415D4B553E04040404041C00170B
|
||||
:10049000084C6A50001708342A780000307D30007C
|
||||
:1004A0000008140008140014080014084411441132
|
||||
:1004B0004411AA55AA55AA55BBEEBBEEBBEE0000EF
|
||||
:1004C00000FF0000080808FF0000007028252970C0
|
||||
:1004D0000070292529700070292528703E415D553E
|
||||
:1004E000413E0AFB00FF000000FF00FF00000AFA87
|
||||
:1004F00002FE00000A0B080F00000018246624000A
|
||||
:1005000000292A7C2A29080808F800000000000FAA
|
||||
:1005100008080808080F0808080808F80808000074
|
||||
:1005200000FF0808080808080808080808FF080865
|
||||
:1005300000205655567900702A252A71000F080BA5
|
||||
:100540000A0A00FE02FA0A0A0A0B080B0A0A0AFA49
|
||||
:1005500002FA0A0A00FF00FB0A0A0A0A0A0A0A0A41
|
||||
:100560000AFB00FB0A0A005D2222225D0022555987
|
||||
:10057000300000087F49413E007C55555544007CC1
|
||||
:1005800055545544007C5555544400000007000064
|
||||
:100590000000447D45000000457D45000000457C8D
|
||||
:1005A00045000808080F0000000000F80808FFFFD9
|
||||
:1005B000FFFFFFFFF0F0F0F0F0F000000077000028
|
||||
:1005C0000000457D44000F0F0F0F0F0F003C42430A
|
||||
:1005D0003D0000FE4A4A3400003C43433D00003DDC
|
||||
:1005E00043423C000032494A3100003A4546390056
|
||||
:1005F00000FC20201C0000FEAA28100000FFA524FB
|
||||
:100600001800003C40413D00003C41413D00003DA0
|
||||
:1006100041403C00009CA0613D00000408710904B9
|
||||
:1006200000000202020000000703000000000808AA
|
||||
:1006300008000000242E240000242424242405176C
|
||||
:100640000A342A780006097F017F00224D5559227D
|
||||
:100650000008082A08080000081818000006090900
|
||||
:10066000060000000800080000000800000000026A
|
||||
:100670000F00000000090F05000000090D0A00002E
|
||||
:10068000003C3C3C3C0000000000000011241FBE68
|
||||
:10069000CFEFD0E4DEBFCDBF11E0A0E0B1E0EAE4EF
|
||||
:1006A000F2E100E00BBF02C007900D92A635B10742
|
||||
:1006B000D9F725E0A6E5B1E001C01D92AC3BB20739
|
||||
:1006C000E1F70E94C1050C9423090C940000FC0181
|
||||
:1006D0001082758364837383628341834783468377
|
||||
:1006E0000895FC0180818823B9F0A281B3819D0126
|
||||
:1006F0002F5F3F4F8C919681915019F49181291B66
|
||||
:1007000031093383228396832FB7F89490819150D7
|
||||
:1007100090832FBF90E008958FEF9FEF0895FC0125
|
||||
:10072000908181819817B8F4A481B5819D012F5FD4
|
||||
:100730003F4F6C938781815019F48181281B3109C7
|
||||
:100740008783358324839FB7F89480818F5F80836C
|
||||
:100750009FBF81E0089580E0089587B18C7F87B9BD
|
||||
:1007600088B1836088B983E08093B80087E0809384
|
||||
:10077000B10082E0809370008DE78093B30078949D
|
||||
:1007800008958AE08093560184EA8093BC0004C0F7
|
||||
:100790008091BC0087FD04C0809156018111F8CF83
|
||||
:1007A00080915601882329F08091B900887F90E0DC
|
||||
:1007B00008958FEF9FEF08959AE0909356018093EC
|
||||
:1007C000BB0084E88093BC0004C08091BC0087FD1E
|
||||
:1007D00004C0809156018111F8CF80915601882381
|
||||
:1007E00029F08091B900887F90E008958FEF9FEF06
|
||||
:1007F00008950C94DC038AE08093560184E9809389
|
||||
:10080000BC0008951F920F920FB60F9211248F9380
|
||||
:100810008091B30083588093B30080915601882360
|
||||
:1008200029F0809156018150809356018F910F904D
|
||||
:100830000FBE0F901F9018958FB7F89427E630E001
|
||||
:100840003093C5002093C40098E99093C10090ECC8
|
||||
:100850009093C0008FBF40E16CEA71E084EA91E0C0
|
||||
:100860000E94670340E464E671E08CE591E00C943B
|
||||
:1008700067031F920F920FB60F9211240BB60F92BF
|
||||
:100880002F933F934F935F936F937F938F939F9398
|
||||
:10089000AF93BF93EF93FF936091C60084EA91E01A
|
||||
:1008A0000E948F03FF91EF91BF91AF919F918F9124
|
||||
:1008B0007F916F915F914F913F912F910F900BBE60
|
||||
:1008C0000F900FBE0F901F9018951F920F920FB6AA
|
||||
:1008D0000F9211240BB60F922F933F934F935F9378
|
||||
:1008E0006F937F938F939F93AF93BF93EF93FF93F8
|
||||
:1008F00080915C01811118C08091C1008F7D80932F
|
||||
:10090000C100FF91EF91BF91AF919F918F917F9126
|
||||
:100910006F915F914F913F912F910F900BBE0F9070
|
||||
:100920000FBE0F901F9018958CE591E00E94710307
|
||||
:100930008093C600E6CF8091570180FD0DC084B141
|
||||
:10094000806A84B980E58CBD81E08DBD81E090E056
|
||||
:10095000909358018093570108958EBD0DB407FE02
|
||||
:10096000FDCF0895249A2C9A0C949B04BF92CF92A9
|
||||
:10097000DF92EF92FF920F931F93CF93DF93BFB657
|
||||
:10098000F8948CE3C82E85E0D82E97E0E92EF12C60
|
||||
:100990000AC081E0E81AF10880E8C81AD1088FEF90
|
||||
:1009A000E816F80621F180915B0190E00E2C02C060
|
||||
:1009B000959587950A94E2F780FFEBCF4698479884
|
||||
:1009C0008E2D806B0E94AD0480E10E94AD0480E01A
|
||||
:1009D0000E94AD04479A860100581F4FE601899195
|
||||
:1009E0000E94AD04C017D107D1F7469AD2CF10921A
|
||||
:1009F0005B01BFBEDF91CF911F910F91FF90EF90F0
|
||||
:100A0000DF90CF90BF900895ECEBF1E0CF018058DC
|
||||
:100A10009F4F1192E817F907E1F785E0EC3BF807E3
|
||||
:100A2000A9F78FEF80935B010C94B6048A3091F1A3
|
||||
:100A30008D3069F13091590120915A0196E0899FDA
|
||||
:100A4000F0011124E457FF4F86E0289FD0011124C4
|
||||
:100A500090E8399FA00DB11D1124A454BE4F86E02B
|
||||
:100A600094919D93815031968111FACF81E090E06D
|
||||
:100A700001C0880F3A95EAF790915B01892B80932A
|
||||
:100A80005B01243170F42F5F20935A010895109276
|
||||
:100A90005A01089580915901873018F48F5F80932F
|
||||
:100AA00059010895CF93DF93EC019881992339F090
|
||||
:100AB0002196892F0E94160589918111FBCFDF9124
|
||||
:100AC000CF91089580935A016093590108950E942F
|
||||
:100AD000C10384EC0E94F90381E10E94DC0380E001
|
||||
:100AE0000E94DC0380E00E94DC0380E00E94DC03C3
|
||||
:100AF00080E00E94DC0380E00E94DC030C94FB0396
|
||||
:100B0000CF930E949B0487B1806C87B9CFB7F894CC
|
||||
:100B10004798469882EE0E94AD0483EA0E94AD0495
|
||||
:100B200081E80E94AD0488E00E94AD0480EA0E9442
|
||||
:100B3000AD0488EC0E94AD0485E20E94AD048FE212
|
||||
:100B40000E94AD048FEA0E94AD04469A479A0E9423
|
||||
:100B50000405CFBF0E94AD030E946705CF910C949E
|
||||
:100B6000B204CF93C82F0E94C10384EC0E94F90302
|
||||
:100B700085E10E94DC038C2F0E94DC03CF910C9452
|
||||
:100B8000FB03CF93DF93CDB7DEB764970FB6F8942E
|
||||
:100B9000DEBF0FBECDBF81B1877081B982B1886FD2
|
||||
:100BA00082B98FE084B985B18F6085B90E941C0439
|
||||
:100BB0000E948005789484E00E94B10581E0C12CF8
|
||||
:100BC000D12C76019E012F5F3F4F490190E0A92E65
|
||||
:100BD00091E0B92E0FC010E0813021F19FEFC91ACA
|
||||
:100BE000D90AE90AF90A8FE99FE00197F1F700C0F5
|
||||
:100BF0000000812F11E00399EECF882331F02FEF11
|
||||
:100C0000C21AD20AE20AF20AEECF3FEF89EF90E071
|
||||
:100C1000315080409040E1F700C00000C12CD12C41
|
||||
:100C20007601EDCF2FEF39EF80E02150304080404A
|
||||
:100C3000E1F700C000000E94040560E080E00E942F
|
||||
:100C40006205FF92EF92DF92CF92BF92AF929F9296
|
||||
:100C50008F920E943A06C4010E9452050E94B60477
|
||||
:100C60000FB6F894DEBF0FBECDBFC12CD12C7601DC
|
||||
:100C7000C394B9CF0F931F93CF93DF93CDB7DEB754
|
||||
:100C80002E970FB6F894DEBF0FBECDBF0D891E891B
|
||||
:100C900086E08C831A8309838FEF9FE79E838D8381
|
||||
:100CA000AE01475E5F4F6F89788DCE0101960E943D
|
||||
:100CB0006906EF81F885E00FF11F10822E960FB6BE
|
||||
:100CC000F894DEBF0FBECDBFDF91CF911F910F9182
|
||||
:100CD00008952F923F924F925F926F927F928F92E0
|
||||
:100CE0009F92AF92BF92CF92DF92EF92FF920F93BB
|
||||
:100CF0001F93CF93DF93CDB7DEB72B970FB6F89442
|
||||
:100D0000DEBF0FBECDBF6C017B018A01FC011782E3
|
||||
:100D10001682838181FFCCC1CE0101963C01F60190
|
||||
:100D20009381F70193FD859193FF81917F01882342
|
||||
:100D300009F4BAC1853239F493FD859193FF81910D
|
||||
:100D40007F01853229F4B60190E00E948908E7CF3F
|
||||
:100D5000912C212C312CFFE1F315D8F08B3279F056
|
||||
:100D600038F4803279F08332A1F4232D20611DC044
|
||||
:100D70008D3261F0803369F4232D216016C0832DFC
|
||||
:100D80008260382EE32DE4603E2E2AC0F32DF860F9
|
||||
:100D90001DC037FC2DC020ED280F2A3040F08E32C8
|
||||
:100DA000B9F436FC81C1232D2064322E19C036FEE1
|
||||
:100DB00006C08AE0989E200D1124922E11C0EAE010
|
||||
:100DC0002E9E200D1124222EF32DF0623F2E08C0FE
|
||||
:100DD0008C3621F4832D8068382E02C0883641F489
|
||||
:100DE000F70193FD859193FF81917F018111B3CF2D
|
||||
:100DF000982F9F7D9554933028F40C5F1F4F9FE3ED
|
||||
:100E000099830DC0833631F0833771F0833509F053
|
||||
:100E100059C021C0F801808189830E5F1F4F88244B
|
||||
:100E20008394912C530113C02801F2E04F0E511C02
|
||||
:100E3000F801A080B18036FE03C0692D70E002C0C9
|
||||
:100E40006FEF7FEFC5010E947E084C018201F32DF8
|
||||
:100E5000FF773F2E16C0280122E0420E511CF801F8
|
||||
:100E6000A080B18036FE03C0692D70E002C06FEF34
|
||||
:100E70007FEFC5010E9473084C01F32DF0683F2EEF
|
||||
:100E8000820133FC1BC0822D90E088169906B0F4D5
|
||||
:100E9000B60180E290E00E9489082A94F4CFF5011F
|
||||
:100EA00037FC859137FE81915F01B60190E00E9489
|
||||
:100EB000890821102A9421E0821A91088114910452
|
||||
:100EC00071F7E8C0843611F0893641F5F80137FE34
|
||||
:100ED00007C060817181828193810C5F1F4F08C0C0
|
||||
:100EE00060817181072E000C880B990B0E5F1F4FDC
|
||||
:100EF000F32DFF763F2E97FF09C090958095709552
|
||||
:100F000061957F4F8F4F9F4FF0683F2E2AE030E072
|
||||
:100F1000A3010E94C508882E861845C0853731F484
|
||||
:100F2000232D2F7EB22E2AE030E025C0932D997F0D
|
||||
:100F3000B92E8F36C1F018F4883579F0B5C08037F6
|
||||
:100F400019F0883721F0B0C0E92FE061BE2EB4FE61
|
||||
:100F50000DC0FB2DF460BF2E09C034FE0AC0292F3E
|
||||
:100F60002660B22E06C028E030E005C020E130E067
|
||||
:100F700002C020E132E0F801B7FE07C06081718154
|
||||
:100F8000828193810C5F1F4F06C06081718180E078
|
||||
:100F900090E00E5F1F4FA3010E94C508882E86189F
|
||||
:100FA000FB2DFF773F2E36FE0DC0232D2E7FA22E68
|
||||
:100FB000891458F434FE0BC032FC09C0832D8E7E98
|
||||
:100FC000A82E05C0B82CA32C03C0B82C01C0B92C86
|
||||
:100FD000A4FE0FC0FE01E80DF11D8081803321F4D5
|
||||
:100FE0009A2D997EA92E09C0A2FE06C0B394B3948F
|
||||
:100FF00004C08A2D867809F0B394A3FC11C0A0FE2A
|
||||
:1010000006C0B21488F4280C922C9B180EC0B2149F
|
||||
:1010100060F4B60180E290E00E948908B394F7CFB3
|
||||
:10102000B21418F42B1802C0982C212CA4FE10C066
|
||||
:10103000B60180E390E00E948908A2FE17C0A1FCDF
|
||||
:1010400003C088E790E002C088E590E0B6010CC0DC
|
||||
:101050008A2D867859F0A1FE02C08BE201C080E2A1
|
||||
:10106000A7FC8DE2B60190E00E948908891438F44B
|
||||
:10107000B60180E390E00E9489089A94F7CF8A94A1
|
||||
:10108000F301E80DF11D8081B60190E00E9489080E
|
||||
:101090008110F5CF222009F442CEB60180E290E023
|
||||
:1010A0000E9489082A94F6CFF6018681978102C0B2
|
||||
:1010B0008FEF9FEF2B960FB6F894DEBF0FBECDBF1C
|
||||
:1010C000DF91CF911F910F91FF90EF90DF90CF9024
|
||||
:1010D000BF90AF909F908F907F906F905F904F9058
|
||||
:1010E0003F902F900895FC010590615070400110D1
|
||||
:1010F000D8F7809590958E0F9F1F0895FC01615041
|
||||
:10110000704001900110D8F7809590958E0F9F1F29
|
||||
:1011100008950F931F93CF93DF93FB01238121FD4C
|
||||
:1011200003C08FEF9FEF2CC022FF16C0468157816E
|
||||
:10113000248135814217530744F4A081B1819D0178
|
||||
:101140002F5F3F4F318320838C93268137812F5F20
|
||||
:101150003F4F3783268314C08B01EC01FB010084D1
|
||||
:10116000F185E02D0995892BE1F6D80116968D9130
|
||||
:101170009C911797019617969C938E931697CE0184
|
||||
:10118000DF91CF911F910F910895FA01AA2728307E
|
||||
:1011900051F1203181F1E8946F936E7F6E5F7F4F44
|
||||
:1011A0008F4F9F4FAF4FB1E03ED0B4E03CD0670FC0
|
||||
:1011B000781F891F9A1FA11D680F791F8A1F911D13
|
||||
:1011C000A11D6A0F711D811D911DA11D20D009F463
|
||||
:1011D00068943F912AE0269F11243019305D3193A5
|
||||
:1011E000DEF6CF010895462F4770405D4193B3E08E
|
||||
:1011F0000FD0C9F7F6CF462F4F70405D4A3318F035
|
||||
:10120000495D31FD4052419302D0A9F7EACFB4E0E5
|
||||
:10121000A6959795879577956795BA95C9F700979D
|
||||
:101220006105710508959B01AC010A2E069457953E
|
||||
:10123000479537952795BA95C9F7620F731F841F95
|
||||
:0A124000951FA01D0895F894FFCF3C
|
||||
:10124A0074696D653A202564004A6F79737469631D
|
||||
:10125A006B2055702E0D0A004A6F79737469636B9F
|
||||
:10126A0020446F776E2E0D0A004A6F797374696392
|
||||
:10127A006B204C6566742E0D0A004A6F7973746987
|
||||
:10128A00636B2052696768742E0D0A004578697489
|
||||
:06129A002E0D0A0A0000FF
|
||||
:00000001FF
|
||||
BIN
Firmware/Builds/src/main.o
Normal file
BIN
Firmware/Builds/src/main.o
Normal file
Binary file not shown.
BIN
Firmware/Builds/src/music.o
Normal file
BIN
Firmware/Builds/src/music.o
Normal file
Binary file not shown.
59
Firmware/Makefile
Normal file
59
Firmware/Makefile
Normal file
@@ -0,0 +1,59 @@
|
||||
TARGET = main
|
||||
SRCS := $(shell find ../../dmm-libs-master/src/ -name '*.c') $(shell find src/ -name '*.c')
|
||||
FILES = $(SRCS:%.c=%) #main uart avrIOhelper/io-helper #uart#hier alle c-Datein reinschreiben, trennung durch " " und ohne .c-Endung
|
||||
MCU = atmega1284
|
||||
PROGC = m1284
|
||||
CC = avr-gcc
|
||||
#TOOL = stk500 -P /dev/ttyUSB0
|
||||
TOOL = atmelice
|
||||
#TOOL = avrispmkii
|
||||
#TOOL = usbasp-clone
|
||||
|
||||
BUILDDIR = Builds
|
||||
|
||||
DEFINES = -DF_CPU=16000000UL -I include/ -I ../../dmm-libs-master/include/
|
||||
|
||||
CFLAGS =-mmcu=$(MCU) -O2 -Wall -Wpedantic $(DEFINES) -std=c99 -ffunction-sections -fdata-sections
|
||||
LDFLAGS =-mmcu=$(MCU) -Wl,--gc-sections
|
||||
|
||||
LDFILES = $(foreach FILE,$(FILES),$(BUILDDIR)/$(FILE).o)
|
||||
|
||||
all: clean $(BUILDDIR)/$(TARGET).elf
|
||||
|
||||
$(BUILDDIR)/%.o: %.c
|
||||
mkdir -p $(dir $@)
|
||||
$(CC) $(CFLAGS) -c $< -o $(BUILDDIR)/$*.o
|
||||
|
||||
$(BUILDDIR)/$(TARGET).elf: $(LDFILES)
|
||||
mkdir -p $(dir $@)
|
||||
$(CC) $(LDFLAGS) $(LDFILES) -o $(BUILDDIR)/$(TARGET).elf
|
||||
|
||||
$(BUILDDIR)/$(TARGET).hex : $(BUILDDIR)/$(TARGET).elf
|
||||
avr-objcopy -j .data -j .text -O ihex $< $@
|
||||
|
||||
fuse:
|
||||
avrdude -p $(PROGC) -c $(TOOL) -U lfuse:w:0xE8:m -U hfuse:w:0xD1:m
|
||||
|
||||
load: $(BUILDDIR)/$(TARGET).hex
|
||||
avrdude -p $(PROGC) -c $(TOOL) -U flash:w:$(BUILDDIR)/$(TARGET).hex -v -B 4MHz
|
||||
|
||||
program: clean load
|
||||
|
||||
reset:
|
||||
avrdude -p $(PROGC) -c $(TOOL)
|
||||
|
||||
size: $(BUILDDIR)/$(TARGET).elf
|
||||
avr-size -C --mcu=$(MCU) $(BUILDDIR)/$(TARGET).elf
|
||||
|
||||
.PHONY=clean
|
||||
clean:
|
||||
rm -rf $(BUILDDIR)
|
||||
|
||||
|
||||
#Fuse m1284p external Osz. Long startuptime
|
||||
# avrdude -c usbasp-clone -p m1284p -U lfuse:w:0xff:m -U hfuse:w:0xd9:m -U efuse:w:0xff:m
|
||||
|
||||
#Fuse m1284p internal Osz. Long startuptime
|
||||
# avrdude -c usbasp-clone -p m1284p -U lfuse:w:0xe2:m -U hfuse:w:0xd9:m -U efuse:w:0xff:m
|
||||
|
||||
|
||||
161
Firmware/README.md
Normal file
161
Firmware/README.md
Normal file
@@ -0,0 +1,161 @@
|
||||
# DMM Demo
|
||||
|
||||
Beispielprojekt zur Demonstration der wesentlichen Funktionen des DMM-Boards.
|
||||
Wird auch zur Installation des Bootloaders und Test nach der Inbetriebnahme
|
||||
eingesetzt.
|
||||
|
||||
## Anleitung
|
||||
|
||||
### Build-System und Entwicklungsumgebung
|
||||
|
||||
Als plattformübergreifendes Build-System Dient das
|
||||
[PlatformIO](https://platformio.org/). Diese steht sowohl als
|
||||
Kommandozeilen-Tool, als auch als [Erweiterung](https://marketplace.visualstudio.com/items?itemName=platformio.platformio-ide)
|
||||
zum [Visual Studio Code](https://code.visualstudio.com/).
|
||||
(auch unter Linux und MacOS verfügbar!)
|
||||
|
||||
Nutzt man das VSCode, so können nach der Installation der Erweiterung die unten
|
||||
aufgeführten Befehle auch *ohne Installation der PIO im Betriebssystem* in den
|
||||
Terminals innerhalb der IDE genutzt werden. Für die Betriebssystemweite Installation
|
||||
siehe Anleitung unter [PlatformIO Core (CLI)](https://docs.platformio.org/en/latest/core/installation.html).
|
||||
|
||||
*Nur Linux:* zur Programmierung des Bootloaders mit JTAGICE muss dieser
|
||||
für nicht-root Nutzer per udev-Regel freigegeben werden. Erstelle dazu Datei
|
||||
`/etc/udev/rules.d/99-jtagice3.rules` mit:
|
||||
```
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2140", MODE="0666"
|
||||
```
|
||||
|
||||
### Auschecken und bauen
|
||||
Es sollte sichergestellt sein, dass [Git](https://git-scm.com/) installiert und
|
||||
der [eigene SSH-Schlüssel im GitLab-Profil hinterlegt](https://docs.gitlab.com/ee/ssh/)
|
||||
ist. Für Git-Anfänger finden sich im Internet zahlreiche Anleitungen, zum Beispiel
|
||||
[diese](https://www.freecodecamp.org/news/learn-the-basics-of-git-in-under-10-minutes-da548267cc91/).
|
||||
|
||||
*GUI:* VSCode unterstützt Git direkt und kann nach der Einrichtung als GUI
|
||||
genutzt werden.
|
||||
|
||||
Auschecken:
|
||||
```
|
||||
$ git clone git@git.rz.tu-bs.de:emg/lehre/dmm/dmm-demo.git
|
||||
$ cd dmm-demo
|
||||
```
|
||||
|
||||
Es sind dre PlatformIO-Environments definiert:
|
||||
* `release` wird standardmäßig
|
||||
genutzt und ist auf die Programmierung per Bootloader ausgelegt.
|
||||
* `debug` wird
|
||||
für das Debugging mittels avr-stub genutzt.
|
||||
* `jtag` wird zum Aufspielen des Bootloaders mittels externem
|
||||
JTAGICE3 Programmer genutzt.
|
||||
|
||||
> **In `debug` darf daher kein UART genutzt werden, da es zur Kommunikation mit
|
||||
> GDB dient**. Entsprechende Programmteile müssen gegebenenfalls mit
|
||||
>`#ifndef GDBSTUB` deaktiviert werden!
|
||||
|
||||
Bauen von `release`:
|
||||
```
|
||||
$ pio run -e release
|
||||
```
|
||||
|
||||
Bauen von `debug`:
|
||||
```
|
||||
$ pio run -e debug
|
||||
|
||||
```
|
||||
Wenn man `-e <environment>` weglässt, wird immer `debug` gebaut, da dies die
|
||||
Standartkonfiguration ist, die von dem Debugger von VSCode genutzt werden soll.
|
||||
|
||||
Die für die DMM-Projekte vorgesehenen
|
||||
[Bibliotheken](git@git.rz.tu-bs.de:emg/lehre/dmm/dmm-libs.git) sowie die
|
||||
Toolchain werden durch `pio run` automatisch heruntergeladen und müssen nicht
|
||||
extra installiert werden. Die Bibliotheken werden dabei im Ordner
|
||||
`dmm-demo/depends` hinterlegt.
|
||||
|
||||
### Programmierung & Nutzung
|
||||
|
||||
*GUI*: die hier aufgeführten Befehle können auch aus dem PlatformIO-Toolbar des
|
||||
VSCode per Mausklick ausgeführt werden.
|
||||
#### Aufspielen des Bootloaders
|
||||
|
||||
Auf einem neuen Board muss zunächst mittels JTAGICE3 ein Bootloader aufgespielt
|
||||
werden. Dazu wird es mit dem JTAG-Header verbunden (Polung beachten!).
|
||||
```
|
||||
$ pio run -t bootloader -e jtag
|
||||
```
|
||||
|
||||
> Sollte es beim Aufruf zum Fehler `TypeError: expected str, bytes or
|
||||
> os.PathLike object, not NoneType ...
|
||||
> join(platform.get_package_dir("tool-avrdude"), "avrdude.conf")`
|
||||
> kommen, kann dieser durch einmaliges Aufrufen von
|
||||
> `$ pio run -t upload -e jtag`
|
||||
> vor der Installation des Bootloaders behoben werden.
|
||||
|
||||
#### Aufspielen des Programms
|
||||
|
||||
Das Board muss per USB verbunden und Bootloader gestarted werden.
|
||||
**Zum Start des Bootloaders den Joystick in Richtung unten halten, Reset-Taste
|
||||
drücken und den Joystick loslassen. Die Aktivierung des Bootloaders erkennt man
|
||||
an dreimaligem Blinken und anschließendem Dauerleuchten der LED4 auf dem Board**.
|
||||
```
|
||||
$ pio run -e release -t upload
|
||||
```
|
||||
Anschließend Reset-Taste drücken um das Programm zu starten.
|
||||
|
||||
#### UART-Kommunikation
|
||||
|
||||
Ein Teil des Demos beschäftigt sich mit Kommunikation über einen virtuellen
|
||||
SerialPort via USB. Der `COMx` (Windows) oder `/dev/ttyUSBx` (Linux) Port wird
|
||||
von PlattformIO automatisch erkannt. Dies geschieht anhand des `hwid` Parameters
|
||||
unter `boards/emgdmm_v3.json`, der den VID/PID des FTDI-Chips des DMM-Boards
|
||||
angibt. Ein Terminal kann somit einfach geöffnet werden:
|
||||
```
|
||||
$ pio device monitor
|
||||
```
|
||||
|
||||
Beim Drücken des Joystick im entsprechenden Teil des Demos wird nun eine Meldung
|
||||
angezeigt.
|
||||
|
||||
#### Unit-Test
|
||||
|
||||
Die Demo enthält im Ordner `tests` einen Beispiel zur Ausführung von Unit-Tests
|
||||
auf dem Mikrocontroller. Dazu muss wie oben beschrieben der Bootloader aktiviert
|
||||
werden.
|
||||
```
|
||||
$ pio test
|
||||
```
|
||||
Nach dem Befehl wird eine Firmware auf das Board heruntergeladen, die bei der
|
||||
Ausführung per UART (wie auch bei `pio device monitor`) die Ergebnisse der
|
||||
Tests im Terminal ausgibt.
|
||||
|
||||
#### Debugging mit avr-stub
|
||||
|
||||
Normallerweise ist zum Debuggen (also Setzen von Breakpoints und Auslesen der
|
||||
Register) ein JTAG-Adapter notwendig. PlattformIO kann
|
||||
mittels einer [Bibliothek](https://github.com/jdolinay/avr_debug) die Funktion
|
||||
der Hardware-Debugger unter Inkaufnahme einiger Nachteile teilweise ersetzen.
|
||||
Die Kommunikation erfolgt dabei per UART, der nicht mehr im eigenen Programm
|
||||
genutzt werden kann.
|
||||
Die Konfiguration `debug` bindet die nötige Bibliothek ein, und schaltet
|
||||
Optimierung über das Setzen von `build_type` aus und definiert `GDBSTUB`. Am
|
||||
Anfang des programms muss `debug_init()` aus `avr8-stub.h` aufgerufen werden.
|
||||
|
||||
Debugging wird in VScode mittels "Run & Debug" Tab gestartet. Vorher muss
|
||||
der Bootloader aktiv sein.
|
||||
|
||||
Zu beachten ist:
|
||||
* Beakpoints funktionieren nur in Programmteilen, wo Interrupts aktiviert
|
||||
sind. **Das setzen eines Breakpoints innerhalb einer Interruptroutine führt
|
||||
immer zum Aufhängen des Programms**.
|
||||
* Breakpoints werden über das Neuschreiben vom Flash gesetzt. Dies hat einen
|
||||
Verschleiß zufolge, da der Flash nur für 10000 Schreibzyklen ausgelegt ist.
|
||||
Das "Steppen" einzelner Befehle ist daher sparsam zu verwenden.
|
||||
* Der Debugger nutzt den Watchdog-Interrupt, daher darf WDT nicht vom Programm
|
||||
genutzt werden. Außerdem können die gelegentlichen Interrupts die Timings
|
||||
beeinflussen.
|
||||
|
||||
> **TODO:** aktuell muss der Port des Debuggers manuell in `platformio.ini`
|
||||
> unter `debug_port` gesetzt werden!
|
||||
> (z.B. `/dev/ttyUSBx` unter Linux oder `COMx` unter Windows).
|
||||
> Für automatisches Auflösen des Ports siehe
|
||||
> [Issue 253](https://github.com/platformio/platform-atmelavr/issues/253).
|
||||
40
Firmware/boards/emgdmm_v3.json
Normal file
40
Firmware/boards/emgdmm_v3.json
Normal file
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"build": {
|
||||
"f_cpu": "16000000L",
|
||||
"hwids": [
|
||||
[
|
||||
"0x0403",
|
||||
"0x6001"
|
||||
]
|
||||
],
|
||||
"mcu": "atmega1284p"
|
||||
},
|
||||
"platforms": [
|
||||
"atmelavr"
|
||||
],
|
||||
"name": "EMG DMM Board",
|
||||
"upload": {
|
||||
"maximum_ram_size": 16384,
|
||||
"maximum_size": 130048,
|
||||
"protocol": "arduino",
|
||||
"require_upload_port": true
|
||||
},
|
||||
"bootloader": {
|
||||
"file": "boards/optiboot_atmega1284p_dmm.hex",
|
||||
"lfuse": "0xFF",
|
||||
"hfuse": "0x9C",
|
||||
"efuse": "0xFC",
|
||||
"lock_bits": "0xFF"
|
||||
},
|
||||
"debug": {
|
||||
"simavr_target": "atmega1284p",
|
||||
"avr-stub": {
|
||||
"speed": 115200
|
||||
}
|
||||
},
|
||||
"test": {
|
||||
"speed": 115200
|
||||
},
|
||||
"url": "https://www.emg.tu-bs.de/lehre/vl/vl_dmm_d.html",
|
||||
"vendor": "EMG, TU Braunschweig"
|
||||
}
|
||||
55
Firmware/boards/optiboot_atmega1284p_dmm.hex
Normal file
55
Firmware/boards/optiboot_atmega1284p_dmm.hex
Normal file
@@ -0,0 +1,55 @@
|
||||
:020000021000EC
|
||||
:10FC000001C020C1112484B7882391F00E98169A60
|
||||
:10FC100090B1282F2A70223011F496FF09C081FF7D
|
||||
:10FC200002C097EF94BF282E80E0F7D00C9400001C
|
||||
:10FC300085E08093810082E08093C00088E180931A
|
||||
:10FC4000C10086E08093C20080E18093C40080E020
|
||||
:10FC5000E4D0239A86E020E33CEF91E030938500E6
|
||||
:10FC60002093840096BBB09BFECF1B9AA895409131
|
||||
:10FC7000C00047FD02C0815089F743E0B42EAA249A
|
||||
:10FC8000A39451E1752EBDD0813471F4BAD0C82F40
|
||||
:10FC9000CAD081E0C23821F088E0C13809F083E0A1
|
||||
:10FCA000A9D080E1A7D0EFCF823419F484E1C3D08A
|
||||
:10FCB000F8CF853411F485E0FACF853581F4A1D0F1
|
||||
:10FCC000082F9FD0182F87FF07C08BB781608BBF8D
|
||||
:10FCD000000F111FA8D0E5CF8BB78E7FF8CF8635E8
|
||||
:10FCE00081F48FD08D3459F48CD0CBB78AD0C170C9
|
||||
:10FCF000880F8C2B8BBF81E09ED080E0D1CF83E03A
|
||||
:10FD0000FBCF843609F046C07CD0E82EF12CFE2CC7
|
||||
:10FD1000EE2477D0E82A75D0682EE701C12CDD24C7
|
||||
:10FD2000D39446018FEFC81AD80A6BD0F4018083B0
|
||||
:10FD30002197B9F778D0F5E46F120DC0FE01F39565
|
||||
:10FD4000EC16FD0609F4ADCF6081CE01800F911F46
|
||||
:10FD500091D02196F3CFF801B7BEE89507B600FC25
|
||||
:10FD6000FDCFFE01E00FF11FDE01B3958D919C9157
|
||||
:10FD70000C01A7BEE89511242296EC16FD0689F722
|
||||
:10FD800085E0F80187BFE89507B600FCFDCF77BE98
|
||||
:10FD9000E89587CF8437F9F434D0C82FD0E0DC2F32
|
||||
:10FDA000CC272FD0C82B2DD0D82E3DD07801F5E40C
|
||||
:10FDB000DF120AC0C70156D01DD021978FEFE81A75
|
||||
:10FDC000F80A2097B9F76DCFF70187917F0112D01C
|
||||
:10FDD0002197D1F766CF853739F425D08EE10AD047
|
||||
:10FDE00087E908D085E05CCF813509F073CF88E0E2
|
||||
:10FDF00014D070CF9091C00095FFFCCF8093C600C7
|
||||
:10FE000008958091C00087FFFCCF8091C00084FDE1
|
||||
:10FE100001C0A8958091C6000895E0E6F0E098E161
|
||||
:10FE2000908380830895EDDF803219F088E0F5DF5C
|
||||
:10FE3000FFCF84E1DFCFCF93C82FE3DFC150E9F7D5
|
||||
:10FE4000CF91F1CFFC010A0167BFE895112407B6F5
|
||||
:10FE500000FCFDCF667029F0452B19F481E187BFC6
|
||||
:10FE6000E8950895F999FECF92BD81BDF89A99273A
|
||||
:10FE700080B50895262FF999FECF1FBA92BD81BD96
|
||||
:10FE800020BD0FB6F894FA9AF99A0FBE019608951C
|
||||
:10FE900056657273696F6E3D382E31004F5054496C
|
||||
:10FEA000424F4F545F435553544F4D5645523D308A
|
||||
:10FEB000004465766963653D61746D6567613132E3
|
||||
:10FEC00038347000465F4350553D31363030303065
|
||||
:10FED00030304C00424947424F4F543D310042754B
|
||||
:10FEE000696C743A41707220313820323032313AC4
|
||||
:10FEF00032323A30333A303000554152543D3000BE
|
||||
:10FF0000424155445F524154453D313135323030E4
|
||||
:10FF1000004C45443D4233004C45445F53544152EC
|
||||
:0CFF2000545F464C41534845533D3300AC
|
||||
:02FFFE000108F8
|
||||
:040000031000FC00ED
|
||||
:00000001FF
|
||||
39
Firmware/include/README
Normal file
39
Firmware/include/README
Normal file
@@ -0,0 +1,39 @@
|
||||
|
||||
This directory is intended for project header files.
|
||||
|
||||
A header file is a file containing C declarations and macro definitions
|
||||
to be shared between several project source files. You request the use of a
|
||||
header file in your project source file (C, C++, etc) located in `src` folder
|
||||
by including it, with the C preprocessing directive `#include'.
|
||||
|
||||
```src/main.c
|
||||
|
||||
#include "header.h"
|
||||
|
||||
int main (void)
|
||||
{
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
Including a header file produces the same results as copying the header file
|
||||
into each source file that needs it. Such copying would be time-consuming
|
||||
and error-prone. With a header file, the related declarations appear
|
||||
in only one place. If they need to be changed, they can be changed in one
|
||||
place, and programs that include the header file will automatically use the
|
||||
new version when next recompiled. The header file eliminates the labor of
|
||||
finding and changing all the copies as well as the risk that a failure to
|
||||
find one copy will result in inconsistencies within a program.
|
||||
|
||||
In C, the usual convention is to give header files names that end with `.h'.
|
||||
It is most portable to use only letters, digits, dashes, and underscores in
|
||||
header file names, and at most one dot.
|
||||
|
||||
Read more about using header files in official GCC documentation:
|
||||
|
||||
* Include Syntax
|
||||
* Include Operation
|
||||
* Once-Only Headers
|
||||
* Computed Includes
|
||||
|
||||
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
|
||||
43
Firmware/include/music.h
Normal file
43
Firmware/include/music.h
Normal file
@@ -0,0 +1,43 @@
|
||||
#ifndef MUSIC_H_
|
||||
#define MUSIC_H_
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint16_t tone;
|
||||
uint16_t duration;
|
||||
} MUSIC_Note;
|
||||
|
||||
#define MUSIC_END { 0, 0 }
|
||||
#define MUSIC_IS_END(_note_) (!((_note_).tone) && !((_note_).duration))
|
||||
|
||||
#define MUSIC_A4 440
|
||||
#define MUSIC_B4 494
|
||||
#define MUSIC_C4 262
|
||||
#define MUSIC_D4 293
|
||||
#define MUSIC_E4 330
|
||||
#define MUSIC_F4 349
|
||||
#define MUSIC_G4 392
|
||||
|
||||
#define MUSIC_A5 880
|
||||
#define MUSIC_B5 988
|
||||
#define MUSIC_C5 523
|
||||
#define MUSIC_D5 587
|
||||
#define MUSIC_E5 659
|
||||
#define MUSIC_F5 698
|
||||
#define MUSIC_G5 784
|
||||
|
||||
#define MUSIC_1 1000
|
||||
#define MUSIC_2 (MUSIC_1/2)
|
||||
#define MUSIC_4 (MUSIC_1/4)
|
||||
#define MUSIC_8 (MUSIC_1/8)
|
||||
#define MUSIC_16 (MUSIC_1/16)
|
||||
#define MUSIC_32 (MUSIC_1/32)
|
||||
|
||||
|
||||
typedef const MUSIC_Note* MUSIC_Track;
|
||||
extern const MUSIC_Note MUSIC_Tetris[];
|
||||
|
||||
void Music_PlayTrack (MUSIC_Track track);
|
||||
|
||||
|
||||
#endif /* MUSIC_H_ */
|
||||
46
Firmware/lib/README
Normal file
46
Firmware/lib/README
Normal file
@@ -0,0 +1,46 @@
|
||||
|
||||
This directory is intended for project specific (private) libraries.
|
||||
PlatformIO will compile them to static libraries and link into executable file.
|
||||
|
||||
The source code of each library should be placed in a an own separate directory
|
||||
("lib/your_library_name/[here are source files]").
|
||||
|
||||
For example, see a structure of the following two libraries `Foo` and `Bar`:
|
||||
|
||||
|--lib
|
||||
| |
|
||||
| |--Bar
|
||||
| | |--docs
|
||||
| | |--examples
|
||||
| | |--src
|
||||
| | |- Bar.c
|
||||
| | |- Bar.h
|
||||
| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
|
||||
| |
|
||||
| |--Foo
|
||||
| | |- Foo.c
|
||||
| | |- Foo.h
|
||||
| |
|
||||
| |- README --> THIS FILE
|
||||
|
|
||||
|- platformio.ini
|
||||
|--src
|
||||
|- main.c
|
||||
|
||||
and a contents of `src/main.c`:
|
||||
```
|
||||
#include <Foo.h>
|
||||
#include <Bar.h>
|
||||
|
||||
int main (void)
|
||||
{
|
||||
...
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
PlatformIO Library Dependency Finder will find automatically dependent
|
||||
libraries scanning project source files.
|
||||
|
||||
More information about PlatformIO Library Dependency Finder
|
||||
- https://docs.platformio.org/page/librarymanager/ldf.html
|
||||
55
Firmware/platformio.ini
Normal file
55
Firmware/platformio.ini
Normal file
@@ -0,0 +1,55 @@
|
||||
; PlatformIO Project Configuration File
|
||||
;
|
||||
; Please visit documentation for the other options and examples
|
||||
; https://docs.platformio.org/page/projectconf.html
|
||||
|
||||
[platformio]
|
||||
default_envs = debug
|
||||
libdeps_dir = depends
|
||||
|
||||
[env]
|
||||
platform = atmelavr @ ^3.3.0
|
||||
|
||||
board = emgdmm_v3
|
||||
monitor_speed = 9600
|
||||
test_transport = custom
|
||||
test_speed = 115200
|
||||
|
||||
lib_deps =
|
||||
git@git.rz.tu-bs.de:emg/lehre/dmm/dmm-libs.git
|
||||
|
||||
[env:release] ; for flash via bootloader
|
||||
; keep defaults, see board definitions for programming support
|
||||
|
||||
|
||||
[env:debug] ; for debugging using avr-stub, see documentation
|
||||
build_type = debug
|
||||
build_flags =
|
||||
-D DEBUG
|
||||
-D GDBSTUB ; program should disable any own UART use if this is defined
|
||||
-D AVR8_BREAKPOINT_MODE=2
|
||||
|
||||
debug_tool = avr-stub
|
||||
;debug_port = /dev/ttyUSB0 ; Linux Port TODO: this should be infered automagically
|
||||
debug_port = COM6 ; Windows COM Port
|
||||
|
||||
; add GDB stub implementation
|
||||
lib_deps =
|
||||
${env.lib_deps}
|
||||
jdolinay/avr-debugger @ ^1.3
|
||||
|
||||
|
||||
[env:jtag] ; for JTAG bootloader flashing and potentialy debugging once supported
|
||||
build_type = debug
|
||||
build_flags =
|
||||
-D DEBUG
|
||||
|
||||
upload_protocol = jtag3
|
||||
upload_flags = -p, atmega1284, -F ; fix signature error with JTAGICE
|
||||
upload_port = usb
|
||||
|
||||
; Atmel-ICE based AVR debug is not directly supported by PIO as of 04.2020. As not
|
||||
; available at home, not an issue for DMM at the moment.
|
||||
; Potentially solveable by using avarice as a server.
|
||||
; See: https://github.com/platformio/platform-atmelavr/issues/53
|
||||
|
||||
551
Firmware/src/main.c
Normal file
551
Firmware/src/main.c
Normal file
@@ -0,0 +1,551 @@
|
||||
#include <avr/io.h>
|
||||
#include <avr/interrupt.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <util/delay.h>
|
||||
#include <avr/pgmspace.h>
|
||||
|
||||
#ifdef GDBSTUB
|
||||
#include "avr8-stub.h"
|
||||
#else
|
||||
#include "uart.h"
|
||||
#endif
|
||||
|
||||
#include "lcd.h"
|
||||
#include "twi.h"
|
||||
#include "dataflash.h"
|
||||
#include "music.h"
|
||||
|
||||
#define wait_joy_button() \
|
||||
{ \
|
||||
LCD_GotoXY(20, 7); \
|
||||
LCD_PutChar(0x10); \
|
||||
LCD_Update(); \
|
||||
while (((PINA)&0x08)) \
|
||||
; \
|
||||
while (!((PINA)&0x08)) \
|
||||
; \
|
||||
_delay_ms(20); \
|
||||
while (((PINA)&0x08)) \
|
||||
; \
|
||||
}
|
||||
|
||||
/* clang-format off */
|
||||
const uint8_t PROGMEM emg_logo[640] =
|
||||
{
|
||||
0x80, 0xe0, 0xf0, 0xf8, 0xf8, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
|
||||
0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
|
||||
0xfc, 0xfc, 0xfc, 0xfc, 0xf8, 0xf8, 0xf0, 0xe0, 0x80, 0x00, 0x00, 0xfc,
|
||||
0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xf0, 0xf8, 0xfc, 0xfc,
|
||||
0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
|
||||
0xfc, 0xf8, 0xf8, 0xf0, 0xe0, 0xc0, 0xe0, 0xf0, 0xf8, 0xf8, 0xfc, 0xfc,
|
||||
0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
|
||||
0xfc, 0xfc, 0xf8, 0xf8, 0xf0, 0xe0, 0x80, 0x00, 0x00, 0x80, 0xe0, 0xf0,
|
||||
0xf8, 0xf8, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
|
||||
0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
|
||||
0xfc, 0xfc, 0xfc, 0xf8, 0xf8, 0xf0, 0xe0, 0x80, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf3, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1,
|
||||
0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf7, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x1f, 0x07, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||
0x01, 0x01, 0x01, 0x01, 0x03, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x07, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||
0x01, 0x01, 0x01, 0x01, 0x03, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0x1f, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||
0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xf1, 0xe1, 0xc1, 0xc1, 0x81, 0x81, 0x81, 0x81, 0xc1, 0xc1, 0xc1,
|
||||
0xc1, 0xc1, 0xc1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1,
|
||||
0xe1, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0,
|
||||
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
|
||||
0xc0, 0xe0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0x00, 0x01, 0x07, 0x07, 0x0f, 0x0f, 0x0f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
|
||||
0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
|
||||
0x1f, 0x1f, 0x0f, 0x0f, 0x0f, 0x07, 0x07, 0x03, 0x00, 0x00, 0x00, 0x1f,
|
||||
0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f,
|
||||
0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f,
|
||||
0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x03, 0x07,
|
||||
0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
|
||||
0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x8f, 0xcf, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x1f, 0x1f, 0x1f,
|
||||
0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
|
||||
0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
|
||||
0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
|
||||
0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
|
||||
0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
|
||||
0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
|
||||
0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
|
||||
0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
|
||||
0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
|
||||
0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
|
||||
0x1f, 0x0f, 0x07, 0x01,
|
||||
};
|
||||
/* clang-format on */
|
||||
|
||||
void demo_backlight(void);
|
||||
void demo_start(void);
|
||||
void demo_display(void);
|
||||
void demo_show_emg(void);
|
||||
void demo_uart(void);
|
||||
void demo_music(void);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
// set PA3-PA7 as input and activated internal Pull-Up
|
||||
DDRA &= ~((1 << PINA3) | (1 << PINA4) | (1 << PINA5) | (1 << PINA6) | (1 << PINA7)); // Required for DMM Board 2013
|
||||
PORTA |= ((1 << PINA3) | (1 << PINA4) | (1 << PINA5) | (1 << PINA6) | (1 << PINA7)); // Required for DMM Board 2013
|
||||
|
||||
// set PB0-PB3 as output
|
||||
DDRB = 0x0F;
|
||||
// set PB0-PB3 on high-level
|
||||
PORTB |= 0x0F; // Required for DMM Board DMM Board 2013
|
||||
|
||||
#ifdef GDBSTUB
|
||||
debug_init(); // required for debugging via UART
|
||||
#else
|
||||
UART_Init();
|
||||
#endif
|
||||
|
||||
LCD_Init();
|
||||
sei(); // enable interrupts after drivers initialized
|
||||
|
||||
//demo_start();
|
||||
//demo_show_emg();
|
||||
|
||||
//#ifndef GDBSTUB // UART unavailable if used by GDB stub for debugging
|
||||
//demo_uart();
|
||||
//#endif
|
||||
|
||||
//demo_display();
|
||||
//demo_backlight();
|
||||
//demo_music();
|
||||
|
||||
Backlight_LED(BL_GREEN_ON);
|
||||
|
||||
|
||||
//Backlight_Off();
|
||||
//LCD_Clear();
|
||||
|
||||
// loop forever
|
||||
uint32_t counter = 0;
|
||||
uint8_t button_state = 1;
|
||||
uint8_t button_state_old = 1;
|
||||
while (1){
|
||||
button_state = !(PINA & 0x08);
|
||||
|
||||
if( button_state == 1 && button_state_old == 0 ){
|
||||
_delay_ms(20);
|
||||
counter = 0;
|
||||
}
|
||||
if( button_state == 0 && button_state_old == 1 ){
|
||||
_delay_ms(20);
|
||||
|
||||
/* print to LCD */
|
||||
LCD_Clear();
|
||||
LCD_GotoXY(0, 0);
|
||||
char msg[20];
|
||||
sprintf(msg, "time: %d", counter);
|
||||
LCD_PutString(msg);
|
||||
LCD_Update();
|
||||
/* ------------ */
|
||||
|
||||
counter = 0;
|
||||
}
|
||||
|
||||
counter++;
|
||||
button_state_old = button_state;
|
||||
_delay_ms(1);
|
||||
}
|
||||
}
|
||||
|
||||
void demo_start(void)
|
||||
{
|
||||
// Turn on green backlight
|
||||
Backlight_LED(BL_GREEN_ON);
|
||||
|
||||
// Place program memory strings in framebuffer
|
||||
LCD_PutString_P(PSTR("-DMM AVR-Board Demo- \r\n\n"));
|
||||
LCD_PutString_P(PSTR("Always push the \r\n"));
|
||||
LCD_PutString_P(PSTR("joystick button to \r\n"));
|
||||
LCD_PutString_P(PSTR("proceed to the next \r\n"));
|
||||
LCD_PutString_P(PSTR("screen. \r\n\n"));
|
||||
LCD_PutString_P(PSTR("Enjoy the Fuck You! "));
|
||||
|
||||
// Copy framebuffer to display
|
||||
LCD_Update();
|
||||
|
||||
// Wait for joystick button
|
||||
wait_joy_button();
|
||||
}
|
||||
|
||||
void demo_show_emg(void)
|
||||
{
|
||||
// Some counters
|
||||
uint16_t emg_offset = 0;
|
||||
uint8_t fb_x;
|
||||
uint8_t fb_y;
|
||||
|
||||
// Turn on white backlight (red, green and blue)
|
||||
Backlight_LED(BL_RED_ON | BL_GREEN_ON | BL_BLUE_ON);
|
||||
|
||||
// Clear precautionally
|
||||
LCD_Clear();
|
||||
|
||||
// Copy emglogo into framebuffer
|
||||
for (fb_y = 0; fb_y < 5; fb_y++)
|
||||
for (fb_x = 0; fb_x < 128; fb_x++)
|
||||
lcd_framebuffer[fb_y][fb_x] = pgm_read_byte(&emg_logo[emg_offset++]);
|
||||
|
||||
// Mark pages 0-4 for update
|
||||
lcd_frameupdate = 0x1f;
|
||||
|
||||
// Add some text
|
||||
LCD_GotoXY(0, 5);
|
||||
LCD_PutString_P(PSTR(" Institut f\x81r Messt. \r\n"));
|
||||
LCD_PutString_P(PSTR(" und Grundlagen der \r\n"));
|
||||
LCD_PutString_P(PSTR(" Elektrotechnik \r\n"));
|
||||
|
||||
// And copy framebuffer to display
|
||||
LCD_Update();
|
||||
|
||||
wait_joy_button();
|
||||
}
|
||||
|
||||
#ifndef GDBSTUB
|
||||
void demo_uart(void)
|
||||
{
|
||||
unsigned char loop = 1;
|
||||
signed int c;
|
||||
char buffer[10];
|
||||
|
||||
LCD_Clear();
|
||||
Backlight_LED(BL_BLUE_ON);
|
||||
|
||||
LCD_GotoXY(0, 0);
|
||||
LCD_PutString_P(PSTR("UART-Demonstration \r\n\n"));
|
||||
LCD_PutString_P(PSTR("Setup your terminal: \r\n"));
|
||||
LCD_PutString_P(PSTR("9600 Baud, 8N1 \r\n"));
|
||||
LCD_PutString_P(PSTR("Use joystick to send \r\n"));
|
||||
LCD_PutString_P(PSTR("some strings. \r\n"));
|
||||
|
||||
LCD_GotoXY(20, 7);
|
||||
LCD_PutChar(0x10);
|
||||
|
||||
LCD_Update();
|
||||
|
||||
while ((!((PINA)&0x08)))
|
||||
;
|
||||
_delay_ms(20);
|
||||
while (!((PINA)&0x08))
|
||||
;
|
||||
|
||||
while (loop)
|
||||
{
|
||||
// Get net character from uart fifo
|
||||
c = UART_GetChar();
|
||||
|
||||
// c = -1 means fifo empty
|
||||
if (c > -1)
|
||||
{
|
||||
// wipe last lcd line
|
||||
LCD_WipeLine(7);
|
||||
|
||||
LCD_GotoXY(0, 7);
|
||||
LCD_PutString_P(PSTR("RX-ASCII-Code: "));
|
||||
// Convert interger to ascii
|
||||
itoa(c, buffer, 10);
|
||||
|
||||
LCD_PutString(buffer);
|
||||
LCD_GotoXY(20, 7);
|
||||
LCD_PutChar(0x10);
|
||||
LCD_Update();
|
||||
_delay_ms(10);
|
||||
}
|
||||
|
||||
_delay_ms(20);
|
||||
while (!((PINA)&0xF8))
|
||||
; // Different to DMM 2012 and before
|
||||
|
||||
switch (((PINA)&0xF8))
|
||||
{
|
||||
case 0x78:
|
||||
// Joystick Up
|
||||
UART_PutString("Joystick Up.\r\n");
|
||||
break;
|
||||
case 0xB8:
|
||||
// Joystick Down
|
||||
UART_PutString("Joystick Down.\r\n");
|
||||
break;
|
||||
case 0xD8:
|
||||
// Joystick Left
|
||||
UART_PutString("Joystick Left.\r\n");
|
||||
break;
|
||||
case 0xE8:
|
||||
// Joystick Right
|
||||
UART_PutString("Joystick Right.\r\n");
|
||||
break;
|
||||
case 0xF0:
|
||||
// Joystick Button
|
||||
UART_PutString("Exit.\r\n\n");
|
||||
loop = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
_delay_ms(200);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void demo_music(void)
|
||||
{
|
||||
LCD_Clear();
|
||||
Backlight_LED(BL_RED_ON);
|
||||
|
||||
LCD_GotoXY(0, 0);
|
||||
LCD_PutString_P(PSTR("Let's dance!\r\n\n"));
|
||||
LCD_PutString_P(PSTR("(Finest PWM sounds!)\r\n\n"));
|
||||
LCD_Update();
|
||||
|
||||
Music_PlayTrack(MUSIC_Tetris);
|
||||
|
||||
LCD_PutString_P(PSTR("OK, that's enough...\r\n\n"));
|
||||
LCD_Update();
|
||||
|
||||
wait_joy_button();
|
||||
}
|
||||
|
||||
void demo_display(void)
|
||||
{
|
||||
// switch white backlight on
|
||||
Backlight_LED(BL_RED_ON | BL_GREEN_ON | BL_BLUE_ON);
|
||||
|
||||
// clear display
|
||||
LCD_Clear();
|
||||
|
||||
// talking to the user
|
||||
LCD_GotoXY(0, 0);
|
||||
LCD_PutString_P(PSTR("Set some pixels."));
|
||||
|
||||
LCD_DrawPixel(10, 10, 1);
|
||||
LCD_DrawPixel(12, 44, 1);
|
||||
LCD_DrawPixel(111, 62, 1);
|
||||
LCD_DrawPixel(101, 22, 1);
|
||||
LCD_Update();
|
||||
|
||||
wait_joy_button();
|
||||
|
||||
// one display page requires 8 pages in dataflash
|
||||
LCD_SavePage(0);
|
||||
LCD_WipeLine(0);
|
||||
LCD_GotoXY(0, 0);
|
||||
LCD_PutString_P(PSTR("Connecting."));
|
||||
|
||||
LCD_DrawLine(10, 10, 12, 44, 1);
|
||||
LCD_DrawLine(12, 44, 111, 62, 1);
|
||||
LCD_DrawLine(111, 62, 101, 22, 1);
|
||||
LCD_DrawLine(101, 22, 10, 10, 1);
|
||||
LCD_Update();
|
||||
|
||||
wait_joy_button();
|
||||
|
||||
// first display page was stored at flash page 0
|
||||
// second display page will start at 8
|
||||
LCD_SavePage(8);
|
||||
LCD_WipeLine(0);
|
||||
LCD_GotoXY(0, 0);
|
||||
LCD_PutString_P(PSTR("Adding circles."));
|
||||
|
||||
LCD_DrawCircle(64, 32, 10, 1);
|
||||
LCD_DrawCircle(70, 30, 20, 1);
|
||||
LCD_Update();
|
||||
|
||||
wait_joy_button();
|
||||
|
||||
// talking to the user
|
||||
LCD_SavePage(16);
|
||||
LCD_Clear();
|
||||
LCD_GotoXY(0, 0);
|
||||
LCD_PutString_P(PSTR("Clear/Set/XOR Demo."));
|
||||
|
||||
for (unsigned int fill = 0; fill < 128; fill++)
|
||||
LCD_DrawLine(fill, 10, fill, 53, (fill / 8) & 1);
|
||||
|
||||
// Clear
|
||||
LCD_DrawLine(0, 20, 127, 20, 0);
|
||||
|
||||
// Set
|
||||
LCD_DrawLine(0, 30, 127, 30, 1);
|
||||
|
||||
// XOR
|
||||
LCD_DrawLine(0, 40, 127, 40, 2);
|
||||
|
||||
LCD_Update();
|
||||
|
||||
wait_joy_button();
|
||||
|
||||
// talking to the user
|
||||
LCD_SavePage(24);
|
||||
LCD_Clear();
|
||||
LCD_GotoXY(0, 0);
|
||||
LCD_PutString_P(PSTR("Use the joystick to\r\n"));
|
||||
LCD_PutString_P(PSTR("recall the last\r\n"));
|
||||
LCD_PutString_P(PSTR("screens. Again,\r\n"));
|
||||
LCD_PutString_P(PSTR("button means exit.\r\n"));
|
||||
LCD_Update();
|
||||
|
||||
unsigned char loop = 1;
|
||||
|
||||
while (loop)
|
||||
{
|
||||
// wait
|
||||
while ((!((PINA)&0xF8)))
|
||||
; // Different to DMM 2012 and before
|
||||
_delay_ms(300);
|
||||
while (!((PINA)&0xF8))
|
||||
; // Different to DMM 2012 and before
|
||||
|
||||
switch ((~PINA) & 0xF8) // Different to DMM 2012 and before
|
||||
{
|
||||
case 0x80:
|
||||
// UP
|
||||
LCD_LoadPage(0);
|
||||
LCD_WipeLine(0);
|
||||
LCD_GotoXY(0, 0);
|
||||
LCD_PutString_P(PSTR("Screen 1"));
|
||||
LCD_Update();
|
||||
break;
|
||||
case 0x40:
|
||||
// DOWN
|
||||
LCD_LoadPage(24);
|
||||
LCD_WipeLine(0);
|
||||
LCD_GotoXY(0, 0);
|
||||
LCD_PutString_P(PSTR("Screen 4"));
|
||||
LCD_Update();
|
||||
break;
|
||||
case 0x20:
|
||||
// LEFT
|
||||
LCD_LoadPage(8);
|
||||
LCD_WipeLine(0);
|
||||
LCD_GotoXY(0, 0);
|
||||
LCD_PutString_P(PSTR("Screen 2"));
|
||||
LCD_Update();
|
||||
break;
|
||||
case 0x10:
|
||||
// RIGHT
|
||||
LCD_LoadPage(16);
|
||||
LCD_WipeLine(0);
|
||||
LCD_GotoXY(0, 0);
|
||||
LCD_PutString_P(PSTR("Screen 3"));
|
||||
LCD_Update();
|
||||
break;
|
||||
case 0x08:
|
||||
// BUTTON
|
||||
loop = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// talking to the user
|
||||
LCD_Clear();
|
||||
LCD_GotoXY(0, 0);
|
||||
LCD_PutString_P(PSTR("Push button for\r\n"));
|
||||
LCD_PutString_P(PSTR("next demonstration.\r\n"));
|
||||
|
||||
wait_joy_button();
|
||||
}
|
||||
|
||||
void demo_backlight(void)
|
||||
{
|
||||
unsigned char led_active = 0x80;
|
||||
|
||||
// white backlight
|
||||
Backlight_LED(BL_RED_ON | BL_GREEN_ON | BL_BLUE_ON);
|
||||
|
||||
LCD_Clear();
|
||||
LCD_GotoXY(0, 0);
|
||||
LCD_PutString_P(PSTR("Use the joystick to\r\n"));
|
||||
LCD_PutString_P(PSTR("toggle the backlight\r\n"));
|
||||
LCD_PutString_P(PSTR("on the next screen."));
|
||||
LCD_Update();
|
||||
|
||||
wait_joy_button();
|
||||
|
||||
// no backlight
|
||||
Backlight_Off();
|
||||
|
||||
LCD_Clear();
|
||||
LCD_GotoXY(0, 0);
|
||||
LCD_PutString_P(PSTR(" Red \r\n"));
|
||||
LCD_PutString_P(PSTR(" \r\n"));
|
||||
LCD_PutString_P(PSTR(" \x18 \r\n"));
|
||||
LCD_PutString_P(PSTR(" Green \x1b Exit \x1a Blue \r\n"));
|
||||
LCD_PutString_P(PSTR(" \x19 \r\n"));
|
||||
LCD_PutString_P(PSTR(" \r\n"));
|
||||
LCD_PutString_P(PSTR(" Toggle \r\n"));
|
||||
LCD_PutString_P(PSTR(" all \x10\r\n"));
|
||||
LCD_Update();
|
||||
|
||||
while (!((PINA)&0x08))
|
||||
;
|
||||
_delay_ms(20);
|
||||
while (!((PINA)&0x08))
|
||||
;
|
||||
|
||||
while (led_active & 0x80)
|
||||
{
|
||||
|
||||
while ((~(PINA)&0xF8))
|
||||
; // Different to DMM 2012 and before
|
||||
_delay_ms(300);
|
||||
while (!((PINA)&0xF8))
|
||||
; // Different to DMM 2012 and before
|
||||
|
||||
switch ((~PINA) & 0xF8) // Different to DMM 2012 and before
|
||||
{
|
||||
case 0x08:
|
||||
// Button -> Exit
|
||||
led_active = 0x00;
|
||||
|
||||
break;
|
||||
case 0x80:
|
||||
// Up -> Toggle Red
|
||||
led_active ^= 0x01;
|
||||
break;
|
||||
case 0x20:
|
||||
// Up -> Toggle Green
|
||||
led_active ^= 0x04;
|
||||
break;
|
||||
case 0x10:
|
||||
// Up -> Toggle Blue
|
||||
led_active ^= 0x10;
|
||||
break;
|
||||
case 0x40:
|
||||
// Up -> Toggle All
|
||||
led_active ^= 0x15;
|
||||
break;
|
||||
}
|
||||
|
||||
while (!(PINA & 0xf8))
|
||||
;
|
||||
|
||||
Backlight_LED(led_active & 0x15);
|
||||
|
||||
PORTB &= ~0x0f;
|
||||
if (led_active & 0x01)
|
||||
PORTB |= 0x01;
|
||||
if (led_active & 0x04)
|
||||
PORTB |= 0x02;
|
||||
if (led_active & 0x10)
|
||||
PORTB |= 0x04;
|
||||
}
|
||||
|
||||
LCD_Clear();
|
||||
}
|
||||
109
Firmware/src/music.c
Normal file
109
Firmware/src/music.c
Normal file
@@ -0,0 +1,109 @@
|
||||
#include <stdint.h>
|
||||
#include <avr/io.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#include <util/delay.h>
|
||||
#include <util/atomic.h>
|
||||
|
||||
#include "music.h"
|
||||
|
||||
/* Sine lookup table for the PWM generator (pp = 32) */
|
||||
static const PROGMEM unsigned char sine_lookup[]={
|
||||
0x10,0x13,0x16,0x19,0x1b,0x1d,0x1f,0x20,
|
||||
0x20,0x20,0x1f,0x1d,0x1b,0x19,0x16,0x13,
|
||||
0x10,0x0d,0x0a,0x07,0x05,0x03,0x01,0x00,
|
||||
0x00,0x00,0x01,0x03,0x05,0x07,0x0a,0x0d
|
||||
};
|
||||
|
||||
const MUSIC_Note MUSIC_Tetris[] = {
|
||||
{ MUSIC_E5, MUSIC_4 },
|
||||
{ MUSIC_B4, MUSIC_8 },
|
||||
{ MUSIC_C5, MUSIC_8 },
|
||||
{ MUSIC_D5, MUSIC_4 },
|
||||
{ MUSIC_C5, MUSIC_8 },
|
||||
{ MUSIC_D5, MUSIC_8 },
|
||||
|
||||
{ MUSIC_A4, MUSIC_4 },
|
||||
{ MUSIC_A4, MUSIC_8 },
|
||||
{ MUSIC_C5, MUSIC_8 },
|
||||
{ MUSIC_E5, MUSIC_4 },
|
||||
{ MUSIC_D5, MUSIC_8 },
|
||||
{ MUSIC_C5, MUSIC_8 },
|
||||
|
||||
{ MUSIC_B4, MUSIC_4 + MUSIC_8 },
|
||||
{ MUSIC_C5, MUSIC_8 },
|
||||
{ MUSIC_D5, MUSIC_4 },
|
||||
{ MUSIC_E5, MUSIC_4 },
|
||||
|
||||
{ MUSIC_C5, MUSIC_4 },
|
||||
{ MUSIC_A4, MUSIC_4 },
|
||||
{ MUSIC_A4, MUSIC_8 },
|
||||
|
||||
MUSIC_END };
|
||||
|
||||
static void delay_ms(uint16_t delay);
|
||||
static void pwm_init (void);
|
||||
static void pwm_deinit (void);
|
||||
static void pwm_gen(uint16_t tone, uint16_t periods);
|
||||
|
||||
void Music_PlayTrack (MUSIC_Track track)
|
||||
{
|
||||
pwm_init();
|
||||
|
||||
while (!MUSIC_IS_END(*track)) {
|
||||
|
||||
if (track->tone == 0) {
|
||||
delay_ms(track->duration);
|
||||
} else {
|
||||
uint16_t periods = (uint32_t)track->duration * (uint32_t)track->tone / 1000;
|
||||
pwm_gen(track->tone, periods);
|
||||
|
||||
delay_ms(MUSIC_32 / 2);
|
||||
}
|
||||
|
||||
++track;
|
||||
}
|
||||
|
||||
pwm_deinit();
|
||||
}
|
||||
|
||||
static void delay_ms(uint16_t delay)
|
||||
{
|
||||
while (delay--)
|
||||
_delay_ms(1);
|
||||
}
|
||||
|
||||
void pwm_init (void)
|
||||
{
|
||||
//setup PWM timer
|
||||
DDRD |= _BV(PIND5); // speaker pin => output
|
||||
TCCR1A = _BV(COM1A1) | _BV(COM1A0) | _BV(WGM10); //set on match
|
||||
TCCR1B = _BV(CS10) | _BV(WGM12); //fast PWM (8 bit), clk/1 source
|
||||
|
||||
//setup sample timer (CTC Mode)
|
||||
TCCR3A = 0;
|
||||
TCCR3B = _BV(CS30) | _BV(WGM32); // clk/1
|
||||
}
|
||||
|
||||
void pwm_deinit (void)
|
||||
{
|
||||
TCCR1A = 0;
|
||||
TCCR1B = 0;
|
||||
TCCR3A = 0;
|
||||
TCCR3B = 0;
|
||||
}
|
||||
|
||||
void pwm_gen(uint16_t tone, uint16_t periods)
|
||||
{
|
||||
//calculate single sine sample duration
|
||||
OCR3A = F_CPU / tone / sizeof(sine_lookup) - 1;
|
||||
|
||||
for (uint16_t period=0; period < periods; ++period) {
|
||||
for (uint8_t spl=0; spl < sizeof(sine_lookup); ++spl) {
|
||||
//wait for timer ready for next spl
|
||||
loop_until_bit_is_set(TIFR3, OCF1A);
|
||||
TIFR3 = _BV(OCF1A); //clear OCF
|
||||
|
||||
OCR1A = pgm_read_byte(sine_lookup + spl) + 0x70;
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Firmware/test/README
Normal file
11
Firmware/test/README
Normal file
@@ -0,0 +1,11 @@
|
||||
|
||||
This directory is intended for PIO Unit Testing and project tests.
|
||||
|
||||
Unit Testing is a software testing method by which individual units of
|
||||
source code, sets of one or more MCU program modules together with associated
|
||||
control data, usage procedures, and operating procedures, are tested to
|
||||
determine whether they are fit for use. Unit testing finds problems early
|
||||
in the development cycle.
|
||||
|
||||
More information about PIO Unit Testing:
|
||||
- https://docs.platformio.org/page/plus/unit-testing.html
|
||||
41
Firmware/test/test_demo.c
Normal file
41
Firmware/test/test_demo.c
Normal file
@@ -0,0 +1,41 @@
|
||||
#include <stdint.h>
|
||||
#include <unity.h>
|
||||
#include <util/delay.h>
|
||||
#include "fifo.h"
|
||||
|
||||
#include "unittest_transport.h"
|
||||
|
||||
void test_fifo(void)
|
||||
{
|
||||
uint8_t buf[3];
|
||||
fifo_t f;
|
||||
fifo_init(&f, buf, sizeof(buf));
|
||||
fifo_put(&f, 0x11);
|
||||
fifo_put(&f, 0x22);
|
||||
fifo_put(&f, 0x33);
|
||||
|
||||
TEST_ASSERT_EQUAL(0x11, fifo_get_nowait(&f));
|
||||
TEST_ASSERT_EQUAL(0x22, fifo_get_nowait(&f));
|
||||
TEST_ASSERT_EQUAL(0x33, fifo_get_nowait(&f));
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
// NOTE!!! Wait for >2 secs
|
||||
// if board doesn't support software reset via Serial.DTR/RTS
|
||||
_delay_ms(2000);
|
||||
|
||||
DDRB |= 0x2;
|
||||
PORTB &= ~0x2;
|
||||
|
||||
UNITY_BEGIN(); // IMPORTANT LINE!
|
||||
RUN_TEST(test_fifo);
|
||||
UNITY_END(); // stop unit testing
|
||||
|
||||
PORTB |= 0x2;
|
||||
DDRB |= 0x4;
|
||||
PORTB &= ~0x4;
|
||||
|
||||
while (1)
|
||||
;
|
||||
}
|
||||
32
Firmware/test/unittest_transport.h
Normal file
32
Firmware/test/unittest_transport.h
Normal file
@@ -0,0 +1,32 @@
|
||||
#ifndef UNITTEST_TRANSPORT_H
|
||||
#define UNITTEST_TRANSPORT_H
|
||||
|
||||
#include <avr/io.h>
|
||||
#include <stdint.h>
|
||||
#include "uart.h"
|
||||
|
||||
void unittest_uart_begin()
|
||||
{
|
||||
// Set Baudrate according to datasheet (16MHz -> 115200 Baud, U2X=1)
|
||||
UBRR0 = 0x10;
|
||||
UCSR0B |= (1<<TXEN0);
|
||||
|
||||
// Reset Complete-Flags
|
||||
UCSR0A = (1 << RXC0) | (1 << TXC0) | (1 << U2X0);
|
||||
}
|
||||
|
||||
void unittest_uart_putchar(char c)
|
||||
{
|
||||
loop_until_bit_is_set(UCSR0A, UDRE0);
|
||||
UDR0 = c;
|
||||
}
|
||||
|
||||
void unittest_uart_flush()
|
||||
{
|
||||
}
|
||||
|
||||
void unittest_uart_end()
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
26
Hardware/.gitignore
vendored
Normal file
26
Hardware/.gitignore
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
# For PCBs designed using KiCad: http://www.kicad-pcb.org/
|
||||
# Format documentation: http://kicad-pcb.org/help/file-formats/
|
||||
|
||||
# Temporary files
|
||||
*.000
|
||||
*.bak
|
||||
*.bck
|
||||
*.kicad_pcb-bak
|
||||
*.sch-bak
|
||||
*~
|
||||
_autosave-*
|
||||
*.tmp
|
||||
*-save.pro
|
||||
*-save.kicad_pcb
|
||||
fp-info-cache
|
||||
|
||||
# Netlist files (exported from Eeschema)
|
||||
*.net
|
||||
|
||||
# Autorouter files (exported from Pcbnew)
|
||||
*.dsn
|
||||
*.ses
|
||||
|
||||
# Exported BOM files
|
||||
#*.xml
|
||||
#*.csv
|
||||
4
Hardware/README.md
Normal file
4
Hardware/README.md
Normal file
@@ -0,0 +1,4 @@
|
||||
# Projektspezifische Hardware
|
||||
|
||||
Die EDA/CAD-Dateien und BOM von Erweiterungsplatinen.
|
||||
Präferierte EDA-Software: [KiCad](https://kicad-pcb.org/).
|
||||
42
README.md
Normal file
42
README.md
Normal file
@@ -0,0 +1,42 @@
|
||||
# DMM-Demo
|
||||
|
||||
Zum Flashen des Bootloaders und des Demonstrationsprojektes siehe
|
||||
[Firmware/README.md](https://teach.emg.ing.tu-bs.de/git/dmm/dmm-demo/-/tree/master/Firmware)
|
||||
|
||||
Die Dokumentation ist in diesem README zu hinterlegen. Das Einfügen von Bildern
|
||||
aus der Git-Repository ist erwünscht, diese sollten aber nicht zu groß sein.
|
||||
Bei der Struktur kann grob am nachfolgenden Template orientiert werden.
|
||||
|
||||
# Name des Projektes
|
||||
|
||||
Eigene Beschreibung des Projektes.
|
||||
|
||||
### Gruppenmitglieder
|
||||
* Dr.-Ing. Martin Oehler
|
||||
* Dipl.-Ing. Timo Klingeberg
|
||||
* Christof Wehrmann, M.Sc.
|
||||
* Ilya Elenskiy, M.Sc. (@ilyelens)
|
||||
|
||||
>>>
|
||||
**Aufgabenstellung des emg:**
|
||||
|
||||
Es ist mit dem DMM-Board XYZ zu implementieren...
|
||||
>>>
|
||||
|
||||
### Aufgabenverteilung
|
||||
@ilyelens: PlatformIO eindrichten, PWM-Demonstration.
|
||||
...
|
||||
|
||||
### Zeitplan
|
||||
...
|
||||
|
||||
## Dokumentation
|
||||
### Hardware
|
||||
Bauteilliste, Dokumentation, ...
|
||||
|
||||
### Software
|
||||
Dokumentation
|
||||
|
||||
## Ergebnisse
|
||||
|
||||
Bilder oder Auswertungen vom Tests, ggf. Link zum Video usw.
|
||||
3
Slides/README.md
Normal file
3
Slides/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# Präsentation
|
||||
|
||||
Hier soll die Präsentation (ggf. mit LaTeX Code) hinterlegt werden.
|
||||
BIN
dmm-demo-master/Firmware/src/main.o
Normal file
BIN
dmm-demo-master/Firmware/src/main.o
Normal file
Binary file not shown.
BIN
dmm-demo-master/Firmware/src/music.o
Normal file
BIN
dmm-demo-master/Firmware/src/music.o
Normal file
Binary file not shown.
BIN
dmm-libs-master/src/dataflash.o
Normal file
BIN
dmm-libs-master/src/dataflash.o
Normal file
Binary file not shown.
BIN
dmm-libs-master/src/fifo.o
Normal file
BIN
dmm-libs-master/src/fifo.o
Normal file
Binary file not shown.
BIN
dmm-libs-master/src/lcd.o
Normal file
BIN
dmm-libs-master/src/lcd.o
Normal file
Binary file not shown.
BIN
dmm-libs-master/src/spi.o
Normal file
BIN
dmm-libs-master/src/spi.o
Normal file
Binary file not shown.
BIN
dmm-libs-master/src/twi.o
Normal file
BIN
dmm-libs-master/src/twi.o
Normal file
Binary file not shown.
BIN
dmm-libs-master/src/uart.o
Normal file
BIN
dmm-libs-master/src/uart.o
Normal file
Binary file not shown.
Reference in New Issue
Block a user