|
|
View previous topic :: View next topic |
Author |
Message |
temtronic
Joined: 01 Jul 2010 Posts: 9243 Location: Greensville,Ontario
|
|
Posted: Tue Nov 28, 2017 6:12 pm |
|
|
You have a mix of FP and INT variables which may account for the 'bad' numbers.
As for the last reading.. test without the function genny inputting, what do you get for the 'reading'? It should be 0.
Also WHAT is different in the old vs. new hardware? |
|
|
POPE19
Joined: 27 Jun 2017 Posts: 71
|
|
Posted: Tue Nov 28, 2017 8:02 pm |
|
|
Yes without any output from function generator in beginning I am getting zero. But once it detects 0.5 MPH it remains same even if I am removing the signal input from function generator.
The old hardware have an 2 digit seven segment led display. Newer hardware have an lcd display. That is the only change. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Nov 28, 2017 8:22 pm |
|
|
POPE19 wrote: | Yes without any output from function generator in beginning I am getting zero. But once it detects 0.5 MPH it remains same even if I am removing the signal input from function generator.
|
See this thread for ways to handle lack of an input signal:
http://www.ccsinfo.com/forum/viewtopic.php?t=56439&start=5 |
|
|
POPE19
Joined: 27 Jun 2017 Posts: 71
|
|
Posted: Wed Nov 29, 2017 8:08 am |
|
|
PCM Programmer,
I have tried the recommended code, but the problem still persists. I am sending the updated piece of code. The lcd displays as soon as the input signal is present but does not display 0 when signal is not present.
I don't know where in the loop is it sticking.
Code: |
#include <16F914.h>
#device ADC=10
#fuses HS, MCLR, NOWDT, PUT, NOIESO, BROWNOUT, NOFCMEN
#use delay(clock=20000000)
#define INTS_PER_QUARTER_SECOND 19 // (20000000/4*(4*256*256))
int int_count=INTS_PER_QUARTER_SECOND;
int time_delay =0;
int count0 = 0; //3rd digit
int count1 = 0; //2nd digit
int count2 = 0; //1st digit
short Digit2_Dec = true;
float Frequency = 0;
long newspeed = 0;
long speed = 0;
short MPH_KmPH_status;
//========================================================================================//
// LCD Configuration //
//========================================================================================//
// Digit segments A B C D E F G DP
// b7 b6 b5 b4 b3 b2 b1 b0
#define DIGIT1 COM0+11, COM1+11, COM2+11, COM3+11, COM2+3, COM0+3, COM1+3, COM3+3
#define DIGIT2 COM0+6, COM1+6, COM2+6, COM3+6, COM2+16, COM0+16, COM1+16, COM3+16
#define DIGIT3 COM0+17, COM1+17, COM2+17, COM3+17, COM2+18, COM0+18, COM1+18, COM3+18
#define UNIT1 COM0+19, COM1+19, COM2+19, COM3+19, COM2+20, COM0+20, COM1+20, COM3+20
//#define DIGIT5 COM0+2, COM1+2, COM2+2, COM3+2, COM2+3, COM0+3, COM1+3, COM3+3
// COM0+0, COM1+0, COM2+0, COM3+0, COM2+1, COM0+1, COM1+1, COM3+1
// ComX+Y is combination of Backplan0-3 and Segment0-SegmentXX
//========================================================================================//
// character 0 1 2 3 4 5 6 7 8 9 0 Null
//Decimal
byte const Digit_Map[12] = {0xFD,0x61,0xDB,0xF3,0x67,0xB7,0xBF,0xE1,0xFF,0xF7,0xFD,0x01};
//No Decimal
byte const Digit_Map_1[12] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xFC,0x00};
//========================================================================================//
// Bars MPH KMPH MPH&KMPH
byte const Unit_Map[3] = {0x04,0x02,0x06};
//=======================================================================================//
// Segments Initilization //
// Seg23 Seg22 ... Seg12 Seg11 Seg10 Seg9 Seg8 Seg7 Seg6 Seg5 Seg4 Seg3 Seg2 Seg1 Seg0 //
// 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 //
// if bit_SegX is 1, SegX is set as Segment Output. Otherwise //
//=======================================================================================//
#define Segments 0x170848 // Initilize LCD SegmentX
//=================================================================================//
#int_rtcc //This function is called
void clock_isr()
{ //every time the RTCC (timer0)
//overflows (255->0)
//For this program this is apx
//31 times per second.
if(--int_count==0)
{
time_delay ++;
int_count=INTS_PER_QUARTER_SECOND;
}
}
//================================================================================//
#priority CCP1, TIMER1
#define BytePtr(var, offset) (char *)((char*)&var + offset)
#byte PIR1 = 0xF9E // to locate PIR1 at address 0xF9E.
#bit TMR1IF = PIR1.0 // creates TMR1IF Variable & bit 0 of a byte (PIR1 Registor) is stored inside
//========================variables===============//
int8 gc_timer1_extension = 0;
short capture_flag = false;
int32 g32_ccp_delta; //Global Variable which stores Timer intervals between two rising edge of input signal
//===============================================//
//=====routine=========
#int_timer1 //everytime Timer-1 Interrupts the below Subroutine is Executed immediately after interrupt.
void timer1_isr(void)
{
gc_timer1_extension++; // increment real timer extension
}
#int_ccp1
void ccp1_isr(void)
{
char timer_ext_copy;
int32 current_ccp = 0;
static int32 old_ccp = 0;
capture_flag = true;
MPH_KmPH_status = True; // MPH mode
current_ccp = (int32)CCP_1; // Read the current CCP
timer_ext_copy = gc_timer1_extension; // get a local copy of timer ext
if(TMR1IF)
{
if (make8 (current_ccp, 1) < 2) // was CCP captured after Timer-1 Wrapped?
timer_ext_copy++; // if yes, Increment the copy of timer ext.
gc_timer1_extension++; // Increment the real timer extension
TMR1IF = 0; // Then clear the Timer1 interrupt
}
// Insert the timer extension into the proper place in the 32-bit
// CCP value.
// ie., Insert it into location "EE" as follows: 0x00EEnnnn
// (nnnn = the CCP).
make8 (current_ccp, 2) = timer_ext_copy;
g32_ccp_delta = (current_ccp > old_ccp) ? current_ccp - old_ccp : current_ccp + (0x1000000 - old_ccp);
old_ccp = current_ccp; // Save the current CCP value for next time.
}
//=================================================================================//
void Display()
{
lcd_symbol (Digit_Map_1[count2], DIGIT1); // from left to right
if (Digit2_Dec == False)
lcd_symbol (Digit_Map_1[count1], DIGIT2); // from left to right
else
lcd_symbol (Digit_Map[count1], DIGIT2); // from left to right
lcd_symbol (Digit_Map[count0], DIGIT3); // from left to right
}
//============================================================================//
void Speed_Cal ()
{
if(capture_flag == true)
{
Frequency = (1250000 + (g32_ccp_delta >> 3))*100 / g32_ccp_delta;
// x100 to get 2 decimal
capture_flag = false;
}
else if(capture_flag == false)
{
newspeed = 0;
}
// 1MPH = 74Hz or 0.1MPH = 7.4Hz application requirement
// MPH mode
if (MPH_KmPH_status == True) // MPH mode
{
newspeed = Frequency/740; // newspeed = 0.1 MPH,
// /100 to get back 2 decimal
if (newspeed < 5)
newspeed = 0;
}
}
//============================================================================//
void Speed_Mode()
{
Speed_Cal ();
if (time_delay >= 2)
{
speed = newspeed;
time_delay = 0;
}
if (speed >= 100)
{
count2 = speed%100/10;
count1 = speed/100;
count0 = speed%10;
}
else
{
Digit2_Dec = true;
count2 = 11;
count1 = speed%100/10;
count0 = speed%10;
}
display();
}
//============================================================================//
void main()
{
setup_lcd(LCD_MUX14|LCD_STOP_ON_SLEEP,2, Segments);
set_rtcc(0);
setup_counters (RTCC_INTERNAL, RTCC_DIV_256);
setup_ccp1 (CCP_CAPTURE_RE); // Configure CCP1 to capture rise
setup_ccp2 (CCP_CAPTURE_RE); // Configure CCP1 to capture rise
set_timer1 (0);
setup_timer_1 (T1_INTERNAL|T1_DIV_BY_4); // Start timer 1
clear_interrupt (INT_CCP1);
enable_interrupts (INT_CCP1); // Setup interrupt on raising edge
clear_interrupt (INT_CCP2);
enable_interrupts (INT_CCP2); // Setup interrupt on raising edge
clear_interrupt (INT_TIMER1);
enable_interrupts (INT_TIMER1); // Enable interrupt timer 1
enable_interrupts (INT_RTCC); // Enable interrupt timer 0
enable_interrupts (GLOBAL); // Enable interrup Global
Digit2_Dec = true;
count2 = 11;
count1= 8;
count0 = 8;
display ();
capture_flag = False;
while(TRUE) // Modify on 3/09/12
{
Speed_Mode();
}
}
|
|
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Wed Nov 29, 2017 8:45 am |
|
|
Time for serious debugging.
Two possibilities.
Use the spare I/O pins and a 'scope.
At the start of a routine raise a pin high, then low as you leave.
Do this with all the routines (either together or in turn if you run out of pins).
Should enable you to locate the routine where you're stuck.
Then use spare I/O pins to probe deeper.
OR.
Do something similar with printf()'s and a PC terminal.
Mike |
|
|
alan
Joined: 12 Nov 2012 Posts: 357 Location: South Africa
|
|
Posted: Wed Nov 29, 2017 9:04 am |
|
|
You never reset theMPH_KmPH_status:
Code: | if (MPH_KmPH_status == True) // MPH mode
{
newspeed = Frequency/740; // newspeed = 0.1 MPH,
// /100 to get back 2 decimal
if (newspeed < 5)
newspeed = 0;
}
|
So it will override newspeed with the last Frequency value.
Didn't look further, but this stood out.
Regards |
|
|
POPE19
Joined: 27 Jun 2017 Posts: 71
|
|
Posted: Wed Nov 29, 2017 9:18 am |
|
|
I have modified my code and it works. I just made following changes. I think it needs more delay to set the capture_flag = False. As soon as i increased the value of capture_interrupt count to 60, i am getting same behavior as it was with my old hardware.
I think the LCD needs some more time for this process. Maybe i am wrong but the interesting thing is to know why would this affect the output. I will keep updating about this if i find something logical. Meanwhile Experts are welcome for comments.
Code: |
if(capture_interrupt >=60)
{
Capture_flag = FALSE;
capture_ready = 0;
}
|
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Wed Nov 29, 2017 11:51 am |
|
|
If you look at your old code, it has several mSec of delay in the display routine. The new code just writes the LCD, and doesn't allow any time for this to be seen before looping and potentially writing new values. Remember just how quickly the CCP will trigger..... |
|
|
|
|
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
|