Код (см. ниже) выдает всегда 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.