Sie sind hier MOTRON-BASIC

# MOTRON BASIC-Erweiterung

Inhaltsverzeichnis
1. Motor-Steuerungskonzept

1.1 Übersicht
1.2 Frequenztabelle, Timertabelle

2. Befehlssatzerweiterung

2.1 Befehl PROG

2.2 Befehle INIT xxx
2.2.1 Befehl INIT MOT
2.2.2 Befehl INIT TIM
2.2.3 Befehl INIT FREQ,x,.....
2.2.4 Befehl INIT SIO,x,y
2.2.5. Befehl INIT DISP
2.2.6. Befehl INIT INP,x
2.2.7 Befehl INIT OUT,x

2.3. Befehl CUR x,y

2.4 Befehl CLS

2.5 Befehl DELAY x

2.6 Befehl ADCONV(x,y)

2.7. Befehl DRIVEFREQ x
2.8. Befehl DRIVEABS x,y
2.9. Befehl DRIVEREL x.y

2.10 Befehl BIT xxx <nr {,<nr}
2.10.1 BIT SET <nr{,<nr}
2.10.2 BIT CLR <nr{,<nr}
2.10.3 BIT TST {!}<nr{,<operator{!}<nr}

3 MOBU (MOtron-BUs)

3.1 Resourcen
3.2 Kommunikation
3.2.1 Daten vom Master zum Slave
3.2.2 Daten vom Slave zum Master

3.3. Programmierung mit Bus-Befehlen

4. Zusätzliche CALL-Befehle

4.1. Einsprungadressen Motorsteuerung
4.2. Einsprungadressen Terminal-Modul
4.3. Einsprungadressen System
4.4. Einsprungadressen Allgemein

Näheres zur Hardware finden Sie in der Hardware-Dokumentation

nach oben

1. Motor-Steuerungskonzept

1.1 Übersicht

Für die freie Programmierung durch den Benutzer wird das "Intel-BASIC" zur Verfügung gestellt. Darüber hinaus hat MOTRON für noch mächtigere Funktionen eigene BASIC-Erweiterungen zusätzlich entwickelt. (Siehe Befehlsübersicht in der Short-Reference.) Mit dem BASIC-Interpreter hat man die Möglichkeit, sehr komfortabel eigene Programme zu entwickeln und direkt zu testen. Die meisten Befehle können sowohl im Programmablauf (RUN-Mode), als auch per Kommando (COMMAND-Mode) ausgeführt werden. Das bedeutet: Die Befehle am PC eintippen und die Reaktion der Steuerung beobachten. Nach dem Test können sie im EPROM oder EEPROM gespeichert werden.

Das Konzept der Schrittmotorsteuerung beruht auf einem Regelalgorithmus für die aktuelle Frequenz und einer Frequenztabelle, die das Beschleunigungsverhalten des Motors bestimmt.

Die Frequenzregelung versucht die aktuelle Zielfrequenz des Motors anzufahren, jedoch immer unter der Bedingung, dass die maximale Beschleunigung bei der aktuell dargestellten Frequenz nicht überschritten wird. Falls die Zielfrequenz erreicht ist, wird diese fortlaufend ausgegeben, bis eine neue Zielfrequenz vorgegeben wird.

Auf Grund dieser Regelung gibt es nur drei interne Zustände, in denen sich der Motor längere Zeit befinden kann (im weiteren als stabile Zustände bezeichnet):

- beschleunigen

- konstante Frequenz

- bremsen

Beim Übergang von einem stabilen Zustand in einen anderen, werden teilweise mehrere labile Zustände angenommen. Ein labiler Zustand kann nur für die Dauer eines Schrittes angenommen werden. Anschließend wird sofort auf einen anderen Zustand übergegangen. Diese labilen Zustände haben nur die Funktion, beim Wechsel von einem stabilen Zustand in einen anderen, die Frequenzänderungen des Motors kleiner zu halten, als in der Frequenztabelle vorgegeben (Als Sicherung gegen Schrittverlust werden abrupte Frequenzwechsel vermieden !)

nach oben

1.2 Frequenztabelle, Timertabelle

