Menüfunktionen fertiggestellt

KeyerMode bearbeitet

Problem mit dem IAMBIC Modes, kein wechselndes Symbol mehr. Dies liegt
wohl an den vielen Änderungen der Zeichenerzeugung.
main
Tom 9 months ago
parent af2821bf5f
commit fa91f5c9d1

@ -32,62 +32,73 @@
\@writefile{lot}{\addvspace {10\p@ }}
\BKM@entry{id=3,dest={636861707465722E33},srcline={158},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030475C303030725C303030755C3030306E5C303030645C3030306C5C303030615C303030675C303030655C3030306E}
\BKM@entry{id=4,dest={73656374696F6E2E332E31},srcline={159},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030425C303030655C303030745C303030725C303030695C303030655C303030625C303030735C303030615C303030725C303030745C303030655C3030306E5C3030305C3034305C303030655C303030695C3030306E5C303030655C303030735C3030305C3034305C3030304D5C3030306F5C303030725C303030735C303030655C3030302D5C3030304B5C303030655C303030795C303030655C303030725C30303073}
\BKM@entry{id=5,dest={73756273656374696F6E2E332E312E31},srcline={163},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C3030305A5C303030655C303030695C303030745C303030765C303030655C303030725C303030685C303030615C3030306C5C303030745C303030655C3030306E}
\BKM@entry{id=5,dest={73756273656374696F6E2E332E312E31},srcline={165},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030495C303030615C3030306D5C303030625C303030695C303030635C3030305C3034305C30303041}
\BKM@entry{id=6,dest={73756273656374696F6E2E332E312E32},srcline={194},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030495C303030615C3030306D5C303030625C303030695C303030635C3030305C3034305C30303042}
\@writefile{toc}{\contentsline {chapter}{\numberline {3}Grundlagen}{9}{chapter.3}\protected@file@percent }
\@writefile{lof}{\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 {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.2}{\ignorespaces Diagramm Mode B\relax }}{9}{figure.caption.5}\protected@file@percent }
\BKM@entry{id=6,dest={636861707465722E34},srcline={218},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030445C303030695C303030655C3030305C3034305C303030425C303030655C303030645C303030695C303030655C3030306E5C303030755C3030306E5C30303067}
\BKM@entry{id=7,dest={73656374696F6E2E342E31},srcline={219},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030425C303030655C303030645C303030695C303030655C3030306E5C303030655C3030306C5C303030655C3030306D5C303030655C3030306E5C303030745C30303065}
\BKM@entry{id=8,dest={73756273656374696F6E2E342E312E31},srcline={221},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C3030305C3333345C303030625C303030655C303030725C303030735C303030695C303030635C303030685C30303074}
\@writefile{toc}{\contentsline {chapter}{\numberline {4}Die Bedienung}{11}{chapter.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.1}Iambic A}{9}{subsection.3.1.1}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {3.1}{\ignorespaces Diagramm Iambic Mode A\relax }}{9}{figure.caption.4}\protected@file@percent }
\BKM@entry{id=7,dest={73756273656374696F6E2E332E312E33},srcline={226},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030555C3030306C5C303030745C303030695C3030306D5C303030615C303030745C303030695C30303063}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.2}Iambic B}{10}{subsection.3.1.2}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {3.2}{\ignorespaces Diagramm Iambic Mode B\relax }}{10}{figure.caption.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.3}Ultimatic}{10}{subsection.3.1.3}\protected@file@percent }
\BKM@entry{id=8,dest={73756273656374696F6E2E332E312E34},srcline={259},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030505C303030755C3030306E5C3030306B5C303030745C3030302D5C303030535C303030745C303030725C303030695C303030635C303030685C3030305C3034305C303030535C303030705C303030655C303030695C303030635C303030685C303030655C30303072}
\BKM@entry{id=9,dest={73756273656374696F6E2E332E312E35},srcline={262},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030485C303030615C3030306E5C303030645C303030745C303030615C303030735C303030745C30303065}
\BKM@entry{id=10,dest={73756273656374696F6E2E332E312E36},srcline={268},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C3030305A5C303030655C303030695C303030745C303030765C303030655C303030725C303030685C303030615C3030306C5C303030745C303030655C3030306E}
\@writefile{lof}{\contentsline {figure}{\numberline {3.3}{\ignorespaces Diagramm Ultimatic Mode\relax }}{11}{figure.caption.6}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.4}Punkt-Strich Speicher}{11}{subsection.3.1.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.5}Handtaste}{11}{subsection.3.1.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.6}Zeitverhalten}{11}{subsection.3.1.6}\protected@file@percent }
\BKM@entry{id=11,dest={636861707465722E34},srcline={270},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030445C303030695C303030655C3030305C3034305C303030425C303030655C303030645C303030695C303030655C3030306E5C303030755C3030306E5C30303067}
\BKM@entry{id=12,dest={73656374696F6E2E342E31},srcline={271},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030425C303030655C303030645C303030695C303030655C3030306E5C303030655C3030306C5C303030655C3030306D5C303030655C3030306E5C303030745C30303065}
\BKM@entry{id=13,dest={73756273656374696F6E2E342E312E31},srcline={273},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C3030305C3333345C303030625C303030655C303030725C303030735C303030695C303030635C303030685C30303074}
\@writefile{toc}{\contentsline {chapter}{\numberline {4}Die Bedienung}{13}{chapter.4}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\@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 }
\BKM@entry{id=9,dest={636861707465722E35},srcline={222},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030445C303030695C303030655C3030305C3034305C303030535C303030635C303030685C303030615C3030306C5C303030745C303030755C3030306E5C30303067}
\BKM@entry{id=10,dest={73656374696F6E2E352E31},srcline={224},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030425C303030655C303030735C303030635C303030685C303030725C303030655C303030695C303030625C303030755C3030306E5C30303067}
\@writefile{toc}{\contentsline {chapter}{\numberline {5}Die Schaltung}{13}{chapter.5}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {4.1}Bedienelemente}{13}{section.4.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.1.1}Übersicht}{13}{subsection.4.1.1}\protected@file@percent }
\BKM@entry{id=14,dest={636861707465722E35},srcline={274},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030445C303030695C303030655C3030305C3034305C303030535C303030635C303030685C303030615C3030306C5C303030745C303030755C3030306E5C30303067}
\BKM@entry{id=15,dest={73656374696F6E2E352E31},srcline={276},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030425C303030655C303030735C303030635C303030685C303030725C303030655C303030695C303030625C303030755C3030306E5C30303067}
\@writefile{toc}{\contentsline {chapter}{\numberline {5}Die Schaltung}{15}{chapter.5}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\@writefile{toc}{\contentsline {section}{\numberline {5.1}Beschreibung}{13}{section.5.1}\protected@file@percent }
\BKM@entry{id=11,dest={636861707465722E36},srcline={225},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030445C303030695C303030655C3030305C3034305C303030535C3030306F5C303030665C303030745C303030775C303030615C303030725C30303065}
\BKM@entry{id=12,dest={73656374696F6E2E362E31},srcline={226},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030545C303030695C3030306D5C303030655C303030725C3030305C3034305C30303032}
\BKM@entry{id=13,dest={73656374696F6E2E362E32},srcline={229},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030545C303030695C3030306D5C303030655C303030725C3030305C3034305C30303031}
\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{toc}{\contentsline {section}{\numberline {5.1}Beschreibung}{15}{section.5.1}\protected@file@percent }
\BKM@entry{id=16,dest={636861707465722E36},srcline={277},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030445C303030695C303030655C3030305C3034305C303030535C3030306F5C303030665C303030745C303030775C303030615C303030725C30303065}
\BKM@entry{id=17,dest={73656374696F6E2E362E31},srcline={278},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030545C303030695C3030306D5C303030655C303030725C3030305C3034305C30303032}
\BKM@entry{id=18,dest={73656374696F6E2E362E32},srcline={281},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030545C303030695C3030306D5C303030655C303030725C3030305C3034305C30303031}
\BKM@entry{id=19,dest={73656374696F6E2E362E33},srcline={284},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030545C303030695C3030306D5C303030655C303030725C3030305C3034305C30303030}
\BKM@entry{id=20,dest={73756273656374696F6E2E362E332E31},srcline={287},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030545C303030695C3030306D5C303030655C303030725C3030305C3034305C303030655C303030695C3030306E5C303030735C303030745C303030655C3030306C5C3030306C5C303030655C3030306E}
\BKM@entry{id=21,dest={73656374696F6E2E362E34},srcline={292},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030535C303030695C3030306E5C303030755C303030735C3030305C3034305C3030304D5C303030695C303030745C303030685C3030305C3336365C303030725C303030745C3030306F5C3030306E5C3030305C3034305C303030645C303030755C303030725C303030635C303030685C3030305C3034305C303030505C303030755C3030306C5C303030735C303030775C303030655C303030695C303030745C303030655C3030306E5C3030306D5C3030306F5C303030645C303030755C3030306C5C303030615C303030745C303030695C3030306F5C3030306E}
\BKM@entry{id=22,dest={73756273656374696F6E2E362E342E31},srcline={297},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030475C303030725C303030755C3030306E5C303030645C3030306C5C303030615C303030675C303030655C3030306E}
\@writefile{toc}{\contentsline {chapter}{\numberline {6}Die Software}{17}{chapter.6}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\@writefile{toc}{\contentsline {section}{\numberline {6.1}Timer 2}{15}{section.6.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {6.2}Timer 1}{15}{section.6.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {6.3}Timer 0}{15}{section.6.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {6.3.1}Timer einstellen}{15}{subsection.6.3.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {6.4}Sinus Mithörton durch Pulsweitenmodulation}{15}{section.6.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {6.4.1}Grundlagen}{16}{subsection.6.4.1}\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{toc}{\contentsline {section}{\numberline {6.1}Timer 2}{17}{section.6.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {6.2}Timer 1}{17}{section.6.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {6.3}Timer 0}{17}{section.6.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {6.3.1}Timer einstellen}{17}{subsection.6.3.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {6.4}Sinus Mithörton durch Pulsweitenmodulation}{17}{section.6.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {6.4.1}Grundlagen}{18}{subsection.6.4.1}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {6.1}{\ignorespaces Pulswellenmodulation\relax }}{18}{figure.caption.7}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Pulsweitenmodulation}{18}{subsubsection*.9}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {6.2}{\ignorespaces Symmetrisches Rechtecksignal an PB3\relax }}{19}{figure.caption.10}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {6.3}{\ignorespaces PWM - Tastgrad - Sinus\relax }}{20}{figure.caption.11}\protected@file@percent }
\BKM@entry{id=23,dest={73756273656374696F6E2E362E342E32},srcline={425},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030535C303030695C3030306E5C303030755C303030735C303030745C303030615C303030625C303030655C3030306C5C3030306C5C30303065}
\@writefile{lot}{\contentsline {table}{\numberline {6.1}{\ignorespaces OCR1A Werte für verschiedene Frequenzen des Mithörtons\relax }}{21}{table.caption.12}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {6.4.2}Sinustabelle}{21}{subsection.6.4.2}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {6.4}{\ignorespaces Sinus nach Tabelle vom Python3 Script als Linie\relax }}{22}{figure.caption.13}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {6.5}{\ignorespaces Sinus nach der Tabelle vom Python3 Script mit Stützpunkten\relax }}{22}{figure.caption.14}\protected@file@percent }
\BKM@entry{id=24,dest={636861707465722E37},srcline={455},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030455C3030306E5C303030745C303030775C303030695C303030635C3030306B5C3030306C5C303030755C3030306E5C303030675C303030735C303030755C3030306D5C303030675C303030655C303030625C303030755C3030306E5C30303067}
\@writefile{toc}{\contentsline {chapter}{\numberline {7}Entwicklungsumgebung}{23}{chapter.7}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\BKM@entry{id=20,dest={636861707465722A2E3134},srcline={428},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030545C303030615C303030625C303030655C3030306C5C3030306C5C303030655C3030306E}
\@writefile{toc}{\contentsline {chapter}{\nonumberline Tabellen}{23}{chapter*.14}\protected@file@percent }
\BKM@entry{id=25,dest={636861707465722A2E3135},srcline={480},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030545C303030615C303030625C303030655C3030306C5C3030306C5C303030655C3030306E}
\@writefile{toc}{\contentsline {chapter}{\nonumberline Tabellen}{25}{chapter*.15}\protected@file@percent }
\gdef\lot@l@number{41.11653pt}
\BKM@entry{id=21,dest={636861707465722A2E3135},srcline={429},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030415C303030625C303030625C303030695C3030306C5C303030645C303030755C3030306E5C303030675C303030655C3030306E}
\@writefile{toc}{\contentsline {chapter}{\nonumberline Abbildungen}{25}{chapter*.15}\protected@file@percent }
\BKM@entry{id=26,dest={636861707465722A2E3136},srcline={481},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030415C303030625C303030625C303030695C3030306C5C303030645C303030755C3030306E5C303030675C303030655C3030306E}
\@writefile{toc}{\contentsline {chapter}{\nonumberline Abbildungen}{27}{chapter*.16}\protected@file@percent }
\gdef\lof@l@number{43.9643pt}
\global\@namedef{scr@dte@chapter@lastmaxnumwidth}{10.40242pt}
\global\@namedef{scr@dte@section@lastmaxnumwidth}{16.60352pt}
@ -97,4 +108,4 @@
\@writefile{toc}{\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}
\gdef \@abspage@last{25}
\gdef \@abspage@last{27}

@ -2,15 +2,16 @@
\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.2}{\ignorespaces Diagramm Mode B\relax }}{9}{figure.caption.5}%
\contentsline {figure}{\numberline {3.1}{\ignorespaces Diagramm Iambic Mode A\relax }}{9}{figure.caption.4}%
\contentsline {figure}{\numberline {3.2}{\ignorespaces Diagramm Iambic Mode B\relax }}{10}{figure.caption.5}%
\contentsline {figure}{\numberline {3.3}{\ignorespaces Diagramm Ultimatic Mode\relax }}{11}{figure.caption.6}%
\addvspace {10\p@ }
\addvspace {10\p@ }
\addvspace {10\p@ }
\contentsline {figure}{\numberline {6.1}{\ignorespaces Pulswellenmodulation\relax }}{16}{figure.caption.6}%
\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}%
\contentsline {figure}{\numberline {6.1}{\ignorespaces Pulswellenmodulation\relax }}{18}{figure.caption.7}%
\contentsline {figure}{\numberline {6.2}{\ignorespaces Symmetrisches Rechtecksignal an PB3\relax }}{19}{figure.caption.10}%
\contentsline {figure}{\numberline {6.3}{\ignorespaces PWM - Tastgrad - Sinus\relax }}{20}{figure.caption.11}%
\contentsline {figure}{\numberline {6.4}{\ignorespaces Sinus nach Tabelle vom Python3 Script als Linie\relax }}{22}{figure.caption.13}%
\contentsline {figure}{\numberline {6.5}{\ignorespaces Sinus nach der Tabelle vom Python3 Script mit Stützpunkten\relax }}{22}{figure.caption.14}%
\addvspace {10\p@ }
\providecommand \tocbasic@end@toc@file {}\tocbasic@end@toc@file

