4 Copyright 2008, 2009 Michel Pollet <buserror@gmail.com>
6 This file is part of simavr.
8 simavr is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 simavr is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with simavr. If not, see <http://www.gnu.org/licenses/>.
22 #ifndef __AVR_ADC_H___
23 #define __AVR_ADC_H___
28 * simavr ADC allows external code to feed real voltages to the
29 * simulator, and the simulator uses it's 'real' reference voltage
30 * to do the right thing and return the 'proper' 10 bits ADC value
31 * to the AVR firmware.
33 * To send values to the ADC, register your code to wait for the
34 * ADC_IRQ_OUT_TRIGGER irq, and at that point send any of the
35 * ADC_IRQ_ADC* with Millivolts as value.
37 * External trigger is not done yet.
41 // input IRQ values. Values are /always/ volts * 1000 (millivolts)
42 ADC_IRQ_ADC0 = 0, ADC_IRQ_ADC1, ADC_IRQ_ADC2, ADC_IRQ_ADC3,
43 ADC_IRQ_ADC4, ADC_IRQ_ADC5, ADC_IRQ_ADC6, ADC_IRQ_ADC7,
44 ADC_IRQ_TEMP, // see the datasheet
46 ADC_IRQ_OUT_TRIGGER, // sends a avr_adc_mux_t
50 // Get the internal IRQ corresponding to the INT
51 #define AVR_IOCTL_ADC_GETIRQ AVR_IOCTL_DEF('a','d','c',' ')
54 * Definition of a ADC mux mode.
57 ADC_MUX_NONE = 0, // Nothing. return 0
58 ADC_MUX_NOISE, // Nothing. return something random
59 ADC_MUX_SINGLE, // Normal ADC pin reading
60 ADC_MUX_DIFF, // differencial channels (src-diff)
61 ADC_MUX_TEMP, // internal temp sensor
62 ADC_MUX_REF, // reference voltage (in src * 100)
63 ADC_MUX_VCC4, // VCC/4
65 typedef struct avr_adc_mux_t {
66 unsigned long kind : 3, gain : 8, diff : 8, src : 13;
70 ADC_VREF_AREF = 0, // default mode
77 typedef struct avr_adc_t {
81 // if the last bit exists in the mux, we are an extended ADC
83 avr_regbit_t ref[3]; // reference voltages bits
84 uint16_t ref_values[7]; // ADC_VREF_*
86 avr_regbit_t adlar; // left/right adjustment bit
88 uint8_t r_adcsra; // ADC Control and Status Register A
89 avr_regbit_t aden; // ADC Enabled
90 avr_regbit_t adsc; // ADC Start Conversion
91 avr_regbit_t adate; // ADC Auto Trigger Enable
93 avr_regbit_t adps[3]; // Prescaler bits. Note that it's a frequency bit shift
95 uint8_t r_adcl, r_adch; // Data Registers
97 uint8_t r_adcsrb; // ADC Control and Status Register B
98 avr_regbit_t adts[3]; // Timing Source
99 avr_regbit_t bin; // Bipolar Input Mode (tinyx5 have it)
100 avr_regbit_t ipr; // Input Polarity Reversal (tinyx5 have it)
102 // use ADIF and ADIE bits
103 avr_int_vector_t adc;
108 avr_adc_mux_t muxmode[32];// maximum 5 bits of mux modes
109 uint16_t adc_values[8]; // current values on the ADCs
110 uint16_t temp; // temp sensor reading
112 uint8_t read_status; // marked one when adcl is read
115 void avr_adc_init(avr_t * avr, avr_adc_t * port);
119 * Helper macros for the Cores definition of muxes
121 #define AVR_ADC_SINGLE(_chan) { \
122 .kind = ADC_MUX_SINGLE, \
125 #define AVR_ADC_DIFF(_a,_b,_g) { \
126 .kind = ADC_MUX_DIFF, \
131 #define AVR_ADC_REF(_t) { \
132 .kind = ADC_MUX_REF, \
135 #define AVR_ADC_TEMP() { \
136 .kind = ADC_MUX_TEMP, \
139 #define AVR_ADC_VCC4() { \
140 .kind = ADC_MUX_VCC4, \
143 #endif /* __AVR_ADC_H___ */