ขอปรึกษาการเชื่อมต่อ spi ระหว่าง pic16f887 กับ ADE7763 power meter หน่อยครับ ว่าการคุยกันทำอย่างไร พอดีลองเขียนโค๊ดแล้วมันทำงานไม่ได้อะครับ ค่าที่ออกมามันได้เป็น 0000 กับ 00ff อะครับ 0000 คือไม่ได้จ่ายไฟเลี้ยง ade7763 พอจ่ายไฟเลี้ยงพร้อมกับโหลดให้ ade7763 ก็จะส่งค่า 00ff มาครับ
แก้จน หมดปัญญาละครับ ผมต่อขาสัญญาณ spi ดังนี้ครับ
pic sdo (C5) เข้า sdi ade7763
pic sdi (C4) เข้า sdo ade7763
pic sck (C3) เข้า sck ade7763
pic ss (A5) เข้า ss ade7763
อันนี้ data sheet ade7763
http://www.analog.com/static/imported-files/data_sheets/ADE7763.pdf
อันนี้โค๊ดครับ
#include <16f887.h>
#include <stdio.h>
#include <stdlib.h>
#include "string.h"
#use delay(clock=20000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PC_COM)// ID20 Communication
////////////////////define switch//////////////////////////////////////
int count;
unsigned char letter[17];
int1 check;
int1 finish = 0;
unsigned long int irms,vrms,va,pf;//;
long long watt;
int8 result[3];
void Init_ADE7763()
{
spi_write(0x0F|0x80);
delay_ms(100);
spi_write(0x09|0x80);
delay_us(6);
spi_write(0x000c);
spi_write(0x0A|0x80);
delay_us(6);
spi_write(0x0010);
delay_ms(100);
}
unsigned long int Read_Vrms()
{
unsigned char i,j;
unsigned long int Vrms_temp,Vrms_Cal;
unsigned long int Sum_Vrms,Avg_Total,Temp_Vrms,Vrms_Final[6];
unsigned int Rstatus;
int check=0;
Sum_Vrms = 0;
result[0] = 0;
result[1] = 0;
result[2] = 0;
for(j=0;j<5;j++)
{
for(i=0;i<100;i++)
{
do
{
spi_write(0x03);
delay_us(6);
result[0] = spi_read();
delay_us(6);
result[1] = spi_read();
result[0] = result[0]<<8;
Rstatus = result[1]+result[0];
Rstatus = (Rstatus & 0x001F);
}while(Rstatus == 0x0010);
spi_write(0x17);
delay_us(6);
result[0] = spi_read();
delay_us(6);
result[1] = spi_read();
delay_us(6);
result[2] = spi_read();
result[0] = result[0]<<16;
result[1] = result[0]<<8;
Temp_Vrms = result[0]+result[1]+result[2];
delay_us(10);
Sum_Vrms = Sum_Vrms + Temp_Vrms;
if(Sum_Vrms > 0)
check++;
}
Avg_Total = (Sum_Vrms/check);
Vrms_Final[j] = Avg_Total;
Sum_Vrms = 0;
check = 0;
}
Vrms_temp = Vrms_Final[3];
spi_write(0x0C);
delay_us(6);
result[0] = spi_read();
delay_us(6);
result[1] = spi_read();
result[0] = result[0]<<8;
Rstatus = result[1]+result[0];
return Vrms_temp;
}
void main(void)
{
set_tris_a(0xFF);
set_tris_b(0xFF);
set_tris_d(0x00);
set_tris_c(0b10001000);
int i;
setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16);
Init_ADE7763();
while(1)
{
vrms = Read_Vrms();
printf("Data 0x16 Irms : %4x \r\n ",vrms);
delay_ms(1000);
}
}
รบกวนช่วยหน่อยนะครับ TT
ขอรบกวนสอบถามวิธีการใช้ pic คุยแบบ spi กับ ADE7763 power meter ครับ
แก้จน หมดปัญญาละครับ ผมต่อขาสัญญาณ spi ดังนี้ครับ
pic sdo (C5) เข้า sdi ade7763
pic sdi (C4) เข้า sdo ade7763
pic sck (C3) เข้า sck ade7763
pic ss (A5) เข้า ss ade7763
อันนี้ data sheet ade7763 http://www.analog.com/static/imported-files/data_sheets/ADE7763.pdf
อันนี้โค๊ดครับ
#include <16f887.h>
#include <stdio.h>
#include <stdlib.h>
#include "string.h"
#use delay(clock=20000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PC_COM)// ID20 Communication
////////////////////define switch//////////////////////////////////////
int count;
unsigned char letter[17];
int1 check;
int1 finish = 0;
unsigned long int irms,vrms,va,pf;//;
long long watt;
int8 result[3];
void Init_ADE7763()
{
spi_write(0x0F|0x80);
delay_ms(100);
spi_write(0x09|0x80);
delay_us(6);
spi_write(0x000c);
spi_write(0x0A|0x80);
delay_us(6);
spi_write(0x0010);
delay_ms(100);
}
unsigned long int Read_Vrms()
{
unsigned char i,j;
unsigned long int Vrms_temp,Vrms_Cal;
unsigned long int Sum_Vrms,Avg_Total,Temp_Vrms,Vrms_Final[6];
unsigned int Rstatus;
int check=0;
Sum_Vrms = 0;
result[0] = 0;
result[1] = 0;
result[2] = 0;
for(j=0;j<5;j++)
{
for(i=0;i<100;i++)
{
do
{
spi_write(0x03);
delay_us(6);
result[0] = spi_read();
delay_us(6);
result[1] = spi_read();
result[0] = result[0]<<8;
Rstatus = result[1]+result[0];
Rstatus = (Rstatus & 0x001F);
}while(Rstatus == 0x0010);
spi_write(0x17);
delay_us(6);
result[0] = spi_read();
delay_us(6);
result[1] = spi_read();
delay_us(6);
result[2] = spi_read();
result[0] = result[0]<<16;
result[1] = result[0]<<8;
Temp_Vrms = result[0]+result[1]+result[2];
delay_us(10);
Sum_Vrms = Sum_Vrms + Temp_Vrms;
if(Sum_Vrms > 0)
check++;
}
Avg_Total = (Sum_Vrms/check);
Vrms_Final[j] = Avg_Total;
Sum_Vrms = 0;
check = 0;
}
Vrms_temp = Vrms_Final[3];
spi_write(0x0C);
delay_us(6);
result[0] = spi_read();
delay_us(6);
result[1] = spi_read();
result[0] = result[0]<<8;
Rstatus = result[1]+result[0];
return Vrms_temp;
}
void main(void)
{
set_tris_a(0xFF);
set_tris_b(0xFF);
set_tris_d(0x00);
set_tris_c(0b10001000);
int i;
setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16);
Init_ADE7763();
while(1)
{
vrms = Read_Vrms();
printf("Data 0x16 Irms : %4x \r\n ",vrms);
delay_ms(1000);
}
}
รบกวนช่วยหน่อยนะครับ TT