picマイコンの使い方

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

PMP

【dsPIC33FJ128MC802】aitendoの1.44インチ液晶TFT(ZY-FGD)をPMP接続で使ってみる!


◆dsPIC33FJ128MC802でaitendoの1.44インチTFT液晶ZY-FGD1442701V1-PCBを使ってみます。
液晶はaitendoで購入できます。
PMP接続自体はスピードアップにはつながりませんが後のDMA転送時に便利です。



1)参考
以前の作成した記事PMPを使ってみる。秋月LCD-SD1602と接続。をちょっと変更するだけでできます。

2)PMPの設定
PICでLCDコントローラの例
「書き込みenable」がないのでPMENBとの接続は必要ありません。

1.パラレルポートモード選択をマスタモード1設定
①「PMMODEbits.MODE = 0b11」にする。

2.読み/書きイネーブルPTRDENを有効にする。
 ①「PMCONbits.PTRDEN = 1」にして
 ②「PMCONbits.RDSP = 1」します。
 ③pin24がPMRD/PMWRになります。

 ④LCDのRWと接続します。
 ⑤ただし読み込みRDは使わないので未接続です。

書き込みのとき・・・
①PMADDRbits.ADDR0をセットします。
②PMDIN1にデータを入れる。
③勝手にWRはパタパタします。
④ADDR0を固定すれば連続書き込みが可能!!

読み込みのとき・・・
①PMADDRbits.ADDR0をリセットします。
②PMDIN1から読み出します。
③今回は使いません。

PMP設定のプログラム

//== PMP_Initialize ===================================================
PMMODE = 0x0000;
PMMODEbits.MODE = 0b11; //<9:8>MastarMode_1
PMCON = 0x0000;
//== port_select ====
//== R/W:PMRD/PMWR ==
PMCONbits.PTRDEN = 1; //<8>PMRD/PMWR_enable
PMCONbits.RDSP = 1; //<0>PMRD/PMWR
//== E:PMENB ========
//PMCONbits.PTWREN = 1; //<9>PMWR/PMENB_enable
//PMCONbits.WRSP = 1; //<1>PMENB
//== CD:PMA0 ========
PMAENbits.PTEN0 = 1; //<0>PMA0_enable
PMCONbits.PMPEN = 1; //<15>PMP_enable







3)メインのプログラム

LCDの初期化等は省きます。

ブルーバック後、任意の個所に赤ラインを描画します。

256byte連続で書き込みます。

    unsigned char *st_pointer;      //line_pointer
unsigned char st_box[256]; //line_data

void zy_write(unsigned flag, unsigned char data); //(flag:0:command/1:data)
void zy_full_set(unsigned char h_byte, unsigned char l_byte);
void zy_line(unsigned char *byte); //line_out

st_pointer = &st_box[0]; //first_byte_set
zy_full_set(0x00,0x1f); //blueback
//== while文 ===========================================================
while(1)
{
zy_line(st_pointer); //line_out
}//while(1)

//== set ===================================================
unsigned char st_box[256] =
{
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,0xf8,0x00,
0xf8,0x00,0xf8,0x00,0xf8,0x00
};
//==========================================================

//== zy_fgd Write 0:cmd/1:data ====================================================
void zy_write(unsigned flag, unsigned char data)
{
//zy_cs = 0;
//command_mode
if(flag == 0)
{PMADDRbits.ADDR0 = 0;} //command_mode/cd_low
//data_mode
else{PMADDRbits.ADDR0 = 1;} //data_mode
//PMP
while(PMMODEbits.BUSY == 1); //PMP_OK?
PMDIN1 = data;
}//void zy_write(unsigned flag, unsigned char data)
//== zy_fgd_full_set ============================================
void zy_full_set(unsigned char h_byte, unsigned char l_byte)
{
unsigned int i;
for(i=0; i<16384; i++)
{
zy_write(1,h_byte);
zy_write(1,l_byte);
}
}//void zy_full_set(unsigned char h_byte, unsigned char l_byte);
//=================================================================================

void zy_line(unsigned char *byte)
{
zy_write(0,0x2a); //x_address
zy_write(1,0x00); //start
zy_write(1,0x02);
zy_write(1,0x00); //end
zy_write(1,0x81);
zy_write(0,0x2b); //y_address
zy_write(1,0x00); //start
zy_write(1,0x04);
zy_write(1,0x00); //end
zy_write(1,0x04);
zy_write(0,0x2c); //memory_write
//check_pin
LATAbits.LATA0 = !LATAbits.LATA0;
PMADDRbits.ADDR0 = 1; //data_mode_set
unsigned char count;
for(count=0; count<256; count++)
{
PMDIN1 = *(byte+count); //auto_increment
//byte++;
}//for(count=0; count<128; count++)+
//check_pin
LATAbits.LATA0 = !LATAbits.LATA0;
}//void zy_line()
//======================================================================







