|
|
View previous topic :: View next topic |
Author |
Message |
PICman
Joined: 02 Nov 2007 Posts: 26
|
...ADC in a PIC12F683 |
Posted: Thu May 07, 2009 6:13 am |
|
|
Hi...
Sincerely, i do not know what to do...
It's ridiculously simple: i want to read an analog input using a PIC12F683
I made it work ! But... sometimes !!!! Most of the times, i alwars have a "zero" output (int16 entree).
I am sure it has something to do with my configuration, but i am confused, (mainly because i was able to make it work !!! )
Thanks for your help !
My code : (in the code i "scan" all four 0-3 analog inputs, i put in around 2.5 volts on pin 7 (verified with a DMM) and, using hyperterminal, i get the output value and the RS232 works ! )
Code: |
// _________ __________
// | \_/ |
// __| _ |__
// | | Vdd (_) Vss | |
// +5V |1 | | 8|------ Masse
// |__| |__|
// | |
// __| |__
// | | ICSPDAT | |
// |2 | PIN_A5 AN0 40 | 7| Analog input
// |__| 45 PIN_A0 |__|
// | |
// __| |__
// | | AN3 ICSPCLK | |
// |3 | 44 AN1 41 | 6|
// |__| PIN_A4 PIN_A1 |__|
// | |
// __| ____ |__
// 47k | | MCLR/Vpp PIN_A2 | |
// +5V--/\/\/\/----|4 | 43 AN2 | 5| 9600 out
// |__| PIN_A3 42 |__|
// | |
// |______________________|
//
//
//
//
//////////////////////////////////////////////////////////////////////////////
// PIN_A0 40 //
// PIN_A1 41 //
// PIN_A2 42 //
// PIN_A3 43 //
// PIN_A4 44 //
// PIN_A5 45 //
///////////////
// --------------------- (provient de PIC12F683.h) ------------------------
//////////////////////////////////////////////////////////////////////////////
//////// Program memory: 2048x14 Data RAM: 128 Stack: 8 //
//////// I/O: 6 Analog Pins: 4 //
//////// Data EEPROM: 256 //
//////// C Scratch area: 20 ID Location: 2000 //
//////// Fuses: LP,XT,HS,EC_IO,NOWDT,WDT,CPD,NOCPD,PROTECT,NOPROTECT,NOMCLR //
//////// Fuses: MCLR,PUT,NOPUT,INTRC_IO,INTRC,RC_IO,RC,BROWNOUT,NOBROWNOUT //
//////// Fuses: BROWNOUT_NOSL,BROWNOUT_SW,IESO,NOIESO,FCMEN,NOFCMEN //
//////// //
//////////////////////////////////////////////////////////////////////////////
// Discrete I/O Functions: SET_TRIS_x(), OUTPUT_x(), INPUT_x(),
// PORT_B_PULLUPS(), INPUT(),
// OUTPUT_LOW(), OUTPUT_HIGH(),
// OUTPUT_FLOAT(), OUTPUT_BIT()
// Constants used to identify pins in the above are:
#include <12f683.h>
#device adc=10 // 10 bit ADC
///////////////////////////////////////////////////////////////////////////
//
//#fuses INTRC_IO,nowdt,noprotect,put,brownout,nomclr,nolvp,nocpd //
//#fuses EC_IO,nowdt,noprotect,put,brownout,nomclr,nocpd //
#FUSES INTRC_IO,NOWDT,PUT,NOPROTECT,BROWNOUT,NOMCLR //
//
// EC_IO = External clock with I/O, //
// intrc = internl RC oscillator //
// NOWDT = no watch dog //
// NOPROTECT = no code protection program memory //
// PUT = power up timer //
// NOMCLR = no master clear //
// NOLVP = no low voltage programming //
// NOLVP = No low voltage programming (requires +13V) //
// nocpd = no code protection data memory //
// BROWNOUT = brounout detect //
//
/////////////////////////////////////////////////////////////////
#use delay (clock=1000000)
#use fast_io(A)
#use rs232 (baud=9600, xmit=PIN_A2,rcv=PIN_A3)
///////////////////////////////////////////////////////////////////
void ini_pic(void); //
void lire_tension_batt(void); //
int8 canal; //
int16 entree; //
///////////////////////////////////////////////////////////////////
// ***************** Sous-routines **************************
//////////////////////////////////////////////////////////////////
void ini_pic(void) //
{ // III
setup_adc_ports(all_analog|VSS_VDD); // ADC entre Vdd et Vss // I
setup_adc(ADC_CLOCK_DIV_16); // I
// III
//
setup_comparator(NC_NC); // N N
setup_vref(FALSE); // NN N
setup_ccp1(ccp_off); // N NN
setup_adc(ADC_OFF); // N N
setup_timer_0(RTCC_INTERNAL); //
setup_timer_1(T1_DISABLED); // III
setup_timer_2(T2_DISABLED,0,1); // I
output_A(0x04); // I
set_tris_A(0b11111011); // III
disable_interrupts(int_timer0); //
disable_interrupts(global); // TTT
setup_oscillator(OSC_1MHZ); // T
} // T
////////////////////////////////////////////////////////////////// T
/////////////////////////////////////////////////////////////////////////////
void lire_tension_batt(void) //
{ //
///////////////////////////////////////////// Analog voltage read //
set_adc_channel(canal); // //
delay_us(100); // (0-1023) //
entree=Read_ADC(ADC_START_AND_READ); // //
///////////////////////////////////////////// //
// entree=0-1023; //
} //
/////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void main(void) /////////
{ /////////
int8 canal=0; /////////
/*=-=*//*=-=*//*=-=*//*=-=*//*=-=*//*=-=*//*=-=*//*=-=*//*=-=*/ /////////
ini_pic(); /////////
/////////
delay_ms(20); /////////
/////////
while(1) /////////
{ /////////
lire_tension_batt(); /////////
printf(" canal %d",canal); /////////
printf("--%ld",entree); /////////
delay_ms(500); /////////
canal++; /////////
if(canal>3) /////////
canal=0; /////////
} /////////
} /////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
Ttelmah Guest
|
|
Posted: Thu May 07, 2009 7:37 am |
|
|
First thing to do, put back the NOLVP fuse.
Otherwise, if pins AN0, and AN1, are both low, when the power is applied, the chip will go into programming mode...
Obviously, this will be 'random', depending on how the lines are floating, and what the analog signal is doing.
Best Wishes |
|
|
Guest
|
|
Posted: Thu May 07, 2009 10:38 am |
|
|
Thanks Thelma, but there is no low voltage programming mode in the F683. The "NOLVP" command is not recognized. |
|
|
PICman
Joined: 02 Nov 2007 Posts: 26
|
|
Posted: Thu May 07, 2009 10:39 am |
|
|
OOps... forgot to login...
Thanks Thelma, but there is no low voltage programming mode in the F683. The "NOLVP" command is not recognized by the compiler. |
|
|
bungee-
Joined: 27 Jun 2007 Posts: 206
|
|
Posted: Thu May 07, 2009 11:28 am |
|
|
First thing I noticed is, that you read adc on port that you use for RS232.
Try to use this code, and report if it is working.
Code: | #include <12F683.h>
#device adc=10
#FUSES NOWDT, INTRC_IO, NOCPD, NOPROTECT, NOMCLR, PUT, NOBROWNOUT, NOIESO, NOFCMEN
#use delay(clock=8000000)
#define ADC1 PIN_A0
#define ADC1 PIN_A1
#define TX PIN_A2
#define RX PIN_A3
#use rs232(baud=9600,parity=N,xmit=PIN_A2,rcv=PIN_A3,bits=8)
void setup()
{
setup_adc_ports(sAN0|sAN1|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC);
setup_vref(FALSE);
setup_oscillator(OSC_8MHZ);
}
void main()
{
int16 AdValue;
int8 Channel;
setup();
while(1)
{
for (Channel=0;channel>=1;channel++);
{
set_adc_channel(Channel);
delay_us(50);
AdValue=read_adc();
printf("Chan: %d=%Lu",Channel,AdValue);
delay_ms(500);
}
}
} |
|
|
|
PICman
Joined: 02 Nov 2007 Posts: 26
|
|
Posted: Thu May 07, 2009 4:15 pm |
|
|
Thanks a lot Bungee !!!! Your code worked !!!
Now, it's time for me to study your code to know what was my error !
Again, thanks a lot ! (I don't know why, i got a lot of problems dealing with ADC, but with the help of this group, i wil get through it !) |
|
|
bungee-
Joined: 27 Jun 2007 Posts: 206
|
|
Posted: Thu May 07, 2009 4:19 pm |
|
|
I went through your code again ... Look at the marked spot....
Code: | setup_adc_ports(all_analog|VSS_VDD); // ADC entre Vdd et Vss // I
setup_adc(ADC_CLOCK_DIV_16); // I
// III
//
setup_comparator(NC_NC); // N N
setup_vref(FALSE); // NN N
setup_ccp1(ccp_off); // N NN
setup_adc(ADC_OFF); // N N <-------- HERE
setup_timer_0(RTCC_INTERNAL); //
setup_timer_1(T1_DISABLED); // III
setup_timer_2(T2_DISABLED,0,1); // I
output_A(0x04); // I
set_tris_A(0b11111011); // III
disable_interrupts(int_timer0); // |
|
|
|
grace
Joined: 09 Feb 2016 Posts: 1 Location: Banned - spammer
|
|
Posted: Tue Feb 09, 2016 3:13 am |
|
|
Sir,
Please can someone tell me the program compiler was used for this program? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19510
|
|
Posted: Tue Feb 09, 2016 3:20 am |
|
|
The CCS C compiler.
Any version for about the last seven years.
Since this is a forum _for_ CCS C. I wonder what compiler you expect to be being used..... |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9226 Location: Greensville,Ontario
|
|
Posted: Tue Feb 09, 2016 6:10 am |
|
|
just a comment...
Your ASCII ART shows a 47K resistor for _MCLR. That's very high. You should use a 4K7r.
If it really is a 47Kr the PIC _might_ randomly reset.
If it is a 4K7r just change your ASCII ART to agree with what you built.
Jay |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19510
|
|
Posted: Tue Feb 09, 2016 8:13 am |
|
|
The original thread, was 2009.
'Grace' has just come in asking what compiler it is for.
I doubt if anyone will change art that old!... |
|
|
ezflyr
Joined: 25 Oct 2010 Posts: 1019 Location: Tewksbury, MA
|
|
Posted: Tue Feb 09, 2016 2:02 pm |
|
|
temtronic wrote: | just a comment...
Your ASCII ART shows a 47K resistor for _MCLR. That's very high. You should use a 4K7r.
If it really is a 47Kr the PIC _might_ randomly reset.
|
Hi Jay,
A 47K pull-up resistor on MCLR with no capacitor is what CCS recommends for use with their ICD-U40 and ICD-U64 Programmer/Debuggers. If this value is 'too high', and might cause the PIC to 'randomly reset', I'd sure appreciate it if you didn't mention that to any of my customers who otherwise seem quite happy!
I've used that same MCLR setup in all my PIC designs over the years, and have got literally thousands of units in the field with no issues! _________________ John
If it's worth doing, it's worth doing in real hardware! |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9226 Location: Greensville,Ontario
|
|
Posted: Tue Feb 09, 2016 2:42 pm |
|
|
OK, I'll keep quiet....
it was a 'gut' response to the ASCII ART..it just 'seemed' wrong, probably a leftover from my 7400 dayze.....
Jay |
|
|
|
|
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
|