HET 20 (4)
Montag, Juni 19th, 2006An der seriellen Schnittstelle des HET 20 vermittelt eine Schaltung aus zwei Transistoren zwischen den TTL-Pegeln des Microcontrollers und den Spannungspegeln der RS-232-Schnittstelle am PC. Auf einen Pegelumsetzer wie den MAX232 wird verzichtet, denn dieser ist nicht ganz billig, benötigt zusätzlich noch vier Elkos für seine Ladungspumpe, und es würde nur ein Viertel (T1) des Bausteins für die unidirektionale Übertragung vom HET 20 zum PC genutzt werden können. Zudem ist die vorliegende Schaltung mit einem Emitterfolger-Ausgang flexibel und kann ausgangsseitig auch mit TTL-Pegel betrieben werden.
Dies ist also keine RS-232-Schnittstelle, sondern schlicht eine serielle Schnittstelle, die zu RS-232 soweit kompatibel ist, dass sie an einer normgerecht beschalteten Gegenstelle funktionieren kann, wenn die Gegenstelle hinsichtlich der erwarteten Spannungspegel nicht eben pingelig ist. Dies ist beim Anschluss an einen Desktop-PC üblicherweise der Fall, nach Hörensagen kann es an Notebooks manchmal Probleme geben. Zu beachten ist auch, dass das Verbindungskabel möglichst kurz gewählt werden sollte.
Die im Schaltplan des HET 20 angegebene Pinbelegung der RJ-12-Westernbuchse stimmt nicht mit der Belegung am Bauteil überein, die ungeradzahligen und geradzahligen Pins sind dort paarweise vertauscht (1-2/3-4/5-6). Bezogen auf die Angaben im Schaltplan kann folgende Verdrahtung zur 9-poligen RS-232-Stiftleiste am PC vorgenommen werden: Pin 1 und Pin 5 des HET 20 auf Pin 5 (GND), Pin 2 des HET 20 auf Pin 3 (RxD) und Pin 3 des HET 20 auf Pin 4 (DTR). Hinweis: Die +12 V am Pin 4 (DTR) des PC liegen erst an, wenn ein Programm auf die COM-Schnittstelle zugreift.
Die Datenübermittlung erfolgt in Form von Datentelegrammen mit einer Größe von minimal 12 Bytes und maximal 22 Bytes in einem Abstand von 500 ms. Jedes Datentelegramm beginnt mit dem Steuerzeichen STX und endet mit dem Steuerzeichen ETX. Dazwischen werden die Werte für Kapazität, Entladestrom, Leerlaufspannung, Lastspannung und Innenwiderstand mit jeweils High-Byte und Low-Byte als 16-Bit-Werte übertragen. Hat eines der Datenbytes den Wert 02h (STX), 03h (ETX) oder 05h (ENQ), dann erfolgt eine Ersetzung durch Voranstellen von ENQ und Übermitteln des Datenbytes addiert mit dem Wert 10h.
Das nachfolgende Perl-Skript zeigt exemplarisch, wie die Daten auf einem Linux-PC mit nur geringem Aufwand empfangen und ausgegeben werden können. Das HET 20 ist in diesem Beispiel an COM1 angeschlossen. Wegen der Plattformabhängigkeit des Moduls Device::SerialPort für den Zugriff auf die serielle Schnittstelle läuft dieses Skript ausnahmsweise nicht unter Win32; dort kann aber mit minimalen Abwandlungen das Modul Win32::SerialPort verwendet werden. Auf spezielle Tweaks habe ich verzichtet, damit die Sache nachvollziehbar bleibt.
#!/usr/bin/perl
use strict;
use Device::SerialPort;
use Time::HiRes qw(sleep);
my $RS232 = Device::SerialPort->new('/dev/ttyS0');
$RS232->baudrate(19200);
$RS232->parity('even');
$RS232->databits(8);
$RS232->stopbits(1);
$RS232->read_char_time(1);
while(1) {
my($Count,$Buffer) = $RS232->read(22);
unless($Count) { sleep(0.05); next; }
my @Data = unpack('C22',$Buffer);
next unless(shift(@Data) == 0x02);
for(my $Ix = 0; $Ix < @Data; $Ix++) {
last if($Data[$Ix] == 0x03);
next if($Data[$Ix] != 0x05);
splice(@Data,$Ix,1); $Data[$Ix] -= 0x10;
}
my $Cap = $Data[0] * 256 + $Data[1];
my $Cur = $Data[2] * 256 + $Data[3];
my $VoN = $Data[4] * 256 + $Data[5];
my $VoL = $Data[6] * 256 + $Data[7];
my $Res = $Data[8] * 256 + $Data[9];
printf("%5i mAh | %5.2f A | %5.2f V | %5.2f V | %5.1f mOhm\n",
$Cap, $Cur/100, $VoN/100, $VoL/100, $Res/10);
}
1;
Siehe auch:
HET 20 (Teil 3)