combining two 8 bit reg

Thread Starter

karthi keyan 9

Joined Apr 17, 2018
30
I want to calculate the value of forumal
for that i need to take value from two 8bit reg in that of 16bit i want the data of 12MSB. 12MSB i placed in the formula to get the data

My code:
/
#include<pic.h>

#define _XTAL_FREQ 11059200

__CONFIG (0xFF02);
int i,x,y,r;
char data1,data2;
data1=0x07; // 8-bit data from reg 1
data2=0x56; // 8-bit data from reg 2
uint16_t x,y,d3,d4,z;
d3=(data1<<8)|data2; // Combining reg1 and reg2 = 16bit
d4=d3>>4; //Shifting 4 bit left side

void main()
{

r=0.000000000004
x=0x3000;
y=0xA000;
for( i=0;i<255;i++); //delay
while(1)
{
// formula = (((12bit data)- 0x3000)/0xA000)*4pico
z=((d4-x)/y)r; // Forumal
for(i=0;i<255;i++); //delay
}
}

i this code i am getting multiple error i solved few of them rest all i am finding difficulty pls help to solve it
 

bogosort

Joined Sep 24, 2011
696
Obvious problems:
  • You declare x and y twice (first as int, then as uint16_t).
  • You declare r as an int, but define it as a float (and you forget semicolon).
  • You declare z as an int, but define it with a division and scale it by a tiny float (also missing '*' symbol in the multiply).
  • You have code outside of main that's not part of a function (d3 and d4 definitions).
Note that multiplying by r may exceed the precision of your hardware. You could leave the result unscaled and post-process it outside of the program, or treat it as implicitly scaled.
 

Thread Starter

karthi keyan 9

Joined Apr 17, 2018
30
Obvious problems:
  • You declare x and y twice (first as int, then as uint16_t).
  • You declare r as an int, but define it as a float (and you forget semicolon).
  • You declare z as an int, but define it with a division and scale it by a tiny float (also missing '*' symbol in the multiply).
  • You have code outside of main that's not part of a function (d3 and d4 definitions).
Note that multiplying by r may exceed the precision of your hardware. You could leave the result unscaled and post-process it outside of the program, or treat it as implicitly scaled.
Thank you for your reply. I corrected the some mistakes but still only one error existing in the code.

modified code:
#include<pic.h>
#include<stdio.h>

#define _XTAL_FREQ 11059200

__CONFIG (0xFF02);
int i;
float r;
uint16_t x,y,d3,d4,z;
char d1=0x07; // 8-bit data from reg 1
char d2=0x56; // 8-bit data from reg 2


void main()
{
d3=(d1<<8)|d2; // Combining reg1 and reg2 = 16bit
d4=d3>>4; //Shifting 4 bit left side
r=0.000000000004;
x=0x3000;
y=0xA000;
for( i=0;i<255;i++); //delay
while(1)
{
// formula = (((12bit data)- 0x3000)/0xA000)*4pico
z=((d4-x)/y)*r; // Formula
for(i=0;i<255;i++); //delay
}
}


Error:
1. uint16_t x,y,d3,d4,z; ( "," expected )

please explain on this
 

bogosort

Joined Sep 24, 2011
696
Error:
1. uint16_t x,y,d3,d4,z; ( "," expected )

please explain on this
The line as written is syntactically correct; maybe you have a typo in your actual source code?

The bigger problem is the multiplication by a tiny float r into a short integer z; you're going to find that z is always 0. Consider what happens when you multiply the largest possible unsigned short int by r:

0xFFFF * 4e-9 = 0.000262

As an integer, that equals zero.
 

Thread Starter

karthi keyan 9

Joined Apr 17, 2018
30
The line as written is syntactically correct; maybe you have a typo in your actual source code?

The bigger problem is the multiplication by a tiny float r into a short integer z; you're going to find that z is always 0. Consider what happens when you multiply the largest possible unsigned short int by r:

0xFFFF * 4e-9 = 0.000262

As an integer, that equals zero.
Yeah your correct I want measure capacitance in pico farads. It's should be less right. Then what is the solution to calculate those things?
 

bogosort

Joined Sep 24, 2011
696
Yeah your correct I want measure capacitance in pico farads. It's should be less right. Then what is the solution to calculate those things?
Don't scale the result. In other words, leave z as the capacitance in picoFarads. For example, if you get z = 102, then you know that you have 102 pF of capacitance. The only thing you have to consider is if the range of possible capacitances isn't too large for your 16-bit arithmetic.
 
Top