Änderungen am Layout

main
Tom 11 months ago
parent 91de31a96a
commit 47b030ab96

5
.gitignore vendored

@ -1,4 +1,7 @@
*~ *~
.*.swp .*.swp
Audio Documents
External External
Pictures
Source
Tools

@ -153,7 +153,7 @@
(net 71 "Net-(U2-PB1)") (net 71 "Net-(U2-PB1)")
(net 72 "unconnected-(U3-~{RTS}-Pad2)") (net 72 "unconnected-(U3-~{RTS}-Pad2)")
(net 73 "unconnected-(U3-~{CTS}-Pad6)") (net 73 "unconnected-(U3-~{CTS}-Pad6)")
(net 74 "unconnected-(U3-CBUS2-Pad7)") (net 74 "unconnected-(U3-CBUS0-Pad15)")
(net 75 "unconnected-(U4-NC-Pad2)") (net 75 "unconnected-(U4-NC-Pad2)")
(net 76 "unconnected-(J2-Pad4)") (net 76 "unconnected-(J2-Pad4)")
(net 77 "unconnected-(J4-Pad4)") (net 77 "unconnected-(J4-Pad4)")
@ -6561,7 +6561,7 @@
(pad "6" smd rect (at -2.6 0.9525 90) (size 1.2 0.4) (layers "F.Cu" "F.Paste" "F.Mask") (pad "6" smd rect (at -2.6 0.9525 90) (size 1.2 0.4) (layers "F.Cu" "F.Paste" "F.Mask")
(net 73 "unconnected-(U3-~{CTS}-Pad6)") (pinfunction "~{CTS}") (pintype "input+no_connect") (tstamp 0fde114b-8b4a-4033-a31f-8613f93b9616)) (net 73 "unconnected-(U3-~{CTS}-Pad6)") (pinfunction "~{CTS}") (pintype "input+no_connect") (tstamp 0fde114b-8b4a-4033-a31f-8613f93b9616))
(pad "7" smd rect (at -2.6 1.5875 90) (size 1.2 0.4) (layers "F.Cu" "F.Paste" "F.Mask") (pad "7" smd rect (at -2.6 1.5875 90) (size 1.2 0.4) (layers "F.Cu" "F.Paste" "F.Mask")
(net 74 "unconnected-(U3-CBUS2-Pad7)") (pinfunction "CBUS2") (pintype "bidirectional+no_connect") (tstamp 5a4a254b-7330-46b6-967f-1a727af5800c)) (net 28 "Net-(D4-K)") (pinfunction "CBUS2") (pintype "bidirectional") (tstamp 5a4a254b-7330-46b6-967f-1a727af5800c))
(pad "8" smd rect (at -2.6 2.2225 90) (size 1.2 0.4) (layers "F.Cu" "F.Paste" "F.Mask") (pad "8" smd rect (at -2.6 2.2225 90) (size 1.2 0.4) (layers "F.Cu" "F.Paste" "F.Mask")
(net 65 "Net-(U3-USBDP)") (pinfunction "USBDP") (pintype "bidirectional") (tstamp d3f6f48e-801c-4038-83d1-37d8ae5fec69)) (net 65 "Net-(U3-USBDP)") (pinfunction "USBDP") (pintype "bidirectional") (tstamp d3f6f48e-801c-4038-83d1-37d8ae5fec69))
(pad "9" smd rect (at 2.6 2.2225 90) (size 1.2 0.4) (layers "F.Cu" "F.Paste" "F.Mask") (pad "9" smd rect (at 2.6 2.2225 90) (size 1.2 0.4) (layers "F.Cu" "F.Paste" "F.Mask")
@ -6575,9 +6575,9 @@
(pad "13" smd rect (at 2.6 -0.3175 90) (size 1.2 0.4) (layers "F.Cu" "F.Paste" "F.Mask") (pad "13" smd rect (at 2.6 -0.3175 90) (size 1.2 0.4) (layers "F.Cu" "F.Paste" "F.Mask")
(net 14 "GNDA") (pinfunction "GND") (pintype "power_in") (tstamp 7d62a380-6551-464a-8008-5a70f8237fa5)) (net 14 "GNDA") (pinfunction "GND") (pintype "power_in") (tstamp 7d62a380-6551-464a-8008-5a70f8237fa5))
(pad "14" smd rect (at 2.6 -0.9525 90) (size 1.2 0.4) (layers "F.Cu" "F.Paste" "F.Mask") (pad "14" smd rect (at 2.6 -0.9525 90) (size 1.2 0.4) (layers "F.Cu" "F.Paste" "F.Mask")
(net 28 "Net-(D4-K)") (pinfunction "CBUS1") (pintype "bidirectional") (tstamp fba410d2-c8cb-4bb6-ba19-4ec9ef334fc5)) (net 30 "Net-(D5-K)") (pinfunction "CBUS1") (pintype "bidirectional") (tstamp fba410d2-c8cb-4bb6-ba19-4ec9ef334fc5))
(pad "15" smd rect (at 2.6 -1.5875 90) (size 1.2 0.4) (layers "F.Cu" "F.Paste" "F.Mask") (pad "15" smd rect (at 2.6 -1.5875 90) (size 1.2 0.4) (layers "F.Cu" "F.Paste" "F.Mask")
(net 30 "Net-(D5-K)") (pinfunction "CBUS0") (pintype "bidirectional") (tstamp 9a98c4da-6853-4aa1-9cce-7b74b7cb2c20)) (net 74 "unconnected-(U3-CBUS0-Pad15)") (pinfunction "CBUS0") (pintype "bidirectional+no_connect") (tstamp 9a98c4da-6853-4aa1-9cce-7b74b7cb2c20))
(pad "16" smd rect (at 2.6 -2.2225 90) (size 1.2 0.4) (layers "F.Cu" "F.Paste" "F.Mask") (pad "16" smd rect (at 2.6 -2.2225 90) (size 1.2 0.4) (layers "F.Cu" "F.Paste" "F.Mask")
(net 67 "Net-(U3-CBUS3)") (pinfunction "CBUS3") (pintype "bidirectional") (tstamp 82f14614-ba2d-419b-8024-13898fa584ae)) (net 67 "Net-(U3-CBUS3)") (pinfunction "CBUS3") (pintype "bidirectional") (tstamp 82f14614-ba2d-419b-8024-13898fa584ae))
(model "${KICAD6_3DMODEL_DIR}/Package_SO.3dshapes/SSOP-16_3.9x4.9mm_P0.635mm.wrl" (model "${KICAD6_3DMODEL_DIR}/Package_SO.3dshapes/SSOP-16_3.9x4.9mm_P0.635mm.wrl"
@ -7944,34 +7944,16 @@
(segment (start 17.272 60.711) (end 15.6922 60.711) (width 0.5) (layer "B.Cu") (net 27) (tstamp 16c32e6c-c6e6-48c8-855e-68fd503f20d1)) (segment (start 17.272 60.711) (end 15.6922 60.711) (width 0.5) (layer "B.Cu") (net 27) (tstamp 16c32e6c-c6e6-48c8-855e-68fd503f20d1))
(segment (start 15.24 61.1632) (end 15.24 62.8904) (width 0.5) (layer "B.Cu") (net 27) (tstamp 1a1177b9-dfe4-4756-aebc-4bb164f70b86)) (segment (start 15.24 61.1632) (end 15.24 62.8904) (width 0.5) (layer "B.Cu") (net 27) (tstamp 1a1177b9-dfe4-4756-aebc-4bb164f70b86))
(segment (start 15.24 62.8904) (end 15.1892 62.9412) (width 0.5) (layer "B.Cu") (net 27) (tstamp d2eff31c-9968-4f5a-b219-31d3b1c9efc6)) (segment (start 15.24 62.8904) (end 15.1892 62.9412) (width 0.5) (layer "B.Cu") (net 27) (tstamp d2eff31c-9968-4f5a-b219-31d3b1c9efc6))
(segment (start 116.84 60.8076) (end 118.6688 62.6364) (width 0.25) (layer "F.Cu") (net 28) (tstamp 120fadb1-0181-4471-8a21-46929694916a))
(segment (start 128.27 72.263) (end 127.635 72.898) (width 0.25) (layer "F.Cu") (net 28) (tstamp 152d752b-7562-4a7c-97d7-d1a272c6259a)) (segment (start 128.27 72.263) (end 127.635 72.898) (width 0.25) (layer "F.Cu") (net 28) (tstamp 152d752b-7562-4a7c-97d7-d1a272c6259a))
(segment (start 101.854 71.628) (end 101.854 68.834) (width 0.25) (layer "F.Cu") (net 28) (tstamp 51cc900b-9168-4830-932d-6a9fe99b601f)) (segment (start 118.6688 70.6628) (end 118.8212 70.8152) (width 0.25) (layer "F.Cu") (net 28) (tstamp 57918a42-afa0-4d28-b2ad-0e242e528ee2))
(segment (start 102.87 67.818) (end 102.87 65.786) (width 0.25) (layer "F.Cu") (net 28) (tstamp 9092a385-76f2-425e-b443-9c2fc384aca1)) (segment (start 116.84 59.69) (end 116.84 60.8076) (width 0.25) (layer "F.Cu") (net 28) (tstamp ad83d89b-464e-4a41-baf6-129133b6ad17))
(segment (start 107.442 53.086) (end 107.442 54.737) (width 0.25) (layer "F.Cu") (net 28) (tstamp ac7ad58b-89b6-4ed9-9164-3b0f27e421bd)) (segment (start 118.6688 62.6364) (end 118.6688 70.6628) (width 0.25) (layer "F.Cu") (net 28) (tstamp bcdbd3a9-ede7-4f61-8aa6-15e614fc25ab))
(segment (start 114.3 52.5405) (end 114.3 54.49) (width 0.25) (layer "F.Cu") (net 28) (tstamp d71567bb-e31e-403b-97e8-107c2ff29fd9))
(segment (start 101.854 68.834) (end 102.87 67.818) (width 0.25) (layer "F.Cu") (net 28) (tstamp d7bcaf87-8358-4eee-a2d2-ffba41ca75b3))
(segment (start 128.27 70.485) (end 128.27 72.263) (width 0.25) (layer "F.Cu") (net 28) (tstamp f2e4bc5b-5792-4863-a899-0ddd977c4954)) (segment (start 128.27 70.485) (end 128.27 72.263) (width 0.25) (layer "F.Cu") (net 28) (tstamp f2e4bc5b-5792-4863-a899-0ddd977c4954))
(segment (start 106.68 52.324) (end 107.442 53.086) (width 0.25) (layer "F.Cu") (net 28) (tstamp f5137dc2-c922-4381-8ddf-f979beedfb81))
(via (at 106.68 52.324) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 28) (tstamp 5300ae25-ad6c-4169-bb59-d63b9e4b888a))
(via (at 107.442 54.737) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 28) (tstamp 8cc01bc8-a5c7-40c4-a2f0-a302d0c19187))
(via (at 127.635 72.898) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 28) (tstamp c9cb7fa7-ea66-4b7f-b8ce-ba8d9684cd48)) (via (at 127.635 72.898) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 28) (tstamp c9cb7fa7-ea66-4b7f-b8ce-ba8d9684cd48))
(via (at 101.854 71.628) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 28) (tstamp d5136f80-6f19-4715-b566-646e2444ba19)) (via (at 118.8212 70.8152) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 28) (tstamp ed2c218a-f0a5-43d2-882d-90182aef0ba3))
(via (at 102.87 65.786) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 28) (tstamp d9538350-baf2-4873-afc3-1d9b44753e4d)) (segment (start 118.8212 70.8152) (end 125.5522 70.8152) (width 0.25) (layer "B.Cu") (net 28) (tstamp 172a6aea-8131-4ce1-80ef-8d19e07f703a))
(via (at 114.3 52.5405) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 28) (tstamp eb349957-9cd4-4b39-8dd8-427def7ea228)) (segment (start 125.5522 70.8152) (end 127.635 72.898) (width 0.25) (layer "B.Cu") (net 28) (tstamp 38795461-bae4-4f1f-b859-47ab0ec354f8))
(segment (start 114.3 52.578) (end 114.898 53.176) (width 0.25) (layer "B.Cu") (net 28) (tstamp 21c376ac-b14d-447c-b123-45c1b380e25f))
(segment (start 103.886 72.898) (end 102.616 71.628) (width 0.25) (layer "B.Cu") (net 28) (tstamp 29a79655-ac53-4e33-b91d-66703b3a2561))
(segment (start 115.629396 51.366) (end 107.638 51.366) (width 0.25) (layer "B.Cu") (net 28) (tstamp 3beb9951-8ad0-4295-8234-8cbbd60339df))
(segment (start 102.616 71.628) (end 101.854 71.628) (width 0.25) (layer "B.Cu") (net 28) (tstamp 48da97ad-206b-4805-811c-df93a7ad8c81))
(segment (start 102.87 65.786) (end 102.87 54.991) (width 0.25) (layer "B.Cu") (net 28) (tstamp 4c73c4ab-b4aa-45ed-b33d-77dee2025540))
(segment (start 107.638 51.366) (end 106.68 52.324) (width 0.25) (layer "B.Cu") (net 28) (tstamp 4e411159-bb7f-436d-bf58-c1fc54270b73))
(segment (start 102.87 54.991) (end 103.124 54.737) (width 0.25) (layer "B.Cu") (net 28) (tstamp 4f6872f7-cff0-45ae-8845-201b2f65a2c9))
(segment (start 103.124 54.737) (end 107.442 54.737) (width 0.25) (layer "B.Cu") (net 28) (tstamp 58a5e83e-13ce-4bd2-9722-d4906c69b924))
(segment (start 114.3 52.5405) (end 114.3 52.578) (width 0.25) (layer "B.Cu") (net 28) (tstamp bc58c6bf-d609-4a01-a9e2-f1de6386f4ed))
(segment (start 127.635 72.898) (end 103.886 72.898) (width 0.25) (layer "B.Cu") (net 28) (tstamp cb313071-8883-41d6-8f56-f0c08da359bb))
(segment (start 116.168 52.751305) (end 116.168 51.904604) (width 0.25) (layer "B.Cu") (net 28) (tstamp d6f4d1b4-231b-4b9c-8b3c-3be804dd265a))
(segment (start 115.743305 53.176) (end 116.168 52.751305) (width 0.25) (layer "B.Cu") (net 28) (tstamp e41a4a62-2106-47c8-b117-4f31ffebae27))
(segment (start 114.898 53.176) (end 115.743305 53.176) (width 0.25) (layer "B.Cu") (net 28) (tstamp fde3fff6-61f4-4958-8a48-7917b748af67))
(segment (start 116.168 51.904604) (end 115.629396 51.366) (width 0.25) (layer "B.Cu") (net 28) (tstamp fe1f1004-3970-4906-b5b2-5a7219ad1ac5))
(segment (start 127 68.58) (end 127.145 68.435) (width 0.25) (layer "F.Cu") (net 29) (tstamp 1ed05ffa-7081-41f6-bc1d-8836715e85f4)) (segment (start 127 68.58) (end 127.145 68.435) (width 0.25) (layer "F.Cu") (net 29) (tstamp 1ed05ffa-7081-41f6-bc1d-8836715e85f4))
(segment (start 114.3 72.39) (end 125.73 72.39) (width 0.25) (layer "F.Cu") (net 29) (tstamp 70bd28fe-7216-42f9-9428-79ab6ab4839b)) (segment (start 114.3 72.39) (end 125.73 72.39) (width 0.25) (layer "F.Cu") (net 29) (tstamp 70bd28fe-7216-42f9-9428-79ab6ab4839b))
(segment (start 127 71.12) (end 127 68.58) (width 0.25) (layer "F.Cu") (net 29) (tstamp 8ea43e5f-9241-4538-98e9-7e4c63b20d81)) (segment (start 127 71.12) (end 127 68.58) (width 0.25) (layer "F.Cu") (net 29) (tstamp 8ea43e5f-9241-4538-98e9-7e4c63b20d81))
@ -7981,13 +7963,10 @@
(segment (start 127.145 68.435) (end 128.27 68.435) (width 0.25) (layer "F.Cu") (net 29) (tstamp f3356e88-9fa0-4389-bb7b-7d9950c42084)) (segment (start 127.145 68.435) (end 128.27 68.435) (width 0.25) (layer "F.Cu") (net 29) (tstamp f3356e88-9fa0-4389-bb7b-7d9950c42084))
(segment (start 107.95 51.308) (end 109.22 52.578) (width 0.25) (layer "F.Cu") (net 30) (tstamp 25ef94ef-74ad-499f-91fd-aa2e847807cf)) (segment (start 107.95 51.308) (end 109.22 52.578) (width 0.25) (layer "F.Cu") (net 30) (tstamp 25ef94ef-74ad-499f-91fd-aa2e847807cf))
(segment (start 101.972 66.666) (end 101.981 66.675) (width 0.25) (layer "F.Cu") (net 30) (tstamp 2961d859-8504-4769-b4db-3d3c5cff08bb)) (segment (start 101.972 66.666) (end 101.981 66.675) (width 0.25) (layer "F.Cu") (net 30) (tstamp 2961d859-8504-4769-b4db-3d3c5cff08bb))
(segment (start 113.665 53.64) (end 113.2005 53.1755) (width 0.25) (layer "F.Cu") (net 30) (tstamp 38254a5a-38b9-49f9-96dd-a5c5a37822e3))
(segment (start 101.981 52.578) (end 101.972 52.587) (width 0.25) (layer "F.Cu") (net 30) (tstamp 44e123ee-61bd-45f1-91fc-e2c7ea0682e7)) (segment (start 101.981 52.578) (end 101.972 52.587) (width 0.25) (layer "F.Cu") (net 30) (tstamp 44e123ee-61bd-45f1-91fc-e2c7ea0682e7))
(segment (start 101.972 52.587) (end 101.972 66.666) (width 0.25) (layer "F.Cu") (net 30) (tstamp 8a44f199-b2b7-4a19-a985-7ab4533424b0)) (segment (start 101.972 52.587) (end 101.972 66.666) (width 0.25) (layer "F.Cu") (net 30) (tstamp 8a44f199-b2b7-4a19-a985-7ab4533424b0))
(segment (start 101.981 52.578) (end 101.981 51.308) (width 0.25) (layer "F.Cu") (net 30) (tstamp b3ffb558-fbdf-40cc-9dba-c2d31a3655c8)) (segment (start 101.981 52.578) (end 101.981 51.308) (width 0.25) (layer "F.Cu") (net 30) (tstamp b3ffb558-fbdf-40cc-9dba-c2d31a3655c8))
(segment (start 125.095 70.485) (end 125.095 71.6655) (width 0.25) (layer "F.Cu") (net 30) (tstamp b88a99b2-2ba1-4c47-8446-8ae504f2e0c5)) (segment (start 125.095 70.485) (end 125.095 71.6655) (width 0.25) (layer "F.Cu") (net 30) (tstamp b88a99b2-2ba1-4c47-8446-8ae504f2e0c5))
(segment (start 113.2005 53.1755) (end 112.776 53.1755) (width 0.25) (layer "F.Cu") (net 30) (tstamp bfcb2fc2-d2b7-45cb-a87e-922c6d8e284b))
(segment (start 113.665 54.49) (end 113.665 53.64) (width 0.25) (layer "F.Cu") (net 30) (tstamp ce86b155-d29a-4a54-8271-0f3b34f56394))
(segment (start 101.981 51.308) (end 107.95 51.308) (width 0.25) (layer "F.Cu") (net 30) (tstamp f355e6b6-7aea-4f64-8a34-e9d0b0c23b3d)) (segment (start 101.981 51.308) (end 107.95 51.308) (width 0.25) (layer "F.Cu") (net 30) (tstamp f355e6b6-7aea-4f64-8a34-e9d0b0c23b3d))
(via (at 112.776 53.1755) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 30) (tstamp 4ee999c8-4425-44a3-93b4-239c4c7a69e4)) (via (at 112.776 53.1755) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 30) (tstamp 4ee999c8-4425-44a3-93b4-239c4c7a69e4))
(via (at 125.095 71.6655) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 30) (tstamp 601b1483-1f75-4218-b690-4f0d100b5b85)) (via (at 125.095 71.6655) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 30) (tstamp 601b1483-1f75-4218-b690-4f0d100b5b85))

