Forum: Digitale Signalverarbeitung / DSP / Machine Learning Blackfin DSP (PLL)


von mswíerzy (Gast)


Lesenswert?

Hallo zusammen,
vorweg ich bin ein Einsteiger in den DSP-Bereich und habe so meine
Anfangsprobleme.
Ich habe mir das ADSP-BF535 EZ-KIT gekauft. Programmiert wird das ganze
mit VisualDSP. Nun ist dort ein Beispiel enthalten für das setzen und
zurückstetzten eines Portpins (PFx).
Auf dem KIT ist ein 20MHz Quarz angebracht, nun meine frage wie muss
ich die PLL's konfigurieren damit ich ein möglichst schnelles
"Pin-Toggeling" hinbekomme. Über einen C- Quellcode wäre ich sehr
erfreut da mir da total der durchblick fehlt und mir die Online-Hilfe
nicht weiterhelfen konnte.

Vielen Dank

Marek Swierzy

von ICON (Gast)


Lesenswert?

Ich bin auch einsteiger ich kann dir nicht helelfen aber falls du irgend
 wie eine Lösung findest kannst du ihn ja uns Posten so würde einiges zu
Thema Blackfin zusammen kommen.

von mswíerzy (Gast)


Lesenswert?

Hmmm irgendwie finde ich im internet keine Informationen darüber.
Arbeitet den jemand mit einem anderen Blackfin und kann mir etwas zum
thema PLL sagen?

von Alex (Gast)


Lesenswert?

Ich arbeite mit dem ADSP-21992, da dürfte kein Riesenunterschied
bestehen. Wo genau ist das Problem?

Mir ist die Frage einfach zu allgemein formuliert, um jemanden mit
fertigem Code zu füttern. Ist z.B. klar, wie man in C auf die Register
des DSP zugreifen kann, funktioniert das Ganze auch prinzipiell
(Debugger)?

Auf dem ADSP-21992 klinkt man die PLL einfach in einen Bypass-Mode,
stellt Multiplier und Divider ein und schaltet die PLL dann wieder ein
- das wars.

Wenn Initiative erkennbar wird schaue ich vielleicht auch mal in das
Datenblatt deines Blackfin.

Alex

von mswíerzy (Gast)


Lesenswert?

He Alex, vielen Dank für dein Anwort. Du bist der erste der mir evt.
helfen könnte.
Ich möchte schnellstmöglich einen Pin setzen und zurück setzen.


#include <sys/exception.h>
#include <sys/excause.h>
#include "defBF535.h"

/*global variables*/
volatile unsigned short * fio_dir_reg;
volatile unsigned short * fio_set_reg;
volatile unsigned short * fio_clr_reg;

/*void main()*/
void main()
{

    fio_dir_reg = (unsigned short *)FIO_DIR;
        fio_set_reg = (unsigned short *)FIO_FLAG_S;
        fio_clr_reg = (unsigned short *)FIO_FLAG_C;

        /* set PF0 - PF3 as output */
        *fio_dir_reg = (unsigned short)0x000F;

        asm("ssync;");
        int a,b,c;

        for(;;)
    {
                /* clear all the LED */
                *fio_set_reg = (unsigned short)0x000F;
                /* set LED to 0xA pattern */
                *fio_clr_reg = (unsigned short)0x000F;
        }

}


vielen dank

von Alex (Gast)


Lesenswert?

Na ok,

auch wenn da von PLL weit und breit noch nichts zu sehen ist. Also
schlag als erstes mal die Hardware-Reference auf (auf Seite 364 gehts
los).

PLL_CTL: Bypass Mode aktivieren und PLL abschalten

PLL_CTL: MSEL-Bits auf entsprechenden Faktor einstellen und PLL
aktivieren

PLL_STAT: Bit 5 (PLL_LOCKED) pollen bis es gesetzt ist
(while-Schleife)

PLL_CTL: Bypass Mode deaktivieren.

Das wars, freue mich auf eine programmtechnische Umsetzung.

Alex

von mswíerzy (Gast)


Lesenswert?

