mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LPC2129 PLL


Autor: Michael S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe ein kleines Problem mit meinem LPC2129. Ich schreibe gerade ein 
CAN Programm, das einfach nur Nachrichten senden soll, nur leider 
scheinnt meine PLL nicht zu funktionieren.

Quarz: 10MHz

#define PLLSTAT_LOCK  (1 << 10)
#define PLLCFG_MSEL   (5<<0)
#define PLLCFG_PSEL   (2<<5)
#define CCLK  (10000000 * 6)
#define PLLCON_PLLE   (1 << 0)          // PLL Enable
#define PLLCON_PLLC   (1 << 1)          // PLL Connect

#define CANBit10k_60MHz 0x25C257


static void lowInit(void){

  /* PLL wieder als Clock Source */
  PLLCON = PLLCON_PLLE;         // enable PLL
  PLLCFG = PLLCFG_MSEL | PLLCFG_PSEL;

  PLLFEED = 0xAA;             // PLL Feed Sequence
  PLLFEED = 0x55;             // PLL Feed Sequence

  while (!(PLLSTAT & PLLSTAT_LOCK))continue;  // wait for PLL lock

  PLLCON =  PLLCON_PLLE | PLLCON_PLLC;   // enable and connect PLL
  PLLFEED = 0xAA;             // PLL Feed Sequence
  PLLFEED = 0x55;             // PLL Feed Sequence
}


Am Ausgang habe ich ein Oszi angeschlossen und vergleiche die Pulse mit 
eingeschalteter PLL und ohne. Leider scheint es dabei keinen Unterschied 
zu machen...

Ich hoffe mir kann jemand sagen, was ich falsch mache..

lg Michael

Autor: Michael S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm habe das gerade mal gegengecheckt, die PLL scheint doch zu laufen, 
zumindest sagt das ein mini Programm, das nur einen Ausgang hin und 
herschaltet... die PLL scheint allerdings nur den Faktor 3 zu liefern... 
kann mir jemand helfen, woran das liegt?!

Gruss
Michael

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe den Eindruck, dass dein Wert für PSEL etwas "out of Range" ist, das 
passiert leicht. Dann rastet die PLL nicht ein und müßte eigentlich in 
der while-Schleife verbleiben.

Aus deinem Beispielcode:
Wert von M = (5<<0) + 1 in PLLCFG bits 4:0 = 5 + 1 = 6.
Wert von P = (2<<5)     in PLLCFG bits 6:5 = 4.

Die Berechnung der erlaubten Werte für MSEL und PSEL befindet sich im 
Kapitel "PLL Frequency Calculation" im User Manual.

Aus den Ausführungen im User Manual:

Pmin = 156MHz/(Fosc*2*M) mit Fosc 10MHz:
Pmin = 156/120
Pmin = 1,3

Pmax = 320MHz/(Fosc*2*M) mit Fosc 10MHz:
Pmax = 320/120
Pmax = 2,66

Der Wert von P muß zwischen 1,3 und 2,66 liegen.
Erlaubt ist da nur die 2.

Dietmar

Autor: Michael S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, danke für deine Antwort. Habe das mal geändert, habe über die 
Stelle, dass man Eins abziehen muss wohl hinweggelesen =)

Also:
#define PLLCFG_MSEL   (5<<0)  //==>6
#define PLLCFG_PSEL   (1<<5)  //==>2


Dummerweise ist meine Frequenz immernoch kleiner als die von meinem CAN 
Analyzer produzierte. Als Initialisierung meines BTR Registers nehme 
ich:
CANBit10k_60MHz 0x25C257

Sprich meine 60Mhz werden für das Sampeln nochmal durch 600 (0x256 + 1) 
geteilt. Eigentlich müssten jetzt 10k als Bitrate verwendet werden. 
(Laut Oszi allerdings nicht...) lt diesem ist meine Bitrate so um die 5k 
(VPBDIV = 1). Langsam werde ich kirre...

Kannst du mir bitte nochmal unter die Arme greifen?!

Gruss
Michael

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass anfangs mal den CAN weg. Einen normalen Timer auf Ausgang 
programmieren, um zu sehen was wirklich als Takt anliegt. Programmiertes 
Pinwackeln taugt dafür weniger.

Zunächst ohne PLL testen. Wenn das nicht zu 10MHz passt, ist die PLL 
unschuldig. Dabei ggf. VPBDIV durchprobieren, ob alle 3 Varianten 
(/1,/2,/4) so laufen wie sie sollen.

