Gabriel
Joined: 03 Aug 2009 Posts: 1067 Location: Panama
|
16F88 ADC Driver for vs. 3.155 |
Posted: Fri Jun 15, 2012 7:35 am |
|
|
Hi all,
I purchased yesterday PCM 4.132 (yeih!) since I've been using 3.155 since forever and its wasn't cutting it anymore...
In the thread below I mentioned some ADC problems I was having. My .H file was not right, the defined constants were wrong, the ADC functions were not working in general... except for read_adc() as far as I could tell.
http://www.ccsinfo.com/forum/viewtopic.php?t=48414
So I started to write my own ADC functions doing that would set/clear the required bits...
Since I now have a new compiler I don't quite need my "ADC driver" so I figured I would post it for educational purposes for others...
IT IS NOT COMPLETE - - - But it might help others. most of the functions work as far as I can tell... I got the new compiler before i got to writing a new
Read_ADC();
Power_ADC();
and others...
It would be awesome if someone finished it just for _Reference_ purposes.
I didn't post it in the library... since its not fully tested or finished... i don't think many people need this anyways...
So here it is:
Code: |
#define VDD_VSS 0x00 // V+ to GND
#define VDD_VrefN 0x10 // V+ to Vref-
#define VRefP_VSS 0x20 // Vref+ to GND
#define VRefP_VrefN 0x30 // Vref+ to Vref-
#define EIGHT 0x00 //Justified
#define TEN 0x80 //Justified
#Byte ANSEL = 0x9B
#Byte ADCON0 = 0x1F
#Byte ADCON1 = 0x9F
void ADC_Resolution(int);
void ADC_Clock_Setup(int);
void ADC_Ports_Setup(int);
void ADC_Voltage_Ref(int);
void ADC_Select_Channel(int);
//--------------ADC_Ports_Setup-----------------//
// Enables the selected ADC Ports
// Uses Constants in standard .H file OR'ed
//----------------------------------------------//
void ADC_Ports_Setup(int ports)
{
ANSEL=(ANSEL & 0x00)|ports;
}
//---------------ADC_Resolution-----------------//
// Sets the Resolution (Left or right Justified)
// Uses Constants Defined on THIS FILE
//----------------------------------------------//
void ADC_Resolution(int resolution)
{
ADCON1=(ADCON1 & 0x7F) | resolution;
}
//--------------ADC_Clock_Setup-----------------//
// ADC conversion clock selection
// Uses Constants in standard .H
//----------------------------------------------//
void ADC_Clock_Setup(int clock)
{
ADCON0=(ADCON0&0x3F)|clock;
}
//--------------ADC_Voltage_Ref-----------------//
// Selects the Voltage References
// Uses Constants Defined on THIS FILE
// Defined added but commented to .H file
//----------------------------------------------//
void ADC_Voltage_Ref(int ref)
{
ADCON1=(ADCON1 & 0xC0)|ref;
}
//-------------ADC_Select_Channel---------------//
// Selects the ADC channel to sample
// Channel Values 0 to 6
//----------------------------------------------//
void ADC_Select_Channel(int channel)
{
if(channel==0)
ADCON0= ADCON0 & 0xC7;
if(channel==1)
ADCON0= (ADCON0 & 0xC7)|0x08;
if(channel==2)
ADCON0= (ADCON0 & 0xC7)|0x10;
if(channel==3)
ADCON0= (ADCON0 & 0xC7)|0x18;
if(channel==4)
ADCON0= (ADCON0 & 0xC7)|0x20;
if(channel==5)
ADCON0= (ADCON0 & 0xC7)|0x28;
if(channel==6)
ADCON0= (ADCON0 & 0xC7)|0x30;
}
|
EDIT:
I should clarify this was intended to be used with a 16F88. _________________ CCS PCM 5.078 & CCS PCH 5.093 |
|