• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
:::


Browsing this Thread:   1 Anonymous Users






Re: Programmer模式下動作不正確
#3
新會員
新會員


查看用戶資訊
版主您好!我將程式移至4011的IC內在programmer模式下可正常工作,但是在2010還是不行,請問該重何檢查起?

發表於: 2009/11/10 14:52
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: Programmer模式下動作不正確
#2
版主
版主


查看用戶資訊
依以前經驗判斷,應該是 Initialize 沒完全做到,請重新對開機的初始設定一項一項的確定有做初始設定。
原因是因為在 Debug Mode 下,ICD 也需要執行除錯程式所以有些設定(Like QEI...) 就會在除錯的監督程式裡設定了,如果程式中沒有設定到就會造成 Debug Mode 會跑,而 Stand-Alone Mode 下就部份功能不正常了。

發表於: 2009/11/10 12:04
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Programmer模式下動作不正確
#1
新會員
新會員


查看用戶資訊
請問各位高手:
小弟係利用dsPIC30F2010的IC作控制,於debug模式下動作都符合程式流程也皆正常工作,但換置programmer下,卻動作不正常,不知道是哪裡出了問題,是否可給小一些建議,謝謝大家。 以下是我的程式碼


-------------------------------分隔線---------------------------------
//**************************************** Note *******************************
//Yaw Program
//Designer :Feng-Sheng Hsu
//Date :2009/09/15
//Using tool : AD(voltage & current) IC1(frequency=speed) I/O(stepping motor)
//RE0~RE5 : stepping motor control signal
//RB3~RB4 : Limited switch
//RB5 :Maintain Switch
//*******************************************************************************

//#define __dsPIC30F2010__
#include <p30f2010.h>
#include <timer.h>
#include <incap.h>

#define FCY 7372800 * 2 // 因為使用頻率為將外部 7.3728 MHz * 8 的模式,每一指令週期需 4 個 clock
// 所以 FCY = (7.3728 * 8 / 4 ) MHz = 7372800* 2
#define MILLISEC FCY/1000 // 1 mSec delay constant


//INPUT DEFINE
#define step1 LATEbits.LATE0 //定義LED7與LED8為特定輸出埠腳位位元的替代符號,
#define step2 LATEbits.LATE1 //以加強程式的可讀性與簡潔
#define step3 LATEbits.LATE2 //定義LED7與LED8為特定輸出埠腳位位元的替代符號,
#define step4 LATEbits.LATE3
#define step5 LATEbits.LATE4
#define step6 LATEbits.LATE5

#define SW1 PORTBbits.RB3
#define SW2 PORTBbits.RB4
#define SW3 PORTBbits.RB5

#define Speed PORTDbits.RD1

#define DIR_step1 TRISEbits.TRISE0 //定義DIR_LED7與DIR_LED8為特定輸出入埠腳位位元
#define DIR_step2 TRISEbits.TRISE1 //的方向控制位元替代符號
#define DIR_step3 TRISEbits.TRISE2 //定義DIR_LED7與DIR_LED8為特定輸出入埠腳位位元
#define DIR_step4 TRISEbits.TRISE3
#define DIR_step5 TRISEbits.TRISE4
#define DIR_step6 TRISEbits.TRISE5

#define DIR_SW1 TRISBbits.TRISB3
#define DIR_SW2 TRISBbits.TRISB4
#define DIR_SW3 TRISBbits.TRISB5

#define DIR_Speed TRISDbits.TRISD1

#define INPUT 1 //定義1為輸入方向
#define OUTPUT 0 //定義0為輸出方向


//#define True 1
//#define Fause 0
//------------------------------------------------------------------------------------------


//void Delay_123(void);
void initial_IO(void);
void Init_Capture1(void);
void Timer2_Initial(void);
void Timer1_Initial(void);
void show_speed(void);
//void pitch_control(void);

void speed_power(void);
void CW (void); //偏航角度修正(UP)
void CCW (void); //偏航角度修正(DOWN)
void delay_time(void );
void ninty (void); // 折90度副程式宣告
void zero (void); // 回復至0度副程式宣告

union
{
unsigned Word ;
struct
{
unsigned ADC_DONE : 1 ;
unsigned : 15 ;
};
} Flags ;


unsigned char ASCII_Buf[10] ;

unsigned int Int_flag1 = 0; // 設定軟體中斷旗標
unsigned int IC_flag = 0;
int Int_flag;
unsigned int timer_edge[2];
unsigned char Convert_Buf[10] ;
unsigned int period;
unsigned int frequency;
unsigned int speed; //發電機轉速
unsigned int s_ref=600; //參考轉速
int s_err=0; //轉速誤差
float s_factor;
int s_factor1;
float d = 0.25 ; //線性放大因子
int degree;
int pluse,z=0;
unsigned int b;
int a,c=0;
//double power;
int s=0;
int miliSec;


//---------------------------------------------------------------------------
// Configuration bits

