12.8.94

Monitorprogramm für Signalprozessor-Karte
mit dem TMS320C25

Version 1.1

Jürgen Hasch, DG1SCR@DB0RBS.#BW.DEU.EU

1. Bedienung des Monitorprogrammes

1.1 Allgemeines

Der Zweck des Monitorprogrammes ist es, die Softwareentwicklung zu vereinfachen. Statt massenweise EPROMs zu verbraten, können Programme über die serielle Schnittstelle ins RAM geladen und dann gestartet werden. Dazu sind Kommandos zum Laden und Ausführen eines Programmes, sowie zum Ausgeben von Speicherinhalten vorhanden. Zusätzlich werden verschiedene Hilfsfunktionen zur vereinfachten Programmierung von UART, Codec und LCD-Anzeige bereitgestellt.

1.2 Standardeinstellungen

Das Monitorprogramm wird über die serielle Schnittstelle der DSP-Karte angesteuert und benutzt die folgenden Einstellungen:

1.3 Einschaltmeldung

Nach dem Einschalten der Karte meldet sich das Monitorprogramm mit der folgenden Einschaltmeldung:

Das '>'-Zeichen dient als Kommandoprompt.

1.4 ASCII-Befehle

Folgende Befehle stehen zur Verfügung:

2. Kommandos

2.1 HE - Hilfe ausgeben

Syntax: HE

Beschreibung: Gibt eine Liste der zur Verfügung stehenden Befehle aus.

Beispiel:

2.2 GO - Programm ausführen

Syntax: GO <adresse>

Beschreibung: Führt ein Programm ab der angegebenen Adresse aus.

Beispiel: >GO 9000
führt ein Programm an der Speicherstelle 9000H aus

2.3 LP - Daten in Programmspeicher laden

Syntax: LP

Beschreibung: Lädt Daten im 16 Bit INTEL-HEX-Format in den Programmspeicher.
Der Ladevorgang wird automatisch beendet.

Beispiel: >LP
loading...OK

2.4 LD - Daten in Datenspeicher laden

Syntax: LD

Beschreibung:
Lädt Daten im 16 Bit INTEL-HEX-Format in den Datenspeicher.
Der Ladevorgang wird automatisch beendet.

Beispiel: >LD
loading...OK

Anmerkung: In den externen ROM- und RAM-Bereichen sind Daten- und Programmspeicher identisch. Dies kann sich jedoch bei einer neueren Version der Signalprozessorkarte ändern.

2.5 MP - Programmspeicherinhalt ausgeben

Syntax: MP <Anfangsadresse> <Endadresse>

Beschreibung: Gibt mit Adresse <Anfangsadresse> beginnend den Speicherinhalt des Programmspeichers bis <Endadresse> aus.

Beispiel: >MP 0000 0010
0000: 0000 0000 0000 0000 0000 0000 0000 0000
0010: 0000 0000 0000 0000 0000 0000 0000 0000

2.6 MD - Datenspeicherinhalt ausgeben

Syntax: MD <Anfangsadresse> <Endadresse>

Beschreibung: Gibt mit Adresse <Anfangsadresse> beginnend den Speicherinhalt des Datenspeichers bis <Endadresse> aus.

Beispiel: >MD 0000 0010
0000: 0000 0000 0000 0000 0000 0000 0000 0000
0010: 0000 0000 0000 0000 0000 0000 0000 0000

2.7 ST - Stackpointeradresse ausgeben

Syntax: ST

Beschreibung: Gibt die Adressen der Stackpointer aus (Top of Stack). Der User Stackpointer steht im Register AR6 und der Interrupt Stackpointer im Register AR7.

Beispiel: >ST
User stack: 815F
IRQ context save: 81FF

3. Binärbefehle

Mit Hilfe der Binärbefehle besteht vom Computer aus die Möglichkeit direkt auf den Speicher der DSP-Karte zuzugreifen oder Programme ausführen zu lassen. Die Codes bestehen jeweils aus einem Zeichen und Parametern, die Werte sind immer hexadezimal angegeben.

Die Befehle ab 11H entsprechen den Befehlen ab 01H, es wird legendiglich kein Befehlsecho ausgegeben.

Befehlscode

Beschreibung