@ -3582,7 +3582,7 @@
) )
(no_connect (at 369.57 137.16) (uuid 2e127829-fe4c-40ba-84f8-01ca0d3bf6c6)) (no_connect (at 369.57 137.16) (uuid 2e127829-fe4c-40ba-84f8-01ca0d3bf6c6))
(no_connect (at 290.83 232.41) (uuid 340178ee-d2dc-444f-8c7e-b00ede0da2ce)) (no_connect (at 290.83 227.33) (uuid 340178ee-d2dc-444f-8c7e-b00ede0da2ce))
(no_connect (at 270.51 180.34) (uuid 488fdef4-13e4-4c66-9bdc-461d266fa7a6)) (no_connect (at 270.51 180.34) (uuid 488fdef4-13e4-4c66-9bdc-461d266fa7a6))
(no_connect (at 246.38 187.96) (uuid 5f8f81a8-a273-4b25-9e1e-2802dc3d614f)) (no_connect (at 246.38 187.96) (uuid 5f8f81a8-a273-4b25-9e1e-2802dc3d614f))
(no_connect (at 290.83 222.25) (uuid 740ed114-4f42-454c-8f77-ef7074d0f47b)) (no_connect (at 290.83 222.25) (uuid 740ed114-4f42-454c-8f77-ef7074d0f47b))
@ -4014,6 +4014,10 @@
(stroke (width 0) (type default)) (stroke (width 0) (type default))
(uuid 3ad9dea7-ec07-4033-b625-5c22ee2d5e26) (uuid 3ad9dea7-ec07-4033-b625-5c22ee2d5e26)
) )
(wire (pts (xy 290.83 232.41) (xy 266.7 232.41))
(stroke (width 0) (type default))
(uuid 3ba5e0cc-d6ce-47b0-8933-dd888db9eacb)
)
(wire (pts (xy 242.57 193.04) (xy 242.57 196.85)) (wire (pts (xy 242.57 193.04) (xy 242.57 196.85))
(stroke (width 0) (type default)) (stroke (width 0) (type default))
(uuid 3d1f44ab-d708-4aaf-8067-3ecf5d7073fd) (uuid 3d1f44ab-d708-4aaf-8067-3ecf5d7073fd)
@ -4314,6 +4318,10 @@
(stroke (width 0) (type default)) (stroke (width 0) (type default))
(uuid 6af35c54-6a0f-40df-b884-e917fce73a84) (uuid 6af35c54-6a0f-40df-b884-e917fce73a84)
) )
(wire (pts (xy 290.83 229.87) (xy 274.32 229.87))
(stroke (width 0) (type default))
(uuid 6af4db32-ebb4-44fc-ad54-d7f5f8f0660d)
)
(wire (pts (xy 367.03 43.18) (xy 351.79 43.18)) (wire (pts (xy 367.03 43.18) (xy 351.79 43.18))
(stroke (width 0) (type default)) (stroke (width 0) (type default))
(uuid 6bf9808d-ccb8-4571-a02e-4fdbe1aaa5c6) (uuid 6bf9808d-ccb8-4571-a02e-4fdbe1aaa5c6)
@ -4482,10 +4490,6 @@
(stroke (width 0) (type default)) (stroke (width 0) (type default))
(uuid 80f08767-14a1-4911-a559-9f40001c767f) (uuid 80f08767-14a1-4911-a559-9f40001c767f)
) )
(wire (pts (xy 266.7 229.87) (xy 290.83 229.87))
(stroke (width 0) (type default))
(uuid 81cc6a99-f8e6-4327-baa4-a2edf0b0753b)
)
(wire (pts (xy 34.29 30.48) (xy 35.56 30.48)) (wire (pts (xy 34.29 30.48) (xy 35.56 30.48))
(stroke (width 0) (type default)) (stroke (width 0) (type default))
(uuid 8355efdb-b183-4acb-8a10-7ba0b7ea25cb) (uuid 8355efdb-b183-4acb-8a10-7ba0b7ea25cb)
@ -4586,7 +4590,7 @@
(stroke (width 0) (type default)) (stroke (width 0) (type default))
(uuid 900718d2-2536-445c-9710-b3ac26fa091a) (uuid 900718d2-2536-445c-9710-b3ac26fa091a)
) )
(wire (pts (xy 266.7 224.79) (xy 266.7 229.87)) (wire (pts (xy 266.7 224.79) (xy 266.7 232.41))
(stroke (width 0) (type default)) (stroke (width 0) (type default))
(uuid 9040dcf3-3151-4497-8c86-5fdcd15e7a07) (uuid 9040dcf3-3151-4497-8c86-5fdcd15e7a07)
) )
@ -5022,7 +5026,7 @@
(stroke (width 0) (type default)) (stroke (width 0) (type default))
(uuid da9aeb3c-0897-479a-b4ee-d391361c0e33) (uuid da9aeb3c-0897-479a-b4ee-d391361c0e33)
) )
(wire (pts (xy 274.32 224.79) (xy 274.32 227.33)) (wire (pts (xy 274.32 224.79) (xy 274.32 229.87))
(stroke (width 0) (type default)) (stroke (width 0) (type default))
(uuid dac3b296-e633-4c73-91d4-b0b6f527ae18) (uuid dac3b296-e633-4c73-91d4-b0b6f527ae18)
) )
@ -5058,10 +5062,6 @@
(stroke (width 0) (type default)) (stroke (width 0) (type default))
(uuid e027771f-510e-460a-83c2-77844088536b) (uuid e027771f-510e-460a-83c2-77844088536b)
) )
(wire (pts (xy 290.83 227.33) (xy 274.32 227.33))
(stroke (width 0) (type default))
(uuid e221cd78-1e75-4c1e-9866-b169c3eb9f20)
)
(wire (pts (xy 171.45 133.35) (xy 171.45 134.62)) (wire (pts (xy 171.45 133.35) (xy 171.45 134.62))
(stroke (width 0) (type default)) (stroke (width 0) (type default))
(uuid e3d7383e-5bab-4581-8e68-b7d5e356d08f) (uuid e3d7383e-5bab-4581-8e68-b7d5e356d08f)

@ -21,81 +21,80 @@
\providecommand\HyField@AuxAddToFields[1]{} \providecommand\HyField@AuxAddToFields[1]{}
\providecommand\HyField@AuxAddToCoFields[2]{} \providecommand\HyField@AuxAddToCoFields[2]{}
\providecommand\BKM@entry[2]{} \providecommand\BKM@entry[2]{}
\selectlanguage *{latex} \babel@aux{ngerman}{}
\@writefile{toc}{\selectlanguage *{latex}} \BKM@entry{id=1,dest={636861707465722E31},srcline={139},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030465C303030755C3030306E5C3030306B5C303030745C303030695C3030306F5C3030306E5C303030655C3030306E}
\@writefile{lof}{\selectlanguage *{latex}}
\@writefile{lot}{\selectlanguage *{latex}}
\selectlanguage *{latex}
\@writefile{toc}{\selectlanguage *{latex}}
\@writefile{lof}{\selectlanguage *{latex}}
\@writefile{lot}{\selectlanguage *{latex}}
\BKM@entry{id=1,dest={636861707465722E31},srcline={111},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030465C303030755C3030306E5C3030306B5C303030745C303030695C3030306F5C3030306E5C303030655C3030306E}
\@writefile{toc}{\contentsline {chapter}{\numberline {1}Funktionen}{5}{chapter.1}\protected@file@percent } \@writefile{toc}{\contentsline {chapter}{\numberline {1}Funktionen}{5}{chapter.1}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }} \@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }}
\BKM@entry{id=2,dest={636861707465722E32},srcline={125},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030485C303030695C3030306E5C303030775C303030655C303030695C303030735C303030655C3030305C3034305C3030307A5C303030755C303030725C3030305C3034305C303030445C3030306F5C3030306B5C303030755C3030306D5C303030655C3030306E5C303030745C303030615C303030745C303030695C3030306F5C3030306E} \BKM@entry{id=2,dest={636861707465722E32},srcline={154},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030485C303030695C3030306E5C303030775C303030655C303030695C303030735C303030655C3030305C3034305C3030307A5C303030755C303030725C3030305C3034305C303030445C3030306F5C3030306B5C303030755C3030306D5C303030655C3030306E5C303030745C303030615C303030745C303030695C3030306F5C3030306E}
\@writefile{toc}{\contentsline {chapter}{\numberline {2}Hinweise zur Dokumentation}{7}{chapter.2}\protected@file@percent } \@writefile{toc}{\contentsline {chapter}{\numberline {2}Hinweise zur Dokumentation}{7}{chapter.2}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }} \@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }}
\BKM@entry{id=3,dest={636861707465722E33},srcline={129},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030475C303030725C303030755C3030306E5C303030645C3030306C5C303030615C303030675C303030655C3030306E} \BKM@entry{id=3,dest={636861707465722E33},srcline={158},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030475C303030725C303030755C3030306E5C303030645C3030306C5C303030615C303030675C303030655C3030306E}
\BKM@entry{id=4,dest={73656374696F6E2E332E31},srcline={131},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030425C303030655C303030745C303030725C303030695C303030655C303030625C303030735C303030615C303030725C303030745C303030655C3030306E5C3030305C3034305C303030655C303030695C3030306E5C303030655C303030735C3030305C3034305C3030304D5C3030306F5C303030725C303030735C303030655C3030302D5C3030304B5C303030655C303030795C303030655C303030725C30303073} \BKM@entry{id=4,dest={73656374696F6E2E332E31},srcline={159},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030425C303030655C303030745C303030725C303030695C303030655C303030625C303030735C303030615C303030725C303030745C303030655C3030306E5C3030305C3034305C303030655C303030695C3030306E5C303030655C303030735C3030305C3034305C3030304D5C3030306F5C303030725C303030735C303030655C3030302D5C3030304B5C303030655C303030795C303030655C303030725C30303073}
\BKM@entry{id=5,dest={73756273656374696F6E2E332E312E31},srcline={133},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C3030305A5C303030655C303030695C303030745C303030765C303030655C303030725C303030685C303030615C3030306C5C303030745C303030655C3030306E} \BKM@entry{id=5,dest={73756273656374696F6E2E332E312E31},srcline={163},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C3030305A5C303030655C303030695C303030745C303030765C303030655C303030725C303030685C303030615C3030306C5C303030745C303030655C3030306E}
\@writefile{toc}{\contentsline {chapter}{\numberline {3}Grundlagen}{9}{chapter.3}\protected@file@percent } \@writefile{toc}{\contentsline {chapter}{\numberline {3}Grundlagen}{9}{chapter.3}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }} \@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }}
\@writefile{toc}{\contentsline {section}{\numberline {3.1}Betriebsarten eines Morse-Keyers}{9}{section.3.1}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {3.1}Betriebsarten eines Morse-Keyers}{9}{section.3.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.1}Zeitverhalten}{9}{subsection.3.1.1}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.1.1}Zeitverhalten}{9}{subsection.3.1.1}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {3.1}{\ignorespaces Diagramm Mode A\relax }}{9}{figure.caption.4}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {3.1}{\ignorespaces Diagramm Mode A\relax }}{9}{figure.caption.4}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {3.2}{\ignorespaces Diagramm Mode B\relax }}{10}{figure.caption.5}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {3.2}{\ignorespaces Diagramm Mode B\relax }}{9}{figure.caption.5}\protected@file@percent }
\BKM@entry{id=6,dest={636861707465722E34},srcline={188},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030425C303030655C303030645C303030695C303030655C3030306E5C303030755C3030306E5C30303067} \BKM@entry{id=6,dest={636861707465722E34},srcline={218},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030445C303030695C303030655C3030305C3034305C303030425C303030655C303030645C303030695C303030655C3030306E5C303030755C3030306E5C30303067}
\BKM@entry{id=7,dest={73656374696F6E2E342E31},srcline={190},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030545C303030615C303030735C303030745C303030615C303030745C303030755C303030725C303030625C303030655C3030306C5C303030655C303030675C303030755C3030306E5C30303067} \BKM@entry{id=7,dest={73656374696F6E2E342E31},srcline={219},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030425C303030655C303030645C303030695C303030655C3030306E5C303030655C3030306C5C303030655C3030306D5C303030655C3030306E5C303030745C30303065}
\BKM@entry{id=8,dest={73756273656374696F6E2E342E312E31},srcline={192},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C3030305C3333345C303030625C303030655C303030725C303030735C303030695C303030635C303030685C30303074} \BKM@entry{id=8,dest={73756273656374696F6E2E342E312E31},srcline={221},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C3030305C3333345C303030625C303030655C303030725C303030735C303030695C303030635C303030685C30303074}
\@writefile{toc}{\contentsline {chapter}{\numberline {4}Bedienung}{11}{chapter.4}\protected@file@percent } \@writefile{toc}{\contentsline {chapter}{\numberline {4}Die Bedienung}{11}{chapter.4}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }} \@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }}
\@writefile{toc}{\contentsline {section}{\numberline {4.1}Tastaturbelegung}{11}{section.4.1}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {4.1}Bedienelemente}{11}{section.4.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.1.1}Übersicht}{11}{subsection.4.1.1}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {4.1.1}Übersicht}{11}{subsection.4.1.1}\protected@file@percent }
\BKM@entry{id=9,dest={636861707465722E35},srcline={196},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030535C303030635C303030685C303030615C3030306C5C303030745C303030755C3030306E5C30303067} \BKM@entry{id=9,dest={636861707465722E35},srcline={222},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030445C303030695C303030655C3030305C3034305C303030535C303030635C303030685C303030615C3030306C5C303030745C303030755C3030306E5C30303067}
\BKM@entry{id=10,dest={73656374696F6E2E352E31},srcline={198},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030425C303030655C303030735C303030635C303030685C303030725C303030655C303030695C303030625C303030755C3030306E5C30303067} \BKM@entry{id=10,dest={73656374696F6E2E352E31},srcline={224},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030425C303030655C303030735C303030635C303030685C303030725C303030655C303030695C303030625C303030755C3030306E5C30303067}
\BKM@entry{id=11,dest={73656374696F6E2E352E32},srcline={200},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030535C303030635C303030685C303030615C3030306C5C303030745C303030705C3030306C5C303030615C3030306E} \@writefile{toc}{\contentsline {chapter}{\numberline {5}Die Schaltung}{13}{chapter.5}\protected@file@percent }
\@writefile{toc}{\contentsline {chapter}{\numberline {5}Schaltung}{13}{chapter.5}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }} \@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }}
\@writefile{toc}{\contentsline {section}{\numberline {5.1}Beschreibung}{13}{section.5.1}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {5.1}Beschreibung}{13}{section.5.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {5.2}Schaltplan}{13}{section.5.2}\protected@file@percent } \BKM@entry{id=11,dest={636861707465722E36},srcline={225},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030445C303030695C303030655C3030305C3034305C303030535C3030306F5C303030665C303030745C303030775C303030615C303030725C30303065}
\@writefile{lot}{\contentsline {table}{\numberline {5.1}{\ignorespaces Programmierpunkte Teil 1\relax }}{13}{table.caption.6}\protected@file@percent } \BKM@entry{id=12,dest={73656374696F6E2E362E31},srcline={226},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030545C303030695C3030306D5C303030655C303030725C3030305C3034305C30303032}
\BKM@entry{id=12,dest={636861707465722E36},srcline={235},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030425C303030655C303030735C303030635C303030685C303030725C303030655C303030695C303030625C303030755C3030306E5C303030675C3030305C3034305C303030645C303030655C303030725C3030305C3034305C303030485C303030615C303030725C303030645C303030775C303030615C303030725C30303065} \BKM@entry{id=13,dest={73656374696F6E2E362E32},srcline={229},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030545C303030695C3030306D5C303030655C303030725C3030305C3034305C30303031}
\@writefile{toc}{\contentsline {chapter}{\numberline {6}Beschreibung der Hardware}{15}{chapter.6}\protected@file@percent } \BKM@entry{id=14,dest={73656374696F6E2E362E33},srcline={232},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030545C303030695C3030306D5C303030655C303030725C3030305C3034305C30303030}
\BKM@entry{id=15,dest={73756273656374696F6E2E362E332E31},srcline={235},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030545C303030695C3030306D5C303030655C303030725C3030305C3034305C303030655C303030695C3030306E5C303030735C303030745C303030655C3030306C5C3030306C5C303030655C3030306E}
\BKM@entry{id=16,dest={73656374696F6E2E362E34},srcline={240},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030535C303030695C3030306E5C303030755C303030735C3030305C3034305C3030304D5C303030695C303030745C303030685C3030305C3336365C303030725C303030745C3030306F5C3030306E5C3030305C3034305C303030645C303030755C303030725C303030635C303030685C3030305C3034305C303030505C303030755C3030306C5C303030735C303030775C303030655C303030695C303030745C303030655C3030306E5C3030306D5C3030306F5C303030645C303030755C3030306C5C303030615C303030745C303030695C3030306F5C3030306E}
\BKM@entry{id=17,dest={73756273656374696F6E2E362E342E31},srcline={245},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030475C303030725C303030755C3030306E5C303030645C3030306C5C303030615C303030675C303030655C3030306E}
\@writefile{toc}{\contentsline {chapter}{\numberline {6}Die Software}{15}{chapter.6}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }} \@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }}
\@writefile{lot}{\contentsline {table}{\numberline {6.1}{\ignorespaces Klemmenbelegung\relax }}{15}{table.caption.7}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {6.1}Timer 2}{15}{section.6.1}\protected@file@percent }
\BKM@entry{id=13,dest={636861707465722E37},srcline={245},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030425C303030655C303030735C303030635C303030685C303030725C303030655C303030695C303030625C303030755C3030306E5C303030675C3030305C3034305C303030645C303030655C303030725C3030305C3034305C303030535C3030306F5C303030665C303030745C303030775C303030615C303030725C30303065} \@writefile{toc}{\contentsline {section}{\numberline {6.2}Timer 1}{15}{section.6.2}\protected@file@percent }
\BKM@entry{id=14,dest={73656374696F6E2E372E31},srcline={246},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030545C303030695C3030306D5C303030655C303030725C3030305C3034305C30303031} \@writefile{toc}{\contentsline {section}{\numberline {6.3}Timer 0}{15}{section.6.3}\protected@file@percent }
\BKM@entry{id=15,dest={73756273656374696F6E2E372E312E31},srcline={253},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030545C303030695C3030306D5C303030655C303030725C3030305C3034305C303030655C303030695C3030306E5C303030735C303030745C303030655C3030306C5C3030306C5C303030655C3030306E} \@writefile{toc}{\contentsline {subsection}{\numberline {6.3.1}Timer einstellen}{15}{subsection.6.3.1}\protected@file@percent }
\BKM@entry{id=16,dest={73656374696F6E2E372E32},srcline={260},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030535C303030695C3030306E5C303030755C303030735C3030305C3034305C3030304D5C303030695C303030745C303030685C3030305C3336365C303030725C303030745C3030306F5C3030306E5C3030305C3034305C303030645C303030755C303030725C303030635C303030685C3030305C3034305C303030505C303030755C3030306C5C303030735C303030775C303030655C303030695C303030745C303030655C3030306E5C3030306D5C3030306F5C303030645C303030755C3030306C5C303030615C303030745C303030695C3030306F5C3030306E} \@writefile{toc}{\contentsline {section}{\numberline {6.4}Sinus Mithörton durch Pulsweitenmodulation}{15}{section.6.4}\protected@file@percent }
\BKM@entry{id=17,dest={73756273656374696F6E2E372E322E31},srcline={266},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030475C303030725C303030755C3030306E5C303030645C3030306C5C303030615C303030675C303030655C3030306E} \@writefile{toc}{\contentsline {subsection}{\numberline {6.4.1}Grundlagen}{16}{subsection.6.4.1}\protected@file@percent }
\@writefile{toc}{\contentsline {chapter}{\numberline {7}Beschreibung der Software}{17}{chapter.7}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {6.1}{\ignorespaces Pulswellenmodulation\relax }}{16}{figure.caption.6}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Pulsweitenmodulation}{16}{subsubsection*.8}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {6.2}{\ignorespaces Symmetrisches Rechtecksignal an PB3\relax }}{17}{figure.caption.9}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {6.3}{\ignorespaces PWM - Tastgrad - Sinus\relax }}{18}{figure.caption.10}\protected@file@percent }
\BKM@entry{id=18,dest={73756273656374696F6E2E362E342E32},srcline={373},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030535C303030695C3030306E5C303030755C303030735C303030745C303030615C303030625C303030655C3030306C5C3030306C5C30303065}
\@writefile{lot}{\contentsline {table}{\numberline {6.1}{\ignorespaces OCR1A Werte für verschiedene Frequenzen des Mithörtons\relax }}{19}{table.caption.11}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {6.4.2}Sinustabelle}{19}{subsection.6.4.2}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {6.4}{\ignorespaces Sinus nach Tabelle vom Python3 Script als Linie\relax }}{20}{figure.caption.12}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {6.5}{\ignorespaces Sinus nach der Tabelle vom Python3 Script mit Stützpunkten\relax }}{20}{figure.caption.13}\protected@file@percent }
\BKM@entry{id=19,dest={636861707465722E37},srcline={403},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030455C3030306E5C303030745C303030775C303030695C303030635C3030306B5C3030306C5C303030755C3030306E5C303030675C303030735C303030755C3030306D5C303030675C303030655C303030625C303030755C3030306E5C30303067}
\@writefile{toc}{\contentsline {chapter}{\numberline {7}Entwicklungsumgebung}{21}{chapter.7}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }} \@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }}
\@writefile{toc}{\contentsline {section}{\numberline {7.1}Timer 1}{17}{section.7.1}\protected@file@percent } \BKM@entry{id=20,dest={636861707465722A2E3134},srcline={428},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030545C303030615C303030625C303030655C3030306C5C3030306C5C303030655C3030306E}
\@writefile{toc}{\contentsline {subsection}{\numberline {7.1.1}Timer einstellen}{17}{subsection.7.1.1}\protected@file@percent } \@writefile{toc}{\contentsline {chapter}{\nonumberline Tabellen}{23}{chapter*.14}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {7.2}Sinus Mithörton durch Pulsweitenmodulation}{17}{section.7.2}\protected@file@percent } \gdef\lot@l@number{41.11653pt}
\@writefile{toc}{\contentsline {subsection}{\numberline {7.2.1}Grundlagen}{17}{subsection.7.2.1}\protected@file@percent } \BKM@entry{id=21,dest={636861707465722A2E3135},srcline={429},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030415C303030625C303030625C303030695C3030306C5C303030645C303030755C3030306E5C303030675C303030655C3030306E}
\@writefile{lof}{\contentsline {figure}{\numberline {7.1}{\ignorespaces PWM Ausgangssignal\relax }}{18}{figure.caption.8}\protected@file@percent } \@writefile{toc}{\contentsline {chapter}{\nonumberline Abbildungen}{25}{chapter*.15}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Pulsweitenmodulation}{18}{subsubsection*.10}\protected@file@percent } \gdef\lof@l@number{43.9643pt}
\BKM@entry{id=18,dest={73756273656374696F6E2E372E322E32},srcline={346},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030535C303030695C3030306E5C303030755C303030735C303030745C303030615C303030625C303030655C3030306C5C3030306C5C30303065} \global\@namedef{scr@dte@chapter@lastmaxnumwidth}{10.40242pt}
\@writefile{toc}{\contentsline {subsection}{\numberline {7.2.2}Sinustabelle}{19}{subsection.7.2.2}\protected@file@percent } \global\@namedef{scr@dte@section@lastmaxnumwidth}{16.60352pt}
\BKM@entry{id=19,dest={617070656E6469782E41},srcline={365},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030455C3030306E5C303030745C303030775C303030695C303030635C3030306B5C3030306C5C303030755C3030306E5C303030675C303030735C303030755C3030306D5C303030675C303030655C303030625C303030755C3030306E5C30303067} \global\@namedef{scr@dte@subsection@lastmaxnumwidth}{24.1506pt}
\@writefile{toc}{\contentsline {chapter}{\numberline {A}Entwicklungsumgebung}{25}{appendix.A}\protected@file@percent } \global\@namedef{scr@dte@table@lastmaxnumwidth}{40.11018pt}
\@writefile{lof}{\addvspace {10\p@ }} \global\@namedef{scr@dte@figure@lastmaxnumwidth}{42.95795pt}
\@writefile{lot}{\addvspace {10\p@ }}
\global\csname @altsecnumformattrue\endcsname
\global\@namedef{scr@dte@chapter@lastmaxnumwidth}{16.04095pt}
\global\@namedef{scr@dte@section@lastmaxnumwidth}{28.08197pt}
\global\@namedef{scr@dte@subsection@lastmaxnumwidth}{40.12299pt}
\global\@namedef{scr@dte@table@lastmaxnumwidth}{28.08197pt}
\global\@namedef{scr@dte@figure@lastmaxnumwidth}{28.08197pt}
\@writefile{toc}{\providecommand\tocbasic@end@toc@file{}\tocbasic@end@toc@file} \@writefile{toc}{\providecommand\tocbasic@end@toc@file{}\tocbasic@end@toc@file}
\@writefile{lot}{\providecommand\tocbasic@end@toc@file{}\tocbasic@end@toc@file} \@writefile{lot}{\providecommand\tocbasic@end@toc@file{}\tocbasic@end@toc@file}
\@writefile{lof}{\providecommand\tocbasic@end@toc@file{}\tocbasic@end@toc@file} \@writefile{lof}{\providecommand\tocbasic@end@toc@file{}\tocbasic@end@toc@file}
\gdef \@abspage@last{26} \gdef \@abspage@last{25}

