TMS320LF2407 ???

Gast #528952
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
Gast #529393
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
Gast #529798
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?
Angehängte Dateien:
#530460
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
Angehängte Dateien:
Gast #531370
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
Angehängte Dateien:
#531494
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
Angehängte Dateien:
Gast #534064
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
Angehängte Dateien:
Gast #537353
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?
Gast #537955
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.
#538003
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
Gast #542810
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
Angehängte Dateien:
Gast #546316
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren