Startseite

Der FKG-Roboter

FORPHYS- Mess-Interfaces

Forschendes Lernen im Physik-UR

Würzburger Quantenphysik-Konzept

Grundfakten der Quantenphysik

Materialien Physik-UR

Impressum

Kommentare und Wünsche

© Horst Hübel Würzburg 2005-2013

GLOSSAR zu AVISE 4.3; für ATMEGA32 bzw. Teilmenge für ATMEGA8 / 168

nach W. Schemmert, Fa. CINETIX, Frankfurt

Siehe auch Glossar zu AVISE 4 bei der Fa. Cinetix

.NEU Physikalische Schülerversuche mit PC und Mikroprozessor, 2. Auflage, im Buchhandel erschienen

siehe auch TOKEN-Code-Index

So schön geht AVISE (kurze Programmieranleitung)

TOS = Top of Stack: oberstes Element des Stapelspeichers (Stacks), d.h. das einzige, mit dem direkt gearbeitet werden kann.

.$


."  Sendet die nachfolgende Zeichenfolge bis zum nächsten Leerzeichen an den PC


IP

Schaltet einen bestimmten Port auf Eingang mit zugeschaltetem Pullup-Widerstand: Einlesen von externen digitalen oder analogen Spannungsabfällen ("widerstandsempfindlicher Eingang") an externen Widerständen. Detektion von Schaltzuständen äußerer Transistoren.

Anwendung:

$ C3 IP setzt Port C,3 auf Eingang mit Pull-Up Widerstand


IZ

Schaltet einen bestimmten Port auf Eingang mit abgeschaltetem Pullup-Widerstand: ermöglicht Einlesen von externen digitalen oder analogen Spannungssignalen.

Anwendung:

$ C3 IZ setzt Port C,3 auf hochohmigen Eingang mit abgeschaltetem Pullup-Widerstand.


OL

Schaltet einen bestimmten Port auf Ausgang mit Ausgangssignal LOW.

Anwendung:

C3 OL setzt Port C,3 auf Ausgang Low


OH

Schaltet bestimmten Ausgang auf Ausgang mit Ausgangswert HIGH.

Anwendung:

C3 OH setzt Port C,3 auf Ausgang High


RIO

Liest ein bestimmtes Bit eines Eingangsports und legt ein TRUE- oder FALSE-Flag auf den Stapel je nachdem, ob die Leitung auf  H oder L gesetzt ist.

Anwendung:

C3 RIO liest PIN C,3 als Binärflag ein.


WPORT

Gibt ein Byte über einen bestimmten Port aus, falls dieser vorher auf Ausgang geschaltet wurde. Kann in Verbindung mit WDDR auch genutzt werden um Pullup-Widerstände für einen Teil oder alle Leitungen eines Ports zu- oder abzuschalten.

Anwendung:

FF C WPORT gibt das Byte FF über den Port C aus.

FF C WDDR 1 C WPORT schaltet alle 8 Leitungen des Ports C auf Eingang, für C0 wird der Pullup-Widerstand zugeschaltet, für die übrigen 7 Leitungen abgeschaltet.


WDDR

Schreibt ein Byte in das Datenrichtungsregister (DDR) eines bestimmten Ports und schaltet diesen damit auf Ausgang oder Eingang.

Anwendung:

FF C WDDR schreibt FF in DDRC und schaltet damit alle 8 Leitungen des Ports C auf Eingang.

0  C WDDR schreibt 0 in DDRC und schaltet damit alle 8 Leitungen des Ports C auf Ausgang.

1 C WDDR schaltet die Leitung C0 auf Eingang und alle anderen 7 Leitungen auf Ausgang.


RPIN

Liest ein Byte von einem bestimmten I/O-Port des Mikroprozessors (PINx register) und legt es auf den Stapel.

Anwendung:

$ D RPIN liest ein Byte über Port D ein.


AIN