@ -1,14 +1,16 @@
\selectlanguage *{latex} \babel@toc {ngerman}{}
\selectlanguage *{latex}
\addvspace {10\p@ } \addvspace {10\p@ }
\addvspace {10\p@ } \addvspace {10\p@ }
\addvspace {10\p@ } \addvspace {10\p@ }
\contentsline {figure}{\numberline {3.1}{\ignorespaces Diagramm Mode A\relax }}{9}{figure.caption.4}% \contentsline {figure}{\numberline {3.1}{\ignorespaces Diagramm Mode A\relax }}{9}{figure.caption.4}%
\contentsline {figure}{\numberline {3.2}{\ignorespaces Diagramm Mode B\relax }}{10}{figure.caption.5}% \contentsline {figure}{\numberline {3.2}{\ignorespaces Diagramm Mode B\relax }}{9}{figure.caption.5}%
\addvspace {10\p@ } \addvspace {10\p@ }
\addvspace {10\p@ } \addvspace {10\p@ }
\addvspace {10\p@ } \addvspace {10\p@ }
\addvspace {10\p@ } \contentsline {figure}{\numberline {6.1}{\ignorespaces Pulswellenmodulation\relax }}{16}{figure.caption.6}%
\contentsline {figure}{\numberline {7.1}{\ignorespaces PWM Ausgangssignal\relax }}{18}{figure.caption.8}% \contentsline {figure}{\numberline {6.2}{\ignorespaces Symmetrisches Rechtecksignal an PB3\relax }}{17}{figure.caption.9}%
\contentsline {figure}{\numberline {6.3}{\ignorespaces PWM - Tastgrad - Sinus\relax }}{18}{figure.caption.10}%
\contentsline {figure}{\numberline {6.4}{\ignorespaces Sinus nach Tabelle vom Python3 Script als Linie\relax }}{20}{figure.caption.12}%
\contentsline {figure}{\numberline {6.5}{\ignorespaces Sinus nach der Tabelle vom Python3 Script mit Stützpunkten\relax }}{20}{figure.caption.13}%
\addvspace {10\p@ } \addvspace {10\p@ }
\providecommand \tocbasic@end@toc@file {}\tocbasic@end@toc@file \providecommand \tocbasic@end@toc@file {}\tocbasic@end@toc@file

