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

Help With 12f683 Two Analog Inputs
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
Rez



Joined: 10 Feb 2019
Posts: 26

View user's profile Send private message

Help With 12f683 Two Analog Inputs
PostPosted: Tue Feb 19, 2019 1:04 pm     Reply with quote

I have two timers and I am controlling the time with A0 and A1 as inputs (2 10k pots). I am not sure if I am setting up the ports correctly but I can't get them both to work. If I have input A0 by itself it works.

This is my setup for the ports.
Code:

#use delay(clock = 4000000)
#fuses INTRC_IO,NOWDT,NOPROTECT,NOMCLR


setup_adc(ADC_CLOCK_INTERNAL); //internal clock
setup_adc_ports(sAN0 | sAN1); //setup port A0
set_adc_channel(0); //output to port A0
set_adc_channel(1); //output to port A1
setup_comparator(NC_NC_NC_NC); //turn off comp
temtronic



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

View user's profile Send private message

PostPosted: Tue Feb 19, 2019 1:23 pm     Reply with quote

quick comment....

from the datasheet, ADC section, table 9-1....

notes:
4: When the device frequency is greater than 1 MHz, the FRC clock source is only recommended if the
conversion will be performed during Sleep.

You've decised on a 4MHz clock ,so...you only have 2 choices according to the table.
Rez



Joined: 10 Feb 2019
Posts: 26

View user's profile Send private message

PostPosted: Tue Feb 19, 2019 1:47 pm     Reply with quote

temtronic wrote:
quick comment....

from the datasheet, ADC section, table 9-1....

notes:
4: When the device frequency is greater than 1 MHz, the FRC clock source is only recommended if the
conversion will be performed during Sleep.

You've decised on a 4MHz clock ,so...you only have 2 choices according to the table.


I am new to ADC so I don't understand enough of what the data sheet is saying, could you help out and explain some of it to me so I can learn some more about it, thx.
Ttelmah



Joined: 11 Mar 2010
Posts: 19537

View user's profile Send private message

PostPosted: Tue Feb 19, 2019 1:51 pm     Reply with quote

Then set_adc_channel(0), is not a 'setup'.

It physically connectes AN0 to the ADC.
Once you gave done this, you have to wait for Tacq, and then read the ADC
This will then return the digital value corresponding to the voltage on AN0.

You can then set_adc_channel(1), again wait for Tacq, and then read the
port again to read the value from AN1.
Rez



Joined: 10 Feb 2019
Posts: 26

View user's profile Send private message

PostPosted: Tue Feb 19, 2019 2:29 pm     Reply with quote

Ttelmah wrote:
Then set_adc_channel(0), is not a 'setup'.

It physically connectes AN0 to the ADC.
Once you gave done this, you have to wait for Tacq, and then read the ADC
This will then return the digital value corresponding to the voltage on AN0.

You can then set_adc_channel(1), again wait for Tacq, and then read the
port again to read the value from AN1.


I got this to work, is this a correct way of doing it, is there a better way?

Code:

setup_adc(ADC_CLOCK_INTERNAL); //internal clock
setup_adc_ports(sAN0 | sAN1); //read port A0 and A1
set_adc_channel(0); //output to port A0
result = read_adc();
delay_us(10);
set_adc_channel(1); //output to port A1
resultACT = read_adc();
delay_us(10);
Rez



Joined: 10 Feb 2019
Posts: 26

View user's profile Send private message

PostPosted: Tue Feb 19, 2019 2:55 pm     Reply with quote

Rez wrote:
Ttelmah wrote:
Then set_adc_channel(0), is not a 'setup'.

It physically connectes AN0 to the ADC.
Once you gave done this, you have to wait for Tacq, and then read the ADC
This will then return the digital value corresponding to the voltage on AN0.

You can then set_adc_channel(1), again wait for Tacq, and then read the
port again to read the value from AN1.


I got this to work, is this a correct way of doing it, is there a better way?

Code:

setup_adc(ADC_CLOCK_INTERNAL); //internal clock
setup_adc_ports(sAN0 | sAN1); //read port A0 and A1
set_adc_channel(0); //output to port A0
result = read_adc();
delay_us(10);
set_adc_channel(1); //output to port A1
resultACT = read_adc();
delay_us(10);


I thought this was working ,but its not quit right the AN1's timer is working but AN0 is not.
Rez



Joined: 10 Feb 2019
Posts: 26

View user's profile Send private message

PostPosted: Tue Feb 19, 2019 3:08 pm     Reply with quote

Rez wrote:
Rez wrote:
Ttelmah wrote:
Then set_adc_channel(0), is not a 'setup'.

It physically connectes AN0 to the ADC.
Once you gave done this, you have to wait for Tacq, and then read the ADC
This will then return the digital value corresponding to the voltage on AN0.

You can then set_adc_channel(1), again wait for Tacq, and then read the
port again to read the value from AN1.


I got this to work, is this a correct way of doing it, is there a better way?

Code:

setup_adc(ADC_CLOCK_INTERNAL); //internal clock
setup_adc_ports(sAN0 | sAN1); //read port A0 and A1
set_adc_channel(0); //output to port A0
result = read_adc();
delay_us(10);
set_adc_channel(1); //output to port A1
resultACT = read_adc();
delay_us(10);


I thought this was working ,but its not quit right the AN1's timer is working but AN0 is not.


It is working I didn't have one of my jumpers in the correct spot.
Rez



Joined: 10 Feb 2019
Posts: 26

View user's profile Send private message

PostPosted: Tue Feb 19, 2019 3:24 pm     Reply with quote

Rez wrote:
Rez wrote:
Rez wrote:
Ttelmah wrote:
Then set_adc_channel(0), is not a 'setup'.

It physically connectes AN0 to the ADC.
Once you gave done this, you have to wait for Tacq, and then read the ADC
This will then return the digital value corresponding to the voltage on AN0.

You can then set_adc_channel(1), again wait for Tacq, and then read the
port again to read the value from AN1.


I got this to work, is this a correct way of doing it, is there a better way?

Code:

setup_adc(ADC_CLOCK_INTERNAL); //internal clock
setup_adc_ports(sAN0 | sAN1); //read port A0 and A1
set_adc_channel(0); //output to port A0
result = read_adc();
delay_us(10);
set_adc_channel(1); //output to port A1
resultACT = read_adc();
delay_us(10);


I thought this was working ,but its not quit right the AN1's timer is working but AN0 is not.


It is working I didn't have one of my jumpers in the correct spot.


I am driving myself crazy, I thouhgt yet again it was working,but its not, I am so lost.
temtronic



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

View user's profile Send private message

PostPosted: Tue Feb 19, 2019 4:26 pm     Reply with quote

this is still wrong
setup_adc(ADC_CLOCK_INTERNAL); //internal clock

...
HOW do you see the 'result'?
you need to post your complete program...
arachid



Joined: 15 Oct 2016
Posts: 11

View user's profile Send private message

PostPosted: Tue Feb 19, 2019 5:07 pm     Reply with quote

you Don't use the delay_us(10) at right moment, you need to wait after change channel not after read, and you frotgot to indicate the reference.

like this:
setup_adc(ADC_CLOCK_INTERNAL); // adc internal clock
setup_adc_ports(sAN0 | sAN1|VSS_VDD); //read port A0 and A1 analog input
set_adc_channel(0); //input of the adc is on port A0 pin 7
delay_us(10); //wait after change input of adc channel
result = read_adc(); // start and read the adc
set_adc_channel(1); //input of the adc is on port A1 pin 6
delay_us(10); //wait after change input of adc channel
resultACT = read_adc(); // start and read the adc
arachid



Joined: 15 Oct 2016
Posts: 11

View user's profile Send private message

PostPosted: Tue Feb 19, 2019 5:15 pm     Reply with quote

sorry not need raference if you not use vref
setup_adc_ports(sAN0 | sAN1); //read port A0 and A1 analog input

is ok because
VSS_VDD is 0x0000
them it is by default.
Rez