@ -1,4 +1,4 @@
This is LuaHBTeX, Version 1.12.0 (TeX Live 2020/Debian) (format=lualatex 2023.6.25) 21 JUL 2023 21:26
This is LuaHBTeX, Version 1.12.0 (TeX Live 2020/Debian) (format=lualatex 2023.6.25) 13 AUG 2023 16:47
restricted system commands enabled.
**"Dokumentation BJ-Keyer.tex"
("./Dokumentation BJ-Keyer.tex"
@ -2129,95 +2129,100 @@ chapter 2.
]
chapter 3.
Overfull \hbox (17.32524pt too wide) in paragraph at lines 187--188
Overfull \hbox (8.57524pt too wide) in paragraph at lines 190--191
[][]
[]
[9]
Overfull \hbox (8.57524pt too wide) in paragraph at lines 219--220
[][]
[]
Overfull \hbox (17.32524pt too wide) in paragraph at lines 212--213
Overfull \hbox (8.57524pt too wide) in paragraph at lines 253--254
[][]
[]
[9] [10
[10] [11] [12
]
chapter 4.
[11] [12
[13] [14
]
chapter 5.
[13] [14
[15] [16
]
chapter 6.
LaTeX Font Info: Font shape `TU/TeXGyrePagella(0)/m/n' will be
(Font) scaled to size 7.34583pt on input line 238.
(Font) scaled to size 7.34583pt on input line 290.
LaTeX Font Info: Font shape `TU/TeXGyrePagella(0)/m/n' will be
(Font) scaled to size 6.03767pt on input line 238.
[15] [16]
(Font) scaled to size 6.03767pt on input line 290.
[17] [18]
LaTeX Font Info: Font shape `TU/TeXGyrePagella(1)/m/n' will be
(Font) scaled to size 10.06277pt on input line 296.
(Font) scaled to size 10.06277pt on input line 348.
LaTeX Font Info: Font shape `TU/TeXGyrePagella(1)/m/n' will be
(Font) scaled to size 7.34583pt on input line 296.
(Font) scaled to size 7.34583pt on input line 348.
LaTeX Font Info: Font shape `TU/TeXGyrePagella(1)/m/n' will be
(Font) scaled to size 6.03767pt on input line 296.
(Font) scaled to size 6.03767pt on input line 348.
LaTeX Font Info: Font shape `TU/TeXGyrePagella(0)/m/n' will be
(Font) scaled to size 3.67291pt on input line 296.
(Font) scaled to size 3.67291pt on input line 348.
LaTeX Font Info: Font shape `TU/TeXGyrePagella(0)/m/n' will be
(Font) scaled to size 8.27078pt on input line 326.
(Font) scaled to size 8.27078pt on input line 378.
LaTeX Font Info: Font shape `TU/AsanaMath(1)/m/n' will be
(Font) scaled to size 8.45096pt on input line 326.
(Font) scaled to size 8.45096pt on input line 378.
LaTeX Font Info: Font shape `TU/AsanaMath(1)/m/n' will be
(Font) scaled to size 5.63397pt on input line 326.
(Font) scaled to size 5.63397pt on input line 378.
LaTeX Font Info: Font shape `TU/TeXGyrePagella(1)/m/n' will be
(Font) scaled to size 8.27078pt on input line 326.
(Font) scaled to size 8.27078pt on input line 378.
LaTeX Font Info: Font shape `TU/TeXGyrePagella(1)/m/n' will be
(Font) scaled to size 5.51385pt on input line 326.
(Font) scaled to size 5.51385pt on input line 378.
LaTeX Font Info: Font shape `TU/TeXGyrePagella(1)/m/n' will be
(Font) scaled to size 4.59488pt on input line 326.
(Font) scaled to size 4.59488pt on input line 378.
LaTeX Font Info: Font shape `TU/AsanaMath(2)/m/n' will be
(Font) scaled to size 8.45178pt on input line 326.
(Font) scaled to size 8.45178pt on input line 378.
LaTeX Font Info: Font shape `TU/AsanaMath(2)/m/n' will be
(Font) scaled to size 5.63452pt on input line 326.
(Font) scaled to size 5.63452pt on input line 378.
LaTeX Font Info: Font shape `TU/AsanaMath(3)/m/n' will be
(Font) scaled to size 8.45013pt on input line 326.
(Font) scaled to size 8.45013pt on input line 378.
LaTeX Font Info: Font shape `TU/AsanaMath(3)/m/n' will be
(Font) scaled to size 5.63342pt on input line 326.
(Font) scaled to size 5.63342pt on input line 378.
LaTeX Font Info: Font shape `TU/TeXGyrePagella(0)/m/n' will be
(Font) scaled to size 5.51385pt on input line 326.
<../Pictures/pwm_duty_cycle.jpg, id=156, 442.65375pt x 149.55875pt>
(Font) scaled to size 5.51385pt on input line 378.
<../Pictures/pwm_duty_cycle.jpg, id=175, 442.65375pt x 149.55875pt>
File: ../Pictures/pwm_duty_cycle.jpg Graphic file (type jpg)
<use ../Pictures/pwm_duty_cycle.jpg>
Package luatex.def Info: ../Pictures/pwm_duty_cycle.jpg used on input line 331.
Package luatex.def Info: ../Pictures/pwm_duty_cycle.jpg used on input line 383.
(luatex.def) Requested size: 309.8555pt x 104.6904pt.
[17] [18<../Pictures/pwm_duty_cycle.jpg>]
<../Pictures/sinewave-line.jpg, id=180, 462.528pt x 346.896pt>
[19] [20<../Pictures/pwm_duty_cycle.jpg>]
<../Pictures/sinewave-line.jpg, id=199, 462.528pt x 346.896pt>
File: ../Pictures/sinewave-line.jpg Graphic file (type jpg)
<use ../Pictures/sinewave-line.jpg>
Package luatex.def Info: ../Pictures/sinewave-line.jpg used on input line 380.
Package luatex.def Info: ../Pictures/sinewave-line.jpg used on input line 432.
(luatex.def) Requested size: 231.26343pt x 173.44757pt.
<../Pictures/sinewave-dots.jpg, id=181, 462.528pt x 346.896pt>
<../Pictures/sinewave-dots.jpg, id=200, 462.528pt x 346.896pt>
File: ../Pictures/sinewave-dots.jpg Graphic file (type jpg)
<use ../Pictures/sinewave-dots.jpg>
Package luatex.def Info: ../Pictures/sinewave-dots.jpg used on input line 399.
Package luatex.def Info: ../Pictures/sinewave-dots.jpg used on input line 451.
(luatex.def) Requested size: 231.26343pt x 173.44757pt.
[19] [20<../Pictures/sinewave-line.jpg><../Pictures/sinewave-dots.jpg>]
[21] [22<../Pictures/sinewave-line.jpg><../Pictures/sinewave-dots.jpg>]
chapter 7.
[21
[23
] [22] ("./Dokumentation BJ-Keyer.lot")
] [24] ("./Dokumentation BJ-Keyer.lot")
\tf@lot=\write6
\openout6 = Dokumentation BJ-Keyer.lot
[23
[25
] [24
] [26
]
@ -2225,32 +2230,32 @@ chapter 7.
\tf@lof=\write7
\openout7 = Dokumentation BJ-Keyer.lof
[25] ("./Dokumentation BJ-Keyer.aux")
[27] ("./Dokumentation BJ-Keyer.aux")
Package rerunfilecheck Info: File `"Dokumentation BJ-Keyer".out' has not changed
.
(rerunfilecheck) Checksum: <no file>.
)
(\end occurred inside a group at level 1)
### simple group (level 1) entered at line 322 ({)
### simple group (level 1) entered at line 374 ({)
### bottom level
Here is how much of LuaTeX's memory you used:
51125 strings out of 478824
51138 strings out of 478824
100000,1977958 words of node,token memory allocated
1065 words of node memory still in use:
28 hlist, 2 vlist, 5 rule, 4 dir, 10 glue, 7 kern, 1 glyph, 36 attribute, 84
glue_spec, 27 attribute_list, 2 write nodes
avail lists: 2:3180,3:1097,4:224,5:602,6:67,7:6078,8:47,9:624,10:11,11:485
68866 multiletter control sequences out of 65536+600000
172 fonts using 38161183 bytes
avail lists: 2:3409,3:922,4:264,5:602,6:82,7:6078,8:57,9:552,10:11,11:485
68871 multiletter control sequences out of 65536+600000
172 fonts using 38160879 bytes
111i,16n,125p,10642b,2256s stack positions out of 5000i,500n,10000p,200000b,200000s
</usr/share/texmf/fonts/opentype/public/lm/lmmono8-regular.otf></usr/share/texli
ve/texmf-dist/fonts/opentype/public/Asana-Math/Asana-Math.otf></usr/share/texmf/
fonts/opentype/public/tex-gyre/texgyrepagella-regular.otf></usr/share/texmf/font
s/opentype/public/tex-gyre/texgyrepagella-italic.otf></usr/share/texlive/texmf-d
ist/fonts/opentype/public/Asana-Math/Asana-Math.otf></usr/share/texlive/texmf-di
st/fonts/opentype/public/Asana-Math/Asana-Math.otf></usr/share/texmf/fonts/opent
fonts/opentype/public/tex-gyre/texgyrepagella-regular.otf></usr/share/texlive/te
xmf-dist/fonts/opentype/public/Asana-Math/Asana-Math.otf></usr/share/texlive/tex
mf-dist/fonts/opentype/public/Asana-Math/Asana-Math.otf></usr/share/texmf/fonts/
opentype/public/tex-gyre/texgyrepagella-italic.otf></usr/share/texmf/fonts/opent
ype/public/lm/lmsans8-regular.otf></usr/share/texmf/fonts/opentype/public/tex-gy
re/texgyrepagella-bold.otf></usr/share/texmf/fonts/opentype/public/lm/lmsans10-b
old.otf></usr/share/texmf/fonts/opentype/public/lm/lmsans10-oblique.otf></usr/sh
@ -2258,10 +2263,10 @@ are/texmf/fonts/opentype/public/lm/lmsans10-regular.otf></usr/share/texmf/fonts/
opentype/public/lm/lmmono10-regular.otf></usr/share/texmf/fonts/opentype/public/
tex-gyre/texgyrepagella-regular.otf></usr/share/texlive/texmf-dist/fonts/type1/p
ublic/ccicons/ccicons.pfb>
Output written on Dokumentation BJ-Keyer.pdf (25 pages, 191021 bytes).
Output written on Dokumentation BJ-Keyer.pdf (27 pages, 199024 bytes).
PDF statistics: 383 PDF objects out of 1000 (max. 8388607)
302 compressed objects within 4 object streams
76 named destinations out of 1000 (max. 131072)
184 words of extra memory for PDF output out of 10000 (max. 100000000)
PDF statistics: 418 PDF objects out of 1000 (max. 8388607)
335 compressed objects within 4 object streams
84 named destinations out of 1000 (max. 131072)
224 words of extra memory for PDF output out of 10000 (max. 100000000)

@ -5,6 +5,6 @@
\addvspace {10\p@ }
\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}%
\contentsline {table}{\numberline {6.1}{\ignorespaces OCR1A Werte für verschiedene Frequenzen des Mithörtons\relax }}{21}{table.caption.12}%
\addvspace {10\p@ }
\providecommand \tocbasic@end@toc@file {}\tocbasic@end@toc@file

@ -158,62 +158,114 @@ In dieser Dokumentation werden diverse gleichbleibende Darstellungsweisen verwen
\chapter{Grundlagen}
\section{Betriebsarten eines Morse-Keyers}
Bei Morse-Keyer
Ein Morse-Keyer, die Tastelektronik, hat verschiedene Betriebsarten, die sich in der automatischen Erzeugung der Zeichen unterscheiden. Je nach Betriebsart gibt es einen Punkt- und Strichspeicher oder die direkte Erzeugung der Zeichen.
\subsection{Zeitverhalten}
Bei einem zweiarmigen Paddle erzeugt ein Paddle (genauer die Tastelektronik) die Punkte und das andere Paddle die Striche. Diese Art von Paddle werden auch als Iambic oder Squeeze Paddle bezeichnet.
\subsection{Iambic A}
Im Iambic Mode A wird wird immer nur das Zeichen gegeben, dessen Paddle gerade betätigt wird. Wird das Paddle zu früh losgelassen, ergänzt die Tastelektronik das Zeichen auf die erforderliche Länge. Es wird kein weiteres Zeichen gesendet. Werden beide Paddle gleichzeitig gedrückt gehalten, ergibt sich eine Punkt-Strich-Folge. Wird der Kontakt wieder geöffnet, stoppt die Punkt-Strich-Folge. Es wird nur das Zeichen mit der erforderlichen Länge gesendet, welches beim Öffnen der Kontakte gerade gesendet wurde.
\begin{figure}[!ht]
\begin{tikztimingtable}[
timing/slope=0,
timing/coldist=2pt,
timing/coldist=0.25pt,
xscale=5.0,yscale=3.1,
semithick
thick
]
%% Timing
DIT\ & LH 1{2C} \\
DAH\ & 0.5LLHH 1{2C} \\
Mode A\ & LHLHH 1{2C} \\
DIT\ & lhhhhhhhhhhlllll \\
DAH\ & 0.25llhhhhhhhhh0.75hlllll \\
Mode B\ & lhlhhhlhlhhhllll \\
\extracode
\makeatletter
\begin{pgfonlayer}{background}
\begin{scope}[gray,semitransparent,semithick]
\horlines{}
\vertlines{1,...,7}
\vertlines{0,0.5,...,8}
\end{scope}
\node[anchor=south east,inner sep=0pt]
at (10,-4) {\tiny Output};
\node[anchor=south east,inner sep=0pt]
at (10,-4) {\tiny Ausgabe};
\end{pgfonlayer}
\endextracode
\end{tikztimingtable}
\caption{Diagramm Mode A}
\caption{Diagramm Iambic Mode A}
\end{figure}
\subsection{Iambic B}
Im Iambic Mode B verhält es sich im Prinzip wie im Iambic Mode A, nur dass beim gleichzeitigen Öffnen der Kontakte das entgegengesetzte Zeichen des zuletzt geöffneten Kontakts angefügt wird.
\begin{figure}[!ht]
\begin{tikztimingtable}[
timing/slope=0,
timing/coldist=2pt,
timing/coldist=0.25pt,
xscale=5.0,yscale=3.1,
semithick
thick
]
%% Timing
DIT\ & LH 1{2C} \\
DAH\ & 0.5LLHH 1{2C} \\
Mode B\ & LHLHHLH 1{2C} \\
DIT\ & lhhhhhhhhhhlllll \\
DAH\ & 0.25llhhhhhhhhh0.75hlllll \\
Mode B\ & lhlhhhlhlhhhlhll \\
\extracode
\makeatletter
\begin{pgfonlayer}{background}
\begin{scope}[gray,semitransparent,semithick]
\horlines{}
\vertlines{1,...,7}
\vertlines{0,0.5,...,8}
\end{scope}
\node[anchor=south east,inner sep=0pt]
at (10,-4) {\tiny Output};
at (10,-4) {\tiny Ausgabe};
\end{pgfonlayer}
\end{tikztimingtable}
\caption{Diagramm Iambic Mode B}
\end{figure}
Wie im Diagramm zu sehen ist, wird erst das DIT Paddle betätigt, dann das DAH Paddle, es sind also beide Paddle gleichzeitig betätigt. Es wird eine Folge von DIT und DAH, beginnend mit einem DIT gegeben, solange beide Paddle betätigt werden. Werden die Kontakte gleichzeitig gelöst, wird das entgegengesetzte Zeichen des zuletzt ausgebenen Zeichens, angefügt. Hier ist das ein DIT.
\caption{Diagramm Mode B}
\subsection{Ultimatic}
Beim Ultimatic Mode wird im Gegensatz zu den Iambic Modes bei der gleichzeitigen Betätigung beider Paddles ein DIT oder DAH und eine Folge des jeweiligen entgegengesetzten Zeichens erzeugt. Es wird zuerst das Zeichen erzeugt, dessen Paddle zuerst betätigt wurde. Im Anschluß wird kontinuierlich das Zeichen erzeugt, dessen Paddle zuletzt betätigt wurde.
Werden die Paddle gleichzeitig losgelassen, stoppt die Aussendung der Zeichen ohne die Ausgabe eines weiteren Zeichens wie beim Iambic Mode B. Wird ein Paddle losgelassen, wird die Aussendung mit dem noch betätigten Paddle fortgesetzt. Es kann somit eine ganze Folge von dem entgegengesetzten Zeichen in den Zeichenstrom des zuerst betätigten Paddles eingefügt werden. Damit können mehr Zeichen mit der Squeeze Technik gesendet werden, als es bei den Iambic Modes möglich ist.
\begin{figure}[!ht]
\begin{tikztimingtable}[
timing/slope=0,
timing/coldist=0.25pt,
xscale=5.0,yscale=3.1,
thick
]
%% Timing
DIT\ & lhhhhhhhhhhhllll \\
DAH\ & 0.25llhhhhhhh0.75hlllllll \\
Mode B\ & lhlhhhlhhhlhllll \\
\extracode
\makeatletter
\begin{pgfonlayer}{background}
\begin{scope}[gray,semitransparent,semithick]
\horlines{}
\vertlines{0,0.5,...,8}
\end{scope}
\node[anchor=south east,inner sep=0pt]
at (10,-4) {\tiny Ausgabe};
\end{pgfonlayer}
\end{tikztimingtable}
\caption{Diagramm Ultimatic Mode}
\end{figure}
Im Diagramm ist dieses Verhalten am Beispiel des Buchstabens P dargestellt. Zuerst wird das DIT Paddle betätigt, es wird ein DIT erzeugt. Noch während das DIT gesendet wird, kann das DAH Paddle betätigt werden und obwohl das DIT Paddle gehalten wird, erfolgt eine Aussendung von Strichen, so lange, wie das DAH Paddle gehalten wird. Wird der Kontakt nach zwei Strichen geöffnet, wird ein DIT gesendet, weil die DIT Taste immer noch gehalten wird. Nach dem Öffnen der Kontakte beide Paddles stoppt die Sendung sofort.
\subsection{Punkt-Strich Speicher}
\subsection{Handtaste}
\subsection{Zeitverhalten}
\chapter{Die Bedienung}
\section{Bedienelemente}

@ -3,22 +3,27 @@
\contentsline {chapter}{\numberline {2}Hinweise zur Dokumentation}{7}{chapter.2}%
\contentsline {chapter}{\numberline {3}Grundlagen}{9}{chapter.3}%
\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 {chapter}{\numberline {4}Die Bedienung}{11}{chapter.4}%
\contentsline {section}{\numberline {4.1}Bedienelemente}{11}{section.4.1}%
\contentsline {subsection}{\numberline {4.1.1}Übersicht}{11}{subsection.4.1.1}%
\contentsline {chapter}{\numberline {5}Die Schaltung}{13}{chapter.5}%
\contentsline {section}{\numberline {5.1}Beschreibung}{13}{section.5.1}%
\contentsline {chapter}{\numberline {6}Die Software}{15}{chapter.6}%
\contentsline {section}{\numberline {6.1}Timer 2}{15}{section.6.1}%
\contentsline {section}{\numberline {6.2}Timer 1}{15}{section.6.2}%
\contentsline {section}{\numberline {6.3}Timer 0}{15}{section.6.3}%
\contentsline {subsection}{\numberline {6.3.1}Timer einstellen}{15}{subsection.6.3.1}%
\contentsline {section}{\numberline {6.4}Sinus Mithörton durch Pulsweitenmodulation}{15}{section.6.4}%
\contentsline {subsection}{\numberline {6.4.1}Grundlagen}{16}{subsection.6.4.1}%
\contentsline {subsubsection}{\nonumberline Pulsweitenmodulation}{16}{subsubsection*.8}%
\contentsline {subsection}{\numberline {6.4.2}Sinustabelle}{19}{subsection.6.4.2}%
\contentsline {chapter}{\numberline {7}Entwicklungsumgebung}{21}{chapter.7}%
\contentsline {chapter}{\nonumberline Tabellen}{23}{chapter*.14}%
\contentsline {chapter}{\nonumberline Abbildungen}{25}{chapter*.15}%
\contentsline {subsection}{\numberline {3.1.1}Iambic A}{9}{subsection.3.1.1}%
\contentsline {subsection}{\numberline {3.1.2}Iambic B}{10}{subsection.3.1.2}%
\contentsline {subsection}{\numberline {3.1.3}Ultimatic}{10}{subsection.3.1.3}%
\contentsline {subsection}{\numberline {3.1.4}Punkt-Strich Speicher}{11}{subsection.3.1.4}%
\contentsline {subsection}{\numberline {3.1.5}Handtaste}{11}{subsection.3.1.5}%
\contentsline {subsection}{\numberline {3.1.6}Zeitverhalten}{11}{subsection.3.1.6}%
\contentsline {chapter}{\numberline {4}Die Bedienung}{13}{chapter.4}%
\contentsline {section}{\numberline {4.1}Bedienelemente}{13}{section.4.1}%
\contentsline {subsection}{\numberline {4.1.1}Übersicht}{13}{subsection.4.1.1}%
\contentsline {chapter}{\numberline {5}Die Schaltung}{15}{chapter.5}%
\contentsline {section}{\numberline {5.1}Beschreibung}{15}{section.5.1}%
\contentsline {chapter}{\numberline {6}Die Software}{17}{chapter.6}%
\contentsline {section}{\numberline {6.1}Timer 2}{17}{section.6.1}%
\contentsline {section}{\numberline {6.2}Timer 1}{17}{section.6.2}%
\contentsline {section}{\numberline {6.3}Timer 0}{17}{section.6.3}%
\contentsline {subsection}{\numberline {6.3.1}Timer einstellen}{17}{subsection.6.3.1}%
\contentsline {section}{\numberline {6.4}Sinus Mithörton durch Pulsweitenmodulation}{17}{section.6.4}%
\contentsline {subsection}{\numberline {6.4.1}Grundlagen}{18}{subsection.6.4.1}%
\contentsline {subsubsection}{\nonumberline Pulsweitenmodulation}{18}{subsubsection*.9}%
\contentsline {subsection}{\numberline {6.4.2}Sinustabelle}{21}{subsection.6.4.2}%
\contentsline {chapter}{\numberline {7}Entwicklungsumgebung}{23}{chapter.7}%
\contentsline {chapter}{\nonumberline Tabellen}{25}{chapter*.15}%
\contentsline {chapter}{\nonumberline Abbildungen}{27}{chapter*.16}%
\providecommand \tocbasic@end@toc@file {}\tocbasic@end@toc@file

@ -6,9 +6,8 @@
#include "controls.h"
// Stringkonstanten für das Display
const char CALL[] = " DL7BJ ";
const char PRG[] = " BJ-Keyer ";
const char VER[] = " V1.00 ";
// Programm Info
const char Trx1[] = "TRX 1";
const char Trx2[] = "TRX 2";
const char IambicA[] = "Iambic A";
@ -38,13 +37,14 @@ void Drehencoder(void)
if(bConfig.WpM != st)
{
bConfig.WpM = st; // neuen Wert in bConfig speichern
bMerker.WpMChanged = 1; // Merker für Timer 0 setzen
bMenuCtrl.Update = 1; // Merker für UpdateDisplay setzen
bState.WpMChanged = 1; // Status für Timer 0 setzen
bMenuCtrl.Update = 1; // Status für UpdateDisplay setzen
EncoderPos = st; // neuen Werte in EncoderPos speichern
WpM = bConfig.WpM; // neuen Wert in WpM übernehmen
cli();
StoreEEprom = 0; // Timer 0 Variable löschen für Update EEprom
sei();
SetRatio(0);
}
}
@ -161,7 +161,10 @@ void Drehencoder(void)
bMenuCtrl.m_buttonPressed = 0;
break;
case M_TON:
bConfig.SidetoneEnabled = (bConfig.SidetoneEnabled == 1) ? 0 : 1;
if(bConfig.SidetoneEnabled == 1)
SidetoneDisable();
else
SidetoneEnable();
bMenuCtrl.m_buttonPressed = 0;
break;
case M_TON_FREQ:
@ -379,7 +382,7 @@ void DisplayVersion(void)
lcd_puts(VER);
lcd_gotoxy(2,4);
lcd_puts(CALL);
SideToneOff();
SidetoneOff();
DelayMilliSeconds(1000);
}

@ -11,7 +11,7 @@
// Externe Variablen
extern struct Config bConfig;
extern struct MenuCtrl bMenuCtrl;
extern struct Merker bMerker;
extern struct State bState;
extern uint16_t MenuCtrlTimer;
extern uint8_t WpM;
// Externe Funktionen
@ -21,6 +21,10 @@ extern void WriteEEprom(void);
extern void SideToneOff(void);
extern void DelayMilliSeconds(uint16_t t);
extern void Tone(uint16_t f, uint8_t t);
extern void SetRatio(uint8_t WPMCorrectFactor);
extern void SidetoneDisable(void);
extern void SidetoneEnable(void);
extern void SidetoneOff(void);
// Prototypes
void Drehencoder(void);
void ConfigMenue(void);

@ -0,0 +1,33 @@
:200000000506050FBC02001E00000101020155FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C
:20002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
:20004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
:20006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
:20008000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80
:2000A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60
:2000C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40
:2000E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20
:20010000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
:20012000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF
:20014000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF
:20016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F
:20018000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F
:2001A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F
:2001C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F
:2001E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F
:20020000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
:20022000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE
:20024000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE
:20026000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E
:20028000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E
:2002A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E
:2002C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E
:2002E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E
:20030000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD
:20032000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD
:20034000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD
:20036000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D
:20038000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D
:2003A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D
:2003C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D
:2003E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D
:00000001FF