File diff suppressed because it is too large Load Diff

@ -1,13 +1,10 @@
\selectlanguage *{latex} \babel@toc {ngerman}{}
\selectlanguage *{latex}
\addvspace {10\p@ } \addvspace {10\p@ }
\addvspace {10\p@ } \addvspace {10\p@ }
\addvspace {10\p@ } \addvspace {10\p@ }
\addvspace {10\p@ } \addvspace {10\p@ }
\addvspace {10\p@ } \addvspace {10\p@ }
\contentsline {table}{\numberline {5.1}{\ignorespaces Programmierpunkte Teil 1\relax }}{13}{table.caption.6}%
\addvspace {10\p@ }
\contentsline {table}{\numberline {6.1}{\ignorespaces Klemmenbelegung\relax }}{15}{table.caption.7}%
\addvspace {10\p@ } \addvspace {10\p@ }
\contentsline {table}{\numberline {6.1}{\ignorespaces OCR1A Werte für verschiedene Frequenzen des Mithörtons\relax }}{19}{table.caption.11}%
\addvspace {10\p@ } \addvspace {10\p@ }
\providecommand \tocbasic@end@toc@file {}\tocbasic@end@toc@file \providecommand \tocbasic@end@toc@file {}\tocbasic@end@toc@file

@ -1,4 +1,13 @@
\documentclass[10pt,a4paper,twoside,parskip=full-]{scrbook} \documentclass[
11pt,
a4paper,
% twoside,
parskip=full-,
bibliography=totoc,
listof=totoc,
listof=entryprefix,
toc=sectionentrywithdots
]{scrbook}
\usepackage[T1]{fontenc} \usepackage[T1]{fontenc}
\usepackage{fontspec} \usepackage{fontspec}
\usepackage[ngerman]{babel} \usepackage[ngerman]{babel}
@ -16,11 +25,26 @@
\usepackage{bbding} \usepackage{bbding}
\usepackage{tikz} \usepackage{tikz}
\usepackage{tikz-timing} \usepackage{tikz-timing}
\usepackage{pgfplots}
\usepackage{ccicons} \usepackage{ccicons}
\usepackage{amsmath} \usepackage{amsmath}
\usepackage{amssymb} \usepackage{amssymb}
\usepackage{unicode-math, polyglossia} \usepackage{amsfonts}
\usepackage{siunitx}
\usepackage{verbatimbox}
%\usepackage{unicode-math, polyglossia}
\usepackage{lmodern}
\usepackage{unicode-math}
% Settings
\pgfplotsset{compat=1.17}
\renewcaptionname{ngerman}{\contentsname}{Inhalt}
\renewcaptionname{ngerman}{\listfigurename}{Abbildungen}
\renewcaptionname{ngerman}{\listtablename}{Tabellen}
\renewcaptionname{ngerman}{\figurename}{Abb.}
\renewcaptionname{ngerman}{\tablename}{Tab.}
\BeforeStartingTOC[lof]{\def\autodot{:}}
\BeforeStartingTOC[lot]{\def\autodot{:}}
\sisetup{locale = DE}
%% PDF Meta Information und Links %% PDF Meta Information und Links
\usepackage[ \usepackage[
@ -35,22 +59,27 @@ pdfproducer={LaTeX}]
% Getestete und funktionierende Fonts. % Getestete und funktionierende Fonts.
% \setmainfont{Rosario} - Schöner, eleganter Font. % \setmainfont{Rosario} - Schöner, eleganter Font.
% \setmainfont{Roboto} - Schnörkelos % \setmainfont{Roboto} % - Schnörkelos
% \setmainfont{QTAntiquePost} % \setmainfont{QTAntiquePost}
% \setmainfont{QTFloraline} % \setmainfont{QTFloraline}
% \setmainfont{BaskervilleF} % \setmainfont{BaskervilleF}
% \setmainfont{EB Garamond} - ähnlich Rosario % \setmainfont{EB Garamond} % - ähnlich Rosario
% \setmainfont{SauceCodeProNerdFontPropo-Regular}
\setmainfont{DejaVuSansMNerdFont-Regular} % \setsansfont{SauceCodeProNerdFontPropo-Regular}
\setsansfont{DejaVuSansMNerdFont-Regular}
% \setmathfont{SourceCodePro} % \setmathfont{SourceCodePro}
\setmonofont{CaskaydiaCoveNerdFont-Regular} % \setmonofont{SauceCodeProNerdFontMono-Regular}
\urlstyle{same} % \urlstyle{same}
\defaultfontfeatures{Scale=MatchLowercase}
\setmainfont{TeX Gyre Pagella}
% \setmathfont{TeX Gyre Pagella Math}
\setmathfont{Asana Math}
% \usepackage{placeins} % \usepackage{placeins}
\definecolor{fond}{RGB}{240,240,240} \definecolor{fond}{RGB}{240,240,240}
\begin{document} \begin{document}
\newcommand{\step}{.5}
\begin{titlepage} \begin{titlepage}
\raggedright \raggedright
\begin{figure}[h] \begin{figure}[h]
@ -73,6 +102,7 @@ pdfproducer={LaTeX}]
Site \url{https://isnix.de} \\ Site \url{https://isnix.de} \\
\vspace{2cm} \vspace{2cm}
\normalsize \normalsize
\dictum[DK5KE]{Die Morsetelegrafie ist der Urknall des Internets.}
\end{titlepage} \end{titlepage}
@ -92,9 +122,9 @@ Preisklassen.
Warum noch ein Morse-Keyer? Warum noch ein Morse-Keyer?
Einige der erhältlichen Morse-Keyer sind in großen Gehäusen untergebracht, mit vielen Funktionen, Abschluß für eine Tastatur, dutzende Speicher und LC-Display und kosten viel Geld. Andere sind sehr günstig, haben aber nur einen Anschluß für eine Taste. Wenn man nicht gerade der Contester und DX-Jäger ist, gerne mal diverse Tasten an mehr als einem Transceiver verwendet und weder Steuerung über den PC noch Anschluß für Tastaturen benötigt, findet fast nichts am Markt. Einige der erhältlichen Morse-Keyer sind in großen Gehäusen untergebracht, mit vielen Funktionen, Anschluß für eine PC Tastatur, dutzende Speicher und LC-Display und kosten viel Geld. Andere sind sehr günstig, haben aber nur einen Anschluß für eine Taste. Wer nicht gerade der Contester und DX-Jäger ist, gerne mal diverse Tasten an mehr als einem Transceiver verwendet und weder Steuerung über den PC noch Anschluß für Tastaturen benötigt, findet fast nichts am Markt.
Deswegen der BJ-Keyer, einfach, simpel, klein und trotzdem können mehrere Tasten und 2 Transceiver angeschlossen werden. Alles, was ich nicht benötige, habe ich auch weggelassen. Wer also auf der Suche nach einem Morse-Keyer mit ganz vielen Funktionen ist, dem empfehle ich eher sich woanders umzuschauen. Deswegen der BJ-Keyer, einfach, simpel, klein und trotzdem können mehrere Tasten und 2 Transceiver angeschlossen werden. Alles, was ich nicht benötige, habe ich auch weggelassen. Wer also auf der Suche nach einem Morse-Keyer mit ganz vielen Funktionen ist, dem empfehle ich eher, sich woanders umzuschauen.
Wer aber einen kleinen Keyer mit wenigen aber praktischen Funktionen sucht, sollte hier weiterlesen. Wer aber einen kleinen Keyer mit wenigen aber praktischen Funktionen sucht, sollte hier weiterlesen.
@ -104,8 +134,6 @@ Viel Spaß!
Tom, DL7BJ Tom, DL7BJ
% \newline % \newline
\renewcommand\contentsname{Inhalt}
\tableofcontents \tableofcontents
\chapter{Funktionen} \chapter{Funktionen}
@ -113,12 +141,13 @@ Tom, DL7BJ
\item{BJ-Keyer Funktionsübersicht} \item{BJ-Keyer Funktionsübersicht}
\begin{itemize} \begin{itemize}
\item{Iambic A und Iambic B Mode} \item{Iambic A und Iambic B Mode}
\item{Anschluß für Handtaste und Paddle} \item{Anschluß für 3 Handtasten und 3 Paddle}
\item{Ausgang für Key-Eingang TRX} \item{Ausgänge für die Ansteuerung von 2 Transceivern}
\item{Ausgang für PTT} \item{optionales Tastenfeld für Speicher}
\item{Stromversorgung 7-15V} \item{Stromversorgung 7-15V}
\item{Integrierter Lautsprecher für Mithörton} \item{Integrierter Lautsprecher für Mithörton}
\item{Mithörton als Sinussignal} \item{Mithörton als Sinussignal}
\item{USB Anschluß für Firmware Update}
\end{itemize} \end{itemize}
\end{itemize} \end{itemize}
@ -127,9 +156,10 @@ Tom, DL7BJ
In dieser Dokumentation werden diverse gleichbleibende Darstellungsweisen verwendet. Dies erleichtert Dir das Verständnis der Bedeutung. Texte, die auf dem Display erscheinen, werden in der Bedienungsanleitung so \texttt{dargestellt}. Quellcode wird in einer farbigen Code-Darstellung eingebunden. In dieser Dokumentation werden diverse gleichbleibende Darstellungsweisen verwendet. Dies erleichtert Dir das Verständnis der Bedeutung. Texte, die auf dem Display erscheinen, werden in der Bedienungsanleitung so \texttt{dargestellt}. Quellcode wird in einer farbigen Code-Darstellung eingebunden.
\chapter{Grundlagen} \chapter{Grundlagen}
\section{Betriebsarten eines Morse-Keyers} \section{Betriebsarten eines Morse-Keyers}
Bei Morse-Keyer
\subsection{Zeitverhalten} \subsection{Zeitverhalten}
\begin{figure}[!ht] \begin{figure}[!ht]
@ -185,92 +215,40 @@ In dieser Dokumentation werden diverse gleichbleibende Darstellungsweisen verwen
\end{figure} \end{figure}
\chapter{Bedienung} \chapter{Die Bedienung}
\section{Bedienelemente}
\section{Tastaturbelegung} Als Bedienelemente stehen ein Drehencoder für diverse Einstellungen und ein Potentiometer für die Lautstärke des Mithörtons zur Verfügung. Optional kann ein Tastenfeld mit max. 5 Tastern für Zusatzfunktion wie Textspeicher angeschlossen werden. Zur Ausgabe von eingestellten Parametern wird ein 0,96$"$ OLED Display mit 128x64 Pixeln verwendet.
\subsection{Übersicht} \subsection{Übersicht}
\chapter{Die Schaltung}
\chapter{Schaltung}
\section{Beschreibung} \section{Beschreibung}
\chapter{Die Software}
\section{Timer 2}
Der Timer 2 läuft in der Betriebsart Pulsweitenmodulation und erzeugt das PWM Signal für den Mithörton.
\section{Schaltplan}
% \begin{figure}
% \centering
% \includegraphics[scale=0.7, angle=90]{../CAD/Schematic-Page-1}
% \caption{Mikrocontroller}
% \end{figure}
% \begin{figure}
% \centering
% \includegraphics[scale=0.7, angle=90]{../CAD/Schematic-Page-2}
% \caption{Filter \& NF-Verstärker}
% \end{figure}
% \begin{figure}
% \centering
% \includegraphics[scale=0.7, angle=90]{../CAD/Schematic-Page-3}
% \caption{Spannungsversorgung}
% \end{figure}
% \begin{figure}
% \centering
% \includegraphics[scale=0.7, angle=90]{../CAD/Schematic-Page-4}
% \caption{Zusatzplatine mit Klinkenbuchsen}
% \end{figure}
\begin{table}[!ht]
\centering
\small
\begin{tabular}{|p{1cm}|p{5cm}|p{5cm}|l|}
Prg. & Beschreibung & Wertebereich & Standard \\ \hline
\end{tabular}
\caption{Programmierpunkte Teil 1}
\end{table}
\chapter{Beschreibung der Hardware}
\begin{table}[!ht]
\centering
\small
\begin{tabular}{|l|l|l|l|}
Klemme & Funktion & Beschreibung & Prg.-Punkt\\ \hline
\end{tabular}
\caption{Klemmenbelegung}
\end{table}
\chapter{Beschreibung der Software}
\section{Timer 1} \section{Timer 1}
Mit dem Timer 1 werden die Zeiten für die Nachladewerte für Timer 2 zur Erzeugung des Sinussignals für den Mithörton erzeugt.
Der Timer 1 ist ein 16Bit Timer. Dieser wird für die Erzeugung von 2 Zeiten verwendet. \section{Timer 0}
Der Timer löst jeweils beim Erreichen der Zeit einen Interrupt aus. Die Interrupts werden Der Timer 0 läuft mit einem Takt von einer Millisekunde. Im Timer Interrupt werden 3 Zähler verwendet, so dass Zeiten von 1ms, 10ms und 20ms für diverse Abläufe zur Verfügung stehen.
alle 1ms und 20ms ausgelöst. So können einfach Interrupt gesteuerte Zeiten verwendet werden.
\subsection{Timer einstellen} \subsection{Timer einstellen}
\begin{align} \begin{align}
f_{OCnA} = \frac{f_{clk\_I/O}}{2 \cdot N \cdot (1+OCRnA)} f_{OCnA} = \frac{f_{clk\_I/O}}{2 \cdot \mathbb{N} \cdot (1+OCRnA)}
\end{align} \end{align}
\section{Sinus Mithörton durch Pulsweitenmodulation} \section{Sinus Mithörton durch Pulsweitenmodulation}
Der BJ-Keyer erzeugt einen Mithörton mit Sinuskurve, statt dem vielfach verwendeten Rechtecksignal. Der BJ-Keyer erzeugt einen Mithörton mit Sinuskurve, statt dem vielfach verwendeten Rechtecksignal.
Der Klang eines Sinussignals ist angenehmer. Um mit dem Mikrocontroller ein Sinussignal zu erzeugen, Der Klang eines Sinussignals ist angenehmer. Um mit dem Mikrocontroller ein Sinussignal zu erzeugen,
wird die Pulsweitenmodulation verwendet. wird die Pulsweitenmodulation verwendet.
\subsection{Grundlagen} \subsection{Grundlagen}
Die Pulsweitenmodulation, kurz PWM genannt, ist eine digitale Modulationsart, bei der eine Spannung Die Pulsweitenmodulation, kurz PWM genannt, ist eine digitale Modulationsart, bei der eine Spannung
zwischen zwei Werten wechselt. zwischen zwei Werten wechselt.
\begin{figure}[!ht] \begin{figure}[!ht]
\centering \centering
\begin{tikztimingtable}[timing/slope=.005, yscale=3] \begin{tikztimingtable}[timing/slope=.005, yscale=5, xscale=1.5]
\ & 4L N(A1) 4H N(A2) 5L N(A3) 4H N(A4) 8L\\ \ & 4L N(A1) 4H N(A2) 5L N(A3) 4H N(A4) 8L\\
\extracode \extracode
\begin{pgfonlayer}{background} \begin{pgfonlayer}{background}
@ -281,11 +259,9 @@ zwischen zwei Werten wechselt.
\draw [<->] (A1|-row1.mid) --node[below]{\tiny Duty Cycle} (A2|-row1.mid); \draw [<->] (A1|-row1.mid) --node[below]{\tiny Duty Cycle} (A2|-row1.mid);
\draw [<->] (4,1.5) --node[below]{\tiny Period} (13,1.5); \draw [<->] (4,1.5) --node[below]{\tiny Period} (13,1.5);
\end{tikztimingtable} \end{tikztimingtable}
\caption{PWM Ausgangssignal} \caption{Pulswellenmodulation}
\end{figure} \end{figure}
Mit einer konstanten Frequenz wird ein Rechteckimpuls moduliert, bei dem die Weite variert. Das Verhältnis zwischen Impuls und Pause wird Tastgrad (Duty Cycle) genannt.
Mit einer konstanten Frequenz wird ein Rechteckimpuls moduliert, bei
dem die Weite variert. Das Verhältnis zwischen Impuls und Pause wird Tastgrad (Duty Cycle) genannt.
Bei einer Rechteckschwingung gilt für den Tastgrad D: Bei einer Rechteckschwingung gilt für den Tastgrad D:
\begin{align} \begin{align}
@ -299,78 +275,139 @@ Die resultierende Ausgangsspannung berechnet sich wie folgt:
U_{Out} = \frac{\tau}{T} \cdot U_{In} U_{Out} = \frac{\tau}{T} \cdot U_{In}
\end{align} \end{align}
Dabei ist $U_{In}$ gleich $V_{SS}$. Bei einem Tastgrad von 50\% und einer Spannung $V_{SS}$ von 5V Dabei ist $U_{In}$ gleich $V_{SS}$. Bei einem Tastgrad von 50\% und einer Spannung $V_{SS}$ von 5V
beträgt $U_{Out}$ = 2,5V. beträgt $U_{Out}$ = 2,5V. Je länger die Einschaltzeit ist, desto höher ist die effektive Spannung
des erzeugten Rechtecksignals, bis zu $V_{SS}$ bei einem Tastgrad von 100\%.
\subsubsection{Pulsweitenmodulation} \subsubsection{Pulsweitenmodulation}
Das PWM Signal wird mit Timer 2 des ATMega328P erzeugt. Das PWM Signal wird an PortB Pin 3, OC2A ausgegeben.
Das PWM Signal wird mit einem Timer erzeugt. Um die Frequenz des PWM Signals zu verändern, wird Es wird der Fast PWM Mode 7 des Controllers verwendet, dabei ist der obere Wert des Timers der Wert
die Taktrate und der obere Grenzwert des Zählers eines Timers verändert. Eine Änderung des Output- im Register OCR2A. Der Ausgang OC2A wird auf den Ausgangswert Toggle konfiguriert, d.h. jedes Mal, wenn der
Compare-Registers ändert das Pausenverhältnis. Der PWM Ausgang des ATMega328 ist High bis der Wert Timer 2 den Wert in OCR2A erreicht, wird der Port umgeschaltet. Es wird ein Rechteck-Signal an PB3 erzeugt,
im zugehörigen OCR erreicht ist und Low bis der obere Zählwert erreicht wird. Das ist der Fast-PWM dessen Tastgrad durch OCR2A eingestellt wird. Als Taktquelle wird der CPU Takt verwendet. Dies bedeutet,
Mode des ATMega328. der Timer 2 läuft ohne einen Vorteiler.
Für die Erzeugung des Sinussignals wird der Timer 2 im Fast-PWM Mode verwendet. Der PWM Ausgang des
Timers 2 ist OC2A. Die Taktquelle des Timers 2 wird eingestellt und der PWM Mode ausgewählt, so dass
OC2A geschaltet wird. Weiter wird der Overflow-Interrupt aktiviert.
Der maximale Wert für FastPWM berechnet sich wie folgt: Der maximale Wert für FastPWM berechnet sich wie folgt:
\begin{align} \begin{align}
f = \frac{f_{Quarz}}{2 \cdot 1 \cdot 256} f = \frac{f_{Quarz}}{\mathbb{N} \cdot 256}
\end{align} \end{align}
Der maximale Wert bei einem Quarz mit 16MHz und der minimalen Vorteilung von 1 beträgt somit:
Der maximale Wert bei einem Quarz mit 8MHz und der minimalen Vorteilung von 1 beträgt somit:
\begin{align} \begin{align}
\frac{8.000000Hz}{2 \cdot 1 \cdot 256} = 15.625Hz \frac{16MHz}{1 \cdot 256} = 62,5\si{\kilo\Hz}
\end{align} \end{align}
Am Ausgang von PB3 liegt so bei einem Tastgrad von 50\% ein symmetrisches Rechtecksignal mit 62,5\si{\kilo\Hz} an. Der Effektivwert beträgt bei einer Betriebsspannung $V_{SS}$ von 5V = 2,5V. Die 256-1 sind der maximale Wert (256 Werte von 0-255), den OCR2A haben kann (Timer 2 ist ein 8 Bit Timer).
\begin{figure}[!ht]
\centering
\begin{tikzpicture}[yscale=1.0]
\begin{axis}[
width=10cm,
height=4cm,
x axis line style={-stealth},
y axis line style={-stealth},
xticklabels={},
ymax = 6,xmax=7.5,
axis lines*=center,
ytick={2.5,5},
xlabel={Zeit $\rightarrow$},
ylabel={+5V $\rightarrow$},
xlabel near ticks,
ylabel near ticks]
\addplot+[thick,mark=none,const plot]
coordinates{(0,0) (0,5) (1,0) (2,5) (3,0) (4,5) (5,0) (6,5) (7,0)};
\end{axis}
\end{tikzpicture}
\caption{Symmetrisches Rechtecksignal an PB3}
\end{figure}
Das ist aber nicht das Ziel, da der Keyer ein sinusförmiges Signal ausgeben soll. Um das zu erreichen, muss der Effektivwert der Rechteckspannung an PB3 veränderbar sein. Dies erreicht man durch eine Änderung des Tastgrades. Nun kann ein Mikrocontroller an einem digitalen Ausgangsport keinen Sinus erzeugen, einzig eine Treppe mit einer bestimmten Anzahl an Stufen, an- und absteigend ist möglich.
15625Hz entspricht einer Periodendauer von 64µs. Wenn der obere Zählwert des Timers 2 in OCR2A verändert wird, ändert sich auch der Effektivwert der Rechteckspannung, durch die Änderung des Tastgrades. Läßt man OCR2A von 0 bis 255 zählen, ändert der Tastgrad sich von 0\% bis 100\%. Wenn dies über eine Zeitdauer \tau durch Änderung von OCR2A passiert, dann steigt die effektive Spannung über diese Zeitdauer \tau von 0V-{$V_{SS}$.
\begin{align}
Diese 15.625Hz wären die Samplerate. Für einen Sinuston von 800Hz bei 256 Schritten für die Einzelwerte V_{eff} = U_{max} \cdot \sqrt{Tastgrad}
der PWM wären aber 800 \cdot 256 = 204.800Hz erforderlich. Die einzige Möglichkeit, mit dieser niedrigen \end{align}
Samplerate ist die Verringerung der Schritte. Auf jeden Fall wird die Pulsbreitenänderung im hörbaren Bereich Da der digitale Port nur zwischen Low und High wechseln und keine negativen Spannungen erzeugen kann, legt man eine virtuelle Nulllinie auf die Mitte, also auf 2,5V\footnote{es wird im weiteren Verlauf immer von $V_{ss}$ = 5V ausgegangen}. Die 2,5V werden bei einem Tastgrad von 50\% erreicht, entsprechend einem Wert von 128 in OCR2A.
liegen, dies soll das RLC Filter am Ausgang des Controllers bereinigen.
Bei 16 Schritten würde eine Samplerate von 800Hz \cdot 16 = 12.800Hz erforderlich sein. Erhöht man den Wert von OCR2A in Form einer Sinusfunktion von 128 auf 255 über eine Zeitdauer \tau, ergibt sich eine ansteigende effektive Spannung in Form einer Sinusfunktion von 2,5V auf 5,0V. Verringert man den Wert von OCR2A von 255 auf 0 in Form einer Sinusfunktion, fällt die effektive Spannung auf 0V. Durch die passende Änderung von OCR2A in Form einer Sinusfunktion über die Zeitdauer \tau können somit Effektivspannungen mit 256 Werten dargestellt werden. Je mehr Werte es über die Zeitdauer \tau sind, umso genauer ist die resultierende Hüllkurve in Form eines Sinus.
Da ich 800Hz als Mithörton zu hoch empfinde und damit die PWM und die Nachladefrequenz \begin{figure}[!ht]
möglichst synchron laufen, habe ich 32 Schritte gewählt. Dies führt dann dazu, dass bei \centering
32 Teilschritten der Sinusperiode pro Teilschritt 4 PWM Impulse erzeugt werden. Damit ist die Nachladefrequenz \includegraphics[scale=0.7]{../Pictures/pwm_duty_cycle}
und die PWM Frequenz synchron und es ergibt sich ein Mithörton mit einer Frequenz von 488.28Hz. \caption{PWM - Tastgrad - Sinus}
\end{figure}
Die Zeitdauer \tau, mit der OCR2A mit den Werten einer Sinusfunktion geladen wird, legt die Frequenz des Mithörtons fest. Für die Zeitdauer \tau wird ein weiterer Timer benötigt. Für einen Mithörton von 600Hz müssen 600 \cdot 256 Werte pro Sekunde über einen Interrupt in OCR2A geladen werden. Je mehr Werte es sind, um so genauer ist die Kurvenform. Für den Timer kann die Zeit wie folgt berechnet werden:
\begin{align}
600\si{Hz} \cdot 256 = 153,6\si{\kilo\Hz}
\end{align}
Die Timer 1 läuft im CTC Modus und es wird ein Output Compare Match Interrupt ausgelöst. Das bedeutet, der Timer läuft bis zum Wert in OCR1A hoch und dann erfolgt der Interrupt. Der Wert für OCR1A wird wie folgt berechnet:
\begin{align}
f_{OCR1A} = \frac{fclk_{I/O}}{\mathbb{N} \cdot (1+OCR1A)}
\end{align}
Daraus folgt, daß sich ein Wert von
\begin{align}
OCR1A = \left( \frac{16\si{\mega\Hz}} {8 \cdot 153,6\si{\kilo\Hz}}\right) - 1 = 12
\end{align}
12 für OCR1A ergibt. Allerdings bedeutet eine Frequenz von 153,6\si{\kilo\Hz} für den Timer, dass alle 6,5µs ein Interrupt ausgelöst wird, bei 800\si{Hz} Mithörton sind es alle 5µs.
Der Controller läuft mit 16\si{\mega\Hz}, ein Taktzyklus dauert 62,5ns. Damit bleiben ungefähr 80 Taktzyklen für alle restlichen Aufgaben, wie Tasten abfragen, Display ansteuern, Drehgeber abfragen, CW Zeichen ausgeben. Das ist sehr wenig und die Gefahr besteht, dass Interrupts der Tasteneingänge verloren gehen\footnote{was auch in der Praxis bei den Tests so war}. Der einzige Weg zur Verlängerung der Zeit zwischen 2 Interrupts besteht in einer Verringerung der Werte für die Sinusfunktion. Mit den 256 Werten ist die Kurvenform zwar fein abgestuft, aber der Controller ist damit am Limit.
Bei einer Verringerung auf 64 Werte für den Sinus ergibt sich dann bei 600\si{Hz} eine Zeit von 26µs, das entspricht ungefähr 416 Taktzyklen, was mehr als ausreichend ist. Das der Mithörton dadurch etwas rauher im Klang wird, muss das nachfolgende RLC Filter ausgleichen.
\begin{align} \begin{align}
\frac{\frac{15.625}{32}} = 488.28Hz 600\si{Hz} \cdot 64 = 38,4\si{\kilo\Hz}
\end{align} \end{align}
Mit einer Tabelle von 64 Werten ergibt sich für den Timer 1 eine Frequenz von 38,4\si{\kilo\Hz} und für OCR1A ein Wert von 51 bei einem Prescaler von 8.
\begin{align}
OCR1A = \left( \frac{16\si{\mega\Hz}} {8 \cdot 38,4\si{\kilo\Hz}}\right) - 1 = 51
\end{align}
Die Berechnung der Werte für OCR1A für unterschiedliche Frequenzen des Mithörtons erfolgt nach dieser Formel mit $f_{Sinus}$ als gewünschte Frequenz des Mithörtons.
\begin{align}
OCR1A = \left( \frac{f_{clk\_I/O}} {\mathbb{N} \cdot 64 \cdot f_{Sinus}}\right) - 1
\end{align}
\begin{table}[!ht]
\centering
\begin{tabular}{|l|l|}
$f_{Sinus}$ & OCR1A\\ \hline
1000Hz & 30 \\
800Hz & 38 \\
600Hz & 51 \\
400Hz & 77 \\
\end{tabular}
\caption{OCR1A Werte für verschiedene Frequenzen des Mithörtons}
\end{table}
\subsection{Sinustabelle} \subsection{Sinustabelle}
Über den Overflow-Interrupt vom Timer 2 wird der jeweils nächste Wert einer Sinustabelle in OCR2A Über den Overflow-Interrupt vom Timer 1 wird der jeweils nächste Wert einer Sinustabelle in OCR2A
geladen. Die Sinustabelle wurde mit einem einfachen Perl-Script erzeugt und wird als Include Datei geladen. Die Sinustabelle wurde mit einem einfachen Python3 Script erzeugt.
eingebunden. Bei jedem Interrupt wird der nächste Wert nach OCR2A geladen. Die Sinustabelle hat 32
Werte. Die Frequenz für das Sinussignal berechnet sich wie folgt:
\begin{align} \begin{figure}[!ht]
f = \frac{Samplerate}{32} \centering
\end{align} \includegraphics[scale=0.5]{../Pictures/sinewave-line.jpg}
\caption{Sinus nach Tabelle vom Python3 Script als Linie}
\end{figure}
Jeder Eintrag der Sinustabelle bestimmt das Pausenverhältnis von Timer 2. Jetzt müssen die 32 Werte Die 64 Werte vom Python3 Script ergeben sich wie folgt:
zum richtigen Zeitpunkt in OCR2A geladen werden. Dies übernimmt der Timer 0. Timer 0 ist ein 8-Bit
Timer und der nötige Werte wären \begin{align}\frac{8.000000Hz}{15625Hz} = 512\end{align}.
\begin{verbnobox}[\tiny]
const unsigned char sinewave[] PROGMEM = {
0x80,0x8d,0x99,0xa5,0xb1,0xbd,0xc8,0xd2,0xdb,0xe3,0xeb,0xf1,0xf6,0xfa,0xfd,0xff, // 16
0xff,0xfe,0xfc,0xf8,0xf4,0xee,0xe7,0xdf,0xd6,0xcd,0xc2,0xb7,0xab,0x9f,0x93,0x86, // 32
0x7a,0x6d,0x61,0x55,0x49,0x3e,0x33,0x2a,0x21,0x19,0x12,0x0c,0x08,0x04,0x02,0x01, // 48
0x01,0x03,0x06,0x0a,0x0f,0x15,0x1d,0x25,0x2e,0x38,0x43,0x4f,0x5b,0x67,0x73,0x80 // 64
};
\end{verbnobox}
In dieser Grafik sind die 64 Werte als Stützpunkte eingezeichnet.
\begin{figure}[!ht]
\centering
\includegraphics[scale=0.5]{../Pictures/sinewave-dots.jpg}
\caption{Sinus nach der Tabelle vom Python3 Script mit Stützpunkten}
\end{figure}
\listoftables
\listoffigures
\appendix
\chapter{Entwicklungsumgebung} \chapter{Entwicklungsumgebung}
Als Entwicklungsumgebung verwende ich mehrere, ausschließlich kostenfreie und überwiegend Open Source Programme: Als Entwicklungsumgebung verwende ich mehrere, ausschließlich kostenfreie und überwiegend Open Source Programme:
\begin{itemize} \begin{itemize}
\item{Editor vim \& neovim} \item{Editor neovim}
\item{Shell bash} \item{Shell bash}
\item{Filemanager mc} \item{Filemanager mc}
\item{Terminalmultiplexer tmux}
\item{RS232 Terminal minicom} \item{RS232 Terminal minicom}
\item{Dokumentation lualatex} \item{Dokumentation lualatex}
\item{PDF Reader zathura} \item{PDF Reader zathura}
@ -388,4 +425,8 @@ Als Entwicklungsumgebung verwende ich mehrere, ausschließlich kostenfreie und
Wie man sieht, sind das bis auf die CAD Anwendungen und dem PDF Reader alles Anwendungen für die Textconsole. Ich finde, richtig produktiv kann man nur mit der Textconsole arbeiten ;-) Wie man sieht, sind das bis auf die CAD Anwendungen und dem PDF Reader alles Anwendungen für die Textconsole. Ich finde, richtig produktiv kann man nur mit der Textconsole arbeiten ;-)
\listoftables
\listoffigures
\appendix
\end{document} \end{document}