Sämtliche Motorroutinen bauen auf einer Timertabelle auf, die aus einer Frequenztabelle berechnet wird. Die Frequenztabelle bestimmt das Beschleunigungs- und Bremsverhalten des Motors, abhängig von seiner aktuellen Frequenz. Sie wird im externen Datenspeicher ab Adresse 5000H abgelegt und besteht aus einer Folge von Einzeleinträgen. Jeder Einzeleintrag wiederum besteht aus zwei Bytes (MSB first). Diese zwei Bytes entsprechen einer Frequenz in Hertz (1-65535Hz). Schrittfolgen kleiner 1 Hz können mit Einzelimpulsen bequem in BASIC programmiert werden.

Das Ende der Tabelle wird gekennzeichnet durch einen Eintrag mit der Frequenz 0 (MSB=LSB=0).

Diese Frequenztabelle kann mit dem Befehl INIT FREQ,... intern automatisch berechnet werden. Aus dieser Tabelle wird mit INIT TIM eine Timertabelle berechnet, die ab der Adresse 6100H im externen Datenspeicher abgelegt wird.

nach oben

2. Befehlssatzerweiterung

Es wurde die Möglichkeit des INTEL-BASIC-Interpreters ausgenutzt, eigene Befehle zu definieren. Die Syntax der Befehle ist jeweils in der Überschrift definiert. Am Ende eines Befehls ist meist ein Beispiel angefügt, das die Verwendung nochmals darstellen soll. Es wurden nur die gebräuchlichsten Funktionen als selbständige Befehle definiert. Alle anderen Funktionen stehen über CALL-Aufrufe zur Verfügung (siehe zusätzliche Einsprungadressen). Die Zeilennummern werden nur als #### dargetellt, wenn sie zum Verständnis nötig sind.

2.1 Befehl PROG

Speichern des aktuellen Programms aus dem RAM ins EEPROM.

Dieser Befehl ersetzt den Standard-Intel-BASIC-Befehl 'PROG'. Es können zu dem Befehl keine Optionen (PROG 1, PROG 2,...) mehr angegeben werden.

Das aktuelle im RAM befindliche Programm wird ins EEPROM gebrannt. Es erscheint zuerst die Meldung "programming..."

am Bildschirm. Die Zeilennummern werden am Bildschirm mit ausgegeben, damit der Programmiervorgang visuell verfolgt werden kann. Am Ende erfolgt eine Fehlermeldung, oder die Meldung "Successfull". Bei einer Fehlermeldung ist der Fehler in der zuletzt angezeigten Zeilennummer aufgetreten.

Nach einem Programmiervorgang wird der SOFTWARE-SCHREIB-SCHUTZ des EEPROM aktiviert, d.h. es kann nicht mehr mit einer einfachen Zuweisung (XBY (adr) ...) beschrieben werden. Ein Umprogrammieren ist aber weiterhin möglich, da vor einem erneuten Programmiervorgang der SCHREIBSCHUTZ wieder aufgehoben wird.

nach oben

2.2 Befehle INIT xxx

Unter dem Befehl INIT sind mehrere unabhängige Einzelbefehle zusammengefasst, die normalerweise nur einmalig im Programm benötigt werden.

2.2.1 Befehl INIT MOT

Initialisieren der Motorroutinen

- der Motor wird abrupt gestoppt , der Interrupt gesperrt

- der interne Positionszähler wird auf 0 gesetzt

- das Bit "in Position" wird gesetzt

- das Bit "Motor steht" wird gesetzt

- der Schrittfaktor beim Beschleunigen und Bremsen wird auf 10 gesetzt

Der Befehl muss vor dem ersten Fahrbefehl für den Schrittmotor einmalig ausgeführt werden.

nach oben

2.2.2 Befehl INIT TIM

Umwandeln der aktuellen Frequenztabelle in die intern benötigte Timertabelle.

Sämtliche Motorroutinen setzen auf eine Timertabelle auf. Es sollte vorher eine gültige Frequenztabelle angelegt worden sein (Befehl INIT FREQ...). Die Frequenztabelle wird ab Adresse 5000H im externen RAM erwartet. Die Timertabelle wird ab Adresse 6100H im externen RAM abgelegt.

Beispiel:

`120 INIT MOT`

`130 INIT FREQ,1,200,5000,30 : POP X`

`140 INIT TIM`

nach oben

2.2.3 Befehl INIT FREQ,x,.....

Berechnen einer Frequenztabelle.

Die Frequenztabelle bestimmt, welche Geschwindigkeitsänderungen der Motor bei einer Frequenz maximal ausführen darf (pro Schritt). Es können verschiedene Kurvenformen zugrunde gelegt werden. Die Kurvenform wird durch den ersten Parameter bestimmt. Die Anzahl und Bedeutung der restlichen Parameter hängt von der gewählten Kurvenform ab. Die Ausführung des Befehls kann je nach Umfang einige Sekunden dauern. Auf dem Stack kommt die Anzahl der Einträge zurück.

a. Lineare Beschleunigung

Syntax: INIT FREQ,1,fstart,fmax,acc : POP x

fstart: Startfrequenz in Hertz
fmax: maximale Frequenz in Hertz
acc : Beschleunigung in Hertz pro Schritt
Funktion: f0=fstart
fn=fn-1+acc für n0 ' wiederhole bis fn=fmax

Faustregel:
Anzahl der Rampeneinträge = (max. Frequenz - Startfrequenz) / acc
Notwendige Schrittzahl bis fmax. = ca. 4 x Anzahl der Einträge

b. Lineare Beschleunigung mit abnehmender Beschleunigung

Syntax: INIT FREQ,2,fstart,fmax,acc,dec : POP x

fstart: Startfrequenz

fmax: maximale Frequenz

acc : Startbeschleunigung

dec : Abnahme der Beschleunigung bei jedem Eintrag

Funktion: f0=fstart, b0=acc

fn=fn-1+bn-1

bn=bn-1-dec

if bn<1 then bn=1 ' wiederhole bis fnfmax

c. Lineare Beschleunigung mit flacher abnehmender Beschleunigung

Syntax: INIT FREQ,3,fstart,fmax,acc,dec : POP x

fstart: Startfrequenz
fmax: maximale Frequenz
acc : Startbeschleunigung
dec : Abnahme der Beschleunigung

Funktion: f0=fstart, b0=acc
fn=fn-1+bn-1
fn=fn-1+bn-1
fn=fn-1+bn-1
fn=fn-1+bn-1
fn=fn-1+bn-1
bn=bn-1-dec
if bn<4 then bn=4
wiederhole bis fnfmax

nach oben

2.2.4 Befehl INIT SIO,x,y

Initialisieren der Baudrate einer seriellen Schnittstelle.

(SIO = seriell Input (Output) = serielle Schnittstelle)

Der Parameter x gibt die Schnittstelle an (0 oder 2) . Der Parameter y legt die neue Baudrate fest. Es erfolgt keine Abfrage der Parameter auf Plausibilität. Die Baudrate wird so genau wie möglich eingestellt. Für nähere Angaben siehe Programmiermanual SAB80C517A (serielle Schnittstellen). Schnittstelle 0 arbeitet mit 8 Bit, no Parity, 1 Stopbit (8N1), SIO1 dagegen mit 7 Bit, even Parity, 1 Stopbit (7E1).

0: SIO 0 Serielle Schnittstelle 0

2: SIO 1 Serielle Schnittstelle 1

`2000 INIT SIO,1,9600 ;` initialisiere die SIO 1 mit 9600 Bd

nach oben

2.2.5. Befehl INIT DISP

Initialisieren des Displays.

- Initialisierung des Displays

- Cursor wird eingeschaltet und blinkt

- Display wird gelöscht

Der Befehl muss vor dem erstmaligen Ansprechen des Displays einmal ausgeführt werden.

`2010 INIT DISP` ; initialisiere Display

nach oben

2.2.6. Befehl INIT INP,x

Alle weiteren Eingaben mit INPUT oder GET werden auf den Kanal x umgestellt.

Derzeit sind folgende Kanäle implementiert:

0: SIO 0

1: Tastatur mit 4x4 Matrix

2: SIO 1

3: Tastatur mit 3x7 Matrix

Alle weiteren Kanäle werden automatisch auf Kanal 0 umgeleitet.

Hinweis: Bei Kanal 0 ist ein XON/XOFF-Protokoll implementiert. Der BASIC-Befehl UI0 oder UI1 ist nicht mehr gültig.

`2010 INPUT "Eingabe vom PC (0) oder Tastatur (1)",X
2020 INIT INP,X ; initialisiere die Eingabeform`

Die Variable x stellt jetzt den Eingabekanal dar.

nach oben

2.2.7 Befehl INIT OUT,x

Alle weiteren Ausgaben mit PRINT werden auf den Kanal x umgestellt.

Derzeit sind folgenden Kanäle implementiert:

0: SIO 0

1: Display auf externer Tastatur

2: SIO 1 (Treiber noch nicht implementiert)

