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

My First PIC project 12f family ABC...
Goto page 1, 2  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
uri



Joined: 24 Jan 2014
Posts: 11

View user's profile Send private message

My First PIC project 12f family ABC...
PostPosted: Fri Jan 24, 2014 2:16 am     Reply with quote

I'm sorry I lied! I don't know my ABC's. I think I don't know how to combine two applications for the following c file. When I checked the output pins only PIN_A1 in the void main application reads high, the rest read low despite the void fan application that comes after... Thank you, pls help.
Code:

#include <12F683.h>
#device adc=10
#use delay(clock=8000000)

#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO
#FUSES NOCPD //No EE protection
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOMCLR //Master Clear pin enabled / disabled
#FUSES PUT //Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled

   //--- set up PWM and timer
   //--- see spreadsheet. At 8Mhz is 16khz with resolution of 500 steps...


void main() {

   setup_oscillator(OSC_8MHZ);
   output_low(PIN_A1);

   while (TRUE) {
      delay_us(22);
      output_toggle(PIN_A1);
   }
}

void fan()
{
long   value=0;

   setup_adc_ports(sAN3|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_16);
   set_adc_channel(3);    //read channel 3
   delay_us(10);

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_4,24,1); //24+1*4 resoluzion pwm
   
   setup_ccp1(CCP_PWM);
   setup_comparator(NC_NC);
   setup_vref(FALSE);
   
   setup_oscillator(OSC_8MHZ);                                     

   // TODO: USER CODE!!
 
while (true)
   {
     value=(read_adc()*25)/256; // 10 bits
      delay_ms(500);
      set_pwm1_duty(value);  //value must be long
      delay_ms(500);
   }


}
Ttelmah



Joined: 11 Mar 2010
Posts: 19520

View user's profile Send private message

PostPosted: Fri Jan 24, 2014 3:20 am     Reply with quote

fan is never called, so how is it ever going to happen?...

You need (minimum changes only):
Code:

void fan(); //A function _must_ be declared, or a prototype declared
//before it can be called. This is the prototype

void main() {

   setup_oscillator(OSC_8MHZ);

   fan(); //call the function

   //You will never get here, since the function never exits.
   output_low(PIN_A1);

   while (TRUE) {
      delay_us(22);
      output_toggle(PIN_A1);
   }
}


If you want the rest of the main code to execute, then the function needs to exit.
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

PostPosted: Fri Jan 24, 2014 3:30 am     Reply with quote

As I see it the code never reaches void fan().

Both main() and fan() contain forever loops, so if you get into either you can never reach the other.

Please explain more clearly exactly what you are trying to achieve

Mike

Ttelmah got in as I typed.
Ttelmah



Joined: 11 Mar 2010
Posts: 19520

View user's profile Send private message

PostPosted: Fri Jan 24, 2014 3:34 am     Reply with quote

Beat you to it!.... Smile

Best Wishes
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

PostPosted: Fri Jan 24, 2014 3:40 am     Reply with quote

Only 'cos I was doing the dishes!..... Very Happy

Mike
uri



Joined: 24 Jan 2014
Posts: 11

View user's profile Send private message

PostPosted: Fri Jan 24, 2014 11:50 am     Reply with quote

Thats AWESOME!! I am sure very thankful to everyone who helped me out. You made me sooo happy I decided to try asking for help.

I'm going to try it first thing.
uri



Joined: 24 Jan 2014
Posts: 11

View user's profile Send private message

PostPosted: Fri Jan 24, 2014 6:06 pm     Reply with quote

The way I used suggestion from Ttelmah rendered output_toggle(PIN_A1); always off. Here is my updated code and below that I add my 12f683.h file just in case i messed up there too.
Code:

#include <12F683.h>
#device adc=10
#use delay(clock=4000000)

#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO
#FUSES NOCPD //No EE protection
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOMCLR //Master Clear pin enabled / disabled
#FUSES PUT //Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled

   //--- set up PWM and timer
   //--- see spreadsheet. At 8Mhz is 16khz with resolution of 500 steps...


// void fan(); //A function _must_ be declared, or a prototype declared
//before it can be called. This is the prototype

void fan(); //A function _must_ be declared, or a prototype declared
//before it can be called. This is the prototype

void main() {

   setup_oscillator(OSC_4MHZ);

   fan(); //call the function

   //You will never get here, since the function never exits.
   output_low(PIN_A1);

   while (TRUE) {
      delay_us(22);
      output_toggle(PIN_A1);
   }
}


void fan()
{
long   value=0;

   setup_adc_ports(sAN3|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_16);
   set_adc_channel(3);    //read channel 3
   delay_us(10);

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_4,24,1); //24+1*4 resolution pwm
   
   setup_ccp1(CCP_PWM);
   setup_comparator(NC_NC);
   setup_vref(FALSE);
   
   setup_oscillator(OSC_4MHZ);                                     

   // TODO: USER CODE!!
 
while (true)
   {
     value=(read_adc()*25)/256; // 10 bits
      delay_ms(500);
      set_pwm1_duty(value);  //value must be long
      delay_ms(500);
   }
}


Begin 12F683.h file:
Code:

//////// Standard Header file for the PIC12F683 device ////////////////
#device PIC12F683