@ -1,23 +1,24 @@
\selectlanguage *{latex} \babel@toc {ngerman}{}
\selectlanguage *{latex}
\contentsline {chapter}{\numberline {1}Funktionen}{5}{chapter.1}% \contentsline {chapter}{\numberline {1}Funktionen}{5}{chapter.1}%
\contentsline {chapter}{\numberline {2}Hinweise zur Dokumentation}{7}{chapter.2}% \contentsline {chapter}{\numberline {2}Hinweise zur Dokumentation}{7}{chapter.2}%
\contentsline {chapter}{\numberline {3}Grundlagen}{9}{chapter.3}% \contentsline {chapter}{\numberline {3}Grundlagen}{9}{chapter.3}%
\contentsline {section}{\numberline {3.1}Betriebsarten eines Morse-Keyers}{9}{section.3.1}% \contentsline {section}{\numberline {3.1}Betriebsarten eines Morse-Keyers}{9}{section.3.1}%
\contentsline {subsection}{\numberline {3.1.1}Zeitverhalten}{9}{subsection.3.1.1}% \contentsline {subsection}{\numberline {3.1.1}Zeitverhalten}{9}{subsection.3.1.1}%
\contentsline {chapter}{\numberline {4}Bedienung}{11}{chapter.4}% \contentsline {chapter}{\numberline {4}Die Bedienung}{11}{chapter.4}%
\contentsline {section}{\numberline {4.1}Tastaturbelegung}{11}{section.4.1}% \contentsline {section}{\numberline {4.1}Bedienelemente}{11}{section.4.1}%
\contentsline {subsection}{\numberline {4.1.1}Übersicht}{11}{subsection.4.1.1}% \contentsline {subsection}{\numberline {4.1.1}Übersicht}{11}{subsection.4.1.1}%
\contentsline {chapter}{\numberline {5}Schaltung}{13}{chapter.5}% \contentsline {chapter}{\numberline {5}Die Schaltung}{13}{chapter.5}%
\contentsline {section}{\numberline {5.1}Beschreibung}{13}{section.5.1}% \contentsline {section}{\numberline {5.1}Beschreibung}{13}{section.5.1}%
\contentsline {section}{\numberline {5.2}Schaltplan}{13}{section.5.2}% \contentsline {chapter}{\numberline {6}Die Software}{15}{chapter.6}%
\contentsline {chapter}{\numberline {6}Beschreibung der Hardware}{15}{chapter.6}% \contentsline {section}{\numberline {6.1}Timer 2}{15}{section.6.1}%
\contentsline {chapter}{\numberline {7}Beschreibung der Software}{17}{chapter.7}% \contentsline {section}{\numberline {6.2}Timer 1}{15}{section.6.2}%
\contentsline {section}{\numberline {7.1}Timer 1}{17}{section.7.1}% \contentsline {section}{\numberline {6.3}Timer 0}{15}{section.6.3}%
\contentsline {subsection}{\numberline {7.1.1}Timer einstellen}{17}{subsection.7.1.1}% \contentsline {subsection}{\numberline {6.3.1}Timer einstellen}{15}{subsection.6.3.1}%
\contentsline {section}{\numberline {7.2}Sinus Mithörton durch Pulsweitenmodulation}{17}{section.7.2}% \contentsline {section}{\numberline {6.4}Sinus Mithörton durch Pulsweitenmodulation}{15}{section.6.4}%
\contentsline {subsection}{\numberline {7.2.1}Grundlagen}{17}{subsection.7.2.1}% \contentsline {subsection}{\numberline {6.4.1}Grundlagen}{16}{subsection.6.4.1}%
\contentsline {subsubsection}{\nonumberline Pulsweitenmodulation}{18}{subsubsection*.10}% \contentsline {subsubsection}{\nonumberline Pulsweitenmodulation}{16}{subsubsection*.8}%
\contentsline {subsection}{\numberline {7.2.2}Sinustabelle}{19}{subsection.7.2.2}% \contentsline {subsection}{\numberline {6.4.2}Sinustabelle}{19}{subsection.6.4.2}%
\contentsline {chapter}{\numberline {A}Entwicklungsumgebung}{25}{appendix.A}% \contentsline {chapter}{\numberline {7}Entwicklungsumgebung}{21}{chapter.7}%
\contentsline {chapter}{\nonumberline Tabellen}{23}{chapter*.14}%
\contentsline {chapter}{\nonumberline Abbildungen}{25}{chapter*.15}%
\providecommand \tocbasic@end@toc@file {}\tocbasic@end@toc@file \providecommand \tocbasic@end@toc@file {}\tocbasic@end@toc@file

