Re: [求教] 12F508 GP2 GP3 無法變更其值!!
|
||||
---|---|---|---|---|
中級會員
|
我想程式應該是正確的啦!
問題應該是 SIM 模擬時的使用... 你有提到 GP2 ~ GP5 輸入皆設 1, 但要注意 GP2 左方 Time 的欄位中要 設定 0, (reset) 而且設定好之後, 重要的是要按下方的 Apply 讓 SIM 開始使用設定好的條件, 這樣應該就可以看到對的結果了。
發表於: 2008/4/29 9:27
|
|||
|
Re: 請問inline assembly中的goto指令最大可跳躍範圍?
|
||||
---|---|---|---|---|
中級會員
|
小改一下試試...
#define APP_CodeAddr 0xA000 #define JMP_AppCode(PROG_ADDR) asm volatile ("goto %0" : /*no outputs*/ : "i"((unsigned long)PROG_ADDR)) int main(void){ . . JMP_AppCode(APP_CodeAddr); . . }
發表於: 2008/4/18 21:48
|
|||
|
Re: 100ms中断中做两层循环实现较长定时
|
||||
---|---|---|---|---|
中級會員
|
要小改一下...
;timer1 interrupt serve routine ;这个中断每100ms进入一次 ; PUSH SP,保护现场,省略 ;RELOAD TIMER ,省略 DECFSZ CYCLEA,1 GOTO OUTSIDE
MOVLW CYCLEA_INIT ;RELOAD CYCLEA
DECFSZ CYCLEB,1 GOTO OUTSIDE
MOVLW CYCLEB_INIT ;RELOAD CYCLEB
;執行至此, 大致上為 CYCLEA*CYCLEB*100ms ;OUTSIDE 是restore SP的routine
發表於: 2008/4/18 20:58
|
|||
|
Re: 10-bit ADC Vref 的問題??
|
||||
---|---|---|---|---|
中級會員
|
因為 Vref+, Vref- 都需在 AVdd 與 AVss 的範圍內,
所以, 不能接至 "負電壓" !!!
發表於: 2008/4/18 20:13
|
|||
|
Re: HI-TECH compiler "const" 語法問題
|
||||
---|---|---|---|---|
中級會員
|
我純猜測的啦! 是不是改一下這邊試試...
static unsigned char LcdDspBuf[90] @0x0AB4;
發表於: 2008/4/16 20:40
|
|||
|
Re: 關於記憶體搬移...有什麼情況會這樣呢!?
|
||||
---|---|---|---|---|
中級會員
|
這個... 並不是不可以使用這些記憶體.
主要的原因就只是版主所提到的 Release 與 Debug 模式的問題. 當使用 ICD2 來進行 Debug 時, 實際上是會占用到內部 RAM 的一小部分來協助 Debug 的運作的. 此時若未改變為 Debug 模式並重新 Build All 的話, 便會出現 Debug 所占用的 RAM 與使用者程式使用到的 RAM發生重疊的現象, 以致 Debug 時出現跟正常程式結果值不一樣的情形. 選擇為 Debug 模式且重新 Build All 時, 會將使用者程式可使用的 RAM 區域稍微調整(通常是往後), 這樣 Debug 所使用的 RAM 就不會與使用者使用的區域重疊了. 所以, 使用 ICD2 來進行 Debug 時要記得改為 Debug 模式並重新 Build All, 這樣才不會有使用者變數內容遭 Debug 操作影響的情形. 當要正式應用時改回成 Release 模式並重新 Build All 以除去 Debug 模式所會占用的資源。
發表於: 2008/4/14 17:30
|
|||
|
Re: BLDC sine wave generation by PIC16
|
||||
---|---|---|---|---|
中級會員
|
看來你是有點搞混了,
建立 sin 表格為的是節省執行時間, 它的公式就是 sin() -------------------------------------------------------------------- 在建立 sin 表格時需額外注意的事項是 sin() 傳回值範圍 -1.0 <= sin <= 1.0 而既然已經是為了節省執行時間, 沒有理由建成浮點數型式的表格 所以呢! 絕大部分的情形會以 sin() * 1000 這類的方式來建立 sin 表格 在使用到表格運算的時候, 記得要將 倍率比 考慮到喔! 然後再一項是角度的解析度問題, 當然是看你自己的使用情形而訂 如以下例子: 0-90 度, 分為 10 段 (90/10 = 9度), 倍率 1000
sin(0)*1000, sin(9)*1000, sin(18)*1000, sin(27)*1000, sin(36)*1000, sin(45)*1000
sin(54)*1000, sin(63)*1000, sin(72)*1000, sin(81)*1000, sin(90)*1000
以上是我所知道的, 希望對你有幫助 !!! ---------------------------------------------- 最後, 你所貼上來的表格 我想它所表示的意思為, 這一個表格內容為 sin(0) 到 sin(60), 角度分切的桯度為 1024代表 360度, 那麼 60度的表格 , 60/360 * 1024 = 171 個分段(項), 加上 sin(0) 這一項則為 172 項 那麼 0 的下一項應該就是 sin(60/171)*K sin(0.3508...) * K = 201 K = 32822 因為該值應該會經四捨五入的處理, 以及整數 正/負數範圍為 -32768 ~ +32767 的條件來考慮 所以, 原本的實際 倍率值 應該極可能為 32767 吧!
發表於: 2008/4/12 23:12
|
|||
|
Re: 呼叫過多數學函數導致 RAM overflow 請問如何解決?
|
||||
---|---|---|---|---|
中級會員
|
提供另一個開方的函數給你參考.
不過這個函數傳回的數值比較會出現誤差,但約小於 0.01
#include <PIC1687x.h>
發表於: 2008/4/8 23:43
|
|||
|
Re: dsPIC30F4011"急"請大家幫'忙一下關於單晶片ASCII碼以轉成二進制的問題提供程式範例 謝謝
|
||||
---|---|---|---|---|
中級會員
|
因為你程式中有
// puthexLCD( ABC ); // putcLCD(ABC); 這兩行在, 所以我假設你已經使用這兩個函數檢視過你的接收數值了. 提供以下供你參考: void _ISR _U1RXInterrupt(void) { Rec_Buffer = ReadUART1( ); // Read data from Receiver FIFO ABC = Rec_Buffer; AA = ABC; Rec_Flag = 1; // Set the Received Flag IFS0bits.U1RXIF = 0 ; // Clear Interrupt Flag } int main( void ) { SRbits.IPL=4; OpenLCD( ) ; // 使用 OpenLCD( )對 LCD 模組作初始化設定 Test_UART( ); // UART 模組測試程式 } void Test_UART(void ) { unsigned char n; Init_UART( ) ; // 對 UART 模組作初始化設定 printf("\x1b[2J"); setcurLCD(0,0) ; // 使用 setcurLCD( ) 設定游標於 (0,0) putrsLCD( UART_LCD1 ) ; setcurLCD(0,1) ; // 使用 setcurLCD( ) 設定游標於 (0,1) putrsLCD( UART_LCD2 ) ; printf("************************************************************\r\n"); printf("* Microchip Workshop RTC Training Exercise 1 : *\r\n"); printf("* Please send the folat value form SIN 0 ~ 180 deg *\r\n"); printf("************************************************************\r\n"); for (n=0;n<190;n+=10) { Sin_A = sinf((n*PI)/180); printf(" SIN %3d deg = %f\n\r",n,Sin_A); } setcurLCD(0,1) ; // 使用 setcurLCD( ) 設定游標於 (0,1) putrsLCD( UART_LCD5 ) ; while (1) { while ( !Rec_Flag) ; Rec_Flag=0; if (Rec_Buffer==0x0d) { setcurLCD(0,0) ; putrsLCD( UART_LCD3 ) ; setcurLCD(0,1) ; putrsLCD( UART_LCD4 ) ; //Clear Line 2 of LCD setcurLCD(0,1) ; Rec_Count=0; } else { // puthexLCD( ABC ); // putcLCD(ABC);
[color=CC0000]
Rec_Count++; if (Rec_Count>=4) { setcurLCD(0,1) ; Rec_Count=0; } } } } ---------------------------------------------------------- 稍微解說一下修改的部分. for(n=0; n<8; n++) 進行8個位元資料的檢視與輸出 if((ABC & 0x80) > 0) putcLCD('1'); else putcLCD('0'); 如果 bit7 大於 0 時輸出 '1' , 否則輸出 '0' ABC <<= 1; bit6, bit5 .... bit0 依序移向 bit7 putcLCD(' '); putcLCD(' '); 印出2個空格, 好跟下一個輸出能區隔開
發表於: 2008/3/26 22:34
|
|||
|