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

16F877A Working Slow( Newbie to CCS and circuits in general)

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

How was this code?
Not bad for a newbie.
0%
 0%  [ 0 ]
Really bad, even for a newbie.
100%
 100%  [ 1 ]
Total Votes : 1

Author Message
quepsis



Joined: 25 Jun 2014
Posts: 1

View user's profile Send private message

16F877A Working Slow( Newbie to CCS and circuits in general)
PostPosted: Wed Jun 25, 2014 6:46 am     Reply with quote

Hello everyone. 'Very Happy' I've designed a circuit which drives LCD(16x2), uses thermometer(18B20), uses a 3-wired Fan Motor and calculates the RPM of that said motor at the same time(At the. However, when I program this into 16F877A, it runs slow. I mean really slow. I was wondering if it was code-related(It may also be the design of the circuit). I know it is sloppy and very amateur coding, but anyways, if you could help me; that would be grand'Very Happy' . (I have collected these through various sources)

Code of the thermometer
Code:
 
ds1820.h

float ds1820_read()
{
 int8 busy=0, temp1, temp2;
 signed int16 temp3;
 float result;

 onewire_reset();
 onewire_write(0xCC);
 onewire_write(0x44);

 while (busy == 0)
  busy = onewire_read();

 onewire_reset();
 onewire_write(0xCC);
 onewire_write(0xBE);
 temp1 = onewire_read();
 temp2 = onewire_read();
 temp3 = make16(temp2, temp1);
 
 result = (float) temp3 / 16.0;  //Calculation for DS18B20 with 0.1 deg C resolution
 
// delay_ms(200);
 return(result);
}


My PWM controller code for the thermometer


Code:


1wire.h

/***********************1Wire Class***********************/
/*Description: This class handles all communication */
/* between the processor and the 1wire */
/* sensors.
/*********************************************************/

/*-------1-wire definitions-------*/
#define ONE_WIRE_PIN PIN_B0

/*******************1-wire communication functions********************/


void onewire_reset()  // OK if just using a single permanently connected device
{
output_low(ONE_WIRE_PIN);
delay_us( 500 ); // pull 1-wire low for reset pulse
output_float(ONE_WIRE_PIN); // float 1-wire high
delay_us( 500 ); // wait-out remaining initialisation window.
output_float(ONE_WIRE_PIN);
}

/*********************** onewire_write() ********************************/
/*This function writes a byte to the sensor.*/
/* */
/*Parameters: byte - the byte to be written to the 1-wire */
/*Returns: */
/*********************************************************************/

void onewire_write(int data)
{
int count;

for (count=0; count<8; ++count)
{
  output_low(ONE_WIRE_PIN);
  delay_us( 2 ); // pull 1-wire low to initiate write time-slot.
  output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); // set output bit on 1-wire
  delay_us( 60 ); // wait until end of write slot.
  output_float(ONE_WIRE_PIN); // set 1-wire high again,
  delay_us( 2 ); // for more than 1us minimum.
}
}

/*********************** read1wire() *********************************/
/*This function reads the 8 -bit data via the 1-wire sensor. */
/* */
/*Parameters: */
/*Returns: 8-bit (1-byte) data from sensor */
/*********************************************************************/

int onewire_read()
{
int count, data;

for (count=0; count<8; ++count)
{
  output_low(ONE_WIRE_PIN);
  delay_us( 2 ); // pull 1-wire low to initiate read time-slot.
  output_float(ONE_WIRE_PIN); // now let 1-wire float high,
  delay_us( 8 ); // let device state stabilise,
  shift_right(&data,1,input(ONE_WIRE_PIN)); // and load result.
  delay_us( 120 ); // wait until end of read slot.
}

return( data );
}


my main code
Code:



#include <16f877A.h>     // Kullanylacak denetleyicinin ba?lyk dosyasy tanytylyyor.
//***********Denetleyici konfigürasyon ayarlary************
//#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD


#use delay(clock=20000000)   // Gecikme fonksiyonu için kullanylan osilatör frekansy belirtiliyor


