【PIC24F04KA200】PIC24F04KA200ではsprintfが使えない件


■PIC24F04KA200にてAD変換で取得した結果を「sprintf」で文字列に変換し

秋月電子通商のI2C-LCDモジュール
に表示しようとしましたが...失敗!!

ソースの画像↓
PIC24F04KA200_sprintありf_code

ビルドの画像↓
PIC24F04KA200_ビルドerror

ビルドERROR!

↓↓↓
そこで「sprintf」をコメントアウトするとビルド成功!

ソースの画面↓
PIC24F04KA200_sprintf_disable

メモリの具合↓
PIC24F04KA200_sprintfなし_プログラムメモリ

ビルドの結果↓
003_
PIC24F04KA200ではsprintfが使えない!ってことですね。。。残念。

【PIC32MX370F512H】秋月電子通商からPIC32MXF512Hが販売されている。

秋月電子通商でPIC32MX370F512Hを取扱始めたようです。 これでPIC32MXの開発ハードルが下がりますね。 PICマイコン PIC32MX370F512HT-I/PT0.5mmピッチQFP(64ピン)変換基板に実装した PIC32MXマイコン実装基板です。 【PIC32MX370F512H】96MHzでつかってみる。①コンフィグレーションの設定を参照ください。

【dsPIC33FJ】MCはMotorControlの略!

◆dsPIC33FJ128MC802をよく使っていますが、
MCシリーズ:MotorControlモータコントロールのPeripheral(周辺機能)を特徴としたマイコンです。
知らんかった。。。
GPシリーズ:GeneralPurpose汎用マイコンみたいです。
使うならこっちのほうがいいかもね。

【PIC32MZ2048ECH144-I/PH】PIC32MZ2048ECH144を買いました!

RSコンポーネンツで買えました。
カラー液晶を16bitPMP接続でDMA転送してみたいなー
PMDpinがPMD15まであるから出来そうですね。
データシートはこちらPIC32MZ2048ECH144←をクリックしてください。
PIC32MZ2048ECH14-I_PH

【PIC32MX370F512H】PMP接続のDMA転送でaitendoの1.44インチ液晶TFT(ZY-FGD)を使ってみる。その4

◆PIC32MX370F512HのPMP接続のDMA転送を使って
aitendoの1.44インチ液晶TFTに高速表示します!
SDcardに書き込まれた画像ファイルBMPを読み込んでます。
1)動画
動画はこちらから

速度はだいたい30fpsといったところです。

【PIC32MX370F512H】タイマーを使ってみる。

PIC32MXのタイマー機能概要

2種類のタイマーがあり、
・タイマーAは16bitタイマー。
・タイマーBは16/32bitいずれかを選択できるタイマー。T32bitで選択
今回はタイマーAの16bitタイマーを使ってみます。

参照

リファレンスマニュアルDS61105F_JPを参照しました。
設定は16bitPICとほとんど変わりありません。
以前作成した記事
【dsPIC33FJ128MC802】タイマー機能を使ってみる。をそのまま流用しました。

クロックの設定

クロックのソースはシステムクロックではなくペリフェラルクロックなので注意が必要です。
今回はコンフィグレーションで「システムクロックの1/2設定」としました。
 FPBDIV = DIV_2

T1CONレジスタの設定

ほとんどの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 ==============================================================

出力波形の確認

PIC32MX370F512Hでタイマー機能を使う
オシロでポート制御にてタイマー機能を確認

ピンク色の波形が出力波形です。
ちゃんと10msec毎に出力が切り替わってます。
一応成功みたい。

【PIC32MX370F512H】96MHzでつかってみる。①コンフィグレーションの設定

最大100MHzで動作可能なPIC32MX370F512Hを96MHzで使ってみます!
今回はコンフィグレーションの設定です。

パーツ

・PIC32MX370F512Hのパッケージは2種類あり
実装の容易なPIC32MX370F512H-I/PTをチップワンで購入しました。
このままでは実験が難しいく変換基板に実装する必要があります。
秋月電子0.5mmピッチQFP(64ピン)変換基板を購入します。

コンフィグレーションの参照

"C:¥Program Files (x86)¥Microchip¥xc32¥v1.32¥docs¥config_docs"に
各デバイス名でhtmlがありますのでクリックして開きます。
お好みに合わせてコンフィグレーションビットを設定します。

PIC32MX370F512Hのコンフィグレーション

96MHzに設定

内部高速発振を利用して96MHzにしたいと思います。

FNOSCオシレータモード設定

「#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となります。

PLLの設定

「#pragma config FPLLMUL=MUL_24」
FIN:4MHzを24逓倍し96MHzとします。

PLL出力分周の設定

「#pragma config FPLLODIV=DIV_1」
1分周にします。
続きはタイマーを使って動作確認をします!