Blackfin Interrupt

OP #1256082
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.
Gast
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
OP
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.
OP
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?
Persönliche Seite
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!
OP
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 -.-
Persönliche Seite
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.
OP
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 
^^
Persönliche Seite
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!
OP
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.