終於有機會玩玩 ARM® Cortex™-M0+ , FRDM-KL05Z,
- 8月 01 週五 201413:19
Freescale Cortex M0+ vs Microchip PIC32
終於有機會玩玩 ARM® Cortex™-M0+ , FRDM-KL05Z,
- 7月 24 週三 201309:45
AN1310 Bootloader 使用注意事項
AN1310
High-Speed Serial Bootloader for PIC16 and PIC18 Devices
使用此範例時, 若clock source為INT RC ,需注意Internal Oscillator Frequency Select bits的設定.在程式中除非define USE_MAX_INTOSC,才會更改OSCCON,否則將以default INT RC來執行,
- 9月 14 週三 201111:07
Deep sleep @XLP
deep sleep
在有XLP功能的MCU,可以透過deep sleep 來讓MCU達到最省電的狀態,進入方法如下:
//Way 1.
asm ("disi #4");
asm ("bset DSCON, #15");
asm ("pwrsav #0");
Nop();
Nop();
//Way 2.
DSCONbits.DSEN=1;
Sleep();
Nop();
Nop();
不過在wake-up之後有個地方要注意, DSCONbits.RELEASE需要 read & clear,否則 TRIS & LAT 會被 core hold住(既使TRIS &LATA已重新config.),
Ex:
void main(){
systeminitial();
if (RCONbits.DPSLP == 1){
RCONbits.DPSLP = 0;
DSCONbits.RELEASE = 0; //the tris & lat has been hold until DSCONbits.RELEASE=0 is executed.
DSWSRC = 0;
}
:
:
:
}
- 7月 05 週二 201111:35
PSV
簡單說變數宣告auto_psv, 就是讓compiler把 const的變數都放在同一個 psv中(同一個32k), 所以auto_psv不能跟address同時使用
且宣告成autp_psv ,並不是不需要PSVPAG=__builtin_psvpage(xxx), 若const太多, 多到超過32k, 還是得在access前"手動"變更PSVPAG
小於32k時不需要,是因為都在同一個psv裡,(之前以為宣告成autp_psv, 就可以不需PSVPAG=__builtin_psvpage(xxx)...@@)
而在ISR宣告時
且宣告成autp_psv ,並不是不需要PSVPAG=__builtin_psvpage(xxx), 若const太多, 多到超過32k, 還是得在access前"手動"變更PSVPAG
小於32k時不需要,是因為都在同一個psv裡,(之前以為宣告成autp_psv, 就可以不需PSVPAG=__builtin_psvpage(xxx)...@@)
而在ISR宣告時
- 4月 15 週五 201109:09
OSCCONbits.SCS System Clock Select bits
在PIC18F2xK20,MCU可以用內部的 OSC.搭配PLL來跑到64MHZ(16MIPS),但在SCS的選則要注意不能選1x,否則PLL是無開啟的
bit 1-0 SCS<1:0>: System Clock Select bits
1x = Internal oscillator block
01 = Secondary (Timer1) oscillator
00 = Primary clock (determined by CONFIG1H[FOSC<3:0>])..............//can enable PLL
bit 1-0 SCS<1:0>: System Clock Select bits
1x = Internal oscillator block
01 = Secondary (Timer1) oscillator
00 = Primary clock (determined by CONFIG1H[FOSC<3:0>])..............//can enable PLL
- 2月 19 週六 201122:03
PIC32 ADC
for more detail ,psl reference MCU4101 Lab 5& 6
//ADC Single
OpenADC10( ADC_MODULE_ON | ADC_IDLE_CONTINUE | ADC_FORMAT_INTG16 | ADC_CLK_MANUAL | ADC_AUTO_SAMPLING_ON | ADC_SAMP_OFF ,
ADC_VREF_AVDD_AVSS | ADC_OFFSET_CAL_DISABLE | ADC_SCAN_OFF | ADC_SAMPLES_PER_INT_1 | ADC_ALT_BUF_ON | ADC_ALT_INPUT_OFF ,
ADC_SAMPLE_TIME_31 | ADC_CONV_CLK_SYSTEM | ADC_CONV_CLK_32Tcy ,
ENABLE_AN2_ANA , SKIP_SCAN_ALL );
//ADC_AUTO_SAMPLING_ON(ASAM=1):採樣在上一次轉換結束後執行(the SAMP will be set automatically)
//ADC_CONV_CLK_SYSTEM:為PB CLK
//ADC_CLK_MANUAL(SSRC:000):手動觸發 after SAMP be clear(by S/W), then start convert
//ADC Single
OpenADC10( ADC_MODULE_ON | ADC_IDLE_CONTINUE | ADC_FORMAT_INTG16 | ADC_CLK_MANUAL | ADC_AUTO_SAMPLING_ON | ADC_SAMP_OFF ,
ADC_VREF_AVDD_AVSS | ADC_OFFSET_CAL_DISABLE | ADC_SCAN_OFF | ADC_SAMPLES_PER_INT_1 | ADC_ALT_BUF_ON | ADC_ALT_INPUT_OFF ,
ADC_SAMPLE_TIME_31 | ADC_CONV_CLK_SYSTEM | ADC_CONV_CLK_32Tcy ,
ENABLE_AN2_ANA , SKIP_SCAN_ALL );
//ADC_AUTO_SAMPLING_ON(ASAM=1):採樣在上一次轉換結束後執行(the SAMP will be set automatically)
//ADC_CONV_CLK_SYSTEM:為PB CLK
//ADC_CLK_MANUAL(SSRC:000):手動觸發 after SAMP be clear(by S/W), then start convert
- 10月 29 週五 201009:23
DISI
在16Bit的MCU中,並無提供一個GIE的控制元來對所有的interrupt enable or disable,不過有instruction可以做到相同的事情
DISI #lit14 ;Disable Interrupts for k instruction cycles
DISI可以將優先權1~6的中斷給禁止一段時間,但不能禁止TRAP或是優先權7的中斷源(IP7 & trap also can interrupter main-routine)
DISI #0 ;中斷復原
ps:建議不要直接去操作DISICNT Reg.,DISICNT為0時,無法寫入新值(需用DISI指令)
DISI #lit14 ;Disable Interrupts for k instruction cycles
DISI可以將優先權1~6的中斷給禁止一段時間,但不能禁止TRAP或是優先權7的中斷源(IP7 & trap also can interrupter main-routine)
DISI #0 ;中斷復原
ps:建議不要直接去操作DISICNT Reg.,DISICNT為0時,無法寫入新值(需用DISI指令)
- 6月 21 週一 201013:58
Slew rate control @I2C

PIC18F46J50
EEPROM:24lc02B
Ru=3.6k //pull-up
I2C speed:400kHz (INTOSC:4MHZ SSPADD=4)
SLEW_OFF SSPxSTATbits.SMP=1;
SLEW_ON SSPxSTATbits.SMP=0;
- 4月 24 週六 201018:23
pb_clk for PIC32
在PIC32中若要得正確的pb_clk,除了要先填適當的congig bit之外,在程式中亦需執行下列function
// Configure the device for maximum performance but do not change the PBDIV
// Given the options, this function will change the flash wait states, RAM
// wait state and enable prefetch cache but will not change the PBDIV.
// The PBDIV value is already set via the pragma FPBDIV option above..
SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
or
SYSTEMConfig(SYS_FEEQ, SYS_CFG_ALL);
or
SYSTEMConfigPerformance(SYS_FEEQ);
否則peripheral的clk將會錯誤
ex:
#define SYS_FEEQ 80000000L
int pb_clk;
pb_clk=SYSTEMConfig(SYS_FEEQ, SYS_CFG_ALL);
// Configure the device for maximum performance but do not change the PBDIV
// Given the options, this function will change the flash wait states, RAM
// wait state and enable prefetch cache but will not change the PBDIV.
// The PBDIV value is already set via the pragma FPBDIV option above..
SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
or
SYSTEMConfig(SYS_FEEQ, SYS_CFG_ALL);
or
SYSTEMConfigPerformance(SYS_FEEQ);
否則peripheral的clk將會錯誤
ex:
#define SYS_FEEQ 80000000L
int pb_clk;
pb_clk=SYSTEMConfig(SYS_FEEQ, SYS_CFG_ALL);
- 4月 11 週日 201000:41
Out of Scope in C30 @MPLAB IDE
在MPLAB IDE下有一個可以觀察變數的視窗"watch"
一般來說所有的變數都可以在此視窗下被看見,除了Reserved Memory 或是 Local Variable:
解決 Reserved Memory 的問題是在 MPLAB IDE 下有個 "Release & Debug" 的下拉視窗 :
如果要用 ICD2 or Real ICE Degubbing 的話,該選項就要選擇 "Debug" 後重新 Build All 再燒錄,
這樣 Linker 才可以將除錯要用到的資源保留下來這樣才不會跟你的程式衝突(共用RAM的問題)。如果
要讓 Target Board 單獨執行的話就可以勾選 "Release" 的選項。
一般來說所有的變數都可以在此視窗下被看見,除了Reserved Memory 或是 Local Variable:
解決 Reserved Memory 的問題是在 MPLAB IDE 下有個 "Release & Debug" 的下拉視窗 :
如果要用 ICD2 or Real ICE Degubbing 的話,該選項就要選擇 "Debug" 後重新 Build All 再燒錄,
這樣 Linker 才可以將除錯要用到的資源保留下來這樣才不會跟你的程式衝突(共用RAM的問題)。如果
要讓 Target Board 單獨執行的話就可以勾選 "Release" 的選項。