Alle weiteren Kanäle werden automatisch auf Kanal 0 umgeleitet.

Hinweis: Bei Kanal 0 ist ein XON/XOFF-Protokoll implementiert.

Beispiel: `1000 INIT OUT,1`

Schalte den Ausgabekanal auf das externe zweizeilige Display um.

Hinweis: Der BASIC-Befehl UO0 oder UO1 ist nicht mehr gültig.

nach oben

2.3. Befehl CUR x,y

Beim aktuellen Ausgabekanal wird der Cursor auf die Zeile x und die Spalte y gesetzt.

Die linke obere Ecke ist die Position 0,0. Der Ausgabekanal muss den Cursor setzen können. Es erfolgt keine Abfrage, ob die Werte x und y innerhalb zulässiger Grenzen liegen.

Beispiel:

`1000 CUR 1,0 : PRINT "Hallo"` ;Setze den Cursor auf die zweite Zeile und die erste Spalte.
nach oben

2.4 Befehl CLS

Der Bildschirm des aktuellen Ausgabekanals wird gelöscht.

Der Ausgabekanal muss den Befehl "Clear Screen" ausführen können.

Beispiel:

`1000 CLS` ;Lösche den Bildschirm.
nach oben

2.5 Befehl DELAY x

Der Befehl hält die Programmausführung für x Sekunden an.

Anschließend wird mit dem nächsten Befehl weitergemacht. Achten Sie darauf, dass vor dem Aufruf des Befehls die interne Zeit gestartet wurde (Befehl CLOCK 1). Ansonsten wartet der Befehl in einer Endlosschleife.

Beispiel:

`10 CLOCK 1
1000 DELAY 1.5`

;Warte 1,5 Sekunden bis mit der folgenden Programmzeile fortgefahren wird.

nach oben

2.6 Befehl ADCONV(x,y)

Lesen eines Analog-Eingangs.

Der Eingabekanal wird in x übergeben. Derzeit werden nur die Adressen 0 - 3 unterstützt.

Der Wert y wird in das Register DAPR geschrieben und bestimmt die interne Referenzspannung. Siehe dazu das Manual SAB 80C517. Falls der Prozessor SAB80C517-A verwendet wird, hat der Wert y keine Bedeutung mehr. Der Wertebereich muss dennoch innerhalb von 0-65535 liegen.

Bei beiden Werten erfolgt keine Abfrage auf Plausibilität.

Der gelesene Wert wird auf dem Argument-Stack zurückgegeben.

- SAB 80C517 : 8 bit 0..255

- SAB 80C517-A : 10 bit 0..1023

Beispiel: `1000 ADCONV(0,0):POP X`

Die Spannung am Analogeingang 0 wird in einen Binärwert umgewandelt. Der Wert wird anschließend als Variable X definiert.
nach oben

2.7. Befehl DRIVEFREQ x

Fahre mit der konstanten Frequenz x.

Der Motor wird von der aktuellen Frequenz auf die neue Sollfrequenz x beschleunigt (oder gebremst). Es wird entsprechend der initialisierten Frequenzrampe beschleunigt (oder gebremst). Es darf ein Richtungswechsel des Motors erfolgen.

Sonderfunktion: Der Wert x = 0 stoppt den Motor.

Hinweis: Der Wert x kann sowohl positiv als auch negativ sein. Bei positiven Werten wird vorwärts und bei negativen rückwärts gefahren.

Beispiel: `10 DRIVEFREQ 3000`

Beschleunige den Motor auf 3000Hz in positiver Richtung.

Achtung: Drivebefehl mit 1 Schritt ergibt Fehler

nach oben

2.8. Befehl DRIVEABS x,y

Positioniere den Motor auf eine absolute Position.

Der Wert x enthält die absolute Position. Der Wert y bestimmt, mit welcher maximalen Frequenz gefahren wird. Die Drehrichtung des Motors wird selbständig ermittelt. Der Motor sollte aber nur erneut gestartet werden, nachdem die vorherige Fahrt beendet wurde. Ein Positioniervorgang kann mit einem DRIVEFREQ-Befehl abgebrochen werden (Bit abfragen).

X kann positiv oder negativ sein. Die Frequenz y muss positiv sein.

Beispiel:

`1000 DRIVEABS -1050,FMAX ' fahre zu Pos. 1050 mit fmax
1010 BITTST 136 : GOTO 1010 ' warte, bis Motor steht`
nach oben

