?? main.c
字號:
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <inttypes.h>
#include "adc_sram.h"
#include "macro.h"
//全局變量////////////////////////////
uint8_t global_flag_serie;//通信狀態標志
uint16_t global_ad_counter;//AD轉換計數器
uint8_t global_start_sample_flag;//采樣開始標志
uint8_t global_sample_mode_flag;//采樣方式標志:手動或自動
uint8_t global_operation_detected_flag;//檢測到動作標志
uint16_t global_detect_close[5];//用于檢測合閘動作開始
uint16_t global_detect_trip[5];//用于檢測分閘動作開始
uint8_t global_channel_flag;//通道標志
uint16_t global_close_counter;//合閘線圈地址計數器
uint16_t global_trip_counter;//分閘線圈地址計數器
uint16_t global_motor_counter;//打壓電機地址計數器
uint16_t global_voltage_counter;//操作電壓地址計數器
uint8_t global_ad_finish_flag;//AD轉換結束標志
//串口接收中斷////////////////////////
SIGNAL(SIG_UART0_RECV)
{
//變量定義
uint8_t temp_data;
uint16_t i;
//關全局中斷
cli();
//等待接收到數據標志被置位
loop_until_bit_is_set(UCSR0A,RXC0);
//對接收到的字節進行判斷
temp_data=UDR0;//讀取接收的字節
if(temp_data!=0)//如果接收到非零
{
if(global_flag_serie==0)//如果接收到的為第一字節
{
switch (temp_data)
{
case 2://接到本機地址
global_flag_serie=1;//準備接收第二字節數據
UCSR0A&=~(1<<MPCM0);//清零MPCM0,允許繼續接收數據包
break;
// case 0://接到復位命令
// global_start_sample_flag=0xff;//復位開始
// break;
case 0x10://接到采集命令
global_start_sample_flag=0;//開始采集數據
// sbi(PORTG,3);//測試用///////////////
break;
// case 17://接到采集結束命令
// global_start_sample_flag=0xff;//結束采集數據
// break;
case 0x22://接收到自動測試信號
global_sample_mode_flag=0;
break;
default:
break;
}
}
else if((global_flag_serie==1)&&(temp_data<=32))//如果接收的是第二字節
{
for(i=0;i<0xfff;i++){;}//延時等待
SEND_ONE_PACKAGE(temp_data);//發送數據包,temp_data為包序號
// if(temp_data==17){sbi(PORTG,3);}//測試用////////////
global_flag_serie=0;
UCSR0A|=(1<<MPCM0);//準備接收地址
}
}
cbi(PORTE,2);//改為接收狀態
sei();
}
//AD轉換結束中斷int7//////////////////
SIGNAL(SIG_INTERRUPT7)
{
//變量定義
uint16_t int16_temp1;
uint8_t temp1,temp2,i;
//關中斷
cli();
//讀取ad轉換結果
int16_temp1=AD7891_READ();
//如果是需要保存到RAM的采樣
if(global_sample_mode_flag==0xFF)
{
//AD7891 deselect,否則數據總線與RAM沖突
sbi(PORTD,5);
//AD轉換結果存入RAM
temp1=int16_temp1/256;
temp2=int16_temp1%256;
//保存數據
switch(global_channel_flag)
{
case 1://保存合閘線圈電流
SRAM_1M_8_WRITE(global_close_counter,temp1);//高位字節
SRAM_1M_8_WRITE(global_close_counter+1,temp2);//低位字節
global_close_counter+=2;
break;
case 2://保存分閘線圈電流
SRAM_1M_8_WRITE(global_trip_counter,temp1);//高位字節
SRAM_1M_8_WRITE(global_trip_counter+1,temp2);//低位字節
global_trip_counter+=2;
break;
case 3://保存操作電壓
// SRAM_1M_8_WRITE(global_motor_counter,temp1);//高位字節
// SRAM_1M_8_WRITE(global_motor_counter+1,temp2);//低位字節
SRAM_1M_8_WRITE(global_voltage_counter,temp1);//高位字節
SRAM_1M_8_WRITE(global_voltage_counter+1,temp2);//低位字節
global_voltage_counter+=2;
// global_motor_counter+=2;
break;
// case 4://保存操作電壓
// SRAM_1M_8_WRITE(global_voltage_counter,temp1);//高位字節
// SRAM_1M_8_WRITE(global_voltage_counter+1,temp2);//低位字節
// global_voltage_counter+=2;
// break;
default:
break;
}
//計數器自加
global_ad_counter++;
}
//如果是檢測動作是否開始的采樣
if(global_sample_mode_flag==0x00)
{
//采樣輪轉賦值
//合閘線圈采樣
if(global_ad_counter%2==0)
{
// global_detect_close[0]=int16_temp1;
global_detect_close[0]=global_detect_close[1];
global_detect_close[1]=global_detect_close[2];
global_detect_close[2]=int16_temp1;
// global_detect_close[2]=int16_temp1;
}
//分閘線圈采樣
if(global_ad_counter%2==1)
{
// global_detect_trip[0]=int16_temp1;
global_detect_trip[0]=global_detect_trip[1];
global_detect_trip[1]=global_detect_trip[2];
global_detect_trip[2]=int16_temp1;
// global_detect_trip[2]=int16_temp1;
}
//判斷是否有碼值變化
//判斷合閘數據
if((global_detect_close[0]>2046)&&(global_detect_close[1]>2046)&&(global_detect_close[2]>2046))//&&(global_detect_close[3]>2045)&&(global_detect_close[4]>2045))
{
//檢測到動作標志賦值
global_operation_detected_flag=1;
}
// if(global_detect_close[0]>2049)
// {
// if((global_detect_close[1]-global_detect_close[0]>1)&&(global_detect_close[2]-global_detect_close[1]>1))//&&(global_detect_close[3]-global_detect_close[0]>1))
// {
//檢測到動作標志賦值
// global_operation_detected_flag=1;
// }
// }
//判斷分閘數據
if((global_detect_trip[0]>2046)&&(global_detect_trip[1]>2046)&&(global_detect_trip[2]>2046))//&&(global_detect_trip[3]>2045)&&(global_detect_trip[4]>2045))
{
//檢測到動作標志賦值
global_operation_detected_flag=1;
}
// if(global_detect_trip[0]>2049)
// {
// if((global_detect_trip[1]-global_detect_trip[0]>1)&&(global_detect_trip[2]-global_detect_trip[1]>1))//&&(global_detect_trip[3]-global_detect_trip[0]>1))
// {
//檢測到動作標志賦值
// global_operation_detected_flag=1;
// }
// }
// if(int16_temp1>2049)
// {
//檢測到動作標志賦值
// global_operation_detected_flag=1;
// }
global_ad_counter++;
}
//完成一次AD轉換,將AD轉換結束標志賦值
global_ad_finish_flag=0xFF;
//開中斷
sei();
}
//主程序//////////////////////////////
int main()
{
//變量定義
uint8_t i;
//初始化和串口波特率設置
INITIATION();
//PG3供測試用/////////////
sbi(DDRG,3);
cbi(PORTG,3);
//開中斷
sei();
//自動測試標志初始化
global_sample_mode_flag=0xFF;
//采集控制標志初始化
global_start_sample_flag=0xFF;
//串口接收控制變量初始化
global_flag_serie=0;
//開串口接收中斷
UART_RXCINT_OPEN();
//延時
for(i=0;i<0xFF;i++)
{
TIMER_BEGIN();
//等待定時器溢出,AD結束中斷處理在等待過程中完成
while(!(TIFR&(1<<OCF1A))){;}
TIFR|=1<<OCF1A;
//終止定時器
TIMER_STOP();
}
//數據采集流程
while(1)
{
//檢測動作開始標志清零
for(i=0;i<4;i++){global_detect_close[i]=0;}
for(i=0;i<4;i++){global_detect_trip[i]=0;}
//如果自動測試
if(global_sample_mode_flag==0x00)
{
//關串口接收中斷
UART_RXCINT_CLOSE();
//開外部中斷7(AD轉換結束中斷)
EXTERN_INTERRUPT_OPEN(7);
//檢測采樣
OPERATION_DETECTION();
//如果檢測到有信號變化,向COUNTER發送開始采集命令
sbi(UCSR0B,TXB8);//將TXB8置1
UART_DATA_BYTE_SEND(0x10);//發送數據采集命令
//開始采樣
SAMPLE();
//關外部中斷7
EXTERN_INTERRUPT_CLOSE(7);
//開串口接收中斷,等待數據包傳輸命令
UART_RXCINT_OPEN();
//向主機發送采集結束命令0x33
UART_DATA_BYTE_SEND(0x33);
//自動測試標志復原
global_sample_mode_flag=0xFF;
}
//如果接收到開始采集命令
if(global_start_sample_flag==0x00)
{
//關串口接收中斷
UART_RXCINT_CLOSE();
//開外部中斷7(AD轉換結束中斷)
EXTERN_INTERRUPT_OPEN(7);
//采樣
SAMPLE();
//關外部中斷7
EXTERN_INTERRUPT_CLOSE(7);
//開串口接收中斷,等待數據包傳輸命令
UART_RXCINT_OPEN();
//開始采集標志復原
global_start_sample_flag=0xFF;
}
}
for(;;){;}
return 0;
}
/*final test//////////////////////////
//變量定義
//初始化和串口設置,不包括串口中斷開啟
INITIATION();
//PG3供測試用/////////////
sbi(DDRG,3);
cbi(PORTG,3);
//開中斷
sei();
//數據采集流程
while(1)
{
//采集控制標志初始化
global_start_sample_flag=0xFF;
//開串口接收中斷
UART_RXCINT_OPEN();
//等待采集控制標志
while(global_start_sample_flag!=0x00){;}
//關串口接收中斷
UART_RXCINT_CLOSE();
//開外部中斷7(AD轉換結束中斷)
EXTERN_INTERRUPT_OPEN(7);
//采樣
SAMPLE();
//關外部中斷7
EXTERN_INTERRUPT_CLOSE(7);
//開串口接收中斷,等待數據包傳輸命令
UART_RXCINT_OPEN();
}
*/
/*timer test//////////////////////////
sbi(DDRE,6);//用示波器看PE6的輸出
sbi(PORTE,6);
TIMER_BEGIN();
while(1)
{
PORTE=~PORTE;
while(!(TIFR&(1<<OCF1A))){;}
TIFR|=1<<OCF1A;
}
TIMER_STOP();
*/
/*sun's test//////////////////////////
DDRC=0xFF;//端口C輸出
PORTC=0xFF;
DDRF|=0x0F;//端口F輸出
sbi(DDRB,2);//CONVST初始化,輸出
sbi(PORTB,2);
sbi(DDRG,0);//WR初始化,輸出1
sbi(PORTG,0);
sbi(DDRG,1);//RD初始化,輸出1
sbi(PORTG,1);
sbi(DDRG,2);//ALE初始化,輸出1
sbi(PORTG,2);
sbi(DDRD,5);//CS_ADC初始化,輸出1
sbi(PORTD,5);
sbi(DDRD,6);//CS_RAM初始化,輸出1
sbi(PORTD,6);
UART_SETTING(19200,8000000);//串口初始化
sbi(DDRE,2);// 串口接受控制
cbi(PORTE,2);
EXTERN_INTERRUPT_OPEN(7);//開外部中斷7,等待AD轉換結束
sei();//開中斷
sample_sign=0xff;
global_flag_serie=0;
uint32_t addd=00010;
uint16_t i;
for(i=0;i<0xffff;i++)
{
SRAM_1M_8_WRITE(addd,i);
addd++;
}
for(;;)
{
;
}
*/
/*extern interrupt test///////////////
uint16_t j;
INITIATION();//初始化和串口設置,不包括串口中斷開啟
sei();//開中斷
EXTERN_INTERRUPT_OPEN(7);//開外部中斷7(AD轉換結束中斷)
AD7891_CHANNEL_SELECT(2);
for(;;)
{
AD7891_CONVERSION_START();
for(j=0;j<0xFF;j++)
{
j|=0x00;
}
}
*/
/*AD7891 test/////////////////////////
INITIATION();//初始化和串口設置,不包括串口中斷開啟
sei();//開中斷
while(1)
{
EXTERN_INTERRUPT_OPEN(7);//開外部中斷7(AD轉換結束中斷)
AD7891_CHANNEL_SELECT(1);//選擇通道1
AD7891_CONVERSION_START();//轉換開始
}
*/
/*SRAM test///////////////////////////
uint8_t temp1,temp2;
SRAM_1M_8_WRITE(0x10,0x88);//高位字節
SRAM_1M_8_WRITE(0x11,0x89);//低位字節
temp1=SRAM_1M_8_READ(0x10);//高位字節
temp2=SRAM_1M_8_READ(0x11);//低位字節
temp1=0x88;
temp2=0xFF;
*/
/*SIGNAL(SIG_INTERRUPT7)//////////////
SIGNAL(SIG_INTERRUPT7)
{
//變量定義
uint16_t int16_temp1,int16_temp2,int16_temp3;
uint8_t temp1,temp2,i;
//關中斷
cli();
//讀取ad轉換結果
int16_temp1=AD7891_READ();
//AD7891 deselect,否則數據總線與RAM沖突
sbi(PORTD,5);
//AD轉換結果存入RAM
temp1=int16_temp1/256;
temp2=int16_temp1%256;
int16_temp2=global_ad_counter%4;
int16_temp3=global_ad_counter/4;
//保存合閘線圈電流
if(int16_temp2==0)
{
SRAM_1M_8_WRITE(0+int16_temp3*2,temp1);//高位字節
SRAM_1M_8_WRITE(0+int16_temp3*2+1,temp2);//低位字節
}
//保存分閘線圈電流
if(int16_temp2==1)
{
SRAM_1M_8_WRITE(10000+int16_temp3*2,temp1);//高位字節
SRAM_1M_8_WRITE(10000+int16_temp3*2+1,temp2);//低位字節
}
//保存電機電流
if(int16_temp2==2)
{
SRAM_1M_8_WRITE(20000+int16_temp3*2,temp1);//高位字節
SRAM_1M_8_WRITE(20000+int16_temp3*2+1,temp2);//低位字節
}
//保存操作電壓
if(int16_temp2==3)
{
SRAM_1M_8_WRITE(30000+int16_temp3*2,temp1);//高位字節
SRAM_1M_8_WRITE(30000+int16_temp3*2+1,temp2);//低位字節
}
//計數器自加
global_ad_counter++;
//開中斷
sei();
}
*/
/*傳感器測試用////////////////////////
SIGNAL(SIG_INTERRUPT7)
{
//變量定義
uint16_t int16_temp1;
float float_temp1,float_temp2;
//關中斷
cli();
//讀取ad轉換結果
int16_temp1=AD7891_READ();
float_temp1=int16_temp1;
float_temp2=float_temp1/20.48;
float_temp2-=100;
float_temp2*=1000;
//開中斷
sei();
}
*/
/*測試SRAM中數據是否正確//////////////
//變量定義
uint16_t i;
uint8_t temp_array[512];
//初始化和串口設置,不包括串口中斷開啟
INITIATION();
//PG3供測試用/////////////
sbi(DDRG,3);
cbi(PORTG,3);
//開中斷
sei();
//數據采集流程
while(1)
{
//開外部中斷7(AD轉換結束中斷)
EXTERN_INTERRUPT_OPEN(7);
//采樣
SAMPLE();
//關外部中斷7
EXTERN_INTERRUPT_CLOSE(7);
for(i=0;i<512;i++)
{
temp_array[i]=SRAM_1M_8_READ(i);//讀取數據
}
}
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -