■PIC24F04KA200にてAD変換で取得した結果を「sprintf」で文字列に変換し
秋月電子通商のI2C-LCDモジュール
に表示しようとしましたが...失敗!!
ソースの画像↓
ビルドの画像↓
ビルドERROR!
↓↓↓
そこで「sprintf」をコメントアウトするとビルド成功!
ソースの画面↓
メモリの具合↓
■PIC24F04KA200にてAD変換で取得した結果を「sprintf」で文字列に変換し
秋月電子通商のI2C-LCDモジュール
に表示しようとしましたが...失敗!!
ソースの画像↓
ビルドの画像↓
ビルドERROR!
↓↓↓
そこで「sprintf」をコメントアウトするとビルド成功!
ソースの画面↓
メモリの具合↓
◆秋月電子通商でPIC32MX370F512Hを取扱始めたようです。 これでPIC32MXの開発ハードルが下がりますね。 PICマイコン PIC32MX370F512HT-I/PTを 0.5mmピッチQFP(64ピン)変換基板に実装した PIC32MXマイコン実装基板です。 【PIC32MX370F512H】96MHzでつかってみる。①コンフィグレーションの設定を参照ください。
RSコンポーネンツで買えました。
カラー液晶を16bitPMP接続でDMA転送してみたいなー
PMDpinがPMD15まであるから出来そうですね。
データシートはこちらPIC32MZ2048ECH144←をクリックしてください。
2種類のタイマーがあり、
・タイマーAは16bitタイマー。
・タイマーBは16/32bitいずれかを選択できるタイマー。T32bitで選択
今回はタイマーAの16bitタイマーを使ってみます。
リファレンスマニュアルDS61105F_JPを参照しました。
設定は16bitPICとほとんど変わりありません。
以前作成した記事
【dsPIC33FJ128MC802】タイマー機能を使ってみる。をそのまま流用しました。
クロックのソースはシステムクロックではなくペリフェラルクロックなので注意が必要です。
今回はコンフィグレーションで「システムクロックの1/2設定」としました。
FPBDIV = DIV_2
ほとんどのbitは「0」でOKです。
①TimerONbitの設定:タイマ有効
「T1CONbits.ON = 1」
1でタイマが有効となります。
②TCKPSbitの設定:タイマ入力クロックのプリスケール
「 T1CONbits.TCKPS = 0b00;」
00は「1:1」となります。
10msec毎にポートDのbit9をパタパタさせます。システムクロックは、外付けセラロック10MHzを1/2で5MHzを入力しPLLで24倍して100MHzにしてます。
2014/9/21:訂正)
システムクロックは内部発振8MHzを1/2で4MHz入力して
PLLで24倍だから96MHz。
タイマークロックソースはペリフェラルクロックを用います。
ペリフェラルクロックはシステムクロックを1/2しましたので48MHzとなります。
#include <stdio.h> #include <plib.h> #include <p32xxxx.h> #include <stdlib.h> #include "my_header.h" //== configuration //== OSC:8MHz SYSCLK:80MHz= OSC_8/PLLI_2=4MHz*MUL_20 ==================== #pragma config FNOSC=FRCPLL //Oscillator_selection_bits(FNOSC) #pragma config POSCMOD=OFF //secondary_Oscillator_Enable(FSOSCEN) //#pragma config FNOSC=PRIPLL //Oscillator_selection_bits(FNOSC) //#pragma config POSCMOD=XT //secondary_Oscillator_Enable(FSOSCEN) #pragma config FPLLMUL=MUL_24 //PLL_Multiplier(FPLLMUL) #pragma config FPLLIDIV=DIV_2 //PLL_input_driver(FPLLIDIV) #pragma config FPLLODIV=DIV_1 //PLL_output_clock_divider(FPLLODIV) #pragma config FPBDIV=DIV_2 //Peripheral_clock_divisor(FPBDIV) #pragma config FSRSSEL = PRIORITY_7 //shadow_register_set_priority_select(FSRSSEL) #pragma config PMDL1WAY = OFF //peripheral_module_disable_configuration(PMDL1WAY) #pragma config IOL1WAY = OFF //peripheral_pin_select_configuration(IOL1WAY) #pragma config FSOSCEN = OFF //secondary_oscillator_enable(FSOCEN) #pragma config IESO = OFF //internal_external_switch_over(IESO) #pragma config OSCIOFNC = OFF //CLKO_output_signal_active_on_the_OSCO_pin(OSCIOFNC) #pragma config FCKSM = CSDCMD //clock_switching_and_monitor_selection(FCKSM) #pragma config WINDIS = OFF //watchdog_timer_is_in_non-window_mode(WINDIS) #pragma config FWDTEN=OFF //watchdog_timer_window_enable(FWDTEN) #pragma config DEBUG = OFF //debugger_is_disable(DEBUG) #pragma config JTAGEN = OFF //JTAG_disable #pragma config ICESEL=ICS_PGx3 //ICE_ICD_Comm_channel_select(ICESEL) #pragma config PWP = OFF //program_flash_write_protect(PWP) #pragma config BWP = OFF //boot_flash_write_protect_bit(BMP) #pragma config CP = OFF //code_protect(CP) //== function_prototype ==================================================== //== array_initialize ================================================== unsigned char string_box1[15] = "abcdefg¥r¥n" ; unsigned char rev_data[] = "----¥r¥n"; //UART_receive_string unsigned char tes_d[49000]; //== main_function ==================================================== int main(void) { //== OSC ================================================= SYSTEMConfigPerformance(96000000); //system_clock_96MHz //== JTAG ================================================ //DEVCFG0bits.JTAGEN = 0; //JtagDisable CFGCONbits.JTAGEN = 0; //JtagPortDisable //== PORT ================================================ TRISB = 0x00000000; TRISC = 0x00000000; TRISD = 0x00000000; TRISE = 0x00000000; TRISF = 0x00000000; TRISG = 0x00000000; ANSELB = 0x00000000; ANSELC = 0x00000000; ANSELD = 0x00000000; ANSELE = 0x00000000; ANSELF = 0x00000000; ANSELG = 0x00000000; //== T1CON =============================================== T1CON = 0x00000000; //Clear T1CONbits.TON = 0; //<15>Timer1_OFF T1CONbits.TSIDL = 1; //<13>Idelmode:SleepStop T1CONbits.TGATE = 0; //<7>Gatetime:OFF T1CONbits.TCKPS = 0B00; //PS1:1 T1CONbits.TCS = 0; //ClockSource:INT IEC0bits.T1IE = 0; //Interrupt:disable IPC1bits.T1IP = 0; //InterruptLevel:0 //== Interrupt ENABLE =========================================== //INTCONbits.MVEC = 1; //Multi_Vector //asm volatile("ei"); //Enable_Interrup //== preprocessing ============================================== //== while ====================================================== while(1) { LATDbits.LATD9 = !LATDbits.LATD9; delay_ms(10); }//while(1) }//int main(void) //== delay_us ============================================================== void delay_us(unsigned int usec) { TMR1 = 0; //TMR1=0 T1CONbits.TON = 1; //Timer1_start PR1 = 47; // unsigned int i; for(i=0; i<usec; i++) { while(!IFS0bits.T1IF); //Timer1Interrupt(IFS0bits.T1IF==0) IFS0bits.T1IF = 0; //InterruptFlagDown }//for(i=0; i<usec; i++) }//void delay_us(unsigned int usec) //== delay_ms ============================================================== void delay_ms(unsigned int msec) { unsigned int i; for(i=0; i<msec; i++) { delay_us(1000); //call:1000usec }//for }//void delay_ms(unsigned int msec) //== end ==============================================================
ピンク色の波形が出力波形です。
ちゃんと10msec毎に出力が切り替わってます。
一応成功みたい。
最大100MHzで動作可能なPIC32MX370F512Hを96MHzで使ってみます!
今回はコンフィグレーションの設定です。
・PIC32MX370F512Hのパッケージは2種類あり
実装の容易なPIC32MX370F512H-I/PTをチップワンで購入しました。
このままでは実験が難しいく変換基板に実装する必要があります。
秋月電子の0.5mmピッチQFP(64ピン)変換基板を購入します。
"C:¥Program Files (x86)¥Microchip¥xc32¥v1.32¥docs¥config_docs"に
各デバイス名でhtmlがありますのでクリックして開きます。
お好みに合わせてコンフィグレーションビットを設定します。
内部高速発振を利用して96MHzにしたいと思います。
「#pragma config FNOSC=FRCPLL」
「#pragma config POSCMOD=OFF」
内部高速発振とPLL併用を選択します。
「#pragma config FPLLIDIV=DIV_2」
内部高速発振:8MHzでPLLの入力周波数FINは4~5MHzの範囲なので2分周します。
しかしながらDS61112HのP16の6.3.1.3.2に記載の通り
PLL併用FRCオシレータモードの場合は
デフォルトで「FPLLIDIV=DIV_2」固定となりFINは4MHzとなります。
「#pragma config FPLLMUL=MUL_24」
FIN:4MHzを24逓倍し96MHzとします。
「#pragma config FPLLODIV=DIV_1」
1分周にします。
続きはタイマーを使って動作確認をします!