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

論壇索引


Board index » All Posts (cutetank)




uart
新會員
新會員



發表於: 2010/4/24 21:21
頂部


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


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

發表於: 2009/11/10 14:52
頂部


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


請問各位高手:
小弟係利用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
頂部


有關SD卡問題
#4
新會員
新會員


各位高手好:
目前小弟使用Explore 16發展版 搭配AC164122 SD&MMC 產品,並利用貴公司所提供PIC24 MDD File System-SD Data Logger範例程式,執行時,沒有任何字串或是訊息顯示於終端機上,回去看程式碼,是有些訊息需要顯示,但是卻沒有,且已把SD卡插處卡座,卻也沒有任何動作。

想請問各位高手,是什麼問題造成的,我只是想單純的把MCU擷取感測器訊號,存入SD卡內,煩請大家提供點意見!

謝謝大家!!

發表於: 2009/10/19 16:29
頂部


dsPIC30F4011 + SD card
#5
新會員
新會員


請問各位高手:

dsPIC30F4011 是否可以與SD介面結合儲存感測器所讀的值
因在網路上找到的檔案都是18、24跟33系列的CPU有提供SD的範例程式,不知是否有dsPIC30F系列的範例程式考可供參考

謝謝大家

發表於: 2009/10/9 13:22
頂部


Re: pic18f4620與電子羅盤的問題
#6
新會員
新會員


救世主大大您好:
不知是否可提供你所寫的TDM3的接收控制程式讓我參考
我目前也在使用這顆電子羅盤
謝謝您

mail: cutetank@msn.com

發表於: 2009/9/29 11:46
頂部


如何顯示包含小數之數值顯示於LCD上
#7
新會員
新會員


請問各位先進,小弟要將含有小數的值顯示在LCD上,請問要如何修改,謝謝!

程式碼如下,可以顯示整數,但小數部份無法show出,請各位指教

----------------------------------------------------------------------


#include <p18f452.h> //包含PIC18F452的HEADER檔內容
#include "p18F_LCD.h" //將p18F_LCD.h函數庫檔內容輸入
#include "stdlib.h"

#define Fcy 4000000

char LCD_MSG1[]="IC PRACTICE"; //宣告字串於DATA Memory中
char LCD_MSG2[]="FREQUENCY: 0 "; //宣告字串於Data Memory中
unsigned int ASCII_Buf[16]; //用於傳輸至LCD上所使用的BUFFER
double speed;


//宣告集合變數以便處理二位元組變數資料
union {
unsigned int lt;
unsigned char bt[2];
}EDGE_N;

int Int_flag; //設定旗標確定是否有進中斷
unsigned int frequency;
unsigned int FreCount;

void InitializeTMR3(void); //TIMER3的初始設定副程式
void InitializeIC(void);

void isr_high(void); //宣告中斷副程式

void main(void)
{
InitializeTMR3( );
InitializeIC( );

INTCONbits.GIEH=1; // 將高優先中斷設定為"Enable"
PIR1bits.CCP1IF = 0; // Clear the interrupt flag
IPR1bits.CCP1IP = 1; // Set high priority
PIE1bits.CCP1IE = 1; // Enable CCP1 interrupt
RCONbits.IPEN=1; // 高低優先致能設定為"Enable"
Int_flag = 0;

OpenLCD( );
LCD_Set_Cursor(0,0); //使用Set_Cursor( ),設定游標於(0,0)
putsLCD(LCD_MSG1); //將存在Data Memory的字串,使用putrsLCD()輸出至LCD上
LCD_Set_Cursor(1,0); //使用Set_Cursor( ),設定游標於(0,0)
putsLCD(LCD_MSG2); //將存在Data Memory的字串,使用putrsLCD()輸出至LCD上


T3CONbits.TMR3ON = 1; // Start Timer3


while(1)
{
while(!Int_flag); // Get two input signal edge
PIE1bits.CCP1IE = 0; // Disable Interrupt of CCP1
Int_flag = 0;

FreCount = EDGE_N.lt;
frequency = Fcy / FreCount ;
frequency=frequency*4;
speed=frequency*0.0032;
PIE1bits.CCP1IE = 1; // Ensable Interrupt of CCP1
//double
itoa ( speed , ASCII_Buf ); // 利用

putcLCD(' '); //Claer Screen
putcLCD(' '); //Claer Screen
putcLCD(' '); //Claer Screen
putcLCD(' '); //Claer Screen
putcLCD(' '); //Claer Screen
putcLCD(' '); //Claer Screen



LCD_Set_Cursor(1,10) ; // Set LCD cursor 於 (1,10)
putsLCD(ASCII_Buf) ; // 傳送資料至LCD上

}

}

void InitializeIC(void)
{

TRISCbits.TRISC2 = 1; //設定CCP1為輸入 RC2 as input

CCP1CON=0b00000101; //Set capture every rising edge
//TMR3設為同步,Input Capture前除設為4
//可被量測的最小頻率 = 244.14Hz
//可被量測的最大頻率 = 16MHz


}

void InitializeTMR3(void)
{
T3CON = 0b11011000; //預除依定要設定為同步

PIE2bits.TMR3IE = 0; //DISable timer interrupt
}

#pragma code isrhighcode = 0x08 //高優先中斷位置
void isr_high_direct(void)
{
_asm //begin in-line assembly
goto isr_high //go to isr_high function
_endasm //end in-line assembly
}
#pragma code

#pragma interrupt isr_high // Function: isr_high(void)
void isr_high(void) //進入中斷程式
{

EDGE_N.bt[0] = CCPR1L;
EDGE_N.bt[1] = CCPR1H;
Int_flag = 1; // 設定軟體中斷旗標
PIR1bits.CCP1IF = 0; //清除中斷旗標
TMR3H = 0;
TMR3L = 0;
}
#pragma code

發表於: 2009/9/18 16:57
頂部


Re: 4011晶片如何紀錄3萬多筆數據 問題
#8
新會員
新會員


參照:

master 寫道:
30F4011 + SD + FAT 這個在microchip有現成的東西,改一改就能動。SD插到電腦還能直接讀,連用232傳都不用。

請問這接資料要去哪下載 (30F4011 + SD + FAT)
我有需要用到

謝謝您

發表於: 2009/9/10 11:08
頂部


資料儲存於記憶卡
#9
新會員
新會員


請問各位先進:
要如何將單晶片所讀取的資料儲存於記憶卡內
8位元 16位元單晶片皆可提供
是否有範例資料提供(EX:電路、程式..)

謝謝各位

發表於: 2009/9/9 17:33
頂部



(1) 2 »



:::

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... ]

教育訓練中心

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