12.8.94
Monitorprogramm für Signalprozessor-Karte
mit dem TMS320C25
Version 1.1
Jürgen Hasch, DG1SCR@DB0RBS.#BW.DEU.EU
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.
Das Monitorprogramm wird über die serielle Schnittstelle der DSP-Karte angesteuert und benutzt die folgenden Einstellungen:
Nach dem Einschalten der Karte meldet sich das Monitorprogramm mit der folgenden Einschaltmeldung:
ROM-Monitor for TMS320C25 Version 1.1 Rev.0 HE for help checksum: 00643A25 >
Das '>'-Zeichen dient als Kommandoprompt.
Folgende Befehle stehen zur Verfügung:
HE Hilfetext ausgeben GO <adr> Programm an Adresse <adr> ausführen LP Programm im Intel-Hex-Format laden LD Daten im Intel-Hex-Format laden MP <sadr> <eadr> Memory Dump Programmspeicher MD <sadr > <eadr> Memory Dump Adressspeicher ST Stackpointer anzeigen
Syntax: HE
Beschreibung: Gibt eine Liste der zur Verfügung stehenden Befehle aus.
Beispiel:
>HE commands: ---------------- HE show this help text GO <adr> execute program at address <adr> LP load into program memory LD load into data memory MP <sadr> <eadr> show program memory dump MD <sadr> <eadr> show data memory dump ST show stackpointers
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
Syntax: LP
Beschreibung: Lädt Daten im 16 Bit INTEL-HEX-Format in den Programmspeicher.
Der Ladevorgang wird automatisch beendet.
Beispiel: >LP
loading...OK
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.
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
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
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
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) |
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
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
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
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
Syntax: 05 <adresse>
Beschreibung: Ein an der angegebenen Adresse stehendes Programm wird gestartet.
Beispiel: 05 90 00 gesendet
05 empfangen
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).
Zur Vereinfachung der Programmierung sind noch einige Hilfsfunktionen im Monitorprogramm vorhanden. Sie können von eigenen Programmen aus aufgerufen werden.
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) |
Funktion: Rücksprung in das Monitorprogramm
Beispiel: B MON_RESTART
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
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
Funktion: Nullterminierten String auf der seriellen Schnittstelle ausgeben.
Aufrufparameter: AR0 - Adresse des Strings
Beispiel: LRLK AR0,STRING
CALL UART_TX_STRING
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
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
Funktion: Hexadezimale Zahl (4 Zeichen) in Wort umwandeln.
Aufrufparameter: AR0 - Addresse der Zeichen
Rückgabewerte: Akku - gewandeltes Wort
Funktion: Hexadezimale Zahl (2 Zeichen) in 8-Bit Zahl umwandeln
Aufrufparameter: AR0 - Adresse der Zeichen
Rückgabewerte: Akku - gewandelte Zahl
Funktion: Codec CS4215 mit den angegebenen Daten initialisieren
Aufrufparameter: AR0 - Adresse der Initialisierungsdaten
Beispiel:
LRLK AR0,INIT_DATA CALL MON_INIT_CODEC INIT_DATA WORD 0000000000001100b ; TS12 WORD 1010001000000000b ; TS34 WORD 1100000000000000b ; TS56 WORD 0000000000000000b ; TS78
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 |
Funktion: Einzelnes Zeichen auf LCD-Anzeige ausgeben
Aufrufparameter: Akku - auszugebendes Zeichen
Funktion: String auf LCD-Anzeige ausgeben.
Aufrufparameter: AR0 - Adresse des nullterminierten Strings
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 |
Die Einbindung einer eigenen Interrupt-Routine erfolgt durch Überschreiben des Sprungsziels and der Adresse des Interrupt-Vektors+1.
Beispiel:
LALK MEIN_INTERRUPT LDPK TINT SACL TINT+1 ... MEIN_INTERRUPT .... EINT RET