2.9. Befehl DRIVEREL x.y

Verfahre den Motor relativ von der derzeitigen Position zu einer neuen.

Der Abstand zwischen aktueller und neuer Position wird in x festgelegt. Die Drehrichtung wird aus dem Vorzeichen von x erkannt. Die maximale Verfahrfrequenz wird in y übergeben. Der Abstand x kann positiv oder negativ sein. Die Frequenz y muss positiv sein.

Beispiel:

`1000 DRIVEREL +400,120 'Fahre mit der Frequenz 120Hz 400 Schritte vorwärts.`
nach oben

2.10 Befehl BIT xxx <nr {,<nr}

Der Befehl dient zum Manipulieren von Ausgängen, Systembits, etc. Die Bitnummer kann als beliebiger numerischer BASIC-Ausdruck angegeben werden.

Bitnummern bei MiniMaster:

0-7 TTL-Ausgänge 0-7 über Pinreihe X1
0-7 TTL-Eingänge 0-7 über Pinreihe X1
8-15 als Ein- oder Ausgänge definierbar über Pinreihe X2
128-135 Eingänge DIP-Switch

2.10.1 BIT SET <nr{,<nr}

Die übergebenen Bits (Ausgänge) werden gesetzt.

Es können mehrere Bits mit einem Befehl gesetzt werden, die Bitnummern werden durch Kommata getrennt.

Beispiel: `1000 BIT SET 3,X,12`

Setze die Ausgänge 3 und 12, sowie den Ausgang der durch die Variable X gekennzeichnet ist.

2.10.2 BIT CLR <nr{,<nr}

Die übergebenen Bits (Ausgänge) werden gelöscht.

Es können mehrere Bits mit einem Befehl gelöscht werden, die Bitnummern werden durch Kommata getrennt.

Beispiel: `1000 BIT CLR 3,X,12`

Lösche die Ausgänge 3 und 12, sowie den Ausgang, der durch die Variable X gekennzeichnet ist.

2.10.3 BIT TST {!}<nr{,<operator{!}<nr}

Abfragen (Testen) von Eingängen oder internen Statusbits.

Wenn der angegebene Ausdruck wahr ist, wird in derselben Zeile weitergemacht, ansonsten in der darauffolgenden Zeile. Jedes Bit kann vor der Abfrage noch mit einem Ausrufezeichen invertiert werden.

Als Operatoren sind zulässig:

+ (UND-Verknüpfung) * (ODER-Verknüpfung)

Die Verknüpfungen werden von links nach rechts abgearbeitet. Eine Klammerung ist nicht zulässig.

Beispiel: `1000 BIT TST 4,*0:GOSUB nnnn`

Wenn Eingang 4 oder Eingang 0 gesetzt sind, wird ein Unterprogramm bei Zeile nnnn aufgerufen. Ansonsten wird in der folgenden Programmzeile fortgefahren.

weiteres Beispiel:

`1500 BIT TST 22,+23:GOTO nnnn
1510 PRINT "Endschalter aktiv"`

Wenn linker oder rechter Endschalter low (=aktiv), wird Zeile 1510 ausgeführt, sonst weiter bei nnnn.
nach oben

3 MOBU (MOtron-BUs)

3.1 Resourcen

Die MOBU-Schnittstelle belegt den Timer 2 als Time-Out-Überwachung, die serielle Schnittstelle 2 wird zur Kommunikation verwendet. Intern werden im Prozessor 3 Bytes im Datenspeicher benötigt. Extern werden im RAM ab Adresse 6600H ca. 16 Bytes und ab Adresse 6500H ca. 16 Bytes verwendet.

Der gesamte Programmcode ist im externen Programmspeicher ab Adresse 2C00H - 2FFFH abgelegt. Dazu kommen noch die Einsprungadressen der Interrupts für SIO1 und Timer2.

3.2 Kommunikation

Die Kommunikation mit einem Slave wird immer vom Master eingeleitet. Es existieren zwei unterschiedliche Arten der Datenübertragung:

3.2.1 Daten vom Master zum Slave

Der Master möchte Daten zu einem Slave übertragen. Dazu sendet er das Start-Byte, die Daten-Bytes und als Abschluss die Check-Summe.

3.2.2 Daten vom Slave zum Master

Der Slave antwortet bei korrektem Empfang mit ACK.

nach oben

3.3. Programmierung mit Bus-Befehlen:

adr=Adressse des Slaves 1 ... 15,

`CALL 2C18H,<adr>` | `Lese Status vom Slave`
`POP E` | `Rückgabe E = Fehlercode auf dem Stack.`
`IF E=0 THEN POP <status` | `Wenn kein Fehler, dann 16-Bit Status auf dem Stack`
`CALL 2C1BH,<adr` | `Lese Daten vom Slave`
`POP E` | `Rückgabe E = Fehlercode auf dem Stack.`
`IF E=0 THEN POP <status` | `Wenn kein Fehler, dann 32-Bit Daten auf dem Stack`
`CALL 2C1EH,<adr,<status` | `Sende Status zum Slave STATUS = 16-Bit-Statuswort`
`POP E` | `Rückgabe E = Fehlercode auf dem Stack`
`` | ``
`CALL 2C21H,<adr,<MSW,<LSW` | `Sende Daten zum Slave , MSW = Obere 16-Bit Daten, LSW = Untere 16-Bit Daten`
`POP E` | `Rückgabe E = Fehlercode auf dem Stack`
`` | ``
`CALL 2C24H,<adr` | `Lese Daten vom Slave`
`POP E` | `Rückgabe E = Fehlercode auf dem Stack.`
`IF E=0 THEN POP <status` | `Wenn kein Fehler, dann 2 x 16-Bit Daten auf dem Stack` ``
`CALL 2C27H,<adr` | `Lese Daten vom Slave`
`POP E` | `Rückgabe E = Fehlercode auf dem Stack.`
`IF E=0 THEN POP <status` | `Wenn kein Fehler, dann Daten im Zweierkompliment auf dem Stack`
`` | ``

Fehlermeldungen:

0 : Kein Fehler

1 : Time-Out, keine Antwort vom Slave innerhalb der zulässigen Zeit. (Falsche Adresse, Busverbindung fehlerhaft, Kommunikationsfehler)

2 : Fehler Checksumme bei der Antwort

nach oben

4. Zusätzliche CALL-Befehle

Hier sind alle Einsprungmöglichkeiten in die Softwareerweiterung angegeben, unabhängig davon, ob der Programmierer diese in BASIC benutzen kann oder nicht. Einige Routinen können nur intern in Assembler aufgerufen werden, da Übergabe- oder Rückgabeparameter in Registern erwartet werden.

Aus BASIC werden sie mit CALL <Adresse> aufgerufen. Sie heißen Einsprungadressen, weil direkt auf die Adresse im Assembler-EPROM gesprungen wird.

4.1. Einsprungadressen Motorsteuerung

Beispiel: CALL 3009H ' der Motor macht einen Einzelschritt vorwärts.

3000H Arithmetik - wird nur intern benötigt.
3003H Motorinitialisierung:

- die aktuelle Position wird auf 0 gesetzt
- die aktuelle Richtung wird auf vorwärts gesetzt
- der Taktausgang wird auf LOW gesetzt
- das Bit "in Position" wird gelöscht
- das Bit "Motor steht" wird gesetzt
- der Motorinterrupt wird gesperrt

3006H einzelner Taktimpuls, Richtungsausgang und Positionszähler werden nicht geändert.

3009H Einzelschritt vorwärts, Positionszähler wird um 1 inkrementiert.

300CH Einzelschritt rückwärts, Positionszähler wird um 1 dekrementiert.

300FH Frequenztabelle berechnen, Timertabelle anlegen .

3012H Motorinterrupt !! nur intern !!

3015H Endschalter Interrupt !! nur intern !!

3018H Positionszähler lesen, die aktuelle Position wird auf den Stack gelegt.

301BH Positionszähler setzen, die neue Position muss auf dem Stack übergeben werden.

301EH setze neue Motorsollfrequenz, die Frequenz muss als relativer Offset in die Timertabelle auf dem Stack übergeben werden.

3021H setze neue Frequenz, ( Befehl DRIVEFREQ).

3024H fahre absolut ( Befehl DRIVEABS).

3027H wandle eine Frequenztabelle in eine Timertabelle um. Die Adresse der Frequenztabelle muss auf dem Stack übergeben werden.

302AH Umrechnung Frequenzwert in Timerwert !! nur intern !!

302DH Umrechnung Frequenzwert in Timerwert und abspeichern in Timertabelle !!nur intern!!