@ -1,2 +1,2 @@
:080000000032008A02000F55D6 :080000000032005802000F5508
:00000001FF :00000001FF

@ -175,8 +175,8 @@ AVRDUDE_PORT = /dev/ttyACM0
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep #AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
AVRDUDE_WRITE_FLASH += -U lfuse:w:0xce:m AVRDUDE_WRITE_FLASH += -U lfuse:w:0xf7:m
AVRDUDE_WRITE_FLASH += -U hfuse:w:0xd9:m AVRDUDE_WRITE_FLASH += -U hfuse:w:0xdc:m
AVRDUDE_WRITE_FLASH += -U efuse:w:0xfc:m AVRDUDE_WRITE_FLASH += -U efuse:w:0xfc:m
# Uncomment the following if you want avrdude's erase cycle counter. # Uncomment the following if you want avrdude's erase cycle counter.

@ -1,7 +1,18 @@
/*
*
*
*
*/
#ifndef BJ-KEYER_H_INCLUDED #ifndef BJ-KEYER_H_INCLUDED
#define BJ-KEYER_H_INCLUDED #define BJ-KEYER_H_INCLUDED
#define F_CPU 16000000UL #define F_CPU 16000000UL
#define PRESCALER 8
#define SINEWAVELENGTH 64
#define F_CPUPRESIN (F_CPU/(PRESCALER*SINEWAVELENGTH))
#define USART_BAUDRATE 9600
#define UBRR_VALUE (((F_CPU/(USART_BAUDRATE*16UL)))-1)
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
@ -43,6 +54,9 @@ const char Yes[] = "J";
const char No[] = "N"; const char No[] = "N";
const char Hz[] = "Hz"; const char Hz[] = "Hz";
// Const strings for VT100
const char CLRSCR[] = "\033[2J";
#ifndef EEMEM #ifndef EEMEM
#define EEMEM __attribute__ ((section (".eeprom"))) #define EEMEM __attribute__ ((section (".eeprom")))
#endif #endif
@ -81,6 +95,7 @@ const char Hz[] = "Hz";
#define SENDING_DIT 1 #define SENDING_DIT 1
#define SENDING_DAH 2 #define SENDING_DAH 2
#define SENDING_ELEMENT_SPACE 3 #define SENDING_ELEMENT_SPACE 3
#define SENDING_STRAIGHT 4
// //
#define AUTOMATIC_SENDING 0 #define AUTOMATIC_SENDING 0
#define AUTOMATIC 0 #define AUTOMATIC 0
@ -123,35 +138,18 @@ const char Hz[] = "Hz";
#define CLEARLINE " " #define CLEARLINE " "
// Sine wave table for PWM, 256 values // Sine wave table for PWM, 256 values
const int sinewave_length=256;
const unsigned char sinewave[] PROGMEM = { const unsigned char sinewave[] PROGMEM = {
0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae, 0x80,0x8d,0x99,0xa5,0xb1,0xbd,0xc8,0xd2,0xdb,0xe3,0xeb,0xf1,0xf6,0xfa,0xfd,0xff, // 16
0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8, 0xff,0xfe,0xfc,0xf8,0xf4,0xee,0xe7,0xdf,0xd6,0xcd,0xc2,0xb7,0xab,0x9f,0x93,0x86, // 32
0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5, 0x7a,0x6d,0x61,0x55,0x49,0x3e,0x33,0x2a,0x21,0x19,0x12,0x0c,0x08,0x04,0x02,0x01, // 48
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff, 0x01,0x03,0x06,0x0a,0x0f,0x15,0x1d,0x25,0x2e,0x38,0x43,0x4f,0x5b,0x67,0x73,0x80 // 64
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,
0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3,
0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83,
0X80,0X7C,0X79,0X76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51,
0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,
0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,
0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23,
0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c,
0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c
}; };
uint8_t sdebug[64];
// Sidetone generation // Sidetone generation
double sidetone_f = 650; double sidetone_f = 600;
const double refclk = 31376.6;
volatile unsigned long tword_m;
volatile unsigned long phaccu;
volatile uint8_t c4ms;
volatile uint8_t icnt; volatile uint8_t icnt;
volatile uint8_t icnt1;
volatile uint16_t idx;
// Diverse Zähler für Timer 0 // Diverse Zähler für Timer 0
uint16_t StoreEEprom = 0; // Wartezeit bis EEPROM geschrieben wird uint16_t StoreEEprom = 0; // Wartezeit bis EEPROM geschrieben wird
@ -188,11 +186,16 @@ uint8_t MachineMode = NORMAL;
uint8_t PaddleMode = PADDLE_NORMAL; uint8_t PaddleMode = PADDLE_NORMAL;
uint8_t KeyerMode = IAMBIC_A; uint8_t KeyerMode = IAMBIC_A;
uint8_t SidetoneMode = NORMAL; uint8_t SidetoneMode = NORMAL;
uint8_t state_sidetoneoff = 0;
volatile uint8_t Mode = NORMAL; volatile uint8_t Mode = NORMAL;
volatile uint8_t SendStatus = SENDING_NOTHING; volatile uint8_t SendStatus = SENDING_NOTHING;
volatile uint8_t LastSendStatus = MANUAL_SENDING; volatile uint8_t LastSendStatus = MANUAL_SENDING;
// History
uint8_t keyhistory = 0xff;
uint8_t KeyTX = 1; uint8_t KeyTX = 1;
uint8_t DahBuffer = 0; uint8_t DahBuffer = 0;
@ -219,7 +222,7 @@ uint8_t dummy = 0x55;
uint8_t ee_dummy EEMEM = 0x55; // Dummy for Address 0 uint8_t ee_dummy EEMEM = 0x55; // Dummy for Address 0
uint8_t ee_wpm EEMEM = 15; // WpM uint8_t ee_wpm EEMEM = 15; // WpM
uint8_t ee_sidetone EEMEM = 0; // Mithörton An (1) oder Aus (0) uint8_t ee_sidetone EEMEM = 0; // Mithörton An (1) oder Aus (0)
uint16_t ee_sidetone_f EEMEM = 650; // Frequenz des Mithörtons uint16_t ee_sidetone_f EEMEM = 600; // Frequenz des Mithörtons
uint8_t ee_iambic EEMEM = 0; // Iambic Mode A oder B uint8_t ee_iambic EEMEM = 0; // Iambic Mode A oder B
uint8_t ee_weight EEMEM = 50; // Dah dit Ratio uint8_t ee_weight EEMEM = 50; // Dah dit Ratio
uint8_t ee_trx EEMEM = 0; // TRX 1 (0), TRX 2 (1), Beide (2) uint8_t ee_trx EEMEM = 0; // TRX 1 (0), TRX 2 (1), Beide (2)
@ -244,13 +247,13 @@ void InitTimer(void);
void CheckDahPaddle(void); void CheckDahPaddle(void);
void CheckDitPaddle(void); void CheckDitPaddle(void);
void CheckPaddle(void); void CheckPaddle(void);
void CheckStraightKey(void);
void SendDit(uint8_t SendingType); void SendDit(uint8_t SendingType);
void SendDah(uint8_t SendingType); void SendDah(uint8_t SendingType);
void PTTKey(uint8_t State); void PTTKey(uint8_t State);
void SideToneOff(void); void SideToneOff(void);
void SideToneOn(void); void SideToneOn(void);
void TXSidetoneKey(uint8_t State, uint8_t SendingType); void TXSidetoneKey(uint8_t State, uint8_t SendingType);
void TellMode(void);
void SendChar(uint8_t); void SendChar(uint8_t);
void ChangeSpeed(void); void ChangeSpeed(void);
@ -258,6 +261,6 @@ void dah(void);
void dit(void); void dit(void);
void DoMorse(void); void DoMorse(void);
void SetFrequency(double f); void SetFrequency(uint16_t f);
#endif // BJ-KEYER_H_INCLUDED #endif // BJ-KEYER_H_INCLUDED

