952 :
948:2006/06/28(水) 21:50:56
>>949 質問1でやりたいことは、ブロックモードでやってることをM16Cでやりたいんです。
ブロックモード
↓
ブロックモードでは、1 回の割り込みで長い文字ブロックを受信します。
ブロックモードが従来の非同期 FIFO シリアルポートで使われたら、
それには 16 バイトのハードウェアバッファがあるので、
割り込みは 14 バイト毎にしか発生しません。
14バイト毎に割込みが必要なので、
16 バイトのハードウェアバッファがあります。
このように多くの負荷や割り込みハンドラのオーバヘッドを軽減するので、
コンピュータはブロックモードを使っているときは他の仕事に時間を
割くことができるのです。
質問2ですが、
簡単に言えば、シリアル入出力を7ビット単位でできるようにしたいんです。
>>951 環境には問題ありません。
>質問2
M16CのSCI(UART)の設定を7ビットにするだけじゃねーの?
>質問1
無理に割り込み使わずに、M16Cにない機能を手間掛けて作る方が
結果、負荷かかる気がするが気のせい?
いや、質問の意図はそういうことじゃないんじゃないの多分。
ハードウェアバッファが1,2バイトしかないマイコンで、
例えば16バイトのハードウェアバッファと同じことをどうやったら実現できますか、
っていうような質問なんでは?
956 :
948:2006/06/28(水) 23:30:21
>>954 うちでは、16 バイトのハードウェアバッファにデータを入れてから
受信割り込みをした方が、1文字1文字受信割り込みをするより効率がいい、
って言われてるんです。
949さんが言っていた、シリアル入力からDMAでメモリに格納するやり方、
正解だ!とおもったんですが、それも1文字ずつDMA割り込みがかかって
しまいますよね。
>>953 受信バッファも7ビット仕様にしないといけないのです。
>>956 なんだか良く分からんな
GPIO使ってUARTもどきを作れと言ってるようにしか見えん
ハードにカウンタとメモリー追加してもらって、自動でメモリーに積む仕組み作ってもらえば??
>>958 いまさらハードの増設なんて無理なのでソフト(ファーム)でやれ、と。
昔、シリアルポートと普通のポートつなぎ間違えたから
フォーム対処でよろしくってのがあったけど
まあ似たようなもんかね
960 :
仕様書無しさん:2006/06/29(木) 00:48:48
>>956 じゃあ、割り込みの中でシリアル通信が終わるまでループし続けてれば?
つーか、本気で解決したいと思ってるの?
だったらキミに指示を出した人に相談するのが最善策だと思うんだけど。
先生!フォームじゃ対応できません!
963 :
948:2006/06/29(木) 23:15:34
>>960 今まで失敗ばかりしていて、聞きづらかったのですが、
教育係に聞いて、解決しました。
質問1は、割り込み中にポーリングで受信バッファにデータを入れる
質問2は、データ長を7ビットにするだけでした。
的を絞れていない質問に答えてくれた方々、ありがとうございます。
明日からはリアルタイムOSを勉強します。
ESECに行った人(@@)ノ
でか過ぎて何だかよく判らんかった。
毎回毎回変わり映えしねーなぁ
ESECといえば、去年のうちの製品の中で使ったライブラリを作った会社の営業が、
応用製品展示に使いたいから、製品1台貸せ、と言ってきたな。
おめーのとこで買えよ、と上司は突っ返したようだが(高々2万ぐらいのもの)。
つうか、普通そうじゃないのか?
まぁ、あまりに対応酷すぎ(製品はまぁまぁだったけど)なんで、別の会社の
ライブラリに今年は変えたけどな。対応まともだったら、そのまんま使い
続けたんだろうけどねぇ。
勘違い営業にも困ったモンだ。自分の会社の製品に自信をもつのもいいけど
客も馬鹿じゃないから、いつでも乗り換え製品は検討してるってのに。
えー!?普通は貸すだろ?
自分のところの製品の宣伝にもなるし。
いや、だって今年は別会社のヤツに乗り換えたんだろ。
一般コンシューマ系の製品だから、ESECに出しても全然宣伝にならんし、
TV−CMもよく打ってる製品だからね。向こうにとっては、搭載実績としてよい
宣伝にはなるけど、こっちには全然メリットない。
ちなみに乗り換えたことは、その会社には言ってないけどな(w
つアナログスイッチ 4066
取りあえず、74シリーズとか4000シリーズを見るのは基本。
あとはデジトラやFETを使う方法もあるけどな。
説明するのめんどいから、4066つカット毛。
そんな余分な回路なんて多分いらんでしょ。
(1) マイコンのグランドとコントローラのコモンを繋ぐ
(2) コントローラのスイッチのコモンじゃない方を、マイコンの適当なポートに繋ぐ
(3) マイコンのポートのモードをオープンドレイン・プルアップなしにする。
たぶんこれだけでいけるよ。
コントローラにコモンなんてなくてマトリックス組んであったらシラネ
あと、この程度ならEZ-USBなんてつかわなくてもFTDIのUSB⇔パラレル変換チップで
できるんじゃないか
976 :
974:2006/07/02(日) 13:55:42
いや、トラ技の記事で読んで面白そうだなと思っただけで
実際に使ったことないんだけどねw
おまけに俺はソフト寄りの人間なんで、実はハードはよくわからんw
ドキュメントは以前ダウンロードして一通り眺めたけど。
なので適切なアドバイスはできないんですが、
>FT_Write()関数で書き込むデータは、〜
たぶん予めBit-Bangモードにしておく(D2XXっていう、FTDIから提供されている
フィルタドライバらしきものにそれ用の関数があったはず)必要がありそうですが、
全体の流れは恐らくその通りだと思う。でも、
1) FTDIのチップの出力ピンは恐らくオープンドレインなので、(未確認)
コントローラのスイッチの入力ラインを直接つないでも大丈夫......かも?
(ただVCCIOっていうピン ――恐らく出力ピンのプルアップ抵抗につながっている――
をどう処理したらいいのか、っていう問題はあるかも。)
2) この場合、コントローラのスイッチの入力は多分負論理(単純にプルアップ
されているだけ)なので、スイッチをONにしたいときには対応するビットを0に
する必要がある。
>>976 Bit-Bangモードについて調べてみたのですが、これの特徴としては、D0〜D7のポートを
時間間隔を指定して任意に入出力に割り振れることですよね?
僕はD0〜D7まですべて出力にし、出力間隔はアプリ側のwin32apiのSet
↑すみません、誤って書き込みをしてしまいました(汗)
↓続き
SetTimer()関数で制御しようと考えているのですが、この場合はBit-Bangモードにする必要は
ないのでしょうか?
なお、出力間隔はゲームの入力受付単位である1/60secで行いたいと思っていますので、
その間隔を保障できることが条件です。
あと、オープンドレインであることを利用してのON・OFFは以下の図のような考え方で
良いのでしょうか?
ttp://vista.xii.jp/img/vi5183172450.gif この場合、プルアップ抵抗での電圧降下は考慮しなくて良いのでしょうか?
また、スイッチのON・OFFはD0〜D7から出力されるHigh・Lowの信号でどのように
実現するのでしょうか?
回路図はちゃんと書きなさい。標準的な記号をつかうように。
オープンドレインうんぬんがどこにあるのかまったく分からん。
あと、考慮しなくてよいか分からんときは考慮にいれること。
トランジスタのデータシートを読んで、グラフから動作点を
求めれば良い。
980 :
974:2006/07/02(日) 20:40:52
えっと、FTDIのチップ実際につかったわけじゃないし、
前に書いたように俺もハードよく分かってないので話半分に聞いてね。
>SetTimer()関数で制御しようと考えているのですが、この場合はBit-Bangモードにする必要は
>ないのでしょうか?
FT245の場合、Bit-Bangモード以外ではSetTimerは無効になると思う。
言い換えると、Bit-Bangモード以外のモード(FIFOモード)では、
チップの側から能動的に信号を出力することはできない。
外部につないだCPUなどによってRDラインがアクティブにされると、
そのとき初めてバッファ( = FIFO)のデータを出力に吐き出すことになる。
981 :
974:2006/07/02(日) 20:42:04
>オープンドレインであることを利用してのON・OFFは 〜
コントローラのスイッチ入力は、恐らく下のAAの'+'の部分の電位を見てるだけ。
スイッチがONのとき'+'の電位はGNDレベル、スイッチがOFFのときVCCと
同じレベルになるのは分かるよね?上で負論理って言ったのはこういう意味。
一方、FT245の出力Dxは、対応するビットに1を書いたときHi-Z、
0を書いたときGNDと導通すると思われる。(くどいけど未確認ね)
だからコントローラのCOMとFT245のグランドを同電位にしておいてから、
'+'の位置にFT245の出力(D0〜D7)をつないでやれば、それだけでスイッチと
等価の働きをさせることができるはず。
[SW = ON]
VCC|------vvvv---+-------o_o------|COM(GND)
[SW = OFF]
VCC|------vvvv---+-------o o------|COM(GND)
982 :
974:2006/07/02(日) 20:48:09
あと、FTDIのチップは確か電気電子板で結構前から話題になってたから
そっちで聞いた方が適切な回答が返ってくるかも。
>>979 す、すみません・・・ (;-_-)
>あと、考慮しなくてよいか分からんときは考慮にいれること。
了解です!
>>980 >>974さん、度々ありがとうございます。
改めてよくよく調べてみると、まさにおっしゃるとおりでした(汗)
ホストPC側からはRDをいじれないので、単発の出力すらままなりませんね・・・
となると、連続してコマンドを送信する場合は、チップ側はBit-Bangモードで
指定した周期でバッファをサンプリングさせてその内容を出力し、そのバッファにはPC側からSetTimer()を使って同じ周期でFT_Write()によって書き込んでやればイイってことですよね?
>>981 コントローラのボタンが押されていないときはボタンの+側端子はPS2からの駆動電圧3.3Vと
等電位ということですよね?
よって、その図をFT245で等価的に行うと以下のような図になる、ということであってますか?
[SW = ON]
VCC|------vvvv---+-------------|Dx(Low)
[SW = OFF]
VCC|------vvvv---+-------------|Dx(High(3.3V))
>>982 そうなんですか。
そちらでも聞いてみますね。
984 :
974:2006/07/02(日) 23:36:51
>>983 想像だけど、FT245はバッファにデータが何もないとき、
D0-D7の出力は一番最後に書いたデータを反映した状態を維持するものと思われるので
スイッチの状態を変化させたい時だけ、FT_Writeで1バイトだけ書いてやればいいんじゃないか。
FT_Writeで2バイト以上のデータを書いたときには、FT_SetBaudRate(SetTimerではないみたいね)
で設定した時間間隔でデータが順次出力されるものと思われるが、
このときこの時間間隔が、コントローラがスイッチをスキャンする時間間隔(10mSぐらい?)
より短いとコントローラはスイッチの状態の変化を取りこぼすことになるだろう。
あと電気的な話についてだけど、簡単にいえばFT245の出力D0-D7ってのは
片足がグランドにつながったスイッチのもう一方の足だと思えばいいんよ。
対応するビットに0を書くと、スイッチはONしてDxはグランドレベルになる。
対応するビットに1を書くと、スイッチはOFFしてDxはフローティング状態になる。
(注 本当は20KΩの抵抗経由でVCCIO端子にプルアップされた状態になるんだと思う。
これが正しいとすれば、今回の目的の場合、VCCIOには何も繋がなくてもよいはずだが、
この石を本当にそういう風に使っていいのかどうかは俺にはわかりません)
つまり
>>981のAAの'+'の位置に出力Dxを繋ぐってことは、
コントローラの本来のスイッチと並列にもう一つのスイッチを接続したのと同じになるわけ。
こんなに手取り足取り教えてたら、本人の勉強にはならんと思うが?
まぁ、調子に乗って聞いてる理系院生も駄目学生だが。
マ板で聞く時点で勉強よりネタ。
>>984 >スイッチの状態を変化させたい時だけ、FT_Writeで1バイトだけ書いてやればいいんじゃないか。
そうですね。
そうします。
>FT_Writeで2バイト以上のデータを書いたときには、FT_SetBaudRate(SetTimerではないみたいね)
>で設定した時間間隔でデータが順次出力されるものと思われるが、
ということは、コントローラに連続して入力したいコマンドを一度に一気にバッファに
書き込むのもありですね。
>このときこの時間間隔が、コントローラがスイッチをスキャンする時間間隔(10mSぐらい?)
>より短いとコントローラはスイッチの状態の変化を取りこぼすことになるだろう。
そこも気になるところでしたが、実際に組んでうまく調整したいと思っています。
ある方が映像信号の垂直同期信号(入力受付単位と同じ1/60sec)を取り出してそれを元にデータを
出力する構造にしたりしていましたが、これだと確実ですね。
この場合はFIFOモードで垂直同期信号をRDとつないでやればいけそうですね。
>コントローラの本来のスイッチと並列にもう一つのスイッチを接続したのと同じになるわけ。
なるほど!
これを利用すれば本来のボタンで手動入力もできるシステムにできますね!
>(注 本当は20KΩの抵抗経由でVCCIO端子にプルアップされた状態になるんだと思う。〜
ここらへんが分からないですが、よく調べて理解できるようにしたいです。
>>974さん、とても丁寧にありがとうございました!!
では埋めますか
英語でエンベデデッドって埋めだよね。
エンベデッド
ROM化
埋めの理由は Null Pointer にアクセスしたせいです
993 :
仕様書無しさん:2006/07/06(木) 19:07:43
それを言うならNull Pointerで、だろ
ポインタ程度もロクに使えん三流PG丸出しだなw
次スレは?
((void)(*)(void))0x00000000();
catch(Nurupo& e) { e.ga(); }
997 :
仕様書無しさん:2006/07/06(木) 23:08:19 BE:259486092-#
998 :
仕様書無しさん:2006/07/06(木) 23:09:08
999 :
仕様書無しさん:2006/07/06(木) 23:09:39
余裕の1000GET!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1000 :
仕様書無しさん:2006/07/06(木) 23:10:10
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET1000GET
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。