#define LCD_DATA_PORT getenv("SFR:PORTD")
#define LCD_ENABLE_PIN  PIN_E2                                    ////
#define LCD_RS_PIN      PIN_E0                                    ////
#define LCD_RW_PIN      PIN_E1                                    ////
#define LCD_DATA4       PIN_D4                                    ////
#define LCD_DATA5       PIN_D5                                    ////
#define LCD_DATA6       PIN_D6                                    ////
#define LCD_DATA7       PIN_D7
#define ONE_WIRE_PIN PIN_B0

#include<1wire.c>
#include<lcd.c>
#include<ds1820.c>

int8 capture_rising_edge;
int8 got_pulse_width;
int16  ccp_delta;
#int_ccp1
void ccp1_isr(void)
{
static int16 t1_rising_edge;
if(capture_rising_edge)
  {
   setup_ccp1(CCP_CAPTURE_FE);
   capture_rising_edge = FALSE;
   t1_rising_edge = CCP_1;
  }
else
  {
   setup_ccp1(CCP_CAPTURE_RE);
   capture_rising_edge = TRUE;
   ccp_delta = CCP_1 - t1_rising_edge;
   got_pulse_width = TRUE;
  }

}

void main ()
{
   int xo = 50;
   float pulse_width_ms;
   int16 local_ccp_delta;
  float temperature;
   set_tris_d(0xFF);
   lcd_init();
   
   
    output_low(PIN_C2);
   setup_ccp2(CCP_PWM);
   setup_timer_2(T2_DIV_BY_16, 100, 1); // Setting the CCP2 for PWM (yellow wire of the fan)
   set_pwm2_duty(xo);
   
   got_pulse_width = FALSE;
   capture_rising_edge = TRUE;

   setup_ccp1(CCP_CAPTURE_RE);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_2 ); //(Reading the frequency)
   enable_interrupts(INT_CCP1);
   enable_interrupts(GLOBAL);
   
   
   onewire_write(0xCC);
   onewire_write(0x4E);
   onewire_write(125);
   onewire_write(-55); //this should be done for proper working of DS18B20
   onewire_write(127); 
   onewire_reset();
   onewire_write(0xCC);
   onewire_write(0x48);
   delay_ms(15);
 
 
while(1){
   if(got_pulse_width)
      {   
      lcd_gotoxy(1,1);
      disable_interrupts(GLOBAL);
      local_ccp_delta = ccp_delta;
      enable_interrupts(GLOBAL);
     
      pulse_width_ms = local_ccp_delta / 1250.0;
      printf(lcd_putc,"%lfRpm ", /*(1000.0/pulse_width_ms),*/(15000.0/pulse_width_ms)); // I calculated Frequency * 60/4 = RPM
      got_pulse_width = FALSE;

      }
    lcd_gotoxy(1,2);
   temperature = ds1820_read();
   printf(lcd_putc,"Temp:%.2f",temperature);
   if(temperature>=40){
   xo=75;  //Changing the duty cycle when the temperature rises
   }
   if(temperature<=30){
   xo=25;
   }

}
}

Very Happy
asmboy



Joined: 20 Nov 2007
Posts: 2128
Location: albany ny

View user's profile Send private message AIM Address

PostPosted: Wed Jun 25, 2014 6:54 am     Reply with quote

can you show your schematic?
temtronic



Joined: 01 Jul 2010
Posts: 9221
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Wed Jun 25, 2014 9:36 am     Reply with quote

hmm... really slow....

1) have you run a '1Hz LED' program in your PIC? Does it run at 1Hz?

2) floating point math is super slooooooow !!! Use integer math, scaled integers to really speed things up !

3) break it down a bit....and just read the temperature and display,does that work 100%?

hth
jay
MikeP



Joined: 07 Sep 2003
Posts: 49

View user's profile Send private message

PostPosted: Thu Jun 26, 2014 11:08 pm     Reply with quote

Code:
#use delay(clock=20000000)


I see that your #fuse line is commented out I don't think the clock option will set the HS fuse

The clock option in #use delay should only be used with xtal or int option to set clock if you want to set oscillator multiplication or division or when your fuses are set correctly and you don't want the compiler messing with the fuses

Since your clock is 20m I am going to assume you are using a 20MHZ crystal because if I recall right the 16f877A does not have a internal clock that fast.

Try this
Code:
#fuses NOWDT, NOLVP
#use delay(xtal=20000000)


The above code will set the clock fuses correctly but there are others you should be setting at a minimum. Others may point out others but off the top of my head
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