Diplomarbeit
Entstehung
Inhalt
Abkürzungen
Einleitung
Recherche
Konzept
Umgebung
Hardware
Software
Funktionsweise
Zusammenfassung
Anhang
Überblick
MUX-Programm
Dienstroutinen
Datalogic
Mitutoyo
Digitrix
Weiterverarbeitung
Software: Überblick

Zur Übersicht hier erstmal ein Ablaufdiagramm des gesamten Programms:

MUX Hauptprogramm

Abb. 22: Ablaufplan des gesamten Programms

6.4 Reset-Sequenz

Bei einem Reset verzweigt das Programm seine Ausführung an die Adresse, welche in den EPROM-Adressen $FFFE und $FFFF abgelegt ist. Dort liegt aber die Startadresse des EPROM-Programmcodes ($C000), d.h. nach einem Reset beginnt das Programm mit einer vollständig neuen Initialisierung aller Hardware-Baugruppen. Während dieser Initialisierung verzweigt das Terminalprogramm über JSR MUXINIT in die Initialisierungsroutine für die neuen Meßmittelmultiplexermodule.


6.5 Interface-Initialisierung

6.5.1 Initialisierung der Meßdaten-Speicherbereiche

In MUXINIT werden zuerst die Speicherbereiche für Meßdaten und Sendedaten gelöscht. Dies geschieht in einer eigenen Unterroutine, welche innerhalb des MUX-Porgramms von mehreren Stellen über JSR RAMLOE (RAM löschen) angesprungen wird. Der Meßdatenspeicher beinhaltet nach dem Einlesen der Meßdaten die Daten in der Form, wie sie vom Meßmittel empfangen wurden. Der Sendedatenspeicher nimmt die umgewandelten Meßmitteldaten auf, wie sie auf dem Bildschirm angezeigt und zum PC gesendet werden.

Ein CR (ASCII 13) am Anfang des Sendedatenspeichers signalisiert der Anzeigeroutine im Terminalhauptprogramm, welche den Inhalt des Sendespeichers auf dem Bildschirm anzeigt, dass keine gültigen Daten im Sende-RAM stehen. Wenn nun Daten eingelesen wurden, so werden diese vom MUX-Programm mit einem CR am Ende abgeschlossen. Stösst nun die Anzeigeroutine auf ein CR, so beendet sie die Ausgabe auf den Bildschirm und setzt ihrerseits ein CR an den Anfang des Sende-RAMs, so dass bei einem erneuten Durchlauf der Speicherbereich nicht immer wieder angezeigt wird.


6.5.2 Initialisierung der LED-Monitorplatine

Als nächstes versucht das Programm, ein Nullbyte ($00) in das Steuerregister der PIA auf der LED-Monitorplatine (Adresse $5001) zu schreiben. Ist die Platine vorhanden, so wird beim anschliessenden Auslesen der Adresse $5001 ein Nullbyte gelesen, ist die Platine nicht vorhanden, so war das Schreiben des Nullbytes erfolglos und man erhält ein $FF zurück, da nicht belegte Adressen von den Datenbustreibern auf $FF gehalten werden (Wenn Adressen nicht belegt sind, dann ist kein schreibender Teilnehmer am Datenbus, d.h. die internen Pull-up-Widerstände in den Datenbustreibern ziehen die Datenleitungen auf "High"=$FF).

Nachdem so erkannt wurde, ob die LED-Monitorplatine gesteckt ist, wird der Zustand in einem Speicherplatz mit dem Namen MON_DA abgelegt. MON_DA=$00: Monitorplatine nicht gesteckt, MON_DA=$FF: Monitorplatine gesteckt. Vor jedem Ansprechen der Monitorplatine wird anhand dieses Flags geprüft, ob die Platine gesteckt ist. Wenn die Platine gesteckt ist, so wird sie initialisiert, ist sie es nicht, so wird die Initialisierung übersprungen.

Für die Initialisierung werden die Portbits, welche die LEDs ansprechen (Port A) als Ausgänge und die Taster-Portbits (Port B) als Eingänge programmiert. Die Control-Register der beiden Ports werden so programmiert, dass die Interrupt-Eingänge (welche ohnehin nicht verwendet werden) abgeschaltet sind. Zuletzt werden alle LEDs ausgeschaltet, indem an die Adresse $5000 (wo der LED-Port liegt) ein Nullbyte geschrieben wird. Damit ist die Initialisierung der PIA beendet.

