www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP DMA0 (PPI) Interrupt beim Blackfin?

Autor: Joern (Gast)
Datum: 19.11.2008 20:12

Moin,

ich verwende einen Blackfin 532 und uebertrage per PPI mit DMA Daten an
diesen. Nur wollte ich die Datenuebertragung per Interrupt
synchronisieren.
Geschafft habe ich bisher, den DMA und Sequencer so einzurichten, dass
ein Interrupt ausgeloest wird. Allerdings sieht es so aus, als ob
durchgehend Interrupts ausgeloest werden, was nicht von der
PPI-Uebertragung verursacht werden kann. Vielmehr vermute ich ein
Problem in meiner ISR.
Wodran kann es liegen, dass immer wieder die selbe Routine ausrefuehrt
wird? Muss ich den Interrupt in der ISR bestaetigen (Interrupt
Acknoledge) und wie mache ich das im BF532?

Hier mal der Einsprung in Assembler, der die ISR aufrufen sollte:

_I8HANDLER:           // IVG 8 Handler
//[-- sp] = reti;
[-- sp] = astat;
[-- sp] = fp;
[-- sp] = (r7:0, p5:0);
call _Interrupt8Handler;
(r7:0, p5:0) = [ sp ++ ] ;
fp = [ sp ++ ];
astat = [ sp ++ ];
//reti = [ sp ++ ];
rti;

Gruss, Joern
Autor: T. H. (pumpkin) Benutzerseite
Datum: 19.11.2008 22:14

Hardware Reference Fig. 9-14 & 9-15, Seite 9-38 [1]. Um den Interrupt zu
bestätigen musst du das DMA_DONE Bit im entsprechenden
DMAx_IRQ_STATUS Register setzen (W1C: Write-1-to-Clear).

[1]_http://www.analog.com/static/imported-files/proces...
Autor: Joern (Gast)
Datum: 19.11.2008 23:22

Oh danke, jetzt machen W1C und RO auch endlich mal ein bisschen Sinn
fuer mich...
Loescht man diese Bits nicht, bleibt der Interrupt dann angelegt und
unterbricht das Programm gleich wieder? Ist meine Fehlerbeschreibung
typisch fuer einen Fall, wo das Loeschen vergessen wurde?

Gruss, Joern
Autor: pumpkin (Gast)
Datum: 20.11.2008 11:26

Joern wrote:
> Loescht man diese Bits nicht, bleibt der Interrupt dann angelegt und
> unterbricht das Programm gleich wieder?

Ja.

> Ist meine Fehlerbeschreibung typisch fuer einen Fall, wo das Loeschen
> vergessen wurde?

Ja.
Autor: joern (Gast)
Datum: 23.11.2008 21:57

Ok, danke erstmal, ich hatte nun mal Gelegenheit, die
Interrupt-Bestaetigung auszuprobieren und es loest das Problem.
Aufgetreten ist nun aber ein weiteres Problem: Wenn ich den
Routineneinstieg so mache wie im Programmcode weiter oben vorgestellt,
fuehrt dies zu Instabilitaeten, die an irgendeiner Stelle dazu fuehren,
dass das Programm nicht mehr richtig ausgefuehrt werden. Die Zeitpunkte,
an den dies schiefgeht sind dabei zufaellig. Versuchsweise habe ich die
Interruptbestaetigung im Assemblercode untergebracht und dafuer den
Funktionsaufruf entfernt. Unter diesen Umstaenden laeuft alles stabil.
Wie gelingt eine richtige Speicherung des aktuellen CPU-States, so dass
dieser nach Rueckkehr aus dem Interrupt normal weiterlaeuft? (Ach ja,
die Akkumulatoren und anderen Register scheinen nicht das Problem zu
sein, werden diese doch nicht in der Interruptroutine verwendet.)

Gruss, Joern
Autor: pumpkin (Gast)
Datum: 23.11.2008 22:06

joern wrote:
> Aufgetreten ist nun aber ein weiteres Problem: Wenn ich den
> Routineneinstieg so mache wie im Programmcode weiter oben vorgestellt,
> fuehrt dies zu Instabilitaeten, die an irgendeiner Stelle dazu fuehren,
> dass das Programm nicht mehr richtig ausgefuehrt werden. Die Zeitpunkte,
> an den dies schiefgeht sind dabei zufaellig.

Zu einem zufälligen Zeitpunkt in der aufgerufenen Unterroutine im
Interrupt?

> Versuchsweise habe ich die
> Interruptbestaetigung im Assemblercode untergebracht und dafuer den
> Funktionsaufruf entfernt. Unter diesen Umstaenden laeuft alles stabil.

Das glaube ich gerne.

> Wie gelingt eine richtige Speicherung des aktuellen CPU-States, so dass
> dieser nach Rueckkehr aus dem Interrupt normal weiterlaeuft? (Ach ja,
> die Akkumulatoren und anderen Register scheinen nicht das Problem zu
> sein, werden diese doch nicht in der Interruptroutine verwendet.)

Kann ich so auf Schlag nicht sagen, ich programmiere die Teile
größtenteils in C. Guck in die "Programming Reference", da steht sowas
unter Garantie drinne:

  http://www.analog.com/static/imported-files/proces...
Autor: Strubi (Gast)
Datum: 25.11.2008 00:57

Hi joern,

habe ein paar IRQ-Handler in Assembler als Beispiel, siehe
irqhandler.asm aus dem Tar-File unter:

http://www.section5.ch/dsp/blackfin/shell-1.0-eval.tgz

Das Beispiel muss man fuer VDSP allerdings anpassen, die CPP-Defines und
Makros werden vermutlich im VDSP-Assembler nicht funktionieren.

Gruss,

- Strubi
Autor: Joern (Gast)
Datum: 30.11.2008 13:28

Danke. Ich weiss zwar nicht, welche der Stackoperationen in Deinem
save_all nun die entscheidene war um den Prozessorzustand zuverlaessig
wieder herzustellen, aber nun gehts. Traum.

Gruss, Joern

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel





Mit dem Abschicken erkennst du die Nutzungsbedingungen an.
- Amazon.de Anzeige -
amazon.de

webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net