CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

Trying to get the 4620's PLL to work with the internal clock

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
C Turner



Joined: 10 Nov 2003
Posts: 40
Location: Utah

View user's profile Send private message

Trying to get the 4620's PLL to work with the internal clock
PostPosted: Wed Apr 29, 2009 6:59 pm     Reply with quote

Ok, I've pulled out my hair for long enough.

I've searched the forms and can find nothing obvious, but I've not been able to figure out why I can't get the '4620 to run at 32 MHz using the internal clock. I've written "minimal" program that shows what is going on.

With the code below, I'm seeing the letter "J" at 2400 baud, about once-per-second. This is, in fact, exactly what I would expect if the clock is running at 8 MHz instead of 32 MHz.

If I add a little bit more to the program to display register values, I see the OSCCON contains 76H (which includes the IOFS bit) and that OSCTUNE contains 40H - both values that I would expect if I've programmed things correctly. If I look at an already-programmed part and read the fuse setting, I see that the appropriate byte contains 08H, just as is shown on the listing.

Nothing related jumped out as I skimmed over the errata for the 4620. What am I missing?

CT

P.S. I originally used "setup_oscillator(OSC_32_MHZ | OSC_INTRC)" but I got the same results, so I decided to set the registers directly.

Code:

CCS PCH C Compiler, Version 3.249, 32532               29-Apr-09 18:35

               Filename: C:\Program Files\PICC\projects\acp_preprocessor\test1a.lst

               ROM used: 126 bytes (0%)
                         Largest free fragment is 65410
               RAM used: 5 (0%) at main() level
                         6 (0%) worst case
               Stack:    1 locations

*
00000:  GOTO   0036
....................
.................... #include <18f4620.h>
.................... //////// Standard Header file for the PIC18F4620 device ////////////////
.................... #device PIC18F4620
.................... #list
....................
.................... //
.................... #fuses NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP,INTRC_IO,NOMCLR
.................... #use delay(clock=32000000, RESTART_WDT) // calibrate delays for clock speed - delays restart WDT
00004:  CLRF   FEA
00006:  MOVLW  06
00008:  MOVWF  FE9
0000A:  MOVF   FEF,W
0000C:  BZ    0032
0000E:  MOVLW  0A
00010:  MOVWF  01
00012:  MOVLW  BF
00014:  MOVWF  00
00016:  CLRWDT
00018:  DECFSZ 00,F
0001A:  BRA    0016
0001C:  DECFSZ 01,F
0001E:  BRA    0012
00020:  MOVLW  5E
00022:  MOVWF  00
00024:  DECFSZ 00,F
00026:  BRA    0024
00028:  NOP
0002A:  NOP
0002C:  CLRWDT
0002E:  DECFSZ FEF,F
00030:  BRA    000E
00032:  GOTO   007A (RETURN)
.................... #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, RESTART_WDT, BITS=8, PARITY=N)
.................... //
.................... //
.................... #byte OSC_CON = 0xfd3
.................... #byte OSC_TUNE = 0xf9b
.................... void main(void)
.................... {
00036:  CLRF   FF8
00038:  BCF    FD0.7
0003A:  CLRF   FEA
0003C:  CLRF   FE9
0003E:  MOVLW  70
00040:  MOVWF  FD3
00042:  MOVLW  40
00044:  MOVWF  F9B
00046:  MOVF   FD3,W
00048:  BCF    FB8.3
0004A:  MOVLW  33
0004C:  MOVWF  FAF
0004E:  MOVLW  22
00050:  MOVWF  FAC
00052:  MOVLW  90
00054:  MOVWF  FAB
00056:  MOVF   FC1,W
00058:  ANDLW  C0
0005A:  IORLW  0F
0005C:  MOVWF  FC1
0005E:  MOVLW  07
00060:  MOVWF  FB4
....................    OSC_CON =  0b01110010;      // 8 MHz, internal oscillator
00062:  MOVLW  72
00064:  MOVWF  FD3
....................    OSC_TUNE = 0b01000000;
00066:  MOVLW  40
00068:  MOVWF  F9B
....................    while(TRUE) {
....................       putc('J');
0006A:  MOVLW  4A
0006C:  CLRWDT
0006E:  BTFSS  F9E.4
00070:  BRA    006C
00072:  MOVWF  FAD
....................       delay_ms(250);
00074:  MOVLW  FA
00076:  MOVWF  06
00078:  BRA    0004
....................    }
0007A:  BRA    006A
.................... }
0007C:  SLEEP

