Forum: Digitale Signalverarbeitung / DSP / Machine Learning TMS320LF2407 ???


von Friz (Gast)


Lesenswert?

Guten Tag,

hat hier jemand Erfahrung mit dem TMS320LF2407  und dem CCStudio?
Ich versuche mich in diesen Controller einzuarbeiten und bin über alle 
Informationen, Hinweise, Beispielcodes in C, sehr dankbar.
Freue mich auf eure Beiträge
Friz

von Dirk H. (arm-dran)


Lesenswert?

Arbeite mit der TMS320LF24xxx Familie,

welche Art von Informationen brauchst Du denn ???
Beispielcodes für was, welche Anwendung???

Genaugenommen ist der TMS320LF24xxx eine Kombination aus Microcontroller
mit DSP Eigenschaften.

von Friz (Gast)


Lesenswert?

Hallo Dirk,
würde dich gerne folgendes fragen:

Code Composer:
Ich arbeite mit dem CC4.12 und habe dort das entsprechende GEL File 
installiert um beim Debuggen Registerinhalte im Blick zu haben, nun 
zeigt mir aber das Watchwindow  föllig unerwartete Registerwerte an. 
Z.B. Nachdem man im Programm REGISTERx= 0x04000; geschrieben hat steht 
im Watch Window REGISTERx= 0x52340 usw. Was mach ich falsch?

Beispielcode ADC:
Deshalb würde ich mich über Beispielcode freuen, speziell solchen der 
den ADC mit der höchst möglichen Samplingrate konfiguriert um ein Signal 
am ADC einzulesen und am DAC wider Ausgeben zu 
können(Grundfunktionalität testen).

C oder Assembler?:
Sind C Kenntnisse für diesen Controller ausreichend oder lässt sich das 
volle Leistungspotential nur mit Assembler erschließen?
Vielen Dank für deine Schnelle Antwort!
freundliche Grüße
Friz

von Dirk H. (arm-dran)


Lesenswert?

schick mir mal dein GEL-File.
Kann das hier nicht nachvollziehen.

Was passiert, wenn Du in REGISTERx = 0x00000 schreibst, bzw. 0x0FFFF

Was zeigt Dir dann Dein Watch Fenster?

von Friz (Gast)


Lesenswert?

Hallo Dirk,
der Controller befindet sich übrigens in einem EVM von Spectrum Digital 
und ist mit einem XDS510PP an dem PC angebunden.
Nach dem Schreiben von 0xffff zeigt das WW zB 0x5400 an.
Im Anhang ist das GEL File

von Dirk H. (arm-dran)


Lesenswert?

Ich habe auch ein Board von Spectrum Digital, allerdings für den 
TMS320F2812.
Das GEL-File fehlt aber.
Bleibt der Wert im Watch Fenster konstant auf 0x5400 wenn du mehrmals 
0xFFFF schreibst ??

von Friz (Gast)


Angehängte Dateien:

Lesenswert?

Sorry,
hab vergessen das GEl File hinzuzufügen.
Beispielsweise möchte ich möchte ich das Register *ADCTRL2 = 0x4504; 
initialisieren und danach mit *ADCTRL2 |=0x4000; das reset Bit 
schreiben.
Doch auch nach mehrmaligem Versuch Steht im WW ADCTRL2 = 0x0504;
Oder hab ich da etwas Grundsätzliches falsch verstanden?
Manchmal muss man auch den CC neu starten und das DSP Board ein- 
ausschalten bevor ein Programm korrekt ausgeführt wird.
Sind dir vielleicht ähnliche Sachen aufgefallen oder liegt es einfach 
nur an falscher Bedienung des CC?

von Dirk H. (arm-dran)


Angehängte Dateien:

Lesenswert?

Friz wrote:
> Sorry,
> hab vergessen das GEl File hinzuzufügen.
> Beispielsweise möchte ich möchte ich das Register *ADCTRL2 = 0x4504;
> initialisieren und danach mit *ADCTRL2 |=0x4000; das reset Bit
> schreiben.
> Doch auch nach mehrmaligem Versuch Steht im WW ADCTRL2 = 0x0504;
> Oder hab ich da etwas Grundsätzliches falsch verstanden?
> Manchmal muss man auch den CC neu starten und das DSP Board ein-
> ausschalten bevor ein Programm korrekt ausgeführt wird.
> Sind dir vielleicht ähnliche Sachen aufgefallen oder liegt es einfach
> nur an falscher Bedienung des CC?

Hallo Friz,

Schau Dir die Verwendung der Bits von ADCCTRL2 noch mal genau an.
"ADCTRL2 = 0x4504"
Dies ist der Wert, den Du aus dem Register liesst.

"ADCTRL2 |=0x4000" Du machst eine oder Verknüpfung, dabei soll Bit 14 
gesetzt werden
Bit 14 ist aber "calibration mode" ????
Um die conversation zu starten mußte Du 0x2000 verwenden.

Außerdem solltest Du bei diesen Registern das "ReadModifyWrite" 
beachten.
Im Register sind auch Statusbits, die sich nicht einfach beeinflussen 
lassen durch setzen und rücksetzen.


Schau Dir mal das Beispiel im PDF ab Seite 27 an.

Gruß

Dirk

von Friz (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Dirk,

vielen Dank für das PDF, genau so ein Beispiel habe ich gesucht und es 
ist beruhigend zu hören dass andere Menschen ähnliche Probleme mit 
diesem Controller haben.
Was mich nur ein wenig verwirrt, ist dass sich deine Beschreibung des 
ADCTR2 Registers nicht mit denen der mir vorliegenden Datenblätter 
decken.
Auf Seite 116 des beiliegenden Datenblatts ist Bit 14 des ADCTRL2 
Registers RESETSEQ1?
Wo gibt es den nun die richtigen Daten für den Controller 
TMS320LF2407PGEA ?
Wichtig war auf  jedem Fall die Information dass man de Controller vor 
dem Programm Download reseten  muss.
Viele Grüße
Friz

von Dirk H. (arm-dran)


Angehängte Dateien:

Lesenswert?

Hallo Friz,

das Original PDF (Shortform !?!?!) sagt ja nichts zur genaueren 
Beschreibung der Bits aus.
Schau nochmal in das angehängte PDF auf Seite 4, "start a conversion"

Denk auch immer dran, die Erratasheets vom Hersteller zu lesen.
Das Original Datenblatt find ich sowieso total konfus.

Gruß

Dirk

von Friz (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Dirk,
die Beispiel Programme haben mir sehr geholfen.
Da ich mit dem Controller ein Filter realisieren möchte suche ich noch 
nach Beispielcode in dem beschrieben ist wie man genügend Speicher für 
einen Buffer reserviert und effizient Filterroutinen 
implementiert.(typische DSP Aufgabe: Audiosignal ->DSP-> bearbeitetes 
Audiosignal )
Könntest du mir einen Tip geben wo man da am besten sucht?
Vielen Dank für Deine Hilfe
Friz

von Friz (Gast)


Lesenswert?

Hallo Dirk,
hab versucht eine ADC mittels GPT 1 zu triggern
um eine Feste Samplingrate zu generieren.
Dabei wird GPT 1 mit einem Comparewert initialisiert
und Maxcon auf 0 gesetzt.

Nun soll ein Compare Ereignis eintreten,das die ADC Sequenz triggert,
um danach in einer ISR den  Wert aus RESULT0 einzulesen.
Leider ist die sich einstellende Samplingfrequenz nicht gleich der 
Frequenz der Timerinterrupts.

Beispiel: CPU Frequenz 30MHZ  Timer  = 0x02EE; soll den ADC alle 25µs 
triggern und damit eine Samplingfrequenz von ungefähr 40kHz erzeugen.
Leider ist die resultierende Frequenz um Dekaden kleiner.

Beim Debuggen im Singelstepmode wird zwar beim Erreichen des 
Comparewerts das INT Flag (Bit9) des ADCTRL2 gesetzt, doch leider 
verzweigt das Programm dann nicht in die ISR, sonder zählt das 
AUTO_SEQ_SR weiter hoch.
Der ADC  arbeitet im Interrupt Mode1.
Was mache ich falsch?

von Dirk H. (arm-dran)


Lesenswert?

Mit welcher Programmiersprache arbeitest Du, um den 2407 zu 
programmieren ?

von Friz (Gast)


Lesenswert?

Arbeite mit C und dem CCS.
Hab ein paar Filter Bibliotheken von Ti installiert.
Die Funktionen sind in Assembler geschrieben, bieten aber eine 
Schnittstelle zu C Programmen.
Dort wird in einer Timer ISR der ADC „manuell“ getriggert, vielleicht 
kann man das kopieren.

von Dirk H. (arm-dran)


Lesenswert?

Friz wrote:
> Arbeite mit C und dem CCS.
> Hab ein paar Filter Bibliotheken von Ti installiert.
> Die Funktionen sind in Assembler geschrieben, bieten aber eine
> Schnittstelle zu C Programmen.
> Dort wird in einer Timer ISR der ADC „manuell“ getriggert, vielleicht
> kann man das kopieren.

Da liegst Du richtig, er samplet alle Kanäle durch.
Wenn Du es über den Timereinterrupt machst (polling bzw. triggern) dann
kannst Du hier den letzte Wert auslesen, neues sampling triggern und 
sofort
eine evtl. Vorverarbeitung und Übergabe in einem definiertem Zeitfenster
auslösen.
40Khz dürften kein Problem sein. In Assembler hat man natürlich ne gute
zeitliche Kontrolle über den Ablauf.
Folgender Vorteil würde sich ebenfalls ergeben.
Solltest Du mal versch. Kanäle durcheinander abscannen wollen,
wäre die Interruptroutine die flexibelste.
Man muß halt immer beachten, daß es hier einen AD mit gemultiplexten
Eingängen gibt. Also alle nacheinander.
Du solltest Dir mal ausrechnen lassen, wieviel Zeit Dir abzgl.
der AD-Timerroutine zwischen den samplings übrig bleibt.
Ich kenne ja den restlichen Zeitbedarf deiner Routine nicht.

Gruß

Dirk

von Friz (Gast)


Angehängte Dateien:

Lesenswert?

Beim Versuch einen Simplen FIR Filter in C auf einem fixpoint Rechner zu 
programmieren habe ich das Problem dass nach der sequentiellen 
Multiplikation des Eingangssignal mit dem Filterkernel das Resultat Null 
ist.
Ist die Handhabung der beiden signed ints richtig?
Muss man Spezialitäten des Compilers beachten?
@ Dirk wie kann man sich im CC   die Zeit bzw Takte für mehrere Befehle 
ausrechnen lassen?
Freue mich auf Tipps und Tricks

von Fritz (Gast)


Lesenswert?

Hat hier jemand ein Beispiel für eine einfache, mit C aufrufbare 
Assemblerfunktion für den TMS320LF2407?
Kann man aus einem 16Bit unsigned Wert durch folgende Manipulation:
   signed int x;
   unsigned y;
   x=(y^0x8000);
in ein signed integer umwandel oder ist noch ein cast erforderlich?
   x=(unsigned int)(y^0x8000);
vielen Dank!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.