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 CCS Technical Support

Trouble switching clock speed using Switch Statement

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



Joined: 09 Oct 2007
Posts: 62

View user's profile Send private message

Trouble switching clock speed using Switch Statement
PostPosted: Wed Dec 12, 2007 10:29 am     Reply with quote

I'm trying to adjust the oscillation speed through a menu on the fly using PIC16F690 / PCM 4.060. Here is a piece of the code.
Code:

printf("\n\rWhat would you like to change the INTERNAL oscillation speed to?\n\r\n\r");
                       printf("\n\r1)1Mhz\n\r");
                   printf("\n\r2)2Mhz\n\r");
                     
                       
                       OscAnswer = getc();
                       switch ( OscAnswer )
                       {
                         case 1:
                         {
                          #use delay(clock=1000000,int)
                          setup_oscillator( OSC_1MHZ );
                          ShowOscSpeed = getenv("CLOCK");
                          printf("\n\rOscillation speed is now %f hertz.", ShowOscSpeed);       //display Internal oscillation speed
                          OscSpeed = 1;  //OneMhz - Variable saved into eeprom and used to load 1Mhz oscillation speed upon restart of program
                          break;
                         }
                         case 2:
                         {
                          #use delay(clock=2000000,int)
                          setup_oscillator( OSC_2MHZ );
                          ShowOscSpeed=getenv("CLOCK");
                          printf("\n\roscillation speed is now %f hertz.", ShowOscSpeed);    //display Internal oscillation speed
                          OscSpeed = 2;  //TwoMhz - Variable saved into eeprom and used to load 1Mhz oscillation speed upon restart of program
                          break;
                         }
                       }

It will just show the 2Mhz value even if choose case 1 which is supposed to load the 1Mhz value. Any help would be greatly appreciated, and I hope I don't make anyone repeat anything. Thanks.
Ttelmah
Guest







PostPosted: Wed Dec 12, 2007 10:54 am     Reply with quote

Try sticking your own test in place (toggle a pin, and see what frequency you get), and see if the frequency is changing, rather than using 'getenv'. I don't think this can really 'cope' with a changeable clock. When I have used it, it always seems to just report the value defined in the 'top' clock definition (at the head of the file).

Best Wishes
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Wed Dec 12, 2007 12:05 pm     Reply with quote

Quote:

printf("\n\rWhat would you like to change the INTERNAL oscillation speed to?\n\r\n\r");
printf("\n\r1)1Mhz\n\r");
printf("\n\r2)2Mhz\n\r");

