picマイコンの使い方

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

周辺機能

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

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

動画はこちらから


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



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


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


1)参照
リファレンスマニュアルDS61105F_JPを参照しました。
設定は16bitPICとほとんど変わりありません。
以前作成した記事

【dsPIC33FJ128MC802】タイマー機能を使ってみる。
をそのまま流用しました。

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


3)T1CONレジスタ

ほとんどのbitは「0」でOKです。

①TimerONbitの設定:タイマ有効

「T1CONbits.ON = 1」

1でタイマが有効となります。

②TCKPSbitの設定:タイマ入力クロックのプリスケール

「 T1CONbits.TCKPS = 0b00;」

00は「1:1」となります。





4)プログラム

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 ==============================================================







5)出力波形の確認

PIC32MX370F512Hでタイマ


ピンク色の波形が出力波形です。

ちゃんと10msec毎に出力が切り替わってます。

一応成功みたい。








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

◆dsPIC33FJ128MC802でaitendoの1.44インチTFT液晶ZY-FGD1442701V1-PCBをPMP接続でDMA転送してみます。
①gifをgomplayerで画像ファイルを抜き取り
②gimpで16bitBMPに変換
③VC++で作ったアプリケーションでBMPファイルを都合のいいように編集
④BMPヘッダをカットしてリトルエディアンをビッグエディアンに変更する。
⑤SDカードに保存しPICからMicroChipのFATシステムAN1045を使ってDMAのメモリ一杯分の1024byteをread
⑥そのまんまPMPのDMA転送する。(4行分)
だいたい12fpsぐらいでした。
動画1

動画2


動画3


動画4


スパゲティー状態:
1.44インチTFT液晶ZY-FGD1442701V1-PCB

【dsPIC33FJ128MC802】PMP接続のDMA転送(連続転送)でaitendoの液晶を使ってみる。


◆dsPIC33FJ128MC802でaitendoの1.44インチTFT液晶ZY-FGD1442701V1-PCBをPMP接続でDMA転送してみます。



1)参考
パクる気満々で色々ググってもPICマイコンでPMPのDMA転送をやられている方がいらっしゃらないようで・・・
挙句には自分のサイトが出てきてしまいました。これはチャレンジするしかない!
以前の作成した記事PMPのDMA転送をつかってみる。aitendoの1.44インチ液晶TFT(ZY-FGD)をPMP接続で使ってみる!を組み合わせてちょっと変えれば出来ます。その他マイクロチップ社のリファレンスマニュアルを参考にしました。
2)PMPの設定
PMPのリファレンスDS70299のP28の35-5にDMAサポートの記載がちょろっとあります。
PMP_DMAのサポート
①「PMMODEbits.IRQM = 0b01」にする。
重要:PMP書き込み後に割り込み発生をかけます。
実際にはこの機能を利用して割り込みフラグをチェックしてDMA転送完了を知ります。
ほかの機能は前回と同様なので省きます。
3)DMAの設定(チャンネル0を使用する。)
 ①「DMA0CONbits.SIZE = 1」
byte転送にします。(0でword転送)
 ②「DMA0CONbits.DIR = 0」
転送方向をRAM→peripheralにします。
 ③「DMA0CONbits.HALF = 0」
フルブロック転送したら割り込みにします。
 ④「DMA0CONbits.MODE = 0b01」
転送はワンショットモード。
 ⑤「DMA0CNT = 255」
転送したbyte数を入れます。ただし「0」は「1byte」なのでn-1で設定します。
最大で9bit=1024byte設定可能です。
 ⑥「unsigned int tex_buf[256]__attribute__((space(dma)));」
転送バッファーを用意します。サイズはunsigned int型です。DS70215のpage18を参照。
 ⑦「DMA0PAD = (volatile unsigned int)&PMDIN1;」
peripheralAddressを指示します。
 ⑧「DMA0STA = __builtin_dmaoffset(tex_buf);」
DMA転送開始Addressを指示します。

DMA転送ルーチン
①PMADDRbits.ADDR0をセットします。
②tex_buf[]にデータを入れる。
③DMA0CONbits.CHENをセットしDMA0をENABLEにします。
④DMA0REQbits.FORCEをセットし強制転送を開始します。
⑤勝手にWRはパタパタします。
⑥ADDR0を固定すれば連続書き込みが可能!!
⑦CPUを介さないDMA転送といえど書き込み完了を待つ必要があります。
超重要:IFS0bits.DMA0IFをチェックして転送が完了したか否かを判断します。
これがわからずに1日費やしてしまいました。

