PICマイコンの使い方

PICマイコンの8bitマイコンから32bitマイコンまで使いこなすぞ! 周辺機能やアセンブラ、C言語を使いこなすぞ。ARMには負けないぞ! 頼みの綱はPIC32MZだ!たのしみだなー

PIC24F

【PIC24F08KL200】PIC24F08KL200でsprintfを使う

■PIC24F04KA200にてAD変換で取得した結果を「sprint」で文字列に変換し
秋月電子通商のI2C-LCDモジュール に表示しようとしましたが...失敗しました。。。
同じ低消費タイプのPIC24F08KL200にてAD変換で取得した結果を「sprintf」で文字変換し
I2C-LCDモジュールへの表示に挑戦!

ソースの画像↓
PIC24F08KL200_code


ビルドの画像↓
PIC24F08KL200_build_SUCCESSFUL
BUILD_SUCCESSFUL!


ダッシュボードの画像↓
PIC24F08KL200_dashboard



かなりプログラムメモリを消費していることが判明
しかしながらPIC24F08KL200では「sprintf」が使えることがわかりました。

そこで「sprintf」をコメントアウトしてみる

ソースの画面↓
PIC24F08KL200_sprintf_commenting out_code
メモリの具合↓
PIC24F08KL200_sprintf_commenting out_dashboard

「sprintf」有り無しで比較すると
データメモリで24→84と60byteアップ
プログラムメモリで486→1803と1317byte消費していることがわかりました。
PIC24F04KA200ではプログラムメモリの空が700程度しかなかったから
「sprintf」が使えなかったことがわかりました。
同じサイズならプログラムメモリ、データメモリは多い方がいいね!




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

■PIC24F04KA200にてAD変換で取得した結果を「sprint」で文字列に変換し
秋月電子通商のI2C-LCDモジュール に表示しようとしましたが...失敗!!

ソースの画像↓
PIC24F04KA200_sprintありf_code

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

ビルドERROR!



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

ソースの画面↓
PIC24F04KA200_sprintf_disable
メモリの具合↓
PIC24F04KA200_sprintfなし_プログラムメモリ
ビルドの結果↓
003_
PIC24F04KA200ではsprintfが使えない!ってことですね。。。残念。



【PIC24F04KA200】書き込めない!!(pickit3)


◆PIC24F04KA200にプログラムが書き込めない!!



どうやらコンフィグレーションがダメらしい・・・
「リセットを使う」にしとかないとだめでした。
×:_FPOR(MCLRE_OFF);
○:_FPOR(MCLRE_ON);
(回路図は下)

書き込み失敗(書き込めない)
×:_FPOR(MCLRE_OFF);
The following memory fegions failed to correctly:Configuration Memory
Address:00f8000c Expected value:00000079 Received Value: 000000f9
Programming failed

PIC24F04KA200書き込み失敗


書き込み成功(書き込める)
×:_FPOR(MCLRE_OFF);

PIC24F04KA200書き込み成功


5)回路図
c777fd6f.png


【PIC24FJ64GA002】秋月300円液晶(LTA042B010F)をつかってみる。


◆PIC24FJ64GA002で秋月300円液晶をつかってみます。今回は単色のチャレンジです。



0)参考サイト
なる研
さんで各ポート、タイミングチャートを勉強させてもらいました。

1)色設定とポート
PORTBを全部使えば16ビットカラーに出来るんですが
ポートの節約のため256色8ビットにしました。
今回はPORTBの下位8ビットを下記の表のように接続しました。












機能LTA042B010FPIC24FJ64GA002
赤2R5_22RB7_16
赤1R4_23RB6_15
赤0R3_24RB5_14
緑2G5_15RB4_11
緑1G4_16RB3_7
緑0G3_17RB2_6
青2B5_8RB1_5
青1B4_9RB0_4


2)タイムチャート
CLKが立下りのときにサンプリングされるので
CLK=1のときに色をセットしておいて、CLK=0にするだけです。