@ -27,10 +27,10 @@ volatile int16_t iButtonPressedLongCycles = 0;
typedef enum EButtonState typedef enum EButtonState
{ {
ButtonState_Unpressed, ButtonState_Unpressed,
ButtonState_Pressed, ButtonState_Pressed,
ButtonState_Hold, ButtonState_Hold,
ButtonState_Released ButtonState_Released
}tEButtonState; }tEButtonState;
volatile tEButtonState buttonState = ButtonState_Unpressed; volatile tEButtonState buttonState = ButtonState_Unpressed;
@ -51,7 +51,7 @@ void EncoderInit(void)
} }
/** \brief EncoderPolling /** \brief EncoderPolling
* Abfrage des Drehencoders und des Tasters * Abfrage des Drehencoders und des Tasters
* Wird vom Timer 0 jede ms aufgerufen * Wird vom Timer 0 alle 5ms aufgerufen
*/ */
void EncoderPolling(void) void EncoderPolling(void)
{ {

@ -1,9 +1,9 @@
#ifndef ENCODER_H_ #ifndef ENCODER_H_
#define ENCODER_H_ #define ENCODER_H_
//Art des Drehencoders definieren // Art des Drehencoders definieren
//#define SingleStep // #define SingleStep
//#define TwoStep // #define TwoStep
#define TwoStep #define TwoStep
#define ENC_A_PORT PORTB /**< port for line A */ #define ENC_A_PORT PORTB /**< port for line A */
@ -20,17 +20,17 @@ typedef enum EButtonPressedState
ButtonPressed_Long ButtonPressed_Long
}tEButtonPressedState; }tEButtonPressedState;
//Initialisiert den Encoder und aktiviert den Interrupt + Timer // Initialisiert den Encoder und aktiviert den Interrupt + Timer
void EncoderInit( void ); void EncoderInit( void );
//Liest die Position des Encoders aus // Liest die Position des Encoders aus
//Wenn Ueberlauf=1 dann zählt der Encoder nach Max // Wenn Ueberlauf=1 dann zählt der Encoder nach Max
//wieder von Min und umgekehrt // wieder von Min und umgekehrt
int8_t EncoderRead( char Ueberlauf ); int8_t EncoderRead( char Ueberlauf );
//Ruft den Status des Encoder-Knopfes // Ruft den Status des Encoder-Knopfes
tEButtonPressedState EncoderGetButtonState(void); tEButtonPressedState EncoderGetButtonState(void);
//Setzt die aktuelle Drehencoderposition // Setzt die aktuelle Drehencoderposition
void EncoderWrite(int8_t EncoderPos); void EncoderWrite(int8_t EncoderPos);
//Setzt Min- und Max-Werte für die Drehgeberposition // Setzt Min- und Max-Werte für die Drehgeberposition
void EncoderMinMax(int8_t EncoderMin,int8_t EncoderMax); void EncoderMinMax(int8_t EncoderMin,int8_t EncoderMax);
void EncoderPolling(void); void EncoderPolling(void);
#endif /* ENCODER_H_ */ #endif /* ENCODER_H_ */

@ -73,8 +73,16 @@ void ReadEEProm_WpM(void)
} }
} }
void SendSerialChar(unsigned char data)
{
while(!(UCSR0A & (1<<UDRE0)));
UDR0 = data;
}
void SendSerialString(char *s)
{
while(*s != 0x00)
SendSerialChar(*s++);
}
/** \brief Read port pin of morse keys /** \brief Read port pin of morse keys
* This function reads the input of * This function reads the input of
@ -90,16 +98,16 @@ uint8_t ReadKeyPin(uint8_t pin)
*/ */
void SideToneOn(void) void SideToneOn(void)
{ {
sbi(TIMSK2,TOIE2); state_sidetoneoff = 0;
PORTD |= (1<<MORSE_LED); sbi(TIMSK1,OCIE1A);
} }
/* /*
** SideToneOff ** SideToneOff
*/ */
void SideToneOff(void) void SideToneOff(void)
{ {
cbi(TIMSK2,TOIE2); state_sidetoneoff = 1;
PORTD &= ~(1<<MORSE_LED); cbi(TIMSK1,OCIE1A);
} }
/* /*
** TXSidetoneKey ** TXSidetoneKey
@ -126,7 +134,18 @@ void TXSidetoneKey(uint8_t State, uint8_t SendingType)
} }
} }
} }
/** \brief StraigtKey
*
* Check Straightkey
*
*/
void CheckStraightKey(void)
{
if(PIND & (1<<STRAIGHT_KEY))
TXSidetoneKey(0,MANUAL_SENDING);
else
TXSidetoneKey(1,MANUAL_SENDING);
}
/** \brief CheckPaddles /** \brief CheckPaddles
* Original code K3NG keyer line 5654 * Original code K3NG keyer line 5654
* *
@ -250,7 +269,7 @@ void Loop(uint8_t len, uint8_t AddMilliSeconds, uint8_t inWpM, uint8_t SendingTy
} }
} }
if((KeyerMode == IAMBIC_A) && (IambicFlag) && ReadKeyPin(LEFT_PADDLE) && ReadKeyPin(RIGHT_PADDLE)){ if((KeyerMode == IAMBIC_A) && (IambicFlag) && ReadKeyPin(LEFT_PADDLE) && ReadKeyPin(RIGHT_PADDLE)) {
IambicFlag = 0; IambicFlag = 0;
DitBuffer = 0; DitBuffer = 0;
DahBuffer = 0; DahBuffer = 0;
@ -279,13 +298,13 @@ void SendDah(uint8_t SendingType)
Loop(1,0,wpm,SendingType); Loop(1,0,wpm,SendingType);
} }
/* /*
** set sidetone frequency ** Set sidetone frequency
*/ */
void SetFrequency(double f) void SetFrequency(uint16_t f)
{ {
cbi(TIMSK2,TOIE2); IntDisable();
tword_m = pow(2,32)*f/refclk; OCR1A = (F_CPUPRESIN / f) - 1;
sbi(TIMSK2,TOIE2); IntEnable();
} }
/* /*
** Output a tone width frequency f and duration duration ** Output a tone width frequency f and duration duration
@ -293,54 +312,26 @@ void SetFrequency(double f)
*/ */
void Tone(uint16_t f, uint8_t duration) void Tone(uint16_t f, uint8_t duration)
{ {
SideToneOff();
SetFrequency(f); SetFrequency(f);
SideToneOn(); SideToneOn();
delayms(duration); delayms(duration);
SetFrequency(sidetone_f);
SideToneOff(); SideToneOff();
} }
void Boop(void) void Boop(void)
{ {
Tone(600,100); Tone(600,100);
} }
void Beep(void) void Beep(void)
{ {
Tone(1200,100); Tone(1200,100);
} }
void BeepBoop(void) void BeepBoop(void)
{ {
Beep(); sbi(PORTB,AUDIO_EN);
delayms(100); delayms(10);
Boop(); Beep();
} delayms(100);
Boop();
/*
**
** Output the current mode of keyer as CW
**
*/
void TellMode(void)
{
char text[9];
int len = 0;
int i = 0;
switch(KeyerMode)
{
case STRAIGHT: sprintf(text,"STRAIGHT");
break;
case IAMBIC_B: sprintf(text,"IAMBIC B");
break;
case IAMBIC_A: sprintf(text,"IAMBIC A");
break;
}
len = strlen(text);
for(i = 0; i < len; i++)
{
SendChar(text[i]);
}
} }
void SendChar(unsigned char c) void SendChar(unsigned char c)