Es folgt ein kurzer Programmabschnitt zur Initialisierung des Timers auf der MPC 104, da dieser zur Erkennung von Timeout-Fehlern benutzt wird. Dieser Programmteil wurde aus der alten MUX-Software für den MUX 1080 übernommen, da in der alten Terminalsoftware von dem Timer keinen Gebrauch gemacht wird und er folglich dort auch nicht initialisiert wurde.

6.5.3 Initialisierung der Portbausteine PIA

Da es insgesamt nur 8 mögliche Platinenbasisadressen gibt (Vgl. 5.5), wird einfach eine Schleife durchlaufen, welche nach der selben Methode wie bei der LED-Monitorplatine prüft, ob die entsprechende Platine überhaupt vorhanden (gesteckt) ist. Gestartet wird bei der niedrigsten möglichen Basisadresse von $7000. Wird festgestellt, dass die Platine nicht vorhanden ist, so wird in eine Kodierschaltertabelle, welche 8 Bytes lang ist, ein Nulbyte eingetragen, damit nachfolgende Programmteile sofort erkennen können, dass die betreffende Platine nicht vorhanden ist (Das erste Byte in der Tabelle enthält den Kennwert für die Platine an Adresse $7000, das zweite Byte für die Platine an $7010 usw.). Danach wird direkt auf der nächsten Adresse ($7000 -> $7010 -> $7020...) weitergesucht, bis das Programm die Adresse $7070 geprüft hat, womit die PIA-Initialisierung beendet ist. Stellt das Programm fest, dass eine Platine vorhanden ist, so werden die PIAs dieser Platine initialisiert.

Die PIA-Steuerregister werden für alle vier Ports mit demselben Wert programmiert, mit dem die PIA auf der LED-Monitorplatine programmiert wurde, da die Interrupteingänge der Chips nicht verwendet werden. Durch Programmierung des Bytes $04 werden alle Interrupteigenschaften der PIA's gesperrt. Man kann im Steuerregister die Interrupt-Pins als Ein- oder Ausgang festlegen, man kann die Flankenlage (steigend oder fallend) der triggernden Flanke bestimmen und -am wichtigsten- mit Bit 0 den Interruptausgang freigeben. Durch eine "0" (Bit 0 von $04 ist "0") wird der Interruptausgang gesperrt. Die Bits 6 und 7 zeigen an, ob eine Interruptbedingung gemäss den Einstellungen im Steuerregister an den Interrupteingängen aufgetreten ist. Da für das Meßmittelinterface keine PIA-Interrupts genutzt werden, ist der Inhalt dieser Bits don't care.

Die Datenrichtungsregister, welche die Datenrichtung der einzelnen Portbits definieren, werden entsprechend den Anforderungen porgrammiert. In der Liste in Abschnitt 5.5 (Adressdekodierung) ist hinter jedem Bit beschrieben, ob es sich um einen Ein- oder einen Ausgang handelt. Alle nicht benutzten Portbits werden als Ausgänge programmiert, damit keine Störungen in unbelegte Eingänge einstreuen können.

Nachdem so die PIA's des Interfaces programmiert wurden, werden die LED und der Optokoppler ausgeschaltet, indem an den Adressoffset $2 ein Nullbyte geschrieben wird (an der Basisadresse+2 liegen die LED und der Optokoppler). Durch Programmieren des Bytes $02 an den Adressoffset $0 (die Basisadresse+0: dort liegen die Steuerbits für die Sylvac-Logik) werden die Eingänge des Sylvac- EPLD's und des Schieberegisters gesperrt, durch Löschen des Bytes am Adressoffset $6 werden die 4 Ausgangskanäle abgeschaltet.


6.5.4 Erkennen der Platinenkonfiguration (Softwarecode)

