/*
* PDMS.c
*
* Created: 2012/12/9 18:47:59
* Author: Administrator
*/
//#include <avr/io.h>
//#include <avr/iom128.h>
//#define F_CPU 11059200 // 主频为11.0592MHz,用于延时子程序
//#define F_CPU 8000000
//#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <avr/eeprom.h>
#include "att7022c.h"
#include "PDMS_COMM.h"
#include "FM25040.h"
#include "Modbus.h"
#include "PDMS.h"
volatile uint32_t Att_ChkSum1 = 0;
volatile uint32_t Att_ChkSum2 = 0;
//
volatile uint8_t LED_Buf[3][4];
volatile uint8_t LED_Km = 0;
volatile uint8_t TMDP_NUM = 0;
//
volatile uint8_t DISP = 0;
// UART Buffer Size Defines
#define UART_RX_BUFFER_SIZE 128
//#define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1 )
#define UART_TX_BUFFER_SIZE 128
//#define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1 )
// UART Buffer DEfines
static uint8_t UART_RxBuf[UART_RX_BUFFER_SIZE];
// static volatile uint8_t UART_RxHead;
static volatile uint8_t UART_RxTail = 0;
static uint8_t UART_TxBuf[UART_TX_BUFFER_SIZE];
// static volatile uint8_t UART_TxHead;
static volatile uint8_t UART_TxTail;
//
volatile uint16_t CRC_Word = 0xffff; //计算CRC校验码
volatile uint16_t RX_CRC_Word = 0xffff; //接收到CRC校验码
// 通讯定时超时计数
uint16_t MB_Timer0_Count;
//接收到的起始地址
uint16_t RX_Reg_SAddr;
// 接收到的寄存器数量
uint16_t RX_Reg_Amount;
// 接收整帧标志
volatile uint8_t RX_Flag = 0;
//
uint16_t BAUD=9600; //波特率默认9600
//
void Att7022_Init(void);
void CalibrateInit(void);
void CalibrateInitEx(void);
// 系统初始化
void LoadSYS_Init(void);
void Load_FM2540(void);
void StoreSYS_Param(void);
void Store_FM2540(void);
void Sys_Init(void);
// 键盘扫描
uint8_t GetKey(void);
//
void PutLed_Val(uint8_t row, uint32_t val, uint32_t rem);
// 显示电压
void DispU(void);
// 显示电流
void DispI(void);
// 显示功率
void DispPQC(void);
// 显示频率
void DispLF(void);
// 显示正有功电能值
void DispEP(void);
// 显示正无功电能
void DispEQ(void);
//
void DispLEDS(void);
//
void DispLED_X(void);
void DispLED_Menu(void);
//
void EnableLED_CS(uint8_t k);
void DisableLED_CS(uint8_t k);
// 显示指示灯
void ShowIndicatorLight(void);
// 编程菜单
void AdjustSysParam(void);
// 第1级菜单处理[返回选择1级菜单分支]
uint8_t EnterLevelMenu1(uint8_t sel);
// 登陆
uint8_t LogonMenu(void);
// SET 菜单
uint8_t EnterSEtMenu(uint8_t sel);
// SEt DISP
uint8_t EnterSEtDISP(void);
// SEt b.LEd
uint8_t EnterSEtbLEd(void);
// SEt CLr.E
uint8_t EnterSEtCLrE(void);
// InPt menu
uint8_t EnterInPtMenu(uint8_t sel);
// InPt NET
uint8_t EnterInPtNET(void);
// InPt U
uint8_t EnterInPtU(void);
// InPt I
uint8_t EnterInPtI(void);
// InPt PT
uint8_t EnterInPtPT(void);
// InPt CT
uint8_t EnterInPtCT(void);
// Conn menu
uint8_t EnterConnMenu(uint8_t sel);
// Conn addr
uint8_t EnterConnAddr(void);
// Conn baud
uint8_t EnterConnBaud(void);
// Conn data
uint8_t EnterConnData(void);
// Code menu
uint8_t EnterCodeMenu(void);
// old pwd
uint8_t EnterCodeOldPwd(void);
// new pwd
uint8_t EnterCodeNewPwd(void);
// store param
uint8_t EnterStoreParam(void);
//
uint8_t EepromReadByte(uint8_t *address);
uint16_t EepromReadWord(uint16_t *address);
void EepromWriteByte(uint8_t *address,uint8_t data);
void EepromWriteWord(uint16_t *address, uint16_t data);
void EepromWriteBlock(uint8_t *buff,uint8_t *address,uint8_t n);
//
void Timer1_Init(void);
void Timer1_ovf_isr(void);
void Timer1_Close(void);
//
void WDT_off(void);
void WDT_on(void);
//
void USART0_Init(); //USART寄存器设置
void USART0_Flush(); //刷新UDR0
void Timer0_Init(); //定时器0初始化
void Usart0_Transmit(uint8_t); //字节发送函数
void Req_RS(void);
uint16_t get_crc(uint16_t n); //计算CRC校验码
uint16_t GetRx_CRC(uint8_t n);
uint16_t GetTx_CRC(uint8_t n);
void Res_Fun03(void);
void Res_Fun04(void);
void Res_Fun10(void);
void Send_Tx_Data(void);
void RS485();
void RS_Tx_PutData(uint16_t skip_addr);
void RS_Tx_PutParam(uint16_t skip_addr);
void check_TXK(); //检测TXK设置通信方式和波特率
int main(void)
{
uint8_t key;
// uint8_t i;
// AVR INIT
Sys_Init();
// ATT7022 INIT
Att7022_Init();
//
delay_ms(1000);
//WDT_on();
//wdt_reset();
//
// USART0_Init();
//
while(1)
{
// RS485();
if (DISP == 1)
{
DispU();
}
else if (DISP == 2)
{
DispI();
}
else if (DISP == 3)
{
DispPQC();
}
else if (DISP == 4)
{
DispLF();
}
else if (DISP == 5)
{
DispEP();
}
else if (DISP == 6)
{
DispEQ();
}
//
ShowIndicatorLight();
//
//
//wdt_reset();
//
key = GetKey();
//wdt_reset();
// process key { 1 = Enter,2 = Menu, 3 = ->, 4 = <- }
if (key == 3)
{ //
DISP ++;
if (DISP >= 6)
{
DISP = 6;
}
}
else if (key == 4)
{
if (DISP > 0)
DISP --;
if (DISP == 0)
DISP = 1;
}
else if (key == 2)
{ // menu
//wdt_reset();
//WDT_off();
uint8_t state = DISP_NUM;
AdjustSysParam();
if (state != DISP_NUM)
{
if (DISP_NUM > 0)
Timer1_Close();
else
Timer1_Init();
}
//WDT_on();
//wdt_reset();
}
}
}
void Att7022_Init(void)
{
DDRA = 0xf2;
//
if (SYS_SRS & 0x80)
{ // n.3.4
ATT_SEL_1;
// PORTA &= ~(0x80);
}
else
{ // n.3.3
ATT_SEL_0;
//PORTA |= 0x80;
}
//PORTA |= 0x80;
//PORTA |= (1 << PA3);
ATT_SEL_0;
//
CalibrateInit();
}
void CalibrateInit(void)
{
// RST 0
ATT_RST_0;
delay_ms(2); // 延时1ms
// RST 1
ATT_RST_1;
delay_ms(500); // 延时500ms,等待AT7022正常工作
// 软件复位
WriteAtt7022(0xD3,0x000000);
delay_ms(500);
// 校表数据校验
Att_ChkSum1 = ReadAtt7022(0x3E);
// 清校表数据
WriteAtt7022(0xC3,0x000000);
// 校表数据写使能
WriteAtt7022(0xC9,0x000000);
// 填写电压通道 ADC 增益 UADCPga(0x3F)设置电压通道 ADC 放大倍数为 4:
WriteAtt7022(0x3F,0x465501);
// 5760000000*0.648*0.648*0.5*0.1/(220*1.5*3200)=114=72H
WriteAtt7022(0x20,0x000072);
// 起动电流设置
// Io=0.4%*Vi=0.004*0.1=0.0004
// Istartup=G* Io=0.648*0.0004=0.0002592
// Istartup=0.0002592*2^23=2174=87EH
WriteAtt7022(0x1F,0x00087E);
// A 相功率增益0: 三相电压输入220 伏,仅输入A 相电流1.5 安培,功率因数为1.0,标准表的电能误差读数为–0.74%,即err=-0.0074,则:
WriteAtt7022(0x06,0x000000);
// A 相功率增益1:
WriteAtt7022(0x09,0x000000);
// B 相功率增益0
WriteAtt7022(0x07,0x000000);
// B 相功率增益1
WriteAtt7022(0x0A,0x000000);
// C 相功率增益0
WriteAtt7022(0x08,0x000000);
// C 相功率增益1
WriteAtt7022(0x0B,0x000000);
// 比差补偿区域设置
//WriteAtt7022(0x1E,0x000000);
// 相位补偿区域设置
WriteAtt7022(0x02,0x000000); // 相位补偿区域设置1
WriteAtt7022(0x03,0x000000); // 相位补偿区域设置2
WriteAtt7022(0x04,0x000000); // 相位补偿区域设置3
WriteAtt7022(0x05,0x000000); // 相位补偿区域设置4
NOP();
// 设置合相能量累加模式
WriteAtt7022(0x2A,0x000000);
// A相功率增益
//writeatt7022(0x86,12293737);//A相功率增益0pa
//writeatt7022(0x89,12293737);//A相功率增益1
//-------------------------
//writeatt7022(0x87,9277740);//B相功率增益0pb
//writeatt7022(0x8A,9277740);//B相功率增益1
//-------------------------
//writeatt7022(0x88,9438312);//C相功率增益0pc
//writeatt7022(0x8B,9538312);//C相功率增益1
//-------------------------
WriteAtt7022(0x0C,0x000000); //A相区域0相位校正
WriteAtt7022(0x0D,0x000000); //A相区域1相位校正
WriteAtt7022(0x0E,0x000000); //A相区域2相位校正
WriteAtt7022(0x0F,0x000000); //A相区域3相位校正
WriteAtt7022(0x10,0x000000); //A相区域4相位校正
//-------------------------
WriteAtt7022(0x11,0x000000); //B相区域0相位校正
WriteAtt7022(0x12,0x000000); //B相区域1相位校正
WriteAtt7022(0x13,0x000000); //B相区域2相位校正
WriteAtt7022(0x14,0x000000); //B相区域3相位校正
WriteAtt7022(0x15,0x000000); //B相区域
评论1