Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

PLL WITH PIC AND TSA5511

Status
Not open for further replies.

savnik

Member
I have this code and i want to go up the 255 but i don't know

-- ----------------------------------- mhz up/down--------------------
procedure mhz is -- 2--
pll
hd44780_line1
hd44780 = "s" hd44780 = "e" hd44780 = "t" hd44780 = " "
hd44780 = "M" hd44780 = "H" hd44780 = "Z" hd44780 = " "
if down then potin = potin - 1 end if -- down
if up then potin = potin + 1 end if -- up
if potin < 0 then potin = 0 end if
eerste = 0 + potin
if eerste >= 0 & eerste < 100 then derde = 0 end if
if eerste > 99 & eerste < 200 then derde = 1 end if
if eerste > 199 & eerste <= 255 then derde = 2 end if
delay_100ms (1)
end procedure
 
I think you want to convert a binary value in the range [0..255] into three decimal digits. Is this correct?

Method 1
Divide by 100. Quotient is the most significant digit
Divide Remainder by 10. Quotient is the tens digit.
Remainder is the units digit.

Method 2
Create three tables of 256 bytes each with the appropriate digits.
The first table has the hundres digit, the second table has the tens digit, and third has the units digit.

You could save one table with the original if-then-else construction in the original post.

Method 3
Do the range check in the original post
Subtract 100*digit from the original number
Divide the result by 10 (A divide by 10 is easier than a general purpose divide)
As in method 1 the quitient is the tens digit and the remainder is the units digit.

There may be other methods, and shortcuts. The journey is half the fun of discovery.
 
So what are you asking?

How to make a PLL cover that frequency range?
Are you sure it is even possible? I guess it is.

You certainly don't expect the circuit to actually work at that frequency on a breadboard do you?

I see two RF inputs on the chip and I've no idea what working from 0-255 Mhz actually means.

Can you post a schematic of what you are talking about?

You say it is working, so you must be able to send and receive data on the I2C bus, but there was no hint of that in the original post.
 
I still do not understand the problem. Is the problem that you cannot display the frequency on the LCD outside of the 75 to 118 MHz. range or is the problem that you cannot program the part via the I2C port to operate outside that range?
 
Papabravo said:
I still do not understand the problem. Is the problem that you cannot display the frequency on the LCD
No
I want to control a vco 440-470 mhz with this source code which i have , but i can't because the hi frequency , which goes the pll is 255 mhz.( a byte value in the range 0..255)
 
OK, but the source code you posted has no meaning because I don't know what you think it is doing. It appearts to be incrementing and decrementing a byte variable. This byte variable may or may not be sent over the I2C bus, along with some addressing information, to control the divider in the PLL.

What follows is upper case yelling -- I know that

POST A SCHEMATIC DIAGRAM OF THE CIRCUIT SO WE CAN TELL WHAT YOU ARE TRYING TO DO.
 
-- includes...
include 16f84_4
include jlib
include hd447804
include i2c

const byte tsa5511 = 0b_1100_000 -- tsa5511 I2C adress

-- ------- pushs buttons --- & light ----------------------------
var volatile bit menu is pin_b4
var volatile bit set is pin_b5
var volatile bit up is pin_b6
var volatile bit down is pin_b7

pin_b4_direction = input -- menu button
pin_b5_direction = input -- set button
pin_b6_direction = input -- up button
pin_b7_direction = input -- down button

-- --------------------------------------------------------------
var byte invoer , flow , fhi , rlow , rhi , qlow , qhi
var byte dummy , eerste, tweede , derde -- tbv setfreq
var byte step , potin , potin1 , teller -- tbv setfreq
var byte lamp -- leds status
var byte cp , pll_setting -- pll

-- ---------------------------------------------------------------
procedure intro is -- INTROTEXT

HD44780_line1
hd44780 = " " hd44780 = " " hd44780 = " " hd44780 = "i"
hd44780 = " " hd44780 = "o" hd44780 = "s" hd44780 = " "
hd44780 = " " hd44780 = " " hd44780 = "v" hd44780 = "v"
hd44780 = "a" hd44780 = " " hd44780 = " " hd44780 = " "
HD44780_line2
hd44780 = " " hd44780 = " " hd44780 = " " hd44780 = " "
hd44780 = " " hd44780 = "F" hd44780 = "M" hd44780 = " "
hd44780 = "P" hd44780 = "L" hd44780 = "L" hd44780 = " "
hd44780 = " " hd44780 = " " hd44780 = " " hd44780 = " "
delay_2s
hd44780_clear
end procedure -- INTROTEXT
-- ---------------------------------------------------------------
procedure pll is
HD44780_line2
print_decimal_1( hd44780 , derde , " " )
print_decimal_2( hd44780 , eerste , "0" )
hd44780 = "."
print_decimal_1( hd44780 , tweede , "0" )
hd44780 = " " hd44780 = "M" hd44780 = "H" hd44780 = "Z"
i2c_write_2 ( tsa5511 , rhi , rlow )

delay_10ms
end procedure

-- ***************************************************************
-- ***************************************************************
Procedure Mul16x8U(byte in out Aa0, byte in out Aa1, byte in out Aa2, byte in Ba0) is
Var byte tempb0,tempb1,loopcount
const _C = 0
Aa0 = Aa1 -- Right justify ==> Left justify
Aa1 = Aa2
assembler
local LOOPUM1608A, LUM1608NAP, LOOPUM1608, LUM1608NA

CLRF Aa2 -- clear partial product
MOVF Aa0,W
MOVWF TEMPB0
MOVF Aa1,W
MOVWF TEMPB1
MOVLW 0x08
MOVWF LOOPCOUNT
LOOPUM1608A: RRF Ba0, F
BTFSC STATUS,_C
GOTO LUM1608NAP
DECFSZ LOOPCOUNT, F
GOTO LOOPUM1608A
CLRF Aa0
CLRF Aa1
RETLW 0x00
LUM1608NAP: BCF STATUS,_C
GOTO LUM1608NA
LOOPUM1608: RRF Ba0, F
BTFSS STATUS,_C
GOTO LUM1608NA
MOVF TEMPB1,W
ADDWF Aa1, F
MOVF TEMPB0,W
BTFSC STATUS,_C
INCFSZ TEMPB0,W
ADDWF Aa0, F
LUM1608NA: RRF Aa0, F
RRF Aa1, F
RRF Aa2, F
DECFSZ LOOPCOUNT, F
GOTO LOOPUM1608
RETLW 0x00
end assembler
end procedure

-- ----------------------------------------------------------------------
procedure reken is
-- eerste (MHz) x 10, dan tweede (kHz) erbij optellen
-- dan resultaat x2 en naar pll
flow = eerste -- flow = MHz'en
mul16x8u ( fhi, flow ,dummy, 0x0A ) -- eerste x 10

-- --- tweede + f (hi, low) = r(hi,low) ---------------------------------
assembler -- khz'en optellen bij
clrf rlow -- resultaat van mul16x8u
clrf rhi -- -----------------------
movf flow , w
addwf tweede, w
movwf rlow
--
movf fhi, w
btfsc status , 0
addlw 0x01
--
addwf dummy, w
movwf rhi
end assembler
mul16x8u ( dummy , rhi, rlow , 0d02 ) -- mul16x8u x 2
end procedure

-- ++++++++++++++++++++++++++++++++++++freq saven in eeprom++++++++++
procedure saved is -- 5 --
eeprom_put ( 0x01 , derde )
eeprom_put ( 0x02 , tweede )
eeprom_put ( 0x03 , eerste )
eeprom_put ( 0x04 , cp )

reken pll delay_10ms(5)
teller = 5
end procedure
-- ----------------------------------- mhz up/down--------------------
procedure mhz is -- 2--
pll
hd44780_line1
hd44780 = "s" hd44780 = "e" hd44780 = "t" hd44780 = " "
hd44780 = "M" hd44780 = "H" hd44780 = "Z" hd44780 = " "
if down then potin = potin - 1 end if -- down
if up then potin = potin + 1 end if -- up
if potin < 0 then potin = 0 end if
if potin > 255 then potin = 255 end if
eerste = 0 + potin
if eerste >= 0 & eerste < 100 then derde = 0 end if
if eerste > 99 & eerste < 200 then derde = 1 end if
if eerste > 199 & eerste <= 255 then derde = 2 end if
delay_100ms (1)
end procedure
-- ------------------------------------ khz up/down-------------
procedure khz is -- 1 --
pll
hd44780_line1
hd44780 = "s" hd44780 = "e" hd44780 = "t" hd44780 = " "
hd44780 = "k" hd44780 = "H" hd44780 = "Z" hd44780 = " "
if down then potin1 = potin1 - 1 end if -- down
if up then potin1 = potin1 + 1 end if -- up
if potin1 > 9 then potin1 = 9 end if
tweede = potin1
delay_100ms (1)
end procedure
 

Attachments

  • com_pll.jpg
    com_pll.jpg
    75.8 KB · Views: 4,877
  • 5511s.gif
    5511s.gif
    42.4 KB · Views: 4,781
Here is what I see:

procedure pll calls procedure i2c_write_2 which writes 2 byte values contained in rhi and rlow into the pll.

procedure pll is called at the beginning of procedures mhz and khz

procedures mhz and khz modify variables potin, eerste, and derde. What I cant figure out is how these variables affect rhi and rlow.

I see where there is a multiply calculation involving rhi and rlow

My questions are:
Why are you writing to the PLL, via the I2C port, at the beginning of the routines mhz and khz. It would seem logical to me that you would want to write to the PLL, via the I2C port, after you made a change in the variables potin, eerste, and derde.

Also on your diagram where does the 440-470 MHz VCO come in and what is your reference frequency?
 
Since you got this stuff off the internet, I'd like to ask a few more questions, and offer some additional observations.

Did you get the datashett for the TSA5511?
Do you understand how the part works?

The minimum input frequency is 64 MHz. -- not 0!
The drawing does not indicate the reference frequency you are using. If you are using a 3.2 MHz. crystal, then your reference frequency is 6250 Hz., and your minimum frequency step will be 50 Kz. To increase the frequency by 1 Mhz., you need to increase the value of the divisor by twenty(20).

In order for the device to control the VFO via pins PD and UD you need to figure out what the divisor should be.

For 440 MHz. you would apply the fixed divisor of 8 to get 55 Mhz. Now you ask what divisor should I apply to 55 Mhz. to ge the reference frequency of 6250 Hz., and the answer is 8800 decimal. This number must be sent over the I2C port as part of a three byte transaction. This number is obviously bigger than one byte, so no one byte quantity can work at that frequency.

For 470 MHz. you would apply the fixed divisor of 8 to get 58.75 Mhz. Now you ask what divisor will divide 58.75 Mhz. down to 6250 Hz., and the answer is 9400 decimal.

To cover that band takes 600 steps [8800..9400] and surprise surprise
Code:
(470 - 440)/600 = 0.05 Mhz = 50 kHz. = 50000 Hz.
Isn't that amazing!

In order to completely program the part you need to send a total of five bytes including the address. It appears that you are only sending three including the address, and relying on its default behavior for the rest. To rely on default behavior is really a very poor idea. Would you program a PIC without giving the configuration word a value?

By the way, I have never seen a jal program before, but I was able to get the sense of what was going on. It was sure an improvement over the original post.

If I were you I wouldn't waste any more time with that misbegotten code -- I'd start over.
 
Well OK, from your initial post I thought you were trying to control a VCO from DC(0 frequency) to 255 MHz. This was a mistaken impression on my part. It still does not explain what address byte is written to the I2C port along with the values of rhi and rlow, which I'm guessing correspond to a divisor value. How the values of rhi and rlow are established is beyond me at the moment, but I know what they have to be for 440-470 Mhz at the RF input and a 3.2 Mhz crystal.

Are you able to capture, with a scope, the transactions on the I2C bus? This would be a great clue to what is going on.
 
I looked on both pages and did not see a schematic diagram on either one.
 
Status
Not open for further replies.

Latest threads

New Articles From Microcontroller Tips

Back
Top