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
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