Anschliessend wird das Byte am Adressoffset $4 gelesen (Am Adressoffset $4 liegen die 8 Bits des Software-Code-DIP-Schalters). Es wird dann geprüft, ob der gelesene Softwarecode überhaupt in der Software implementiert ist. Im jetzigen Stadium sind drei Softwarecodes zugelassen: $01 für Mitutoyo-Digimatic, $02 für den Datalogic-Barcodeleser und $03 für die Helios digitrix-Schnittstelle. Wenn nun ein höherer Wert als $03 gelesen wurde, so wird trotzdem ein Nullbyte in die Kodierschaltertabelle eingetragen, um anzuzeigen, dass die Platine nicht angesprochen werden kann, da der eingestellt Softwarecode nicht implementiert ist. Das bedeutet einerseits, dass in dieser Tabelle sofort geprüft werden kann, auf welchen (gültigen) Softwarecode eine bestimmte Platine eingestellt ist, ohne dass man erst umständlich von der Platine den Softwarecode neu lesen muss, und andererseits, dass man eine gesteckte Platine durch Einstellen des Softwarecodes $00 abschalten kann. Steht in der Kodierschalterplatine für eine bestimmte Platine der Wert $00, so gilt sie als nicht vorhanden und wird nicht angesprochen.

Nachdem so alle vorhandenen PIAs initialisiert wurden, wird geprüft, ob in der Kodierschaltertabelle mindestens ein Wert <>$00 steht. Ist dies nicht der Fall, so ist entweder überhaupt keine Platine gesteckt, oder alle gesteckten sind entweder abgeschaltet (Softwarecode-DIP-Schalter auf $00) oder auf einen ungültigen Softwarecode eingestellt, so dass keine Platine zum Einlesen von Daten angesprochen werden kann. Da dann kein Arbeiten des Gerätes möglich ist, wird der Fehler durch Aufleuchten jeder zweiten LED an der LED-Monitorplatine angezeigt (sofern sie vorhanden ist) und das Programm kreist dann in einer Endlosschleife, so dass es nur durch einen erneuten Reset wieder gestartet werden kann. Vorher sollte dann mindestens eine Platine gesteckt werden und auf einen gültigen Softwarecode programmiert werden. Wenn das Programm mindestens eine korrekt eingestellte Platine gefunden hat, ist die PIA-Initialisierung beendet. Anschliessend erfolgt die ...

6.5.5 Auswahl der aktuellen Platine.

Das Programm kreist nun in einer Schleife, die nur durch Druck auf einen Platinen-Auswahl-Taster verlassen werden kann. Solange kein Auswahltaster gedrückt wird, ist das Interfacemodul, mit dem gearbeitet werden soll, nicht definiert. Es wird bei allen gesteckten und korrekt initialisierten Platinen (Wert in der Kodierschaltertabelle <>$00) das Tasterbit abgefragt. Ist es ="1", so wurde der betreffende Taster nicht gedrückt, ist es ="0", so wird der Taster gerade gedrückt und die aktuelle Platine ist gefunden.

Wird dies festgestellt, so wird die Basisadresse der ermittelten Platine in eine feste Speicherstelle mit dem Label PLATADR eingetragen; der eingestellte Softcode wird in einem Speicherplatz mit dem Namen SFTCODE abgelegt, so dass man sich später immer wieder darauf beziehen kann. Zuletzt wird die an der Frontplatte des Interfacemoduls angebrachte LED eingeschaltet, damit der Bediener sieht, dass die Auswahl des Interface-Moduls erfolgreich war und das Einlesen von Meßdaten beginnen kann.



6.5.6 Initialisierung der RS232 - V.24 - Schnittstelle (ACIA)

Die Initialisierung der ACIA erfolgt in der jeweiligen Meßmittelroutine, da die Betriebsparameter der Schnittstelle (Baudrate, Parity, Anzahl der Stoppbits, etc.) von Meßmittel zu Meßmittel unterschiedlich sind. In der generellen Interface-Initialisierung erfolgt lediglich ein sogenannter programmed Reset der ACIA, bei der ein beliebiger Wert in die Adresse mit dem Adressoffset $9 geschrieben wird. Diese Adresse wird normalerweise von dem Statusregister der ACIA belegt, welches nur gelesen werden darf. Wenn man einen beliebigen Wert in diese Adresse schreibt, so wird ein programmed Reset der ACIA ausgelöst.

Zusammenfassend das Ablaufdiagramm der Interface-Initialisierung:

Initialisierung


Abb. 23: Ablaufdiagramm zur Interfaceinitialisierung

© 2001 Marcel Sieling, http://www.powerslider.de
   Ich freue mich immer über nette EMails, die ich gerne beantworte.