mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Blackfin Interruptprogrammierung in C


Autor: hoderlump (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute!

Ich hab hier an der Uni einen nagelneuen Analog Devices BF537 (dh. 
keiner hat Erfahrung damit). Wir wollen mit ihm verschiedene Sensoren 
mit I2C auslesen und die Daten später verarbeiten. Wir benutzen Visual 
DSP++.

Mein Problem: Ich finde leider nirgends eine Anleitung, ein Datasheet 
oder ähnliches, in dem erklärt wird, wie man den Blackfin in C 
vernüfntig programmiert. Ich hab hier nur was für Assembler. Ich hab 
bisher µC immer auch nur in Assembler programmiert, deswegen weiß ich 
nicht wie ich beginnen soll.

Das Gute: Ich habe schon ein funktionierendes Codefragment, mit dem ich 
den I2C-Bus auslesen und beschreiben kann, siehe unten.

Jedoch ist das sehr billig ohne Fehlerbehandlung und sonstiges. 
Vernünftig programmiert sollte es so aussehen wie auf dem angehängtem 
Bild.

Meine konkreten Fragen:
1. Sind meine Fragen alle Blödsinn weil es irgendwo eine Dokumentation 
für C mit dem Blackfin gibt? :-D
2. Wie beginne ich eine Interruptroutine in C?
3. Ist es sinnvoll im Codefragment diese while()-Schleifen zu benutzen, 
die warten bis ein Interrupt gesetzt wurde, da diese den Prozessor davon 
abhalten, was anderes zu tun und Leistung verbraten? Gibt es eine 
professionellere Lösung oder ist das unproblematisch?
4. Wir haben das Board mittels dem JTAG-Interface ADZS-HPUSB-ICE von 
Analog per USB am Rechner hängen und können ihn so debuggen und flashen. 
Ist es auch möglich damit die Pins über eine gewisse Zeit auszulesen? 
(Ich konnte dies einmal mit einem XC164 mithilfe eines Intronix 
Logicport machen, wunderbar komfortabel...) Oder beim Debuggen die Werte 
der Register zu sehen? Ich hab in VirtualDSP++ keine Möglichkeit hierzu 
gefunden...

Vielen Dank
Johannes


Anhang 2: I2C Codefragment


// INIT
*pTWI0_CONTROL = TWI_ENA | 0xA; // enable TWI controller
*pTWI0_CLKDIV = CLKHI(0x08<<2) | CLKLOW(0x11<<2); // CLKDIV = CLKHI + 
CLKLOW = TWI SCL period / 10 MHz time reference
*pTWI0_MASTER_ADDR = 0x53; // Definition of Adress to write to

*pPORTFIO_DIR = 0x0330; // set Input/Output directions on PortxIO

for(i=0; i<100000; i++){} // takes some time......


// #####################################################################
// Cheap and dirty I2C reading sequence:

  *pTWI0_MASTER_CTRL=TWICount(0x01) | MDIR | MEN; // initializing the 
transmit, reading x Bytes, MDIR is for reading
  // *pTWI0_MASTER_CTRL=TWICount(0x01) | MDIR | MEN | FAST;

  while(!(*pTWI0_FIFO_STAT & 0xC)){} // waits until two Bytes are in 
Fifo buffer
  // while(!(*pTWI0_FIFO_STAT & 0x1)){} // waits until one Byte is in 
Fifo buffer

  data = *pTWI_RCV_DATA8; // the 1 Byte that was read
    // data = *pTWI_RCV_DATA16; // the 2 Bytes that were read

// #####################################################################

Autor: hoderlump (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie blöd muss man sein....

Hab das C-Manual endlich gefunden. Für alle, die es auch suchen: 
http://www.analog.com/static/imported-files/softwa...

Könnt ihr vielleicht trotzdem meine Fragen 2-4 beantworten, wenn sie 
schon hier stehen? :-D
Va. die letzte wäre mir wichtig, hab ich mit meinem Equipent die Ports 
ubd Reguster auszulesen?

Viele Grüße
Johannes

Autor: hemul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Such mal hier nach "blackfin shell", da gibts ne Menge Beispielcode zum 
i2c. Die i2c-Sachen laufen auch unter uClinux super. IMHO ist VDSP nur 
teurer Schrott, aber muss jeder selber wissen. Ich arbeite mit GCC und 
nem icebear-JTAG, laeuft einwandfrei und ohne die nervigen Crashs.

Autor: hoderlump (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mittlerweile alles zum laufen gebracht, kann die Chips auch 
auslesen.
Ist eigentlich gar nicht so aufwändig, nur ist der Blackfin 
I2C-Controller halt so mächtig und kompliziert dokumentiert, dass die 
Sache wiederum kompliziert wirkt.

@ hemul: Was kann man mit dem Icebear Jtag machen? watches auf Register 
und Pins setzen und diese über eine bestimmte Zeit auslesen?
Und nochmal meine Frage: Das sollte doch auch über den Analog Devices 
ZS-HPUSB-ICE und VDSP gehen oder?
Ich wil ja nur beim Debuggen gewisse Register auslesen, so schwierig 
kann das doch bei so edlem Equipment nicht sein oder?

Autor: Martin S. (strubi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo hoderlump,

hoderlump schrieb:

> 1. Sind meine Fragen alle Blödsinn weil es irgendwo eine Dokumentation
> für C mit dem Blackfin gibt? :-D

Blödsinn eh kaum, wie ging noch mal die lehrerhafte Floskel: Es gibt 
keine dummen Fragen..
Gibt leider von ADI nicht gerade Unmengen an lehrreichem Source, fuers 
meiste muss man extra bezahlen. Aber in den VDSP-Ordnern findest Du 
einiges an Beispielen.
Unter uClinux gibts natuerlich ne Menge, da muss man sich aber auch 
meist nicht mehr mit der Hardware-Ansteuerung rumschlagen. Damit ist 
aber der Blackfin quasi zu einer MCU verdammt (nix mehr totale 
Latenzkontrolle).

> 2. Wie beginne ich eine Interruptroutine in C?

Hmm. Möglicherweise gibt's ein "interrupt" attribute, aber bin mir 
gerade nicht mehr so sicher, ob das bei VDSP gilt.

> 3. Ist es sinnvoll im Codefragment diese while()-Schleifen zu benutzen,
> die warten bis ein Interrupt gesetzt wurde, da diese den Prozessor davon
> abhalten, was anderes zu tun und Leistung verbraten? Gibt es eine
> professionellere Lösung oder ist das unproblematisch?

Es gibt eine, und zwar, wenn Du den Blackfin in den IDLE-Zustand 
schickst ("idle"-Assembler-Befehl). Bei einem Interrupt kannst Du mit 
entsprechender Konfiguration den Core wieder aufwecken.

> 4. Wir haben das Board mittels dem JTAG-Interface ADZS-HPUSB-ICE von
> Analog per USB am Rechner hängen und können ihn so debuggen und flashen.
> Ist es auch möglich damit die Pins über eine gewisse Zeit auszulesen?
> (Ich konnte dies einmal mit einem XC164 mithilfe eines Intronix
> Logicport machen, wunderbar komfortabel...) Oder beim Debuggen die Werte
> der Register zu sehen? Ich hab in VirtualDSP++ keine Möglichkeit hierzu
> gefunden...

Wenn du spezifisch Pins monitoren willst, geht das nur über 
Boundary-Scan. Soweit ich weiss, können das die ADI-Tools nicht, aber 
einige teure generische Tools (oder der ICEbear Plus im Prinzip). Du 
kannst damit aber kein sauberes Monitoring machen, die Abtastung ist zu 
langsam.
Die Werte der Register oder Variablen kannst du in VDSP per Watch-Window 
prima anschauen. Kann dir allerdings auch gerade nicht sagen wo, da ich 
auch nur noch mit dem ICEbear arbeite. Vom Debuggen her können die 
ADI-ICE und der ICEbear dasselbe, die Unterschiede liegen aber im 
Support für die jeweiligen Compiler und Binärformate (die zueinander 
nicht mehr kompatibel sind).

Aber nicht verwirren lassen. Viel Erfolg mal :-)

Gruesse,

- Strubi

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail ü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

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.