static void Jumper (void)
{
//Jumper B4...B7 abfragen: Pogrammoptionen
prog = 0;
PBC = 0xF0;
PBPH = 0x0F;
.delay (200);
if (PB.0 == 0) {prog += 8;}
if (PB.1 == 0) {prog += 4;}
if (PB.2 == 0) {prog += 2;}
if (PB.3 == 0) {prog += 1;}
// PBC = 0xBF; //PB6 Input
// PBPH = 0x40; //Pullup nur an PB6, RXD
// PB = 0x80; //TXD 1
prog2 = 0;
//Jumper B0/B1 quer abfragen: prog2
if(prog < 4)
{
PBC.0 = 0;
PBPH.0 = 1;
.delay (20);
if (PB.0 ==0) {prog2 = 1;}
PBC.0 = 1;
PBPH.0 = 0;
}
//Jumper B4/B5 quer abfragen: prog3
prog3 = prog << 6;
if(prog3 > 0) //B2/3 frei gegen GND?
{
prog3 = 0;
}
else
{
prog3 = 0;
PBC.3 = 0;
PBPH.3 = 1;
.delay (20);
if (PB.3 ==0) {prog3 = 1;}
PBC.3 = 1;
PBPH.3 = 0;
}
//Jumper A4, A0 abfragen: Speed
PAC.4 = 0; PAPH.4 = 1;
PAC.0 = 0; PAPH.0 = 1;
speed = 1;
if (PA.4==0) {speed += 2;};
if (PA.0==0) {speed += 1;};
PAC.4 = 1; PAPH.4 = 0;
PAC.0 = 1; PAPH.0 = 0;
}
void FPPA0 (void)
{
.ADJUST_IC SYSCLK=IHRC/16 // 1 MHz
$ CLKMD IHRC/4, En_IHRC,En_ILRC;
goto $+1
// Insert Initial Code
Byte i, j, k, l, m, n;
Word dd, ee, t;
PAC=0xDF; //PA.5 input
PA=0x00;
PAPH = 0x20; //PA.5 Pullup
PBC = 0xF0;
PBPH = 0x0F; //Pullup
// PB = 1; //TXD 1
.delay (200);
cw_count = 0;
al = 0;
nal = 0;
while (1)
{
//Phase 1 mit 8 MHz
$ CLKMD IHRC/4, En_IHRC,En_ILRC;
goto $+1;
Jumper();
//Phase 2 mit 50 kHz
CLKMD = 0xF4; //ILRC
CLKMD.4 = 0;
goto $+1;
if (prog == 0) //CW Key
{
do
{
Key();
} while (PA.5 == 1);
}
if (prog == 1 ) //CW Bug
{
do
{
Elbug();
} while (PA.5 == 1);
}
static void Key (void)Während des Morsens wird jedes Zeichen in o mitgelesen und am Ende in A an das Hauptprogramm übergeben. Ein Zeichen beginnt mit einer Start-Eins. Dann folgen Nullen für Punkte und Einsen für Striche. Die Längenmessung verwendet einen Vergleich mit der Punktlänge t, die entsprechend der gewählten Morsegeschwindigkeit (Speed) gewählt wird. Bei der normalen Morsefunktion mit dem Programm 0 wird das gelesene Zeichen nicht ausgewertet, wohl aber später für unterschiedliche Zwecke.
{
byte t, s, o, p;
t = 75;
if (Speed == 1) {t=50;}
if (speed == 2) {t=38;}
if (speed == 3) {t=30;}
if (speed == 4) {t=25;}
tm2b = 31;
tm2s = 0b1__00_00001; // 6 Bit / 1 / 1, ca. 500 Hz
s = 0; p = 0;
o = 1;
do
{
.delay(150);
PBC.5 = 1;
PB.5= 0;
PBC.5 = 0;
PBPH.5 = 1;
.delay(2);
if (PB.5 ==0)
{
PBC.5 = 1;
if (prog < 11) {PA.6=1;}
PBPH.5 = 0;
tm2c = 0b0100_10_1_0; //Ton
s +=1; //Strichlänge messen
p = 0; //Pause = 0
}
else
{
PBC.5 = 1;
if (prog < 11) {PA.6=0;}
PBPH.5 = 0;
tm2c = 0; //aus
if (s > 5) //minimale Strichlänge, Entprellung
{
o = o << 1;
if (s > t) {o +=1;}
}
p +=1; //Pausenlänge messen
s = 0; //Pause = 0
}
} until (p > t);
A = o;
}
static void Dot2 (void)Die Funktion Elbug arbeitet ähnlich, aber mit zwei Touch-Kontakten an PB4 und PB5. Immer wenn ein Punkt erkannt wurde, wird dieser mit der Funktion Dot2() erzeugt, bei einem Strich wird Dash2() aufgerufen. Diese beiden Funktionen sorgen für die korrekte Geschwindigkeit. Weil die beiden Berührungssensoren abwechselnd abgefragt werden, ergibt sich automatisch eine Squeeze-Funktion. Drückt man also auf beide Flächen, entsteht eine Punkt-Strich-Folge. Auch hier wird wieder in o das Zeichen mitgelesen und am Ende in A übergeben.
{
Byte t;
t = 50;
if (speed == 2) {t=38;}
if (speed == 3) {t=30;}
if (speed == 4) {t=25;}
tm2b = 31;
tm2s = 0b1__00_00001; // 6 Bit / 1 / 1, ca. 500 Hz
tm2c = 0b0100_10_1_0; //IRCL
if (prog < 11) {PA.6=1;}
do
{
.delay(100); //ca. 100 ms
} while (--t);
tm2c = 0;
if (prog < 11) {PA.6=0;}
t = 50;
if (speed == 2) {t=38;}
if (speed == 3) {t=30;}
if (speed == 4) {t=25;}
do
{
.delay(100); //ca. 100 ms
} while (--t);
}
static void Dash2 (void)
{
Byte t;
t = 50;
if (speed == 2) {t=38;}
if (speed == 3) {t=30;}
if (speed == 4) {t=25;}
tm2b = 31;
tm2s = 0b1__00_00001; // 6 Bit/ 1 / 1, ca. 500 Hz
tm2c = 0b0100_10_1_0; //IRCL
if (prog < 11) {PA.6=1;}
do
{
.delay(300); //ca. 100 ms
} while (--t);
tm2c = 0;
if (prog < 11) {PA.6=0;}
t = 50;
if (speed == 2) {t=38;}
if (speed == 3) {t=30;}
if (speed == 4) {t=25;}
do
{
.delay(100); //ca. 100 ms
} while (--t);
}
static void Elbug (void)
{
byte t, s, o;
t = 75;
if (Speed == 1) {t=50;}
if (speed == 2) {t=38;}
if (speed == 3) {t=30;}
if (speed == 4) {t=25;}
s = t;
o = 1;
do
{
.delay(300); //ca. 300 ms
PBC.4 = 1;
PB.4= 0;
PBC.4 = 0;
PBPH.4 = 1;
.delay(2);
if (PB.4 ==0)
{
PBC.4 = 1;
PBPH.4 = 0;
Dot2();
s = 5;
o = o << 1;
}
PBC.4 = 1;
PBPH.4 = 0;
PBC.5 = 1;
PB.5 = 0;
PBC.5 = 0;
PBPH.5 = 1;
.delay(2);
if (PB.5 == 0)
{
PBC.5 = 1;
PBPH.5 = 0;
Dash2();
s = 5;
o = o << 1;
o = o + 1;
}
PBC.5 = 1;
PBPH.5 = 0;
} while (--s);
A = o;
}