RC-Messung für den PFS154
Jetzt habe ich endlich auch einen Padauk-Programmer. Die ersten
Versuche gingen damit wie geplant. Dann wollte ich den Controller in
der Schaltung programmieren. Dafür sind ja eigentlich nur fünf
Leitungen nötig. Aber der Brenner zeigte sich störrisch. Ich habe den
Eindruck gewonnen, dass er alle Pinne überprüft um zu erkennen, wenn
ein defekter Controller eingesetzt wird. Irgendwie soll man da etwas
einstellen können. Aber die Manuals sind für mich nicht ganz klar
verständlich. Am Ende blieb nur die Möglichkeit, alle 16 Leitungen zu
verbinden. Und auch da machte es noch einen Unterschied, ob ich die
Controller-Seite oder die Adapterseite in den Brenner stecke. Die
Vermutung war, dass es mit längeren Leitungen Timing-Probleme gibt.
Also wird nun immer der Controller in den Brenner gesteckt, während der
Adapter am Ende der Verlängerung in der Schaltung steckt. Jedenfalls so
lange, bis eine Anwendung fertig entwickelt ist. Vor jedem neuen
Brennen muss ich die Betriebsspannung und manche anderen Verbindungen
öffnen, damit das IC korrekt erkannt wird.
Erst wenn der Brenner zufrieden ist, steht da "IC ready". Dann kann der
Controller gerbrannt werden. Das Ganze ist jetzt nicht so bequem wie es
sein sollte, aber immer noch besser, als die Controller-Platine immer
wieder hin und her zu stecken. Also kann ich nun richtig loslegen.
Weil der PFS154 keinen AD-Wandler besitzt, musste ich mir was einfallen
lassen, um irgendwelche Messungen auszuführen. Die Idee war, eine
Zeitkonstante zu messen. Ein unbekannter Widerstand lädt einen
bekannten Kondensator auf. Gemessen wird die Zeit, bis zu der der
gelesene Eingangszustand an PB2 umkippt. Für jede neue Messung soll PB2
einmal kur als Ausgang low-geschaltet werden um den Kondensator zu
entladen. Dann beginnt der Ladevorgang über Rx.
Bei der Programmierung bin ich von dem letzten Beispiel zur seriellen Schnittstelle
ausgegangen. Irgendwie tappe ich noch an vielen Stellen im Dunkeln. Was
genau kann das Mini-C, welche Besonderheiten hat die Sytax, was
bedeutet die mögliche Mischung mit Assembler. Ich will ja nicht
meckern, weil diese Controller so extrem billig sind. Aber die
Dokumentation ist für mich gewöhnungsbedürftig. Ich vermute, in Taiwan
ist das so wie in Festland-China: Es gibt Spitzen-Programmierer, aber
die sprechen nur chinesisch. Die Übersetzung macht dann jemand, der
zwar etwas Englisch kann, aber von der Sache nichts versteht. Dazu
kommt eine ganz eigene Grammatik, an die man sich allerdings schnell
gewöhnt. Ein Beispiel zeigt die folgende Fehlermeldungen:
"C:\PADAUK_Tool\0.87\Projekt2\Projekt2.C(191): Not need '}' but find"
Aber wenn man das frei übersetzt heißt es einfach: "Finde unnötige
Klammer". Stimmt, Klammer entfernt, Programm fehlerfrei.
Die fertigen Beispiele des Compilers sind dagegen sehr gut. Die stammen
ja auch von den fähigen Programmierern und mussten nicht übersetzt
werden. Da kann ich nun Dinge abschauen und kopieren wie "set1 PB.2".
Ist das jetzt Assembler oder irgendeine Art von Macro? Keine Ahnung,
aber es funktioniert. Auch wie man eine Zählschleife bilden muss, geht
daraus hervor. Hier lasse ich i von 127 bis 0 herunterzählen. Aber n
wird nur erhöht, wenn der B2 noch als low gelesen wird, Das ergibt eine
sehr einfache und effektive Messschleife mit einer Begrenzung auf 127.
Dann habe ich den dazu passenden Kondensator gesucht und gefunden, dass
ich mit 150 pF Widerstände bis etwa 1 M messen kann. Der Messwert in n
wird an A an die serielle Ausgabe übergeben. Weil A nirgendwo
deklariert ist, vermute ich, dass der Wert im Akku A assemblermäßig in
die aufgerufene Funktion übergeben wird.
Für
Rx = 330 k erhalte ich zuverlässig einen Messwert von 79. Man müsste
also nur noch mit 4,18 multiplizieren und könnte dann Rx in kOhm
anzeigen. Aber in anderen Anwendungen will man vielleicht einfach nur
Grenzwerte vergleichen. Ein Beispiel wäre die Messung der Feuchtigkeit
von Blumenerde. Da müsste man nur einen zu den verwendeten Elektroden
passenden Grenzwert finden. Aber für diesen Zweck hätte man noch ein
Problem, weil die Messung nun effektiv mit Gleichstrom ausgeführt wird.
Das führt in feuchter Umgebung zu Polarisationseffekten und zu größerer
Korrosion. Also muss das Verfahren noch etwas erweitert werden.
Nun muss abwechselnd jeder der beiden Ports einmal an GND geschaltet
werden und einmal an VCC. Außerdem wechselt die Rolle des Eingangs, der
auf einen high-Zustand wartet. Auf die Weise folgen zwei Zeitmessungen
aufeinander. Die Messwerte addieren sich, sodass die Ausgabe nun bis
254 reicht.
void FPPA0 (void)
{
.ADJUST_IC SYSCLK=IHRC/2, IHRC=16MHz, VDD=5.0V;
PAC=255;
PBC = 1;
B2 BIT PB.2;
B3 BIT PB.3;
P2DIR BIT PBC.2
P3DIR BIT PBC.3
BYTE n;
BYTE i;
while (1)
{
n=0;
set1 P3DIR;
set1 P2DIR;
set0 B2;
set0 B3;
i=127;
set0 P2DIR;
set1 B3;
do
{
if (!B2) n++;
} while (--i);
set1 P2DIR;
set0 B2;
set0 B3;
i=127;
set0 P3DIR;
set1 B2;
do
{
if (!B3) n++;
} while (--i);
set1 P3DIR;
set0 B2;
set0 B3;
PA=n;
A=n;
UART_Send();
.delay(1000000);
}
}
Download: Projekt2.zip
Im Endergebnis wird nun mit Wechselstrom gemessen, wie es sich für eine
Feuchtemessung gehört. Die folgende Messung wurde direkt am
Messwiderstand durchgeführt. Dazu ist allerdings eine Potentialtrennung
erforderlich. Der Controller wurde zu diesem Zweck mit Batterien
versorgt.