Configuration Fuses:
   Word  1: 0800   NOIESO INTRC_IO NOFCMEN RESERVED
   Word  2: 1E1E   BROWNOUT NOWDT BORV21 PUT WDT32768
   Word  3: 0300   CCP2C1 PBADEN NOLPT1OSC NOMCLR RESERVED
   Word  4: 0081   STVREN NODEBUG NOLVP NOXINST RESERVED
   Word  5: C00F   NOPROTECT NOCPD NOCPB
   Word  6: E00F   NOWRT NOWRTD NOWRTC NOWRTB
   Word  7: 400F   NOEBTR NOEBTRB
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Wed Apr 29, 2009 9:28 pm     Reply with quote

This program works.
Code:
#include <18F4620.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP
#use delay(clock=32000000) 

//====================================
void main()
{

setup_oscillator(OSC_32MHZ | OSC_PLL_ON);   

while(1)
  {
   output_high(PIN_B0);
   delay_ms(500);
   output_low(PIN_B0);
   delay_ms(500);
  }     

}
C Turner



Joined: 10 Nov 2003
Posts: 40
Location: Utah

View user's profile Send private message

Trying to get the 4620's PLL to work with the internal clock
PostPosted: Thu Apr 30, 2009 10:22 am     Reply with quote

I see the problem: You *can't* turn on OSCCON bits 0 or 1 and expect it to work. In other words, "Primary Oscillator" should be enabled, and NOT "Internal Oscillator Block."

Somehow, if you wanted to use the "Internal Oscillator Block" with the PLL, I'd have thought one might turn it on.

Stupid me!

Thanks for the help, PCM,

CT
hobiadami



Joined: 17 Oct 2006
Posts: 35
Location: City of Concrete

View user's profile Send private message Visit poster's website ICQ Number

pin change
PostPosted: Thu Apr 26, 2012 3:18 pm     Reply with quote

can't I use the oscillator pins as I/O with this setup?

I've used the code above on real hardware just by changing the pin numbers to pin_a6 or a7 and didn't be able to blink a led connected to those pins.

I'm using 4.114
_________________
www.endtas.com
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Thu Apr 26, 2012 5:28 pm     Reply with quote

Post your small compilable test program.
hobiadami



Joined: 17 Oct 2006
Posts: 35
Location: City of Concrete

View user's profile Send private message Visit poster's website ICQ Number

code
PostPosted: Fri Apr 27, 2012 12:59 am     Reply with quote

Thanks for the reply,

The program is absolutely same as yours. I just changed the output pin. A6 and A7, didn't change anything. Other pins are okay. Only the oscillator pins don't blink the led. I've tested with a brand new 18F4620 as well.

Code:

#include <18F4620.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP
#use delay(clock=32000000) 

//====================================
void main()
{

setup_oscillator(OSC_32MHZ | OSC_PLL_ON);   

while(1)
  {
   output_high(PIN_A6);
   delay_ms(500);
   output_low(PIN_A6);
   delay_ms(500);
  }     

}

_________________
www.endtas.com
Ttelmah



Joined: 11 Mar 2010
Posts: 19260

View user's profile Send private message

PostPosted: Fri Apr 27, 2012 4:04 am     Reply with quote

Change to:
Code:

#include <18F4620.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP
#use delay(clock=32000000)

//====================================
void main(void) {

   setup_oscillator(OSC_32MHZ | OSC_INTRC);   

   while(TRUE) {
      output_high(PIN_A6);
      delay_ms(500);
      output_low(PIN_A6);
      delay_ms(500);
  }     
}


This is one of those nasty little 'compiler version' ones.
First, OSC_32_MHZ, includes the PLL_ON bit, Doesn't matter to duplicate it, but doesn't actually do anything.
However key is that on some compilers, the OSC_xxMHz settings, for the two PLL modes, don't have the select to say 'use the internal oscillator'. When the PLL is selected, the internal oscillator is not defined as the primary oscillator (oddity of the chip...), so if you use them without specifying this, they switch to 'OSC_NORMAL', which then doesn't work, and the chip stops. Hence then your pin doesn't toggle....

Best Wishes
hobiadami



Joined: 17 Oct 2006
Posts: 35
Location: City of Concrete

View user's profile Send private message Visit poster's website ICQ Number

:)
PostPosted: Sat Apr 28, 2012 1:35 pm     Reply with quote

Thanks Thelmah, this solved it.
_________________
www.endtas.com
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group