3)実行中はこちら
73c2da65.jpg


4)プログラムの例
赤色をセットしてクロックをパタパタだけです。
プログラムの例はこちら↓

//=========================================================
// TEST
//=========================================================
//== ヘッダファイル ============================================
#include <p24FJ64GA002.h>
#include <stdio.h>
//== define ===========================================================
#define akiLCD_CLK PORTAbits.RA2
#define akiLCD_HS PORTAbits.RA3
#define akiLCD_VS PORTAbits.RA4
//== configuration ======================================================
_CONFIG1( JTAGEN_OFF //JTAGポート:OFF
& GCP_OFF //汎用セグメントプログラムメモリコード保護:OFF
& GWRP_OFF //汎用セグメントフラッシュメモリ書き込み保護:OFF
& BKBUG_OFF //バックグラウンドデバッカ:OFF
& COE_OFF //クリップオンエミュレート:OFF
& ICS_PGx1 //ICDピン選択:PGC1、PGD1を選択
& FWDTEN_OFF) //WDT:OFF
//== 8MHz×PLL4=32MHz =================================================================
_CONFIG2( IESO_OFF //2段階起動:OFF
& FNOSC_FRCPLL //発振選択:内部発振、PLL使用
& FCKSM_CSDCMD //クロック切り替え、モニタ:切り替えOFF、モニタOFF
& OSCIOFNC_ON //OSCOピン:ON→IO OFF→Fosc/2
& IOL1WAY_OFF //RPレジスタプロテクト:OFF
& I2C1SEL_PRI //I2C1ピン:主選択
& POSCMOD_NONE) //主発振:無効
//== function_prototype =================================================================

//== MyTimer =====================================================================
void delay_us(unsigned int usec); //Timer1を利用したusec関数
void delay_ms(unsigned int msec); //msec関数


//== main ==================================================================
int main(void)
{
//== クロックの設定 ========================================================
CLKDIV = 0; //PLL設定 1:1
//== AD切り替え ==========================================================
AD1PCFG = 0xffff; //全digital
//=== TRISA ===========================================================
TRISA = 0x0000; //initial_
//== TRISB =============================================================
TRISB = 0x0000; //input:
//TRISBbits.TRISB3 = 1; //SD_WE
//TRISBbits.TRISB4 = 1; //SD_CD
//TRISBbits.TRISB6 = 1; //SDI
//== SPI設定 ============================================================
//RPOR5bits.RP10R = 7; //SDO1:RP10
//RPOR5bits.RP11R = 8; //SCK1OUT:RP11
//RPINR20bits.SDI1R = 6; //SDI:RP6
//== TIMER1設定 =========================================================
T1CONbits.TON = 0; //Timer1_OFF
T1CONbits.TSIDL = 1; //アイドルモード:Sleep中は停止
T1CONbits.TGATE = 0; //ゲート積算時間:OFF
T1CONbits.TCKPS = 0B00; //PS1:1
T1CONbits.TCS = 0; //クロックソース:内部
IEC0bits.T1IE = 0; //割り込み拒否
IPC0bits.T1IP = 0; //優先レベル0
//== 割り込み許可 =========================================================
//== 前処理 =============================================================
delay_ms(200);
akiLCD_HS = 0;
akiLCD_VS = 0;
//== while文 ===========================================================
while(1)
{
akiLCD_CLK = 1;
PORTB = 0b11100000; //RED
akiLCD_CLK = 0;
}//while
}//int main(void)
//== CN_Interrupt =========================================================================

間違ってたらゴメンね!

5)回路図はこちら
バックライト用に負電源が必要なので、これまた秋月のLT1054を使いました。
電解コンデンサ2つで負電圧(電源電圧のマイナス版)を作れるので楽です。
e7064089.png

【PIC24FJ64GA002】12bitAD2chコンバータLTC1298を使ってみる。

