HWA
Bare metal programming with style
adb_2.h
Go to the documentation of this file.
1 
2 /* This file is part of the HWA project.
3  * Copyright (c) 2012,2015 Christophe Duparquet.
4  * All rights reserved. Read LICENSE.TXT for details.
5  */
6 
12 /* Base class
13  */
14 #include "adx_2.h"
15 
71 #define hwa_configure__adb , _hwa_cfadb
72 
73 #define _hwa_cfadb(o,a,k,...) \
74  do { \
75  _hwa_write(o,en,1); /* turn the ADC on */ \
76  HW_BW(_hwa_cfadbck,clock,k)(o,k,__VA_ARGS__,,); \
77  } while(0)
78 
79 /* Mandatory parameter 'clock'
80  */
81 #define _hwa_cfadbck0(o,k,...) HW_E(HW_EM_AN(k,clock))
82 #define _hwa_cfadbck1(o,k,v,...) HW_BV(_hwa_cfadbck1,adxclock_,v,o)(o,v,__VA_ARGS__) // Push
83 #define _hwa_cfadbck10(v,o) HW_E(HW_EM_VAL(v,clock,(min, max, ioclk/2**(1..7)))) HW_EAT // Pop
84 #define _hwa_cfadbck11(f,v,o) _hwa_write(o,ps,f(v)); _hwa_cfadbtrg // Pop
85 
86 /* Mandatory parameter 'trigger'
87  */
88 #define _hwa_cfadbtrg(o,v,k,...) HW_BW(_hwa_cfadbtrg,trigger,k)(o,v,__VA_ARGS__)
89 #define _hwa_cfadbtrg0(o,k,...) HW_E(HW_EM_AN(k,trigger))
90 #define _hwa_cfadbtrg1(o,k,v,...) HW_B(_hwa_cfadbtrg2, _hw_par v)(o,v,__VA_ARGS__)
91 
92 /* "manual" or "auto"
93  */
94 #define _hwa_cfadbtrg20(o,v,...) HW_BV(_hwa_cfadbtrg20,adbtrg_,v,o)(o,v,__VA_ARGS__) // Push
95 #define _hwa_cfadbtrg201(_ate,_ts,o) _hwa_write(o,ate,_ate); _hwa_write(o,ts,_ts); _hwa_cfadbref
96 #define _hwa_cfadbtrg200(v,...) HW_E(HW_EM_VAL(v,trigger,(manual, auto, (int0,irq), (acmp0,irq), \
97  (counter0,compare0,irq), (counter0,overflow,irq), \
98  (counter1,compare1,irq), (counter1,overflow,irq), \
99  (counter1,capture0,irq)))); HW_EAT // Pop
100 /* IRQs
101  */
102 #define _hwa_cfadbtrg21(o,v,...) _hwa_cfadbtrg22((HW_X(v)),o,v,__VA_ARGS__)
103 #define _hwa_cfadbtrg22(...) _hwa_cfadbtrg23(__VA_ARGS__)
104 #define _hwa_cfadbtrg23(d,...) HW_BW(_hwa_cfadbtrg3,_irq,HW_RP d)(d,__VA_ARGS__)
105 #define _hwa_cfadbtrg30(d,o,v,...) _hwa_cfadbtrg200(v,)(o,v,__VA_ARGS__) // Push
106 #define _hwa_cfadbtrg31(d,o,v,...) HW_BV(_hwa_cfadbtrg20,adbtrg_,HW_A1 d,)(o,v,__VA_ARGS__) // Push
107 
108 #define _hw_adbtrg_manual , 0, 0 /* , ate, ts */
109 #define _hw_adbtrg_auto , 1, 0
110 #define _hw_adbtrg_acmp0_irq , 1, 1
111 #define _hw_adbtrg_int0_irq , 1, 2
112 #define _hw_adbtrg_counter0_irq_compare0 , 1, 3
113 #define _hw_adbtrg_counter0_compare0_irq , 1, 3
114 #define _hw_adbtrg_counter0_irq , 1, 4
115 #define _hw_adbtrg_counter0_irq_overflow , 1, 4
116 #define _hw_adbtrg_counter1_irq_compare1 , 1, 5
117 #define _hw_adbtrg_counter1_compare1_irq , 1, 5
118 #define _hw_adbtrg_counter1_irq , 1, 6
119 #define _hw_adbtrg_counter1_overflow_irq , 1, 6
120 #define _hw_adbtrg_counter1_irq_capture0 , 1, 7
121 #define _hw_adbtrg_counter1_capture0_irq , 1, 7
122 
123 /* Mandatory parameter 'vref'
124  */
125 #define _hwa_cfadbref(o,v,k,...) HW_BW(_hwa_cfadbref,vref,k)(o,k,__VA_ARGS__)
126 #define _hwa_cfadbref0(o,k,...) HW_E(HW_EM_AN(k,vref))
127 #define _hwa_cfadbref1(o,k,v,...) HW_B(_hwa_cfadbref2, _hw_par v)(o,v,__VA_ARGS__)
128 
129 /* "bandgap_1100mV"
130  */
131 #define _hwa_cfadbref20(o,v,...) HW_BV(_hwa_cfadbref20,adbref_,v,o)(o,v,__VA_ARGS__) // Push
132 #define _hwa_cfadbref201(v,o) _hwa_write(o,refs,v); _hwa_cfadbal // Pop
133 #define _hwa_cfadbref200(v,...) HW_E(HW_EM_VAL(v,vref,((pin,avcc), (pin,aref), bandgap_1100mV))) HW_EAT // Pop
134 
135 /* (pin,aref) or (pin,avcc)
136  */
137 #define _hwa_cfadbref21(o,v,...) _hwa_cfadbref22((HW_X(v)),o,v,__VA_ARGS__)
138 #define _hwa_cfadbref22(...) _hwa_cfadbref23(__VA_ARGS__)
139 #define _hwa_cfadbref23(d,...) HW_BW(_hwa_cfadbref3,_pin,HW_RP d)(d,__VA_ARGS__)
140 #define _hwa_cfadbref30(d,o,v,...) _hwa_cfadbref200(v,)(o,v,__VA_ARGS__) // Push
141 #define _hwa_cfadbref31(d,o,v,...) HW_BV(_hwa_cfadbref20,adbref_,HW_A1 d,o)(o,v,__VA_ARGS__) // Push
142 
143 #define _hw_adbref_pin_aref , 0 /* , refs */
144 #define _hw_adbref_pin_avcc , 1
145 #define _hw_adbref_bandgap_1100mV , 3
146 
147 /* Optionnal parameter 'align'
148  */
149 #define _hwa_cfadbal(o,v,k,...) HW_BW(_hwa_cfadbal,align,k)(o,k,__VA_ARGS__)
150 #define _hwa_cfadbal0 _hwa_cfadbin
151 #define _hwa_cfadbal1(o,k,v,...) HW_BV(_hwa_cfadbal1,adbal_,v,o)(o,v,__VA_ARGS__) // Push
152 #define _hwa_cfadbal10(v,o) HW_E(HW_EM_VOAL(v,align,(left,right))) HW_EAT // Pop
153 #define _hwa_cfadbal11(v,o) _hwa_write(o,lar,v); _hwa_cfadbin // Pop
154 
155 #define _hw_adbal_left , 1 /* , lar */
156 #define _hw_adbal_right , 0
157 
158 /* Mandatory parameter `input`
159  */
160 #define _hwa_cfadbin(o,v,k,...) HW_BW(_hwa_cfadbin,input,k)(o,k,__VA_ARGS__)
161 #define _hwa_cfadbin0(k) HW_E(HW_EM_AN(k,input))
162 #define _hwa_cfadbin1(o,k,v,...) HW_BV(_hwa_cfadbin1,adbin_,v,o)(o,v,__VA_ARGS__) // Push
163 #define _hwa_cfadbin10(v,o) HW_E(HW_EM_VAL(v,input,((pin,adc0..7),temperature,bandgap,gnd))) HW_EAT // Pop
164 #define _hwa_cfadbin11(v,o) _hwa_write(o,mux,v); _hwa_cfadbin12 // Pop
165 #define _hwa_cfadbin12(o,v,...) HW_EOL(__VA_ARGS__)
166 #define _hwa_cfadbin1_(o,v,...) _hwa_write(o,mux,_hw_adbin(HW_ADDRESS(v))); HW_EOL(__VA_ARGS__)
167 
168 #define _hw_adbin_temperature , 8 /* , mux */
169 #define _hw_adbin_bandgap_1100mV , 14
170 #define _hw_adbin_gnd , 15
171 
172 HW_INLINE uint8_t _hw_adbin( uint32_t a )
173 {
174  if ( a==HW_ADDRESS(pin_adc0) ) return 0;
175  if ( a==HW_ADDRESS(pin_adc1) ) return 1;
176  if ( a==HW_ADDRESS(pin_adc2) ) return 2;
177  if ( a==HW_ADDRESS(pin_adc3) ) return 3;
178  if ( a==HW_ADDRESS(pin_adc4) ) return 4;
179  if ( a==HW_ADDRESS(pin_adc5) ) return 5;
180  if ( a==HW_ADDRESS(pin_adc6) ) return 6;
181  if ( a==HW_ADDRESS(pin_adc7) ) return 7;
182  HWA_E(HW_EM_AVL(input,((pin,adc0..7), temperature, bandgap_1100mV, gnd)));
183  return 0 ;
184 }
185 
186 
187 /* Power management
188  */
189 #define hw_power__adb , _hw_power
190 #define hwa_power__adb , _hwa_power
191 
192 
206 #define hw_enable__adb , _hw_enable_adx_
207 #define hwa_enable__adb , _hwa_enable_adx_
208 
209 
223 #define hw_disable__adb , _hw_disable_adx_
224 #define hwa_disable__adb , _hwa_disable_adx_
225 
226 
240 #define hw_trigger__adb , _hw_trigger_adx_
241 #define hwa_trigger__adb , _hwa_trigger_adx_
242 
243 
253 #define hw_read__adb , _hw_rdadx_
254 
265 #define hw_read_atomic__adb , _hw_ardadx_
266 
267 
290 #define hw_stat__adb , _hw_stat_adx_
291 
292 
293 /*******************************************************************************
294  * *
295  * Context management *
296  * *
297  *******************************************************************************/
298 
299 #define _hwa_setup__adb(o,a) _hwa_setup__adx_(o)
300 #define _hwa_init__adb(o,a) _hwa_init__adx_(o)
301 #define _hwa_commit__adb(o,a) _hwa_commit__adx_(o)
302 
303 
HWA_E
#define HWA_E(...)
Trigger an error after code optimization.
Definition: hwa_2.h:17
HW_ADDRESS
#define HW_ADDRESS(...)
Returns the address of an object or -1 if the object does not exist.
Definition: hwa_1.h:454
adx_2.h
10-bit analog to digital converter common methods