/*
Copyright (C) 2006 T. Scott Dattalo
This file is part of gpsim.
gpsim is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
gpsim is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with gpasm; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef __A2DCONVERTER_H__
#define __A2DCONVERTER_H__
#include "registers.h"
#include "trigger.h"
#include "intcon.h"
#include "pir.h"
class PinModule;
class pic_processor;
//---------------------------------------------------------
// ADRES
//
class ADRES : public sfr_register
{
public:
void put(int new_value);
};
//---------------------------------------------------------
// ADCON1
//
class ADCON1 : public sfr_register
{
public:
enum PCFG_bits
{
PCFG0 = 1<<0,
PCFG1 = 1<<1,
PCFG2 = 1<<2,
PCFG3 = 1<<3, // 16f87x etc.
VCFG0 = 1<<4, // 16f88
VCFG1 = 1<<5, // 16f88
ADCS2 = 1<<6,
ADFM = 1<<7 // Format Result select bit
};
ADCON1();
void setChannelConfiguration(unsigned int cfg, unsigned int bitMask);
void setVrefLoConfiguration(unsigned int cfg, unsigned int channel);
void setVrefHiConfiguration(unsigned int cfg, unsigned int channel);
unsigned int getVrefHiChannel(unsigned int cfg);
unsigned int getVrefLoChannel(unsigned int cfg);
double getChannelVoltage(unsigned int channel);
double getVrefHi();
double getVrefLo();
void setValidCfgBits(unsigned int m, unsigned int s);
void setNumberOfChannels(unsigned int);
void setIOPin(unsigned int, PinModule *);
int get_cfg(unsigned int);
private:
PinModule **m_AnalogPins;
unsigned int m_nAnalogChannels;
unsigned int mValidCfgBits;
unsigned int mCfgBitShift;
static const unsigned int cMaxConfigurations=16;
/* Vrefhi/lo_position - this is an array that tells which
* channel the A/D converter's voltage reference(s) are located.
* The index into the array is formed from the PCFG bits.
* The encoding is as follows:
* 0-7: analog channel containing Vref(s)
* 8: The reference is internal (i.e. Vdd)
* 0xff: The analog inputs are configured as digital inputs
*/
unsigned int Vrefhi_position[cMaxConfigurations];
unsigned int Vreflo_position[cMaxConfigurations];
/* configuration bits is an array of 8-bit masks definining whether or not
* a given channel is analog or digital
*/
unsigned int m_configuration_bits[cMaxConfigurations];
};
//---------------------------------------------------------
// ADCON0
//
class ADCON0 : public sfr_register, public TriggerObject
{
public:
enum
{
ADON = 1<<0,
ADIF = 1<<1,
GO = 1<<2,
CHS0 = 1<<3,
CHS1 = 1<<4,
CHS2 = 1<<5,
ADCS0 = 1<<6,
ADCS1 = 1<<7
};
enum AD_states
{
AD_IDLE,
AD_ACQUIRING,
AD_CONVERTING
};
ADCON0();
void start_conversion();
void stop_conversion();
virtual void set_interrupt();
virtual void callback();
void put(unsigned int new_value);
void put_conversion();
bool getADIF() { return (value.get() & ADIF) != 0; }
void setAdres(ADRES *);
void setAdresLow(ADRES *);
void setAdcon1(ADCON1 *);
void setIntcon(INTCON *);
void setA2DBits(unsigned int);
void setChannel_Mask(unsigned int ch_mask) { channel_mask = ch_mask; }
private:
ADRES *adres;
ADRES *adresl;
ADCON1 *adcon1;
INTCON *intcon;
double m_dSampledVoltage;
double m_dSampledVrefHi;
double m_dSampledVrefLo;
unsigned int m_A2DScale;
unsigned int m_nBits;
guint64 future_cycle;
unsigned int ad_state;
unsigned int Tad_2;
unsigned int Tad;
unsigned int channel_mask;
};
//---------------------------------------------------------
// ADCON0_withccp
//
class ADCON0_withccp : public ADCON0
{
public:
PIR_SET *pir_set;
virtual void set_interrupt();
};
//---------------------------------------------------------
// ANSEL
//
class ANSEL : public sfr_register
{
public:
enum
{
ANS0 = 1 << 0,
ANS1 = 1 << 1,
ANS2 = 1 << 2,
ANS3 = 1 << 3,
ANS4 = 1 << 4,
ANS5 = 1 << 5,
ANS6 = 1 << 6
};
void setAdcon1(ADCON1 *new_adcon1);
void put(unsigned int new_val);
private:
ADCON1 *adcon1;
};
#endif // __A2DCONVERTER_H__
syntax highlighted by Code2HTML, v. 0.9.1