上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--.--.-- -- l スポンサー広告 l top
100円ショップでちょうど良い大きさのケースを見つけたので、LCD付きichigojamをそれに格納しました。
ちょうど良いケースとは以下の物です。100円トランプです。


これがこのために有ったのではないか、という位ぴったりでした。とりあえず加工前に中に入れてみたところです。

ぴったりでしょ? 今回ARDUINO用LCDシールドを使っているので、多分ARDUINO系工作のケースにも使えると思います。

「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">





穴開け加工して、本体、ジョイスティック、トリガスイッチを付けたところです。トリガスイッチは分かりにくいですが、この写真では上蓋の方に、下ケースとのつなぎ目あたりに有ります。右手親指がジョイスティック、人差し指がトリガスイッチで使う想定の位置です。

今回トリガスイッチ追加で回路もそこだけ変えましたので再アップします。IN1に繋いでいます。


最初はスケルトンのままにしようと思っていましたが、透けて見えるホットボンド固定が見苦しいので持っていた黒ラッカーで塗装しました。


一応完成したところ。私はこういう工作は得意ではないのでどうも塗りムラがありますね(^^;
なお、画面は以前作ったインベーダゲームをカラー対応したものです。ちゃんとジョイスティックとトリガスイッチで操作できていますよ。


とりあえずこれで予定していたキャプチャによるLCD表示、カラー化、グラフィック混載(セミだけど)までできたわけです。
コマンドシリアル通信は?とりあえずPCGによる埋め込み方式でそれなりに動いているので後回しとして。
次は何するか考え中。

スポンサーサイト
2015.05.31 Sun l ICHIGOJAM l コメント (0) l top
シリアル以外の入力がないとゲームもできませんのでジョイスティックを接続してみました。


繋いだのは秋月電子のアナログジョイスティック(なんと@100円!)です。

お安かったのでいつか繋ごうと思ってPIC32MXを買ったときについでに一緒に買ってありました。

回路図は以下の通りです。BTNとIN2がアナログ入力になっていますのでそこに繋ぎました。

「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">





ichigojamはこれでANA()命令を使うだけでアナログ値を読めるようになります。接続後に以下のような簡単なテストプログラムを書いてみたところ、即かつスムーズに動きました。さすがによくできていますね。

10:CLS
20 X=ANA()*32/1024:Y=ANA(2)*23/1024:LC X,Y:?"*";
30 WAIT10:LC X,Y:?" ";:GOTO 20


また、ゲーム的な表示をするとなると今のキャプチャ+LCD表示速度が気になりますので、それも早めました。方法は簡単で、NTSCのインタレースを同じようにLCD書き込みをフレームごとに奇数ライン、偶数ライン限定とします。

修正して以前作成した全方向スクロールデモを試したところ見ていて気にならない速度にはなりましたので採用としました。PIC32MXソースは今後もう少し直したいと思っていますので、後日アップいたします。


ところで、
ichigojamのFACEBOOKグループで「将来的にモニタにも出せますか?」というコメントが有りました。カラーLCDに出したかったのでそういう発想は持っていなかったのですが、それができるとichigojamはそのままで外付け回路でカラーを付加してTVに出せることになります。例えばpancake見たいなものにキャプチャ機能があるとichigojam出力とグラフィックの合成出力もできるようになりますね。

ちょっと考えてみたところ、
ハードは今の回路でLCDを外すとIOの空きができますので、そこにpancakeと同様な色信号とSYNCを出すようにして、抵抗回路でNTSCにすればできます。LCDに合わせる必要がなくなるので、キーボードやBNCコネクタの接続なんかを考えるとichigojam基板にPICマイコン(PIC以外でも良いですが)をくっつけるのが楽にできそうと思います。

ソフトの方ですが、SYNCタイミングはichigojamが作っているのでそれをそのままスルーで出すようにして、ichigojamからのデータを取り込みながら座標を見てRBG3ニットに変換して出していけばよさそうです。
アルゴリズムは今のLCD用よりむしろ簡単かもしれませんが、性能はもっと必要になります。

今のソフトは1フレーム分を一気に取り込んで、そのあとLCDに書きだしますのである意味時間制約が緩いです。少々遅くても表示が遅くなるだけ、だからC言語でなんとかできています。
NTSCとしてモニタに出すにはデータ取り込みと同時出力となるのでC言語ではまず無理。ただしアセンブラならいけるだろうと考えています。

やってみようかな、と思いつつ本家のpancakeがそういう風になっていきそうな気もしますので、思案中です。
。。。本音はアセンブラコーディングが億劫というのが大きいです(^^;

それではまたです。
 

2015.05.31 Sun l ICHIGOJAM l コメント (0) l top
PIC32MXでキャプチャしたフレームデータにアトリビュート(属性)を付加することでカラー、ブリンク、アンダーライン表示ができるようにしました。



アトリビュートはキャラクタサイズ8x8ではなく、4x4ドットごとに指定できるようになっていますので、セミグラフィックキャラクタを使った場合に各ドットの色を変えることが可能です。

動作は動画をご覧ください。

 

「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">



アトリビュートの指定は当然ichigojamから行うわけで、シリアル通信で行う予定ですが、ちょっと思いついた方法が有って、先にそれを試しています。「PCG機能を使ってichigojamの表示データの中にアトリビュート指定コマンドを埋め込んでしまう。」という方法です。ちょっと気に入っているので解説図を用意しました。



この方式の利点は別系統の通信手段が要らないこと、欠点はichigojamからはPIC32MXがコマンドを受け付けたかどうかしる方法がないことです。そのため、コマンドを出してからPICが確実に受け付けるだけ待ち時間をWAITで入れており、その分遅くなっています。

今回のアトリビュート機能に対応したPICMX32ソースをアップします。

なおデバッグ用にPICMX32がichigojamとは独立して文字を表示できるようにフォントと各種表示ルーチンを追加しています。必要なフォントデータ(ヘッダファイル)もアップします。

以下はこの機能を使ったichigojamソフト例です。

10 CLS:POKE#91F,#FF:H=#55:M=#C0:X=0:Y=0:V=31:W=23:C=#07:GOSUB510:X=31:Y=0:V=31:W=0:C=#00:GOSUB510
20 LC5,5:?"ichigojam pocket";:X=5:Y=5:V=31:W=5:C=#01:GOSUB510
30 LC10,7:?"C O L O R";:Y=7:W=7:X=10:V=X:FORI=1TO5:C=I:GOSUB510:X=X+2:V=X:NEXT
40 FORI=0TO7:C=I:X=10+I:Y=9:V=X:W=Y:LCX,Y:?CHR$(1);:GOSUB510:NEXT
50 LC5,11:?"BLINK TEST1";:X=5:Y=11:V=22:W=Y:C=#0f:GOSUB510
70 LC5,14:?"BLINK TEST2";:X=5:Y=14:V=22:W=Y:C=#38:GOSUB510
80 LC5,16:?"UNDERLINE TEST1";:X=5:Y=16:V=22:W=Y:C=#87:GOSUB510
90 LC5,18:?"UNDERLINE TEST2";:X=5:Y=18:V=22:W=Y:C=#84:GOSUB510
100 FOR I=0TO7:FORJ=0TO7:X=J+24:Y=I+5:LCX,Y:?CHR$(I*8+J+#40);:C=I*16+J:V=X:W=Y:GOSUB510:NEXT:NEXT
110 FOR I=0TO7:FORJ=0TO7:X=J+24:Y=I+14:LCX,Y:?CHR$(I*8+J+#40);:C=I*16+J+8:V=X:W=Y:GOSUB510:NEXT:NEXT
120 WAIT300:LRUN2
499 GOTO 499
500 '**** attribute set *******
510 POKE#7F9,M,X,Y,V,W,C:POKE#7F8,H:H=#FF-H:WAIT5:RETURN


510行でコマンドをPCGに書いています。これが動画の最初の方のデモです。

次がセミグラフィックでの使用例。以前作ったセミグラフィックPSETルーチンと併用しています。

5 wait 100
10 CLS:POKE#91F,#FF:H=#55:M=#C0:X=0:Y=0:V=31:W=23:C=#07:GOSUB510:GOSUB510:X=31:Y=0:V=31:W=0:C=#00:GOSUB510
20 LC1,2:?"ichigojam pocket";:X=1:Y=2:V=31:W=5:C=#01:GOSUB510
50 LC1,4:?"COLOR GRAPHIC";:X=1:Y=4:V=22:W=Y:C=#0f:GOSUB510:M=#C1
60 FORI=1TO7
70 FORJ=ITO26-I:X=J+5:Y=I+10:GOSUB205:C=I:V=X:W=Y:GOSUB510:Y=36-I:GOSUB205:V=X:W=Y:GOSUB510:NEXT
80 FORJ=ITO26-I:X=I+5:Y=J+10:GOSUB205:C=I:V=X:W=Y:GOSUB510:X=31-I:GOSUB205:V=X:W=Y:GOSUB510:NEXT
100 NEXT
190 X=RND(20)+32:Y=RND(20)+14:C=RND(7)+1:GOSUB205:V=X:W=Y:GOSUB510:GOTO190
200 '=== PSET X,Y ===
205 Z=(X&1)+(Y&1)*2:W=X/2:V=Y/2:LC W,V:? CHR$(VPEEK(W,V)|(1<< Z)|#80):RETURN
500 '**** attribute set *******
510 POKE#7F9,M,X,Y,V,W,C:POKE#7F8,H:H=#FF-H:WAIT3:RETURN


動画見ると分かりますように、結構遅いです。そのうちまっとうにシリアル通信型に直せばもっと速くなると思います。
あとは入力がないので、ジョイスティックをつけるか、いや折角PICマイコンがあるのだからタッチパネルでも制御させるか、等々考え中です。

それではまたです。



 
2015.05.30 Sat l ICHIGOJAM l コメント (0) l top
キャプチャの方はなんとか取りこぼしなくできているようですが、LCDへの書き込みが遅くて表示がだらだらするのを改善しました。

改善方法は以下の通りです。

 ①PMP使用方法改善:データ・コマンドライトはPMPを使ってバイト書き込みしていたのですが、RS信号(データ・コマンド切り替え)をGPIOを使ってソフトで設定していました。RSをデータと同期するため折角のPMP内FIFOを無効にする使い方をしていました。RS信号をPMPのアドレスとして設定し、データと一緒にFIFOに格納されるようにしました。合わせてFIFOを有効にしました。

 ②上の同期のためデータライト後にFIFOが空になるのを待つWAITを入れていたのを外しました。

「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">



 ③LCDへの画面コピーでは毎ピクセルライトルーチンを呼んでいたのですが、画面コピーループ内にライトコードを入れました。これによりCALL/RETURNのオーバヘッドがなくなります。

 新しいソースをアップします

 この変更にともなって、回路も少し変りました。RS信号にRB5を使っていたのですが、PMPのアドレスに変えるため
 PMA01に変更としました。回路図の赤く囲んだところです。


 これだけだと少し寂しいので、キャラクタアトリビュート機能を実験してみました。


 PICのソフトでやっているのでこういうことは割と簡単にできるのですが、各キャラクタの色はまだ固定です。
 次はichigojamのBASICソフトからキャラクタの色を指定できるようにする予定です。
 そのためにはPIC32Xのシリアル受信機能を動かさないと。
 
 それではまたです。

2015.05.26 Tue l ICHIGOJAM l コメント (0) l top
PIC32MXによるIchigojam出力のキャプチャ&LCD表示回路とりあえず完成しました。

結構コンパクトにできたかと思います。電源はUSB供給、キーボードもつかないのでUSB-シリアルから操作します。

動きは動画をご覧ください。デモにイチゴジャムレシピの迷路をお借りしました。



回路図を少し変えたので最新版をアップします。変えたといっても圧電ブザーを付けた位ですが。


「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">



PIC32MXのソースもアップします。開発環境はMPLAB-Xです。これをコンパイルするときは必ずコンパイルオプションでOPTIMIZEをレベル1としてください。そうしないとキャプチャが全く間に合いません。

OPTIMIZEをデフォルト0でテストしていたときは、1ラインのキャプチャにIchigojamからの1ラインデータ時間の2倍以上かかっており、めげかけたのですが、OPTIMIZEしたところ3倍以上の速度となりなんとか事なきを得ました。
OPTIMIZE侮れません。
 
なおキャプチャ方式ですが、VSYNC/HSYNCを検出した後に普通にFOR文で272ピクセル分を回したところ、タイミングがうまいこととれず、結局マクロを組んで272ピクセルをLOOP無しで採りこむようにしています。また表示を見ながらタイミングを微調整しているのでNOPの嵐になっています。これで結構綺麗に表示できているので不思議なくらいです。
 
 いまのところ表示速度がかなり遅いです。キャプチャ1フレーム、LCDへの転送1フレームの繰り返しにしようとしているので、うまくできれば60fpsの半分30fpsになるはずですが、現状おそらく10fps位かと思います。LCDライトで手抜きをしているので、そこを速めれば20~30fpsにはなるかと思います。
 
 速度以外の改良として、ジョイスティック追加、文字のカラー化。折角のカラー液晶だしシリアル制御でアトリビュート設定する方向で考えています。
あとはPancake互換のグラフィックコマンド対応までできると、昔のマイコンのようなテキストとグラフィックの合成表示ができるはずです。実はこれが一番やりたくて今回の工作を始めました。

 中々休みが取れないので次はいつになるかわかりませんが。。。。

それではまたです。





2015.05.25 Mon l ICHIGOJAM l コメント (0) l top
なんとかLCD表示ができるようになりました。


最初バックライト表示だけで何もでてこなかったのであせりました。そこでAnalogDiscoveryのロジアナモードを初めて使ってみたところ、RS信号がWR中に切れていることが分かりました。

CSとWRはPMP制御ですがRSはIOポートとしてソフト制御でした。PMPにデータを書いてからRSを動かしていたのですが、それだとPMPのFIFOによるタイムラグで実際のライトが行われる前に切れてしまうのですね。PMPステータスをみてライトが完了してからRSを変えるようにしたら表示が出るようになりました。

折角使ってみたのでロジアナモード画面を。この波形はタイミング改善後です。




「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">


ソースは以下の通りです。
LCDの設定については同じLCDCを使っているAITENDOLCDのリンク先に有ります「松浦光洋さんの研究開発ページ」のカラ―バーコードを参考にさせていただきました。

/*
* File: main.c
*
* PIC32MX250F128B PMP TEST
* Created on 2015/05/23, 14:40
*/

#include
#include
#include

//********** CONFIG **********************

#pragma config PMDL1WAY = OFF
#pragma config IOL1WAY = OFF
#pragma config FUSBIDIO = OFF
#pragma config FVBUSONIO = OFF
#pragma config FPLLIDIV = DIV_1
#pragma config FPLLMUL = MUL_15
#pragma config FPLLODIV = DIV_1
#pragma config FNOSC = FRCPLL
#pragma config FSOSCEN = OFF
#pragma config IESO = OFF
#pragma config POSCMOD = OFF
#pragma config OSCIOFNC = OFF
#pragma config FPBDIV = DIV_1
#pragma config FCKSM = CSDCMD
#pragma config WDTPS = PS1
#pragma config WINDIS = OFF
#pragma config FWDTEN = OFF
#pragma config FWDTWINSZ = WINSZ_50
#pragma config DEBUG = OFF
#pragma config JTAGEN = OFF
#pragma config ICESEL = RESERVED
#pragma config PWP = OFF
#pragma config BWP = OFF
#pragma config CP = OFF

//************ PROTOTYPES ******************

void ILI9325_INDEX(unsigned short);
void ILI9325_SET(unsigned short, unsigned short);
void ILI9325_DATA_WRITE(unsigned short);
void ILI9325_Initial(void);
void delay_ms(int);
void ILI9325_SETPIXEL(short, short, short);
void ILI9325_BOXFILL(short, short,short, short, short);
void ILI9325_BOX(short, short,short, short, short);

//************ DEFINE ****************
#define LCD_RST LATBbits.LATB14
#define LCD_RS LATBbits.LATB5

//************ MAIN ******************

int main() {
int i,j;

ANSELB = 0;
TRISB = 0x0000000;
OSCCON = 0;

IEC1CLR = 0x0004; // Disable PMP interrupt
PMCON = 0x0780;// Configure the addressing and polarities?
PMMODE = 0x0251; // Configure the mode and timing
PMADDR = 0x4000; // CS1-2 ENABLE
PMAEN = 0x4000; // EnablChip Select lines
PMCON = 0x8780; // Stop PMP module and clear control register


ILI9325_Initial();

for (i=0;i<50;i++) {
ILI9325_BOXFILL(i,i,239-i,319-i,i*100) ;
}

ILI9325_BOXFILL(100,100,120,120,0xf800) ;
ILI9325_BOXFILL(120,120,140,140,0x07e0) ;
ILI9325_BOXFILL(140,140,160,160,0x001f) ;
while(1) {
}
}

//************* ROUTINES *********************

void ILI9325_BOXFILL(short x0, short y0,short x1, short y1, short rgb)
{
short x,y;
for (y=y0;y<=y1;y++){
ILI9325_SETPIXEL(x0,y,rgb);
for (x=x0+1;x<=x1;x++){
ILI9325_SETPIXEL(-1,0,rgb);
}
}
}
void ILI9325_BOX(short x0, short y0,short x1, short y1, short rgb)
{
short x,y;
ILI9325_SETPIXEL(x0,y0,rgb);
for (x=x0+1;x<=x1;x++){
ILI9325_SETPIXEL(-1,0,rgb);
}
ILI9325_SETPIXEL(x0,y1,rgb);
for (x=x0+1;x<=x1;x++){
ILI9325_SETPIXEL(-1,0,rgb);
}
for (y=y0;y<=y1;y++){
for (x=x0;x<=x1;x++){
ILI9325_SETPIXEL(x,y0,rgb);
ILI9325_SETPIXEL(x,y1,rgb);
}
}
}

void ILI9325_SETPIXEL(short x, short y, short rgb)
{
if (x>=0) {
ILI9325_SET(0x0020,x);
ILI9325_SET(0x0021,y);
ILI9325_INDEX(0x0022);
}
ILI9325_DATA_WRITE(rgb);
}

void ILI9325_INDEX(unsigned short index)
{
while((PMSTAT & 0x8000)!=0){};LCD_RS = 0;PMDIN = (unsigned char)(index >> 8);
while((PMSTAT & 0x8000)!=0){};PMDIN = (unsigned char)(index & 0x00ff);
}

void ILI9325_SET(unsigned short index, unsigned short data)
{
while((PMSTAT & 0x8000)!=0){};LCD_RS = 0;PMDIN = (unsigned char)(index >> 8);
while((PMSTAT & 0x8000)!=0){};PMDIN = (unsigned char)(index & 0x00ff);
while((PMSTAT & 0x8000)!=0){};LCD_RS = 1;PMDIN = (unsigned char)(data >> 8);
while((PMSTAT & 0x8000)!=0){};PMDIN = (unsigned char)(data & 0x00ff);
}

void ILI9325_DATA_WRITE(unsigned short data)
{
while((PMSTAT & 0x8000)!=0){};LCD_RS = 1;PMDIN = (unsigned char)(data >> 8);
while((PMSTAT & 0x8000)!=0){};PMDIN = (unsigned char)(data & 0x00ff);
}

void ILI9325_Initial(void)
{
LCD_RS = 1;
LCD_RST = 0; // **** LCD RESET **********
delay_ms(200);
LCD_RST = 1;

//******* SET REGISTERS **********
ILI9325_SET(0x0001,0x0100);
ILI9325_SET(0x0002,0x0700);
ILI9325_SET(0x0003,0x1030);
ILI9325_SET(0x0004,0x0000);
ILI9325_SET(0x0008,0x0207);
ILI9325_SET(0x0009,0x0000);
ILI9325_SET(0x000a,0x0000);
ILI9325_SET(0x000c,0x0000);
ILI9325_SET(0x000d,0x0000);
ILI9325_SET(0x000f,0x0000);

ILI9325_SET(0x0010,0x0000);
ILI9325_SET(0x0011,0x0000);
ILI9325_SET(0x0012,0x0000);
ILI9325_SET(0x0013,0x0000);
delay_ms(200);
ILI9325_SET(0x0010,0x1490);
ILI9325_SET(0x0011,0x0227);
delay_ms(200);
ILI9325_SET(0x0012,0x001a);
delay_ms(200);
ILI9325_SET(0x0013,0x1400);
ILI9325_SET(0x0029,0x0019);
ILI9325_SET(0x002b,0x000b);
delay_ms(200);
ILI9325_SET(0x0020,0x0000);
ILI9325_SET(0x0021,0x0000);
ILI9325_SET(0x0030,0x0000);
ILI9325_SET(0x0031,0x0607);
ILI9325_SET(0x0032,0x0305);
ILI9325_SET(0x0035,0x0000);
ILI9325_SET(0x0036,0x1604);
ILI9325_SET(0x0037,0x0204);
ILI9325_SET(0x0038,0x0001);
ILI9325_SET(0x0039,0x0707);
ILI9325_SET(0x003c,0x0000);
ILI9325_SET(0x003d,0x000f);
ILI9325_SET(0x0050,0x0000);
ILI9325_SET(0x0051,0x00ef);
ILI9325_SET(0x0052,0x0000);
ILI9325_SET(0x0053,0x013f);
ILI9325_SET(0x0060,0xa700);
ILI9325_SET(0x0061,0x0001);
ILI9325_SET(0x006a,0x0000);
ILI9325_SET(0x0080,0x0000);
ILI9325_SET(0x0081,0x0000);
ILI9325_SET(0x0082,0x0000);
ILI9325_SET(0x0083,0x0000);
ILI9325_SET(0x0084,0x0000);
ILI9325_SET(0x0085,0x0000);
ILI9325_SET(0x0090,0x0010);
ILI9325_SET(0x0092,0x0600);
ILI9325_SET(0x0093,0x0003);
ILI9325_SET(0x0095,0x0110);
ILI9325_SET(0x0097,0x0000);
ILI9325_SET(0x0098,0x0000);
ILI9325_SET(0x0007,0x0133);
}

void delay_ms(int tim)
{
int t,t1;
for (t=0;t for (t1=0;t1<5000;t1++) {
}
}
}


次はいよいよichigojam出力のキャプチャーにいってみます。

2015.05.24 Sun l ICHIGOJAM l コメント (0) l top
PIC32MX250F128BでPMP(パラレルマスターポート)の動作ができました。
8ビットバスでスレーブデバイス(今回はカラーLCD)を読み書きする機能で、今回LCD制御に使用します。

こんな感じで調整中。LCDはまだ取り付けていません。


PMPのレジスタ設定でLCDコントローラのデータシートにあるタイミングに合わせます。
WRサイクルMIN100ns、WRパルスMIN50nsです。0WAITではぎりぎりでしたので、PMMODEレジスタのタイミング調整設定で少しWAITを入れました。


確認用プログラムは以下の通りです。今回初の32ビットPICでしたので立上難航するかと思いましたが、案外すんなりいきました。


「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">



/*
* File: main.c
*
* PIC32MX250F128B PMP TEST
* Created on 2015/05/23, 14:40
*/

#include
#include
#include

#pragma config PMDL1WAY = OFF
#pragma config IOL1WAY = OFF
#pragma config FUSBIDIO = OFF
#pragma config FVBUSONIO = OFF
#pragma config FPLLIDIV = DIV_1
#pragma config FPLLMUL = MUL_15
#pragma config FPLLODIV = DIV_1
#pragma config FNOSC = FRCPLL
#pragma config FSOSCEN = OFF
#pragma config IESO = OFF
#pragma config POSCMOD = OFF
#pragma config OSCIOFNC = OFF
#pragma config FPBDIV = DIV_1
#pragma config FCKSM = CSDCMD
#pragma config WDTPS = PS1
#pragma config WINDIS = OFF
#pragma config FWDTEN = OFF
#pragma config FWDTWINSZ = WINSZ_50
#pragma config DEBUG = OFF
#pragma config JTAGEN = OFF
#pragma config ICESEL = RESERVED
#pragma config PWP = OFF
#pragma config BWP = OFF
#pragma config CP = OFF

int main() {
int i,;

ANSELB = 0;
TRISB = 0x0000000;
OSCCON = 0;

IEC1CLR = 0x0004; // Disable PMP interrupt
PMCON = 0x0780;// Configure the addressing and polarities
PMMODE = 0x0251; // Configure the mode and timing
PMADDR = 0xC000; // CS1-2 ENABLE
PMAEN = 0xC000; // EnablChip Select lines
PMCON = 0x8780; // Stop PMP module and clear control register

while(1) {
for (i=0;i<255;i++){
while((PMSTAT & 0x8000)!=0){};
PMDIN = i;
}
}
}


書き込みFIFOを持っているのでFIFOステータスを見ながらデータをPMDINレジスタに書くだけで上の波形のシーケンスを出力してくれます。中々便利です。

次はこのPMP機能を使ってLCDの初期化~表示まで行います。
このLCDシールドは元々Arudiono用なので、Aruduinoだったら即動くはずですが、今回PIC32で動かすため、同等のシーケンスを作る必要が有ります。
 
できれば今夜中にテストパターン表示まではやりたいところです。それではまたです。


2015.05.23 Sat l ICHIGOJAM l コメント (0) l top
久しぶりに土日休めますので工作に入りました。部品は秋月電子から通販で取り寄せてあったのでほぼそろっています。


LCDにAruduinoシールド品を使いますので、基板をAruduino用基板としました。ついでにポリカーボネートケースでちょうど良いサイズが有ったので買っています。
まだ始めたばかりなので最終形がなんとなくわかるイメージです。有る程度動いてから詳細を整理しようと思います。

右側にあるのは秋月で買った100円のアナログジョイスティックです。


「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">



とりあえずPIC32Fのはんだ付けができたところです。MPLABXとPICKIT3でまずはPICへの読み書きを進めます。




2015.05.23 Sat l 未分類 l コメント (0) l top
今日は移動時間がかなりありましたので、電車の中で表示キャプチャ回路の構成を考えていました。
帰宅して回路図にまとめたところです。


各部は以下のような考えで選定しています。

1.LCD :AitendoのUL024TF(2.4インチ、320x240pixelColor)としました。
  ichigojamの表示が272x192ですので、それ以上は必要です。ichigojamはモノクロ出力ですが、シリアル制御でキャラクタごとにカラーアトリビュート(昔のPC8001のような)を追加しようと思っていますので、カラーが要ります。
  ちょっと計算したらこのサイズ&カラーでSPI書き込みでは表示がかなり遅くなりますので、8ビットバスが使えるのが良いです。ということでAitendoのLCDで絞り込んだ結果です。
   

「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">



2.マイコン:秋月電子で売っているPIC32MX250F128B-I/SPとしました。私としては初の32ビットPICです。
  272x192x8bppとすると52KB以上のフレームメモリが必要です。とすると64KBくらいは欲しいところですが、秋月で売っているDIP品ではこの32KBが最大でした。(DIGIKEY等で買えば64KB品などもあるようですが、面実装品になってしまうし、なんとなく秋月で買える、というのがお手軽さの目安な気がしまして。)
  考えた末、272x192x4bppとしてフレームメモリを確保することにしました。色は16色になりますが、フレームメモリは26KB なのでこれで入ります。

  また速度的にも昨日の計算ではキャプチャ1pixelを193nsで処理しなければならないのは今まで良く使っているPIC24Fでは荷が重いです。
  PIC32MXはクロックも高速になっているし、なにより1クロック1命令実行です。これならいけるでしょう。
  さらに、このPICなら8ビット外部バスが使えるのでLCD書き込みも容易になります。
  ということでこれにしました。

3.その他:
   これから作るものは小型の箱に納めたLCD表示の小型ichigojamです。小型にするためキーボードをやめて、
   電源及びファーム書き込みを兼ねたUSBシリアルから入力するようにします。
   USBシリアルは秋月の超小型USBシリアル変換モジュール[AE-FT234X]です。
   これに3.3V用レギュレータを付けて電源とします。
  
   PIC32MXにはシリアル入力で制御できる口を付けています。これは、ichigojamから指令、あるいはPCからUSBシリアル経由での指令、どちらでもできるように選択式とします。USBシリアルから制御中にichigojamにはコマンドが行かないように2連スイッチで切っていますが、ちょっと美しくない気がします。ここはもうちょっと考えようと思います。

   実際に作るのは大変そうですが。こういうことを考えるのは中々楽しいものです。
   それではまたです。

2015.05.13 Wed l 未分類 l コメント (0) l top
しばらくソフトばかり書いていましたので、そろそろハードをいじりたいと思います。
では何をやろうか、と考えまして、NTSCキャプチャ&LCD表示でもやってみようと思いいたりました。

「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">





現在ichigojamの表示にNTSC入力のLCDを使っていますが、大きいし普通でつまらない。
PICマイコンでNTSCキャプチャを作って、Aitendoのマイコン制御小型LCDに表示してみようかと。
それができればLCDと一体でichifojamを小型ケースに収めることができるようにもなります。
 
まずは、久しぶりにAnalogfDiscoveryを引っ張り出して、ichigojam出力を見てみました。

当然ですが由緒正しいNTSCですね。
 
これをPICマイコンで受けようと思って、こちらのページを参考に計算してみました。水平表示期間が52.6usで、ichigojamはそこで34キャラクタx8ピクセルを表示しているので、1ピクセル当たりの時間は52.6/(34x8)=0.193us、つまり193nsなのですね。
今時のPCに比べて低い解像度ですが、やっぱりビデオ信号はビデオ信号、で速いわけです。

最初はPIC内蔵ADCで解析しようかと思っていましたが、PICのADC速度は500KHz=2msです。これは無理。
次にコンパレータを使って同期信号、白、黒、の3段階を識別しようかと思いましたが、PICコンパレータ遅延はMAX400nsあるらしくて、これも無理。
 
と、考えたところで、そういえばichigojamはそもそもデジタルで出力してそれを抵抗加算でNTSCにしていたな、ということはアナログで見なくても、加算前の信号をデジタルでそのまま見ればいいや、と気付きました。ということで受けは何とかなりそうです。
 
次はLCD表示について検討します。それではまたです。

2015.05.12 Tue l ICHIGOJAM l コメント (0) l top
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。