++++++++++++++++++++
Header file deleted.
Reason: Forum rule #10
10. Don't post the CCS example code or drivers, or ask for such code and drivers.
This includes header files for devices (example 18f452.h).

Forum rules:
http://www.ccsinfo.com/forum/viewtopic.php?t=26245

- Forum Moderator
++++++++++++++++++++
stinky



Joined: 05 Mar 2012
Posts: 99
Location: Central Illinois

View user's profile Send private message

PostPosted: Sat Jan 25, 2014 12:31 am     Reply with quote

Mike Walne wrote:
Both main() and fan() contain forever loops, so if you get into either you can never reach the other.
Ttelmah



Joined: 11 Mar 2010
Posts: 19520

View user's profile Send private message

PostPosted: Sat Jan 25, 2014 1:52 am     Reply with quote

and as I said in the comment in the code:

"//You will never get here, since the function never exits. "

Key throughout, is things only happen, when the code sequence reaches them...

Best Wishes
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

PostPosted: Sat Jan 25, 2014 3:32 am     Reply with quote

Mike Walne wrote:
Please explain more clearly exactly what you are trying to achieve

It's not obvious what you may be wanting to do.

Yes, you said you were merging two pieces of code.

Is this close?

a) Toggle PIN_A1 @ 22us intervals. (i.e. 22us ON, 22us OFF.)
b) Read ADC and update PWM once per second. (With 500ms between each action.)
c) Do both a & b together.

Mike

PS. Everyone with a licence has the header and example files.
uri



Joined: 24 Jan 2014
Posts: 11

View user's profile Send private message

PostPosted: Sat Jan 25, 2014 5:25 am     Reply with quote

I'm wanting to do exactly what you suggested:

a) Toggle PIN_A1 @ 22us intervals. (i.e. 22us ON, 22us OFF.)
b) Read ADC and update PWM once per second. (With 500ms between each action.)
c) Do both a & b together.
Ttelmah



Joined: 11 Mar 2010
Posts: 19520

View user's profile Send private message

PostPosted: Sat Jan 25, 2014 9:29 am     Reply with quote

Maybe think of a code 'tick'. Unless timing accuracy is very important, something like:
Code:

#include <12F683.h>
#device adc=10
#use delay(clock=8000000)

#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO
#FUSES NOCPD //No EE protection
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOMCLR //Master Clear pin enabled / disabled
#FUSES PUT //Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOIESO //Internal External Switch Over mode disabled
#FUSES NOFCMEN //Fail-safe clock monitor enabled

void main() {
   int8 counter;
   int1 state=0;
   int16 value;
   setup_oscillator(OSC_8MHZ);
   setup_adc_ports(sAN3|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_16);
   set_adc_channel(3);    //read channel 3
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_4,24,1); //24+1*4 resolution pwm
   setup_ccp1(CCP_PWM);
   setup_comparator(NC_NC);
   setup_vref(FALSE); 

   output_low(PIN_A1);
   counter=22;
   while (TRUE) {
      delay_us(22);
      output_toggle(PIN_A1);
      if (counter--==0)
      {
        counter=22;
        if (state==0)
        {
           state=1;
           value=(read_adc()*25)/256; // 10 bits
        }
        else
        {
           state=0;
           set_pwm1_duty(value);
        }
      }
   }
}

Now there will be a slight 'hiccup' in the output_toggle, every 23rd cycle (as it does the other 'task', particularly on the one where if performs the maths, but this will toggle the pin 23 times, then perform the adc read, then another 23 times, and update the PWM.

Unless you have an external clock, you cant use FCMEN, or IESO.

Best Wishes
uri



Joined: 24 Jan 2014
Posts: 11

View user's profile Send private message

PostPosted: Sat Jan 25, 2014 11:23 am     Reply with quote

Thank you. My assigned partner returned home for family emergency leaving me with the whole project that counts for 5% of our grade. Plus I am learning how to do this now. I can't wait to see the pwm working Monday. THANK YOU!!
uri



Joined: 24 Jan 2014
Posts: 11

View user's profile Send private message

PostPosted: Sun Jan 26, 2014 7:13 pm     Reply with quote

about this function: setup_ccp1(CCP_PWM);

How would I change the pwm output to GP5/T1CK1/OSC1 pin in order to free up the GP2/AN2/T0CK1/COUT/CCP1 for input from LM35 temperature sensor? I'm afraid this code is starting to look hopeless for our purpose. PWM fan control based on temperature as mV ADC input from silicon LM35.

I am including the schematic for our project in case I haven't already...

Wait, I don't see a way to upload the schematic pdf here. Maybe there is enough information in the previous c file though.

Also, my basic description of the 12f pin routes:
GP5/T1CK1/A5 > R330 ohm > logic level mosfet > fan motor
GP2/AN2/A2 > R330 > LED > LM35 GND pin
GP4/AN3/A4 > LM35 VOUT pin

I'm so sorry I am still new at this but that is why I am enrolled in school.

I'm extremely thankful for the other people on the forum helping me up.
stinky



Joined: 05 Mar 2012
Posts: 99
Location: Central Illinois

View user's profile Send private message

PostPosted: Sun Jan 26, 2014 8:28 pm     Reply with quote

You won't.
Datasheet.
CCP output can't be reassigned. Table 1 lists pin functions.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2  Next
Page 1 of 2

 
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