OscAnswer = getc();
switch ( OscAnswer )
{
case 1:

The getc() function is getting an ASCII number, but your switch-case
statement is switching on integer numbers. You need to convert
the ASCII input value to an integer, or you need to change your case
statements so they switch on ASCII values.


Quote:
case 1:
{
#use delay(clock=1000000,int)
setup_oscillator( OSC_1MHZ );
ShowOscSpeed = getenv("CLOCK");

The #use delay() statement affects all code that comes after it in
the program. It does not affect any lines of code that come before it.
Also, if you have another #use delay() statement a few lines lower
down (and you do), then that statement now controls all lines
that come after it in the program.
ThomasC



Joined: 09 Oct 2007
Posts: 62

View user's profile Send private message

PostPosted: Thu Dec 13, 2007 10:48 am     Reply with quote

PCM Programmer - I'm working out how to switch on ASCII as we speak.

But I have Switch statements here that seem to switch fine.

Code:

SelectionMenu();                                         //displays main menu
 
  while(1)
  {
    c = getc();                                            //Program's Selection Menu       
    putc(c);                                               //Displays key pressed
   
    switch(c)
     {
       case '1':
       printf("\n\n\n\r-Input / Output Voltages Menu-");
       break;
       case '2':
       printf("\n\n\n\r-Oscillation Speed Menu-");         //SwitchingFrequencyFunction(); 
       ShowSFrequency=getenv("CLOCK");                     //Set Switching Frequency variable equal to clock (oscillation) speed
       printf ("\n\r\n\rThe oscillation speed is %f hertz", ShowSFrequency);  //Report switching frequency
       printf ("\n\rWould you like to...");
       printf ("\n\r\n\r 1)Change the oscillation speed.\n\r");
       printf ("\n\r\n\r 2)Make no changes and return to the main menu.\n\r");
       
       answer = getc();   
       putc(answer);                                     //Shows user input 
          switch(answer)
            {
             case '1': printf("\n\rWhat would you like to change the INTERNAL oscillation speed to?\n\r\n\r");
                       printf("\n\r1)1Mhz\n\r");
                   printf("\n\r2)2Mhz\n\r");
                       printf("\n\r3)4Mhz\n\r");
                       printf("\n\r4)8Mhz\n\r");
                       
                       FreqAnswer = getc();
                       putc(FreqAnswer);
                       switch ( FreqAnswer )
                       {
                         case 1:
                         {
                          setup_oscillator( OSC_1MHZ );
                          #use delay(clock=1000000,int)
                          ShowSFrequency=getenv("CLOCK");
                          printf("\n\rOscillation speed is now %f hertz.", ShowSFrequency);       //display Internal oscillator frequency
                          SFrequency = 1;  //OneMhz;
                          break;
                         }
                         case 2:
                         {
                          setup_oscillator( OSC_2MHZ );
                          #use delay(clock=2000000,int)
                          ShowSFrequency=getenv("CLOCK");
                          printf("\n\rOscillation speed is now %f hertz.", ShowSFrequency);    //display Internal oscillator frequency
                          SFrequency = 2;  //TwoMhz;
                          break;
                         }
                       }


I noticed that I did not use aposthropes around case 1 and case 2. I placed them and and disabled the lines that switch the clock speed and each statement works. But as soon as I activate the statements it outputs garbage characters. I see why I need to translate the ASCII to integers. But why does it do that? That is strange.


WORKS
Code:

case '1':
{
printf("Case 1 loaded");
//setup_oscillator( OSC_1MHZ );
//#use delay(clock=1000000,int)
ShowSFrequency=getenv("CLOCK");
printf("\n\rOscillation speed is now %f hertz.", ShowSFrequency); //display Internal oscillator frequency
SFrequency = 1; //OneMhz;
break;
}
case '2':
{
printf("Case 2 loaded");
//setup_oscillator( OSC_2MHZ );
//#use delay(clock=2000000,int)
ShowSFrequency=getenv("CLOCK");
printf("\n\rOscillation speed is now %f hertz.", ShowSFrequency); //display Internal oscillator frequency
SFrequency = 2; //TwoMhz;
break;
}


DOESN'T WORK
Code:

case '1':
{
printf("Case 1 loaded");
setup_oscillator( OSC_1MHZ );
#use delay(clock=1000000,int)
ShowSFrequency=getenv("CLOCK");
printf("\n\rOscillation speed is now %f hertz.", ShowSFrequency); //display Internal oscillator frequency
SFrequency = 1; //OneMhz;
break;
}
case '2':
{
printf("Case 2 loaded");
setup_oscillator( OSC_2MHZ );
#use delay(clock=2000000,int)
ShowSFrequency=getenv("CLOCK");
printf("\n\rOscillation speed is now %f hertz.", ShowSFrequency); //display Internal oscillator frequency
SFrequency = 2; //TwoMhz;
break;
}
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Thu Dec 13, 2007 2:04 pm     Reply with quote

In this thread, I showed how to write code for a program that switches
between two oscillator speeds.
http://www.ccsinfo.com/forum/viewtopic.php?t=32758

There are more tips in this thread:
http://www.ccsinfo.com/forum/viewtopic.php?t=32903

The most important thing to know is that the CCS functions do not
automatically adjust for the current oscillator speed at run-time.
Most people don't need this capability and it would add a lot of overhead
to the functions. The ROM usage would increase. So if you want to
write a multi-frequency code, you have to do it yourself. See the
examples in the links above.
ThomasC



Joined: 09 Oct 2007
Posts: 62

View user's profile Send private message

PostPosted: Thu Dec 13, 2007 2:15 pm     Reply with quote

thanks i also found this thread that you posted in recently.


Ascii and Int
http://www.ccsinfo.com/forum/viewtopic.php?t=32975&highlight=input+output+voltage
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