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.
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
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.
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?
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!
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 -.-
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.
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 ^^
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!
ich hab gemeint wenn ich das dann zusammenfüge und so schreibe: *pSIC_IMASK = 0x08000020; so sollte es doch eigentlich funktionieren.
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.
Der Interrupt sollte auch ständig aufgerufen werden. Aber wenn ich es teste wird er kein einziges mal aufgerufen.
Bernhard S. schrieb:
> Der Interrupt sollte auch ständig aufgerufen werden.
Der Taster-Interrupt soll ständig aufgerufen werden?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.