Forum: Digitale Signalverarbeitung / DSP / Machine Learning Blackfin Interrupt


von Bernhard S. (jango)


Lesenswert?

Ich Programmiere mit dem BF537 EZ-Kit Lite Board und hätte gern gewusst 
wie man genau die Interrupts initialisiert.
Beziehungsweise wie ich mit einem taster einen Interrupt auslösen kann.
Ich weiß nämlich nicht was ich wie oder wo im Programm definieren soll.

Ich hab noch nicht viel Erfahrung mit dem Blackfin.

von strubi (Gast)


Lesenswert?

Hi Bernhard,

hier findest du was zu dem "shell"-Framework, mit dem man relativ 
schnell was zum Laufen kriegt:

http://www.section5.ch/forum/viewtopic.php?f=2&t=118

Die wichtigen Details zu den IRQs findest Du ueberall in den Files, die 
mit 'irq' anfangen :-)

Dokumentation ist mit bei (Doxygen). Die Details (Register, DMA, usw.) 
findest du im Hardware Reference Manual zum BF537.

Muss allerdings sagen, dass das ganze nur mit den GNU tools laeuft. 
Zumindest auf Anhieb. Fuer VDSP muesstest Du es anpassen.

Gruss,

-Strubi

von Bernhard S. (jango)


Lesenswert?

erstmal danke für deine Antwort.

ich hab VisualDSP++ Environment zum programmieren.

aber was soll ich jetzt mit dem shell machen? das sind einige Programme 
wo viel drin steht.

Ich würde zuerst gern wissen was ich grundsätzlich definieren muss.
oder welchen Interrupt ich verwenden kann.
So weit ich das verstanden hab gibt es ja 9 allgemeine Interrupts: 
IVG9-IVG15 die irgendwie von 48 peripheren Interruptquellen ausgelöst 
werden können.
Und diese 48 Quellen sind GPIO Leitungen die ich als Input und Output 
konfigurieren kann. aber da gibt es ja auch 3 verschiedene Ports.

von Bernhard S. (jango)


Lesenswert?

ok hab mich da jetzt ein bisschen ins Manual reingelesen.
Jetzt weiß ich schon so ungefähr wie ich die Interrupts definiere.

Das einzige was mich noch irritiert ist folgendes:

für meine Aufgabe brauche ich 4 Taster (muss ein Signal in Amplitude und 
Frequenz erhöhen und verkleinern können)

Am Port F habe ich aber nur Interrupt A und Interrupt B.
Ich weiß immer noch nicht welchen Interrupt ich verwenden kann.
Oder kann ich das nur realisieren indem ich PortG verwende?

von T. H. (pumpkin) Benutzerseite


Lesenswert?

Zugegeben, da die Interruptmöglichkeiten auf dem Blackfin extrem 
flexibel und umfangreich sind ist es nicht ganz einfach einen Einstieg 
zu finden.

Bernhard S. wrote:
> Am Port F habe ich aber nur Interrupt A und Interrupt B.
> Ich weiß immer noch nicht welchen Interrupt ich verwenden kann.
> Oder kann ich das nur realisieren indem ich PortG verwende?

"Interrupt A und B" sind nur die Masken mit denen du bestimmst, welcher 
Port-Pin welchen Interruptvektor auslöst. Der Port F hat zwei Vektoren, 
A und B. Für eine einfache Tasterabfrage brauchst du aber nicht 
unbedingt beide, es genügt, wenn du einen verwendest. Also angenommen 
die Pins PF0..3 sollen den Interrupt PORTF_A auslösen, der standardmäßig 
auf IVG12 gemapped ist, dann musst du in der PORTFIO_MASKA die ersten 
vier Bits setzen. Natürlich müssen zusätzlich etliche 
Konfigurationsregister eingestellt werden (siehe Programming Model 
Kapitel 14 in der ADSP-BF537 Blackfin Processor Hardware Reference). 
Wenn nun einer der Taster einen Interrupt auslöst, dann fragst du in der 
Interruptroutine das PORTFIO Register ab welcher der Pins den Interrupt 
ausgelöst hat. Anschließend löschst du das entsprechende Bit im 
PORTFIO-Register.

Cheers!

von Bernhard S. (jango)


Lesenswert?

Wow danke. das hat mir vom verstehen her ziemlich weiter geholfen.

also ich hätte das jetzt im Prinzip so :
Interrupts:

 *pSIC_IAR3 = 0xffff5fff; //dem Port F Interrupt A wird dem IVG12
                          //zugewiesen.

 register_handler(ik_ivg12,PORTF_IntA_ISR);

 *pSIC_IMASK = 0x08000000;   // hier wird der Interrupt erlaubt.

 *pPORTFIO_MASKA = 0x003C; //und hier werden PF2-PF5 als Interruptquelle
                           // erlaubt


im Interrupt Handler frage ich dann wer den Interrupt ausgelöst hat:

 if (*pPORTFIO & 0x0004)
 *pPORTFIO_SET = 0x0040;    // eine LED einschalten zum testen

 if (*pPORTFIO & 0x0008)
 *pPORTFIO_SET = 0x0080;    //  eine LED einschalten zum testen

 *pPORTFIO_CLEAR = 0x0FC0;   //danach werden die Flags PF2-PF5 wieder
                             //gelöscht