3030H Initialisierung des externen UP/DOWN-Counters:

- Counter wird auf 0 gesetzt,
- Interrupt wird aktiviert.

3033H Lesen des externen UP/DOWN-Counters, der Wert wird auf den Stack gelegt. Der Counter umfasst nur 16 bit, die interne Darstellung ist Zweierkomplement.

3036H Lesen der aktuell berechneten Differenz zwischen Ist- und Zielposition. Nur gültig, wenn ein absoluter Fahrbefehl aktiv ist. Die Differenz wird auf dem Stack zurückgegeben.

3039H Lesen der aktuellen Zielposition. Nur gültig, wenn ein absoluter Fahrbefehl aktiv ist. Die Zielposition wird auf dem Stack zurückgegeben.

303CH Berechnen einer Frequenztabelle, (Befehl INIT FREQ,...).

303FH Frequenztabelle linear berechnen.

3042H Frequenztabelle linear mit reduziertem Offset berechnen.

3045H Umrechnen einer Frequenztabelle in eine Timertabelle, (Befehl INIT TIMER). Benutzt Einsprung 3027H.

3048H Anzeige der internen Frequenztabelle ab Adresse 6000H.

304BH Anzeige des aktuellen Motorstatus.

304EH fahre relativ (DRIVEREL).

Hinweis: Die im folgenden aufgeführten Signale haben nur dann eine Auswirkung, wenn die Leistungskarte entsprechend verdrahtet ist.

3051H aktiviere RESET-Signal für Leistungskarte.

3054H deaktiviere RESET-Signal für Leistungskarte.

3057H aktiviere BOOST-Signal für Leistungskarte.

305AH deaktiviere BOOST-Signal für Leistungskarte.

305DH aktiviere ENTREGEN-Signal für Leistungskarte.

3060H deaktiviere ENTREGEN-Signal für Leistungskarte.

3063H aktiviere VOLLSCHRITT-Signal für Leistungskarte.

3066H deaktiviere VOLLSCHRITT-Signal für Leistungskarte.

nach oben

4.2. Einsprungadressen Terminal-Modull

Beispiel: CALL 4809H 'lösche den Bildschirm

4800H Schreiben eines Bytes auf einen Ausgabekanal.

4803H Lesen eines Bytes von einem Eingabekanal.

4806H Lesen des Status eines Eingabekanals.

4809H Clear-Screen (Befehl CLS).

480CH Positioniere den Cursor (Befehl CUR).

480FH Setze Eingabekanal (Befehl INIT INP).

4812H Setze Ausgabekanal (Befehl INIT OUT).

4815H Lese die aktuell gedrückte Taste, Tastencode wird im ACCU zurückgegeben.

4818H Lese die aktuell gedrückte Taste, Tastencode wird auf dem Stack zurückgegeben. Wenn der aktuelle Eingabekanal das externe Keyboard ist (Kanal 1 oder 3), liefert diese Funktion den aktuellen Tastencode auf den Stack zurück, 0 = keine Taste. Im Gegensatz zur BASIC-Funktion GET wird hier nicht gewartet, bis die Taste wieder losgelassen wurde, bevor ein neuer Tastendruck als gültig erkannt wird. Abfrage von Dauertaste!

481BH Schreibe ein Byte in das Datenregister des Displays, Wert wird auf dem Stack übergeben.

481EH Schreibe ein Byte in das Controllregister des Displays, Wert wird auf dem Stack übergeben.

4821H Schreibe ein Byte in das Cursor-Adressregister des Displays, Wert wird auf dem Stack übergeben.

nach oben

4.3. Einsprungadressen System

Die Einsprungadressen 5500H- 5544H sind nur für Assemblerunterprogramme zuständig.

Beispiel: CALL 554BH ' ein Byte wird im EEPROM gespeichert

5545H Hochladen des aktuellen BASIC-Programms im RAM über die Schnittstelle. Das Programm wird dabei im Format INTEL-HEX übergeben. Dieses Format besteht aus einer Folge von Zeilen, die nur ASCII-Zeichen enthalten, und mit einem CR abgeschlossen werden. Jedes Byte wird dabei in zwei Hexziffern zerlegt. Jede Zeile ist wie folgt aufgebaut:

<:<Länge der Zeile<Adresse im EPROM<Typ<Daten<Checksumme

