LTlib LaurTec Library  4.0.3
Open Source C Library for Microchip Microcontrollers based on XC8 Compiler
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
module_ADC.c
Go to the documentation of this file.
1 /*******************************************************************************
2 
3 Autore : Mauro Laurenti
4 Versione : 1.0
5 
6 Created on Date : 16/03/2016
7 Last update : 31/07/2016
8 
9 CopyRight 2006-2016 all rights are reserved
10 
11 ********************************************************
12 SOFTWARE LICENSE AGREEMENT
13 ********************************************************
14 
15 The usage of the supplied software imply the acceptance of the following license.
16 
17 The software supplied herewith by Mauro Laurenti (the Author) is intended for
18 use solely and exclusively on Microchip PIC Microcontroller (registered mark).
19 The software is owned by the Author, and is protected under applicable
20 copyright laws. All rights are reserved.
21 Any use in violation of the foregoing restrictions may subject the
22 user to criminal sanctions under applicable laws, as well as to civil liability
23 for the breach of the terms and conditions of this license.
24 Commercial use is forbidden without a written acknowledgement with the Author.
25 Personal or educational use is allowed if the application containing the
26 following software doesn't aim to commercial use or monetary earning of any kind.
27 
28 THIS SOFTWARE IS PROVIDED IN AN "AS IS" CONDITION. NO WARRANTIES,
29 WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
30 TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
31 PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE AUTHOR SHALL NOT,
32 IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
33 CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
34 
35 *******************************************************************************/
36 
37 #ifdef __XC8
38  #include <xc.h>
39 #endif
40 
41 #include "module_ADC.h"
42 
43 
44 //************************************************************
45 // ADC_open function implementation
46 //************************************************************
47 void ADC_open (unsigned long int ADC_enable_channel){
48 
49  #ifdef ADC_MODULE_TYPE_1
50  ADC_SETTINGS_1 = 0b11000000;
51  if (ADC_enable_channel & ADC_CH0) ADC_SETTINGS_1 = 0b00001110;
52  if (ADC_enable_channel & ADC_CH1) ADC_SETTINGS_1 = 0b00001101;
53  if (ADC_enable_channel & ADC_CH2) ADC_SETTINGS_1 = 0b00001100;
54  if (ADC_enable_channel & ADC_CH3) ADC_SETTINGS_1 = 0b00001011;
55  if (ADC_enable_channel & ADC_CH4) ADC_SETTINGS_1 = 0b00001010;
56  if (ADC_enable_channel & ADC_CH5) ADC_SETTINGS_1 = 0b00001001;
57  if (ADC_enable_channel & ADC_CH6) ADC_SETTINGS_1 = 0b00001000;
58  if (ADC_enable_channel & ADC_CH7) ADC_SETTINGS_1 = 0b00000111;
59 
60  if (ADC_enable_channel & ADC_CH8) ADC_SETTINGS_1 = 0b00000110;
61  if (ADC_enable_channel & ADC_CH9) ADC_SETTINGS_1 = 0b00000101;
62  if (ADC_enable_channel & ADC_CH10) ADC_SETTINGS_1 = 0b00000100;
63  if (ADC_enable_channel & ADC_CH11) ADC_SETTINGS_1 = 0b00000011;
64  if (ADC_enable_channel & ADC_CH12) ADC_SETTINGS_1 = 0b00000010;
65  #endif
66 
67 
68  #ifdef ADC_MODULE_TYPE_2
69  ANSELAbits.ANSA0 = (ADC_enable_channel & ADC_CH0) && 0x01;
70  ANSELAbits.ANSA1 = (ADC_enable_channel & ADC_CH1) && 0x01;
71  ANSELAbits.ANSA2 = (ADC_enable_channel & ADC_CH2) && 0x01;
72  ANSELAbits.ANSA3 = (ADC_enable_channel & ADC_CH3) && 0x01;
73  ANSELAbits.ANSA5 = (ADC_enable_channel & ADC_CH4) && 0x01;
74  ANSELEbits.ANSE0 = (ADC_enable_channel & ADC_CH5) && 0x01;
75  ANSELEbits.ANSE1 = (ADC_enable_channel & ADC_CH6) && 0x01;
76  ANSELEbits.ANSE2 = (ADC_enable_channel & ADC_CH7) && 0x01;
77 
78  ANSELBbits.ANSB2 = (ADC_enable_channel & ADC_CH8) && 0x01;
79  ANSELBbits.ANSB3 = (ADC_enable_channel & ADC_CH9) && 0x01;
80  ANSELBbits.ANSB1 = (ADC_enable_channel & ADC_CH10) && 0x01;
81  ANSELBbits.ANSB4 = (ADC_enable_channel & ADC_CH11) && 0x01;
82  ANSELBbits.ANSB0 = (ADC_enable_channel & ADC_CH12) && 0x01;
83  ANSELBbits.ANSB5 = (ADC_enable_channel & ADC_CH13) && 0x01;
84  ANSELCbits.ANSC2 = (ADC_enable_channel & ADC_CH14) && 0x01;
85  ANSELCbits.ANSC3 = (ADC_enable_channel & ADC_CH15) && 0x01;
86 
87  ANSELCbits.ANSC4 = (ADC_enable_channel & ADC_CH16) && 0x01;
88  ANSELCbits.ANSC5 = (ADC_enable_channel & ADC_CH17) && 0x01;
89  ANSELCbits.ANSC6 = (ADC_enable_channel & ADC_CH18) && 0x01;
90  ANSELCbits.ANSC7 = (ADC_enable_channel & ADC_CH19) && 0x01;
91  ANSELDbits.ANSD0 = (ADC_enable_channel & ADC_CH20) && 0x01;
92  ANSELDbits.ANSD1 = (ADC_enable_channel & ADC_CH21) && 0x01;
93  ANSELDbits.ANSD2 = (ADC_enable_channel & ADC_CH22) && 0x01;
94  ANSELDbits.ANSD3 = (ADC_enable_channel & ADC_CH23) && 0x01;
95 
96  ANSELDbits.ANSD4 = (ADC_enable_channel & ADC_CH24) && 0x01;
97  ANSELDbits.ANSD5 = (ADC_enable_channel & ADC_CH25) && 0x01;
98  ANSELDbits.ANSD6 = (ADC_enable_channel & ADC_CH26) && 0x01;
99  ANSELDbits.ANSD7 = (ADC_enable_channel & ADC_CH27) && 0x01;
100  #endif
101 
102  #ifdef ADC_MODULE_TYPE_4
103  ADC_SETTINGS_1 = 0b11000000;
104  #endif
105 
106 
107  #if defined (ADC_MODULE_TYPE_1) || defined (ADC_MODULE_TYPE_2) || defined (ADC_MODULE_TYPE_3)
108  ADC_set_reference (ADC_VREF_P_AVDD, ADC_VREF_N_AVSS);
109  ADC_set_acquisition_time(ADC_ACQUISITION_TIME_20_TAD);
110  #endif
111 
113  ADC_set_clock(ADC_CLOCK_FOSC_64);
114 
115  ADC_ENABLE_BIT |= 0x01;
116 }
117 
118 
119 //************************************************************
120 // ADC_close function implementation
121 //************************************************************
122 void ADC_close (){
123  ADC_ENABLE_BIT = 0x00;
124 
125  #ifdef ADC_MODULE_TYPE_1
126  ADC_SETTINGS_1 &= 0b11001111;
127  #endif
128 
129  #ifdef ADC_MODULE_TYPE_2
130  ANSELA = 0;
131  ANSELB = 0;
132  ANSELC = 0;
133  ANSELD = 0;
134  ANSELE = 0;
135  #endif
136 
137  #ifdef ADC_MODULE_TYPE_3
138  ANSEL = 0;
139  ANSELH = 0;
140  #endif
141 
142  #ifdef ADC_MODULE_TYPE_4
143  ADC_SETTINGS_1 = 0b00000110;
144  #endif
145 
146 
147 }
148 
149 
150 //************************************************************
151 // ADC_select_channel function implementation
152 //************************************************************
153 void ADC_select_channel (unsigned long int ADC_channel){
154 
155  #if defined (ADC_MODULE_TYPE_1) || defined (ADC_MODULE_TYPE_3)
156  //Clear the Channel bits
157  ADC_CHANNEL_SELECTION_REGISTER &= 0b11000011;
159  #endif
160 
161  #ifdef ADC_MODULE_TYPE_2
162  //Clear the Channel bits
163  ADC_CHANNEL_SELECTION_REGISTER &= 0b10000011;
165  #endif
166 
167  #ifdef ADC_MODULE_TYPE_4
168  //Clear the Channel bits
169  ADC_CHANNEL_SELECTION_REGISTER &= 0b11000111;
171  #endif
172 
173 }
174 
175 
176 //************************************************************
177 // ADC_start_conversion function implementation
178 //************************************************************
181 }
182 
183 
184 //************************************************************
185 // ADC_abort_conversion function implementation
186 //************************************************************
189 }
190 
191 
192 //************************************************************
193 // ADC_abort_conversion function implementation
194 //************************************************************
195 unsigned int ADC_read_value (void){
196  unsigned int ADC_value = 0;
197 
198  ADC_value = (((unsigned int)ADC_BUFFER_HIGH) << 8) | ADC_BUFFER_LOW;
199 
200  return (ADC_value);
201 }
202 
203 
204 //************************************************************
205 // ADC_is_converting function implementation
206 //************************************************************
207 unsigned char ADC_is_converting (){
208  return (ADC_START_CONVERSION_BIT);
209 }
210 
211 
212 //************************************************************
213 // ADC_set_acquisition_time function implementation
214 //************************************************************
216 
217  #if defined (ADC_MODULE_TYPE_1) || defined (ADC_MODULE_TYPE_2) || defined (ADC_MODULE_TYPE_3)
218  ADC_SETTINGS_2 &= 0b11000111;
219  ADC_SETTINGS_2 |= acq_time;
220  #endif
221 }
222 
223 
224 //************************************************************
225 // ADC_set_clock function implementation
226 //************************************************************
227 void ADC_set_clock (register_size ADC_clock){
228 
229  #if defined (ADC_MODULE_TYPE_1) || defined (ADC_MODULE_TYPE_2) || defined (ADC_MODULE_TYPE_3)
230  ADC_SETTINGS_2 &= 0b11111000;
231  ADC_SETTINGS_2 |= ADC_clock;
232  #endif
233 
234  #ifdef ADC_MODULE_TYPE_4
235  ADC_SETTINGS_0 &= 0b10011111;
236  ADC_SETTINGS_0 |= ADC_clock;
237  #endif
238 }
239 
240 
241 //************************************************************
242 // ADC_set_justification function implementation
243 //************************************************************
244 void ADC_set_justification (unsigned char ADC_justification){
245  ADC_JUSTIFICATION = ADC_justification;
246 }
247 
248 
249 //************************************************************
250 // ADC_set_reference function implementation
251 //************************************************************
252 void ADC_set_reference (register_size ADC_reference_V_P, register_size ADC_reference_V_N){
253 
254  #ifdef ADC_MODULE_TYPE_1
255  ADC_SETTINGS_1 &= 0b11001111;
256  ADC_SETTINGS_1 |= ADC_reference_V_P + ADC_reference_V_N;
257  #endif
258 
259  #if defined (ADC_MODULE_TYPE_2) || defined (ADC_MODULE_TYPE_3)
260  ADC_SETTINGS_1 &= 0b10000000;
261  ADC_SETTINGS_1 |= ADC_reference_V_P + ADC_reference_V_N;
262  #endif
263 }
264 
265 
266 //************************************************************
267 // ADC_read_channel function implementation
268 //************************************************************
269 unsigned int ADC_read_channel (unsigned long int ADC_channel){
270 
271  unsigned int ADC_value = 0;
272 
273  ADC_open(ADC_channel);
274  ADC_select_channel (ADC_channel);
275 
277 
278  while(ADC_is_converting());
279 
280  ADC_value = ADC_read_value();
281 
282  ADC_close();
283 
284  return(ADC_value);
285 }
286 
287 
288 //************************************************************
289 // ADC_channel_converter function implementation
290 //************************************************************
291 unsigned char ADC_channel_converter (unsigned long int channel_mask){
292 
293 unsigned long int filter = 0x00000001;
294 unsigned char counter = 0;
295 unsigned char adc_channel = 0;
296 
297  for (counter=0; counter < ADC_NUMBER_OF_CHANNELS; counter++){
298  if(channel_mask & filter){
299  adc_channel = counter;
300  }
301  filter = filter << 1;
302  }
303  return (adc_channel);
304 }