サークルで活動するには参加が必要です。
「サークルに参加する」ボタンをクリックしてください。
※参加を制限しているサークルもあります。
-
from: zwiさん
2007年09月25日 10時57分25秒
icon
「Re:Re:Re:Re:Re:テレビへの表示」
> C言語の中にアセンブラを使うことができるのですか・・・
> 命令の数を決めたいときに便利そうですね。
> アセンブラは対象によって命令が違うと思うので少し勉強してきます。
徐々に覚えていくので良いと思います。
C言語のアセンブル出力を参考にすると勉強になりますよ。
> >>RB7かRB0
> 貴重な情報をありがとうございます。
> ポートなんてどれも同じだと思っていました。
> 特定のポートしかできないことがあるのですね。
シフトを使う場合は最上位か最下位ビットにしないと意味がないですから。
> 四角形はうっかりしていました。上下に線がないと四角形になりませんね
> まだ試していませんがifで追加された時間を調整すればできると思います。
手間はかかると思いますが大丈夫だと思います。
> 今回テレビへ表示してみて、8MHzでは厳しいと感じました。
> 20MHzにしてみるのも一つの方法です。
> 今まではdsPICは高性能で自分とは関係ないと思っていましたが、調べてみると
> dsPIC30F2012は120MHz、28PIN、500円で買えるようです。
> 16F88に比べると化け物みたいですね!
> 思っていたほど高くなかったので今度はこれに挑戦してみようと思います。
> まずはトランジスタ技術8月号の付録を試してみます。
> いろいろ教えていただき本当にありがとうございました。
> これからもまたお世話になると思いますがよろしくお願いします。
秋月で売ってますね。
http://akizukidenshi.com/catalog/items2.php?c=new&s=name&p=1&r=0&page=25
ただ、dSPICに書き込みするのは書き込み機を自作するか買わないといけないので面倒ですね。トラ技の付録はローダが書き込んであるので不要ですけど。
今使われているPIC16F88のライタは、dSPIC対応でしょうか?icon
-
サークルで活動するには参加が必要です。
「サークルに参加する」ボタンをクリックしてください。
※参加を制限しているサークルもあります。 -
サークルで活動するには参加が必要です。
「サークルに参加する」ボタンをクリックしてください。
※参加を制限しているサークルもあります。 - 0
icon拍手者リスト
-
-
from: zwiさん
2007年09月24日 17時27分40秒
icon
「Re:Re:Re:テレビへの表示」
> できました!
> 縦三本線を表示できました!
> とてもうれしいです!
おめでとう!やりましたね!
> 表示部分にif文などを入れると周期が変わってしまうので
> 複雑な表示をするにはクロックを上げないといけないかもしれません。
ここだけC言語中に埋め込むインラインアセンブラを使う必要があるかも知れませんね。
mikroCのhelpを見ると下記の様な書き方をするみたいです。
asm {
MOVLW 10 // just a test
MOVLW test_main_global_myvar_1
}
分からないことがあれば手伝いますよ。
あっ、そういえば、RB5とRB4を使っていますよね。
ビットデータを表示するときは、RB7かRB0を使った方がシフトを使って高速に多量のビットを表示できるのでお勧めです。同期信号のRB4は、RA0〜7のどれかに移します。
PICのブレークアウトもポートを分けてありますよ。
> 現在の表示は、例えば輝度を
> 0011001100
> と入れると縦線が二本表示されると思うのですが、
> 真ん中に四角形を表示したい場合は、
> 242回のうち、はじめの80回は
> 0000000000
> 次の80回は
> 0011001100
> 最後の82回は
> 0000000000
> を入力すれば四角形になるのでしょうか?
これだと縦線2本が宙に浮いていることになります。
0011001100の前後で0011111100のラインを何回か書いてやらないと四角形にはなりませんね。icon
-
サークルで活動するには参加が必要です。
「サークルに参加する」ボタンをクリックしてください。
※参加を制限しているサークルもあります。 -
サークルで活動するには参加が必要です。
「サークルに参加する」ボタンをクリックしてください。
※参加を制限しているサークルもあります。 - 0
icon拍手者リスト
-
-
from: zwiさん
2007年09月24日 12時21分15秒
icon
「Re:テレビへの表示」
プログラムを見ました。無駄が減って機械語の命令効率がぐっと良くなりましたよ!
最初の1マイクロ秒を待つループ。
while( HSYNC_SYNC_START > TMR0 ) {
}
は無駄なので省いて良いと思います。
どう考えても時間がオーバーします。
変わりに
PORTB.F5=0; // 輝度信号=暗い
などを何回か入れて時間調整してください。
それと
while( HSYNC_BLANK_COUNT > TMR0 ) {
}
は直後に
while( TMR0 < HSYNC_VIDEO_START ) {
}
があるんでHSYNC_BLANK_COUNTの方を省いちゃってください。
波形の理想は、
0μs 0.3V
1μs 0V ← 水平同期信号
5μs 0.3V ← ここの時間の変動が少ないことが理想。
15μs 0.6V ← 輝度信号
60μs 0.3V
で周期が63.5μsから64μsあたりだとうまく表示されると思います。
上下に乱れるほうは、60Hz周期の波形もオシロで観測してみてください。icon
-
サークルで活動するには参加が必要です。
「サークルに参加する」ボタンをクリックしてください。
※参加を制限しているサークルもあります。 -
サークルで活動するには参加が必要です。
「サークルに参加する」ボタンをクリックしてください。
※参加を制限しているサークルもあります。 - 0
icon拍手者リスト
-
-
from: zwiさん
2007年09月24日 00時45分52秒
icon
「Re:Re:Re:Re:Re:Re:Re:Re:Re:テレビへの表示」
zipの中身を見てみたらアセンブルリストが入ってました。標準でアセンブルリストを出力しているみたいですね。
で、問題のREADTIMER()を使っているところを見るとアセンブルコード長いです。よく中身は理解しなくても良いので短くなる工夫を考えて見ましょう。
1つの機械語命令を簡単に0.5μsとして命令数×0.5で実行時間を暗算してみます。
;16f88.c,59 :: while( HSYNC_SYNC_START > READTIMER() ) {
$0023 $ L_interrupt_2:
$0023 $3080 MOVLW 128
$0024 $0201 SUBWF TMR0, 0
$0025 $00F1 MOVWF STACK_1
$0026 $01F2 CLRF STACK_1+1
$0027 $1C03 BTFSS STATUS, C
$0028 $03F2 DECF STACK_1+1, 1
$0029 $3080 MOVLW 128
$002A $0672 XORWF STACK_1+1, 0
$002B $00F0 MOVWF STACK_0
$002C $3080 MOVLW 128
$002D $3A00 XORLW 0
$002E $0270 SUBWF STACK_0, 0
$002F $1D03 BTFSS STATUS, Z
$0030 $2833 GOTO L_interrupt_30
$0031 $3003 MOVLW 3
$0032 $0271 SUBWF STACK_1, 0
C言語のwhile命令1つが機械語で16命令あるので、これだけで軽く8μs使っています。ってことは、水平同期時間を守れてません。
やはり、タイマを見てタイミング計るよりは、命令の組み合わせだけで4μsの水平同期信号を出さないとまずいことが分かります。
ここは全面的に修正が必要となりますね。割り込みを抜けるまでの時間は、最大15μs程度に抑えないとチェックパターンも表示できないですね。
私のコードは使えませんので、オリジナルの案を検討してみてください。
よく分からないなら質問してくださいね!icon
-
サークルで活動するには参加が必要です。
「サークルに参加する」ボタンをクリックしてください。
※参加を制限しているサークルもあります。 -
サークルで活動するには参加が必要です。
「サークルに参加する」ボタンをクリックしてください。
※参加を制限しているサークルもあります。 - 0
icon拍手者リスト
-
-
from: zwiさん
2007年09月24日 00時14分12秒
icon
「Re:Re:Re:Re:Re:Re:Re:Re:テレビへの表示」
問題点を列挙します。
・TMR0のカウンタ再設定は、割り込んだら直ちに行うこと。cnt++の前です。
・このマクロを使っていますが、引き算してから比較していると実行効率が悪いかもしれません。アセンブルコードを見てみないと断言は出来ませんが。
#define READTIMER() (TMR0 - 128) //255-128=127
・以下は効率悪いので、修正してください。
<修正前-開始>
PORTB.F4=1; // 垂直同期信号OFF
while( HSYNC_SYNC_START > READTIMER() ) {
PORTB.F5=0; // 輝度信号=暗い
}
// 水平同期信号処理を水平同期期間中の処理。
PORTB.F4=0; // 水平同期信号ON
while( HSYNC_SYNC_END > READTIMER() ) {
PORTB.F5=0; // 輝度信号=暗い
}
// 水平同期信号処理。ブランキング期間。
PORTB.F4=1; // 水平同期信号OFF
while( HSYNC_BLANK_COUNT > READTIMER() ) {
PORTB.F5=0; // 輝度信号=暗い
}
<修正前-終了>
<修正後-開始>
PORTB.F4=1; // 垂直同期信号OFF
PORTB.F5=0; // 輝度信号=暗い
while( HSYNC_SYNC_START > READTIMER() ) {
}
// 水平同期信号処理を水平同期期間中の処理。
PORTB.F4=0; // 水平同期信号ON
while( HSYNC_SYNC_END > READTIMER() ) {
}
// 水平同期信号処理。ブランキング期間。
PORTB.F4=1; // 水平同期信号OFF
while( HSYNC_BLANK_COUNT > READTIMER() ) {
}
<修正後-終了>
・PICは遅いので、
// 輝度信号出力ループ
for( vc=0 ; 2==bVideoOut ; vc++ ) {
// 表示期間終了?
if( READTIMER() >= HSYNC_VIDEO_END ) {
// 輝度信号出力は不可。
bVideoOut = 0;
// ループを抜ける。
break;
}
// 一定周期で反転する。
if( (vc&0x7)==0 ) {
PORTB.F5^=1; // 明るさを反転。
}
}
ではなく、
// 表示期間中?
while( READTIMER() < HSYNC_VIDEO_END ) {
// 明るさを毎回反転する。
PORTB.F5^=1; // 明るさを反転。
}
// 輝度信号出力は不可。
bVideoOut = 0;
ぐらいコンパクトにまとめてください。
その他にも効率化しないと間に合っていないところがあるかも知れません。
水平同期信号が約64μs周期で4μsだけ0になるように調整していきましょう。
それがうまく出来るまで、起動信号は出さないほうが良いかもしれません。混乱しますし。
オシロを最大限に利用しましょう!icon
-
サークルで活動するには参加が必要です。
「サークルに参加する」ボタンをクリックしてください。
※参加を制限しているサークルもあります。 -
サークルで活動するには参加が必要です。
「サークルに参加する」ボタンをクリックしてください。
※参加を制限しているサークルもあります。 - 0
icon拍手者リスト
-
-
from: zwiさん
2007年09月23日 23時48分33秒
icon
「Re:Re:Re:Re:Re:Re:Re:テレビへの表示」
1つ大ボケしてました。
PICの場合は4クロックで1サイクルですから、8Mhzの場合は、機械語1命令を1サイクルか2サイクルの1/2μsか1μsで実行します。
ソースを見ていて気になったのは、私の使っているdSPICはPIC16F88の約16倍のクロックで動作します。4クロックで1サイクルなのは同じですが、機械語1命令を1サイクル未満で実行しますので、16倍から32倍の速度で実行することになります。データ長も16ビットのため効率的に16ビットのデータを処理できます。16ビットのデータばかりだとPIC16F88の32倍以上の速度で動きます。
圧倒的な速度差があるので同じように書いていると色々と無駄が多く見易さよりも実行効率の良い書き方を心がけてください。
ソースについては、また後で。icon
-
サークルで活動するには参加が必要です。
「サークルに参加する」ボタンをクリックしてください。
※参加を制限しているサークルもあります。 -
サークルで活動するには参加が必要です。
「サークルに参加する」ボタンをクリックしてください。
※参加を制限しているサークルもあります。 - 0
icon拍手者リスト
-
-
from: zwiさん
2007年09月23日 16時13分20秒
icon
「Re:Re:Re:Re:Re:テレビへの表示」
とりあず8Mhzでどこまで出来るか試してみましょうか。その結果をみて20Mhzを考えるということで。
ちなみに8Mhzで動いているPICマイコンは、機械語1命令を1/8μsか1/4μsで実行します。
>プログラミングにはmikroCを使っています。
使ったことがなかったので、落として試して見ます。
趣味の範囲でならフリーみたいですね。
> こんなプログラムを動かして、オシロスコープで波形を確認して
> Delay_usの数値を上げていくことで63.5μsを作るというのはどうでしょう
63.5μsの水平同期だけを作るなら、C言語でもそんなに難しくはないです。
ちなみに水平同期信号は、約4μsだけ0を出力し、それ以外の期間は1を出力する必要があります。Delay_usだけだとμs以下が調整できないので、場合によってはダミーの命令で時間を調整したり、NOP命令をインラインアセンブラで入れてやる必要が出てくるかも知れませんね。
ただし、ここに垂直同期の信号が入ってくると話は突然ややこしくなります。
垂直同期の信号は、次の条件で作る必要があります。
水平ライン数は262本(垂直同期期間÷水平同期期間)ですが、このうち20本は何も表示してはいけない期間で映像信号を止めて同期信号だけを出力します。さらに20本のうち3本分は垂直同期信号だけを出力する必要があります。つまり3本×63.5μsの間だけは0だけを出力します。
条件を見てわかるとおり、if文が入るので同じ水平同期の周期でループを続けるのがとたんに困難になります。
まず、ここまでを作ってみるのはどうでしょうね。
割り込みを使わずに出来ますし、同期が乱れればオシロやテレビで確認できると思います。
チェックパターンまでなら、割り込みなしで作れると思いますよ。
ややこしいですが参考資料です。
http://www.nahitech.com/nahitafu/mame/mame6/mame6.html
さらに機能を追加するなら割り込みを検討しましょう。icon
-
サークルで活動するには参加が必要です。
「サークルに参加する」ボタンをクリックしてください。
※参加を制限しているサークルもあります。 -
サークルで活動するには参加が必要です。
「サークルに参加する」ボタンをクリックしてください。
※参加を制限しているサークルもあります。 - 0
icon拍手者リスト
-
-
from: zwiさん
2007年09月23日 12時54分05秒
icon
「Re:Re:テレビへの表示」
おはようございます。
まず、ビデオ信号の仕組みについて解説します。
ビデオ信号は、1つの信号線に同期信号と映像信号を混ぜたものでなかなか巧妙に信号を作り出しています。
1.同期信号
水平同期と垂直同期信号の2種類が必要です。
一般的なTV信号は、水平が15.75Khzで、垂直が60hzです。
水平同期は、水平方向の1ラインを画面に表示する周期を決めています。15.75Khz = 63.5μsで1ラインを描画するタイミングになります。
垂直同期は、1画面を描画する周期を決めます。テレビゲームが1秒間に60フレームなのは、垂直同期が60Hzだからです。
ちなみに、TVは同期信号の周期がアバウトでも自動的に調整してくれるので、きっちり15.75Khzや60hzである必要はありません。
2.映像信号
表示する明るさとカラー信号を混ぜた信号です。ただし、今回は白黒なので難しいカラー信号は取り扱いません。明るさは白黒の2階調だけなので回路も簡単です。
1をピンに出力すると白くなり、0をピンに出力すると黒くなります。
で、他の質問ですが、
・アセンブリ言語では一命令にかかる時間がわかっていたため命令の数で63.5μsを計ることができたがC言語上ではどうすればよいのか。
コンパイル結果のアセンブルコードを見て、時間を計算するしかないですね。アセンブラを少々勉強してもらう必要があります。各命令の実行時間と分岐命令の動きを理解してもらうだけで良いです。
dSPICは高速なので命令時間で周期を処理するのは行っていませんが、PIC16F88は遅いのでC言語だと時間管理は超厳しいです。
PIC16F84Aのブレークアウトゲームがアセンブラで組まれているのも、C言語だとタイミングが厳しいと考えたからだと思います。だからと言って組めないわけではないので実用になるかは別にして挑戦してみるのも面白いと思いますよ。
・割り込み?を使わなくても可能かどうか
夜にはできそうだと書きましたが、朝から考え直してみたら難しいかも知れません。
なにより、割り込みを使ったほうがプログラムが簡単になります。C言語で組むのは良いとしても、割り込みを使わないと逆に制御が難しいプログラムになるので、その手間を考えると割り込みの仕組みを覚えた方が早道だったりします。
私の今の結論から言うと割り込みを使わないとしたら、タイミング制御を厳密にできるアセンブラで組む必要が出てきます。icon
-
サークルで活動するには参加が必要です。
「サークルに参加する」ボタンをクリックしてください。
※参加を制限しているサークルもあります。 -
サークルで活動するには参加が必要です。
「サークルに参加する」ボタンをクリックしてください。
※参加を制限しているサークルもあります。 - 0
icon拍手者リスト
-
-
from: zwiさん
2007年09月23日 01時01分38秒
icon
「Re:テレビへの表示」
こんばんは。今帰ってきました。
bachelorさん、始めまして!
で、PIC16F88の件ですが、今日は眠いのですいません明日じっくり回答させてもらいます。
C言語はPIC16F88だと辛いかもしれませんねぇ。参考に動かしているPICのクロック周波数とC言語のメーカーか名前を教えてください。あと持っている本の名前も!
割り込みなしでも動くとは思いますので、どこまで出来るか一緒にチャレンジしましょう!icon
-
サークルで活動するには参加が必要です。
「サークルに参加する」ボタンをクリックしてください。
※参加を制限しているサークルもあります。 -
サークルで活動するには参加が必要です。
「サークルに参加する」ボタンをクリックしてください。
※参加を制限しているサークルもあります。 - 0
icon拍手者リスト
-
-
from: zwiさん
2007年09月17日 15時34分35秒