Код (см. ниже) выдает всегда VRMS = 0008FFh, IRMS = 000000h вне зависимости от сигнала, поданного на входы. Где косяк?
Код
#include <iom8.h>
#include <inavr.h>
#define bit(n) (1 << (n))
#define setbit(p,n) (p|=bit(n))
#define clrbit(p,n) (p&=~bit(n))
#define MASTERCLOCK 14745600
#define delay_us(c) __delay_cycles(MASTERCLOCK/1000000*c)
#define delay_ms(c) __delay_cycles(MASTERCLOCK/1000*c)
// Порт B
#define MOSI 3
#define MISO 4
#define SCK 5
// Порт C
#define ADE_CS 4
void PortInit(void)
{
DDRB = (1<<MOSI) | (1<<SCK);
PORTB = (1<<MISO) | (1<<MOSI) | (1<<SCK); // Включаем подтяжки SPI
DDRC = (1<<ADE_CS);
PORTC = 0;
}// PortInit
unsigned long int em_Waveform = 0;
unsigned long int em_AEnergy = 0;
unsigned long int em_RAEnergy = 0;
unsigned long int em_LAEnergy = 0;
unsigned long int em_VAEnergy = 0;
unsigned long int em_RVAEnergy = 0;
unsigned long int em_LVAEnergy = 0;
unsigned long int em_LVAREnergy = 0;
unsigned int em_Mode = 0;
unsigned int em_IRQen = 0;
unsigned int em_Status = 0;
unsigned int em_RSTStatus = 0;
unsigned char em_CH1OS = 0;
unsigned char em_CH2OS = 0;
unsigned char em_Gain = 0;
unsigned char em_PHCAL = 0;
unsigned int em_APOS = 0;
unsigned int em_WGain = 0;
unsigned char em_WDiv = 0;
unsigned int em_CFNum = 0;
unsigned int em_CFDen = 0;
unsigned long int em_IRMS = 0;
unsigned long int em_VRMS = 0;
unsigned int em_IRMSOS = 0;
unsigned int em_VRMSOS = 0;
unsigned int em_VAGAIN = 0;
unsigned char em_VADIV = 0;
unsigned int em_LineCyc = 0;
unsigned int em_ZXTOut = 0;
unsigned char em_SAGCyc = 0;
unsigned char em_SAGLvl = 0;
unsigned char em_IPKLvl = 0;
unsigned char em_VPKLvl = 0;
unsigned long int em_Ipeak = 0;
unsigned long int em_RSTIpeak = 0;
unsigned long int em_Vpeak = 0;
unsigned long int em_RSTVpeak = 0;
unsigned char em_Temp = 0;
unsigned int em_Period = 0;
unsigned char em_Tmode = 0;
unsigned char em_CHKSum = 0;
unsigned char em_DieRev = 0;
#define EM_WAVEFORM_ADDR (0x01)
#define EM_AENERGY_ADDR (0x02)
#define EM_RAENERGY_ADDR (0x03)
#define EM_LAENERGY_ADDR (0x04)
#define EM_VAENERGY_ADDR (0x05)
#define EM_RVAENERGY_ADDR (0x06)
#define EM_LVAENERGY_ADDR (0x07)
#define EM_LVARENERGY_ADDR (0x08)
#define EM_MODE_ADDR (0x09)
#define DISHPF (0)
#define DISSAG (3)
#define TEMPSEL (5)
#define SWRST (6)
#define EM_IRQEN_ADDR (0x0A)
#define EM_STATUS_ADDR (0x0B)
#define EM_RSTSTATUS_ADDR (0x0C)
#define EM_CH1OS_ADDR (0x0D)
#define EM_CH2OS_ADDR (0x0E)
#define EM_GAIN_ADDR (0x0F)
#define EM_PHCAL_ADDR (0x10)
#define EM_APOS_ADDR (0x11)
#define EM_WGAIN_ADDR (0x12)
#define EM_WDIV_ADDR (0x13)
#define EM_CFNUM_ADDR (0x14)
#define EM_CFDEN_ADDR (0x15)
#define EM_IRMS_ADDR (0x16)
#define EM_VRMS_ADDR (0x17)
#define EM_IRMSOS_ADDR (0x18)
#define EM_VRMSOS_ADDR (0x19)
#define EM_VAGAIN_ADDR (0x1A)
#define EM_VADIV_ADDR (0x1B)
#define EM_LINECYC_ADDR (0x1C)
#define EM_ZXTOUT_ADDR (0x1D)
#define EM_SAGCYC_ADDR (0x1E)
#define EM_SAGLVL_ADDR (0x1F)
#define EM_IPKLVL_ADDR (0x20)
#define EM_VPKLVL_ADDR (0x21)
#define EM_IPEAK_ADDR (0x22)
#define EM_RSTIPEAK_ADDR (0x23)
#define EM_VPEAK_ADDR (0x24)
#define EM_RSTVPEAK_ADDR (0x25)
#define EM_TEMP_ADDR (0x26)
#define EM_PERIOD_ADDR (0x27)
#define EM_TMODE_ADDR (0x3D)
#define EM_CHKSUM_ADDR (0x3E)
#define EM_DIEREV_ADDR (0x3F)
#define CommWR 0x80
void initMasterSPI(void)
{
SPCR = (1<<SPE)|(1<<MSTR)|(1<<CPHA)|(0<<CPOL)|(0<<SPR0)|(1<<SPR1);
}
void transmitMasterSPI(unsigned char SPIData )
{
SPDR = SPIData;
while( !( SPSR & ( 1 << SPIF )));
}
unsigned char ReadADE_8bit (unsigned char RegAddr)
{
clrbit(PORTC, ADE_CS);
delay_us(100);
transmitMasterSPI( RegAddr );
delay_us(100);
transmitMasterSPI( 0 );
delay_us(100);
setbit(PORTC, ADE_CS);
delay_us(100);
return SPDR;
}
void WriteADE_8bit (unsigned char RegAddr, unsigned char RegVal)
{
clrbit(PORTC, ADE_CS);
delay_us(1);
transmitMasterSPI( CommWR | RegAddr );
delay_us(1);
transmitMasterSPI( RegVal );
delay_us(1);
setbit(PORTC, ADE_CS);
delay_us(1);
}
unsigned int ReadADE_16bit (unsigned char RegAddr)
{
unsigned int ADEword = 0;
clrbit(PORTC, ADE_CS);
delay_us(100);
transmitMasterSPI( RegAddr );
delay_us(100);
transmitMasterSPI( 0 );
ADEword = SPDR;
ADEword <<= 8;
delay_us(100);
transmitMasterSPI( 0 );
ADEword |= SPDR;
delay_us(100);
setbit(PORTC, ADE_CS);
delay_us(100);
return ADEword;
}
void WriteADE_16bit (unsigned char RegAddr, unsigned int RegVal)
{
unsigned char HiByte = (unsigned char) (RegVal >> 8);
unsigned char LoByte = (unsigned char) (RegVal);
clrbit(PORTC, ADE_CS);
delay_us(100);
transmitMasterSPI( CommWR | RegAddr );
delay_us(100);
transmitMasterSPI( HiByte );
delay_us(100);
transmitMasterSPI( LoByte );
delay_us(100);
setbit(PORTC, ADE_CS);
delay_us(100);
}
unsigned long int ReadADE_24bit (unsigned char RegAddr)
{
unsigned long int ADEword = 0;
clrbit(PORTC, ADE_CS);
delay_us(100);
transmitMasterSPI( RegAddr );
delay_us(100);
transmitMasterSPI( 0 );
ADEword = SPDR;
ADEword <<= 8;
delay_us(100);
transmitMasterSPI( 0 );
ADEword |= SPDR;
ADEword <<= 8;
delay_us(100);
transmitMasterSPI( 0 );
ADEword |= SPDR;
delay_us(100);
setbit(PORTC, ADE_CS);
delay_us(100);
return ADEword;
}
void main(void)
{
PortInit();
initMasterSPI();
em_Mode |= (1<<SWRST);
WriteADE_16bit (EM_MODE_ADDR, em_Mode);
delay_ms(500);
em_Mode = ReadADE_16bit (EM_MODE_ADDR);
OutText("MODE = "); OutDat(em_Mode, 4, 16); OutText("h.\n\r");
em_IRQen = ReadADE_16bit (EM_IRQEN_ADDR);
OutText("IRQEN = "); OutDat(em_IRQen, 4, 16); OutText("h.\n\r");
em_RSTStatus = ReadADE_16bit (EM_RSTSTATUS_ADDR);
OutText("RSTSTATUS = "); OutDat(em_RSTStatus, 4, 16); OutText("h.\n\r");
em_DieRev = ReadADE_8bit (EM_DIEREV_ADDR);
OutText("Die Revision = "); OutDat(em_DieRev, 2, 16); OutText("h.\n\r");
em_IRMS = ReadADE_24bit (EM_IRMS_ADDR);
em_VRMS = ReadADE_24bit (EM_VRMS_ADDR);
OutText("VRMS = ");OutDat(em_VRMS, 6, 16);OutText("h.\n\r");
OutText("IRMS = ");OutDat(em_IRMS, 6, 16);OutText("h.\n\r");
while (1)
{
};
}// main()
Результат программы:
MODE = 000Ch.
IRQEN = 0040h.
RSTSTATUS = 0050h.
Die Revision = 02h.
VRMS = 0008FFh.
IRMS = 000000h.