4)波形の確認

黄色がWRの挙動です。ピンクはRA1に接続してます。1ライン転送毎に切り替えてます。

1ライン描画するのに84μsecかかりました。

2437654c.png








5)実行の様子
aitendoの1.44インチ液晶TFT(ZY-FGD)PMP接続1ライン出力

6)動画をとってみました。
SDカードから連続的にBMPデータを書き込み続けてみました。

ちなみにDMA転送だと超早いです。

7)回路図
28b9ed33.png


次回はPMPのDMA転送です。転送スピードが3倍程度速くなります!

【dsPIC33FJ128MC802】PMPを使ってみる。秋月LCD-SD1602と接続。


◆dsPIC33FJ128MC802で秋月LCDキャラクタモジュールをPMPで使ってみます。



1)あらすじ
前回の記事
前回の記事ではポート制御でLCDを動かしました。

2)接続















LCD_SD1602dsPICmemo
4_RSPMA0_RA3Command/Data
5_R/WPMRD/PMWR_RB13Read/Write
6_ERB14_PMENBENABLE
7_DB0RB12DATAbit0
8_DB1RB11DATAbit1
9_DB2RB10DATAbit2
10_DB3RB9DATAbit3
11_DB4RB8DATAbit4
12_DB5RB7DATAbit5
13_DB6RB6DATAbit6
14_DB7RB5DATAbit7

前回とは様変わりです。

3)イニシャライズと設定
リファレンスマニュアル:DS70299Cを参考にしましたが情報が少なすぎです。
DS70299C
接続方法とレジスタ設定がちょとしか書いてない・・・
R/Wの接続方法がわかんなすぎです。
めげずにレジスタ設定でHighになってるBITの説明を何度も読み返すことで理解できました!
やってることとしては。。。

1.パラレルポートモード選択をマスタモード1設定
①「PMMODEbits.MODE = 0b11」にする。

2.読み/書きイネーブルPTRDENを有効にする。
 ①「PMCONbits.PTRDEN = 1」にして
 ②「PMCONbits.RDSP = 1」します。
 ③pin24がPMRD/PMWRになります。

 ④LCDのR/Wと接続します。

3.書き込みイネーブルPMENBを有効にする。
 ①「PMCONbits.PTWREN = 1」にして
 ②「PMCONbits.WRSP = 1」します。
 ③pin25のPMWRがPMENBになります。
 ④LCDのEと接続します。

4.コマンド/データ制御PTEN0を有効にする。
 ①「PMAENbits.PTEN0 = 1」にします。
 ②pin10のPMA0が有効になります。
 ③LCDのRSと接続します。


書き込みのとき・・・
①PMADDRbits.ADDR0をセットします。
②PMDIN1にデータを入れる。

読み込みのとき・・・
①PMADDRbits.ADDR0をリセットします。
②PMDIN1から読み出します。

4)ソース
PIC24Fのペリフェラルライブラリーのソースを参照に流れをつかみました。

//=========================================================
// TEST
//=========================================================
//== ヘッダファイル ============================================
#include <p33fj128mc802.h>
#include <stdio.h>

//== define =============================================================

//== configuration ======================================================
_FBS(BSS_NO_FLASH //No Boot program Flash segment
& BWRP_WRPROTECT_OFF); //Boot Segment may be written
_FGS(GSS_OFF //User program memory is not code-protected
& GWRP_OFF); //User program memory is not write-protected
_FOSCSEL(FNOSC_FRCPLL //Internal Fast RC (FRC) w/ PLL
& IESO_OFF); //Start-up device with user-selected oscillator source
_FOSC(FCKSM_CSDCMD //Both Clock Switching and Fail-Safe Clock Monitor are disabled
& IOL1WAY_ON // Allow Only One Re-configuration
& OSCIOFNC_ON //OSC2 pin has digital I/O function
& POSCMD_NONE); //Primary Oscillator Disabled
_FWDT(FWDTEN_OFF); //Watchdog timer enabled/disabled by user software
_FPOR(FPWRT_PWR128 //PowerOnReset_128ms
& ALTI2C_OFF); //I2C mapped to SDA1/SCL1 pins
_FICD(JTAGEN_OFF //JTAG is Disabled
& ICS_PGD1); //Communicate on PGC1/EMUC1 and PGD1/EMUD1
//== interrupt_function_prototype ================================================
void __attribute__((interrupt,no_auto_psv)) _U1RXInterrupt(void); //UART_RX_Interrupt
void __attribute__((interrupt,auto_psv)) _DMA0Interrupt(void); //DMA0_Interrupt
//== DMA_UART ====================================================================
unsigned int rex_buf[10]__attribute__((space(dma))); //10byte
//== UART ========================================================================
//== SD1602LCD用プロトタイプ =========================================================
void sd1602_init(void); //sd1602初期化
void sd1602_cmd_write(unsigned char data); //sd1602コマンド書き込み
void sd1602_data_write(unsigned char data); //sd1602データ書き込み
//== sd1602文字列書き込み(配列 + 行目 + 出力数) =======================================
void sd1602_string_write(char *data, char line, unsigned char count);