PMPのDMA設定プログラム

//== DMA_PMP ========================================================
DMA0CON = 0x0000; //clear
DMA0CONbits.SIZE = 1; //<14>byte_send
DMA0CONbits.DIR = 1; //<13>write_mode
DMA0CONbits.HALF = 0; //<12>full_block
DMA0CONbits.MODE = 0b01; //<1-0>one_shot
DMA0CNT = 255; //block_size_254byte
DMA0REQbits.IRQSEL = 0b0101101; //PMP_peripheral
DMA0PAD = (volatile unsigned int)&PMDIN1; //peripheral_address
DMA0STA = __builtin_dmaoffset(tex_buf); //DMA_start_address
DMA0CONbits.CHEN = 0; //dma_disable







4)メインのプログラム

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

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

LCDに256byte連続でDMA転送してます。

//== interrupt_function_prototype ================================================
void __attribute__((interrupt,auto_psv)) _DMA0Interrupt(void); //DMA0_Interrupt
//== DMA_PMP ====================================================================
unsigned int tex_buf[256]__attribute__((space(dma))); //dma_buffer
unsigned char *st_pointer; //line_pointer
unsigned char st_box[256]; //line_data
//== 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:
//== PMP_Initialize ===================================================
PMMODE = 0x0000;
PMMODEbits.MODE = 0b11; //<9-8>MastarMode_1
PMMODEbits.IRQM = 0b01; //<15-14>dma_interrupt_request
PMCON = 0x0000;
//== port_select ====
//== R/W:PMRD/PMWR ==
PMCONbits.PTRDEN = 1; //<8>PMRD/PMWR_enable
PMCONbits.RDSP = 1; //<0>PMRD/PMWR
//== RS:PMA0 ========
PMAENbits.PTEN0 = 1; //<0>PMA0_enable
//== CN_Initialize ===================================================
//== DMA_PMP ========================================================
DMA0CON = 0x0000; //clear
DMA0CONbits.SIZE = 1; //<14>byte_send
DMA0CONbits.DIR = 1; //<13>write_mode
DMA0CONbits.HALF = 0; //<12>full_block
DMA0CONbits.MODE = 0b01; //<1-0>one_shot
DMA0CNT = 255; //block_size_254byte
DMA0REQbits.IRQSEL = 0b0101101; //PMP_peripheral
DMA0PAD = (volatile unsigned int)&PMDIN1; //peripheral_address
DMA0STA = __builtin_dmaoffset(tex_buf); //DMA_start_address
//== 前処理 =====================================================
PMCONbits.PMPEN = 1; //<15>PMP_enable
DMA0CONbits.CHEN = 0; //dma_disable
zy_init(); //sb1602_init()
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)
}//int main(void)
//== 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
};
//==========================================================
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,0x0f);
zy_write(1,0x00); //end
zy_write(1,0x0f);
zy_write(0,0x2c); //memory_write
//check_pin
LATAbits.LATA0 = !LATAbits.LATA0;
//array_copy
memcpy(tex_buf,byte,sizeof(tex_buf));
//pmp+dma_sending
PMADDRbits.ADDR0 = 1; //write_mode
IFS0bits.DMA0IF = 0; //flag_off
//force_dma_one_times
DMA0CONbits.CHEN = 1; //DMA0_enable
DMA0REQbits.FORCE = 1; //One_times
//dma_sending_wait
while(IFS0bits.DMA0IF == 0); //send_wait
//check_pin
LATAbits.LATA0 = !LATAbits.LATA0;
}//void zy_line()
//======================================================================
//== zy_fgd Write 0:cmd/1:data ====================================================
void zy_write(unsigned flag, unsigned char data)
{
//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)







5)波形の確認
黄色がWRの挙動です。ピンクはRA1に接続してます。1ライン転送毎に切り替えてます。
1ライン分256byteDMA転送するのに19.34μsecかかり、(1byte転送は大体50nsecでした。)
DMA転送バッファーにコピーするのに13.12μsecかかりました。
TOTALで32.84μsecかかりました。PMP接続と比較すると2.5倍速くなりました。
1f3858c2.png

6)実行の様子(PMP接続の時と変わりません。)
aitendoの1.44インチ液晶TFT(ZY-FGD)PMP接続DMA転送1ライン出力

7)回路図(PMP接続の時と変わりません。)
28b9ed33.png


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