PLL LMX2326 mit BASCOM?

Daniel

Neues Mitglied
16. Feb. 2009
3
0
0
Sprachen
Hallo Kollegen,

ich suche Unterstützung bei der Programmierung eines mittlerweile doch sehr verbreiteten PLL Chips von NATIONAL, dem LMX2326. Ich habe einen ATMEGA32 mit dem ich den Chip per Knopfdruck oder beim Einschalten auf eine bestimmte Frequenz einstellen möchte. Dazu sind 3 Binärfolgen a 21 Bit zu übertragen, 2 für die Teilerverhältnisse (R und N Counter) und eine zur Einstellung von bestimmten Funktionen. Ich bin leider kein großer Programmierer und habe mich daher an den LM7001 Thread in diesem Forum angelehnt. Im Prinzip ist das ja immer die selbe Geschichte.
Ein Datenblatt zum LMX2326 gibt es hier:
http://www.national.com/mpf/LM/LMX2326.html

Ich habe eine Steuersoftware von NATIONAL (Codeloader2) mit der ich über den PC die gewünschte Frequenz einstellen kann. Es gibt eine Funktion mit der man sich die übertragenen Bit-Folgen anzeigen lassen kann.
In meinem Fall wären das:


R value: 100010000000010100000
N value: 000000001111101000001
F value: 010000000110000010011

MSB steht links, LSB rechts.
Ich übertrage zuerst F, dann die R und N-Teiler wie im Datenblatt angegeben.
Als Variable habe ich ein "long" eingesetzt und die überschüssigen 11 Bit auf 0 gesetzt. Das ist zwar nicht sehr elegant, sollte aber funktionieren.

Mein Code sieht so aus:

$regfile = "m32def.dat" 'defineAVR Mega 32
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 8000000 'Crystal frequency

$baud = 9600 'baudrate for RS232

'define ressources
Pll_data Alias Portb.0 'PLL_CNTL data
Pll_clk Alias Portb.1 'PLL_CNTL clock
Pll_le Alias Portb.2 'PLL_CNTL load enable



Dim R As Long
R = &B00000000000100010000000010100000 '11 bits set to 0 for "long" + 21 bit value for R-Counter)


Dim N As Long
N = &B00000000000000000001111101000001 '11 bits set to 0 for "long" + 21 bit value for N-Counter)


Dim F As Long
F = &B00000000000010000000110000010011 '11 bits set to 0 for "long" + 21 bit value for Function-latch)


Config Portb.0 = Output 'define PB0 as output
Config Portb.1 = Output 'define PB1 as output
Config Portb.2 = Output 'define PB2 as output
Config Portd.6 = Input 'define PD6 as input


Waitms 100 ' wait


Reset Pll_data ' Reset Databus
Reset Pll_clk ' Reset Databus
Reset Pll_le ' Reset Databus

Portd.6 = 1 ' internal pull-up resistor for push-button

Waitms 100 ' wait



Main:

Do
Debounce Pind.6 , 0 , Pr , Sub ' debounce push-button
Loop



Pr:


Pll_le = 1 ' set LE high
Waitms 100
Pll_le = 0 ' set the latch enable line low prior to sending data

Shiftout Pll_data , Pll_clk , F , 1 , 32 , 50 ' send F data


Waitms 100

Pll_le = 1 ' set the latch enable line high--> transfer data
Waitms 100

Pll_le = 0 ' set the latch enable line low prior to sending data

Waitms 100

Shiftout Pll_data , Pll_clk , R , 1 , 32 , 50 ' send R data


Waitms 100

Pll_le = 1 ' set the latch enable line high--> transfer data
Waitms 100
Pll_le = 0 ' set the latch enable line low prior to sending data

Waitms 100

Shiftout Pll_data , Pll_clk , N , 1 , 32 , 50
' send N data
Waitms 100

Pll_le = 1 ' set the latch enable line high--> transfer data
Waitms 100
Pll_le = 0 ' set the latch enable line low (End data transfer)




Return
End