//== MyTimer =====================================================================
void delay_us(unsigned int usec); //Timer1を利用したusec関数
void delay_ms(unsigned int msec); //msec関数
//== StringBox ===================================================================
char test_box[10] = "test_mode";
//== original_struct ======================================================
struct{
unsigned pwm_out : 1;
unsigned fan : 1;
unsigned lamp : 1;
}st_flag;
//== main ==================================================================
int main(void)
{
//== クロックの設定 ======================================================
//== Fcy=Fosc/2=7.37M*((PLLFBD+2)/(N2*N1))/2=39.61MHz ================
PLLFBDbits.PLLDIV = 41; //M=PLLFBD+2
CLKDIVbits.PLLPOST = 0; //N2=2
CLKDIVbits.PLLPRE = 0; //N1=2
OSCTUN = 0; //TuneFRC:7.37MHz
RCONbits.SWDTEN = 0; //Disable Watch Dog
while(OSCCONbits.LOCK != 1); //wait for PLL Lock
//== AD切り替え ==========================================================
AD1PCFGL = 0xffff; //全digital
//=== TRISA ===========================================================
TRISA = 0x0000; //initial_
//== TRISB =============================================================
TRISB = 0x0000; //input:
//== i2c設定 ============================================================
//== TIMER1設定 =========================================================
T1CONbits.TON = 0; //<15>Timer1_OFF
T1CONbits.TSIDL = 1; //<13>アイドルモード:Sleep中は停止
T1CONbits.TGATE = 0; //<6>ゲート積算時間:OFF
T1CONbits.TCKPS = 0B00; //<5:4>_PS1:1
T1CONbits.TCS = 0; //<2>クロックソース:内部
IEC0bits.T1IE = 0; //割り込み拒否
IPC0bits.T1IP = 0; //優先レベル0
//== UART1設定 =========================================================
//== PMP_Initialize ===================================================
PMMODE = 0x0000;
PMMODEbits.MODE = 0b11; //<9:8>MastarMode_1
PMCON = 0x0000;
//== port_select ====
//== R/W:PMRD/PMWR ==
PMCONbits.PTRDEN = 1; //<8>PMRD/PMWR_enable
PMCONbits.RDSP = 1; //<0>PMRD/PMWR
//== E:PMENB ========
PMCONbits.PTWREN = 1; //<9>PMWR/PMENB_enable
PMCONbits.WRSP = 1; //<1>PMENB
//== RS:PMA0 ========
PMAENbits.PTEN0 = 1; //<0>PMA0_enable
//== wait ==
PMMODEbits.WAITE = 0B01; //
PMMODEbits.WAITM = 0B0010; //
PMMODEbits.WAITB = 0B01; //
//== CN_Initialize ===================================================
//== DMA_UART ========================================================
//== 前処理 ======================================================
//IPC2bits.U1RXIP = 6; //PriorityLevel_6
//IEC0bits.U1RXIE = 1; //UART_revInterrupt_enable
//DMA0CONbits.CHEN = 1; //DMA0_enable
//IEC0bits.DMA0IE = 1; //DMA0_interrupt_enable
//sb1602_init(); //LCD初期化
PMCONbits.PMPEN = 1; //<15>PMP_enable
sd1602_init(); //LCD初期化
sd1602_cmd_write(0x80);
//== while文 ===========================================================
while(1)
{
sd1602_string_write(test_box,2,9);
sd1602_string_write(test_box,1,9);
delay_ms(500);
}//while(1)
}//int main(void)


