• 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 (C_H_M)




Re: c18中斷副程式使用除法運算
#21
中級會員
中級會員


這... 你的程式中只有這裡特別不一樣
你要不要把它去掉試一下...

#pragma interrupt isr_high nosave=section(".tmpdata")//save=PROD//,section(".tmpdata"),TABLAT,TBLPTR,PCLATH,PCLATU
void isr_high(void)
{
uns16 uns16_temp;
if(
TMR0IF && TMR0IE//Timer0 interrupt,250ms interrupt one time
{
TMR0H=0xc2;
TMR0L=0xf7;
bit_flash=!bit_flash;
_250ms_count++;
union_led_ram_map.led_ram_map[30].bit3=0;//no display time dot
union_led_ram_map.led_ram_map[30].bit4=0;
if(
_250ms_count>=4//1 sec
{
bit_1_sec=TRUE;
_250ms_count=0;
union_led_ram_map.led_ram_map[30].bit3=1//display time dot
union_led_ram_map.led_ram_map[30].bit4=1;
}
if(
bit_end==TRUE)
BZ=!BZ;
TMR0IF=0;
}
if(
ADIE && ADIF)
{
key_in_ad_val=ADRESH;
key_in_ad_val=key_in_ad_val<<8;
key_in_ad_val=key_in_ad_val ADRESL;
ADIF=0;
}
if(
TMR1IE && TMR1IF)//10ms interrupt one time
{
TMR1H=0xd8//4MHz/4=1MHz,1000000Hz/100Hz=10000,65536-10000=55536=0xD8F0->10ms
TMR1L=0xf0;
GO=1;
TMR1IF=0;
}
if(
TMR2IE && TMR2IF)//100us interrupt one time
{
TMR2=198;
TMR2IF=0;
}
if(
INT0IE && INT0IF[color=CC0000] && 0[/color])
{
stop_count=0;
if(
mode_select==0)//not setup mode
{
bit_start=TRUE;
uns16_spd=46083/sp_count;
}
INT0IF=0;
}
if(
INT1IE && INT1IF)
{
INT1IF=0;
}

#pragma code


---------------------------------------------------
多了這幾個字, INT0 好像會不執行,
如果 INT0 不執行, INT0IF 也不會被清除, 那就會卡在中斷不執行主程式了.

發表於: 2008/4/29 16:22
頂部


Re: [求教] 12F508 GP2 GP3 無法變更其值!!
#22
中級會員
中級會員


我想程式應該是正確的啦!

問題應該是 SIM 模擬時的使用...

你有提到 GP2 ~ GP5 輸入皆設 1,

但要注意 GP2 左方 Time 的欄位中要 設定 0, (reset)

而且設定好之後,
重要的是要按下方的 Apply 讓 SIM 開始使用設定好的條件,
這樣應該就可以看到對的結果了。

發表於: 2008/4/29 9:27
頂部


Re: 請問inline assembly中的goto指令最大可跳躍範圍?
#23
中級會員
中級會員


小改一下試試...

#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中断中做两层循环实现较长定时
#24
中級會員
中級會員


要小改一下...

;timer1 interrupt serve routine
;这个中断每100ms进入一次

; PUSH SP,保护现场,省略
;RELOAD TIMER ,省略

DECFSZ CYCLEA,1
GOTO OUTSIDE
MOVLW   CYCLEA_INIT   ;RELOAD  CYCLEA
   MOVWF   CYCLEA

DECFSZ CYCLEB,1
GOTO OUTSIDE
MOVLW   CYCLEB_INIT   ;RELOAD  CYCLEB
   MOVWF   CYCLEB

;執行至此, 大致上為 CYCLEA*CYCLEB*100ms

;OUTSIDE 是restore SP的routine

發表於: 2008/4/18 20:58
頂部


Re: 10-bit ADC Vref 的問題??
#25
中級會員
中級會員


因為 Vref+, Vref- 都需在 AVdd 與 AVss 的範圍內,
所以, 不能接至 "負電壓" !!!

發表於: 2008/4/18 20:13
頂部


Re: HI-TECH compiler "const" 語法問題
#26
中級會員
中級會員


我純猜測的啦! 是不是改一下這邊試試...

static unsigned char LcdDspBuf[90] @0x0AB4;

unsigned const char Fun00Menu[80] = {
' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
'M','O','N','T',' ','S','E','T','P',' ','T','E','S','T',' ',' ',' ',' ',' ',' ',
' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
};

void ShowFunctionMenuunsigned const char *SourPtr );

void main (void)
ShowFunctionMenu Fun00Men );
}

void ShowFunctionMenuunsigned const char *SourPtr )
unsigned char i,j;
[
color=CC0000]unsigned char *DestPtr;[/color]

DestPtr = &LcdDspBuf;
for ( 
i=0i<10i++ )
{ [
color=CC0000]*DestPtr++ = 0x00;
for ( 
j=0j<8j++ ) 
*
DestPtr++ = *SourPtr++;[/color]
}
}

發表於: 2008/4/16 20:40
頂部


Re: 關於記憶體搬移...有什麼情況會這樣呢!?
#27
中級會員
中級會員


這個... 並不是不可以使用這些記憶體.

主要的原因就只是版主所提到的 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
#28
中級會員
中級會員


看來你是有點搞混了,

建立 sin 表格為的是節省執行時間, 它的公式就是 sin()

--------------------------------------------------------------------
在建立 sin 表格時需額外注意的事項是 sin() 傳回值範圍

-1.0 <= sin <= 1.0

而既然已經是為了節省執行時間, 沒有理由建成浮點數型式的表格

所以呢! 絕大部分的情形會以 sin() * 1000 這類的方式來建立 sin 表格

在使用到表格運算的時候, 記得要將 倍率比 考慮到喔!

然後再一項是角度的解析度問題, 當然是看你自己的使用情形而訂

如以下例子: 0-90 度, 分為 10 段 (90/10 = 9度), 倍率 1000

sin(0)*1000sin(9)*1000sin(18)*1000sin(27)*1000sin(36)*1000sin(45)*1000
[color=CC0000]     0          156             309          454          588          707[/color]
sin(54)*1000sin(63)*1000sin(72)*1000sin(81)*1000sin(90)*1000

[color=CC0000]      809          891          951          988          1000[/color]

以上是我所知道的, 希望對你有幫助 !!!

----------------------------------------------
最後, 你所貼上來的表格
我想它所表示的意思為,

這一個表格內容為 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 請問如何解決?
#29
中級會員
中級會員


提供另一個開方的函數給你參考.
不過這個函數傳回的數值比較會出現誤差,但約小於 0.01

#include <PIC1687x.h>

[color=CC0000]
bank2 double sqr_x0sqr_x1sqr_x2;
bank2 double sqr_2;
bank2 unsigned char sqr_c;

double sqr_rough(double x)
{
 if(
<= 0)  return 0;

 if(
1)
   { 
sqr_x0 0;
     
sqr_x2 1.0;
   }
 else
   { 
sqr_x0 1.0;
     
sqr_x2 10.0;
     
sqr_2 100;
     while(
sqr_2 1)
          { 
sqr_2 /= 100;
            
sqr_x0 *= 10;
            
sqr_x2 *= 10;
          }
     if(
sqr_2 0.25)  sqr_x0 *= 5;
     else  
sqr_x2 /= 2;
   }

 for(
sqr_c 0sqr_c 15sqr_c++)
    { 
sqr_x1 = (sqr_x0 sqr_x2) / 2;
      
sqr_2 sqr_x1 sqr_x1;
      if(
sqr_2 == x)
        { 
sqr_x0 sqr_x1;
          
sqr_x2 sqr_x1;
        }
      if(
sqr_2 x)  sqr_x0 sqr_x1;
      if(
sqr_2 x)  sqr_x2 sqr_x1;
    }
 return (
sqr_x0 sqr_x2) / 2;
}
[/
color]

double sqrt_root;

void main()
{
 
sqrt_root sqr_rough(2);
 
sqrt_root sqr_rough(900);
 
sqrt_root sqr_rough(49);
 
sqrt_root sqr_rough(100);
 
sqrt_root sqr_rough(2500);
 
sqrt_root sqr_rough(1500);
 
sqrt_root sqr_rough(1000);
 
sqrt_root sqr_rough(6250000);
 
sqrt_root sqr_rough(4000000);
}

發表於: 2008/4/8 23:43
頂部


Re: dsPIC30F4011"急"請大家幫'忙一下關於單晶片ASCII碼以轉成二進制的問題提供程式範例 謝謝
#30
中級會員
中級會員


因為你程式中有
// 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]
   for(
n=0n<8n++)
      { if((
ABC 0x80) > 0)  putcLCD('1');
        else  
putcLCD('0');
        
ABC <<= 1;
      }
   
putcLCD(' ');
   
putcLCD(' '); [/color]


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
頂部



« 1 2 (3) 4 5 6 7 »



:::

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

教育訓練中心

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