@ -7,9 +7,9 @@
#define TwoStep
#define ENC_A_PORT PORTB /**< port for line A */
#define ENC_A_PIN PB0 /**< pin for line A */
#define ENC_A_PIN PB1 /**< pin for line A */
#define ENC_B_PORT PORTB /**< port for line B */
#define ENC_B_PIN PB1 /**< pin for line B */
#define ENC_B_PIN PB0 /**< pin for line B */
#define ENC_T_PORT PORTB /**< port for button */
#define ENC_T_PIN PB2 /**< pin for button */

@ -5,7 +5,7 @@
#include "functions.h"
// EEProm
// EEProm Speicher
uint8_t Dummy;
uint8_t ee_Dummy EEMEM = 0x55; // Dummy for Address 0
uint8_t ee_TRX EEMEM = 0; // TRX 1 oder 2 oder beide
@ -21,53 +21,51 @@ uint8_t ee_WpM EEMEM = 12; // WpM
uint8_t ee_RiseTime EEMEM = 5; // Anstiegszeit Sinuston
uint8_t ee_RiseTimeCounter EEMEM = 5; // Anzahl Sinusschwingungen für den Anstieg
uint8_t ee_DebounceTime EEMEM = 6; // Entprellzeit für Straight Key Eingang
// Stringkonstanten für VT100 Terminals
char CLRSCR[] = "\033[2J";
const char CLRSCR[] = "\033[2J";
/** @brief Ein paar Millisekunden warten
*
* Dieser Variable muss atomar sein, weil es eine 16Bit Variable ist,
* die im Timer 0 verwendet wird.
* @param Zeit in Millisekunden, die gewartet werden soll
* @return void
*/
void DelayMilliSeconds(uint16_t ms)
{
t_delayms = 0;
// ResetMilliSeconds();
//ATOMIC_BLOCK(ATOMIC_FORCEON) {
while(t_delayms < ms);
//}
volatile static uint16_t ctr;
ResetMilliSeconds();
do
{
ATOMIC_BLOCK(ATOMIC_FORCEON)
{
ctr = t_delayms;
}
} while (ctr < ms);
}
/** @brief Wert des Zählers für Millisekunden lesen
*
* Dieser Variable muss atomar sein, weil es eine 16Bit Variable ist,
* die im Timer 0 verwendet wird.
* @param none
* @return milliseconds
*/
uint16_t GetMilliSeconds(void)
{
uint16_t m;
ATOMIC_BLOCK(ATOMIC_FORCEON){
m = t_delayms;
}
return m;
volatile static uint16_t ctr;
ATOMIC_BLOCK(ATOMIC_FORCEON)
{
ctr = t_delayms;
}
return ctr;
}
/** @brief Setzt den Zähler für Millisekunden auf 0
*
* Dieser Variable muss atomar sein, weil es eine 16Bit Variable ist,
* die im Timer 0 verwendet wird.
* @param none
* @return none
*/
void ResetMilliSeconds(void)
{
//ATOMIC_BLOCK(ATOMIC_FORCEON){
ATOMIC_BLOCK(ATOMIC_FORCEON)
{
t_delayms = 0;
//}
}
}
/** @brief SREG wieder herstellen und Interrupts erlauben
* @param none
@ -92,7 +90,7 @@ void IntDisable(void)
*/
void WriteEEprom(void)
{
cli();
IntDisable();
eeprom_write_byte(&ee_Dummy,0x55);
eeprom_write_byte(&ee_WpM, bConfig.WpM);
eeprom_write_byte(&ee_KeyerMode, bConfig.KeyerMode);
@ -107,28 +105,59 @@ void WriteEEprom(void)
eeprom_write_byte(&ee_RiseTime, bConfig.RiseTime);
eeprom_write_byte(&ee_RiseTimeCounter, bConfig.RiseTimeCounter);
eeprom_write_byte(&ee_DebounceTime, bConfig.DebounceTime);
sei();
IntEnable();
}
void ReadEEpromWpM(void)
{
cli();
IntDisable();
bConfig.WpM = eeprom_read_byte(&ee_WpM);
sei();
IntEnable();
}
void WriteEEpromWpM(void)
{
cli();
IntDisable();
eeprom_write_byte(&ee_WpM, bConfig.WpM);
sei();
IntEnable();
}
/** @brief Standardeinstellungen (bei neuem Controller)
*
* @param none
* @return none
*/
void SetEEprom(void)
{
Dummy = 0x55;
bConfig.WpM = 15;
bConfig.KeyerMode = 2;
bConfig.SidetoneFreq = 600;
bConfig.TRX = 1;
bConfig.SidetoneEnabled = 1;
bConfig.WpMBpM = 1;
bConfig.Reverse = 0;
bConfig.WinkeyerEnabled = 0;
bConfig.Ratio = 30;
bConfig.Memory = 0;
bConfig.RiseTime = 5;
bConfig.RiseTimeCounter = 5;
bConfig.DebounceTime = 10;
WriteEEprom();
}
/** @brief EEprom lesen
* @param none
* @return none
*/
void ReadEEprom(void)
{
sprintf(sdebug,"EEprom lesen\r\n");
SerialWriteString(sdebug);
cli();
IntDisable();
Dummy = eeprom_read_byte(&ee_Dummy);
IntEnable();
if(Dummy != 0x55)
{
SetEEprom();
}
IntDisable();
bConfig.WpM = eeprom_read_byte(&ee_WpM);
bConfig.KeyerMode = eeprom_read_byte(&ee_KeyerMode);
bConfig.SidetoneFreq = eeprom_read_word(&ee_SidetoneFreq);
@ -142,7 +171,8 @@ void ReadEEprom(void)
bConfig.RiseTime = eeprom_read_byte(&ee_RiseTime);
bConfig.RiseTimeCounter = eeprom_read_byte(&ee_RiseTimeCounter);
bConfig.DebounceTime = eeprom_read_byte(&ee_DebounceTime);
sei();
IntEnable();
if(bConfig.WpM > 50) {
bConfig.WpM = 15;
WriteEEpromWpM();
@ -159,19 +189,64 @@ void ReadEEprom(void)
bConfig.DebounceTime = 25;
WriteEEprom();
}
sprintf(sdebug,"WpM : %i\r\n", bConfig.WpM);
}
/** @brief Aktuelle Einstellungen über serielle Schnittstelle ausgeben
* @param none
* @return none
*/
void SerialInfo(void)
{
sprintf(sdebug,"WpM : %i\r\n", bConfig.WpM);
SerialWriteString(sdebug);
sprintf(sdebug,"KeyerMode : %i\r\n", bConfig.KeyerMode);
SerialWriteString(sdebug);
sprintf(sdebug,"SidetoneFreq : %u\r\n", bConfig.SidetoneFreq);
SerialWriteString(sdebug);
sprintf(sdebug,"TRX : %i\r\n", bConfig.TRX);
SerialWriteString(sdebug);
sprintf(sdebug,"SidetoneEnabled : %i\r\n", bConfig.SidetoneEnabled);
SerialWriteString(sdebug);
sprintf(sdebug,"Ratio : %i\r\n", bConfig.Ratio);
SerialWriteString(sdebug);
sprintf(sdebug,"SidetoneFreq: %ul\r\n", bConfig.SidetoneFreq);
sprintf(sdebug,"WpMBpM : %i\r\n", bConfig.WpMBpM);
SerialWriteString(sdebug);
sprintf(sdebug,"WpMBpM : %i\r\n", bConfig.WpMBpM);
sprintf(sdebug,"Reverse : %i\r\n", bConfig.Reverse);
SerialWriteString(sdebug);
sprintf(sdebug,"Memory : %i\r\n", bConfig.Memory);
SerialWriteString(sdebug);
sprintf(sdebug,"Winkeyer : %i\r\n", bConfig.WinkeyerEnabled);
SerialWriteString(sdebug);
sprintf(sdebug,"RiseTime : %i\r\n", bConfig.RiseTime);
SerialWriteString(sdebug);
sprintf(sdebug,"RiseTimeCounter : %i\r\n", bConfig.RiseTimeCounter);
SerialWriteString(sdebug);
sprintf(sdebug,"DebounceTime : %i\r\n", bConfig.DebounceTime);
SerialWriteString(sdebug);
}
/** @brief Versionsinformation über serielle Schnittstelle ausgeben
* @param none
* @return none
*/
void SerialAbout(void)
{
sprintf(sdebug,"%s", CLRSCR);
SerialWriteString(sdebug);
sprintf(sdebug,"%s %s %s\r\n\r\n", PRG,VER,CALL);
SerialWriteString(sdebug);
}
/** @brief Ein Zeichen über serielle Schnittstelle ausgeben
* @param Zeichen
* @return none
*/
void SerialWriteChar(unsigned char data)
{
while(!(UCSR0A & (1<<UDRE0)));
UDR0 = data;
}
/** @brief Eine Zeichenkette über serielle Schnittstelle ausgeben
* @param Zeiger auf Zeichenkette, die mit 0x00 abgeschlossen sein muss
* @return none
*/
void SerialWriteString(char *s)
{
while(*s != 0x00)
@ -189,55 +264,77 @@ uint8_t ReadKeyPin(uint8_t pin)
{
return(PIND & (1<<pin));
}
/*
** SideToneOn
/** @brief Tonausgabe einschalten
* @param none
* @return none
*/
void SideToneOn(void)
void SidetoneOn(void)
{
state_sidetoneoff = 0;
bState.SidetoneOff = 0;
StateRiseTime = bConfig.RiseTime;
StateRiseTimeCounter = 0;
icnt = 0;
sbi(TIMSK1,OCIE1A);
}
/*
** SideToneOff
/** @brief Tonausgabe abschalten
* @param none
* @return none
*/
void SideToneOff(void)
void SidetoneOff(void)
{
state_sidetoneoff = 1;
bState.SidetoneOff = 1;
StateRiseTime = 0;
StateRiseTimeCounter = 0;
}
/** @brief Audioverstärker abschalten
* @param none
* @return none
*/
void SidetoneDisable(void)
{
bConfig.SidetoneEnabled = 0;
cbi(PORTB,AUDIO_EN);
}
/** @brief Audioverstärker einschalten
* @param none
* @return none
*/
void SidetoneEnable(void)
{
bConfig.SidetoneEnabled = 1;
sbi(PORTB,AUDIO_EN);
}
/*
** TXKey
**
** Tastung TRX1, TRX2 oder beide
*/
void TXKey(uint8_t State, uint8_t SendingType)
void TXKey(uint8_t State)
{
if((State) && (KeyState == 0))
if((State) && (bState.KeyState == 0))
{
if(KeyTX)
{
SideToneOn();
SidetoneOn();
sbi(PORTC,MORSE_LED);
KeyState = 1;
bState.KeyState = 1;
}
}
else
{
if((State == 0) && (KeyState))
if((State == 0) && (bState.KeyState))
{
if(KeyTX)
{
SideToneOff();
SidetoneOff();
cbi(PORTC,MORSE_LED);
}
KeyState = 0;
bState.KeyState = 0;
}
}
}
/** \brief StraigtKey
*
* Check Straightkey
@ -247,7 +344,7 @@ void CheckStraightKey(void)
{
if(PIND & (1<<STRAIGHT_KEY))
{
TXKey(0,MAN);
TXKey(0);
StateStraightKeyPressed = NO_KEY_PRESSED;
} else {
if(StateStraightKeyPressed == NO_KEY_PRESSED)
@ -257,7 +354,7 @@ void CheckStraightKey(void)
}
if(StateStraightKeyPressed == KEY_PRESSED)
{
TXKey(1,MAN);
TXKey(1);
}
}
}
@ -266,8 +363,86 @@ void CheckStraightKey(void)
*/
void CheckPaddles(void)
{
static uint8_t LastAction = NOTHING;
CheckDitPaddle();
CheckDahPaddle();
if(bConfig.KeyerMode == ULTIMATIC)
{
switch(LastAction)
{
case DAH_DIT_ON:
if(DahBuffer) {
if(DitBuffer)
DitBuffer = 0;
else
LastAction = DAH_DIT_OFF;
} else {
if(DitBuffer)
LastAction = DIT_DAH_OFF;
else
LastAction = NOTHING;
}
break;
case DIT_DAH_ON:
if(DitBuffer) {
if(DahBuffer)
DahBuffer = 0;
else
LastAction = DIT_DAH_OFF;
} else {
if(DahBuffer)
LastAction = DAH_DIT_OFF;
else
LastAction = NOTHING;
}
break;
case DAH_DIT_OFF:
if(DitBuffer) {
if(DahBuffer)
{
LastAction = DIT_DAH_ON;
DahBuffer = 0;
} else {
LastAction = DIT_DAH_OFF;
}
} else {
if(!DahBuffer)
LastAction = NOTHING;
}
break;
case DIT_DAH_OFF:
if(DahBuffer) {
if(DitBuffer)
{
LastAction = DAH_DIT_ON;
DitBuffer = 0;
} else {
LastAction = DAH_DIT_OFF;
}
} else {
if(!DitBuffer)
LastAction = NOTHING;
}
break;
case NOTHING:
if((DitBuffer) && (!DahBuffer)) {
LastAction = NOTHING;
} else {
if((DahBuffer) && (!DitBuffer)) {
LastAction = DAH_DIT_OFF;
} else {
if((DitBuffer) && (DahBuffer)) {
LastAction = DIT_DAH_ON;
DahBuffer = 0;
}
}
}
break;
}
}
}
/** \brief CheckDitPaddle
*
@ -277,14 +452,14 @@ void CheckDitPaddle(void)
{
static uint8_t pinvalue = 0;
if(PaddleMode == PADDLE_NORMAL) // no reverse paddle
if(PaddleMode == PADDLE_NORMAL) // no reverse paddle
pinvalue = PIND & (1<<LEFT_PADDLE);
else
pinvalue = PIND & (1<<RIGHT_PADDLE); // reverse paddle
pinvalue = PIND & (1<<RIGHT_PADDLE); // reverse paddle
if(pinvalue == 0) // ditpaddle pressed
if(pinvalue == 0) // DitPaddle betätigt
{
if(StatePaddleKeyPressed == NO_KEY_PRESSED) // First time, start debounce
if(StatePaddleKeyPressed == NO_KEY_PRESSED) // Entprellen
{
StatePaddleKeyPressed = KEY_PRESSED_DEBOUNCE;
TimerPaddleKeyPressed = 0;
@ -317,85 +492,119 @@ void CheckDahPaddle(void)
}
if(StatePaddleKeyPressed == KEY_PRESSED) // Debounce ok
{
if(DahBuffer == 0)
{
DahCounter++;
DitCounter = 0;
}
DahBuffer = 1;
StatePaddleKeyPressed == NO_KEY_PRESSED;
}
}
}
void SetRatio(uint8_t WPMCorrectFactor)
{
DitMillis = 1200 / WpM;
DahMillis = DitMillis * (float)(bConfig.Ratio/10);
}
/** @brief Schleife für die Dauer eines Zeichenelements Dit oder Dah
*
* Bei einer Geschwindigkeit von 12WpM (60BpM) hat ein Dit
* eine Länge von 100ms, ein Dah eine Länge von 300ms. In
* dieser Zeit müssen die Paddle Eingänge weiter abgefragt
* werden, damit keine Zeichen verloren gehen.
*
* @param len Count of dits * weigthing / 50
* @param AddMiliSeconds Increase pausing between elements
* @param SendingType AUTO or MAN
* @param Len Anzahl der Symbole (in Dits)
* @return none
*/
void ElementLoop(uint8_t len, uint8_t AddMilliSeconds, uint8_t SendingType)
void SymbolLoop(uint8_t Len)
{
uint16_t LoE; // lengths of one element in ms
uint16_t ticks; // lengths of elements + AddMilliSeconds in ms
volatile static uint16_t ticks; // lengths of elements + AddMilliSeconds in ms
if((len == 0) || (len < 0))
return;
LoE = 1200/WpM; // Calculate length of one element
ticks = LoE * len + AddMilliSeconds; //
t_elementlength = 0; // Reset Timer 0 variable
while(t_elementlength < ticks)
ticks = DitMillis * Len; //
t_elementlength = 0; // Reset Timer 0 variable
while(t_elementlength < ticks)
{
if((KeyerMode == IAMBIC_A) && (!(PIND & (1<<LEFT_PADDLE))) && (!(PIND & (1<<RIGHT_PADDLE))))
IambicFlag = 1;
if(SendStatus == SENDING_DIT)
if(bState.SendStatus == SENDING_DIT)
CheckDahPaddle();
else if(SendStatus == SENDING_DAH)
else if(bState.SendStatus == SENDING_DAH)
CheckDitPaddle();
else {
CheckDahPaddle();
CheckDitPaddle();
}
}
// Wenn Taste losgelassen, dann im KeyerMode IAMBIC_A das IambicFlag löschen
if((KeyerMode == IAMBIC_A) && (IambicFlag) && (PIND & (1<<LEFT_PADDLE)) && (PIND & (1<<RIGHT_PADDLE)))
{
IambicFlag = 0;
DitBuffer = 0;
DahBuffer = 0;
}
if((bState.SendStatus == SENDING_DIT) || (bState.SendStatus == SENDING_DAH))
{
if(bConfig.Memory == 0)
{
DitBuffer = 0;
DahBuffer = 0;
}
}
}
/*
** void SendDit(uint8_t SendingType)
*/
void SendDit(uint8_t SendingType)
{
SendStatus = SENDING_DIT;
TXKey(1,SendingType);
ElementLoop(1,0,SendingType);
TXKey(0,SendingType);
ElementLoop(1,0,SendingType);
bState.SendStatus = SENDING_DIT;
TXKey(1);
SymbolLoop(1);
TXKey(0);
SymbolLoop(1);
bState.SendStatus = NOTHING;
CheckPaddles();
}
/** \brief Send a dah
** A Dah with weight = 50 has the length of 3 Dits.
*/
void SendDah(uint8_t SendingType)
{
SendStatus = SENDING_DAH;
TXKey(1,SendingType);
ElementLoop(3,0,SendingType);
TXKey(0,SendingType);
ElementLoop(3,0,SendingType);
bState.SendStatus = SENDING_DAH;
TXKey(1);
SymbolLoop(3);
TXKey(0);
SymbolLoop(1);
bState.SendStatus = NOTHING;
CheckPaddles();
}
/** @brief Bearbeiten der Punkt- und Strichbuffer für Iambic Modes
*
* Bei Iambic A wird der Buffer gelöscht, bei Iambic B voher das
* gegensätzliche Zeichen ausgegeben.
* @param none
* @return none
*/
void DitDahBuffers(void)
{
if((bConfig.KeyerMode == IAMBIC_A) || (bConfig.KeyerMode == IAMBIC_B) || (bConfig.KeyerMode == ULTIMATIC))
{
// IAMBIC_A
if((bConfig.KeyerMode == IAMBIC_A) && (IambicFlag) && (PIND & (1<<LEFT_PADDLE)) && (PIND & (1<<RIGHT_PADDLE)))
{
IambicFlag = 0;
DitBuffer = 0;
DahBuffer = 0;
} else {
// IAMBIC_B
if(DitBuffer)
{
DitBuffer = 0;
SendDit(MAN);
}
if(DahBuffer)
{
DahBuffer = 0;
SendDah(MAN);
}
}
}
}
/*
** Set sidetone frequency
*/
@ -412,9 +621,9 @@ void SetFrequency(uint16_t f)
void Tone(uint16_t f, uint8_t duration)
{
SetFrequency(f);
SideToneOn();
SidetoneOn();
DelayMilliSeconds(duration);
SideToneOff();
SidetoneOff();
SetFrequency(bConfig.SidetoneFreq);
}
void Boop(void)
@ -427,7 +636,6 @@ void Beep(void)
}
void BeepBoop(void)
{
sbi(PORTB,AUDIO_EN);
DelayMilliSeconds(10);
Beep();
DelayMilliSeconds(100);
@ -484,8 +692,5 @@ void SendChar(unsigned char c)
case '?': SendDit(AUTO); SendDit(AUTO); SendDah(AUTO); SendDah(AUTO); SendDit(AUTO); SendDit(AUTO); break;
case '@': SendDit(AUTO); SendDah(AUTO); SendDah(AUTO); SendDit(AUTO); SendDah(AUTO); SendDit(AUTO); break;
}
ElementLoop(3,0,WpM);
}