Die verrutschten Zeilenumbrüche und die englischen Kommentare sind sind hoffentlich nicht zu verwirrend.
Es gibt im Net jede Menge Code Schnipsel in C (z.B. http://www.thegleam.com/ke5fx/stellex.htm) oder asm aber ich habe die Schaltung bisher leider noch nicht zum Laufen bekommen. Die PLL reagiert nicht. Die Hardware scheint in Ordnung zu sein - sagt mein Oszi...

Ich hoffe es kann mir jemand weiterhelfen.

Daniel
 
Hallo Daniel,

mal sehen, was ich als Rookie vom µC bzw. BASCOM verstanden habe. Du setzt PLL-Aliase , arbeitest aber mit den Portx weiter. Könnte da der Fehler liegen?

Ich habe Dein Programm nicht getestet.


Gruß,

Michael
 
Hallo Daniel,

in der kürze der Zeit habe ich keine Lösung für Dich aber mir sind ein paar Dinge aufgefallen die möglicherweise zur Lösung beitragen können. Ich schreibe Dir die Punkte hier mal in unsortierter Reihenfolge zusammen.

[1] Load Enable CMOS Input:
Ich würde bei Deinem Baustein prinzipiell dafür sorgen, dass LE auf HIGH steht und nur für den Zeitraum der Kommunikation auf LOW gezogen wird. In Deinem Code setzt Du nach der Initialisierung LE zunächst auf LOW, nimmst es dann für 100 ms auf HIGH und danach wieder LOW.
Ich würde also nach der Initialisierung des PIN's diesen bereits auf HIGH setzen und nachdem die Daten zur PLL geshiftet sind, würde ich auch LE wieder auf HIGH setzen und dort belassen.
Mir erscheint in Deinem Code der High-Impuls zu beginn der Datenübertragung eher problematisch!


[2] 21Bit versus long:
Fassen wir zunächst Fakten zusammen:
- Für "R Counter" , "N Counter", "Function Latch" und "Initialization" werden immer 21 Bits zur PLL übertragen.
Du verwendest eine long-Variable mit 32 Bit für die Übertragung der Bitsequenzen.
- Es wird immer das MSB zuerst zur PLL übertragen.
Damit erscheint mir das Befüllen der Variable in Deinem Programm falsch. Die beiden Control-Bits sind das letzte, was Du zur PLL schieben darfs. OK, zugegeben, Du schiebst schon über MSB die Daten zur PLL. Die PLL benötigt aber nur 21 Bits und Du schiebst 32 Bits rüber. Hmmmm, das weiß ich nicht, ob die PLL das mag.

Also:
Zunächst sorgen wir dafür, dass die Bits richtig im long liegen. Wenn Du es beim MSB schieben belassen möchtest (Daten liegen gegenüber Datenblatt gespiegelt in der Variable) dann übernehme ich Dein Beispiel, füge aber die übrigen NULL-Stellen nicht oben (im MSB Bereich) ein sondern unten im LSB Bereich. Damit würde die Vorinitialisierung so aussehen:

Code:
R = &B100010000000010100000[B]00000000000[/B]
N = &B000000001111101000001[B]00000000000[/B]
F = &B010000000110000010011[B]00000000000[/B]


[3] Schieben
Wie schon geschrieben schiebst Du 32 Bits und ich vermute, das nimmt Dir die PLL übel.
Somit würde ich wie folgt shiften:
Code:
Shiftout Pll_data , Pll_clk , variable , 1 , [B]21[/B] , 50

Ein anderer Lösungsvorschlag wäre, die Daten so zu definieren, wie sie im Datenblatt abgebildet sind, um die Bits besser zu lesen sind. Einfach MSB und LSB umdrehen und mit dem Shift 21 Bits über das LSB rausschieben:

Code:
R = &B00000000000000010100000000100010
N = &B00000000001000001011111000000000
F = &B00000000001100100000110000000100

Somit würde ich wie in diesem Fall wie folgt shiften:
Code:
Shiftout Pll_data , Pll_clk , variable , 3 , 21, 50


[4] Timing
Du wartest 50 µsec zwischen dem einzelnen Schiebe-Operationen. Gemäß Datenblatt kann die PLL 50 ns. Ich bin der Meinung, dass Du eigentlich bei 8MHz Clock auf die 50 µsec verzichten kannst da du bei einem Clock von 8 MHz 125 ns für jeden Takt benötigst und Du damit schon fast Faktor 3 größer bist. Bedeutet, Du kannst volle Kanne die Daten mit Deinem 8 MHz Mega zur PLL "blasen".


So, das wars im Großen und Ganzen. Damit sollte es eigentlich tun! Mehr fällt mir zunächst auch nicht ein. Meiner Meinung nach besteht der größte Fehler in der falschen Verwendung des Shift und dem Senden von zu vielen Bits zur PLL. Weiter würde ich mir das Handling der LE-Leitung nochmals ansehen und optimieren.

Viel Glück, viel Erfolg,

Markus
 
Gut, gut, ich lese ja weiter...
 
Hallo Markus,

vielen Dank für die Hilfe. Ich habe die Schaltung mittlerweile in den Griff bekommen. Das Problem war die Vorinitialisierung, da habe ich geschlafen. Ich hatte die Anzahl der gesendeten Bits von 32 auf 21 vorher schon reduziert.
Shiftout ist wirklich eine sehr praktische Routine in Bascom für solche Geschichten.

Bezüglich der LE-Leitung ist die PLL unkritisch. Meine Lösung mit dem kurzen Impuls vor dem Datentransfer funktioniert. Ich habe auch die "wait" Zeiten im Programm deutlich reduzieren können. Ein wenig problematisch sind die eingestreuten "Schmutzsignale" des ATMEGA in die PLL. Das Ausgangspektrum wird deutlich besser, wenn die Verbindung zum AVR nach gesetzter PLL abgezogen wird. Auch nachdem ich das Fusebit für den Taktoszillator auf 1 MHz intern gesetzt habe ist das nicht wirklich besser geworden.
Der Aufbau ist aber im Moment noch ein richtiger Kabelsalat und ich hoffe nach dem Einbau, bei optimierten Masseverhältnissen, ein verbessertes Ausgansspektrum zu bekommen.
Wenn Interesse besteht, könnte ich das kleine Programm hier einstellen. Beim "googeln" hatte ich vorher in BASCOM nichts für den LMX2326 gefunden.
Ich werde mittelfristig noch einen DDS Baustein von AD über den ATMEGA ansprechen müssen und es wäre durchaus möglich, daß ich dann nochmal auf dieses nette Forum zurückkomme ;-)