01H Wort aus Datenspeicher lesen
02H Wort aus Programmspeicher lesen
03H Wort in Datenspeicher schreiben
04H Wort in Programmspeicher schreiben
05H Programm ausführen
06H Programm zur DSP-Karte schicken
11H Wort aus Datenspeicher lesen (ohne Echo)
12H Wort aus Programmspeicher lesen (ohne Echo)
13H Wort in Datenspeicher schreiben (ohne Echo)
14H Wort in Programmspeicher schreiben (ohne Echo)
15H Programm ausführen (ohne Echo)
16H Programm zur DSP-Karte schicken (ohne Echo)


01H - Wort aus Datenspeicher lesen

Syntax: 01 <adresse>

Beschreibung: Der Inhalt des Datenspeichers an der angegebenen Adresse wird gesendet.

Beispiel: An 9000H im Datenspeicher steht 1020H:
01 90 00 gesendet
01 10 20 empfangen

02H - Wort aus Programmspeicher lesen

Syntax: 02 <adresse>

Beschreibung: Der Inhalt des Programmspeichers an der angegebenen Adresse wird gesendet.

Beispiel: An 9000H im Datenspeicher steht 1020H:
02 90 00 gesendet
02 10 20 empfangen

03H - Wort in Datenspeicher schreiben

Syntax: 03 <adresse> <wort>

Beschreibung: An die angegebene Adresse im Datenpeicher wird das angegebene Wort geschrieben

Beispiel: 03 90 00 10 20 gesendet
03 empfangen

04H - Wort in Programmspeicher schreiben

Syntax: 04 <adresse> <wort>

Beschreibung: An die angegebene Adresse im Programmspeicher wird das angegebene Wort geschrieben

Beispiel: 04 90 00 10 20 gesendet
04 empfangen

05H - Programm ausführen

Syntax: 05 <adresse>

Beschreibung: Ein an der angegebenen Adresse stehendes Programm wird gestartet.

Beispiel: 05 90 00 gesendet
05 empfangen

06H - Programm zur DSP-Karte laden

Syntax: 06 <startadresse> <anzahl> <wort 1>...<wort n> <Prüfsumme>

Beschreibung: Die gesendeten Worte werden ab der angegebenen Adresse im Datenspeicher abgelegt. Abschließend wird eine Prüfsumme berechent und mit der gesendeten Prüfsummer verglichen.

Beispiel: 06 90 00 00 02 00
00 00 00 90 02 gesendet
06 2d empfangen

Anmerkungen: Bei Erfolg wir 2dH ('+') zurückgegeben, bei einem Prüfsummenfehler 2fH ('-'). Die Prüfsumme berechnet sich aus der wortweisen Summe aller gesendeten Werte (also ohne Befehlscode, inklusive Adresse und Anzahl).

Hilfsfunktionen

Zur Vereinfachung der Programmierung sind noch einige Hilfsfunktionen im Monitorprogramm vorhanden. Sie können von eigenen Programmen aus aufgerufen werden.

Allgemeines

Folgende Funktionsaufrufe stehen zur Verfügung:

Symbolkonstante Auswirkung
MON_RESTART Programmende, Sprung ins Monitorprogramm
UART_TX_CHAR Zeichen auf RS232-Schnittstelle ausgeben
UART_TX_WORD Wort auf RS232-Schnittstelle ausgeben
UART_TX_STRING String auf RS232-Schnittstelle ausgeben
UART_RX_CHAR Zeichen von RS232-Schnittstelle empfangen
UART_RX_STRING String von RS232-Schnittstelle empfangen
UART_SET_BAUDRATE RS232 Baudrate setzen
MON_WORD2HEX Wort (16 Bit-Wert) in HEX-ASCII umwandeln
MON_HEX2WORD 4-Zeichen HEX-Zahl in 16Bit-Wort umwandeln
MON_HEX2BYTE 2-Zeichen HEX-Zahl in 8Bit-Zahl umwandeln
MON_INIT_CODEC Codec initialisieren
LCD_INIT LCD-Anzeige initialisieren
LCD_WR_CMD Befehl schicken
LCD_WR_DATA Daten schicken
LCD_RD_ADR Adresse holen
LCD_RD_DATA Daten holen
LCD_WR_CHAR Zeichen ausgeben
LCD_WR_STRING String ausgeben
LCD_SET_CGRAM Zeichen in AR0 setzen
LCD_WR_HEX hexadez. Wort ausgeben
LCD_WR_1HEX hexadex. Zeichen ausgeben
LCD_WR_DEC dez. Wort schreiben
LCD_WR_DEC2 dez. Wort schreiben (mit Null aufgefüllt)

MON_RESTART