_FOSC(CSW_FSCM_OFF & XT_PLL8); //XT with 4xPLL oscillator, Failsafe clock off
// _FOSC(CSW_FSCM_OFF & XT_PLL16); //XT with 4xPLL oscillator, Failsafe clock off161
_FWDT(WDT_OFF); //Watchdog timer disabled
_FBORPOR(PBOR_OFF & MCLR_EN); //Brown-out reset disabled, MCLR reset enabled
_FGS(CODE_PROT_OFF); //Code protect disabled



/*void _ISR _ADCInterrupt(void)
{
Flags.ADC_DONE = 1 ;
IFS0bits.ADIF = 0 ;
}*/


void _ISR _IC1Interrupt(void) // 輸入捕捉中斷副程式
{
ReadCapture1( &timer_edge[0]);
ReadCapture1( &timer_edge[1]);
Int_flag = 1; // 設定軟體中斷旗標
// 清除輸入捕捉中斷旗標
IC_flag = 1; //判斷有沒有溢位,有就讓頻率可以歸零
IFS0bits.IC1IF = 0;
}




int main( void )
{

Timer2_Initial( ) ;
Timer1_Initial( );
initial_IO( );
Init_Capture1();

zero( ); // 重置原點復歸於0度

Flags.Word = 0 ;

while (1)
{
while (!SW3) //維修開關 ON
{
ninty( ); //直接折90度
}



while (SW3) //維修開關OFF
{

// show_speed( ); //轉速計算
// speed_power( ); //轉速對功率曲線方程

if ( IFS0bits.T1IF ) // 詢問 Timer1 的 Period 時間是否已到
// 可以用軟體模擬來檢查是否為準確的 1 ms
{
IFS0bits.T1IF = 0 ; // 是 , 則將 miliSec 加 1
miliSec ++ ; // 這也是遞加,和miliSec += 1 ;是一樣的
if ( miliSec == 1000) // 若 miliSec == 250 , 則為經過 1 秒的時間
{ //
miliSec = 0 ; //

show_speed( ); //轉速計算

if(s_factor1>=20) //判斷是否轉速過快,高過設定值

{
ninty( ); //直接折90度
}


else
{

// degree = d * s_err; //計算修正角度值 d:修正因子(可直接於變數宣告修改)


if(s_err > 0) //實際轉速小於參考轉速

{

if (SW1==0) //判斷是否達到0度角
{

}

else
{

CCW( );//修正減少偏航角度
c++;
}

}

else //實際轉速大於設定值

{


if(SW2==0) ////判斷是否達到90度角
{

}

else
{
CW( ); //增加偏航角度
a++;
}


}



}
}// End of if ( miliSec )



}// End of if ( IFS0bits.T1IF )
} // End of if while

}

return;
}




/*
void Timer3_Initial( void )//AD轉換Timer
{
ConfigIntTimer3( T3_INT_PRIOR_7 & T3_INT_OFF ) ; // Disable Timer 3 Interrupt

OpenTimer3( T3_ON & T3_IDLE_STOP & T3_GATE_OFF & T3_PS_1_64 & T3_SOURCE_INT ,
(((long)FCY/1000 )) ) ; // Set for 64 mS
}
*


void ADC10_Initial(void)
{

ADPCFG = 0xFFF0;
// 設定 Analog Channel
// AN0/ AN1/ AN2/ AN3/
// 其它都為 others are Digital;
// 0b 1111 1111 1111 0000

ADCON1 = 0x0046;
// TODO : 正確設定 ADCON1 為下列模式 :
// 0b 0000 0000 0100 1110
// ADON OFF
// FORM INTEGER
// Auto convert using TMR3 as trigger source
// Sample simultaneously
// A/D Sample Auto-Start


ADCON2 = 0x020C;
// ADCON2 = 0000 0010 0000 1100
// 15-13 VCFG = 000 (Vref+ AVdd ; Vref- AVss)
// 10 CSCNA=0 Don't scan inputs
// 8-9 CHPS=10 Select Channels Utilized bits 1x : Converter CH0 CH1 CH2 CH3,
// 5-2 SMPI= 0011 (Interrupt for 4th sample/convert)
// 1 BUFM= 0 16 Word BUF.
// 0 ALTS=0 Using Mux-A input

ADCSSL = 0x0000;
// 15-0 no scan input selected .......

ADCON3 = 0x1F3F;
// ADCON3 = 0000 1111 0011 1111 =0F3F
// SAMC = 15 TAD
// From System Clock
// TAD = 8 Tcy

ADCHS = 0x0003 ;
// TODO : 正確設定 ADCHS , 使 AN0,AN1,AN2 能被當成 MuxA 的正端輸入
// 0b 0000 0000 0000 0100
// Just use MuxA
// CH1 CH2 CH3 neg. Vref-
// CH1+ ->AN0 CH2+ ->AN1 CH3+ ->AN2
// CH0+ ->AN3(test)

IEC0bits.ADIE = 1 ; // Enable AD interrupt
IPC2bits.ADIP = 7 ; // Set Priority to 7 >> highest !!

ADCON1bits.ADON = 1; // turn ADC ON
}

*/