Wenn das alles passt, dann das gleiche mit PLL ausprobieren.

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael:

Was ist mit der PLL, war meine Vermutung richtig? Funktioniert die 
mittlerweile? Bei Keil habe ich einen Configuration Wizard in der 
Startup.s, in dem ich den PLL Multiplier und den PLL Divider beliebig 
einstellen kann. Aber das ist fatal, da, siehe User Manual, diese 
Einstellung strengen Grenzen unterliegt. Ich werde da in der 
Startup-Datei mal noch eine Plausibilitätsuntersuchung einfügen müssen.

Um die PLL zu testen, ist das Miniprogramm mit Pin toggeln nicht der 
richtige Weg: Die Programmabarbeitung findet nicht fest im cclk-Raster 
statt, wie man es von älteren Controllern ohne Pipeline wie 8085 oder 
8051 kennt, sondern ist auch von Flash Speicherzugriffen und Pipeline 
abhängig, siehe Beschreibung MAM Memory Acceleration Module.

Am besten installierst du einen Timer-Interrupt im 1ms-Takt (siehe z.B. 
Keil-Beispiel "Blinky IRQ"), installierst dort einen Zähler bis 1000 und 
toggelst eine LED oder Pin im Sekundentakt.

Nun zum CAN-Bus:
Mittlerweile habe ich selbst eine vollständig ausgereifte 
CAN-Bus-Applikation vorliegen, als Referenz.

Aus dem LPC User Manual wirst du nicht vollständig schlau, dort gibt es 
nur eine stark abgespeckte Beschreibung zum CAN-Controller. Philips 
bemerkt jedoch die Kompatibilität zum externen CAN-Controller-Baustein 
SJA1000, der auch von denen stammt. Lade dir mal das Datenblatt zu 
diesem Baustein herunter, dort findet man bessere Details zur 
Bitratenberechnung.

CANBit10k_60MHz 0x25C257 bedeutet im Detail, ins CAN Bit Timing Register 
CANBTR eingetragen:

Bei einem Quarz 10 MHz, sage ich mal, daß dieser Parametersatz für einen 
PLL Multiplier 6, also eine Prozessorclock 60 MHz, einen VPB Divider 1, 
also eine pclk von 60 MHz, gilt:

SAM = 0 (Sample Point, zunächst von untergeordneter Bedeutung)
TSEG1 = 5+1 = 6
TSEG2 = 2+1 = 3
SJW = 3+1 = 4 (zunächst von untergeordneter Bedeutung)
BRP = 257h = 599d --> Grundtakt Bitratenteiler = BRP+1 = 600d

Die Bitratenberechnung auf dem CAN-Bus, also die Bits, wie sie auf dem 
Oszilloskop aussehen, ist mit deinem Wert für das CAN Bit Timing 
Register wie folgt:

CAN_Bitrate = F(Quarz) * PLL Multiplier  VPB Divider  (BRP+1) / 
(TSEG2+1 + TSEG1+1 +1)

mit cclk = F(Quarz) * PLL Multiplier

CAN_Bitrate = cclk  VPB Divider  (BRP+1) / (TSEG2+1 + TSEG1+1 +1)

mit pclk = cclk / VPB Divider

CAN_Bitrate = pclk / (BRP+1) / (TSEG2+1 + TSEG1+1 +1)

CAN_Bitrate = 60 MHz / (599+1) / (2+1 + 5+1 +1)

CAN_Bitrate = 60 MHz / (600) / (3 + 6 +1)

CAN_Bitrate = 60 MHz / (600) / 10

CAN_Bitrate = 60 MHz / 6000

CAN_Bitrate = 10 kHz

Wie gesagt, für cclk 60 MHz, VPB Divider 1.

Wenn noch was unklar ist, bitte wieder melden, wenn auch noch so banal, 
damit habe ich überhaupt kein Problem. Notfalls kopiere ich dir mal 
Sequenzen aus der PLL Initialisierung.

Gruß und viel Erfolg:

Dietmar

Autor: Michael S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja du hattst recht, sorry dass ich jetzt erst schreibe, habe momentan 
Prüfungen..

Das zweite Problem war mein gekaufter Analyzer von CANHack.de, der kann 
keine 10kBits... dumme Sache.
mit 100k läuft das Programm zum Senden ganz gut..

Danke
Michael S

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.