@ -15,9 +15,11 @@
uint8_t sreg_tmp;
// Prototypes
void ElementLoop(uint8_t Len, uint8_t AddMilliSeconds, uint8_t SendingType);
void SymbolLoop(uint8_t Len);
uint8_t ReadKeyPin(uint8_t pin);
void CheckPaddles(void);
void SetRatio(uint8_t WpMCorrectFactor);
void DitDahBuffers(void);
// Sidetone
void SideToneOn(void);
void SideToneOff(void);
@ -33,9 +35,12 @@ void WriteEEprom(void);
void ReadEEprom(void);
void WriteEEpromWpM(void);
void ReadEEpromWpM(void);
void SetEEprom(void);
// Serielle Schnittstelle
void SerialWriteString(char *s);
void SerialWriteChar(unsigned char data);
void SerialInfo(void);
void SerialAbout(void);
// Delay Millis
void DelayMilliSeconds(uint16_t ms);
void ResetMilliSeconds(void);

@ -44,6 +44,12 @@
#endif
#define L_WAIT 500 // Frequency for debug LED Timer 0
#define CALL " DL7BJ "
#define PRG " BJ-Keyer "
#define VER " V1.00 "
// Keying states
#define NOTHING 0
#define DIT_DAH_OFF 1
@ -59,7 +65,6 @@
// Paddle Mode
#define PADDLE_NORMAL 0
#define PADDLE_REVERSE 1
// Sending Mode
#define SENDING_NOTHING 0
#define SENDING_DIT 1
@ -117,12 +122,16 @@
// Debugausgabe
char sdebug[64];
// Structs für Merker, Menü und Einstellungen
struct Merker
// Structs für Status, Menü und Einstellungen
struct State
{
uint8_t WpMChanged: 1;
uint8_t WriteWpMEEprom: 1;
uint8_t WriteEEprom: 1;
uint8_t WpMChanged: 1; // Geschwindigkeit geändert
uint8_t WriteWpMEEprom: 1; // nicht gespeicherte Geschwindigkeit
uint8_t WriteEEprom: 1; // nicht gespeicherte EEprom Werte
uint8_t SidetoneOff: 1; // Mithörton an oder aus
uint8_t SidetoneEnabled: 1; // Mithörton ein- oder ausgeschaltet
uint8_t SendStatus; //
uint8_t KeyState:1; //
};
struct MenuCtrl
@ -142,7 +151,7 @@ struct MenuCtrl
struct Config
{
uint8_t TRX: 2; // TRX 1 oder 2 oder beide
uint8_t KeyerMode: 2; // Iambic A, Iambic B oder Ultimatic
uint8_t KeyerMode: 3; // Iambic A, Iambic B oder Ultimatic
uint8_t SidetoneEnabled: 1; // Mithörton eingeschaltet
uint8_t WpMBpM: 1; // WpM oder BpM Anzeige
uint8_t Reverse: 1; // linkes/rechtes Paddle vertauschen
@ -170,18 +179,11 @@ uint8_t WpM;
uint8_t Weight;
uint8_t LengthOfElement;
// Diverse Zähler für Timer 0
uint16_t MenuCtrlTimer; // Wartezeit bis zur Betriebsanzeige nach Config
volatile uint16_t t_delayms; // Timer 0 max. 65535ms, all purpose timer variable
volatile uint16_t t_elementlength; // Timer 0 max. 65535ms, element length of dit or dah
// State Machines
uint8_t PaddleMode;
uint8_t KeyerMode;
uint8_t state_sidetoneoff;
volatile uint8_t SendStatus;
// History
uint8_t keyhistory;
uint8_t KeyTX;
@ -189,28 +191,32 @@ uint8_t DahBuffer;
uint8_t DitBuffer;
uint8_t Weighting;
uint8_t IambicFlag;
uint8_t KeyState;
uint8_t DitCounter;
uint8_t DahCounter;
uint8_t CurrentTRX1;
uint8_t StateRiseTime;
volatile uint8_t StateRiseTimeCounter;
// Sidetone generation
double FrequencySidetone;
volatile uint8_t icnt;
volatile uint8_t ocr2a;
// Variablen in Timer 0
volatile uint16_t l_timer; // counter for LED on
volatile uint8_t t_timer; // Frequency of audio output
volatile uint16_t t_wait; // delayms max. 65535ms
volatile uint16_t l_timer; // counter for LED on
volatile uint8_t t_timer; // Frequency of audio output
volatile uint16_t t_wait; // delayms max. 65535ms
volatile uint8_t t_pwm;
volatile uint16_t t_wait_led;
volatile uint8_t lastButton; // Wert der letzten Buttonabfrage
volatile uint8_t lastButton; // Wert der letzten Buttonabfrage
volatile uint16_t DitMillis;
volatile uint16_t DahMillis;
// Zähler und Status für Tasten und Mithörton
volatile uint8_t StateStraightKeyPressed; // Merker für StraightKey betätigt
volatile uint8_t TimerStraightKeyPressed; // Timer Variable für Entprellung
volatile uint8_t StatePaddleKeyPressed; // Merker für Paddle betätigt
volatile uint8_t TimerPaddleKeyPressed; // Timer Variable für Entprellung
volatile uint8_t StateRiseTimeCounter; // Zähler für Anstieg des Mithörtons
volatile uint8_t StateRiseTime;
volatile uint8_t StateRiseTimeCounter;
// Diverse Zähler für Timer 0
uint16_t MenuCtrlTimer; // Wartezeit bis zur Betriebsanzeige nach Config
volatile uint16_t t_delayms; // Timer 0 max. 65535ms, all purpose timer variable
volatile uint16_t t_elementlength; // Timer 0 max. 65535ms, element length of dit or dah
#endif

@ -112,26 +112,26 @@ void InitTimer(void)
// Prescaling 8
sbi(TCCR1B,CS11);
// Output Compare Match Interrupt Enable
OCR1A = 51; // 600Hz
sbi(TIMSK1,OCIE1A);
OCR1A = 51; // 600Hz
sbi(TIMSK1,OCIE1A); // Timer 1 Sinus Hüllkurve einschalten
// Timer 0 1ms für diverse Zähler
TCCR0A = 0; TCCR0B = 0; TCNT0 = 0;
cbi(TCCR0A,WGM00);
sbi(TCCR0A,WGM01);
cbi(TCCR0B,WGM02); // CTC Mode 2 Immediate
cbi(TCCR0B,WGM02); // CTC Mode 2 Immediate
cbi(TCCR0B,CS02);
sbi(TCCR0B,CS01);
sbi(TCCR0B,CS00); // prescaler 64
OCR0A = 249; // CTC 1ms
sbi(TIMSK0,OCIE0A); // Enable Timer 0 CTC
sbi(TCCR0B,CS00); // prescaler 64
OCR0A = 249; // CTC 1ms
sbi(TIMSK0,OCIE0A); // Timer 0 1ms einschalten
sei();
}
void Init()
{
cli(); // disable all interrupts
SendStatus = SENDING_NOTHING;
bState.SendStatus = SENDING_NOTHING;
// PORTB
DDRB = 0x00;
// Interne PullUps einschalten
@ -142,14 +142,10 @@ void Init()
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);
sbi(DDRB,PB3); // PWM
sbi(DDRB,AUDIO_EN); // Audio Verstärker
// PORTC
sbi(DDRC,MORSE_LED);
// PORTD
// Ein- und Ausgänge festlegen
DDRD = 0x00;
@ -187,19 +183,6 @@ void Init()
bMenuCtrl.Config = 0;
bMenuCtrl.buttonPressed = 0;
bMenuCtrl.buttonPressedLong = 0;
// Initialisierung Konfiguration
bConfig.KeyerMode = IAMBIC_A;
bConfig.SidetoneFreq = 600;
bConfig.SidetoneEnabled = 1;
bConfig.TRX = 0;
bConfig.WpMBpM = 1;
bConfig.WpM = 12;
bConfig.Ratio = 30;
bConfig.Reverse = 0;
bConfig.RiseTime = 6;
bConfig.RiseTimeCounter = 6;
bConfig.DebounceTime = 5;
bConfig.WinkeyerEnabled = 0;
sei(); // enable all interrupts
}
@ -215,7 +198,7 @@ ISR(TIMER1_COMPA_vect)
if(icnt == SINEWAVELENGTH)
{
icnt = 0;
if(state_sidetoneoff == 0)
if(bState.SidetoneOff == 0)
{
if(StateRiseTime > 0)
{
@ -224,7 +207,7 @@ ISR(TIMER1_COMPA_vect)
StateRiseTime--;
}
}
if(state_sidetoneoff == 1)
if(bState.SidetoneOff == 1)
{
if(StateRiseTime < bConfig.RiseTime)
{
@ -277,14 +260,14 @@ ISR(TIMER0_COMPA_vect)
{
bMenuCtrl.buttonPressedLong = 1;
if(bMenuCtrl.Config == 1)
bMerker.WriteEEprom = 1;
bState.WriteEEprom = 1;
}
}
// WpM verändert? Nach 5 Sekunden im EEPROM Speichern
if((StoreEEprom > 1000) && (bMerker.WpMChanged))
if((StoreEEprom > 1000) && (bState.WpMChanged))
{
bMerker.WriteWpMEEprom = 1;
bMerker.WpMChanged = 0;
bState.WriteWpMEEprom = 1;
bState.WpMChanged = 0;
}
// Softwareentprellung für StraightKey
TimerStraightKeyPressed++;
@ -328,7 +311,7 @@ ISR(USART_RX_vect)
*/
void DoMorse(void)
{
if((KeyerMode == IAMBIC_A) || (KeyerMode == IAMBIC_B) || KeyerMode == SINGLE_PADDLE)
if((KeyerMode == IAMBIC_A) || (KeyerMode == IAMBIC_B) || KeyerMode == ULTIMATIC)
{
if((KeyerMode == IAMBIC_A) && (IambicFlag) && (ReadKeyPin(LEFT_PADDLE)))
{
@ -350,22 +333,6 @@ void DoMorse(void)
}
}
}
else
{
if(KeyerMode == STRAIGHT)
{
if(DitBuffer)
{
DitBuffer = 0;
TXKey(1,MAN);
}
else
{
TXKey(0,MAN);
}
DitCounter = 0;
}
}
}
/** @brief Initialisierung bei Reset und Neustart
* @param none
@ -373,21 +340,28 @@ void DoMorse(void)
*/
void ReStart(void)
{
MenuCtrlTimer = 0;
t_delayms = 0;
bState.SendStatus = SENDING_NOTHING;
Init();
DisplayVersion();
ReadEEprom();
WpM = bConfig.WpM;
EncoderPos = bConfig.WpM;
EncoderWrite(bConfig.WpM);
EncoderPosConfig = 1;
SetFrequency(bConfig.SidetoneFreq);
MenuCtrlTimer = 0;
t_delayms = 0;
SendStatus = SENDING_NOTHING;
Init();
DisplayVersion();
SetRatio(0);
KeyerMode = bConfig.KeyerMode;
PaddleMode = bConfig.Reverse;
KeyTX = 1;
KeyState = 0;
bState.KeyState = 0;
if(bConfig.SidetoneEnabled)
SidetoneEnable();
else
SidetoneDisable();
}
/** @brief main()
* @param none
@ -396,28 +370,31 @@ void ReStart(void)
int main(void)
{
ReStart();
SerialAbout();
SerialInfo();
while(1)
{
Drehencoder();
// Wenn Geschwindigkeit verändert und Zeit abgelaufen,
// dann im EEprom speichern und Merker löschen.
if(bMerker.WriteWpMEEprom)
if(bState.WriteWpMEEprom)
{
sprintf(sdebug," %i WpM in EEprom speichern\r\n", bConfig.WpM);
SerialWriteString(sdebug);
WriteEEpromWpM();
bMerker.WriteWpMEEprom = 0;
bState.WriteWpMEEprom = 0;
}
if(bMerker.WriteEEprom)
if(bState.WriteEEprom)
{
sprintf(sdebug,"Einstellungen in EEprom speichern\r\n");
SerialWriteString(sdebug);
WriteEEprom();
bMerker.WriteEEprom = 0;
bState.WriteEEprom = 0;
}
UpdateDisplay();
CheckStraightKey();
CheckPaddles();
DitDahBuffers();
DoMorse();
}
}

@ -14,7 +14,7 @@
struct Config bConfig;
struct MenuCtrl bMenuCtrl;
struct Merker bMerker;
struct State bState;
// Function prototypes
void Init(void);
void InitTimer(void);
@ -27,7 +27,7 @@ void SendDit(uint8_t SendingType);
void SendDah(uint8_t SendingType);
void SideToneOff(void);
void SideToneOn(void);
void TXKey(uint8_t State, uint8_t SendingType);
void TXKey(uint8_t State);
void SendChar(uint8_t);
void ChangeSpeed(void);
void DoMorse(void);

@ -0,0 +1,27 @@
#!/bin/bash
#
# EEprom lesen und schreiben
# malkus elektronik GmbH
# 2010-09-07
#
#
# Read EEPROM
CPU="atmega328p"
if [ $1 = "S" ]
then
echo EEPROM schreiben
avrdude -p $CPU -P /dev/ttyACM0 -c stk500v2 -B8 -U eeprom:w:eeprom.read
echo Fertig!
exit 0
fi
if [ $1 = "R" ]
then
echo EEPROM lesen
avrdude -p $CPU -P /dev/ttyACM0 -c stk500v2 -B8 -U eeprom:r:eeprom.read:i
exit 0
fi
exit 0
Loading…
Cancel
Save