Funktion: Rücksprung in das Monitorprogramm

Beispiel: B MON_RESTART

UART_TX_CHAR

Funktion: Ein einzelnes Zeichen an der seriellen Schnittstelle ausgeben. Ist der FIFO-Puffer voll, wird gewartet bis wieder Platz ist.

Aufrufparameter: Akku - zu sendendes Zeichen

Beispiel: LACK 'A'
CALL UART_TX_CHAR

UART_TX_WORD

Funktion: 16Bit-Wort auf der seriellen Schnittstelle ausgeben. Zuerst werden die
höherwertigen 8 Bit gesendet, danach die niederwertigen 8 Bit.

Aufrufparameter: Akku - zu sendendes Wort

Beispiel: LALK 1234h
CALL UART_TX_WORD

UART_TX_STRING

Funktion: Nullterminierten String auf der seriellen Schnittstelle ausgeben.

Aufrufparameter: AR0 - Adresse des Strings

Beispiel: LRLK AR0,STRING
CALL UART_TX_STRING

UART_RX_CHAR

Funktion: Einzelnes Zeichen von der seriellen Schnittstelle empfangen. Es wird
solage gewartet, bis ein Zeichen eintrifft.

Rückgabewert: Akku - empfangenes Zeichen

Beispiel: CALL UART_RX_CHAR

UART_RX_WORD

Funktion Wort von der seriellen Schnittstelle empfangen (2 Zeichen). Zuerst wird der höherwertige Anteil, danach der niederwertige Anteil empfangen.

Rückgabeparameter: Akku - empfangenes Wort

Beispiel: CALL UART_RX_WORD

MON_HEX2WORD

Funktion: Hexadezimale Zahl (4 Zeichen) in Wort umwandeln.

Aufrufparameter: AR0 - Addresse der Zeichen

Rückgabewerte: Akku - gewandeltes Wort


MON_HEX2BYTE

Funktion: Hexadezimale Zahl (2 Zeichen) in 8-Bit Zahl umwandeln

Aufrufparameter: AR0 - Adresse der Zeichen

Rückgabewerte: Akku - gewandelte Zahl

MON_INIT_CODEC

Funktion: Codec CS4215 mit den angegebenen Daten initialisieren

Aufrufparameter: AR0 - Adresse der Initialisierungsdaten

Beispiel:

LCD_INIT

Funktion: LCD-Anzeige initialisieren. Ist keine Anzeige angeschlossen, wird die
Funktion nach einem Timeout verlassen.

Beispiel: CALL LCD_INIT

Liste der Kontrollcodes für LCD-Anzeige

Code Beschreibung
00H-07H CGROM character
08H Backspace
09H CGROM 0 character (for use in strings, where 0 terminates string)
0AH ignored
0BH ignored
0CH clear display and go to start
0DH go to start of 2nd line
0EH go to start of first line
0FH go to start of first line and reset display shift
10H-17H Bit 0: blink of cursor on/off

Bit 1: cursor on/off

Bit 2: display on/off

Bit 3: 0

Bit 4: 1

Bit 5: 0

Bit 6: 0

Bit 7: 0

18H-1BH Bit 0: shift display on/off

Bit 1: increments/decrements on wr

Bit 2: 0

Bit 3: 1

Bit 4: 1

Bit 5: 0

Bit 6: 0

Bit 7: 0

1CH shift cursor to the left
1DH shift cursor to the right
1EH shift display to the left
1FH shift display to the right


LCD_WR_CHAR

Funktion: Einzelnes Zeichen auf LCD-Anzeige ausgeben

Aufrufparameter: Akku - auszugebendes Zeichen

LCD_WR_STRING

Funktion: String auf LCD-Anzeige ausgeben.

Aufrufparameter: AR0 - Adresse des nullterminierten Strings

Interrupt-Routinen

Überblick

Adresse Name Beschreibung
8000H ISR0 Interrupt vom 16550 (RS232-Schnittstelle)
8002H ISR1 unbelegt
8004H ISR2 unbelegt
8006H RINT Empfangs-Interrupt, serielle Prozessorschnittstelle
8008H XINT Sende-Interrupt, serielle Prozessorschnittstelle
800AH TINT interner Zeitgeber
800CH PROC Software-Trap

Neue Interrupt-Routine setzen

Die Einbindung einer eigenen Interrupt-Routine erfolgt durch Überschreiben des Sprungsziels and der Adresse des Interrupt-Vektors+1.

Beispiel: