View previous topic :: View next topic |
Author |
Message |
scottc
Joined: 16 Aug 2010 Posts: 95
|
setup_oscillator pic18f26k20 pll |
Posted: Tue Mar 01, 2011 6:49 pm |
|
|
Hi, I am using a PIC18F26K20 running at 16Mhz from the internal oscillator. Code is working fine. My issue is that bit 6 of the osctune register is not set to 1 to enable the 4x pll, so I am unable to run the part at its full clock speed of 64Mhz. CCS VER 4.116 Compiler.
For clarity I use the following code to configure the part
Code: |
#use delay (INTERNAL=64MHZ)
setup_oscillator(OSC_64MHZ);
|
The #define for setup_oscillator from the .h file is
Code: | #define OSC_64MHZ 0x4070
|
Looking at the Osccon register it reads 7C, so the internal osc is running at 16 MHz.
The osctune register reads 40, bit 6 of this register is 0. I believe it should be 1 ?
Thanks Scott |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Mar 02, 2011 5:41 pm |
|
|
Post a little LED blinking program with all the required lines for compilation.
Then I can just drop it into MPLAB and look at it.
It must have the #include for the PIC, #fuses, #use delay(), and main().
Test the program and verify that it fails before you post it.
Also tell us if this is a Proteus project or are you testing it in real
hardware ? Are you testing this in Debug mode or in Release mode ? |
|
|
scottc
Joined: 16 Aug 2010 Posts: 95
|
|
Posted: Wed Mar 02, 2011 8:00 pm |
|
|
Hi PCM,
I will code up something for you to look at. I dont use Proteus but real
hardware with either the PCW debugger or MPLAB. I pulled my code into
mplab and looked at the sfr's that control the Osccon and Ostune registers
and they display the same as in the CCS debugger, though mplab seems to have a problem updating those SFR's
I also looked fairly closely at the microchip spec sheet. I believe the
code should work, but the osctune register looks to be where the issue is.
Back in a bit with some code.
Thanks Scott |
|
|
scottc
Joined: 16 Aug 2010 Posts: 95
|
|
Posted: Wed Mar 02, 2011 8:35 pm |
|
|
Hi Pcm some code, to try.. works ok this end with hardware but 4x
pll is not enabled. Using CCS VER 4.116
Thanks for your help
Scott
Code: |
#include <main.h>
#use delay (INTERNAL=64MHZ) //For Use with Internal Oscillator
#USE FAST_IO(A)
#USE FAST_IO(B)
#USE FAST_IO(C)
#BYTE port_a = 0xF80 //Port Address for 18F26K20 Part
#BYTE port_b = 0xF81
#BYTE port_c = 0xF82
#Define Led Pin_C2 //Led
Void blinkaled (void)
{
Output_High(led);
delay_ms(500);
Output_Low(led);
delay_ms(500);
}
void main(void)
{
set_tris_c(0b11000000); //Port C I/O Config
setup_oscillator(OSC_64MHZ ); //Internal Oscillator set for 16Mhz with 4x pll
//Note OSCTUNE REG = 40, bit 6 = 0 believe it should be 1 for 4x pll
//OSCCON REG = 7C ..Looks OK !
while(true)
{
blinkaled();
}
}
|
Code: |
//# MAIN.H File
#include <18F26K20.h>
#device adc=16
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES NOFCMEN //Fail-safe clock monitor disabled
#FUSES NOIESO //Internal External Switch Over mode disabled
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOPBADEN //PORTB pins are configured as digital I/O on RESET
#FUSES NOLPT1OSC //Timer1 configured for higher power operation
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode) |
|
|
|
scottc
Joined: 16 Aug 2010 Posts: 95
|
|
Posted: Wed Mar 02, 2011 8:37 pm |
|
|
I tested in PCW both with ICD=True and release mode, results are the
same... 4x pll not working. On this particular part the pll should enable
for only 8Mhz and 16Mhz, resulting in a internal clock of 32Mhz, 64Mhz
--edited to update info ----
PCM one other thing I noticed is even though I use a internal delay of 64Mhz The blink rate of the led seems to be ok, i.e of 1 second. This
is kind of curious because the internal clock is running at 16Mhz per the
config bits in the osccon register. I would think since the delay is set to
64Mhz the timing of the blinking led would be way off but not 100% sure
?
Thanks Scott |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Mar 02, 2011 11:37 pm |
|
|
Quote: | The osctune register reads 40, bit 6 of this register is 0. I believe it should be 1 ? |
I don't understand your statement above. You say OSCTUNE reads 0x40
but then you say bit 6 is 0. Those are contradictory statements.
0x40 = 0b01000000 = 0100 0000 = bit 6 is set to 1
I compiled your program with vs. 4.116 and I got this output in the
.LST file. It shows that OSCTUNE is set to 0x40, which means the
PLLEN bit is set = 1. I don't see what the problem is.
Code: |
.................... setup_oscillator(OSC_64MHZ ); //Internal Oscillator set for 16Mhz with 4x pll
0007C: MOVLW 70
0007E: MOVWF FD3 // OSCCON
00080: MOVLW 40
00082: MOVWF F9B // OSCTUNE
00084: MOVF FD3,W |
|
|
|
scottc
Joined: 16 Aug 2010 Posts: 95
|
|
Posted: Thu Mar 03, 2011 12:16 pm |
|
|
PCM, You are 100% right, I think I must of had a rough day or something
cant see the forest for the trees
So the PLL apears to be Ok.
Thanks for the sanity check
Scott |
|
|
|