void initial_IO(void)
{
TRISE = 0xffff ; // Set PORTE as Digital Inputs
// TRISB = 0xffff ; // Set PORTE as Digital Inputs
LATE = 0x0000 ; // Set PORTE latches

DIR_step1 = 0 ; // Define LED7 & 8 as Digital Outputs (Led Active Low)
DIR_step2 = 0;
DIR_step3 = 0 ;
DIR_step4 = 0 ;
DIR_step5 = 0 ;
DIR_step6 = 0 ;


DIR_SW1 = 1 ;
DIR_SW2 = 1 ;
DIR_SW3 = 1 ;
DIR_Speed = 1 ;

}

//**************************************************
// Configure the InputCapture in stop in idle mode
// Timer 3 as source , interrupt on capture 1,
// I/C on every fall edge
//**************************************************

void Init_Capture1 (void)
{
IC1CON=0x00A2; //0b0000 0000 1010 0010
// IC8CON=0x0022; //0b0000 0000 0010 0010
// bit13 : 是 否 要 IDLE 模式
// bit 7 : 要使用TMR2與TMR3(T2)
// bit 6-5 : 要抓幾個 input capture 的訊號(2個)
// bit 4 : 輸入捕捉緩衝器溢流
// bit 3 : 輸入捕捉緩衝器位空乏
// bit 2-0 : 選擇input capture 得事件(every falling edge)
IPC0=0x0060; //0b0000 0000 0111 0000
//bit 3-0 : IC2IP :選擇input capture channel 2 使用的priority
IFS0bits.IC1IF = 1;
IEC0bits.IC1IE = 1;
//IEC0=0x0010;
//0b0000 0000 0001 0000
//bit 4: input capture channel 2 interrupt Enable bit
T2CON = 0x8030; // Timer 2 On,T2前除設256,所以頻率要再除256,最低2Hz,最高1000Hz
}

/*
void InitMCPWM(void)
{

//PTPER = (FCY/FPWM) - 1;
// =(7.3728M / 50K )-1
PTPER = 292;

PWMCON1 = 0x0744; // setting PWMs/IO

PDC3 = 0;

//SEVTCMP = PTPER;
PWMCON2 = 0x0F00; // 16 postscale values
PTCON = 0x8000; // start PWM
return;

}
*/
void Timer1_Initial(void)
{
ConfigIntTimer1( T1_INT_PRIOR_0 & T1_INT_OFF ) ; // Timer1 的中斷優先等級設 0 (最低)
// Timer1 的中斷 OFF (用 POLLING)

OpenTimer1( T1_ON & T1_IDLE_STOP & T1_GATE_OFF & // Timer1 的 Period 設為每 1ms
T1_PS_1_1 & T1_SYNC_EXT_OFF & T1_SOURCE_INT , // 故計數範圍設為(FCY/ 1000)
(FCY/ 1000) ) ;
}

void Timer2_Initial(void)//轉速Timer
{
TMR2 = 0;
PR2 = 0xFFFF;
T2CON = 0x8030; // start TMR2 & internal Tcy/256 clock
//0x1000 0000 0010 0000
}


void show_speed(void)
{

if(Int_flag==1) // Get two input signal edge
{
DisableIntIC1; // Disable Interrupt of Capture 7
Int_flag = 0;

if( timer_edge[1] >= timer_edge[0]) // calculate time count between two capture events
period = timer_edge[1] - timer_edge[0];
else
period = 65536 + timer_edge[1] - timer_edge[0];

if(period==0)
{
frequency=0;
speed=0;
}
else
frequency= FCY/period; // Calculate the frequency
frequency=frequency/128; //T2前除設64,所以頻率要再除64
IFS0bits.IC1IF = 0;
EnableIntIC1; // Enable Interrupt of Capture 7
speed = frequency*12;

speed = 500;

s_err = s_ref-speed; //轉速誤差

s_factor = s_ref+s_err;

s_factor1 = (s_factor/s_ref)*10; //誤差因子


}


}

/*
void speed_power(void) // speed to power char. curve

{

power=0.16*speed*speed+0.18*speed+100;

}
*/
void CW (void) //Speed Up
{

degree = 0-(d * s_err);

pluse=(degree*18);

step1=0;

for(z=0;z<=pluse;z++)
{
step2 = 1;
delay_time( );
step2 = 0;
delay_time( );
c++;
}



}

void CCW (void) //Speed Down
{

degree = d * s_err; //計算修正角度值 d:修正因子(可直接於變數宣告修改)

pluse=degree*18;


step2=0;
for(z=0;z<=pluse;z++)
{
step1 = 1;
delay_time( );
step1 = 0;
delay_time( );
}



}


void ninty (void)
{

step2=0;

do
{
step1 = 0;
delay_time( );
step1 = 1;
delay_time( );
}while (SW2);

// 直到while(0)退出回圈

}


void zero (void)
{

step1=0;

do
{
step2 = 0;
delay_time( );
step2 = 1;
delay_time( );
}while (SW1);

// 直到while(0)退出回圈

}


// ***********************************************
// Delay for 100 us
// ***********************************************

void delay_time(void)
{


unsigned int S_Loop ;
int Null_Var ;

for ( S_Loop = 0 ; S_Loop <895 ; S_Loop ++ )
Null_Var += 1 ;


}

發表於: 2009/11/9 15:39
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]


:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------