//== delay_us関数 =================================================================
void delay_us(unsigned int usec)
{
TMR1 = 0; //TMR1=0
T1CONbits.TON = 1; //Timer1_start
PR1 = 39; //PR1値:((目的値1usec)/(1サイクル:0.0025usec*PS)-1)=39
unsigned int i;
for(i=0; i<usec; i++)
{ //タイマーフラグ待ち
while(!IFS0bits.T1IF); //Timer1割り込みフラグチェック(IFS0bits.T1IF==0)
IFS0bits.T1IF = 0; //割り込みフラグ下ろす
}//for(i=0; i<usec; i++)
}//void delay_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
//== DMA0_Interrupt =========================================================================
//== SD1602 initialize ===================================================
void sd1602_init(void)
{
delay_ms(100); //100msec
sd1602_cmd_write(0x30); //Function_set
delay_ms(10); //4.1msec
sd1602_cmd_write(0x30); //Function_set
delay_ms(100); //100msec
sd1602_cmd_write(0x30); //Function_set
delay_ms(10);
sd1602_cmd_write(0x38); //N=1:2line
delay_ms(10);
sd1602_cmd_write(0x06); //EntryMode
delay_ms(1);
sd1602_cmd_write(0x01); //ClearDisplay
delay_ms(10);
sd1602_cmd_write(0x0c); //DisplayOn
delay_ms(1);
} //sd1602_init(void)
//== SD1602 Command Write ===================================================
void sd1602_cmd_write(unsigned char data)
{
unsigned char sute_yomi;
while(PMMODEbits.BUSY == 1);
PMADDRbits.ADDR0 = 0; //RS=0_command_mode
PMDIN1 = data; //data_out
//busy_check
TRISBbits.TRISB5 = 1; //PMD7_input
do{
while(PMMODEbits.BUSY == 1);
PMADDRbits.ADDR0 = 0; //RS=0_command_mode
sute_yomi = PMDIN1; //data_in
}while(PORTBbits.RB5 == 0); //PMD7_check
TRISBbits.TRISB5 = 0; //output
delay_us(40);
}//void sd1602_cmd_write(unsigned char data)
//== SD1602 Data_Write ====================================================
void sd1602_data_write(unsigned char data)
{
unsigned char sute_yomi;
while(PMMODEbits.BUSY == 1);
PMADDRbits.ADDR0 = 1; //RS=1_data_mode
PMDIN1 = data; //data_out
//busy_check
TRISBbits.TRISB5 = 1; //PMD7_input
do{
while(PMMODEbits.BUSY == 1);
PMADDRbits.ADDR0 = 0; //RS=0_command_mode
sute_yomi = PMDIN1; //data_in
}while(PORTBbits.RB5 == 0); //PMD7_check
TRISBbits.TRISB5 = 0; //output
delay_us(40);
}//void sd1602_data_write(unsigned char data)
//== SD1602 String_Write ====================================================
void sd1602_string_write(char *data, char line, unsigned char count)
{
if(line == 1) //1行目
{sd1602_cmd_write(0x80);}
else if(line == 2) //2行目
{sd1602_cmd_write(0xC0);}
unsigned int i;
for(i=0; i<count; i++)
{
sd1602_data_write(data[i]);
}//for(i=0; i<count; i++)
}//void sd1602_string_write(unsigned char *data, unsigned char count)
//========================================================================

//=================================================================================



5)回路図
PMP-LCD回路
ギャラリー
  • 【PIC32MZ2048ECH144-I/PH】PIC32MZ2048ECH144を買いました!
  • 【PIC32MX370F512H】タイマーを使ってみる。
  • 【dsPIC33FJ128MC802】PMP接続のDMA転送でaitendoの1.44インチ液晶TFT(ZY-FGD)を使ってみる。その3
  • 【dsPIC33FJ128MC802】PMP接続のDMA転送(連続転送)でaitendoの液晶を使ってみる。
  • 【dsPIC33FJ128MC802】PMP接続のDMA転送(連続転送)でaitendoの液晶を使ってみる。
  • 【dsPIC33FJ128MC802】PMP接続のDMA転送(連続転送)でaitendoの液晶を使ってみる。
  • 【dsPIC33FJ128MC802】PMP接続のDMA転送(連続転送)でaitendoの液晶を使ってみる。
  • 【dsPIC33FJ128MC802】aitendoの1.44インチ液晶TFT(ZY-FGD)をPMP接続で使ってみる!
  • 【dsPIC33FJ128MC802】aitendoの1.44インチ液晶TFT(ZY-FGD)をPMP接続で使ってみる!
メッセージはこちちらからお願いします。

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

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