Re: Programmer模式下動作不正確
|
||||
---|---|---|---|---|
新會員
|
版主您好!我將程式移至4011的IC內在programmer模式下可正常工作,但是在2010還是不行,請問該重何檢查起?
發表於: 2009/11/10 14:52
|
|||
|
Programmer模式下動作不正確
|
||||
---|---|---|---|---|
新會員
|
請問各位高手:
小弟係利用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
|
|||
|