PICマイコンの使い方

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

PIC24FJ64GA002

【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

【PIC24FJ64GA002】NOKIA3300-LCDモジュールを使ってみる。


◆aitendoで買ったNokia3300-LCDをPIC24FJ64GA002で動かしてみました。昇圧回路のパーツが付属されていなかったので10pinには9Vを加えました。



1)9BITソフトSPI
 データシートP14を参考にしました。
 9bitシリアルインターフェースは
 CE、SDA、SCLの3線式となります。
 ポートが無いD/Cはデータの前に付け加えるといった仕様です。
 なので9回パタパタさせればOKです。
 コマンド送信のソフトSPIを記載します。
  Nokia3300_CE = 0;
  asm("nop");
  Nokia3300_SDI = 0;//command_mode
  Nokia3300_SCL = 0;//pata
  asm("nop");//←実際は必要なかった。
  Nokia3300_SCL = 1;//pata
  asm("nop");
  char i;
  for(i=0; i<8; i++)
   {
   SRbits.C = 0;//キャリアクリア
   data = data << 1;//MSB取り出し×8回
   if(SRbits.C ==0 )
    {Nokia3300_SDI = 0;}//if(SRbits.C ==0 )
   else{Nokia3300_SDI = 1;}//else(SRbits.C ==0 )
   Nokia3300_SCL = 0;
   asm("nop");
   Nokia3300_SCL = 1;
   asm("nop");
   }//for(i=0; i<8; i++)
   Nokia3300_CE = 1;
   asm("nop");
 (dataはunsigned charです。)
2)LCD初期化
 色々な方のプログラムを参考に8bitmodeで組みましたが
 何度送信しても赤と青が逆転してしまいました。
 こちらはRRRGGGBBで送ってるのに受けてはBBGGGRRRってなってるぽいです。
 適切かどうかはわかりませんが対策として・・・
 コマンドDATCTLのParameter2を"1"に変更しました。。。よくわかんないけど辻褄が合いました。
カメラモジュールOV7670と接続したいです。
間違ってたらゴメンね!
↓回路図はこちら
4d51542c.jpg



【PIC24FJ64GA002】I2C低電圧キャラクタ液晶モジュールを使ってみる。(ストロベリーリナックスのLCD)





■ストロベリーリナックスのI2CLCDをPIC24FJ64GA002で動かしてみました。
1)I2Cのハードウエア制御の設定
 データシートのpage146を参照に・・・
 I2C1CONの15ビット目のI2CENを'1'にするとI2CがENABLEになります。
 I2C1CONbits.I2CEN = 1;
 I2C1STATはステータスレジスタです。
2)ボーレートの設定
 データシートのpage145のEQUATION15-1を参照に・・・
 I2CxBRG={FCY/FSCL-FCY/107}-1
 FOSC=32MHzで設定したとすると・・・
 ⇒FCY=FOSC/2=16MHzとなります。
 FSCL=100kHzで使いたいとすると・・・
 ⇒I2C1BRG = 157.4 四捨五入して↓
 ⇒⇒I2C1BRG = 157;
 データシートのpage145-TABLE15-1の値と同じになりました。
3)LCDの初期化
 LCDコントローラ【ST7032i】のデータシートpage34を参照に・・・
 コントラストとFollowerを少しいじりました。
 コントラストは上位2bit(C5、C4)だけPower/ICONと同じ場所です。







レジスタDB7DB6DB5DB4DB3DB2DB1DB0設定値
ContrastSet0111C3C2C1C001111111
Power/contrast0101IONBONC5C401011111
FollowerControl0110FONR2R1R001101010

 (ド嵌りしましたが)LCDのアドレスは7bitで'0111110'と書かれているので⇒'3E'としてしまいそうになりますが、
 さらにLSB「write=0」を付け加える必要があるので⇒'01111100’⇒'7C'です。
4)プログラム
 Microchip_PIC24F_Peripheral_Library.chmを参照にすればプログラムは構築出来ます。
 でもi2c.hを使うとすべて「xxx();」で出来てしまうので↑資料(英文)を読みながら自分なりにトライしました。
 ■「StartI2C1();」⇒「I2C1CONbits.SEN = 1;」
 ■「IdleI2C1();」⇒I2C1CONのStartConditionEnableBIT=SEN、StopCondetionEnableBIT=PEN、ReceiveEnableBIT=RCEN、AcknowledgeSequenceEnable=ACKEN、I2C1STATのTransmitStatusBIT=TRSTAT、計5bitのクリア待ちなようです。
 while(I2C1CONbits.SEN || I2C1CONbits.PEN || I2C1CONbits.RCEN || I2C1CONbits.ACKEN || I2C1STATbits.TRSTAT);
 ■「StopI2C1();」⇒「I2C1CONbits.PEN = 1;」
間違ってたらゴメンね
↓回路図はこちら
fce82c00.jpg




【PIC24F64GA002】OV7670カメラモジュールを使ってみる。2:基板作ってみました。





■その2:基板を作ってみました。
上の写真はカメラ部で撮影をします。
下の写真は表示部でカメラ撮影された映像をOLEDに出力します。
電源は、単四×2本で駆動しています。回路図はこちらになります。
OLEDが96×64と極小なので次回はもう少し大きいLCDでトライします。
またカメラもOV7690で挑戦したいです




ギャラリー
  • 【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ブログパーツ
にほんブログ村 その他趣味ブログ 電子工作へ
にほんブログ村
アクセスカウンタ
アクセスランキング