521 lines
14 KiB
C
521 lines
14 KiB
C
#include "DSP281x_Examples.h" // DSP281x Examples Include File
|
|
#include "DSP281x_SWPrioritizedIsrLevels.h" // DSP281x Examples Include File
|
|
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
|
|
|
|
#include <params.h>
|
|
#include <sync_tools.h>
|
|
#include <vector.h>
|
|
|
|
#include "big_dsp_module.h"
|
|
#include "MemoryFunctions.h"
|
|
#include "Spartan2E_Adr.h"
|
|
#include "Spartan2E_Functions.h"
|
|
#include "TuneUpPlane.h"
|
|
#include "pwm_test_lines.h"
|
|
#include "xp_write_xpwm_time.h"
|
|
#include "profile_interrupt.h"
|
|
|
|
#include "edrk_main.h"
|
|
#define SIZE_SYNC_BUF 20
|
|
|
|
//#pragma DATA_SECTION(logbuf_sync1,".fa");
|
|
unsigned int logbuf_sync1[SIZE_SYNC_BUF];
|
|
unsigned int c_logbuf_sync1=0;
|
|
|
|
//unsigned int capnum0;
|
|
//unsigned int capnum1;
|
|
//unsigned int capnum2;
|
|
//unsigned int capnum3;
|
|
|
|
int delta_capnum = 0;
|
|
int delta_error = 0;
|
|
//int level_find_sync_zero = LEVEL_FIND_SYNC_ZERO;
|
|
unsigned int temp;
|
|
|
|
unsigned int count_error_sync = 0;
|
|
|
|
unsigned int count_timeout_sync = 0;
|
|
//unsigned int enable_profile_led1_sync = 1;
|
|
//unsigned int enable_profile_led2_sync = 0;
|
|
|
|
SYNC_TOOLS_DATA sync_data=SYNC_TOOLS_DATA_DEFAULT;
|
|
|
|
|
|
#pragma CODE_SECTION(calculate_sync_detected,".fast_run2");
|
|
void calculate_sync_detected(void)
|
|
{
|
|
|
|
|
|
|
|
// if (capnum0 > 1000) {
|
|
// return;
|
|
// }
|
|
// sync_data.level_find_sync_zero = LEVEL_FIND_SYNC_ZERO;
|
|
|
|
delta_capnum = sync_data.capnum0 - sync_data.capnum1;
|
|
|
|
if (delta_capnum > 0) //ïàäàåò
|
|
{
|
|
sync_data.pwm_freq_plus_minus_zero = -1;//1;
|
|
|
|
if (count_error_sync < MAX_COUNT_ERROR_SYNC) {
|
|
count_error_sync++;
|
|
count_error_sync++;
|
|
count_error_sync++;
|
|
} else
|
|
sync_data.local_flag_sync_1_2 = 0;
|
|
}
|
|
else
|
|
if (delta_capnum < 0) //ðàñò¸ò
|
|
{
|
|
|
|
if (sync_data.capnum0 > sync_data.level_find_sync_zero)
|
|
{
|
|
delta_error = sync_data.capnum0 - sync_data.level_find_sync_zero;
|
|
|
|
if (delta_error > 50) {
|
|
if (count_error_sync < MAX_COUNT_ERROR_SYNC) {
|
|
count_error_sync++;
|
|
count_error_sync++;
|
|
count_error_sync++;
|
|
} else
|
|
sync_data.local_flag_sync_1_2 = 0;
|
|
} else {
|
|
if (count_error_sync > 0) {
|
|
count_error_sync--;
|
|
}
|
|
if (count_error_sync == 0)
|
|
sync_data.local_flag_sync_1_2 = 1;
|
|
}
|
|
sync_data.pwm_freq_plus_minus_zero = 1;
|
|
}
|
|
else
|
|
if (sync_data.capnum0 < sync_data.level_find_sync_zero)
|
|
{
|
|
|
|
delta_error = sync_data.level_find_sync_zero - sync_data.capnum0;
|
|
|
|
if (delta_error > 50) {
|
|
if (count_error_sync < MAX_COUNT_ERROR_SYNC) {
|
|
count_error_sync++;
|
|
count_error_sync++;
|
|
count_error_sync++;
|
|
} else
|
|
sync_data.local_flag_sync_1_2 = 0;
|
|
} else {
|
|
if (count_error_sync > 0) {
|
|
count_error_sync--;
|
|
}
|
|
if (count_error_sync == 0)
|
|
sync_data.local_flag_sync_1_2 = 1;
|
|
}
|
|
|
|
sync_data.pwm_freq_plus_minus_zero = -1;
|
|
|
|
}
|
|
else
|
|
{
|
|
sync_data.pwm_freq_plus_minus_zero = 0;
|
|
sync_data.local_flag_sync_1_2 = 1;
|
|
count_error_sync = 0;
|
|
}
|
|
} else
|
|
sync_data.pwm_freq_plus_minus_zero = 0;
|
|
|
|
sync_data.delta_error_sync = delta_error;
|
|
sync_data.delta_capnum = sync_data.capnum0 - sync_data.level_find_sync_zero; //delta_capnum;
|
|
sync_data.count_error_sync = count_error_sync;
|
|
|
|
|
|
}
|
|
|
|
|
|
#pragma CODE_SECTION(sync_detected,".fast_run2");
|
|
void sync_detected(void)
|
|
{
|
|
|
|
#if(_ENABLE_PWM_LINES_FOR_TESTS_SYNC)
|
|
PWM_LINES_TK_18_ON;
|
|
#endif
|
|
|
|
sync_data.latch_interrupt = 1;
|
|
// stop_sync_interrupt();
|
|
|
|
|
|
// i_led2_on_off(1);
|
|
|
|
// //Enable more interrupts from this capture
|
|
// EvbRegs.EVBIMRC.bit.CAP6INT = 0;
|
|
|
|
// if (edrk.disable_interrupt_sync==0)
|
|
|
|
|
|
// WriteMemory(ADR_SAW_REQUEST, 0x8000);
|
|
// sync_data.capnum0 = ReadMemory(ADR_SAW_VALUE);
|
|
|
|
// WriteMemory(ADR_SAW_REQUEST, 0x8000);
|
|
// sync_data.capnum0 = ReadMemory(ADR_SAW_VALUE);
|
|
|
|
// pause_1000(1);
|
|
|
|
WriteMemory(ADR_SAW_REQUEST, 0x8000);
|
|
sync_data.capnum1 = ReadMemory(ADR_SAW_VALUE);
|
|
|
|
WriteMemory(ADR_SAW_REQUEST, 0x8000);
|
|
sync_data.capnum1 = ReadMemory(ADR_SAW_VALUE);
|
|
|
|
sync_data.count_timeout_sync = 0;
|
|
sync_data.timeout_sync_signal = 0;
|
|
|
|
logbuf_sync1[c_logbuf_sync1++] = sync_data.capnum0;
|
|
// logbuf_sync1[c_logbuf_sync1++] = sync_data.capnum1;
|
|
|
|
if (c_logbuf_sync1==SIZE_SYNC_BUF)
|
|
c_logbuf_sync1=0;
|
|
|
|
|
|
if (sync_data.count_pause_ready < MAX_COUNT_PAUSE_READY) {
|
|
sync_data.count_pause_ready++;
|
|
sync_data.count_pause_ready++;
|
|
} else
|
|
sync_data.sync_ready = 1;
|
|
|
|
////////////////////////////////////
|
|
|
|
// calculate_sync_detected();
|
|
|
|
|
|
|
|
// sync_data.capnum0 = capnum0;
|
|
|
|
|
|
|
|
//
|
|
// stop_sync_interrupt();
|
|
// EvbRegs.EVBIFRC.all = BIT2;
|
|
//
|
|
|
|
|
|
// // Acknowledge interrupt to receive more interrupts from PIE group 5
|
|
// PieCtrlRegs.PIEACK.all = PIEACK_GROUP5;
|
|
|
|
// if (edrk.disable_interrupt_sync==0)
|
|
// {
|
|
//// //Enable more interrupts from this capture
|
|
//// EvbRegs.EVBIMRC.bit.CAP6INT = 1;
|
|
////
|
|
//// //use mask to clear EVAIFRA register
|
|
//// EvbRegs.EVBIFRC.bit.CAP6INT = 1;
|
|
// }
|
|
|
|
//Enable more interrupts from this capture
|
|
// EvbRegs.EVBIMRC.bit.CAP6INT = 1;
|
|
|
|
//use mask to clear EVAIFRA register
|
|
// EvbRegs.EVBIFRC.bit.CAP6INT = 1;
|
|
|
|
|
|
|
|
|
|
// DINT;
|
|
// PieCtrlRegs.PIEIER5.all = TempPIEIER;
|
|
|
|
// return;
|
|
|
|
|
|
|
|
// IER &= ~(M_INT5);
|
|
|
|
//Enable more interrupts from this capture
|
|
// EvbRegs.EVBIMRC.bit.CAP6INT = 1;
|
|
|
|
// Note: To be safe, use a mask value to write to the entire
|
|
// EVAIFRA register. Writing to one bit will cause a read-modify-write
|
|
// operation that may have the result of writing 1's to clear
|
|
// bits other then those intended.
|
|
//use mask to clear EVAIFRA register
|
|
// EvbRegs.EVBIFRC.bit.CAP6INT = 1;
|
|
// EvbRegs.EVBIFRC.all = BIT2;
|
|
|
|
// IER &= ~(M_INT5);
|
|
|
|
|
|
// asm(" NOP;");
|
|
|
|
// i_led2_on_off(0);
|
|
|
|
|
|
// start_sync_interrupt();
|
|
// EvbRegs.EVBIMRC.bit.CAP6INT = 1;
|
|
// Clear CAPINT6 interrupt flag
|
|
|
|
// Acknowledge interrupt to receive more interrupts from PIE group 5
|
|
// PieCtrlRegs.PIEACK.all = PIEACK_GROUP5;
|
|
|
|
sync_data.count_interrupts++;
|
|
|
|
#if(_ENABLE_PWM_LINES_FOR_TESTS_SYNC)
|
|
PWM_LINES_TK_18_OFF;
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
//static long k_3=50;
|
|
|
|
#pragma CODE_SECTION(Sync_handler,".fast_run2");
|
|
interrupt void Sync_handler(void) {
|
|
|
|
// Set interrupt priority:
|
|
volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER5.all;
|
|
IER |= M_INT5;
|
|
IER &= MINT5; // Set "global" priority
|
|
PieCtrlRegs.PIEIER5.all &= MG57; // Set "group" priority
|
|
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
|
|
|
|
WriteMemory(ADR_SAW_REQUEST, 0x8000);
|
|
sync_data.capnum0 = ReadMemory(ADR_SAW_VALUE);
|
|
|
|
stop_sync_interrupt_local(); // çàïðåòèëè ïðåðûâàíèÿ, ðàçðåøèì èõ ïî òàéìåðó, ÷òîá èçáåæàòü äðåáåçãà ïðè ïëîõîé îïòèêå.
|
|
|
|
|
|
#if (_ENABLE_INTERRUPT_PROFILE_LED1)
|
|
if (profile_interrupt.for_led1.bits.sync)
|
|
i_led1_on_off_special(1);
|
|
#endif
|
|
#if (_ENABLE_INTERRUPT_PROFILE_LED2)
|
|
if (profile_interrupt.for_led2.bits.sync)
|
|
i_led2_on_off_special(1);
|
|
#endif
|
|
|
|
EINT;
|
|
|
|
// i_led2_on_off(1);
|
|
|
|
// Insert ISR Code here.......
|
|
sync_detected();
|
|
// pause_1000(k_3);
|
|
// Next line for debug only (remove after inserting ISR Code):
|
|
//ESTOP0;
|
|
|
|
// i_led2_on_off(0);
|
|
|
|
// Enable more interrupts from this timer
|
|
// EvbRegs.EVBIMRC.bit.CAP6INT = 1;
|
|
// Note: To be safe, use a mask value to write to the entire
|
|
// EVBIFRA register. Writing to one bit will cause a read-modify-write
|
|
// operation that may have the result of writing 1's to clear
|
|
// bits other then those intended.
|
|
EvbRegs.EVBIFRC.all = BIT2;
|
|
// Acknowledge interrupt to recieve more interrupts from PIE group 5
|
|
// PieCtrlRegs.PIEACK.all |= PIEACK_GROUP5;
|
|
|
|
// Restore registers saved:
|
|
DINT;
|
|
PieCtrlRegs.PIEIER5.all = TempPIEIER;
|
|
|
|
#if (_ENABLE_INTERRUPT_PROFILE_LED1)
|
|
if (profile_interrupt.for_led1.bits.sync)
|
|
i_led1_on_off_special(0);
|
|
#endif
|
|
#if (_ENABLE_INTERRUPT_PROFILE_LED2)
|
|
if (profile_interrupt.for_led2.bits.sync)
|
|
i_led2_on_off_special(0);
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
void setup_sync_int(void) {
|
|
|
|
// return;
|
|
|
|
// EALLOW;
|
|
|
|
if (edrk.flag_second_PCH==1)
|
|
sync_data.level_find_sync_zero = xpwm_time.pwm_tics+5;
|
|
else
|
|
sync_data.level_find_sync_zero = LEVEL_FIND_SYNC_ZERO;
|
|
|
|
sync_data.timeout_sync_signal = 0;
|
|
sync_data.count_timeout_sync = 0;
|
|
|
|
// sync_data.what_main_pch = 1; // Ïåðâûé Ï×
|
|
// sync_data.what_main_pch = 2; // Âòîðîé Ï×
|
|
sync_data.what_main_pch = 0; // Ëþáîé Ï×
|
|
|
|
|
|
|
|
/////////////////////////////////////////////
|
|
|
|
// EvbRegs.EVBIFRC.bit.CAP6INT = 1; //Resets flag EVB Interrupt Flag Register
|
|
EvbRegs.EVBIFRC.all = BIT2; //Resets flag EVB Interrupt Flag Register
|
|
EvbRegs.EVBIMRC.bit.CAP6INT = 0; //1 //SET flag EVB Interrupt Mask Register C
|
|
// CAP6INT ENABLE
|
|
//0 Disable
|
|
//1 Enable
|
|
|
|
|
|
/////////////////////////////////////////////
|
|
EvbRegs.T4PR = 0xFFFF; //Set timer period
|
|
EvbRegs.T4CNT = 0; // Clear timer counter
|
|
|
|
EvbRegs.T4CON.all = 0; // Disable timer
|
|
EvbRegs.T4CON.bit.FREE = 1; // FREE/SOFT, 00 = stop immediately on emulator suspend
|
|
EvbRegs.T4CON.bit.SOFT = 0;
|
|
EvbRegs.T4CON.bit.TMODE = 2; //TMODEx, 10 = continuous-up count mode
|
|
EvbRegs.T4CON.bit.TPS = 0; //TPSx, 111 = x/1 prescaler
|
|
EvbRegs.T4CON.bit.TENABLE = 0; // TENABLE, 1 = enable timer
|
|
EvbRegs.T4CON.bit.TCLKS10 = 0; //TCLKS, 00 = HSPCLK is clock source
|
|
EvbRegs.T4CON.bit.TCLD10 = 0; //Timer compare register reload condition, 00 When counter is 0
|
|
EvbRegs.T4CON.bit.TECMPR = 1; // TECMPR, 1 = Enable timer compare operation
|
|
EvbRegs.T4CON.bit.SET3PR = 0; // SELT3PR: 0 - Use own period register
|
|
|
|
|
|
////////////////////////////////////////////////////
|
|
EvbRegs.CAPCONB.all = 0; // Clear
|
|
|
|
EvbRegs.CAPCONB.bit.CAP6EDGE = 2; //3:2 Edge Detection for Unit 6
|
|
//Edge detection control for Capture Unit 6.
|
|
// 00 No detection
|
|
// 01 Detects rising edge
|
|
// 10 Detects falling edge
|
|
// 11 Detects both edges
|
|
|
|
EvbRegs.CAPCONB.bit.CAP6TSEL = 0; // GP Timer selection for Unit 6
|
|
// GP timer selection for Capture Units 4 and 5
|
|
// 0 Selects GP timer 4
|
|
// 1 Selects GP timer 3
|
|
EvbRegs.CAPFIFOB.bit.CAP6FIFO = 0; //CAP6 FIFO status
|
|
EvbRegs.CAPCONB.bit.CAP6EN = 1; //Enables Capture Unit 6
|
|
/////////////////////////////////////////
|
|
|
|
|
|
EALLOW;
|
|
PieVectTable.CAPINT6 = &Sync_handler; //?CAP?????????????????
|
|
EDIS;
|
|
|
|
|
|
PieCtrlRegs.PIEIER5.bit.INTx7 = 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
void start_sync_interrupt(void)
|
|
{
|
|
EvbRegs.EVBIFRC.all = BIT2; //Resets flag EVB Interrupt Flag Register
|
|
|
|
IER |= M_INT5; // @suppress("Symbol is not resolved")
|
|
// PieCtrlRegs.PIEIER5.bit.INTx7 = 1;
|
|
|
|
EvbRegs.EVBIMRC.bit.CAP6INT = 1; //SET flag EVB Interrupt Mask Register C
|
|
// //use mask to clear EVAIFRA register
|
|
// PieCtrlRegs.PIEACK.all |= PIEACK_GROUP5;
|
|
sync_data.latch_interrupt = 0;
|
|
sync_data.enabled_interrupt = 1;
|
|
|
|
}
|
|
|
|
void stop_sync_interrupt(void)
|
|
{
|
|
sync_data.latch_interrupt = 0;
|
|
sync_data.enabled_interrupt = 0;
|
|
|
|
IER &= ~(M_INT5); // @suppress("Symbol is not resolved")
|
|
// PieCtrlRegs.PIEIER5.bit.INTx7 = 0;
|
|
EvbRegs.EVBIMRC.bit.CAP6INT = 0; //SET flag EVB Interrupt Mask Register C
|
|
EvbRegs.EVBIFRC.all = BIT2; //Resets flag EVB Interrupt Flag Register
|
|
// PieCtrlRegs.PIEACK.all |= PIEACK_GROUP5;
|
|
}
|
|
|
|
void stop_sync_interrupt_local(void)
|
|
{
|
|
sync_data.latch_interrupt = 0;
|
|
|
|
IER &= ~(M_INT5); // @suppress("Symbol is not resolved")
|
|
EvbRegs.EVBIMRC.bit.CAP6INT = 0; //SET flag EVB Interrupt Mask Register C
|
|
EvbRegs.EVBIFRC.all = BIT2; //Resets flag EVB Interrupt Flag Register
|
|
}
|
|
|
|
|
|
void setup_sync_line(void) {
|
|
|
|
// output
|
|
EALLOW;
|
|
GpioMuxRegs.GPBMUX.bit.TCLKINB_GPIOB12 = 0;
|
|
GpioMuxRegs.GPBDIR.bit.GPIOB12 = 1;
|
|
EDIS;
|
|
|
|
//input
|
|
EALLOW;
|
|
GpioMuxRegs.GPBMUX.bit.CAP6QI2_GPIOB10 = 1;// Configure as CAP6
|
|
// GpioMuxRegs.GPBDIR.bit.GPIOB10 = 1;
|
|
EDIS;
|
|
|
|
}
|
|
|
|
#pragma CODE_SECTION(sync_inc_error,".fast_run");
|
|
void sync_inc_error(void)
|
|
{
|
|
|
|
|
|
if (sync_data.count_pause_ready > 0) {
|
|
sync_data.count_pause_ready--;
|
|
} else
|
|
sync_data.sync_ready = 0;
|
|
|
|
|
|
if (sync_data.count_timeout_sync < MAX_COUNT_TIMEOUT_SYNC)
|
|
{
|
|
sync_data.count_timeout_sync++;
|
|
}
|
|
else
|
|
{
|
|
sync_data.timeout_sync_signal = 1;
|
|
sync_data.count_pause_ready = 0;
|
|
sync_data.local_flag_sync_1_2 = 0;
|
|
}
|
|
|
|
|
|
if (count_error_sync < MAX_COUNT_ERROR_SYNC) {
|
|
count_error_sync++;
|
|
} else
|
|
sync_data.local_flag_sync_1_2 = 0;
|
|
}
|
|
|
|
void clear_sync_error(void)
|
|
{
|
|
sync_data.count_timeout_sync = 0;
|
|
sync_data.timeout_sync_signal = 0;
|
|
}
|
|
|
|
|
|
int get_status_sync_line(void)
|
|
{
|
|
return !GpioDataRegs.GPBDAT.bit.GPIOB10;
|
|
}
|
|
|
|
//int index_sync_ar = 0;
|
|
//
|
|
//
|
|
//void write_sync_logs(void)
|
|
//{
|
|
// static int c=0;
|
|
// return;
|
|
//
|
|
//// logbuf1[index_filter_ar]=active_rect1.Id;//EvaRegs.CMPR1;//(active_rect1.pll_Ud);//svgenDQ.Wt;
|
|
//// logbuf2[index_filter_ar]=active_rect1.Iq;//EvaRegs.CMPR2;//filter.iqU_1_long;// (active_rect1.pll_Uq);//Iq;
|
|
//// logbuf3[index_filter_ar]=EvaRegs.CMPR1;//active_rect1.SetUzpt;////(active_rect1.Tetta);//abc_to_dq.Ud;
|
|
//
|
|
// index_sync_ar++;
|
|
// if (index_sync_ar>=SIZE_SYNC_BUF)
|
|
// {
|
|
// index_sync_ar=0;
|
|
// c++;
|
|
// if (c>=10)
|
|
// c=0;
|
|
// }
|
|
//
|
|
//}
|