@ -1,5 +1,6 @@
/** \brief BJ-Keyer /** \brief BJ-Keyer
:
Morsekeyer von DL7BJ Morsekeyer von DL7BJ
tom@dl7bj.de tom@dl7bj.de
@ -43,22 +44,27 @@
Pin 5 - PD3 - Right Paddle Pin 24 - PC1 - TRX 1 Out Pin 5 - PD3 - Right Paddle Pin 24 - PC1 - TRX 1 Out
Pin 6 - PD4 - Straight Key Pin 23 - PC0 - Mem 4 Pin 6 - PD4 - Straight Key Pin 23 - PC0 - Mem 4
Pin 19 - PB5 - Mem 5 Pin 19 - PB5 - Mem 5
Pin 11 - PD5 - Mem 1 Pin 18 - PB4 - _Audio SD Pin 11 - PD5 - Mem 1 Pin 18 - PB4 - _Audio SD
Pin 12 - PD6 - Mem 2 Pin 17 - OC2A - Audio PWM output Pin 12 - PD6 - Mem 2 Pin 17 - OC2A - Audio PWM output
Pin 13 - PD7 - Mem 3 Pin 16 - PB2 - Encoder Switch Pin 13 - PD7 - Mem 3 Pin 16 - PB2 - Encoder Switch
Pin 14 - PB0 - Encoder A Pin 15 - PB1 - Encoder B Pin 14 - PB0 - Encoder A Pin 15 - PB1 - Encoder B
Value 1 2 4 8 32 64 128 255 Value 1 2 4 8 32 64 128 255
Bit 1 2 3 4 5 6 7 8 Bit 1 2 3 4 5 6 7 8
Pin 0 1 2 3 4 5 6 7 Pin 0 1 2 3 4 5 6 7
@endverbatim @endverbatim
*/ */
#include "bj-keyer.h" #include "bj-keyer.h"
// Additional files // Additional files
#include "functions.c" #include "functions.c"
#define LENGTH 256
#define AMP 127
#define OFFSET 128
#define PI2 6.283185
/** /**
* \brief Initialsieren der Timer * \brief Initialsieren der Timer
* *
@ -66,55 +72,47 @@
* *
* Timer 0 - 8 Bit timer für 1ms * Timer 0 - 8 Bit timer für 1ms
* Timer 2 - 8 Bit timer für PWM zur Erzeugung des Sinustons * Timer 2 - 8 Bit timer für PWM zur Erzeugung des Sinustons
* Timer 1A - 16 Bit timer für CW Elemente und Pausen * Timer 1A - 16 Bit timer zur Erzeugung der Hüllkurve
* Timer 1B - 16 Bit timer nicht benutzt * Timer 1B - 16 Bit timer wird nicht benutzt
* *
* T - dot duration * T - dot duration
* wpm - Words per Minute based on PARIS * wpm - Words per Minute based on PARIS
*
* Formula T = 1200 / wpm * Formula T = 1200 / wpm
*
* Minimum speed 10 wpm - dot duration 120ms * Minimum speed 10 wpm - dot duration 120ms
* Maximum speed 99 wpm - dot duration 12ms * Maximum speed 99 wpm - dot duration 12ms
* *
* Timer 0 with 1ms interrupt
* Timer 1A with 64µs interrupt
* Timer 2B with 20ms interrupt
* Timer 2 is used to generate a sine wave with PWM.
*
*/ */
void InitTimer(void) void InitTimer(void)
{ {
cli(); cli();
// Timer 2 // Timer 2 PWM
// prescaler to 1 => foc2apwm = fclk_I/O / 256 = 15.625Hz (p.149) TCCR2A = 0;
// PWM mode to phase correct PWM, 16.000.000MHz / 510 = 31372.55Hz TCCR2B = 0;
// (p.150) // No prescaling
sbi(TCCR2B,CS20); sbi(TCCR2B,CS20);
cbi(TCCR2B,CS21);
cbi(TCCR2B,CS22);
// Clear OC2A on compare match // Clear OC2A on compare match
cbi(TCCR2A,COM2A0);
sbi(TCCR2A,COM2A1); sbi(TCCR2A,COM2A1);
// Phase correct PWM Mode 1 // Fast PWM Mode
sbi(TCCR2A,WGM20); sbi(TCCR2A,WGM20);
cbi(TCCR2A,WGM21); sbi(TCCR2A,WGM21);
cbi(TCCR2A,WGM22); // Phase Correct PWM
//sbi(TCCR2A,WGM22);
// Timer 1 //sbi(TCCR2A,WGM20);
// 16MHz / (65535 * 1024) = 238.42Hz // Initial value
// T = 1 / 238.42Hz = 4.19ms OCR2A = 0x80;
// Timertick = 64µs sbi(DDRB,PB3);
TCCR1A = 0; TCCR1B = 0; TCCR1C = 0; TCNT1 = 0;
sbi(TCCR1B,CS12); // Timer 1 für die Sinus Hüllkurve
cbi(TCCR1B,CS11); TCCR1A = 0; TCCR1B = 0; TIMSK1 = 0;
sbi(TCCR1B,CS10); // prescaler 1024 (p.135) // CTC Mode
sbi(TIMSK1,TOIE1); // Enable Overflow Interrupt sbi(TCCR1B,WGM12);
// Prescaling 8
// Timer 0 sbi(TCCR1B,CS11);
// 16MHz / 64 = 250kHz // Output Compare Match Interrupt Enable
// Timertick T = 1 / 250kHz = 4µs OCR1A = 51; // 600Hz
// CTC 250 x 4µs = 1ms sbi(TIMSK1,OCIE1A);
// Timer 0 1ms für diverse Zähler
TCCR0A = 0; TCCR0B = 0; TCNT0 = 0; TCCR0A = 0; TCCR0B = 0; TCNT0 = 0;
cbi(TCCR0A,WGM00); cbi(TCCR0A,WGM00);
sbi(TCCR0A,WGM01); sbi(TCCR0A,WGM01);
@ -129,28 +127,57 @@ void InitTimer(void)
void Init() void Init()
{ {
cli(); // disable all interrupts cli(); // disable all interrupts
MachineMode = NORMAL; MachineMode = NORMAL;
SendStatus = SENDING_NOTHING; SendStatus = SENDING_NOTHING;
// PORTB // PORTB
PORTB |= (1<<PB0) | (1<<PB1) | (1<<PB2) | 1<<(PB4) | (1<<PB5); // Pullup enabled DDRB = 0x00;
DDRB = (1<<PB3); // PB1, PB3 Output // Interne PullUps einschalten
sbi(PORTB,PB0);
sbi(PORTB,PB1);
sbi(PORTB,PB2);
sbi(PORTB,PB3);
sbi(PORTB,PB5);
sbi(PORTB,AUDIO_EN);
// Ein- und Ausgänge festlegen
sbi(DDRB,PB3); // PWM
sbi(DDRB,AUDIO_EN);
// Audio Verstärker abschalten
// cbi(PORTB,AUDIO_EN);
// PORTC
sbi(DDRC,MORSE_LED);
// PORTD // PORTD
// Ein- und Ausgänge festlegen
DDRD = 0x00; DDRD = 0x00;
DDRD = (1<<PD0) | (1<<PD1) | (1<<PD6) | (1<<PD7); // PD7 Output LED Morsecode, PD6 Output LED_RES // Interne PullUps für die Eingänge abschalten
PORTD |= (1<<PD6) | (1<<PD7); // Alle LED aus cbi(PORTD,LEFT_PADDLE);
cbi(PORTD,RIGHT_PADDLE);
cbi(PORTD,STRAIGHT_KEY);
// PD4,PD5 paddle input
// switch of internal pullups
cbi(PORTD,PD4);
cbi(PORTD,PD5);
t_element_length = (uint16_t)1200/bConfig.wpm; t_element_length = (uint16_t)1200/bConfig.wpm;
InitTimer();
// Pin Change Interrupts Port D - Keys
// PD4 - StraightKey - PCINT20 - Pin Change Interrupt 20
// PD3 - Right Paddle - PCINT19 - Pin Change Interrupt 19
// PD2 - Left Paddle - PCINT18 - Pin Change Interrupt 18
sbi(PCICR,PCIE2);
sbi(PCMSK2,PCINT18);
sbi(PCMSK2,PCINT19);
sbi(PCMSK2,PCINT20);
// Init serial
UBRR0=UBRR_VALUE; // Set baud rate
sbi(UCSR0B,TXEN0); // Enable TX
sbi(UCSR0B,RXEN0); // Enable RX
sbi(UCSR0B,RXCIE0); // RX complete interrupt
sbi(UCSR0C,UCSZ01); // no parity, 1 stop bit
sbi(UCSR0C,UCSZ01); // 8-bit data
InitTimer();
EncoderInit(); EncoderInit();
// Initialisierung Menüvariablen // Initialisierung Menüvariablen
@ -162,7 +189,7 @@ void Init()
bMenuCtrl.buttonPressedLong = 0; bMenuCtrl.buttonPressedLong = 0;
// Initialisierung Konfiguration // Initialisierung Konfiguration
bConfig.iambic = 1; bConfig.iambic = 1;
bConfig.sidetone_f = 650; bConfig.sidetone_f = 600;
bConfig.sidetone = 1; bConfig.sidetone = 1;
bConfig.trx = 0; bConfig.trx = 0;
bConfig.weight = 50; bConfig.weight = 50;
@ -178,15 +205,24 @@ void Init()
* Overflow interrupt every 64µs * Overflow interrupt every 64µs
* *
*/ */
ISR(TIMER1_OVF_vect) //ISR(TIMER1_OVF_vect)
//{
// //sCurrentTimer += 0xffff;
// PORTD ^= (1<<PD1);
//}
//
ISR(TIMER1_COMPA_vect)
{ {
//sCurrentTimer += 0xffff; OCR2A = pgm_read_byte_near(sinewave+icnt);
PORTD ^= (1<<PD1); icnt++;
if(icnt > SINEWAVELENGTH - 1)
icnt = 0;
} }
/** \brief 8 Bit Timer 0 /** \brief 8 Bit Timer 0
* *
* The Timer 0 CTC interrupt * The Timer 0 CTC interrupt
* Dieser Interrupt wird alle 1ms erzeugt * Dieser Interrupt wird jede Millisekunde erzeugt
* *
*/ */
ISR(TIMER0_COMPA_vect) ISR(TIMER0_COMPA_vect)
@ -202,7 +238,6 @@ ISR(TIMER0_COMPA_vect)
encoder_timer++; encoder_timer++;
if(l_timer >= L_WAIT){ if(l_timer >= L_WAIT){
PORTD ^= (PD7);
l_timer = 0; l_timer = 0;
} }
// Alle 5ms den Drehencoder abfragen // Alle 5ms den Drehencoder abfragen
@ -210,9 +245,15 @@ ISR(TIMER0_COMPA_vect)
EncoderPolling(); EncoderPolling();
// Schalter vom Drehencoder abfragen // Schalter vom Drehencoder abfragen
if(EncoderGetButtonState() == ButtonPressed_Short) if(EncoderGetButtonState() == ButtonPressed_Short)
{
bMenuCtrl.buttonPressed = 1; bMenuCtrl.buttonPressed = 1;
SendSerialString("Button pressed short\r\n");
}
if(EncoderGetButtonState() == ButtonPressed_Long) if(EncoderGetButtonState() == ButtonPressed_Long)
{
bMenuCtrl.buttonPressedLong = 1; bMenuCtrl.buttonPressedLong = 1;
SendSerialString("Button pressed long\r\n");
}
} }
// Wpm verändert? // Wpm verändert?
if((StoreEEprom > 1000) && (bMerker.WpMChanged)) if((StoreEEprom > 1000) && (bMerker.WpMChanged))
@ -221,13 +262,14 @@ ISR(TIMER0_COMPA_vect)
bMerker.WriteWpMEEProm = 1; bMerker.WriteWpMEEProm = 1;
bMerker.WpMChanged = 0; bMerker.WpMChanged = 0;
} }
if((MenuCtrlTimer > 3000) && (bMenuCtrl.Config == 1)) // Konfiguration nach 3 Sekunden verlassen
{ // if((MenuCtrlTimer > 3000) && (bMenuCtrl.Config == 1))
bMenuCtrl.Config = 0; // {
bMenuCtrl.Update = 1; // bMenuCtrl.Config = 0;
bMenuCtrl.ClrScr = 1; // bMenuCtrl.Update = 1;
BeepBoop(); // bMenuCtrl.ClrScr = 1;
} // BeepBoop();
// }
} }
/** \brief 8 Bit Timer 2 /** \brief 8 Bit Timer 2
@ -239,10 +281,48 @@ ISR(TIMER0_COMPA_vect)
*/ */
ISR(TIMER2_OVF_vect) ISR(TIMER2_OVF_vect)
{ {
phaccu = phaccu + tword_m; // phaccu = phaccu + tword_m;
icnt = phaccu >> 24; // icnt = phaccu >> 24;
OCR2A = pgm_read_byte_near(sinewave+icnt); // OCR2A = pgm_read_byte_near(sinewave+icnt);
} }
/** \brief Pin Change Interupts für Paddle und StraightKey
*
* Pin Change Interrupt Vector für die Tasteneingänge
* Str Pa2 Pa1
* PORTD PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0
* x80 x40 x20 x10 x8 x4 x2 x1
*
*/
ISR(PCINT2_vect)
{
uint8_t changedbits;
changedbits = PIND ^ keyhistory;
keyhistory = PIND;
if(changedbits & (1<<STRAIGHT_KEY))
{
if(PIND & (1<<STRAIGHT_KEY))
{
PORTC &= ~(1<<MORSE_LED);
SideToneOff();
}
else
{
PORTC |= (1<<MORSE_LED);
SideToneOn();
}
}
}
ISR(USART_RX_vect)
{
unsigned char data;
data = UDR0;
SendSerialChar(data);
}
/** \brief ClearSendBuffer /** \brief ClearSendBuffer
* *
*/ */
@ -438,7 +518,6 @@ void ConfigMenue(void)
void UpdateDisplay(void) void UpdateDisplay(void)
{ {
char line[22]; char line[22];
if(bMenuCtrl.Update) if(bMenuCtrl.Update)
{ {
if(bMenuCtrl.ClrScr) if(bMenuCtrl.ClrScr)
@ -446,7 +525,6 @@ void UpdateDisplay(void)
lcd_clrscr(); lcd_clrscr();
bMenuCtrl.ClrScr = 0; bMenuCtrl.ClrScr = 0;
} }
if(!(bMenuCtrl.Config)) if(!(bMenuCtrl.Config))
{ {
lcd_charMode(DOUBLESIZE); lcd_charMode(DOUBLESIZE);
@ -520,6 +598,8 @@ void Drehencoder(void)
{ {
EncoderMinMax(1,M_MAX); EncoderMinMax(1,M_MAX);
st = EncoderRead(1); st = EncoderRead(1);
sprintf(sdebug,"Encoder %i\r\n",st);
SendSerialString(sdebug);
if(last != st) if(last != st)
{ {
bMenuCtrl.CurMenue = st; bMenuCtrl.CurMenue = st;
@ -588,8 +668,8 @@ void Drehencoder(void)
*/ */
int main(void) int main(void)
{ {
Init(); Init();
SetFrequency(650);
SideToneOff(); SideToneOff();
lcd_init(LCD_DISP_ON); lcd_init(LCD_DISP_ON);
@ -602,12 +682,18 @@ int main(void)
lcd_puts(CALL); lcd_puts(CALL);
delayms(1000); delayms(1000);
BeepBoop();
MachineMode = NORMAL; MachineMode = NORMAL;
KeyerMode = IAMBIC_A; KeyerMode = IAMBIC_A;
ReadEEProm_WpM(); ReadEEProm_WpM();
SendSerialString(CLRSCR);
SendSerialString("BJ-Keyer V1.00\r\n");
SendSerialString("Ready!\r\n");
EncoderWrite(bConfig.wpm); EncoderWrite(bConfig.wpm);
BeepBoop();
SetFrequency(600);
while(1) while(1)
{ {
@ -618,11 +704,11 @@ int main(void)
UpdateDisplay(); UpdateDisplay();
if(MachineMode == NORMAL) // if(MachineMode == NORMAL)
{ // {
CheckPaddles(); // CheckPaddles();
DoMorse(); // DoMorse();
} // }
if(MachineMode == COMMAND) if(MachineMode == COMMAND)
{ {

@ -1,63 +1,51 @@
#!/usr/bin/python #!/usr/bin/env python
# #
# pwm_sinewave # pwm_sinewave
# #
# Calculate values for generate a PWM table for a Sinewave # Calculate values for generate a PWM table for a Sinewave
# Used on a AVR ATMEGA 328 # Used on a AVR ATMEGA 328
# #
# 2013-02-24 tom@dl7bj.de Tom, DL7BJ # 2023-07-10 tom@dl7bj.de Tom, DL7BJ
# #
frequency = 488 import sys
cpuclock = 8000000 import matplotlib.pyplot as plot
pwmbit = 32 from math import pi, sin, cos, asin, acos
maxdutycycle = 98
mindutycycle = 2
def compute_sinewave(pwmbit, fpeaktopeak, zerobeat): pwmbit = 63
t = 1 zerobeat = 128
ul = [] peaktopeak = 254
tl = []
while t <= pwmbit:
u = sin(2*pi*t/pwmbit)
u = u * fpeaktopeak/2
u = u + zerobeat
u = int(round(u))
print(' ',u,',\t//',t)
ul.append(u)
tl.append(t)
t = t + 1
return ul,tl
import sys
from math import pi, sin
from scitools.std import *
if maxdutycycle <= mindutycycle:
print("Error - maxdutycycle must be greater than mindutycycle")
if maxdutycycle == 100:
maxamplitude = pwmbit - 1
else:
maxamplitude = int((round(pwmbit * maxdutycycle/100.0)))
if mindutycycle == 0: def compute_sinewave(pwmbit, fpeaktopeak, zerobeat):
minamplitude = 1 t = 0
else: ul = []
minamplitude = int((round(pwmbit * mindutycycle/100.0))) tl = []
l = 0
peaktopeak = maxamplitude - minamplitude while t <= pwmbit:
print("Amplitude from ", minamplitude, " to ", maxamplitude, "(", peaktopeak," Schritte)") u = sin(2*pi*t/pwmbit)
u = u * fpeaktopeak/2
u = u + zerobeat
u = int(round(u))
if t < pwmbit:
print(format(u,'#04x'),',',sep='',end='')
else:
print(format(u,'#04x'),' ',sep='',end='')
l = l + 1
if l == 16:
print(' // ', t + 1)
l = 0
ul.append(u)
tl.append(t)
t = t + 1
return ul,tl
zerobeat = int(round((minamplitude + maxamplitude)/2.0))
print("Zerobeat on PWM step ", zerobeat) print("Zerobeat on PWM step ", zerobeat)
print("Peak to peak on PWN ", peaktopeak)
fpeaktopeak = float(peaktopeak) print("const unsigned char sinewave[] PROGMEM = {")
ulist,tlist = compute_sinewave(pwmbit,peaktopeak,zerobeat)
ulist,tlist = compute_sinewave(pwmbit,fpeaktopeak,zerobeat) print("};")
plot(tlist,ulist)
plot.plot(tlist,ulist)
savefig('tmp.eps') plot.savefig('../Pictures/sinewave-line.jpg')
plot.plot(tlist,ulist,linestyle=':',marker='.')
plot.savefig('../Pictures/sinewave-dots.jpg')
print("Ready.") print("Ready.")

Loading…
Cancel
Save