Alberteinstein Guest
|
16f887A angular movement in deg of potentiomenter problem.. |
Posted: Mon Feb 13, 2006 8:52 pm |
|
|
Guys what is wrong with following code?
I've a temperature sensor connected to PortA A0 and a potentiometer connected to A1.first I read the A0 AdC and delay for 20us and read ADC A1.
The problem is the value reading from the sensor is the same as the value reading from the potentiometer.If i avry the potentiometer, the values in both readin g vary.This is not suppose to be true as the two readings are different.
What is the problem?
Code: | #include <16f877a.h>
#device *=16
#device adc=10
#fuse HS,NOWDT,NOPROTECT,NOLVP,NOPUT
#use dleay(clock=20000000)
#include <lcd_driver.c>
#define Tr 0.35191 //potentiometer 1 revolution 360 degs // which is 0V & 1023 adc counts.
//Tr=360/1023 gives deg/adc_cnt
struct time {
int16 adcvals;
int16 deg_temp;
int16 adc_ang_val;
}global_adc={0,0,0};
void read_adc_vals(void);
#int_TBE
TBE_isr()
{
static int1 toggle=0;
if(toggle) {
toggle=0;
global_adc.adcvals=read_adc(ADC_READ_ONLY);
}
else {
toggle=1;
read_adc(ADC_START_ONLY);
}
}
#int_RDA
RDA_isr()
{
}
/*#int_TIMER0
TIMER0_isr()
{ //static int16 tick=0;
// tick+=256; // set_timer0(206); 20 mhz clock, no prescaler, set
timer 0 to overflow in 35us
// 256-(.001024/(4*256/20000000))
}*/
void main()
{
//char cnt;
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_DIV_32); //ADC_CLOCK_INTERNAL//SET adc conversion clock speed
//TAD(per bit)=1/20Mhz X 32 = 0.16us ;Requires min. 12 TAD for 10 bit
//Min. conversion time approx. 2us
//set_adc_channel(0); //Set ADC channel to port0(pin 2,AN0).
//setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
// setup_psp(PSP_DISABLED);setup_spi(FALSE);setup_timer_1(T1_DISABLED);setup_timer_2(T2_DISABLED,0,1);
// setup_comparator(NC_NC_NC_NC);setup_vref(FALSE);
enable_interrupts(INT_AD);/ enable_interrupts NT_TBE);enable_interrupts(INT_RDA);
lcd_init();
// enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL); //printf("Sampling adc"
lcd_gotoxy(2,1);
lcd_putc("\fSampling....");
delay_ms(1000);
lcd_putc("\f");
while(1)
{
read_adc_vals();
delay_ms(200);
}
}
void read_adc_vals(void){
static int32 avgvalz;
static int16 adcvalz;
static int16 adcarr[10];
signed int8 cnt;
static float angul_deg;
set_adc_channel(0); //set channel to channel0
/*this loops are used to give smoother temperature*/
for(cnt=0; cnt<10; cnt++)
{
adcarr[cnt]=global_adc.adcvals;
}
avgvalz=0;
for(cnt=0; cnt<10; cnt++)
{
avgvalz +=adcarr[cnt];
}
delay_us(20);
set_adc_channel(1);
global_adc.adc_ang_val=read_adc();
/*Arithmatic calculations here*/
adcvalz=avgvalz/10; //taking the averages values of temps
global_adc.deg_temp = ((adcval - 559L)/2); //temperatures in deg
angul_deg=(global_adc.adc_ang_val*Tr); //Tr=360/1023
/*Print the results to the lcd display am using lcd*/
lcd_gotoxy(8, 1);
printf(LCD_PUTC," %04lu %02Lu\n\r",adcvalz,global_adc.deg_temp);
lcd_gotoxy(8, 2);
printf(LCD_PUTC," %04lu %Lu\n\r",global_adc.adc_ang_val,angul_deg);
} |
Have anyone ever done it before??
Help |
|