Als Startkennung kommt ein Doppelpunkt. Die Länge der Zeile (Anzahl der Datenbytes) wird im zweiten Byte übergeben. Die Adresse im EPROM wird in zwei Bytes übergeben. Der Typ ist derzeit immer auf 0 eingestellt.

Die Daten umfassen derzeit immer 16 Bytes. Die Checksumme umfasst ein Byte und bildet das Komplement der Summer aller vorherigen Bytes.

5548H Speichern eines Programms vom RAM ins EEPROM.

Beim MotorMaster muss der Jumper J2 gesteckt sein. Das Programm wird entsprechend der INTEL-BASIC-Konvention ins EEPROM gebrannt. Auf dem Stack kommt eine Fehlervariable zurück.

1 : Timeout, ein Byte konnte innerhalb der vorgegebenen Zeit nicht korrekt programmiert werden

2 : Verify-Error, beim Verifizieren konnte das Byte nicht korrekt gelesen werden

FF: kein Fehler, Programmierung korrekt abgeschlossen

Es werden keine MTOP, und keine AUTOSTART-Optionen programmiert.

554BH Programmieren eines Bytes ins EEPROM.

Auf dem Stack müssen die Adresse und der Wert übergeben werden. Zurück kommt eine Fehlermeldung auf dem Stack. 0= kein Fehler, sonst Programmierfehler.

Beispiel: `PUSH 8000H,34H:CALL 554BH:POP X`

Programmiert die Speicherstelle 8000H im externen Datenspeicher mit dem Wert 34H. Damit wird die AUTOSTART Funktion aktiviert. Während des Programmiervorganges ist die EEPROM-Schreibschutzfunktion kurzzeitig aufgehoben. Danach wird die Schreibschutzfunktion wieder aktiviert .

554EH Ausgabe eines Datenbereiches aus dem externen Daten-RAM über die aktuelle Schnittstelle. Der Bereich wird in 16 Zeilen mit je 16 Spalten ausgegeben. Am Beginn jeder Zeile wird die aktuelle Adresse angezeigt. Die Ausgabe der Daten und der Adressen erfolgt in hexadezimaler Schreibweise. Die Startadresse des Datenbereiches muss auf dem Stack übergeben werden.

5551H identisch 554EH, nur werden die Daten aus dem Programmspeicher (EPROM/EEPROM) geholt.

5A1EH schneller 8 Bit-Zähler auf Eingang E15. Wird beim ersten Aufruf initialisiert und kann dann nicht mehr gestoppt werden. Bei jedem Aufruf wird der Zählerstand auf dem Stack übergeben und der Zähler auf 0 gesetzt. Bei Überlauf bleibt er auf 255 stehen.

nach oben

4.4. Einsprungadressen Allgemein

Beispiel: CALL 410AH ' setze eine LED
oder CALL 5 ' setze eine LED

4100H CALL 0 Setze Port P5, Wert wird auf dem Stack übergeben.

4102H CALL 1 Setze Port P6, Wert wird auf dem Stack übergeben.

4104H CALL 2 Lese Port P5, Wert wird auf dem Stack übergeben.

4106H CALL 3 Lese Port P7, Wert wird auf dem Stack übergeben.

4108H CALL 4 Lese die User-Jumper 0-4, bzw. DIP-Switch. Wert kommt auf dem Stack zurück (Bit 0-4).

410AH CALL 5 Setze die User-LED's . Wert wird auf dem Stack übergeben (Bit 0-1).

410CH CALL 6 Schreibe laufend auf eine Adresse. Die Adresse muss auf dem Stack übergeben werden. Als Daten werden abwechselnd 00H und FFH auf die Adresse geschrieben. Der Befehl führt eine Endlosschleife aus. Er kann nur durch Ausschalten des Systems gestoppt werden.

410EH CALL 7 Lese laufend von einer Adresse. Die Adresse muss auf dem Stack übergeben werden. Der Befehl führt eine Endlosschleife aus. Er kann nur durch Ausschalten des Systems gestoppt werden.

Version | 4.2 und höher
Verfasser | Edmund Burger
Datum | 22.07.98
Telefon | 09135/7388-0
Telefax | 09135/7388-37
| (C) Alle Rechte vorbehalten: MOTRON Steuersysteme GmbH Im Gewerbegebiet 6 91093 Heßdorf Internet: www.motron.de e-mail: motron@t-online.de

Änderungen, die der technischen Weiterentwicklung dienen, behalten wir uns ohne Rücksprache vor.
nach oben