◆秋月電商で買った12bitAD2chLTC1298をPIC24FJ64GA002で動かしてみました。



1)4線式ソフトウエア制御(SPI風)
CE、Din、Dout、CLKの4線式となります。
データシートのPage11を参照にしました。
クロックはStart,SGL,ODD,MSBF,NULL,12bitADの17bitパタパタする必要があります。

2)仕様設定の表
AD変換の仕様はDinで設定することが可能です。






各BITSGL/DIFFODD/SIGNMSBF結果
内容入力チャンネル設定B11→B0/B0→B11---
設定例111CH1/B11→B0

SGL/DIFF、ODD/SIGN、MSBFを全部"1"にすると「CH1」で「B11→B0」となります。
Startも"1"だし、データ出力時はDon'tCareなのでずーっと'1'は都合がいいです。
3)CE、Din、Dout、CLKの波形
3603f4e0.png

4)プログラムの例
プログラムの例はこちら
float LTC1298_CALL(void)
{
unsigned short int ad_data; //AD変換
ad_data = 0; //クリア
LTC_HIZ_OUT = 1; //入力
LTC1298_CE = 0; //START
delay_us(1);
//== START_BIT ========================
LTC1298_IN = 1; //START_BIT
LTC1298_CLK = 0; //極切り替え
delay_us(1);
LTC1298_CLK = 1;
delay_us(1);
//== SGL_DIFF =========================
LTC1298_IN = 1; //SINGLE
LTC1298_CLK = 0; //極切り替え
delay_us(1);
LTC1298_CLK = 1;
delay_us(1);
//== ODD_SIGN ========================
LTC1298_IN = 1; //CH1
LTC1298_CLK = 0; //極切り替え
delay_us(1);
LTC1298_CLK = 1;
delay_us(1);
//== MSBF ============================
LTC1298_IN = 1; //B11→B0
LTC1298_CLK = 0; //極切り替え
delay_us(1);
LTC1298_CLK = 1;
delay_us(1);
//== NULL_BIT ========================
LTC1298_CLK = 0; //極切り替え
delay_us(1);
LTC1298_CLK = 1;
delay_us(1);
//== 12BIT ===========================
char i; //charで十分
LTC_HIZ_OUT = 1; //入力
for(i=0; i<12; i++)
{
//== クロック =======================
LTC1298_CLK = 0; //極切り替え
delay_us(1);
LTC1298_CLK = 1;
delay_us(1);
//== Dout_check ==================
ad_data <<= 1; //シフト
if(LTC1298_OUT == 1)
{ad_data+=1;} //'1'set
else{} //none
}//for(i=0; i<12; i++)
LTC1298_CE = 1; //END
delay_us(1);
LTC_HIZ_OUT = 0; //出力
return(ad_data); //戻り値
}//float LTC1298_CALL(void)

間違ってたらゴメンね!
5)回路図はこちら
178e7714.png

ギャラリー
  • 【PIC24F08KL200】PIC24F08KL200でsprintfを使う
  • 【PIC24F08KL200】PIC24F08KL200でsprintfを使う
  • 【PIC24F08KL200】PIC24F08KL200でsprintfを使う
  • 【PIC24F08KL200】PIC24F08KL200でsprintfを使う
  • 【PIC24F08KL200】PIC24F08KL200でsprintfを使う
  • 【PIC24F04KA200】PIC24F04KA200ではsprintfが使えない件
  • 【PIC24F04KA200】PIC24F04KA200ではsprintfが使えない件
  • 【PIC24F04KA200】PIC24F04KA200ではsprintfが使えない件
  • 【PIC24F04KA200】PIC24F04KA200ではsprintfが使えない件
メッセージはこちちらからお願いします。

名前
メール
本文
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

ブログパーツ
  • SEOブログパーツ
にほんブログ村 その他趣味ブログ 電子工作へ
にほんブログ村
アクセスカウンタ
アクセスランキング