Joined: 10 Feb 2019
Posts: 26

View user's profile Send private message

PostPosted: Tue Feb 19, 2019 5:18 pm     Reply with quote

temtronic wrote:
this is still wrong
setup_adc(ADC_CLOCK_INTERNAL); //internal clock

...
HOW do you see the 'result'?
you need to post your complete program...







I got this code to work.

Please explain to me about this being wrong, thx. setup_adc(ADC_CLOCK_INTERNAL);

Code:

#include <12F683.h>

#define ACT PIN_A5
#define IN PIN_A3 //Main Input

#use delay(clock = 4000000)
#fuses INTRC_IO,NOWDT,NOPROTECT,NOMCLR



//time 1
int result;

void Time(void)
{

set_adc_channel(0); //output to port A0
result = read_adc();
delay_us(10);


for(int i = 0; i < result; i++)
{   
   delay_ms(120);
}
}





//time 2
int resultACT;

void TimeACT(void)
{

set_adc_channel(1); //output to port A1
resultACT = read_adc();
delay_us(10);


for(int i = 0; i < resultACT; i++)
{
   delay_ms(15);
}
}





void main()
{
//setup_oscillator(0);
setup_adc(ADC_CLOCK_INTERNAL); //internal clock
setup_adc_ports(sAN0 | sAN1); //read port A0 and A1
set_adc_channel(0); //use port A0
set_adc_channel(1); //use port A1
setup_comparator(NC_NC_NC_NC); //turn off comp

delay_ms(1000);

while(TRUE)   
{

if(input(IN)) //push button to start time
{
   
   output_high(ACT);
   TimeACT();
   output_low(ACT);
   Time();
   output_high(ACT);
   TimeACT();
   output_low(ACT);
   delay_ms(1000);
}
   

while(input(IN));
delay_ms(50);
while(!input(IN));
delay_ms(100);




   
}   
}
temtronic



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

View user's profile Send private message

PostPosted: Tue Feb 19, 2019 6:11 pm     Reply with quote

this

setup_adc(ADC_CLOCK_INTERNAL); //internal clock

is still wrong
arachid



Joined: 15 Oct 2016
Posts: 11

View user's profile Send private message

PostPosted: Tue Feb 19, 2019 6:30 pm     Reply with quote

try:

//time 1
int result;

void Time(void)
{

set_adc_channel(0); //output to port A0
delay_us(10);
result = read_adc();

for(int i = 0; i < result; i++)
{
delay_ms(120);
}
}
arachid



Joined: 15 Oct 2016
Posts: 11

View user's profile Send private message

PostPosted: Tue Feb 19, 2019 6:32 pm     Reply with quote

try
Code:

#include <12F683.h>

#define ACT PIN_A5
#define IN PIN_A3 //Main Input

#use delay(clock = 4000000)
#fuses INTRC_IO,NOWDT,NOPROTECT,NOMCLR



//time 1
int result;

void Time(void)
{

set_adc_channel(0); //output to port A0
delay_us(10);
result = read_adc();


for(int i = 0; i < result; i++)
{   
   delay_ms(120);
}
}





//time 2
int resultACT;

void TimeACT(void)
{

set_adc_channel(1); //output to port A1
delay_us(10);
resultACT = read_adc();

for(int i = 0; i < resultACT; i++)
{
   delay_ms(15);
}
}





void main()
{
//setup_oscillator(0);
setup_adc_ports(sAN0 | sAN1); //read port A0 and A1
setup_adc(ADC_CLOCK_INTERNAL); //internal clock


setup_comparator(NC_NC_NC_NC); //turn off comp

delay_ms(1000);

while(TRUE)   
{

if(input(IN)) //push button to start time
{
   
   output_high(ACT);
   TimeACT();
   output_low(ACT);
   Time();
   output_high(ACT);
   TimeACT();
   output_low(ACT);
   delay_ms(1000);
}
   
while(input(IN));
delay_ms(50);
while(!input(IN));
delay_ms(100);

   
}   
}
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