C言語初心者です。どうか力を貸してください。
質問です。わかりやすく質問のところには◆マークがあります。
今、私はVisual Basicのコードで書かれたものをC言語に直してFPGAに実装することを目指しています。
そのコード内容には、10ms単位の細かいタイマーが必要です。
Visual Basicでは、それを可能にする細かいタイマー関数があるのですが、
◆C言語のtime()関数でも同様に可能なのでしょうか?
コード内容は、大雑把に言えば、5つある電磁弁を指定した割合で1秒を時間分割して、順々にそれぞれの開閉を制御するというものです。
電磁弁にはON/OFFの信号を送ることで開閉します。
わかりやすく例をあげて説明すると、電磁弁1、2、3、4、5を、
10% 15% 20% 15% 40%(合計は必ず100%)
の濃度ファイルで一秒を分割するとすると、
順に、
0.1s 0.15s 0.20s 0.15s 0.4s と一秒経過する中でそれぞれ順に電磁弁に送られる信号のスリープ時間が決まります。
◆C言語自体で無理ならば、FPGAにタイマーをハードウェアで作ってとりつけるしかないのでしょうか??
ここで、参考までに
Visual Basicのソースコードと、time()関数を使えると想定してC言語に書き換えたコードを載せておきます。
(一部を抜いているので関数や記号の宣言などが抜けてますがそこは気にしないでください)
ダメ出しでもなんでもかまわないので意見をお願いしますm(_ _)m
********Visual Basic*************
Dim TimeBeforeProcess As Long '処理を行う前の時間
Dim WaitingTime As Long '時間調整のためのプログラムの待ち時間
For i = 0 To intOdorCount - 1
If varConcentration(i) > 0 Then
TimeBeforeProcess = timeGetTime
/*timeGetTimeは現時刻を意味する*/
/*varConcentrationは濃度(%)(時間の割合)を表す*/
For j = 0 To intOdorCount - 1
OutBitNo = j
OutBuf = IIf(j = i, 1, 0)
If DioOutBit(lngHDrv, OutBitNo, OutBuf) <> 0 Then GoTo dbErrHandler
Next
/*制御信号をデバイスに送信する*/
If Not SendCtrlSignal Then GoTo dbErrHandler
WaitingTime = CLng(varConcentration(i) * 10) -(timeGetTime - TimeBeforeProcess)
/*濃度1%につき10msなので10をかけている*/
/*For文に入った時刻と現時刻との誤差を引いている*/
If WaitingTime > 0 Then Call Sleep(WaitingTime)
End If
Next
IOdorGeneration_GenerateOdor = True
Exit Function
dbErrHandler:
IOdorGeneration_GenerateOdor = False
End Function
********C言語*************
(C言語に直しきれてないところもあります。そこはご教授ください。)
time_t TimeBeforeProcess; //処理を行う前の時間;
time_t WaitingTime; //時間調整のためのプログラムの待ち時間;
for(i=0;i<=intOdorCount - 1;i++){
if(varConcentration(i) > 0){
time(&TimeBeforeProcess);
/*TimeBeforeProcessに現時刻を格納?*/
for(j=0;j<=intOdorCount - 1;j++){
OutBitNo = j;
if(j=i) OutBuf=1;
else OutBuf=0;
If(DioOutBit(lngHDrv, OutBitNo, OutBuf) != 0) GoTo dbErrHandler;
/*どういじればいいのか分かりません;*/
}
/*制御信号をデバイスに送信する:/
if(Not SendCtrlSignal)GoTo dbErrHandler;
WaitingTime = CLng(varConcentration(i) * 10) - _
(timeGetTime - TimeBeforeProcess);
if(WaitingTime > 0) Call Sleep(WaitingTime);
}
}
IOdorGeneration_GenerateOdor = True
Exit Function
dbErrHandler:
IOdorGeneration_GenerateOdor = False
End Function
*****************************
◆C言語にはVBのtimeGetTimeのような現時刻を表す便利なものはないですか?
◆なにか意見があればお願いします(><)
Timer関数に関連して質問です;VBをCに変換してます。
-
しっぽ
Re:Timer関数に関連して質問です;VBをCに変換してます。
> C言語にはVBのtimeGetTimeのような現時刻を表す便利なものはないですか?
timeGetTime 自体は Win32API の関数だと思うのですが。
VBコードのどこかに
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
と記述してませんか?
timeGetTime 自体は Win32API の関数だと思うのですが。
VBコードのどこかに
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
と記述してませんか?
-
バグ
Re:Timer関数に関連して質問です;VBをCに変換してます。
このHPのダウンロードコーナーにあるカラードロップ2のソースコードであるTIMER.cppとTIMER.hを使えば1ミリ秒単位で時間を測る事が可能です。
少し改造すれば、1マイクロ秒単位に変更も可能です。
少し改造すれば、1マイクロ秒単位に変更も可能です。
-
きの(初心者)
Re:Timer関数に関連して質問です;VBをCに変換してます。
>しっぽさん
返信ありがとうございます。
検索かけましたが、
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
のような記述は見当たりませんでした;
VBもまだまだ未熟なので解読できてない部分があるのかもしれません。
もう一度全部に目を通してみます(>_<)
>バグさん
返信ありがとうございます。
TIMER.cppとTIMER.hはダウンロードしたのですが、これを具体的にどう使えばいいかわかりませんでした。。。
力不足です…。。。すいません(;_;)
返信ありがとうございます。
検索かけましたが、
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
のような記述は見当たりませんでした;
VBもまだまだ未熟なので解読できてない部分があるのかもしれません。
もう一度全部に目を通してみます(>_<)
>バグさん
返信ありがとうございます。
TIMER.cppとTIMER.hはダウンロードしたのですが、これを具体的にどう使えばいいかわかりませんでした。。。
力不足です…。。。すいません(;_;)
-
バグ
Re:Timer関数に関連して質問です;VBをCに変換してます。
あ、すみません…TIMER.cppを使うよりも簡単な方法があったのを忘れてました(;^_^A
それは、Sleep関数です。windows.hをインクルードすれば使用できます。
Sleep関数は1ミリ秒単位でウエイトを掛ける事が出来る関数です。ただし、この関数で指定した時間は何もできなくなってしまいますので、時間を測りつつ何かをしたい時には向きません(;^_^A
それは、Sleep関数です。windows.hをインクルードすれば使用できます。
Sleep関数は1ミリ秒単位でウエイトを掛ける事が出来る関数です。ただし、この関数で指定した時間は何もできなくなってしまいますので、時間を測りつつ何かをしたい時には向きません(;^_^A
-
きの(初心者)
Re:Timer関数に関連して質問です;VBをCに変換してます。
なるほど☆
調べてみます!
…ところで、ここまで教えていただいてなんなんですが、
FPGAでやる場合は、外部のクロックICなどを期待できない、
回路で自分でカウントしてやる必要があるのでは?
との指摘を受けたのですが、どうなんでしょう。。。(;_;)
調べてみます!
…ところで、ここまで教えていただいてなんなんですが、
FPGAでやる場合は、外部のクロックICなどを期待できない、
回路で自分でカウントしてやる必要があるのでは?
との指摘を受けたのですが、どうなんでしょう。。。(;_;)
-
バグ
Re:Timer関数に関連して質問です;VBをCに変換してます。
FPGAというのが分からないのですが、マイコンみたいなものですか?
Sleep関数も、TIMER.cppもPCのクロックカウントを利用して時間を測っているので、PCから独立したものでは使えないと思います…すみませんm(__)m
Sleep関数も、TIMER.cppもPCのクロックカウントを利用して時間を測っているので、PCから独立したものでは使えないと思います…すみませんm(__)m
-
しっぽ
Re:Timer関数に関連して質問です;VBをCに変換してます。
To バグ-san
FPGA はプログラマブルなゲートアレイ(LSI)で、デジタル回路の動作をプログラム言語で記述して、
ライターで FPGA に書き込むのだったと思います。
----
To hit-san
Visual Basicのコードで書かれたものを、FPGAに実装することはできているのでしょうか?
FPGA はプログラマブルなゲートアレイ(LSI)で、デジタル回路の動作をプログラム言語で記述して、
ライターで FPGA に書き込むのだったと思います。
----
To hit-san
Visual Basicのコードで書かれたものを、FPGAに実装することはできているのでしょうか?
-
きの(初心者)
Re:Timer関数に関連して質問です;VBをCに変換してます。
FPGAへの実装はC言語でないとできないようです。
FPGAに実装するカスタマイズ可能なCPUとして、今回Niosというソフトを使います。
Altera社のNiosのホームページにTimerのデータシートを見つけました!!
これを使えばいいのではないでしょうか?
これは、1秒をセットするタイマーですけど、10ms単位でタイマーを取得するにはどう書き換えればいいんでしょう。。。f(^_^;
#include "nios.h"
int main(void)
{
int t = 0;
// Set timer for 1 second
na_timer1 ->np_timerperiodl = (short)(nasys_clock_freq & 0x0000ffff);
na_timer1 ->np_timerperiodh = (short)((nasys_clock_freq >> 16) & 0x0000ffff);
// Set timer running, looping, no interrupts
na_timer1 ->np_timercontrol = np_timercontrol_start_mask + np_timercontrol_cont_mask;
//
while(1)
{
if(na_timer1 ->np_timerstatus & np_timerstatus_to_mask)
{
printf("A Second passed! (%d) \n",t++);
// Clear the to (timeout) bit
na_timer1 -> np_timerstatus = 0; // (any value)
}
}
}
FPGAに実装するカスタマイズ可能なCPUとして、今回Niosというソフトを使います。
Altera社のNiosのホームページにTimerのデータシートを見つけました!!
これを使えばいいのではないでしょうか?
これは、1秒をセットするタイマーですけど、10ms単位でタイマーを取得するにはどう書き換えればいいんでしょう。。。f(^_^;
#include "nios.h"
int main(void)
{
int t = 0;
// Set timer for 1 second
na_timer1 ->np_timerperiodl = (short)(nasys_clock_freq & 0x0000ffff);
na_timer1 ->np_timerperiodh = (short)((nasys_clock_freq >> 16) & 0x0000ffff);
// Set timer running, looping, no interrupts
na_timer1 ->np_timercontrol = np_timercontrol_start_mask + np_timercontrol_cont_mask;
//
while(1)
{
if(na_timer1 ->np_timerstatus & np_timerstatus_to_mask)
{
printf("A Second passed! (%d) \n",t++);
// Clear the to (timeout) bit
na_timer1 -> np_timerstatus = 0; // (any value)
}
}
}
-
しっぽ
Re:Timer関数に関連して質問です;VBをCに変換してます。
> FPGAへの実装はC言語でないとできないようです。
という事は、「VBをCに変換」なる前提はボロボロですね。
私は FPGA を使ったことはないし、また Altera社のライブラリを知りません
あまりにも特殊すぎて答えられません。アニュアルやドキュメントを読んで
自力で頑張ってください。
という事は、「VBをCに変換」なる前提はボロボロですね。
私は FPGA を使ったことはないし、また Altera社のライブラリを知りません
あまりにも特殊すぎて答えられません。アニュアルやドキュメントを読んで
自力で頑張ってください。