Poor Man’s CompuLab        

von Ralf Beesner                
Elektronik-Labor   Projekte   AVR 



Beim Herumstöbern auf  http://www.elexs.de hatte ich neulich den Beitrag über das AD210  http://www.elexs.de/AD210.html in Verbindung mit CompactDefinition http://www.elexs.de/AD210Compact.html gefunden (die neueste Version lässt sich unter http://www.hjberndt.de/soft/CompactDefinition 1.75.zip herunterladen).

Da ich die zappelnden Messinstrumente mal sehen wollte, habe ich das AD210 in Bascom re-engineert und mit CompactDefinition herumgespielt. Das Verhalten und der Befehlssatz des AD210 sind so ausführlich beschrieben, dass man es recht einfach nachbauen und in Bascom nachprogrammieren kann (das Programm ist recht kurz und belegt kompiliert nur 648 Bytes).

Das AD210 arbeitet mit 3,3V, wahlweise mit interner oder externer Referenz (1,1V oder AVCC/3,3V) - auf diese Weise wird der Messbereich umgeschaltet - und eingangsseitigen Spannungsteilern von etwa 9:1. Es kann die Analogwerte 8 oder 10 Bit breit auflösen. CompactDefinition nutzt allerdings nur den 10V-Bereich und die 8-Bit-Auflösung des AD210.

Beim weiteren Stöbern fand ich H.J. Berndts TurboCompact , das ich aus zwei Gründen netter fand:
 - es zeigt nur 2 statt 4 Analoginstrumente an
 - es funktioniert auch unter Linux (mit dem Windows-Emulator Wine), während CompactDefinition unter Linux die seriellen Schnittstellen nicht findet und in den Simulationsmodus zurückfällt

Jedoch kennt TurboCompact das AD210 nicht. Um TurboCompact zu nutzen, musste ich das CompuLab von AK Modulbus re-engineeren, allerdings nur so weit, dass die zwei Analoginstrumente aussteuerbar sind und mit den Kippschalterchen unter dem rechten Instrument PWM erzeugt wird. Das resultierende Bascom-Programm ist noch kürzer (416 Bytes kompilierter Code).

Da die Instrumente max. 5V anzeigen, hat sich die Hardware auch vom AD210 entfernt und vereinfacht. Das PMC (Poor Man’s Compulab) ist nur noch die etwas abgespeckte LP-Mikrocontroller-Hardware mit einigen Schutzwiderständen bzw. Pulldown-Widerständen.


Hardware

Da die Analoginstrumente von TurboCompact einen Messbereich von 5V anzeigen, war es am einfachsten, das PMC auf 5V Betriebsspannung auszulegen und statt der Eingangsspannungsteiler lediglich 470k-Lastwiderstände und 100k-Schutzwiderstände für die Analogeingänge vorzusehen.



Die Signale liegen auf Schraubklemmen, die Belegung entspricht dem AD210. Mit jeweils ein oder zwei extern in Reihe geschalteten 470k-Vorwiderständen kann man recht einfach den Messbereich auf 10V oder 15V erweitern.



Die Beschaltung der seriellen Schnittstelle entspricht der LP-Mikrocontroller-Hardware, jedoch fehlt die ISP-Programmiermöglichkeit (der Reset-Eingang des ATtiny ist fest auf High gelegt, der DTR-Anschluss ist nicht mit PB0 verbunden und die Brücke zwischen den Pins 8 und 2 der DSUB-Buchse fehlt).

Der Stiftabstand von DSUB-9-Steckverbindern liegt leider nicht im 2,54mm-Raster. Es gibt jedoch zwei Bauformen der Buchsen für Platinenmontage. Wenn man statt der geschlossenen die offene Bauform verwendet, kann man die Stifte so zurechtbiegen, dass sie ins 2,54mm-Raster passen.  Auf der Platinenunterseite ist eine isolierte Drahtbrücke erforderlich, die als dünne blaue Linie dargestellt ist (von Pin 7 der DSUB-Buchse an die Diode D2).


Software

Der ATtiny muss mit 9,6 MHz Takt arbeiten, kann aber auf 1,2 MHz Takt gefust bleiben, denn die Software schaltet als erstes den Takt auf 9,6 MHz hoch . Sie deaktiviert dann die nicht benötigten Digitaleingänge (die analogen Eingangspannungen treiben sonst den Stromverbrauch hoch, wenn sie ca. 1/2 VCC hoch sind). Danach werden ADC, SoftUART und Timer0 konfiguriert und PB0 als Ausgang gesetzt.