Die Flags hab ich so definiert:

 *pPORTF_FER = 0x0000;  // alle im GPIO mode

 *pPORTFIO_DIR = 0x1FC0;  //PF12 (Audio Reset), LEDs(PF6-PF11) = Output
                          //PF2-PF5 = Input

 *pPORTFIO_INEN = 0x003C;   // Push Buttons (PF2-PF5) = Input
 *pPORTFIO_POLAR |= 0x003C;  //Input Leitungen Pegel Sensitiv
 *pPORTFIO_EDGE |= 0x003C;   ////Input Leitungen nicht invertiert
  *pPORTFIO_CLEAR = 0x0FC0;     // PF6-PF11 werden gelöscht


könnte das funktionieren oder hab ich irgendwas wichtiges 
vergessen/übersehen/falsch?
Testen konnte ich es noch nicht weil ich grad Probleme mit der 
Verbindung zum Board hab -.-

von T. H. (pumpkin) Benutzerseite


Lesenswert?

Bin es nicht bis ins Detail durchgegangen, aber die Richtung stimmt auf 
jeden Fall. Allerdings würde ich erst alles konfigurieren und dann 
freigeben. Und wenn du _INEN benutzt musst du (wenn ich mich recht 
entsinne) auf externe Pull-Widerstände achten - hab' gerade nicht im 
Kopf wie's auf dem EZ-KIT ist.

von Bernhard S. (jango)


Lesenswert?

hab das jetzt getestet und die Buttons lösen einen Interrupt aus und die 
LEDs leuchten dann^^

Aber 2 Fragen hab ich noch:

1) wenn ich die Taster drücke leuchtet die letzte LED nur ganz schwach.
   woran kann das liegen?

und 2) das Hauptprogramm soll mit einem anderen Interrupt ausgelöst 
werden.
Im Beispielprogramm, das ich habe wird das irgendwie mit dem Sport0 
aufgerufen. das wird dann IVG9 zugewiesen.

*pSIC_IAR0 = 0xff2ffff;
*pSIC_IMASK = 0x00000020;  //DMA3 Interrupt (Sport0 RX)
register_handler(ik_ivg9,Sport0_RX_ISR);

wenn ich jetzt die definitionen für den Interrupt meine taster hinzufüge 
funktioniert der Interrupt für das Hauptprogramm aber nicht mehr.

Ansonsten geht alles soweit. Ich bedanke mich für deine bisherige Hilfe 
^^

von T. H. (pumpkin) Benutzerseite


Lesenswert?

Bernhard S. schrieb:
> 1) wenn ich die Taster drücke leuchtet die letzte LED nur ganz schwach.
>    woran kann das liegen?

Da gibt es mehrere Möglichkeiten. Unter anderem:

 - Hardwarefehler, falscher Vorwiderstand bestückt
   äußerst unwahrscheinlich
 - Hardwarefehler, Treiberbaustein U36 auf diesem Port defekt
   sehr unwahrscheinlich
 - Programmierfehler, die LED wird ständig ein- und ausgeschaltet
   sehr wahrscheinlich

> und 2) das Hauptprogramm soll mit einem anderen Interrupt ausgelöst
> werden.
> Im Beispielprogramm, das ich habe wird das irgendwie mit dem Sport0
> aufgerufen. das wird dann IVG9 zugewiesen.
>
> *pSIC_IAR0 = 0xff2ffff;
> *pSIC_IMASK = 0x00000020;  //DMA3 Interrupt (Sport0 RX)
> register_handler(ik_ivg9,Sport0_RX_ISR);
>
> wenn ich jetzt die definitionen für den Interrupt meine taster hinzufüge
> funktioniert der Interrupt für das Hauptprogramm aber nicht mehr.

Mit Sicherheit deswegen, weil du hier

  *pSIC_IMASK = 0x08000000;

(aus Post weiter oben) das Register komplett überschreibst. Versuch das:

  *pSIC_IMASK |= 0x08000000;


Cheers!

von Bernhard S. (jango)


Lesenswert?

ich hab gemeint wenn ich das dann zusammenfüge und so schreibe:

*pSIC_IMASK = 0x08000020;

so sollte es doch eigentlich funktionieren.

von T. H. (pumpkin) Benutzerseite


Lesenswert?

Ja, durchaus. Dazu lässt sich aber aus der Ferne anhand von 
Codefragmenten nicht viel sagen. Kümmere dich erstmal um die LED, der 
Interrupt scheint fälschlicherweise ständig aufgerufen zu werden.

von Bernhard S. (jango)


Lesenswert?

Der Interrupt sollte auch ständig aufgerufen werden.

Aber wenn ich es teste wird er kein einziges mal aufgerufen.

von T. H. (pumpkin) Benutzerseite


Lesenswert?

Bernhard S. schrieb:
> Der Interrupt sollte auch ständig aufgerufen werden.

Der Taster-Interrupt soll ständig aufgerufen werden?

von Bernhard S. (jango)


Lesenswert?

nein der mit dem Hauptprogramm.

Ansich würde das mit den Tastern funktionieren. Ich drücke, und die Led 
leuchtet. Wenn ich auslasse leutet sie nicht mehr.

Natürlich kann es auch sein das der Interrupt ständig ausgelöst wird und 
die Leds nur nicht leuchten weil kein taster gedrückt ist.
Dann wäre es aber seltsam warum der Interrupt auslöst obwohl kein taster 
gedrückt ist.

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.