Misst auf einer der max. 8 Leitungen des AD-Wandler-Ports (bei ATMEGA168 oder ATMEGA8: Port C, bei ATMEGA32: Port A) die anliegende Spannung und legt einen Wert zwischen 0 und 1023 auf den Stapel. Mit & 5000 1023 */ kann dieser in mV umgewandelt werden. (1023 entspricht 5 V. I.a. wird man noch das höchstwertige 2-Byte-Wort mit einem hinzugefügten DROP entfernen können, da es 0 ist (also & 5000 1023 */ DROP liegt das relevante niederwertige 2-Byte-Wort auf den Stapel). Um äußere Spannungen zu messen sollte man die Pullup-Widerstände abschalten, zur Widerstandsmessung (durch den Spannungsabfall am zu messenden Widerstand) sollte der Pullup-Widerstand zugeschaltet werden.

Anwendung:

0 AIN .  misst auf Port C0 bzw. A0 die Spannung und sendet das Ergebnis aus dem Intervall [0;1023] an das Terminal.

Hinweis:  Bei der Gehäuseform des Typs ATMEGA8L-8PI (28-polig DIL)  können die Ports PC0, PC1, ... , PC3 als AD-Wandler mit 10 Bit Auflösung programmiert werden, PC4, PC5 als AD-Wandler mit 8 Bit Auflösung (seit 2005 überholt). Nur bei der Gehäuseform ATMEGA8-16AI  (SMD-Form) gibt es noch die Ports PC6 und PC7 mit je 10 Bit Auflösung. Keine Beschränkung bei ATMEGA32.


CNT0    C0Z

In AVISE 4 sind 2 Abwärts-Zähler (16 Bit) mit zyklischem Verhalten integriert, die im Hintergrund arbeiten. Sie sind interrupt-gesteuert und reagieren auf fallende Flanken am Eingang

INT0 (Port D,3). CNT0 liest den momentanen Zählerwert für INT0 aus.

Der Zähler wird auf 0 zurückgesetzt mit C0Z.

Anwendung:

& CNT0 1000 MS WAIT CNT0 - .  zählt alle fallenden Flanken in 1000 Millisekunden, falls kein UNDERFLOW des Zählers eintritt.


ENC0  (ENCØ)

( -- X )

Ähnlich wie CNTØ,  aber der Zähler wird erhöht oder erniedrigt je nach dem momentanen Pegel eines zweiten Input-Pins:

Zyklisches Overflow- und Underflow -Verhalten. Der Zähler wird mit CØZ zurückgesetzt.

This function is useful together with 2-phase rotary encoders. When used with mechanical encoders, these must be debounced with appropriate external hardware!


CNT1     C1Z

analog CNT0 / C0Z

INT1 (Port D,3). CNT1 liest den momentanen Zählerwert für INT1 aus.


ENC1

( -- X )

Ähnlich wie CNTØ,  aber der Zähler wird erhöht oder erniedrigt je nach dem momentanen Pegel eines zweiten Input-Pins:

Zyklisches Overflow- und Underflow -Verhalten. Der Zähler wird mit C1Z zurückgesetzt.

This function is useful together with 2-phase rotary encoders. When used with mechanical encoders, these must be debounced with appropriate external hardware!


MEM

Gibt 3 Zahlen aus:

S:  noch freier Speicherplatz  in der Symboltabelle / 8 = ungefährer Erwartungswert noch freier Namen, wenn eine mittlere Länge von 5 Zeichen pro Namen angenommen wird

C: Anzahl der noch freien Code-Blocks im Flash

V: Anzahl der noch deklarierbaren Variablen, d.h. freier Platz imParameterspeicher

Durch das Löschen der drei Anwenderfunktionen TT, TT und LOOP und der Variablen V wurde in der Symbol-Tabelle soviel Raum frei gegeben, dass ca. 2 Worte mit je 5 Zeichen mehr definiert werden könnten. Im Flash-Speicher wurden 2 Blöcke frei und im Parameterspeicher Platz für eine Variable.


PWM1

( X -- )

Startet den AVR Timer1 im 8 oder 10 bit PWM-Modus. Das Ausgangssignal - ein Rechteckssignal mit einstellbarem Tastverhältnis - erscheint am Pin OC1A, der prozessorabhängig ist:

PWM1 generation is stopped when any of the commands IP,IZ,OH,IL is applied to the corresponding OC1A output of the microcontroller or when the WAVE command is executed.

Beispiel:

$2080 PWM1

bzw. dezimal

& 8192 128 + PWM1

allgemein, mit Argumenten HiArg und LoArg nach der folgenden Tabelle

HiArg   LoArg   +   PWM1

Resolution, setting of base frequency and output waveform are contained in one single argument:

The HiArg sets PWM resolution and base frequency. The LoArg, i.e. the least 10 or 8 bits set the relative part of the high level phase of the output waveform. With 8 bit resolution, high percentage is LoArg/255, with 10 bit resolution, high percentage is LoArg/1023.

The respective PWM output (CPU dependent) is set as output by 'Avise' firmware.

Once the PWM has started, only a new LoArg has to be entered (i.e. HiArg=0).

The argument has to be composed as follows:

Hi Arg (hex) Hi Arg (dec) Res(Bit) Freq(Hz) @8MHz Freq(Hz) @16MHz Freq(Hz) @18.43MHz Lo Arg (hex) Lo Arg (dec)
1000 4096 8 15686 31373 36141 0..FF 0..255
2000 8192 8 1961 3922 4518 0..FF 0..255
3000 12288 8 245 490 565 0..FF 0..255
4000 16384 8 61 123 141 0..FF 0..255
5000 20480 8 15 31 35 0..FF 0..255
9000 36864 10 3910 7820 9009 0..3FF 0..1023
A000 40960 10 489 978 1126 0..3FF 0..1023
B000 45056 10 61 122 141 0..3FF 0..1023
C000 49152 10 15 30 35 0..3FF 0..1023
D000 53248 10 3.8 7.6 8.8 0..3FF 0..1023


PWM2

( X -- )

Startet den AVR Timer2 im 8 bit PWM-Modus. Das Ausgangssignal - ein Rechteckssignal mit einstellbarem Tastverhältnis - erscheint am Pin OC2, der prozessorabhängig ist:

Beispiel:

$27F PWM2

oder identisch mit Dezimalzahlen

& 512 127 + PWM2

Die allgemeine Form ist

HiArg     LoArg   +    PWM2

mit den Werten HiArg und LoArg nach der Tabelle unten.

Die Einstellung der Grundfrequenz und der Ausgabe-Wellenform sind in einem einzigen Argument enthalten:

Das HiArg stellt die  PWM-Grundfrequenz ein.  Das LoArg, d.h. die niederwertigen 8 Bits, bestimmen den relativen Anteil der Hi-Phase in einer Periode der Ausgabe-Wellenform. Der prozentuale Anteil der Hi-Phase in einer Periode ist LoArg/255.

Der jeweilige Ausgangspin OC2 für das PWM-Signal (prozessorabhängig) wird durch die 'AVISE' Firmware auf Ausgang geschaltet.

Sobald die PWM gestartet ist, kann die Kurvenform verändert werden, indem nur ein neues LoArg eingegeben wird (d.h. HiArg = 0). Abgeschaltet wird die PWM2-Erzeugung , wenn irgendeine der Anweisungen IP, IZ, OH, IL für den entsprechenden OC2-Ausgang angewandt wird.

Das Argument setzt sich folgendermaßen zusammen:

Hi Arg (hex) Hi Arg (dec) Freq(Hz) @8MHz Freq(Hz) @16MHz Freq(Hz) @18.43MHz Lo Arg (hex) Lo Arg (dec)
100 256 15686 31373 36141 0..FF 0..255
200 512 1961 3922 4518 0..FF 0..255
300 786 490 980 1129 0..FF 0..255
400 1024 245 490 565 0..FF 0..255
500 1280 122 245 282 0..FF 0..255
600 1536 61 122 141 0..FF 0..255
700 1792 15 30 35 0..FF 0..255


WAVE

( X -- )   X ist Maß für die Periodendauer. Die Einheit hängt von der Taktfrequenz des Kristalls ab, s. unten.

Sets the total period duration and starts the AVR TIMER1 as frequency generator with a high phase period defined by WAVEHI.

WAVE generation is stopped when any of the commands IP,IZ,OH,IL is applied to the corresponding OC1A output of the microcontroller or when the PWM1 command is executed.

Beispiel:

$ 300 WAVEHI 400 WAVE

bzw. dezimal

& 768 WAVEHI 1024 WAVE

Before starting WAVE, the high phase MUST be set with WAVEHI. When WAVE is already busy, every part can be changed independently. The high phase, however, must not be greater or equal than the total period.

Frequency range is about:

0.5 Hz to 15.625 kHz (@ 8 MHz CPU clock)

1.0 Hz to 31.250 kHz (@ 16 MHz CPU clock)

1.1 Hz to 36.000 kHz (@ 18.432 MHz CPU clock)

The WAVE period can be changed in units of time (per increment/decrement of argument):

in units of about 32 microseconds (@ 8MHz clock)

in units of about 16 microseconds (@ 16MHz clock)

in units of about 13.89 microseconds (@ 18,432MHz clock)

& 768 WAVEHI 1024 WAVE bedeutet also 768 x 16 µS =   12,288 ms   High-Phase bei einer Periodendauer von 1024 x 16 µs = 16,384 ms oder einer Frequenz von 61 Hz

Port OC1A (CPU dependent) is set as output by 'Avise' firmware:


WAVEHI  

( X -- )

legt die Zeitdauer der Hi-Phase von WAVE fest. Die Einheit hängt von der Taktfrequenz des Kristalls ab, s. unten.

in units of about 32 microseconds (@ 8MHz clock)

in units of about 16 microseconds (@ 16MHz clock)

in units of about 13.89 microseconds (@ 18,432MHz clock)


ISTART

Sends the I2C START command on the I2C interface.

The I2C interface is shared with the program EEPROM, which is not necessarily used with Avise4. Because I2C chips have individual device addresses, normally this will not cause conflicts. The I2C bus of 'Avise' operates with 100 kHz clock speed. So it can be used together with all standard I2C equipment, sometimes not at the highest possible speed.

Anwendung:


ISTOP

Sends the I2C STOP command on the I2C interface.

Anwendung:


IACK

Sendet das I2C ACKNOWLEDGE Kommando zum I2C-Interface und legt ein Flag für die Reaktion von SLAVE auf den Stapel.

TRUE=1 is returned, if slave does acknowledge. FALSE=0 is returnded, when acknowledgement fails. User has to decide how to handle FALSE answer.


IMACK

Sendet das I2C ACKNOWLEDGE Kommando zum I2C-Interface und legt ein Flag für die Reaktion von SLAVE auf den Stapel.

TRUE=1 is returned, if slave does acknowledge. FALSE=0 is returnded, when acknowledgement fails. User has to decide how to handle FALSE answer.


ISEND

Sends one byte via the I2C interface without ACK.

Note that this is a send primitive. To perform a real write operation to the I2C interface, a sequence of further commands is necessary. Refer to the I2C protocol of the specific device to be written.


IRECV

Receives one byte through the I2C interface performing the "current read" method without ACK.

Note that this is a receive primitive. According to the I2C protocol, further commands have to be executed previously to ensure correct read address; and further commands may have to be hooked after to close the interface correctly. Refer to the I2C protocol of the specific device to be read.


ACHECK

( X1 addr(X2) DELTA -- T|F )

This operator is used to track analog input states and trigger messages when they are changed.

It is called with 3 arguments where X1 usually is an input value, addr(X2) usually is a variable where the reference value X2 is stored and DELTA is the is the message trigger level.

If ABS(X1-X2) < delta, then false=0 is returned.

If ABS(X1-X2) >= DELTA, then TRUE=1 is returned and X1 is simultaneously stored as new reference at addr(X2).


BCHECK

( X1 addr(X2) -- T|F )

This operator is used to compare data words and trigger messages when they are changed.

It is called with 2 arguments where X1 usually is an input value, addr(X2) usually is a variable where the reference value X2 is stored.

If X1 = X2 then false=0 is returned.

If X1 <> X2, then TRUE=1 is returned and X1 is simultaneously stored as new reference at addr(X2).


RD

Liest ein Datenwort aus dem  SRAM des Mikroprozessors und legt es auf den Stapel. Das könnte

geschehen. Falls Adressen im Bereich der Prozessor-Register angesprochen werden, wird nur 1 Byte gelesen. Ggf. müssen 2-Byte-Worte einzeln gelesen werden

Anwendung:

$ 200 RD liest ein 2-Byte-Wort aus den Speicherzellen 200 und 201.

$ 32  CONST PORTD PORTD RD  .  liest ein Byte aus Port D und sendet es zum Terminal.

$ VAR V1  V1 RD .  liest ein 2-Byte-Wort aus den mit V1 adressierten Zellen.


BREAK

( -- )

Sets a breakpoint into the code of a user programmed function. When the breakpoint is executed, the display of .S is transmitted to the terminal display, then program execution is halted. Program flow will continue, when the TAB byte (0x09) is received via serial interface. By default, breakpoints are generally deactivated. They can be activated (and subsequently deactivated) with the DEBUG command. Deactivated breakpoints are still present in the object code, but need very few runtime oberhead.


DEBUG

( T|F -- )

Calling DEBUG(1) activates the single step debugger. Calling DEBUG(0) deactivates the single step debugger. Then the program is running free with very little runtime overhead.


RB

Liest ein Datenbyte aus dem  SRAM des Mikroprozessors und legt es auf den Stapel. Das könnte

geschehen.

Anwendung:

$ 200 RB liest ein Byte aus dern Speicherzelle  200.

$ 32  CONST PORTD PORTD RB  .  liest ein Byte aus Port D und sendet es zum Terminal.

$ VAR V1  V1 RB .  liest ein Byte aus der mit V1 adressierten Zelle.


SEE <name>

( -- ;name string)

Einfacher Decompiler für Anwender definierte Funktionen. Sendet den Inhalt des Worts <name> an das Terminal. Der compilierte Code wird immer in Postfix-Notation dargestellt wie er in das interne EEPROM eingebrannt ist. Er unterscheidet sich starkt vom Quellcode in Infix-Notation, besonders bei bedingten Sprüngen und Schleifen. SEE ist in keiner Weise komfortabel, aber erlaubt im Problemfall einen direkten Blick auf den Code, wie er zur Laufzeit abgearbeitet wird.

SEE kann nur interaktiv (im Interpretermodus) aufgerufen werden und darf nicht in eine Anwenderfunktion compiliert werden!

Beispiel: (Bildschirmausschnitt)

(Die Variable V2 hatte den Tokencode 060(16) = 96(10). Wo im Wort LOOP V2 aufgerufen wird, erscheint DOLIT 96.


SEETEMP <name>

( -- ;name string)

Same output as SEE, but displays temporarily compiled code from SRAM (until termination of the compiler due to error). Still unresolved branch destinations are filled with zero. Must be called immediately after compilation because this SRAM region may be overwritten.

Beispiel:


WR

Schreibt ein Datenwort in das SRAM des Mikroprozessors. Das könnte

geschehen. Falls Adressen im Bereich der Prozessor-Register angesprochen werden, wird nur 1 Byte geschrieben. Ggf. müssen 2-Byte-Worte durch ein eigenes Wort (z.B. ZL) zerlegt und einzeln in Register geschrieben werden

: ZL DUP FF AND SWAP 8 >>  RET     ( 180 ZL erzeugt den TOS 1 und darunter 80)

Anwendung:

$ FFF0 ZL 49 WR 48 WR schreibt F0 in Register 49 und FF in Register 48. Dagegen

$ 1234 200 WR schreibt 34 in die Speicherzelle 200 und 12 in die Speicherzelle 201.

$ 32  CONST PORTD FF PORTD WR schreibt FF in Port D, d.h. gibt FF über Port D aus.

$ VAR V1  1234 V1 WR schreibt 34 in das niederwertige und 12 in das höherwertige Byte der mit V1 adressierten Zellen.

Beim Schreiben in Register sollte man vorsichtig sein, weil viele von AVISE benutzt werden. Bei Fehlern hilft normalerweise ein Hardware-RESET oder das Wort INIT.


WB

Schreibt ein Datenbyte in das SRAM des Mikroprozessors. Das könnte

geschehen.

Anwendung:

$ FFF0 ZL 49 WB 48 WB schreibt F0 in Register 49 und FF in Register 48. Dagegen

$ 12  200 WB schreibt 12 in die Speicherzelle 200.

$ 32  CONST PORTD FF PORTD WB schreibt FF in Port D, d.h. gibt FF über Port D aus.

$ VAR V1  34 V1 WB schreibt 34 in die mit V1 adressierte Zelle.

Beim Schreiben in Register sollte man vorsichtig sein, weil viele von AVISE benutzt werden. Bei Fehlern hilft normalerweise ein Hardware-RESET oder das Wort INIT.



BSET

Setzt ein bestimmtes Bit  eines bestimmten Datenworts im SRAM des Mikroprozessors. Das könnte

geschehen.

Anwendung: ´

F 200 BSET setzt Bit 15 in einem Datenwort in den Zellen 200 und 201, hier also Bit 7 in der Zelle 201.

$ 32 CONST PORTD

7 PORTD BSET  setzt Bit 7 im Ausgangsport D.


BCLR

Löscht ein bestimmtes Bit eines bestimmten Datenworts im SRAM des Mikroprozessors. Das könnte

geschehen.

Anwendung: ´

F 200 BSET setzt Bit 15 in einem Datenwort in den Zellen 200 und 201, hier also Bit 7 in der Zelle 201.

$ 32 CONST PORTD ( Es wird eine Konstante PORTD definiert und mit $ 32 belegt; Adresse des Ports D)

7 PORTD BSET  setzt Bit 7 im Ausgangsport D.


RBIT  (AVISE4.3: BTST)

Testet ein bestimmtes Bit eines bestimmten Datenworts im SRAM des Mikroprozessors. Das könnte

geschehen.

Anwendung: ´

F 200 RTST testet Bit 15 in einem Datenwort in den Zellen 200 und 201, hier also Bit 7 in der Zelle 201 und legt ein Flag auf den Stapel, je nachdem, ob Bit 15 gesetzt ist oder nicht.

$ 32 CONST PORTD ( Es wird eine Konstante PORTD definiert und mit $ 32 belegt; Adresse des Ports D)

7 PORTD RTST  testet Bit 7 im Ausgangsport D.


DROP

Entfernt den TOS. Neuer TOS wird das darunterliegende Element.

Anwendung:

1 2 DROP .  liefert den neuen TOS 1.


DUP

Dupliziert den momentanen TOS, d.h. der Wert des TOS bleibt erhalten und wird darüber als neuer TOS abgelegt.

Anwendung:

1 2 3 DUP . . .  liefert 3 3 2  


OVER

Kopiert das 2. Datenwort unter dem TOS über den alten TOS und macht es zum neuen TOS.

Anwendung:

1 2 3 OVER . . . . liefert 2 3 2 1, weil der TOS 2 geworden ist, während die übrigen Elemente unverändert blieben.


SWAP

Vertauscht die obersten beiden Elemente des Stapels.

Anwendung:

3 2 SWAP . .  liefert 3 2, weil vorher der TOS 2 war, nachher 3, was zuerst ausgedruckt wird, dann der frühere TOS 2. 


DSWAP ( X1 X2 X3 X4 -- X3 X4 X2 X1 )

Vertauscht die obersten beiden Elemente des Stapels mit den darunterliegenden zweien. Eventuell nützlich für 32-bit-Funktionen.

Anwendung:

6 7 3 2 DSWAP . .  liefert 7 6, weil vorher der TOS 2 war, nachher 7, was zuerst ausgedruckt wird. Zwei weitere Druckbefehle liefern dann 2 3.


ROT

Rotiert die obersten 3 Elemente des Stapels zyklisch.

Anwendung:

1 2 3 ROT . . .  liefert 1 3 2, weil nach ROT die Reihenfolge 2 3 1 auf dem Stapel liegt mit 1 als TOS.


-ROT

Umkehrung von ROT: Bringt den momentanen TOS unter die 2 darunter liegenden Elemente.

Anwendung:

1 2 3 -ROT . . .   liefert 2 1 3, weil der neue TOS 2 ist, darunter 1, darunter 3.


+

Addiert die obersten beiden Elemente des Stapels.

Anwendung:

& 100 45 + . ergibt 145,

$ 7FFF 1 + . ergibt 8000


INK

Erhöht den Wert des TOS um 1.

Anwendung:

45 INK . ergibt 46


-

Subtrahiert den TOS vom darunterliegenden Element.

Anwendung:

& 100 45 - . ergibt 55, aber

& 100 101 - . ergibt -1,

$ 100 101 - . ergibt FFFF


DEK

Erniedrigt den Wert des TOS um 1.

Anwendung:

45 DEK . ergibt 44


ABS

Interpretiert den TOS als vorzeichenbehaftete Zahl und legt stattdessen seinen Absolutbetrag auf den Stack. Falls Bit 15 des TOS gesetzt ist, liefert ABS dessen Zweierkomplement.

Anwendung:

$ F000 ABS .  liefert 1000, weil F000 der Zahl -4096(10) entspricht, deren Betrag 4096(10) = 1000(16)

& -1000 ABS . liefert 1000


CARRY

Testet, ob bei der letzten ausgeführten Operation (+ , INK , +W , - , DEK , -W) ein Übertrag entstanden ist. Im Falle eines Übertrags wird ein TRUE-Flag (= 1) auf den Stapel gelegt, andernfalls ein FALSE-Flag (0). Kann hilfreich sein bei der Konstruktion einer 32-Bit-Arithmetik.

Anwendung:

Addition:
AT LOWORD := LOWORD + 34980 ;
AT HIWORD := HIWORD + CARRY ;

Subtraktion:
AT LOWORD := LOWORD - 34980 ;
AT HIWORD := HIWORD - CARRY ;


<<

Schiebt die Bits des TOS um eine festgelegte Zahl von Schritten nach links. "Schieben" heißt dabei, dass der Übertrag links (die links herausfallenden Bits) verloren gehen; rechts werden Nullen zugeführt.

Anwendung:

&  129 1 <<  . liefert 258, weil alle Bits um 1 Stelle nach links verschoben werden. [129(10) = 81(16) = 0000 0000 1000 0001(2). Beim Schieben (oder bei der Rotation) nach links entsteht 0000 0001 0000 0010(2) = 258(10)]

& 129 8 << . liefert -32512, weil alle Bits um 8 Stellen nach links verschoben werden. [129(10) = 81(16) = 0000 0000 1000 0001(2). Beim Schieben (oder bei der Rotation) nach links um 8 Stellen entsteht 1000 0001 0000 0000(2) = 8100(16) = -32512(10)]

$ F001 8 << . liefert 0, weil alle Bits um 8 Stellen nach links verschoben werden. [F001(16) = 1111 0000 0000 0001(2). Beim Schieben nach links um 8 Stellen entsteht 0000 0000 0000 0000(2) = 0(16) . Beim Rotieren würde 0000 0001 1111 0000(2) entstehen.]

Man kann damit leicht und schnell bestimmte Multiplikationen durchführen:

& 120 3 << . liefert 960 und entspricht einer Multiplikation mit 23 = 8


>>  

Schiebt die Bits des TOS um eine festgelegte Zahl von Schritten nach rechts. "Schieben" heißt dabei, dass der Übertrag rechts (die rechts herausfallenden Bits) verloren gehen; links werden Nullen zugeführt.

Anwendung:

&  129 1 >> . liefert 64, weil alle Bits um 1 Stelle nach rechts verschoben werden. [129(10) = 81(16) = 0000 0000 1000 0001(2). Beim Schieben nach rechts entsteht 0000 0000 1000 0000(2) = 64(10)]

& 129 8 >>. liefert 0, weil alle Bits um 8 Stellen nach links verschoben werden. [129(10) = 81(16) = 0000 0000 1000 0001(2). Beim Schieben nach rechts um 8 Stellen entsteht 0000 0000 0000 0000(2) = 0 ]

$ F001 8 >>. liefert F0, weil alle Bits um 8 Stellen nach rechts verschoben werden. [F001(16) = 1111 0000 0000 0001(2). Bei der Rotation nach links um 8 Stellen entsteht 0000 0000 1111 0000(2) = F0(16) . Beim Rotieren würde 0000 0001 1111 0000(2) = 1F0(16) entstehen.]

Man kann damit leicht und schnell bestimmte Divisionen durchführen:

& 128 3 >> .  liefert 16 und entspricht einer Division durch 8 = 23

& 4120 6 >> . liefert  64 und entspricht einer Division durch 64 = 26


ROL

Rotiert die Bits des TOS um eine festgelegte Zahl von Schritten nach links. Rotieren heißt dabei, dass der Übertrag links (die links herausfallenden Bits) rechts wieder zugeführt werden.

Anwendung:

&  129 1 ROL . liefert 258, weil alle Bits um 1 Stelle nach links rotiert werden. [129(10) = 81(16) = 0000 0000 1000 0001(2). Bei der Rotation oder dem Schieben nach links entsteht 0000 0001 0000 0010(2) = 258(10)]

& 129 8 ROL . liefert -32512, weil alle Bits um 8 Stellen nach links rotiert werden. [129(10) = 81(16) = 0000 0000 1000 0001(2). Bei der Rotation oder dem Schieben nach links um 8 Stellen entsteht 1000 0001 0000 0000(2) = 8100(16) = -32512(10)]

$ F001 8 ROL . liefert E003, weil alle Bits um 8 Stellen nach links rotiert werden. [F001(16) = 1111 0000 0000 0001(2). Bei der Rotation nach links um 8 Stellen entsteht 0000 0001 1111 0000(2) = 1F0(16) . Beim Schieben würde 0000 0001 0000 0000(2) = 100(16) entstehen.]


ROR

Rotiert die Bits des TOS um eine festgelegte Zahl von Schritten nach rechts. Rotieren heißt dabei, dass der Übertrag rechts (die  rechts herausfallenden Bits) links wieder zugeführt werden.

Anwendung:

$ F001 1 ROR . liefert F800, weil alle Bits um 1 Stelle nach rechts rotiert werden. [F001(16) = 1111 0000 0000 0001(2). Bei der Rotation nach rechts um 1 Stelle entsteht 1111 1000 0000 0000(2) = F800(16) . Beim Schieben würde 0111 1000 0000 0000(2) entstehen.]

$ F001 8 ROR . liefert 1F0, weil alle Bits um 8 Stellen nach rechts rotiert werden. [F001(16) = 1111 0000 0000 0001(2). Bei der Rotation nach  rechts um 8 Stellen entsteht 0000 0001 1111 0000(2) = 1F0(16) . Beim Schieben würde 0000 0000 1111 0000(2) entstehen.]

$ 81 1  ROR . liefert 8040, weil alle Bits um 1 Stelle nach  rechts rotiert werden. [ 81(16) = 0000 0000 1000 0001(2). Bei der Rotation nach  rechts entsteht 1000 0000 0100 0000(2) = 8040(16)]

$ 81 8 ROR . liefert  8100, weil alle Bits um 8 Stellen nach links rotiert werden. [ 81(16) = 0000 0000 1000 0001(2). Bei der Rotation nach  rechts entsteht 1000 0001 0000 0000(2) = 8100(16)]


AND

Verknüpft die obersten beiden Stackelemente logisch mit AND.

Anwendung:

$ 1234 F0 AND .  ergibt 30


OR

Verknüpft die obersten beiden Stackelemente logisch mit OR.

Anwendung:

$ 1234 FF OR .  ergibt 12FF


XOR

Verknüpft die obersten beiden Stackelemente logisch mit EXCLUSIVE OR.

Anwendung:

$ 1234 FF XOR .  ergibt 12CB


NOT

Invertiert alle Bits des TOS

Anwendung:

$ 1234 NOT  .  ergibt  EDCB


*

Multipliziert die obersten beiden Stackelemente. Das Ergebnis muss kleiner FFFF sein, andernfalls Fehlermeldung.

Anwendung:

$ 10 20 *  .  ergibt 200

$ FF FF * . ergibt  FE01


/

Dividiert das vorletzte Stackelemente durch den TOS (16 bit-Division). Ein Rest wird unterdrückt. Beachten Sie, dass Zahlen > 7FFF als negative Zahlen gelten.

Anwendung:

$ 7FFF  1000 /  .  ergibt 7

$ 8000  10  /   . ergibt  F800 (8000(16) = -  


MOD

Liefert den Rest bei der 16-bit-Division des vorletzten Stackelements durch den TOS.

Anwendung:

$ 7FFF  1000 /  .  ergibt 7

$ 7FFF  1000 MOD  .  ergibt den Rest FFF


*/

Kombinierte Rechenoperation zum Skalieren von Größen ohne Berücksichtigung von Vorzeichen. TOS-2 und TOS-1 werden multipliziert mit 32-bit-genauem Zwischenergebnis. Dann wird durch den TOS dividiert. Das Ergebnis ist 32 bit genau, wobei das höherwertige Wort den TOS bildet. In vielen Fällen ist es 0 und wird weggeworfen.

Anwendung:

& 512 5000 1023 */ . . 0 2502 (der AD-Wandler-Wert 512 wird in mV umgerechnet, wobei der Maximalwert 1023 der Spannung 5000 mV entspricht).


*/MOD

Kombinierte Rechenoperation zum Skalieren von Größen ohne Berücksichtigung von Vorzeichen. TOS-2 und TOS-1 werden multipliziert mit 32-bit-genauem Zwischenergebnis. Dann wird durch den TOS dividiert. Das Ergebnis ist 32 bit genau, wobei das höherwertige 2-Byte-Wort den TOS bildet. In vielen Fällen ist es 0 und wird weggeworfen. Zuletzt wird der Rest ausgegeben.

& 1000 500 47 */MOD . . . 0  10638 14

Sie können nachrechnen: 1000 * 500 / 47 ergibt 10638 Rest 14


=

Prüft ob die obersten beiden Stackelemente gleich sind. Falls ja, wird ein TRUE-Flag (1) auf den Stapel gelegt, andernfalls ein FALSE-Flag (0). Z.B. mit einer IF -  ELSE - ENDIF- Klammer wird die Reaktion auf das Flag festgelegt.

Anwendung:

& : COMPARE = IF 71 EMIT ELSE 85  EMIT ENDIF RET

COMPARE druckt ein "G" aus, wenn die beiden Elemente auf dem Stack gleich sind, andernfalls ein "U".


<>

Prüft ob die obersten beiden Stackelemente ungleich sind. Falls ja, wird ein TRUE-Flag (1) auf den Stapel gelegt, andernfalls ein FALSE-Flag (0). Z.B. mit einer IF -  ELSE - ENDIF- Klammer wird die Reaktion auf das Flag festgelegt.

Anwendung:

& : COMPARE <> IF 85  EMIT ELSE 71 EMIT ENDIF RET

COMPARE druckt ein "G" aus, wenn die beiden Elemente auf dem Stack gleich sind, andernfalls ein "U".


0=

Prüft, ob der TOS gleich 0. Falls ja, wird ein TRUE-Flag (1) auf den Stapel gelegt, andernfalls ein FALSE-Flag (0). Z.B. mit einer IF -  ELSE - ENDIF- Klammer wird die Reaktion auf das Flag festgelegt.

Anwendung:

& : 0TEST 0=  IF 71  EMIT ELSE 85 EMIT ENDIF RET

0TEST druckt ein "G" aus, wenn auf dem Stapel eine 0 liegt, andernfalls ein "U".


>

Prüft, ob der TOS kleiner als der darunterliegende Wert auf dem Stapel ist. Falls ja, wird ein TRUE-Flag (1) auf den Stapel gelegt, andernfalls ein FALSE-Flag (0). Z.B. mit einer IF -  ELSE - ENDIF- Klammer wird die Reaktion auf das Flag festgelegt.  Interpretiert die Zahlen auf dem Stack als negativ, wenn Bit 15 gesetzt.

Anwendung:

3 2 > . liefert 1, weil 3 größer als der TOS 2 ist. Aber $ F000 1000 > . liefert 0, weil F000 als negative Zahl interpretiert wird (Bit 15 gesetzt), die kleiner als 1000 ist.


U>

Prüft, ob der TOS gleich 0. Falls ja, wird ein TRUE-Flag (1) auf den Stapel gelegt, andernfalls ein FALSE-Flag (0). Z.B. mit einer IF -  ELSE - ENDIF- Klammer wird die Reaktion auf das Flag festgelegt.  Interpretiert die Zahlen auf dem Stack als vorzeichenlose Zahlen.

Anwendung:

3 2 U> . liefert 1, weil 3 größer als der TOS 2 ist. Auch F000 1000 U> . liefert 1, weil F000 nicht als negative Zahl interpretiert wird.


>=

Prüft, ob der TOS kleiner oder gleich dem darunterliegenden Wert auf dem Stapel ist. Falls ja, wird ein TRUE-Flag (1) auf den Stapel gelegt, andernfalls ein FALSE-Flag (0). Z.B. mit einer IF -  ELSE - ENDIF- Klammer wird die Reaktion auf das Flag festgelegt.  Interpretiert die Zahlen auf dem Stack als negativ, wenn Bit 15 gesetzt.

Anwendung:

3 2 >= . liefert 1, weil 3 größer oder gleich dem TOS 2 ist. Aber $ F000 1000 >=  . liefert 0, weil F000 als negative Zahl interpretiert wird (Bit 15 gesetzt), die kleiner als 1000 ist.


<

Prüft, ob der TOS größer als der darunter auf dem Stapel liegende Wert ist. Falls ja, wird ein TRUE-Flag (1) auf den Stapel gelegt, andernfalls ein FALSE-Flag (0). Z.B. mit einer IF -  ELSE - ENDIF- Klammer wird die Reaktion auf das Flag festgelegt.  Interpretiert die Zahlen auf dem Stack als negativ, wenn Bit 15 gesetzt.

Anwendung:

2 3 < . liefert 1, weil 2 kleiner als der TOS 3 ist. Aber $ 1000 F000 <  . liefert 0, weil F000 als negative Zahl interpretiert wird (Bit 15 gesetzt), die kleiner als 1000 ist.


U<

Prüft, ob der TOS gleich 0. Falls ja, wird ein TRUE-Flag (1) auf den Stapel gelegt, andernfalls ein FALSE-Flag (0). Z.B. mit einer IF -  ELSE - ENDIF- Klammer wird die Reaktion auf das Flag festgelegt.  Interpretiert die Zahlen auf dem Stack als vorzeichenlose Zahlen.

Anwendung:

3 2 > . liefert 1, weil 3 größer als der TOS 2 ist.


<=

Prüft, ob der TOS größer oder gleich dem darunterliegenden Wert auf dem Stapel ist. Falls ja, wird ein TRUE-Flag (1) auf den Stapel gelegt, andernfalls ein FALSE-Flag (0). Z.B. mit einer IF -  ELSE - ENDIF- Klammer wird die Reaktion auf das Flag festgelegt.  Interpretiert die Zahlen auf dem Stack als negativ, wenn Bit 15 gesetzt.

Anwendung:

2 3 <= . liefert 1, weil 2 kleiner oder gleich dem TOS 3 ist. Auch -5 -3 <= liefert 1.


MS

Programmiert den TIMER0, so dass er in 1 Millisekunde um 1 herunterzählt, nimmt den TOS als Startwert und schaltet TIMER0 ein. Der aktuelle Zählerwert kann mit TIME auf den Stapel gelegt werden. Vgl. auch WAIT

Anwendung:

FFFF MS  .....     TIME .  startet den TIMER0 mit dem Startwert FFFF und beginnt herunterzuzählen. Nach Abarbeitung des Programmcodes ..... wird der momentane Zählerwert auf den Stapel gelegt und an das Terminal geschickt.


TIME

Der momentane Zählerwert des vorher gestarteten  TIMER0 (Rückwärtszählung) wird auf den Stapel gelegt.

Anwendung:

& 10000 10000 MS  .... TIME - .     Meldet die Zahl der Millisekunden, die für die Arbarbeitung des Programmcodes ... benötigt wird. Der TIMER0 wurde mit dem Startwert 10000 gestartet.


WAIT

Hält die Abarbeitung des Wortes für eine bestimmte Zahl von Millisekunden an. Dies wird vorher durch MS festgelegt. Verwendet TIMER0.

Anwendung:

& 1000 MS WAIT  hält den Programmablauf für genau 1000 Millisekunden an.


EXIT

Returns from a user function. Same runtime behaviour as RET, but marks a side-exit out of a function. Does not stop the compiler.


ABORT

Unconditional warm start of 'Avise' will be executed. That means: stacks and console buffers are reset. Values of variables and I/O configuration remain unchanged.


INIT

Unconditional cold start of 'Avise' will be executed. I.e. a microcontroller reset is forced, all memory and I/O will be reinitialized. If set, an AUTOEXE function will be executed before the command interpreter can be reached by the user.


IF     ELSE    ENDIF

Teile  der IF-ENDIF  bzw.  IF-ELSE-ENDIF-Klammer. IF prüft das Flag auf dem TOS. Wenn es TRUE (= 1) ist, wird in den Programmcode hinter IF verzweigt. Wenn das Flag FALSE ( = 0) ist, wird im ersten Fall hinter ENDIF verzweigt, bei der IF-ELSE-ENDIF-Klammer hinter ELSE. Dann wird der Programmcode hinter ENDIF fortgesetzt.

Anwendung:

Vgl. =


FOR  

(<start> <stop> -- ; VAR name)

Beginnt einen "counted loop":

<start> <stop> FOR <variable> ... NEXT.

<variable> ist der Laufindex (Schleifenzähler), der zur leichteren Manipulation während des Abarbeitens der Schleife in einer Variable abgelegt ist. Das erste Mal wird die Schleife mit dem Anfangsindex <start> durchlaufen, mit dem Endindex  <stop>  das letzte Mal. Die Schrittweite ist 1, die Laufrichtung wird automatisch festgestellt, indem Anfangs- und Endindex miteinander verglichen werden.

Weitere Informationen bei DO,  NEXT und LEAVE.


NEXT

( -- )

Schleifenende einer FOR...NEXT-Schleife. Intern wird der Laufindex (Schleifenzähler) erhöht oder erniedrigt. Falls der Endindex erreicht wird, fährt das Programm hinter NEXT fort. Andernfalls wird die Schleife, beginnend hinter FOR, weiter durchlaufen.

Beispiel:   VAR v1     :  TEST 1 10 FOR v1 v1 RD . NEXT RET

VAR v1 definiert die Variable v1. Dann wird ein Wort TEST definiert. Es enthält eine Schleife, die mit dem Laufindex 1 begonnen und mit dem Laufindex 10 beendet werden soll. Mit dem ersten v1 wird beim Compilieren v1 als Laufindex festgelegt. v1 RD . bewirkt, dass die Adresse von v1 auf den Stapel gelegt, dann ausgelesen und dann ihr Inhalt ausgedruckt wird.


LEAVE

( -- )

Verlässt sofort die innerste DO ... NEXT-Schleife und setzt den Programmablauf hinter dem entsprechenden NEXT fort (als DONEXT compiliert). Die Schleifenparameter werden vom Stack entfernt. Die Variable, die den Laufindex enthält, bleibt unbeeinflusst.


REPEAT  UNTIL

Teile der REPEAT-UNTIL-Schleife. Vor UNTIL muss ein Flag bereitgestellt werden, das von UNTIL geprüft wird. Der zwischen REPEAT und UNTIL liegende Code wird ausgeführt, bis UNTIL auf ein FALSE-Flag stößt. Das Flag kann geliefert werden durch einen Vergleichsoperator (=, >, <, <>, ... ), durch eine Tastaturabfrage mittels KEY? oder einfach durch eine auf den Stapel gelegte 0 oder 1.

Anwendung:

1 REPEAT  INK DUP . KEY? UNTIL DROP  zählt von 2 anfangend jeweils um 1 hoch, bis eine Taste gedrückt wird. In diesem Fall wird ein TRUE-Flag (= 1) auf den Stapel gelegt, nach Prüfung durch UNTIL wieder weggenommen. Dann liegt aber noch der Code der gedrückten Taste auf dem Stapel, der mit DROP entfernt wird.


KEY

Liest ein Byte aus dem Input-Puffer des seriellen Interfaces. Falls der Puffer leer ist, wartet KEY bis ein Byte geliefert wird.
Vorsicht: Es gibt keine TIMEOUT-Begrenzung. Kann abgebrochen werden durch ALT GR ~ .


KEY?

Prüft, ob eine Taste gedrückt wurde. Wenn das nicht der Fall ist, wird ein FALSE-Flag (=0) auf den Stapel gelegt, andernfalls ein TRUE-Flag (=1) und darunter der Code der gedrückten Taste.


EMIT

Sendet ein Zeichen an das Terminal, dessen Code der TOS ist. Einzige Möglichkeit in AVISE 4, um einen "Text" an das Terminal zu schicken.

Anwendung:

&  65 EMIT schickt den Buchstaben "A" an das Terminal.


.

Der "Druckbefehl": sendet den TOS an das Terminal mit der jeweils eingestellten Zahlenbasis (10 oder 16).


&

Schaltet auf die Zahlenbasis 10 um. Wirksam bis auf die Zahlenbasis 16 durch $ umgeschaltet wird.


$

Schaltet auf die Zahlenbasis 16 um. Wirksam bis auf die Zahlenbasis 10 durch & umgeschaltet wird.


ERB

( addr -- b )

Liest ein Byte aus dem CPU-internen EEPROM aus und legt es auf den Stack.  


EWB

( b addr -- )

Schreibt ein Byte vom TOS in das CPU-interne EEPROM.


.S

Dient zur Fehlersuche: sendet die obersten 8 Stackelemente an das Terminal.

( -- )

Simple debugging or system monitoring tool. Emits (non destructive) the contents of data stack and the first 8 user defined variables in order of definition via serial interface. This function is called by the single step debugger, too. But when .S is called out of the debugger, execution is not halted.


OPS

Listet die momentan definierten Worte und Variablen auf, bei den vom Anwender definierten Worten mit ihren TOKEN-CODES.


FORGET

Anwendung:

FORGET ALT  vergisst alle vom Anwender definierten Worte vom Wort oder der Variablen ALT ab, d.h. ALT und alle neueren Worte und Variablen.


{


AUTOEXE

Ermöglicht den automatischen Start eines Wortes nach einem COLD-Start (Reset oder Einschalten). Das Abarbeiten des Wortes kann nur mit ALT GR ~ unterbrochen werden. Dann kann die Autoexe-Funktion abgeschaltet werden durch AUTOEXE OUT, wenn OUT z.B. nicht definiert ist.

Anwendung:

Wenn das Wort MESSEN definiert ist, wird mit AUTOEXE MESSEN festgelegt, dass beim nächsten COLD-Start das Wort MESSEN automatisch gestartet wird.


:    -   RET

Wortpaar, das die Definition eines neuen Wortes klammert. Hinter : folgt (nach einem Zwischenraum) der Name des neu zu definierenden Wortes, dann folgt i.d.R. die definierende Wortfolge als Code. Es können dabei nur solche Worte benutzt werden, die bereits definiert sind, evtl. auch ein solches mit gleichem Namen. Neue Namen dürfen keine Kernel-Worte enthalten und dürfen nicht ausschließlich aus Zeichen bestehen, die als (Hexadezimal-)Zahlen interpretiert werden könnten. Nach Tastendruck hinter RET wird das Wort in den Wortschatz von AVISE kompiliert.


CONST

Deklariert eine Konstante

Anwendung:

3142 CONST PI  definiert und belegt die Konstante PI mit dem Wert 3142. Mit PI wird ihr Wert auf den Stapel gelegt. PI . sendet 3142 an das Terminal.


VAR

Definiert eine Variable.

Anwendung:

VAR V1  VAR Zeit.   42 V1 WR schreibt 42 in die Variable, V1 RD .  legt ihren Inhalt auf den Stapel und verbraucht ihn wieder beim Senden an das Terminal.


DOLIT

Runtime primitive, which returns compiled numeric values .

Not directly user applicable. Listed here only as reference for SEE output.


DOSTR

Runtime primitive, which is compiled by .".

Not directly user applicable. Listed here only as reference for SEE output.


DONEXT

Runtime primitive, which is compiled by NEXT.

Not directly user applicable. Listed here only as reference for SEE output.


DOFOR

Runtime primitive which is compiled by FOR.

Not directly user applicable. Listed here only as reference for SEE output..


GO

Runtime primitive which is compiled by ELSE. Performs an unconditional branch at runtime

Not directly user applicable. Listed here only as reference for SEE output..


IF

( T|F -- )

Compiles a conditional jump to the respective ELSE or ENDIF.

Example:

LUEGE IF 1 . ELSE 0 . ENDIF


IFNOTGO

Runtime primitive which is compiled by IF and UNTIL. Performs a conditional branch at runtime if TOS is FALSE

Not directly user applicable. Listed here only as reference for SEE output..