Touch-Morsetasten mit dem PFS154     


Elektronik-Labor  Projekte 



Der verwendete Mikrocontroller PFS154 hat genügend Platz für zahlreiche Programme, die über die Jumper ausgewählt werden. Er wird über den langsamen RC-Takt mit 50 kHz betrieben, wobei der Betriebsstrom nur 60 µA beträgt. Das sorgt für eine lange Lebensdauer der Batterien.  Spätestens wenn sie verbraucht sind, kann man morsen. Der folgende Auszug zeigt die Abfrage der Jumper und die Auswahl der ersten beiden Funktionen Key() und Elbug().

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);
}





Die Software wertet die Änderung der Kapazität beim Berühren der Kontakte aus. Der dünne Feuchtigkeitsfilm zwischen Metall und Finger bildet einen Doppelschichtkondensator mit Kapazitäten bis zu einigen Nanofarad (siehe Messung der Hautimpedanz). Parallel liegen Kondensatoren von 330 pF, die zusammen mit den Schutzwiderständen von 1 k ein Tiefpassfilter bilden und HF abblocken. Die gesamte Kapazität wird zuerst entladen und dann über den internen Pullup geladen. Es ergibt sich eine typische RC-Ladekurve, die je nach Hautfeuchtigkeit und Andruck des Fingers zu einer bestimmten Zeit die Schaltschwelle des Eingangs übersteigt. Nach nur zwei Taktlängen (.delay(2);), also nach 40 µs wird der Portzustand abgefragt. Wenn dann noch ein Low-Zustand gelesen wird, gilt die Taste als gedrückt. dann wird die Tonausgabe über den Timer und zusätzlich der Port PB5 eingeschaltet, an dem eine LED oder ein Sender hängen kann. Die kürzeste mögliche Wartezeit soll die Touch-Funktion auch bei relativ trockener Haut sichern. Bei den meisten Leuten funktioniert das gut.

static	void Key (void)
{
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;
}



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.


static	void Dot2 (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(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;
}

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.



.



Elektronik-Labor  Projekte