TPS 4: Sprünge und Verzweigungen

Elektronik-Labor  Projekte   TPS



Bisher gab es nur einen einfachen Rücksprung (Befehl 3), der maximal 15 Adressen zurück reichte. Nun kommt ein absoluter Sprung hinzu. Da das Sprungziel nur mit 4 Bit angegeben werden kann, gibt es einen zusätzlichen Befehl, der die 4-Bit-Seite, also das High-Nibble der Adresse festlegt. Damit hat man den Adressraum 0...255. Das dürfte für die meisten Anwendungen ausreichen.

Zwei Zählschleifen mit den Variablen C und D führen ebenfalls absolute Sprünge aus, wobei zuvor das High-Nibble der Adresse geladen werden kann.

Die bedingten Sprünge lehnen sich an die Skip-Befehle in AVR-Assembler an. Wenn die jeweilige Bedingung wahr ist, wird eine Adresse übersprungen. Dort könnte z.B. ein Sprungbefehl oder ein Unterprogrammaufruf stehen. Als Bedingungen stehen Vergleiche zwischen A und B sowie direkte Bit-Abfragen des Eingangsports zur Verfügung.

Außerdem gibt es noch einen Unterprogramm-Aufruf und den dazu gehörenden Return-Befehl. Es werden zwar mehrere Unterprogramme erlaubt, aber aus einem Unterprogramm darf kein weiteres Unterprogramm aufgerufen werden, weil der Interpreter sich immer nur eine Rücksprungadresse merkt.

8: Adr-high = 0...15
9: Direkter Sprung auf Adr-high, Adr-low (0..15)
10: Zählschleife C-mal Adr-high, Adr-low (0..15)
11: Zählschleife D-mal Adr-high, Adr-low (0..15)
12: Bedingte Sprünge: If (Bedingung 1...11) then Adr = Adr + 1
    (A > B, A > B, A = B, Din.0 = 1, Din.1 = 1, Din.2 = 1, Din.3 = 1, Din.0 = 0, Din.1 = 0,  Din.2 = 0, Din.3 = 0)
13: Unterprogrammaufruf Adr-high, Adr-low (0..15)
14: Return

Damit ist die Programmiersprache erst mal vollständig. Erweiterungen sind aber möglich, denn zwei mögliche Befehle (0 und 15) sind noch nicht definiert. Und einige Befehle wie z.B. der Befehl 12 schöpfen noch nicht den möglichen Umfang ihrer Parameter aus. So könnte z.B. der bedingte Sprungbefehl (12) noch einige weitere Bedingungen bekommen. Ähnliches gilt für die Befehle 5, 6 und 7. Man könnte da noch weitere Rechenschritte, mehr AD-Kanäle und einen zweiten PWM-Ausgang definieren.


Beispiele

'Test: Zählschleife
'Dat = &H45 : Writeeeprom Dat , 0                            'A=5
'Dat = &H52 : Writeeeprom Dat , 1                            'C=A
'Dat = &H11 : Writeeeprom Dat , 2                            'Port=1
'Dat = &H27 : Writeeeprom Dat , 3                            '200 ms
'Dat = &H10 : Writeeeprom Dat , 4                            'Port=0
'Dat = &H27 : Writeeeprom Dat , 5                            '200 ms
'Dat = &HA2 : Writeeeprom Dat , 6                            'C-mal jmp 2
'Dat = &H30 : Writeeeprom Dat , 7                            'Ende


'Test: Unterprogramm
'Dat = &H4F : Writeeeprom Dat , 0                            'A=15
'Dat = &H52 : Writeeeprom Dat , 1                            'C=A
'Dat = &H82 : Writeeeprom Dat , 2                            'Adr 32...
'Dat = &HD0 : Writeeeprom Dat , 3                            'Call 32+0
'Dat = &H80 : Writeeeprom Dat , 4                            'Adr 00...
'Dat = &HA2 : Writeeeprom Dat , 5                            'C-mal jmp 2
'Dat = &H30 : Writeeeprom Dat , 6                            'Ende
'Unterprogramm ab Adresse 32
'Dat = &H11 : Writeeeprom Dat , 32                           'Port=1
'Dat = &H27 : Writeeeprom Dat , 33                           '200 ms
'Dat = &H10 : Writeeeprom Dat , 34                           'Port=0
'Dat = &H27 : Writeeeprom Dat , 35                           '200 ms
'Dat = &H27 : Writeeeprom Dat , 35                           '200 ms
'Dat = &HE0 : Writeeeprom Dat , 36                           'Return


'Test: Verzweigung, Blinken wenn ADC < 7
Dat = &H47 : Writeeeprom Dat , 0                            'A=7
Dat = &H51 : Writeeeprom Dat , 1                            'B=A
Dat = &H69 : Writeeeprom Dat , 2                            'A=ADC
Dat = &H82 : Writeeeprom Dat , 3                            'Adr 32...
Dat = &HC2 : Writeeeprom Dat , 4                            'if A<B then Adr=Adr+1
Dat = &HD0 : Writeeeprom Dat , 5                            'Call 32+0
Dat = &H80 : Writeeeprom Dat , 6                            'Adr 00...
Dat = &H90 : Writeeeprom Dat , 7                            'Jump 00
'Unterprogramm ab Adresse 32
Dat = &H11 : Writeeeprom Dat , 32                           'Port=1
Dat = &H27 : Writeeeprom Dat , 33                           '200 ms
Dat = &H10 : Writeeeprom Dat , 34                           'Port=0
Dat = &H27 : Writeeeprom Dat , 35                           '200 ms
Dat = &H27 : Writeeeprom Dat , 35                           '200 ms
Dat = &HE0 : Writeeeprom Dat , 36                           'Return


Download: TPS4


'--------------------------------------------------------------
' Tasten-programmierbare Steuerung TPS
' Test 4: Sprünge und Verzweigungen
'--------------------------------------------------------------

$regfile = "m168def.dat"
$crystal = 11059200
$hwstack = 32
$swstack = 64
$framesize = 64


Dim Adr As Byte
Dim Eebyte As Byte
Dim Dat As Byte
Dim Kom As Byte
Dim Adrhi As Byte
Dim Adrlo As Byte
Dim Adrret As Byte
Dim Prog As Byte
Dim Dd As Word


Waitms 200

If S2 = 0 Then
Goto Programmieren
Else
Ausfuehren:
Adr = 0
Do
Readeeprom Eebyte , Adr
Adr = Adr + 1
Dat = Eebyte And 15
Kom = Eebyte / 16
...
If Kom = 8 Then
Adrhi = Dat 'Oberes Nibble der Adresse
End If
If Kom = 9 Then
Adr = Adrhi * 16 'Springe absolut 0...255
Adr = Adr + Dat
End If
If Kom = 10 Then
C = C - 1
C = C And 15
If C > 0 Then 'C-mal
Adr = Adrhi * 16 'Springe absolut 0...255
Adr = Adr + Dat
End If

End If
If Kom = 11 Then
D = D - 1
D = D And 15
If D > 0 Then 'D-mal
Adr = Adrhi * 16 'Springe absolut 0...255
Adr = Adr + Dat
End If

End If
If Kom = 12 Then
If Dat = 1 Then
If A > B Then Adr = Adr + 1
End If
If Dat = 2 Then
If A < B Then Adr = Adr + 1
End If
If Dat = 3 Then
If A = B Then Adr = Adr + 1
End If
If Dat = 4 Then
If Pinc.0 = 1 Then Adr = Adr + 1
End If
If Dat = 5 Then
If Pinc.1 = 1 Then Adr = Adr + 1
End If
If Dat = 6 Then
If Pinc.2 = 1 Then Adr = Adr + 1
End If
If Dat = 7 Then
If Pinc.3 = 1 Then Adr = Adr + 1
End If
If Dat = 8 Then
If Pinc.0 = 0 Then Adr = Adr + 1
End If
If Dat = 9 Then
If Pinc.1 = 0 Then Adr = Adr + 1
End If
If Dat = 10 Then
If Pinc.2 = 0 Then Adr = Adr + 1
End If
If Dat = 11 Then
If Pinc.3 = 0 Then Adr = Adr + 1
End If
End If
If Kom = 13 Then
Adrret = Adr
Adr = Adrhi * 16 'Call Unterprogramm absolut 0...255
Adr = Adr + Dat
End If
If Kom = 14 Then
Adr = Adrret 'Return
End If
Loop
End If

zurück
weiter


Elektronik-Labor  Projekte   TPS