Gruß

Daniel
 
Hallo Daniel,

Interesse an Beispieimplementierungen, Codes und Projektn besteht immer. Also her damit, wenn es etwas fertiges und funktionierendes gibt.

Grüße,
Markus
 
Hallo Markus,

ich habe den Code noch etwas geputzt und kommentiert.
Die Zeilenumbrüche sind etwas komisch bei der Darstellung im Forum
aber ich denke es ist klar was gemeint ist.

Viele Grüße und danke nochmal für deine Hilfe.

Daniel


'Stellex_load.bas (for ATMEL ATmega32)
'************************************************************************************************
' This BASCOM code loads the following parameters for a NATIONAL LMX2326 PLL at initial power up:
' R counter=40, N counter= 2000,
' With 10 MHz ref. and phase detector frequency 250kHz the output frequency is set to 500 MHz
' The popular STELLEX synthesizer will be set to 2000MHz with 1 MHz steps
'************************************************************************************************

$regfile = "m32def.dat" 'define AVR Mega32
$swstack = 32
$hwstack = 32
'$crystal = 8000000 'set Crystal frequency (no need here, I use the internal 1MHz oscillator)

$baud = 9600 'baudrate for RS232

'define ressources
Pll_data Alias Portb.0 'PLL_CNTL data
Pll_clk Alias Portb.1 'PLL_CNTL clock
Pll_le Alias Portb.2 'PLL_CNTL load enable



Dim R As Long
R = &B10001000000001010000000000000000 '21 bit value for R Counter + 11 bits set to 0 for "long")


Dim N As Long
N = &B00000000111110100000100000000000 '21 bit value for N Counter + 11 bits set to 0 for "long")


Dim F As Long
F = &B01000000011000001001100000000000 '21 bit value for Function-latch +11 bits set to 0 for "long")


Config Portb.0 = Output 'set PB0 = output (Pin 1)
Config Portb.1 = Output 'set PB1 = output (Pin 2)
Config Portb.2 = Output 'set PB2 = output (Pin 3)
Config Portd.6 = Input 'set PD5 = input (Pin 19)

Waitms 100 ' wait


Reset Pll_data ' Reset Databus
Reset Pll_clk ' Reset Databus
Reset Pll_le ' Reset Databus

Portd.6 = 1 ' internal pull-up resistor for push-button (OPTION)

Waitms 100 ' wait

Main:
---------------------------------------------------------------------------
'OPTIONAL PUSH BUTTON TO SET FREQUENCY

'Do
'Debounce Pind.6 , 0 , Pr , Sub ' debounce push-button, if you need one...
'Loop
---------------------------------------------------------------------------
Pr:

Pll_le = 1 ' set the latch enable line high
Waitms 100
Pll_le = 0 ' set the latch enable line low prior to sending data

Shiftout Pll_data , Pll_clk , F , 1 , 21 , 50 ' send F data
Waitms 5
Pll_le = 1 ' set the latch enable line high--> transfer data
Waitms 10
Pll_le = 0 ' set the latch enable line low prior to sending data
Waitms 5

Shiftout Pll_data , Pll_clk , R , 1 , 21 , 50 ' send R data
Waitms 5
Pll_le = 1 ' set the latch enable line high--> transfer data
Waitms 10
Pll_le = 0 ' set the latch enable line low prior to sending data
Waitms 5

Shiftout Pll_data , Pll_clk , N , 1 , 21 , 50 ' send N data
Waitms 5
Pll_le = 1 ' set the latch enable line high--> transfer data
Waitms 10
Pll_le = 0 ' set the latch enable line low (End data transfer)

Pll_data = 0

Return
End
 
Hallo Daniel,

herzlichen Dank für Deinen Beitrag. Von mir noch ein kleiner Tipp:

Schau Dir mal den Beitrag
http://www.avr-praxis.de/forum/showthread.php?t=281
hier im Forum zum Thema Syntax-Highlightning an. Man hat die Möglicgkeit Code als soclehn mit dem #-Button im Edit-Fenster zu kennzeichnen. Damit wird ein Beitrag leichter lesbar.

z.B. so:

Code:
BlaBla:
    Bla = bla
Return:

Es wird damit gleich übersichtlicher!

Grüße,
Markus
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)