www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik lpc2148 PLL-Fehler


Autor: simon91 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich hab mir vor kurzem das Olimex-Dev-Board LPC-P2148 zugelegt. Nun hab 
ich mir folgenden PLL-Init-Code zusammengestellt, der aber leider nicht 
funktioniert, da bei meinem Testprogramm (siehe unten) nicht wie 
vorgesehen die LEDs im Sekundentakt, sondern nur etwa alle 5 Sekunden, 
wechseln. Ich schließe daraus, dass der PLL nicht aktiviert wird, kann 
aber leider keinen Fehler in meinem Code finden. Für eure Hilfe bedanke 
ich mich schon einmal im voraus.

PLL-INIT:
#define FOSC  12000000
#define PLL_M 5
#define PLL_P 2
#define CCLK  (PLL_M * FOSC)

void arch_init(void) {

  // CCLK = FOSC*PLL_M = 12000000*5 = 60000000
  PLL0->CFG = (PLL_M-1)|((PLL_P-1)<<5);
  // PLL aktivieren
  PLL0->CON = 0x01;
  PLL0->FEED = 0xAA;  //PLL Feed-Sequenz
  PLL0->FEED = 0x55;
  // Änderungen werden übernommen
  while ( !( PLL0->STAT & PLOCK ) );

  // PLL aktivieren/mit Taktgeber verbinden
  PLL0->CON = 0x03;
  PLL0->FEED = 0xAA;  //PLL Feed Sequence
  PLL0->FEED = 0x55;


  MAMCR=0x0;

  #if   CCLK < 20000000
    MAMTIM = 1;
  #elif CCLK < 40000000
    MAMTIM = 2;
  #elif CCLK >= 40000000
    MAMTIM = 3;
  #endif

  MAMCR=0x2;


  VPBDIV=0x1;

}


Test-Programm:
int main(void) {

  uin32_t i = 0;

  arch_init();

  GPIO0->DIR |= (1<<10);
  GPIO0->SET  = (1<<10);
  GPIO0->DIR |= (1<<11);
  GPIO0->SET  = (1<<11);

  while(1) {
    GPIO0->SET = (1<<11);
    GPIO0->CLR = (1<<10);
    for(i = 60000000;i>0;i--)
      NOP();
    GPIO0->SET = (1<<10);
    GPIO0->CLR = (1<<11);
    for(i = 60000000;i>0;i--)
      NOP();
  }

  return 0;
}

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Woran ist ersichtlich, dass es im Sekundentakt abgehen müsste? Die 
Warteschleifen benötigen garantiert mehr als 1 Takt pro Iteration. Wenn 
NOP exakt ein NOP ist, komme ich auf mindestens 4 Takte (NOP=1, 
Subtraktion=1, Sprung>=2).

Autor: simon91 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok,
ich hab mir nun den Code des Disassamblers heraus geschrieben:
 370:  nop      (mov r0,r0)
 374:  subs  r3, r3, #1  ; 0x1
 378:  bne  370 <main+0x4c>

Demnach dauert das Ganze 3 Takte. Ich hab jetzt die Schleife auf 
20000000 geändert. Die Folge: es dauert ungefähr 1.5s.

Autor: simon91 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich hingegen i=12000000 (der Takt des Quarzes) eingebe, erfolgt das 
Blinken genau im Sekundentakt. Da dieses Ergebnis aber durch die 
Ausführungszeit der Schleife verfälscht ist, frag ich nun andersrum: wie 
kann ich zuverlässig feststellen ob der PLL funktioniert?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
simon91 wrote:

> Demnach dauert das Ganze 3 Takte.

Der Branch braucht mindestens 2. Je nach Speicherart und MAM-Einstellung 
auch mehr.

Autor: simon91 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ok das die branch-instruction mehr als einen Takt braucht ist klar.
Ich bin nun selbst darauf gekommen wie ich den PLL testen kann:
Ich hab nun einfach ein Timer-Interrupt geschrieben das die LEDs im 
Sekundentakt an- bzw. ausmacht und es funktioniert. Das es mit der 
Schleife nicht funktionieren kann ist mir nun auch klar (man lernt 
immerwieder etwas neues).
Danke für die Hilfe

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.