Poor Man’s CompuLab
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