In der Hauptschleife wird auf eingehende Befehlsbytes gewartet und die zugehörige Aktion ausgeführt. Nur die folgenden CompuLab-Befehle werden behandelt:
 - 01: CompuLab-Kennung (201) zurücksenden
 - 58: AD-Wert Kanal B mit 8 Bit Auflösung zurücksenden
 - 60: AD-Wert Kanal A mit 8 Bit Auflösung zurücksenden
 - 81: das darauf folgende Byte in das PWM-Register des Timers schreiben
 - 211: Zustand des PWM-Registers auslesen und zurücksenden

Mit dem Befehlsbyte 211 fragt TurboCompact zyklisch ab, ob das CompuLab noch "lebt". Beim CompuLab wird auf den Befehl 211 der Zustand von 8 Digitaleingängen übermittelt, hier beim PMC wird der Wert des PWM-Registers zurückgesandt, damit TurboCompact etwas anzuzeigen hat (TurboCompact stellt das Bitmuster auf den 7-Segment-Ziffern und den 8 LEDs unter dem linken Messinstrument dar).
 
Die Antwort auf den Befehl 211 scheint zeitkritisch zu sein: Mit 1,2 MHz Takt antwortete der ATtiny offenbar zu langsam, denn die Statusmeldung Hardware: CompuLab an ComX. blitzte nur kurz auf und das Programm fiel in den Simulationsmodus zurück.


Betrieb

Da man heute üblicherweise USB-Seriell-Wandler verwendet, kann unter Windows der zugewiesene Com-Port ein Problem sein, denn ältere Software kann nur nur die Com-Ports 1 - 4 bzw. 1 - 20 ansprechen. H.J.Berndt beschreibt auf seiner Website unter http://www.hjberndt.de/soft/indexcom.html, wie man dem USB-Seriell-Wandler eine niedrigere Nummer zuweist.

Unter Linux erscheint der erste gefundene USB-Wandler als /dev/ttyUSB0 , der zweite als /dev/ttyUSB1 usw. Damit Wine die seriellen Schnittstellen findet, müssen sie eventuell händisch im Homeordner angelegt werden:

cd ~/.wine/dosdevices
ln -s /dev/ttyS0 com1      # echte erste serielle Schnittstelle
                           # (sofern noch vorhanden)
ln -s /dev/ttyUSB0 com2    # erster USB-Seriell-Wandler

Nachtrag:

Das PMC lässt sich unter Windows auch prima mit CompactDefinition vewenden. Dann hat man sogar die Möglichkeit, über *.def-Dateien, die man mit Rechtsklick auf das jeweilige Analoginstrument lädt, die Skala der Instrumente auszutauschen, falls man das PMC mit einem über externe Vorwiderstände erweiterten Spannungsmessbereich einsetzt. Man kann sogar nichtlineare Sensoren verwenden und die Skala über eine def-Datei linearisieren.


Download: pmc-soft.zip

$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 8
$swstack = 8
$framesize = 8
'Baud = 9600

Clkpr = 128 ' Taktumschaltung vorbereiten
Clkpr = 0 ' Takt auf 9,6 MHz setzen
Clkpr = 0 ' zur Sicherheit wiederholen


Didr0 = &B00011001 ' nicht benoetigte Digitaleingaenge abschalten

Config Adc = Single , Prescaler = Auto

Open "comb.1:19200,8,n,1,INVERTED" For Output As #1
Open "comb.2:19200,8,n,1,INVERTED" For Input As #2

Config Timer0 = Pwm , Prescale = 1 , Compare A Pwm = Clear Up


Ddrb.0 = 1

Dim Ana As Word
Dim Pwm As Byte
Dim Command As Byte
Dim N As Byte
Dim Adcnr As Byte

Do

Get #2 , Command

Select Case Command

' ADMUX.6: 1: Ref VCC 0: Ref 1,1V
' ADMUX.1: 1
' ADMUX.0: 0: ADC2/PB4 1: ADC3/PB3
Case 1 : Put #1 , 201
Case 58 : Admux = &B00000010 ' Ref=VCC ADC2 Eingang B
Gosub Achtbit
Case 60 : Admux = &B00000011 ' Ref=VCC ADC3 Eingang A
Gosub Achtbit
Case 81 : Get #2 , Pwm ' beim CompuLab setzt der Befehl 8 Digitalausgänge
Pwm0a = Pwm
Case 211 : Put #1 , Pwm0a ' beim CompuLab fragt 211 die 8 Digitaleingänge ab

Case Else : Nop

End Select

Loop

Achtbit:

If Admux.0 = 0 Then
Adcnr = 2
Else
Adcnr = 3
End If

Start Adc
Ana = Getadc(adcnr)
Shift Ana , Right , 2
Put #1 , Ana

Return


End



Elektronik-Labor   Projekte   AVR