Danke für den Tip, ich versuche es umzusetzten.
Ich gebe schnellst möglich ein Feedback.

Danke

von mswierzy (Gast)


Lesenswert?

So Alex....... ich bekomme es nicht hin...
was mache ich falsch.... hier mal die unterfunktion welche ich for der
entlosschleife abarbeite.

void Init_PLL(void)
{
*pPLL_CTL=0x0102;  // Bypass u. Disable Power to PLL
*pPLL_CTL=0x2F00;  // MSEL adjust and Bypass on
while((*pPLL_STAT&0x0020)==0)
{
    printf("wait");
}
*pPLL_CTL=0x2E00;  // MSEL adjust and Bypass off

}

Aber aus irgendeinen grund scheint er die funktion nicht zu machen.

Vielen Dank


Marek

von Alex (Gast)


Lesenswert?

Hallo Marek,

deine Angaben sind leider ein wenig fuzzy ...

Du hast ein EZ-Kit, kannst also eigentlich ständig alle Register
kontrollieren. Nutze diese Möglichkeit.

Wird das Bit korrekt gesetzt nachdem du die PLL umgestellt hast?

Schau alternativ einmal in das Programmverzeichnis vom VisualDSP++,
dort finden sich oft Programmbeispiele. Bei meiner 3.5er Version ist
z.B. der Code für eine PLL-Initialisierung dabei (für den ADSP-BF561).


Alex

von mswierzy (Gast)


Lesenswert?

schau ich mir gleich mal an....
aber sag mal ist der Source ok ?

von Alex (Gast)


Lesenswert?

Sorry, da ich auf dem ADSP-21992 in Assembler arbeite (was in meinen
Augen soundso besser als C auf einem DSP von AD ist), kann ich das nur
schwer beurteilen.

von Timo (Gast)


Lesenswert?

Hallo Marek,

funktioniert es oder benötigst Du noch ein paar Tips?
Wenn Du das PLL_CTL Register änderst mußt Du auf jeden Fall den Idle
Befehl ausführen.

von Marek (Gast)


Lesenswert?

Hallo Timo,

ich habe immer noch meine Probleme ;).
Hast du evt. eine Email adresse oder eine ICQ nummer für mich,
damit dieser Post hier nicht ins unentliche geht ?

Gruß

Marek

von Marek (Gast)


Lesenswert?

mal eine Frage neben bei wie schell kann ich die PFx überhaupt setzen un
clearen was ist da die Maximale Geschindigkeit?


Gruß

Marek

P.s: @admin/mod ich suche nach einem Link um mir mein Passwort zukommen
zu lassen :)....

von Timo (Gast)


Lesenswert?

Als Ausgang geschaltet eine Zustandsänderung pro SCLK. Der maximale Takt
eines Ausgangssignales ist demnach SCLK/2. Wenn Du einen Portpin toggeln
lassen möchtest, warum nimmst Du dann nicht einfach das Toggle
Register?

Ich habe leider völlig vergessen, dass ich hier meine Hilfe angeboten
habe. Woran hängt es bei der PLL Initialisierung? Möchtest Du sie in C
oder ASM initialisieren? Ich kenne zwar nicht den BF535 sondern nur
BF561 und BF534/6/7 aber die PLL sollte identisch sein. Ich kann Dir
den Code wahrscheinlich liefern müsste ihn nur etwas anpassen.

von Der Marek :) (Gast)


Lesenswert?

Das wäre echt super von dir.... hast du evt. icq oder eine email-adresse
für mich... falls ich weiter fragen habe ???

von ICON (Gast)


Lesenswert?

Im Datenblatt sthet du muss bestimmt sequenzen einhalten oder im
Bootprozess verändern.
Ich Hb auch ein PLL Problem und zwar ich verstehe das Datenblatt nicht
die geben zwar einige Beispiel aber wo wird VCO bestimmt (im Datenblatt
sthet im Register PLL_CTL MSEL[5:0] so weit is ok) aber wie kommt man
denn auf vco=600.. usw. das ist mir irgendwie unklar.

von ICON (Gast)


Lesenswert?

Ok es hat sich erledigt, ich habs gefunden .

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.