マイコンソフト 悩み事相談室
レス数が1000を超えています。これ以上書き込みはできません。
.
∧ ∧
( ´・ω・) < コンフィグって何? 昆布なら知ってる。 ボラチルって何? ボラは魚だよ。
( ∪ ∪ ,.-、 ,.-、 ,.-、 ,.-、
と__)__) (,,■) (,,■) (,,■) (,,■)
PIC AVR H8 ARM
学校でC言語を習ったことがあるので「楽勝でしょ」って、マイコンを始めたけど、
わからないことだらけ。誰か教えて!
PCとは、別世界のマイコンのソフト。難しいよね。
ツールの使い方、ツールの設定、マイコン特有のC言語の書き方、
「デバッグモードにプログラミングモード。何?」 Eclips, Emacs って何?
VBAしか知らないよぉ、という人まで、
各社マイコンに関するマイコンソフト相談室です。
質問者は、「初心者質問スレ」の>>1を見て、分かり易く質問を書いてね。
回答者は、威張らない、バカにしない、言葉使い注意で、親切に教えてあげてね。
あっ、そうそう。
ハードウェアに関する質問は、それぞれのマイコンのスレに、達人がいるから。
では、質問、ドゾ〜 データx(2〜32767)以上で一番近い、1ビットだけ1になった値yを取得したいんですが
シフトしながら比較ループを繰り返すより効率良いよい方法ってないでしょうか?
for (y = 2; y <= 0x8000; y = y << 1) {
if (y >= x) break;
}
yを例えば0x80から始めて、x以上かxより小さいかでシフト方向を切り替えるって方法も考えられますが
ループ回数がせいぜい半分になるだけですよね。。 この問題は x - 1 について2進表記した場合
1が立ったもっとも大きい桁を求めて
その2倍の桁に当たる数を答えればよい
ういう類のは昔から研究が盛んで
ttp://www.nminoru.jp/~nminoru/programming/bitcount.html
このページでいうNLZが求まれば解ける
(つづく) おいらはこんな風に解いてみた
unsigned short f(unsigned short x) {
short y;
x = x - 1;
if ((x & 0xff00) > 0) {
if ((x & 0xf000) > 0) {
if ((x & 0xc000) > 0) {
if ((x & 0x8000) > 0) {
y = 65536;
} else {
y = 32768;
}
} else {
if ((x & 0x2000) > 0) {
y = 16384;
} else {
y = 8192;
}
}
} else {
if ((x & 0x0c00) > 0) {
if ((x & 0x0800) > 0) {
y = 4096;
} else {
y = 2048;
}
} else {
if ((x & 0x0200) > 0) {
y = 1024;
} else {
y = 512;
}
}
}
(つづく) } else {
if ((x & 0x00f0) > 0) {
if ((x & 0x00c0) > 0) {
if ((x & 0x0080) > 0) {
y = 256;
} else {
y = 128;
}
} else {
if ((x & 0x0020) > 0) {
y = 64;
} else {
y = 32;
}
}
} else {
if ((x & 0x000c) > 0) {
if ((x & 0x0008) > 0) {
y = 16;
} else {
y = 8;
}
} else {
if ((x & 0x0002) > 0) {
y = 4;
} else {
y = 2;
}
}
}
}
return y;
}
5回の比較で求められるがどうだろうか こんなのも考えたがスタックを5段使うから
マイコン向きではないだろう
unsigned short ff(unsigned short x, int i) {
unsigned short y;
int ii;
if (i == 1) {
y = (x > 0)? 1: 0;
} else {
ii = i >> 1;
if ((y = (x >> ii)) > 0) {
y = ff(y, ii) << ii;
} else {
y = ff(x & ((1 << ii) - 1), ii);
}
}
// printf("ff(%d,%d) = %d\n", x, i, y);
return y;
}
unsigned short f(unsigned short x) {
return ff(x - 1, 16) << 1;
} こんなんかいてチェックした
int main(int argc, char *argv[]) {
int x, y;
for (x = 2; x < 32768; x++) {
y = f(x);
printf("%d %d\n", x, y);
}
}
(おわり) >>5
×5回の比較で求められるがどうだろうか
○4回の比較で求められるがどうだろうか
_o_ 表を二個使う。
1バイト実装で1〜32の定数を返すニーモニクがあるなら
32767個並べてテーブルを用意し、その直前の番地で
引数をプログラムカウンタに足して飛ぶ。返り値の1〜32が
(答えのビット位置になるように表に答えを格納しておく)
1〜32ビットの引数から該当するビットパターンを返す内容の行に
変換する二つ目の表での分岐を経て答えを返す。
比較を一切せず、二回のジャンプで可能。 >>10
すごい。
テーブルって、そうやって使うんですね。 ジャンプテーブルもテーブルの一種ですよね・・・
PICの場合はRETLWがあるからPCLに足して分岐させたりできます、ただ、
ページをまたがないように配慮する必要があります・・・ C言語入門者です。
PICで困っています。教えてください。
PIC16F877 xc8 MPLABで、勉強しています。
RS232Cで、PCに1文字送信の練習をしてます。
昨日夕方からずっとやっていますが、エラーが取れません。
while(~TRMT){}; // TRSがEmptyまで待つ
TXREG = 'A'; // 送信文字書込み 送信実行
エラー表示の内容
main.c; 35. mismatched comparison
35行は、while()のところです。
TRMTというのは、送信シフトレジスターのステータスビットです。
前回のデータが残っている時は0です。空きになると1ですので
0をNotしてwhile()を成立させて{}で待つ、という方法です。
この待ちがないと、文字が化け化けになってしまいます。
質問しっぱなしですみません、今日はもう寝ます。ごめんにさい。 while(TRMT == 0);
or
while(TRMT == 0){}
or
while(1){
if(TRMT == 0) break;
}
or
......
iroiro yattemirutoiiyo >>13 こっちではその2行はコンパイル通るよ
PIC16Fってのがみそかなあ
while(~TRMT){}; <- この空文orセミコロンの一方は不要ってのはいいよね
while(~TRMT){} か
while(~TRMT); ね
でもエラーには関係なさそう
それ ここに書いてない35行目より前の行に原因ないですか? データシートみれば分かるけどTRMTはステータスレジスタ中の特定ビット位置に
配置された機能の名称なのでエラー出て当然 while(TXSTA.TRMT==0);
では? >>13です。
みなさん、ありがとうございました。エラーできました。
>>14
ありがとうございます。直りました。助言ありがとうございます。
while(~TRMT){}; TXREG = 'A'; // エラー 何度やってもエラーでした
while(TRMT==0){}; TXREG = 'A'; // OKでした
while(TRMT==0); TXREG = 'A'; // OKでした
while(!TRMT){}; TXREG = 'A'; // OKでした
どうも、僕が~と!の違いを理解していないようです。
>>15
>while(~TRMT){}; <- この空文orセミコロンの一方は不要ってのはいいよね
ありがとうございます。
while(~TRMT){}; ←よく見たら、セミコロン付けていましたね。
セミコロンなしが正解だと思います。
というか、どっちでもエラーにならないのが不思議。どっちが正しいのか。
>>16
ありがとうございます。
>TRMTはステータスレジスタ中の特定ビット位置に配置された機能の名称なのでエラー出て当然
確かにそうなんですが、構造体で定義されているので、今回に関しては問題無く使えます。
以下の記述も試しましたが、他と同じでした。
while(~TXSTAbits.TRMT){} // エラー
while(!TXSTAbits.TRMT){} // OK
ちなみに、xc8のheaderには、以下のように定義してあります。
extern volatile __bit TRMT @ (((unsigned) &TXSTA)*8) + 1;
typedef union {
struct {
unsigned TX9D :1;
unsigned TRMT :1;
unsigned BRGH :1;
unsigned :1;
unsigned SYNC :1;
unsigned TXEN :1;
unsigned TX9 :1;
unsigned CSRC :1;
};
struct {
(略)
};
struct {
(略)
};
} TXSTAbits_t; >>13です。 連投すみません。
! と ~ の違いを調べました。ご参考までに結果を書いておきます。
試したソース
x= 0; a= !x; b= ~x; printf( "x=%02x a=%02x b=%02x \r\n", x, a, b);
x= 1; a= !x; b= ~x; printf( "x=%02x a=%02x b=%02x \r\n", x, a, b);
x= 0b0000; a= !x; b= ~x; printf( "x=%02x a=%02x b=%02x \r\n", x, a, b);
x= 0b0101; a= !x; b= ~x; printf( "x=%02x a=%02x b=%02x \r\n", x, a, b);
x= 0x2c; a= !x; b= ~x; printf( "x=%02x a=%02x b=%02x \r\n", x, a, b);
結果
x=00 a=01 b=ff // a(!x)は、OKかNGしか出さない。結果は1bit。
x=01 a=00 b=fe // 「0」か「0以外」かを、0と1で表すイメージ。
x=00 a=01 b=ff // b(~x)は、8bit全体をbit毎に反転。結果は8bit。
x=05 a=00 b=fa //
x=2c a=00 b=d3 //
ということで、
エラーメッセージの「mismatched comparison」の意味は、
「カッコ内の判定は1bit同士の比較を期待してるのに、
なんで8bitの値を入れて来るの? 比較できないじゃん」
ということのようですね。
そうならそうと、日本語で説明してくれ。俺は悪くない。
ありがとうございました。 >>18
{}は複文、;は空文。
while(式){};という記述は、{}がwhile(式)に対する文として認識され;は次の文として認識される。
文法的には誤りが無いのでエラーにはならない。
複文、空文のいずれでも良いが、今回の場合は「明示的に実行文が無い」という事なので、while(式); の方が意味合い的に近いと思うがコンパイルすればどちらも同じ結果かと。 教えてください。
switch case文が好きで、よく使います。
しかし、ソース記述するときに、インデントは、どのようにしたら良いのでしょうか?
switchは { } なので、forなどと一緒で 次のように1段下げていますが、
switch (xxx){
case xx : break;
default : break;
}
switch (xxx){
case xx : break;
default : break;
}
と言って、言うことを聞かない子もいます。
どちらが本当でしょうか? 好き好きw
グループプログラミングならルール決めるか
エディタが提供するインデントルールに従うとかすれば
私は下派
コロンで区切るってことは ラベル(goto文の飛び先)
とおなじものだと考えているんだろう という解釈で
breakはインデントを下げて書いてる 見逃したとき悲惨なので
switch (argv[1][0]){
case 'a' :
case 'A' :
bf = 0;
break;
case 'b' :
case 'B' :
default :
bf = 1;
break;
} ごめん こうね
switch (argv[1][0]){
case 'a' :
case 'A' :
bf = 0;
break;
case 'b' :
case 'B' :
default :
bf = 1;
break;
} 教えてください。
#pragma についてです。
#define とか、#includeなどの、プリプロコマンド(?)は、
defineだからコンパイラーが読んでいくときに置き換えるんだな、
ここに、別ファイルを入れ込むんだな、とわかりますが、
#pragmaに出会ったときのコンパイラの仕草がわかりません。
PICのときはconfigのセットに使われるようですが、
まさかSunのワークステーションでconfig はないだろうし、
#pragmaに出会ったときのコンパイラー君の動作を教えてください。
処理系で全く違う動きをするのでしょうか? >処理系で全く違う動きをするのでしょうか?
そうです。処理系ごとに固有の機能のために用意されたのが#pragmaですので。 プリプロセサ指令 ( preprocessor directive )
#pragma は、その後に何か書いてそのコンパイラ特有の機能を呼び出すためにある。 >>25, 26
ありがとうございます。
>固有の機能のために用意されたのが#pragmaですので。
やはり、そうなのですか。
そうすると、
#pragmaの動作、記述方法は、各コンパイラーの取説を読まないとわからない、
という理解ですね。
どうもありがとうございました。 MPLABとXC16のの無償版を使っていますが、
warning : あなたの使っているの、無償版だからね。
みたいなwarningが出ます。これを出ないようにする方法はありますか?
以前に、別スレで見たような気もするんですが アチョーッ! じゃなくて、ライセンス認証部をクラックして有償ソフトを無断利用できるようにすること=割る、割られたsoftwareや悪用行為をWarezと呼ぶ。っていうか逆かw 初心者ですが、教えてください。
MPLABのテクストエディターについてです。
1つ目
ソース上のキーワードを選択して、そのキーワードの出てくる箇所を教えてくれる機能は
ありますでしょうか? (機能の名前がわからないのです)
Findだと、そのファイルの中だけですが、
それは、プロジェクトの中の全てのソース、ヘッダファイルも検索してくれるものです。
結果は、新規ファイルを開いて、そこにパスとともに列記され、その行をダブルクリック等すると、
その場所を開いてくれる、というものです。
秀丸などでは、grep(グレップ?)という機能がそれに当たります。
2つ目
MPLABのテクストエディターでTAB=4で設定してソースを書くのですが、秀丸なと一般的なエディタで
それを開くと、整列がおかしくなります。
よく見ると、MPLABでTAB=4に設定しても、1TABと、半角4つでは、位置が異なり、綺麗に整列しません。
一般のエディタと同じようにTAB設定するには、どうとたら良いのでしょうか?
3つ目
コンパイル結果のエラーの青い文字の上で、ダブルクリックしても、ソースの該当場所に飛びません。
以前はちゃんと飛んでくれたように記憶しています。どの設定を触れば良いのでしょうか?
宜しくお願いします。 >>35
えっ? 僕のことでしょうか?
偉そうではないです。
本当は、MPLABで秀丸エディターがうまく使えるといいんですが、
MPLABに秀丸を登録できるのですが、1つ目や3つ目のことができないのです。
それができれは、秀丸を使わなくてもよいのです。 他スレから誘導されてきました。
以前に別のスレで話題になっていましたを回線使う話ですが
だとをユーザーが書くのでそのときの話の対策でできますが
だとを書かなくてもができます逆にユーザーがを書くと
二重定義で怒られます
でを回線使う方法を教えてください困っています PIC24Fで、LEDの光量調整に、PWMを初めて使います。
しかし、1日中格闘しましたが、動きませんでした。
原因
・設定が多くて、それぞれの意味がよくわからない。なぜフォルトが関係あるのか。
・なぜPWMに同期が関係するのか、わからない。
・クロックソースは、システムクロックを使い、16bitのカウンターをフリーで回して、
比較値も1個でいいのに、設定値が2つもある。
・クロック源にタイマーが5本選べるのだが、その周期の設定方法がわからない。
・サンプルを検索しても、16F, 18Fはボロボロ出てくるのに、24Fになると、
一気に無くなる。明日後閑さんの本を買ってこよう。
・データシートが英語で、わけがわからない。
・そもそも、俺がバカという噂もある。
ちょっと情けない1日だった。 >>39
PWMは、PICの周辺モジュールの中でも、一番面倒なものの1つ。
まぁ、ガンバレ。 >>39
http://ww1.microchip.com/downloads/en/DeviceDoc/33035a.pdf
の64.7.3かい?今チラ見しただけだけど、確かに凝ったつくりというのか
あれもこれもと詰め込んだ感じだね。これだけ凝るならWizardでも用意
すればいいのにね。(おかげで一回PSoCすると戻りにくくなる(笑))
とりあえず、PWMの管理はこれが骨でしょ。
• CCPxTMRL as the Timer register
• CCPxRA for the Rising Edge Value register of the next period
• CCPxRB for the Falling Edge Value register of the next period
• CCPxPRL for the Timer Period register
Faultはパワー制御なんかでFETのゲート制御なんかにPWMを
使っていて、何かヤバイことになったときの緊急停止用では? どんなに複雑な機能でもいいけど、
・なぜ、このような機能があるのか
・どのようなときに有効にすべきか
・そして、サンプルコード
が書かれていればいいんだけど、
わかっている人のために、わかっている人が作るから、あのような設定になる。
16FのPWMは簡単だったのにね。
ホントにWizardが欲しいわ。 >>2
xより大きいyなら
xをレジスタに入れて左ビットシフトを行いx==0になったら、
y=1を同じ回数+1回右ビットシフト
x以上のyなら知らん >>39
心配すんな、俺は、PIC24のA/Dに1日かかった。
機能多すぎ。テーターシートの説明悪い。 Microchipのサイトに、セクション毎のデータシート というか使い方説明の日本語訳がある。
モジュールの使い方など、英語ではわかりにくい部分を説明してくれて、とても助かる。
日本語なので、英文のそれに比べて、16倍分かりやすくて、助かる。
ただ、誤記が多い。レジスタ名の番号違いとか文字抜けなど。
編集者は、どんな校正をしているのか、と思う。 教えてください。
#ifdef についてです。
デバッグ時のprintfを埋め込んでおき、簡単にスイッチするのに、#ifdef があることを知りました。
そこで調べてみたのですが、
林晴比古さんの本では、
#defin DEBUG 1
#if DEBUG
printf(....
#endif
と、ありますが、ネットで検索したものには、
#define DEBUG
#ifdef DEBUG
printf(....
#endif
と、あります。
どちらも動くのでしょうが、本来の正しい姿は、どちらなのでしょうか?
また、#define DEBUG だけで、置き換える値なしでよいのでしょうか? #ifdef #ifndef は古くからあるマクロで
#if は後から追加されたマクロです
どっちも使っていいですが
#if DEBUG と #ifdef DEBUGは意味が違います
#if defined(DEBUG) なら #ifdef DEBUG と同等です
詳しくはこちら
ttp://msdn.microsoft.com/ja-jp/library/ew2hz0yd.aspx >>48
ありがとうございます。よくわかりました。ご紹介のページ、読んで見ます。
ちなみに、#ifdef DEBUG 等の文章は、
目立つように、画面の左端から書き出すものでしょうか?
それとも、通常のソースと同じように、インデントを付けて
ソースの中に埋め込んでしまうものでしょうか?
画面左に置くのもいいかな、と思いますが、
せっかくインデントを付けて、流れるようなソースを書いたのに、
台無しになってしまうように思います。
通常みなさんは、どのようにされているのでしょうか? 個人ならお好みで
グループ開発ならなんかルールを決めて
としかいいようがない だいたいマイコンねたじゃなくて
C言語ねただし
わたしの感覚では マクロはコンパイラへの直接指令のような
もので あくまで付け足し C言語とは別物
でもこれは異論百出であろう マクロなくして
C言語なし と思う人多数かも しかし マクロの働きをする
別の仕掛けを用意してもかまわないわけで
ttp://www.sra.co.jp/public/sra/product/wingnut/gcc/cpp-j.html 昨日新旧K&R本(仕事場においてある)で裏をとって
いろいろ間違っていたのでお詫びと訂正
1) #if は新しいマクロ→間違い 古いK&Rにも載ってるよ orz
新しいのは #if の後ろに書ける defined という演算子と #elif
2) マクロはつけたし C言語とは別もの→いいすぎ マクロはC語の一部
やっぱり古いK&R で マクロによって言語を拡張していると書いてある
いろいろ嘘ついてスマソ _o_ >>50,51
わざわざ、ありがとうございました。
>>50で紹介いただいたサイト、面白いですね。思わず読み込んでしまいました。
本にしてもいいくらいの内容でした。
#defineの働きは、すごいですね。奥か深そうです。
ただし、#defineの機能によりソースが簡単に見えても、その実はかなりの行数になっていた、
ということもありそうなので、注意したいと思います。
しかし、面白いページでした。ありがとうございます。 みなさん、こんにちは。PICのC言語で質問があり来ました。
以下の様なことがしたいですが、PICでできるでしょうか?
ソースの途中で
txPC( "Hello" ); // PCにRS232経由でHelloと書く
rx_data = inPC(); // 改行が来るまでの文字列を受け取り、rx_dataに格納する
宜しくおねがいします ありがとうございます。
引数として、'A'とか'B'はできるのですが、"Hello"などの複数を入れると
エラーでてしまいます。
グローバルで text2="Hello"をとって置いて、
txPC(text2)という感じで番号で指定するのはできるのですが、
そうではなくてその都度文字列を渡したいのです。 txPCって関数の宣言ってどうなってんの?
引数は const char * なのか? >引数として、'A'とか'B'はできるのですが、"Hello"などの複数を入れると
>エラーでてしまいます。
なんでこういう連中ってどういうエラーメッセージが出ているか
書かないのかな?
得意のコピペするだけだろうに。 >>55
> エラーでてしまいます。
で、そのエラーはてめえらでエスパーしろとか
俺はパスするわ すみません説明不足でした。エラーが出るというのが間違いです。すみません。
txPC( unsigned char m ){
while( !TRMT ){}
U2TX = m;
}
メインで呼ぶときに txPC('A') という1文字指定は実現しています。
もう1つのやつは、
unsigned char text1 = (略)
unsigned char text2 = { 'H', 'e', 'l', 'l', 'o' };
unsigned char text3 = (略)
void txPC( unsigned char x ){
if( x == text1 ){
(略)
} else if( x == text2 ){
while( !TRMT ){}
U2TX = text2[0]; // H
while( !TRMT ){}
U2TX = text2[1]; // e
while( !TRMT ){}
U2TX = text2[2]; // l
while( !TRMT ){}
U2TX = text2[3]; // l
while( !TRMT ){}
U2TX = text2[4]; // o
} else if( x == text3 ){
(略)
} else if( x == text4 ){
(略)
}
}
という方法で動くのですが、これだと固定文字です。メインで呼ぶときに、
hoge("xxxx")という呼び方で、文字を自由に指定したいのです。
その方法がわからないので、それはまだ作っていません。だから、
エラーが出るというのが間違いです。すみません。
さっき、PICKit3が反応しなくなって、慌てています。 まちがえました。配列です。
unsigned char text2[] = { 'H', 'e', 'l', 'l', 'o' }; でした。 else if( x == text2 )
てのでまずエラーだわねえ
txPCてのがちゃんとうごくなら
int n, i;
n = strlen(text2);
for (i = 0; i < n; i++) txPC(text2[i]);
でおしまいのような ああ,
unsigned char text2[] = { 'H', 'e', 'l', 'l', 'o' , '\0'};
か
unsigned char text2[] = "Hello";
とやってね >>61
それはそれで、if (x == text2) がわけわからんことになるよ
まずはC言語で文字列を関数の引数として渡す方法を調べてみ >>60
引数がunsigned charだから1文字しかわたせないんじゃね。
ポインタを渡さないと。 PICで質問があります。
PCからRS232で文字を受信したいと思います。1回の文字数は3文字です。
PCは必ず3文字送る予定ですが、受信側のPICの都合やケーブルのノイズなどで、
3文字でなく4文字だと思ったり、2文字のまま3文字を待ち続ける、ということもあると思います。
こういう場合の定石は、どのようにすべきでしょうか?
もちろん、ケースバイケースだと思いますが、
・4文字だと思ってしまった場合は、受信データを破棄して、最初に戻り、
1文字目を待ち続ける
・3文字目がちっとも来ない、という場合は、時間で見切って最初に戻る
一般的にどのようにするのが正解でしょうか。 PCからの送信が垂れ流しなのか通信制御するのか
データ化けするかもならチェックサムもいるし
垂れ流しでも応答でもタイムアウト管理は必須
ちょっと色々足りなさすぎてよくわからん
取り敢えず3文字受け取れば良い、なら
・3文字目がちっとも来ない、という場合は、時間で見切って最初に戻る
これでいい >>67
まず受け取れない時に次の文字が来ちゃったとか、ノイズで変な文字になったりしたら、オーバーランとかフレーミングエラーになる(検出できないこともある)
相手も設定できるなら、パリティチェックもできる
> こういう場合の定石は、どのようにすべきでしょうか?
まず、一文字目が確実に判定できるようにする
三文字が ASCII 文字なら、頭に 0x00 をつけるとか、バイナリーなら Base64 でエンコードするとか
エラーになったらそれまで読んだ部分は捨てて一文字目を待つのが基本 おいらなら固定長で考えずEOT(End of Transmission)文字を
決めといてそれを見るようにするな
あとこっちから「こないぞ?」って親側に催促できる機能が
つけられたらつけとく
親から垂れ流しっぱなし って場合は データのはじめかおわりを
表わす文字がくるとおもうのでそれをたよりに通信を立て直すしかない
あとは状態遷移図をさぼらずちゃんと書く
通信はともかくめんどいのでがんばる 最下位層でエラーが起きるのは当然なので、上位層のプロトコルを
作ってそこでエラー検出と始末のつけ方を決める。
今更流行らないのかもしれないけど、一応7階層モデルの考え方とか、
比較的簡単なX.25程度はザッと頭に入れておいて損は無いと思うよ。 教えてください。
採用面接で「マイコン、何が扱えるの?」と聞かれて、PICだと答えたら、
「PICですかぁ〜」と言われました。
決してPICが悪いことはないと思っているいし、自信はあるのですが
露骨な態度に、萎えてしまいます。
世の中のマイコン事情は、ARMとか78KとかH8なのでしょうか?
心が折れそうです。揺らぐ心に、説教してください。 どこ受けたんよ? PIC使ってもんだいなさそうな職種なん? >>72
そこで負けてるようだとお祈りされるかもしれんね >>72
PIC っつーても色々あるから、十把一絡げで答えるような奴はうちでも採用しないだろうな >どこ受けたんよ? PIC使ってもんだいなさそうな職種なん?
やっぱりPICは問題ありなのでしょうか? ていうか、>>72は僕ではありません。
僕は「初めてのPIC」に書き込みました。
誰かが、こちらに貼り付けた用です。 教えてください。電気初心者です。
PICのIOポートで、16bit出力を同時にon/offさせることはできるでしょうか?
例えば、
b_port = 0x1234;
c_port = 0x5678;
と書いたところで、8bitずつ変化してしまい、16bit同時では無くなってしまいます。
これを、16bit同時に「ポンッ」と変化させることはできるでしょうか?
HC573等、外部にラッチを置けばよいのでしょうが、PICのI/Oだけでやりたいのです。
PICの品種は、ミッドレンジでも24Fでもいいです。
24Fだと、GPIOも16bit構成になってはいますが、
連続して16bit取れる品種が見つけられませんでした。 >79
DIP28ピンのPIC24FJ64GA002でもQFP44ピンのPIC24FJ64GA004でも
RB0-15がつかえるはずだけど。16bitPIC(dsPIC30系は除く)で28ピン以上なら
だいたいRBが連続で取れそうだけど。
用途がもしDACなら下記の品種なら16bitDACが乗ってるよ
http://akizukidenshi.com/catalog/g/gI-08458/ >>80
どうもありがとうございました。確かにb_portは連続していますね。
調べ不足ですみませんでした。
16bit D/Aいいですね。 これまではR-2R + OP AMPでしたので、
今度使ってみたいと思います。ADも16bitなら文句なしでしたね。 初心者ですが、教えてください。
MPLAB IDEを使っていますが、
ウインドウ上部に、ReleaseとDebugという選択メニューがあります。
この切替は何のためにあるのでしょうか?
というか、どのようにして使い分けるのでしょうか? デバックモードにすると、最適化しないとかデバック用ライブラリをリンクする。そういうのが無いとソースコード連動でステップ実行とかパフォーマンス測定とかできない。リリースにするとバイナリモジュールが小さくなるし、実行速度が上がる。
PIC使ったことないけど、似たようなものじゃね 目的は >>83 の通りだが、デバッグとか最適化のためだけじゃない
正確にはビルドコンフィグレーションといって、ビルド設定を複数用意して
切替えてビルドするためにある
設定の対象はコンパイラ・リンカのオプションだよ
デバッグ用途の他にプリプロセッサマクロでコンパイル結果を切替えたい時に
マクロ定義をコンパイルオプションに設定したコンフィグレーションを追加したりする 初心者ですが宜しくお願いします。
初めて質問いたします。
PICをC言語で動かしてみたいと思っています。
C言語のソフトとして、MicrochipのX16と、CCSのCコンパイラーがあることまでは調べました。
お金の大小は関係無しで、C言語の初学者が購入する場合、どちらがよいでしょうか?
コンパクトで無駄のない、高速動作のコードを吐く方を買いたいと思っています。 どちらにもお試し版があるので、それを試すと良いと思う。
(CCSにお試し版があったかわかんないけど) >>85 >>86
無料のは最適化に制限が掛かってる場合があるので、要確認。
お試ししてから、最後は有償になるのかな。 すみません、初心者です。
教えてください(>_<)
3V系マイコン→5V系マイコンへ
Nchオープンドレインで通信する場合
High出力の時は入力
(プルアップして5V接続してあるある)にしますよね?
その場合3V系マイコンに5Vが入力されて
破壊されないのですか? 普通はだめ。5Vでプルアップしても3V+αにしかならない。
5V系がTTLコンパチ入力なら3V出力のまま直結でいけるけど。 >>90
ピンに電源電圧以上の電圧をかけていいICは、ほぼ無いと考えていい。
3V出力----レベル変換IC-----5V入力
レベル変換IC = 74HCTxx (T付きは入力敷居値が低い)
レベル変換IC = 74LVCC3245だったかな、秋月に売っている 初心者です。教えてください。
MicrochipのMPLAB 8.92と、XC8と、PIC16F877で、C言語を使っていますが、
エラーがドバーッと出てしまいました。
1ヶ月くらい前に作ったソフトを使って、別のものに改造しようと、
Windows上で前回のフォルダーを丸ごとcopyして、xxx.c と xxx.h だけ残して、他を消しました。
MPLABを起動し、プロジェクトウィザードを順に進み、xxx.mcpを無事に作成しました。
MPLABの左上の窓の「Source File」を右クリックして、xxx.cを全部登録します。
ここでコンパイルをすると、TRISAなんて知らない、PORTなんて知らない・・・と
「はぁ?」なエラーがたくさん出ます。(前回通ったソースなのに何言ってんの?)
そこで、その登録したxxx.cを1つずつRemoveしていき、
xxx.cというmainが入ったファイルだけにしたところ、前回と同じようにコンパイルできました。
ここで質問ですが、
・MPLABの左上にあるファイルウインドウのSource Filesには、何を登録すれば良いのでしょうか?
・Sourceファイルと書いてあるので、xxx.cを全部登録したのに、エラーになる理由がわかりません。
・そこに一部のソースが登録していない状態で、コンパイルが通る理由がわかりません。
もちろん、ヘッダファイル xxx.hもあるのですが、その窓のHeader Fileの部分に登録しなくても
コンパイルが通ります。ここに登録してないファイルがあっても、自身のフォルダー内を見に行くのなら、
いちいちそこに登録する必要はないと思うのですが、どうでしょう?
よろしくお願いします。 プロジェクトウィザードでプロジェクト作ると自動的にXC8・hはインクルードされます >「はぁ?」なエラーがたくさん出ます。
>(前回通ったソースなのに何言ってんの?)
君面白いよ >>94
僕も不思議に思ってる。
通常は、SourceFileのところにmainのあるソースファイルを登録し
その他の.cは、Other Sourceに入れている。Other...に入れれば、
エラー修正の時にも、それをダブルクリックで行けるから、便利。 >>98
登録するのは、そのプログラム特有のソース。(メイク時にファイルが更新されてるか、チェックされる)
標準のヘッダーや、標準ライブラリは、独自に手を加えない限りは登録必要無し。 >>99
>(メイク時にファイルが更新されてるか、チェックされる)
そうすると、>>94の現象が説明できない気がする。
チェックの結果「更新なし」とれば、いくつ登録してあっても問題ないように思います。 教えてください。初心者です。
PIC MPLAB IDE 8.92 + XC16 です。
既存の別プロジェクトを開くとき、project menu の中に、「Recent Project」みたいな
ところがあり、過去のプロジェクトのリストが出てくると思っていたのですが、
ないみたいです。
みなさん、どのようにして既存のプロジェクトに、サッとアクセスしているのでしょうか?
ファイルから、Recent Workspace からでしょうか?
それとも、ProjectメニューからOpen...でしょうか。
あるいは、Windows 上でフォルダ内のxxx.mcpでしょうか?
Projectメニューの中に、Recent Project があり、そこに、過去10個分のプロジェクトがあるとか、
そういうのは無いのでしょうか? ファイルエクスプローラーから、ワークスペースファイルをダブルクリック >>102
ありがとうございます。
やはり、WorkSpaceをダブルクリックですか。
よくある統合開発環境だと、xxx.pjt (プロジェクトファイル)から起動だと思いますが、
MPLABの場合は、WorkSpaveもmcp (MicroChip Project file)の2つがあるのに、
なぜWorkSpaceからなのでしょうか?
xxx.mcpからでいいと思うのですが。 8MHz以上のクロックを外部から入力できて、クロックEdgeからPORT出力までの
時間が規定されていて、Maxで1周期内で外部回路が取り込める(出力遅延時間<<125ns)
マイコンってないでしょうか?
遅延時間自体が問題なので、PORTのトグル自体は8MHzでできなくても構わないです
PIC18シリーズがデータシートに規格が載っているので、いくつかデバイスを調べてみた限りでは
Maxで150ns等とあるのでダメそうです。 >>104
言ってることがさっぱりわからん。
PORTに何を出力するんだかわからんし、外部回路が取り込むって何を取るんじゃら? >>104
何をしたいのか書きなよ
その要件なら、入力と出力繋げばいいんじゃね? の回答しか返ってこないと思うぞ w >>104
マイコンで入出力遅延時間を一定にするのは、
結構大変かと思う。
IF()の真偽で時間は変わるだろうし、割込をした日には、もう何がなにやら。
FPGAを使えば、ほぼ期待通りのものが作れる まぁ、あえて選択するならPSoC3やPSoC5LPかな。 C言語初心者です。PICのCで悩んでいます。
enumの効果の範囲がわかりません。
・例えば、グローバル変数のように置いたときは、全域に対して効く
・また、関数の中に書くと、その関数の中だけの効果になり、他の関数からは見えない
・なので、グローバルの位置に書いた enum { a=1, b, c,d }; と、
関数内部にも、enum { a=2, b, c,d };と書いたとき、全く別物扱いされるのでしょうか?
よろしくお願いします。
この考えは正しいでしょうか? その考えが正しいかどうか確かめるには
・まずそのプログラムを書いてみる。
・コンパイルしてみる。
・シミュレーターで実行してみる。
・結果を見てみる。
・正しいかどうかわかる。
こんなstepを踏めば叶うでしょう。 もし同じ名前で宣言してコンパイラ通るならバグ続出する悪寒… #include <stdio.h>
enum{ a=1};
int
main(){
enum {a=2};
fprintf(stderr,"%d\n", a );
}
>>112
>C言語初心者です。PICのCで悩んでいます。
書き方が分からなくて悩んでるならまだしも、
単に変数のスコープで何で自分で書いて確かめないんだアホ
これがゆとりか? PICのCの標準エラー出力ってどこにリダイレクションされるん? C言語文法のスコープの話に
picも68kも関係ないだろがアホ >>115,117
アホ アホって、感じ悪い人だな。
やめたら? 静かな湖畔の森の影から・・・アホーアホーアホッアホッアホー♪ >>119
己のアホさかげんを棚に上げて開きなおりか?アホ
死んだら?アホ picやる人って、こういう人ばっかり?
AVRでは、親切に教えてくれたのに (システム側のつかっている変数のは重複禁止だった気がするけど
ユーザー定義のものに限れば)
ローカル側が優先されるってだけで同名の重複宣言はできなかったっけ? >>123
こんな便所の落書き掲示板に書かれたことを信用するようなゆとり頭?
親切に嘘を教える事もあるよ。 >>123
>>126
理解できないのはテメエ自身でなくて人様の責任か?えぇヲラ、アホ
感じ悪いのはテメエらだ。死ねゴミ >>128
日常生活でも そんな言葉遣いなんですか? 日常生活じゃガクブルでとても自己主張なんて出来ない
そんなヤツに限って「匿名」を傘にイキガる滑稽さが悲しい
しかも指摘されての逆切れ付き! ゆとり馬鹿の戯言まとめ
その一
>>112
>enumの効果の範囲がわかりません。
>・例えば、グローバル変数のように置いたときは、全域に対して効く
>・また、関数の中に書くと、その関数の中だけの効果になり、他の関数からは見えない
>・なので、グローバルの位置に書いた enum { a=1, b, c,d }; と、
> 関数内部にも、enum { a=2, b, c,d };と書いたとき、全く別物扱いされるのでしょうか?
その二 どこに疑問の本質があるかもわからないゆとり馬鹿
>>116
>PICのCの標準エラー出力ってどこにリダイレクションされるん?
その三 馬鹿でも傷つくことだけは一人前www
>>126
>確かに感じ悪い
その四 己のアホを反省するどころか逆ギレ
>>132
>日常生活じゃガクブルでとても自己主張なんて出来ない
>そんなヤツに限って「匿名」を傘にイキガる滑稽さが悲しい
>しかも指摘されての逆切れ付き!
死ねよアホは >>133
惨めなお前のことだよ、これ>>>132 >>133
じゃ、>>112と>>116の質問に答えてみてよ。
本当は答えられないんじゃないか? >>135
わざわざまんまコンパイルできるように>>115にリスト書いて、
明確に答えてやってるのにアホかテメエは。
どこまでアホなんだ。
しかもPICのCて、スコープが機種依存するとでも思ってるのかこの馬鹿は。
もう死ねよダニ >>134
なんだって?ゴミ
さっさと死ねや。
死ねなきゃぶち殺しに行ってやるから住所さらせや糞野郎 >>137
そのうち通報されるよ、気をつけな。
ほれ、住所w
〒100-8929 東京都千代田区霞が関2丁目1番1号 >>137
ネタにしては面白くない
ネタでないなら気の毒なヤツ
どっちにしても哀れw >>116
ファイルシステム無いから、リダイレクトは無理。
putch() getch() を自前で、作る。 プログラムデバッグするのに、printf()で値を垂れ流しして、テラタームで受信と表示。
あとでゆっくりスクロールして、内容確認しています。
ここで質問なのですが、テラタームを、マウスで 受信start stop する方法はあるのでしょうか?
というのは、右手でマイコン基板のスイッチ操作をして、左手マウスでテラタームを操作しているのですが、
テラタームは、受信した文字を常に表示しているので、これを止めることができずに、
受信画面の文字をカット&ペーストするときに、ドンドンとスクロールしてしまい、
切り出しがうまくいきません。
しかたなく、マイコンの電源をoffにして、送信停止して、カット&ペーストします。
しかし、マイコン電源を切るとPICKit3も認識ができなくなり、いちいち面倒です。
もしテラタームのメニュー等で受信の start stop 機能があるなら、
左手のマウスでテラタームをstopをすれば、マイコン側は操作しなくても良いと思ったのです。
しかし、その機能(あるいは似た機能)が見つけられません。
どなたか、ご存じの方、教えてください。
よろしくお願いします。 >>142
使ったこと無いけどログ機能があるからこれでファイル保存できるんじゃない? Tera Termで設定で「最下行だけ自動スクロールする」のチェックを外すだけでいいのかな? >>143-
ありがとうございます。
ログは使ったことがありますが、面倒かどうかという意味で、外していました。
一旦Logを終了して、秀丸で探してopenしなければなりませんし、
再度テラタームをスタートさせる手間が必要です。
>「最下行だけ自動スクロールする」
って、どこのメニューにありますか? setupのgeneralでしょうか。
少し考えましたら、通信線にスイッチを入れれいいかも、と思いました。
ついでに、クロス、ストレートの切替スイッチも設けて、表示を止めたいときに通信線OFFにする。
作ってみよう。 >>147
日本語でインストールしたからその項目で言うと
[設定]-[その他の設定]-[全般]-[最下行でだけ自動スクロールする]
もしかしたらうまくいかないかもしれないです
今手頃な環境がなくてテストできないので マイコン側に受信する関数を作って
マイコンはprintfを10回するごとに、Tera Termから送信されるキー入力を受信待ちするとかはどうかな?
------------------------------------------
int count = 0;//printfをした回数をカウント
//10回printfをするとTera Termからのキー入力待ちをする
void print10_and_receive_wait(文字列)
{
if(count==10)
{
printf(文字列);
receive_wait();
count = 0;
}
else
{
printf(文字列);
count++;
}
}
//キー入力待ち
void receive_wait()
{
while(1)
{
if(Tera Termから特定文字を受信)break;
}
} >>148,149
ありがとうございました。
今日はセコムかけられてしまったので、明日テストしてみます。
ありがとう はい、またいつでもどうぞ
>>149のprint10_and_receive_waitはマイコンのプログラムのprintfを全置換して使ってね
文字コードに気をつけてね http://ja.wikipedia.org/wiki/ASCII 割り込みをやり始めたばかりです。
7セグのダイナミック点灯を割り込みで実現
させる場合、
while ( 1 )
{
7セグLED表示(1234); // 桁の移動は割り込み
}
同じ数でループしているだけなのに、チラつきます。
せっかく、空ループで無駄時間を稼ぐのから、割り込み
が使えるようになったのに。 よくわからないな
割り込み部分と「7セグLED表示(1234); // 桁の移動は割り込み」が何を意味するのか
もう少しコード(プログラム)をちゃんと貼ってもらわないとこれじゃ把握できないって タイマ割り込みの頻度が低いんじゃねぇの?
ダイナミック駆動ってことはカラムとロウの切り替え順序が逆だと、隣の桁と表示がダブってちらつくように見えるかもしれんな。
俺の部下だったら蹴り入れるな 切り替えたときに1回消さないと
前の桁のが見えちゃってるとか MPLAB X IDE + XC8 でPIC12F629のhexファイルを作ろうとしています。
ネットを参考にしながらLチカは出来たのですが、ライブラリを使用する方法がわかりません。
#include <plib/delays.h> を入れて、Delay1KTCYx(ms);を読んでいます。
コンパイルは通りますが、リンク時に _Delay1KTCYxのラベルが見つからないとなります。
Delay1KTCYx が入っているライブラリファイルをLibrariesに指定すればリンクも成功しますが、いちいちどのライブラリファイルが必要かを調べるのは手間です。
自動でライブラリファイルを取り込むにはどのようにすれば良いでしょうか。 >>152
7セグLED表示(1234); と割り込みはどうやって同期させてるの? 7セグメントLEDのダイナミック表示は結構めんどくさい。
表示したい値の受け渡しは、グローバルで取った表示したい値を、先頭で1回取り込むだけにする。
現在桁のコモン線をoffにする
次の桁の文字パターンをセットする
少し待つ
次の桁のコモン線をonにする
のように、桁移動には全offの期間を設ける。そうしないと、残像が次の桁にも出てしまう >>156
xc8なら、
__delay_ms(xxx)とか、
__delay_cycle(xxx) ←ちょっと怪しいけど、サイクルで待つやつ
とかがあるはずなので、それではダメなの? >>159
delayに限ったことではなく、ライブラリを使うときの話です。 >>156
ライブラリファイルは自分で指定するのが普通かと思うんだが、自動でリンクするってあるのかな? >>161
少なくとも俺は見たことない
そもそもライブラリの指定なんて最初にやるだけだから気にしたことないし >>160
plibはPIC18用
使える標準ライブラリと使い方はは、マニュアルに書いてある。 >>161,162
Windows向けの総合環境だとライブラリのディレクトリを指定してやれば必要なライブラリをリンクするんですよね。
PIC向けだと使用するライブラリを指定するのが普通なんですね。
>>163
PIC18向けの環境ならライブラリは自動リンクするんですか? >>164
Windows の Visual Studio でもライブラリは指定するけど?
ありがちな奴はデフォルトで指定されてるが Win7+MPLAB X IDE + XC8 環境で ICD3で書き込みしようとすると
コネクトエラーになる。
なんでだろう?
swicherのしたにあるwinusbドライバーをデバイスマネージャー
で直接指定して更新してみたがやはりコネクトエラーになる。
ICD3のバージョンが古いのかと思って動いている別のPCのMPLABで
バージョンを確認してみたが最新になっている。
誰かたすけて。 そのICDは過去に使ったことあるの?
僕は初期不良当たったことあるんだよね。 ICDは、直接PCのUSBコネクタに接続していますか? >167
デフォールトでターゲットから
>168
ある。MPLABでは正常動作する。
>169
直接だよ。 初心者です。教えてください。
PIC24Fで、PWMを出力するプログラムを作りました。
それなりにDutyが変化するのですが、値を0にしても
2クロック分の1が出て、零になりません。
何かコツでも有りますでしょうか? プログラムうpしないならエスパーの集うスレでどうぞ
ここ板違いなんで >>172
>ここ板違いなんで
なんで? 何がいけないの? >>171
そういう仕様なのかもしれんぞ
0で0%、FFで100%が出せないPWMは結構ある
その方が回路が簡単になるからなんだけど
PICはそういう所を削って小さく安くしてるから
と思ったけど、PIC24ならそんなことないかもね 0%を0にすると、100%が出ないとか?
H8はそうだった PWMモジュールを割り当ててしまうと、I/Oができないんです。
その都度モジュールをoffするということでしようか? >>177
PULSE STEERING MODEでSTRxを0にすればPORTに出力したデータが
出ると思うが
ENHANCED PWM AUTO-SHUTDOWN MODEでもできる STEERINGって、どういう意味でしょうか。
ハンドルしか思い浮かばないんですが、この場合どういう意味でしょうか 舵を切ること → 何かの方向をかえること → ポートの機能を切り替えること
じゃないかな 電子工作趣味の範囲でビデオゲーム基板みたいなのを作りたいのですが、グラフィックチップで扱い易いのは無いものでしょうか?
パチンコ基板であるアクセルのAGシリーズみたいなのは無理としてもそれに準ずるみたいなのです。
PIC16F88でビデオ操作しましたが32×24ドットの表示しか出来ませんでした。 >>182
PIC でも http://www.ze.em-net.ne.jp/~kenken/composite/ くらいはできるらしい
外付けならアキバで VDP ガチャやるとか (まだやってるのか知らんけど)
後は FPGA で作るとか
まあ、それだったら
http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&No=364
みたいなの買えよってなる気はする >>182 プロッペラー
ttp://akizukidenshi.com/catalog/g/gM-05424/ .
あけましておめでとうございます。
今年も、マイコンソフト 悩み事相談室 を宜しくお願いします。 LPC1114をmbed化して使っているのですが、SDカード書き込みを一定回数以上行うと処理が終了してしまいます
例えば、hello worldとだけ書き込む場合は26回、MPU6050のデータを書き込む場合は20回ファイルを閉じるとそれぞれ処理が終了します
処理が終了するといってもLチカして挙動を確認すると、直前にLEDがついているとつきっぱなしに、消えていると消えっぱなしになっていました
while(1)で無限ループさせようとしているのに、このような挙動になってしまうのはどうしてなんでしょうか?
SDカード書き込みにはSDFileSystemというライブラリを使用しています
SDカードではなくSDHCカードに書き込んでいるのが原因なのでしょうか?それとも何度もファイルを閉じると処理落ちしてしまうのでしょうか?
よろしくお願いいたします すいません、上の書き込みに誤りがありました
正しくはそれぞれ27回目と21回目のファイルオープンで処理が終了しているようです PICのRB0/INTピンって、割り込みを監視しながら普通の入力ポートみたいに現在値を取得することってできるのかな?教えて下さい先生方。 >>190
先生!LATレジスタをググってみましたがストンときませんでした!あと一歩!あと一歩お導きを! >>189
ピンの状態なら普通にPORTBを読めばいいよ >>190>>192
先生方!ありがとうございました! 初心者です。C言語で教えて下さい。
PIC24Fを、MPLABで、XC16でプログラムしています。
#define D1 0x000668UL; // 数値の定義として、このようにして
void test( unsigned char a, unsigned long int b){ // このような関数を作り、
・・・・・
}
test ( 0, D1 ); // defineの値を引数にして渡すと
error: expected ')' before ';' token // このようなエラーが出ます。ところが、
test ( 0, 0x00000668 ); // このように直接数値で書くとエラー出ません。
私の #define の使い方が何か間違っているのでしょうか?
よろしくお願いします。 >>194
#define の行は終わりの ; いらない >>195
さっそく、ありがとうございました。
ご指摘の通り直したら、すんなりと通りました。
どうもありがとうございました。
相談して良かったです。ありがとうございました。 >196
#define で定義したものは、単純に文字の置き換えがされる。
#define D1 0x000668UL;
test(0,D1);
は実際には
test(0, 0x000668;);
となってしまので、エラーになる 人の発言に勝手に補足してくどい奴っているよね
会議とかの時は邪魔だから消えろと思う >>199
ここは会議室ではなく、便所の落書き場だぞ >>198,199
いいじゃない、何がいけないの? おまえか?…便所のエロいラクガキに
デッサンの狂いを正した赤ペン先生はっ
元絵は鉛筆で消せたのに油性ペンで書くんじゃないバカチンがっ!! 教えてください。
PICをC言語で書いています。
通信で送られてきた文字列データを取り出す方法がわかりません。
送られてきた文字 = "123,456, >>206
こういうことでいいの?
int getNum(char *cp) {
int num = 0;
while(1) {
if(*cp<'0' || *cp>'9') break;
num = num*10 + (*cp-'0');
cp++;
}
}
これがあれば、
x = getNum(送られてきた文字);
で、いいかと。 あう、getNum関数の最後に、
return num;
を忘れています。 次々に数字を取り出すつもりなら、
こんな関数を作った上で、
char *cpNext(char *cp) {
while(1) {
if(*cp<'0' || *cp>'9') break;
cp++;
}
return cp;
}
二つの関数を繰り返し呼び出せばいい。 実際にやってみると、こんな感じだね。
int x;
char *cpcp = 送られてきた文字;
while(1) {
x = getNum(cpcp);
cpcp = cpNext(cpcp)
if(*cpcp==0x00) break; // 終わり?
}
関数一つでやってもいいんだけど、
こっちの方がわかりやすいかと。 受信文字列の中から、0d,0aの組み合わせを見つけて、
受信先頭からそこまでの文字列を、別の文字列に入れ直す、って、
簡単にできますか? 今は、
・受信文字列に0d,0aがあるか調べる
・もしあれば、受信文字列の先頭から1文字ずつ取っていく
・前回の文字==0dで、今回の文字==0aなら、その桁数を記憶する。
・0d0aの位置がわかったので、別の配列[count]=受信配列[count] で、
copyしていく。
というのをやっています。 >>212
Do it yourself, man! >>212
簡単にできるかどうか聞いてるんだったら、俺は簡単にできるとか答えるぞ。
そういうときは、もっといい方法がないかって聞けばいい。
C言語も大変そうだが、それよりもまず日本語をなんとかして欲しい。
俺なら先に1文字コピーする。
コピー中のアドレスがcpだとして、*cp==0x0d && *(cp+1)==0x0a なら、
コピーした文字列の最後に0x00(終端コード)を上書きがオススメ。
ポインタ知らないなら、また別の方法を考えないとね。 ポインターは難しいな。
宣言の時には*が付いてるのに、
使うところでは*がないので、何が何だかわからなくなる >>216
宣言の時の*はポインター変数である印。
char ptr a;
とかにしてくれれは良かったのにな。 >>219
typedef char* pchar ;
pchar a;
でいいだろ。 char *p; と宣言すると、
charですので、pの示す番地は、1byte毎に増減します。
でもそのpに入れられる数値の長さは、何byteなのでしょうか? sizeof(char *)
あとcharは1バイトとは限らない ポインタと配列をごちゃ混ぜにするな。
ポインタ変数はあくまでアドレスを格納する変数に過ぎん。
そのポインタの示すアドレスが書き込んでいい場所かどうかなんて他で決定される。 さらに混乱させること言うと、
sizeof(char)はつねに1。 #define PDR (*(volatile unsigned char*) 0xffd9)
上記の文章は、
・ソースの途中で、PDRと書かれていたら、その右側の文字の塊と入れ替えて考えてね、コンパイラさん。
・volatile は、使って無くても消してしまわないでね、コンパイラさん。
・右側の文字の塊の、一番外側の()の意味がわからないです。無くてもいいと思います。
・
これ以上聞かないで下さい。 まっ、どうやればいいのかを考えるのも学生の「仕事」さ。 >>226
unsigned char *p; /* ucを指し示すポインタpを宣言 */
p = (unsigned char *)0xffd9; /* 数値をポインタにキャスト */
*p = u; /* 間接参照で0xffd9番地の中身にuを代入 */
v = *p; /* 間接参照で0xffd9番地の中身を取得 */
*p を最初から PDR と define すれば
#define PDR *( (unsigned char *)0xffd9 )
これで、
PDR = u;
v = PDR;
と書ける。 >>228
>unsigned char *p; /* ucを指し示すポインタpを宣言 */
これは、示す相手の数値のビット幅が8bit(unsigned char)という意味でしょうか?
つまり、
番地 内容
0x12345678 0x12
0x12345679 0x67
0x1234567a 0x22
という感じで、番地の値のbit幅は、32bitかも24bitかも16bitかも知らないけど、
その箱の中身の値は8bitである、という理解です。 >>229
>>unsigned char *p; /* ucを指し示すポインタpを宣言 */
>これは、示す相手の数値のビット幅が8bit(unsigned char)という意味でしょうか?
PDRとか書いているのでH8系で言えば、そう。
ただ、これは発想が逆で、自分が使うMPUがバイトマシンで、ポートマップドI/Oだから、
レジスタを操作するにはメモリにアクセスすればいい、そういうことが前提で、
それをC言語で書くと、という話なので。
コンパイラ上でのcharやintの定義もそのMPUに合わせたものになっている。
さらにそういったiodefineにはレジスタを構造体で定義してビットフィールドも
切ってあるけど、当然移植の際にはエンディアンとかそういう問題も出てくる。
http://csps.hitachi-solutions.co.jp/rx-c/faq/#a05
>という感じで、番地の値のbit幅は、32bitかも24bitかも16bitかも知らないけど、
>その箱の中身の値は8bitである、という理解です。
これもちょっとどうかという話で、自分の使うMPUのアドレス空間、メモリマップ
がわかってないと。 追記
ただ単純にポインタでつまづいてしまっているなら、iodefineを紐解こうと
するのは余計混乱するかも。これはこれで便利なものとして使って、
ポインタと配列とか文字列の取り扱いをPCの環境で練習した方がいいの
かもしれない。 教えてください。
チェックサムの計算がしたいです。
Xorで行う、とのことです。僕が知っているチェックサムは、1byte単位でドンドン加算して、
下位1byteがチェックサムだと信じていました。
Xorでやるのも加算と同じ値が出ると思ったら、違う値になります。
例) 01 02 03 04
加算式=0A
Xor式=04 です。
何が正解なのでしょうか?
よろしくお願いします。 加算と排他的論理和は違うだろ。
あとチェック「サム」なんだから、加算が正解。 >>233
ありがとうございます。
>チェック「サム」なんだから、加算が正解。
なるほど、サムですもんね。大変納得しました。ありがとうございます。
でもネットで検索すると、Xorでやるのもたくさん出てきますので、
何か暗黙の了解なのでしょうか。
でも、自身を持って「合計」で行きます。
どうもありがとうございました。 >>232
xorでやってもいい。決まりごとを決めてそれが検証できればいいのだから。
Wiki
チェックサム (Check Sum)とは誤り検出符号の一種である。(中略)誤り検出その他データの検証
のための符号として広く使われてきた経緯から、俗に誤り検出符号自体の代名詞としても用いられ
る場合がある。例えばCRCの符号値やMD5のハッシュ値を、それぞれ「CRCチェックサム」
「MD5チェックサム」と呼ぶことがある。これらはアルゴリズムが異なりsumでもないため「チェックサム」
と呼ぶことは、語義的には正確ではないものの、「(チェックサムよりも)信頼性の高い誤り検出符号」
程度の意味で使われる。 >>235
ありがとうございます。
>(チェックサムよりも)信頼性の高い誤り検出符号
こういうことですね。
例えば、通常の加算だけだと、1/100の確率で見逃してしまうものが、
Xorのタイプの「チェックサム」だと、1/1000になり、
CRCとかだと、もっとスゴイ。
こんなふうに理解しました。
ありがとうございました。 unsigned char a;
for(a=0; a<255; a++){...}
って書いたら、いつまでも回り続けて、止まりません。
8bit変数でfor()を回して、0〜255の1回だけ回したいのですが、
8bit変数では出来ないのでしょうか?
for()を途中でやめて、
最後はベタで書くというのは考えましたが、格好悪いと思いました。 それだと0〜254のループだな。
ループ内でaを書き換えたりしてないか? a<=255じゃない?
そもそもwhile(1)の中に入ってるとかってオチはないよな >>238
コンパイラ、ターゲット、それからアセンブラ
はどうなっている? >>238
charで255より大きな数は表現出来ない。
ループ変数をintにして、キャストして使えばいい。 unsigned char a;
for(a=0; a<=255; a++){...}
って書いたら、止まらないだろう。
コンパイラが警告してこない? a=0;
do {
...
a++;
} while (a!=0); 質問が2つあります。
1. strcat( str_A, str_B ) のとき、str_AとBを足した文字列長が、
Aの長さを超える場合、Aには、可能な限りのところで切られてしまう、という
理解で良いでしょうか?
2. RS232の受信の場合、受信割込を使用する場合、以下のような考え方で正しいでしょうか?
>>248
1 きいて済ますんじゃなくて、自分で仕様書読んで確認する習慣付けろよ。。。
(最悪の場合、ここで嘘おしえられて損害発生して責任負えるのか?ということ)
C++とかMFC(のCStr)じゃなく、Cの標準ライブラリのものなら、
メモリの管理はユーザーの責任でしょうから
後ろのデータを壊そうが延長しちゃうと思うず。
2 以下?が不明なので語りえない >>249
ありがとうございました。
やはり破壊するかもしれないので、配列を多めに取っておきたいと思います。
2つ目は、書いてる途中で寝てしまいました。すみません。
以下に、改めて書き直します。
2. RS232の送信で、送信割込を使用する場合、以下のような考え方で正しいでしょうか?
1) 送信したいデータを配列に入れて作成、最後に0x00入れる
2) main()で、送信フラグをonする。
3) 別の関数で、
・mainの送信フラグをチェックして、onなら
・割込部の割込フラグ(U1TXIE)=1;
・送信配列の1byte目を送信する。
・終わり
・割込処理は、上記送信の終了をきっかけに、配列の末尾0x00が来るまで、
根気よく1byteずつ送る。
0x00だったら、送信停止して、送信終了フラグをon
・mainは、送信終了フラグ==onにより終了を知る。
受信割込は、外部からの受信信号がきっかけですが、
送信割込は、誰かが1byte送らないと、自発的には送信できないですよね? 大国に囲まれたほぼ無勝、千敗の超〜賎な民は馬や船に乗って押し寄せたヒャッハー
なお兄さん達にGo韓され続けたため、その末裔こそが細目の△△魔となってしまった
のは無慈悲な地政学的宿命。 リアル性器待つ覇者○○○○ハーンと同一のYを継ぐ者
が現在全世界で1600万人もいるが貢献大。恨の文化や歴史捏造癖は、ドラマと異なり
惨めな歴史故だがお陰で若干体格は良くなりましたとさ。 あ〜キムい、キムい。 >>250
PICなら送信可能になったときに、送信割り込みフラグが立つ。
送るものが無いときは、割り込み禁止にする必要ある。 よくある勘違い。
必ずしも割り込み禁止にする必要は無く、フラグをクリアするだけでも良い。 俺が実装するなら配列じゃなくてリングバッファーをつかうかな。 小さなマイコンでの送信ごときにリングバッファなんていらんだろ。
受信にゃ有効だが。 0か1のビットデータが順次送られてきて、たとえば最新32ビットを保持し、
うち16個が1だったらその32ビットを出力してから保持データを捨てる、といった動作をさせたいんですが
効率的な定番の方法ってないでしょうか?
送られてきたビットが1なら個数のカウントに1を足し、もっとも古いビットが1だったら
カウントから1を引いて、データをシフトする、というやり方を
思いついたのですが、どうも個数が16個だったり15個だったり17個だったりして・・
パソコンも実機もなかなか触なくて、いまは仕方なく
効率が悪いですがシフトのたびに1の数を全部数えています。
C言語を使用しています。 それでいいと思う。
32C16=60万通りもあるからテーブル用意しておけない。 適応フィルタってやっぱりFPGAとかでないと無理でしょうか?
ArduinoやPIC、AVR,ARMでは無理ですか? >>260
乗算器や積和計算のできるハードマクロを持つものなら、マイコンでも可能と思う。
でも、FPGAのような並列動作ができないので、相当に高速なマイコンであるか、
処理対象が遅い場合にしか処理が追いつかないと思う >>261
肝は並列動作と高速なのですね。
ハウリングキャンセラーを作りたいのですがFPGAの様なのは扱ったことが無かったので・・・
考えたのは、
マイコンで適応フィルタ。
Psocの様なプログラマブルアナログマイコンで。
マイコン+アナログ回路。
ですが、高速性がネックですね。
やっぱFPGA勉強するしかなさそうですね。 >>260
DSPを内蔵したPICマイコンなら出来そうな気もするけど仕様がよくわからないからFPGAが確実かな。
参考にリンク貼っておく
http://shop.cqpub.co.jp/hanbai/books/30/30991.html 補聴器が高くて同じこと考えてた
花粉症で集中力ないからやれないけど、やりたいねぇ
FPGAの開発環境をはじめからと思うと、是非dsPICでやりたい PSoC 5LPとかを使えばお手軽にそこそこ楽しめそうな気もする >>264
人の声特化とかなら、サンプリング周波数落としてやればdsPICでいけそう どーせじいさんは高音分からんからな 低周波&IIRフィルターでいけると思う
問題は補聴器つくるおじさん(わい)も高音の聞こえが悪いことだ 質問教えてください。
例えばRS232などの通信で受けたデータにより、I/Oをon/offさせるようなプログラムを作るとき、
送られてくるデーターが1byteと短いのなら、
switch(a){
case 'A' : リレー1=on
case 'B' : リレー2=on とか
if(a=='A'){ ランプ2=on とかで、検査すれば良いと思います。
しかし、データが10byteとか長くて、さらにデータ数がの何組かある場合は、どのようにするのでしょうか?
if( a1=='h' && a2=='o' && a1=='g' && ・・・・){
} else if( a1=='w' && a2=='u' && a1=='d' && ・・・・){
} else if( a1=='e' && a2=='s' && a1=='g' && ・・・・){ のように、総当たり戦で調べるのは思いつくのですが、
何かスマートじゃないなと思いまして、質問しました。
宜しくお願いします。 >>268
strcmpで比較
文字列と関数ポインタのテーブル使う やはり、全部総なめで ストリコンプになりますでしょうか? >>270
簡単にやるなら総当たり
凝るならハッシュ使うとか比較する文字列をソートしておいてバイナリサーチするとか >>268
>さらにデータ数がの何組かある場合は
コマンドの後にパラメータが続く様なら、strcmp() 以前に sscanf() で受信データから分割取り出し必要じゃね? 質問お願いします。
論理演算の && || で得られるのは、0か非0だと学びました。
0は0つしかないのでわかりますが、非0というのは、
1、2、3・・・・どれになるかは、処理系(コンパイラー)依存と考えれば良いでしょうか?
つまり、
if( ((a==b) && (c==d)) == 1 ){
というのはダメということでしょうか? ご想像通りダメです。
非0は「true」、0は「false」を使うようにしましょう。 了解しました。
true falseも使ったことないのですが、#define true 0 と自分でデハインを定義するのでしょうか?
ひとまず
if( (・・・) != 0 ){ でいこうと思います。
どうもありがとうございました。 個人的には
if ((a == b) && (c == d))
が好み 定数は左に書いた方が堅いコードになりますお
(タイポやら操作ミスして意図せずに代入式に
なってしまった時に、コンパイラが跳ねてくれます)
if((・・・)!=0){ ... }だと、
if((・・・)=0){ ... }にしてしまったときにコンパイラを通る危険があります。
if(0!=(・・・)){ ... }だと、くしゃみをして偶然if(0=(・・・)){ ... }になってしまっても
代入できねえよボケ!ってコンパイラが怒ってくれますのでより安全です。 >>278
そうですね。
でも、自分がどの辺でミスをするか 自分で自分のことがわかってくると、
意外にif(x==0){でも行けます。
それより間違いやすいのは、
「:」と「;」
「0」と「O」
「6」と「8」
「'」と「`」
「1」と「l」
液晶の解像度が悪いと、どちらも同じに見えてしまい、デバッグが.... >>278
ifで、==の間違いは、さほど起こらないでしょう。
ifの中では==だと注意するから 誘導されてきたのでこちらのスレで質問します。
LCD(ACM0802C-NLW-BBH)を動作させようとしているのですが、上手く行きません。
プログラムでおかしなところがあれば教えて下さい。
LCDは8ビットモードで動かそうとしています。
// LCD用初期化関数
void InitLcd(void)
{
wait_ms(40);
LcdCmdOut(0x30); // 8bitmode
wait_ms(5);
LcdCmdOut(0x30);
wait_ms(1);
LcdCmdOut(0x30);
wait_ms(1);
LcdCmdOut(0x38); // FunctionSet
wait_ms(1);
LcdCmdOut(0x0C); // DisplaySet
wait_ms(1);
LcdCmdOut(0x01); // DisplayClear
wait_ms(2);
LcdCmdOut(0x07); // EntryModeSet
wait_ms(1);
}
// LCD用コマンド送信関数
void LcdCmdOut(unsigned char cmd)
{
LCD_PORT = cmd; // コマンドセット
LCD_RS = 0; // コマンドレジスタ
LCD_E = 1; // Enable
wait_ms(1);
LCD_E = 0;
}
// LCD用文字列送信関数
void LcdStrOut(char *str)
{
while(*str++ != '\0') // nul文字までループ
{
LCD_PORT = *str; // 文字セット
LCD_RS = 1; // データレジスタ
LCD_E = 1; // Enable
wait_ms(1);
LCD_E = 0;
}
}
void main(void)
{
InitLcd();
LcdStrOut("Hello");
while(1);
}
wait_ms()は引数[ms]分だけ空ループを回す関数です。
定数は正確に定義されているものとします。
R/WはVssと一緒にGND接続しています。
main関数にてI/Oポートの入出力は正しく設定されているものとします。
(LCD_PORT,LCD_RS,LCD_Eはいずれも出力モードに設定されています。)
コントラストチェックは行っています。上記プログラムでDisplaySetのcmdをカーソルONにした場合、
起動後一番左上にカーソルがきちんと表示されています。(文字は表示されない。) >>281
向うでコントラストの指摘をしましたが、カーソル表示されてるなら、そう書いてよ。
一応カーソルだってキャラジェネ的には「文字」だからね。
あと、省略形で書いているのかもしれないけど、
LCD_RS = 0; // コマンドレジスタ
LCD_E = 1; // Enable
こういう書き方はおかしいでしょ。
LCD_CTL_PORT &= ~_BV(LCD_RS); // コマンドレジスタ
LCD_CTL_PORT |= _BV(LCD_E); // Enable
ならわかる。 いや、
#define LCD_E RB0
#define LCD_RS RB1
とあって、よく見みたら指定したポートが間違ってましたというオチ マイコンも開発環境もわからないのによくレスできるな。 個人的見解としては、EのL期間が短か過ぎるんだと思う。
230ns満たしてるかな? >>282
すみません、カーソルは表示されますが、上記の場合Helloが表示されないということです。
LCD_RSやLCD_Eはポートなどを示しているのではなく、それぞれの役割を示しただけです。
例えば実際のプログラムは次のようになっています。
// LCD用コマンド送信関数
void LcdCmdOut(unsigned char cmd)
{
PORTC.DR.BYTE = cmd; // コマンドセット
PORT3.DR.BIT.B2 = 0; // コマンドレジスタ
PORT3.DR.BIT.B3 = 1; // Enable
wait_ms(1);
PORT3.DR.BIT.B3 = 0;
}
ただこのような書き方では意味が伝わりにくいと感じたので変更して書き込みました。
誤解を招くようなやり方をしてしまい申し訳ありません。
>>284>>285
マイコンはRX62N、開発環境はCS+です。
しかし私が聞きたいのはこうした環境による問題というより、このLCDの使用方法です。
LCDの初期化手順や、文字を送信する手順などの考え方が間違っていたら教えていただきたいです。
EのL期間が短すぎるとありますが、それは
void LcdStrOut(char *str)
{
while(*str++ != '\0') // nul文字までループ
{
LCD_PORT = *str; // 文字セット
LCD_RS = 1; // データレジスタ
LCD_E = 1; // Enable
wait_ms(1);
LCD_E = 0;
wait_ms(1);
}
}
のようにすれば良いということでしょうか?
秋月で公開されているデータシート
http://akizukidenshi.com/download/ACM0802C-NLW-BBH.pdf
の6〜7ページの意味がよくわかっておらず、このあたりの待ち時間がかなりテキトーに設定しています。
1.文字(コマンド)をセットする。
2.RSをセットする。
3.EをHにする。
4.EをLにする。
という4つの順番は合っているのでしょうか? > LcdCmdOut(0x07); // EntryModeSet
これだとS=1 1/D=1で、書き込んだ後表示全体が左にシフトされるみたい
だけどいいのかな?
0x06でやってみたら >>286
そういうときは、もっと原始的に試した方が、解決が速いかも知れない。
僕がやるなら、
・文字をポインタ私でたくさん表示するのでなくて、まずは1文字だけにしてみる。
・全てのタイミングに1msとかのwaitを入れてみる。
例えば、
void LcdCmdOut( unsigned char cmd ){
PORTC.DR.BYTE = cmd; // コマンドセット
wait_ms(1);
PORT3.DR.BIT.B2 = 0; // コマンドレジスタ
wait_ms(1);
PORT3.DR.BIT.B3 = 1; // Enable
wait_ms(1);
PORT3.DR.BIT.B3 = 0;
wait_ms(1);
}
これで動いたなら、タイミングが悪いので、オシロなどで観察する。
ソースの開示は変に書き換えるより、 PORTC.DR.BYTE = cmd; のほうが伝わりやすい。
(ここにいる人は、つわものばっかりだから、そんな構造体くらいわかるよ)
LCDの使い方に疑問があるような書き方だけど、あなたが他で変な事をしているのかもしれない。
頑張ってください >>286
確かに、私もマイコンや開発環境なんか気にしたくないが、
1GHzのマイコンと1MHzのマイコンでは違うんだから仕方ない。
LCDの使い方言うのなら、LCDのポートの信号をロジアナで取って晒してくれ。 LCDの代わりに、EとかRSにLED繋いだら期待通りに光るん? そもそも、ポートはちゃんと出力に設定されているのかな?
周辺兼用ポートで周辺有効になってて、I/Oに叩いたデータが出てない可能性もある。
>>290 をやって確かめてみるべき。
ひ弱なポートでも、今時の超高輝度LED(赤)+3.3kΩを充分駆動できるで。 >>287
ほんとうですか!今手元にマイコンがないので試せないのですが、試してみます。
>>288
ソースの書き換えは分かりやすいようにと配慮したつもりでしたが逆効果だったようですね。
申し訳ありません。
wait_ms(1)を全てのタイミングで入れてみて試してみます。
>>289
もし訳ありません。次回から気をつけます。
>>290>>291
ポートは出力に設定してあります。
LEDをつないで光るかどうか試してみます。 >>292
>LEDをつないで光るかどうか試してみます。
おいおい… >>287さんの言うとおりでした。
0x06に変えてみたところ、正常に動作しました。
やはりlcdの使い方が間違っていたようですね。
本当にありがとうございました。 Cのソースで、
#ifdef を使うとき、その書き出しの位置は、どこにすべきでしょうか?
例えば、例1、1桁目から書く
namespace ConsoleApplication8 {
class Class1{
static void Main(string[] args){
#if MY_SYMBOL1
Console.WriteLine("MY_SYMBOL1");
#elif MY_SYMBOL2
Console.WriteLine("MY_SYMBOL2");
#elif MY_SYMBOL3
Console.WriteLine("MY_SYMBOL3");
#else
Console.WriteLine("no symbols");
#endif
}
}
}
例2、本文と合わせる
namespace ConsoleApplication8 {
class Class1{
static void Main(string[] args){
#if MY_SYMBOL1
Console.WriteLine("MY_SYMBOL1");
#elif MY_SYMBOL2
Console.WriteLine("MY_SYMBOL2");
#elif MY_SYMBOL3
Console.WriteLine("MY_SYMBOL3");
#else
Cons ole.WriteLine("no symbols");
#endif
}
}
} >>297
どちらもイヤだな。
1は、#ifが出しゃばって、本来のソースが見づらい
2は、なじみ過ぎて、逆に本来のソースが見えない #if使う前提なら、あの2つ以外に記述方法ってあるの?
だから俺は、#ifは使わないんだ。だから代替案出せないんだよ。
そういう>>301は代替案なしの発言 そのままですが、どうなの? >>302
だったらそう書いとけばいいだろ
別におれはソースに対してコメントしてねーし 教えてください。
ウオッチドッグタイマーという機能があります。
常にカウントしているタイマーを、プログラムで定期的にリセットしに行くと
ずっとoffですが、プログラムミスで暴走したときなど、定期的リセットをしなくなると
onして、マイコン全体のリセットをする、という機能です。
質問ですが、
ウオッチドッグタイマを、定期的にリセットしに行く文章は、
一般的に、プログラム中のどこに置けばよいのでしょうか?
・main()の最初に置く
・タイマー割込の中に置く
・両方置く
タイマー割込だけだと、main()ではまったときに困るし、
mainだけだと、その逆が心配です。
ウオッチドッグタイマの時間ですが、どのくらいにするのが一般的なのでしょうか?
定期的にリセットする時間の2倍くらいでしょうか?
マイコンのウオッチドッグタイマは、初めて使うのでわからないことばかりです。 >定期的
いつから周期が一定でないとダメだと思っていた? >>307
つまんねえ揚げ足取りはいいから・・・
>>306
一般的なウォッチドッグの時間なんてない。
システム全体としてこれ以上の時間暴走されると
燃えたり壊れたりするからまずいって時間が基準になる。
そんなのが無いなら1秒だろうが1分だろうが好きにすればいい。 というか、main()の最初でしかリセットしないと、電源オン時に1回しかリセットしないでしょ。
ウォッチドッグで何をウォッチするのか、どの暴走を想定しているのかによって、リセットの
仕方は変わるでしょ。
普通はmain()の中で、while 0とかで無限ループ作って、そこでイベントに対処した処理を
呼び出す形のプログラムになるから、そこにリセットを入れる。 そもそもWDTが必要になるってどんなときだよ?
そんなに手抜きしたいの? WDTの利用で手抜きになる理屈がわからん。
>>312 はもうちょっと脳内想定を開示してくれ。
WDTリセット(暴走)発生を想定しないで、無い物として実装(起動すら)しないのが一番手抜きだと思うが。 僕もそう思う。
止まらないプログラムを作って、その保険にWDTを入れるのだと思う。
入れない方が手抜きだと思う。 でもネットに上がっているプログラムで、
WDT入れているのを、ほとんど見ないけど、みんな使わないのかな? 電源ON→LED点灯→なぜかリセット→LED点灯→なぜかリセット→…
でLチカやってる俺には必要なしw >>318
なるほど。点滅するね。
って、をぃ(^_^; PICについて質問です。
使用しているのは、PIC16F1827でMikroCで書いています。
main()内の無限ループ内で、動作中である事を確認したくて、LEDを点滅させようと思いました。
そこで、下記の様に書いたのですが、点灯と消灯が同じ時間の点滅になると思ったのですが、
動かしてみると一瞬光る>長く消える>一瞬光る>長く光るの繰り返しになりました。
どうして点灯と消灯の時間が同じにならないのかわかりません。
アドバイスなど頂けないでしょうか?
while(1)
{
各種処理
if(kakunin > 2000)
{
if(PORTB.B4 = 1){PORTB.B4 = 0;}
else{PORTB.B4 =1;}
kakunin = 0;
}
kakunin = kakunin + 1;
}
kakunin変数が2000カウント毎にPORTBの4番ピンの出力がHI,LO入れ替わるように書いたつもりです。
よろしくお願いします。 if(PORTB.B4 = 1)
は
if(PORTB.B4 == 1)
が正解かと。 これで点滅が分かるなんて
すんごいクロック遅いんだね。 >>321
PORTB.B4 = (kakunin++ > 2000)? 1 : 0;
kakunin %= 4000;
でどう? >>321
while( 1 )
{
for ( kakunin=0 ; kakunin < 2000 ; kakunin++ ) ;
PORTB.B4 ^= 1 ;
}
じゃだめ? それだと、forに入ったら、他の仕事できないじゃない? んじゃ
while(1){
for ( kakunin = 0 ; kakunin < 2000 ; kakunin ++){
各種処理
}
PORTB.B4 ^= 1 ;
}
ではどうか? 321です。みなさん、レスありがとうございます。
結論から言いますと、>>322さんにご指摘頂いた=が足りない。文法上のミスでした。
修正ついでに長々と書くのをやめてアドバイスを頂きました ^= で反転させるように書き直しました。
修正後はとんでもなく速い速度で点滅したので時間間隔は調整しましたが、
当初のif(PORTB.B4 = 1)の時にゆっくりの感覚で一瞬だけ光ってたのが謎です。
if(PORTB.B4 = 1)だと条件文に書いてあってもPORTB.B4 = 1が実行されてしまってたのでしょうか? >>328
まあ、if()の==はよく間違えるので、早く慣れて欲しい。
=の時の挙動は、知らない。
だって、if()の中で=だけにはしないから、=だけにしたときのことを知ろうとも思わないんだ。
動作中を示すLEDチカチカは、よくやるね。
mian()が固まっていないかを書き人するためのチカチカならいいけど、
プログラム自体の動作モニタとしてのチカチカなら、main()では処理しないね。
タイマー割込で済ますよ。理由は、main()でやるとめんどくさいのと、
各種処理によってLEDの点滅が不規則になり、格好悪いから。
main()の中に目障りに思う。タイマー割込のソースにはワンパターンで
実績があるソースが入れてあるので、そのまま使ってる。
あと、ワンパターン化しているのは、待ち時間のタイマーね。
RS2132の送受信のリングバッファもワンパターン化したいけど、
まだまだ技量が無くて、できていない。 × 書き人するためのチカチカ
○ 確認するためのチカチカ すみません。
文法と言うかCの書き方の事で質問です。
PICですが作例など見ていると、void interrupt()で何の割り込みが入ったかを確認する時に
void interrupt tc_int(void){
if(T0IF){
と書いているのを見かけますが、これは
if(T0IF == 1){
と同じと考えてよいのでしょうか?
ネットで作例を見る限り、MPLABのコードでもMikroCのコードでもどちらでも見かけますが、
コンパイラによって違う以前のC言語の基本的な事なのでしょうか? PICのコードとしては結果として同じなんだけど、
まるっきり同じと思い込むと将来ハマるかもね。
if(T0IF) はT0IFがゼロでなければ成立する。例えばT0IFが2であっても成立。
if(T0IF == 1) はT0IFが1で無ければ成立しない。例えばT0IFが2であれば成立しない。
もしT0IFの定義が
#define T0IF (INTCON & 0x04)
であるならば、T0IFがとりうる値は0か0x04と言うことになり(T0IF == 1)は絶対に成立しなくなる。
無難に同義となるような書き方なら
if(T0IF != 0)
なんだろうね。 >>331
if( T0IF ){ って、「俺は通なんだぜ」と言っているように見えるけど、
間違いのもとなので、>>333のように、ちゃんと書いた方がいい。
真 はゼロ以外 偽 は、ゼロ
と覚えるといい。 いやむしろ、(概念的に)booleanであるものと数値の比較はやめてくれ K&Rのサンプルでも
void strcpy(char *s, char *t)
{
while (*s++ = *t++)
;
}
こうした慣用法はマスターすべきと言ってるよ K&Rは、Cの創始者として尊重するけど
>>336のコードは、今は書くべきではないと思う
Cを理解するには良い例だけど、セキュリティに問題がある >>337
カーニハンはC言語の設計には関わってないし、そもそも創始者って何だよ。 >>336
>while (*s++ = *t++)
これはどういう動きをするのでしょうか?
sとtの位置を1つずつ変えながら、sの中身=tの中身を実行。
代入の結果に「0」とか「1」とか、あるのでしょうか? >>340
代入の結果は代入した値
なので、結果が偽、つまり0が出るまでコピーすることになる >>340
文字列の複写
ポインタtの指している所の内容をポインタsの指している所の内容に代入、
それぞれのポインタをインクリメント後、式を評価。
文字列の終端が\0コピーし終わってwhileを抜ける。
こんなコードはいまどきは推奨されない。
でも、Cなら単純な while ( val )...、 if( val )... ぐらいは書きたい。 >>341
>代入の結果は代入した値
ありがとうございます。代入にも返値があるんですか。始めて知りました。
ということは、
a = ( b = c );
というのは、bにcの値を代入して、その代入した値が a になる。
つまり、a=c; 同時に b=c; という理解で良いでしょうか? >>341
ありがとうございます。
確かに文字列の複写として、本にも出ていますが、
単に数値のcopyという理解でよいですよね? コンピュータは文字か数字かは
わかんないようですし。 >>343
式は値を持つと思えばよろし
a + bは値なわけで、a = bも同じように考える ありがとうございます。
すると、例えば、aは1、bは2、で c = a + b という場合、c=3 になります。
if( a+b ){ と、
if( (a+b) == 0 ){ は、同じでしょうか? if( a+b != 0 ){ と同じ
これにて終了な だからー… if(T0IF!=0) ぢゃなくて
IF(0!=T0IF)と書けと何度言わせるんだおめーら!(^p^) >>349
if(T0IF == 0)とどう違うんですか?
0!の場合は、 = は一つで良いのでしょうか? ヨーダ記法
こんな物を得意げに出すのは恥ずかしいな >>350
!=はノットイコールを示す比較演算子ですよ。
まずC言語の基礎を習ってから、それでも悩ましいときにこちらにおいでくだされ >>349
ヒューマンエラーはゼロにはできないからねぇ
プロの現場では当たり前なのかね >>347
>いつまで「C言語の基礎」を続ける気だ?
いいじゃん。
あんたみたいな賢い人ばっかりじゃないんだよ。 >354
ネットを検索してみると、なるほどたしかに一部で(思慮の足りない人が)
ヨーダ記法は読みにくいとか過去の遺物だと騒いでいるようですが
たとえば
while(定数 == 変数)
みたいな表記を含むコードをデバッグやら 確認やらしている際に
意図せず(操作ミスで)字を消してしまい
while(定数 = 変数)
としてしまう様なバグの発生も、起こりえるわけです。
そういう時にもコンパイラで異常を告げてくれて発覚しやすくなる分
比較的ソリッドな記法なのです。その意味においては!=の際にも
御利益があるわけです。
読みにくいなんていう個人的都合を優先する人も居るようですが
慣れればヨーダ記法の方が読みやすいですお 質問させてください。
Cで、スイッチ文を見ました。
switch ( a ) {
case 1 :・・・・・ break;
case 1 :・・・・・ break;
defolt :・・・・・ break;
}
と書かれていましたが、{が来たなら、次の行は1つ下げるのではないのでしょうか?
switch ( a ) {
case 1 :・・・・・ break;
case 1 :・・・・・ break;
defolt :・・・・・ break;
}
どちらでも動作しましたが、下げないで書くのはなぜなのでしょうか? >>359
消防だけだとお思いか。
>>360
>defolt
default な。
>どちらでも動作しましたが、下げないで書くのはなぜなのでしょうか?
caseラベルがダブってるのにエラー吐かないんか。
それはともかく、下げる・下げないは、コード書く方の都合で、Cコンパイラの解釈的に関係無い。
switch(a){
case 1: ・・・; break;
default: ・・・; break;
}
でも同じ。 >>361
ありがとうございました。
defaultですね。すみません。
字下げの件は、確かにどちらでも動くのですが、
if(){
a = b + c;
}
のように、{ }で挟まれた中身は1段下げて書くのですが、
switch()の{ }では、下げない書き方を、不思議に思いました。
ありがとうございます >>362
下げないで書くのはその人の流儀としか言いようがないんじゃないの 確かに流儀ですね。
その人は、if()の時にも下げないんだろうか、
もしif()の時は下げて、switch()のときに下げないのなら、
その違いを、どのように納得しているのだろうか、
と気になってしまいました。
ありがとうございます。 switch文のあれは結局ラベルだから、アセンブリ言語に親しんできた人は
行頭に置きたくなるのかもしれないと想像します >>364
>>363だけどその人の流儀なんて書いたけど俺もそうやってたわw
理由はVisual StudioのVC++のエディタが自動的にそのように整形するため。
無理に逆らうと余計なエネルギーを使うことになるからね。
中カッコの位置も違う。
switch (a)
{
case 0:・・・・・ break;
case 1:・・・・・ break;
default:・・・・・ break;
} なんで 改行して { 書くのでしょうね。行が増えて判読性が落ちるのに >>367
可読性は人それぞれ
開始の中かっこと終了の中かっこの位置が
揃っていたほうが読みやすい人もいるのだ >>367
俺は中カッコはこのスタイルになれてしまって他所の仕事を手伝った
とき、そこのやり方に合わせて改行しないで書いたら余計な神経を
使うはめになった。 中カッコは、行末だと思う
コメントも、行末だと思う >>360
switchでインデントしてcaseでもインデントすると、どんどん右に行っちゃうから、だからswitchとcaseを同じインデント位置にする
switch { でインデントしてcaseの次行ではインデントしない人もいるみたいだけど、それは気持ち悪いし switch文は、意見の分かれるところだね。
秀丸にはswitchのインデントについて指定できるようになっているみたい。 caseの中で一時的なローカル変数宣言する為に大カッコ書くと更にインデント増えるし foo= [0, 2, 4]
Haskell かよ! 教えてください。
チェックサムという言葉があります。
データ列の各byteを単純加算して、最後の8bitを照合に使用するというものです。
本やネットを見ると、
チェックサムという人もいますし、サムチェックという人もいます。
どちらが正解なのでしょうか?
チェックサム check sum ですので、sumを検査すること のように思いますし、
サムチェック sum check ですので、???? わかりません 計算結果がチェックサム、
計算済みのチェックサムと新規に計算したチェックサムを比較照合する行為がサムチェック C言語の書き方で教えてください。
本などの見よう見まねの独学で、今は以下のように書いています。
main
// タイトル
#include "XC.h"
#include "strihg.h"
unsigned main(){
unsigned char A;
init();
io_function();
while(1){
本文
}
} 390だと、return文がないって警告が出る
かといって、戻らないのに return 0 とかダミーで書くのも変
void main()ってするのが、一番妥当かな
ちなみに、オレはmain()の中の無限ループには
Loop:
色々
goto Loop;
って書いてる。(あんまり賛同者いないだろうけど) さて、390 は何を書くのだろう。o(^-^)oワクワク >ちなみに、オレはmain()の中の無限ループには
>Loop:
>色々
>goto Loop;
それもいいけど、それだとインデントはどのようになるんですか?
やっばり、
while(1){
}
がいいなぁ だからswitch文のあれは中身はgoto文とラベルだと何度言ったら(ry えっ? switch文って、そうなの?
switch (A) {
case 1 : B=1; break;
case 2 : C=2; break;
default : D=3; break;
}
だと、どう書けるの?
if(A==1){ >>387
void main(void)
{
色々
Loop:
色々
goto Loop;
}
インデントが1段省けるのと、breakで抜けたりしない
無限ループだってことを強調できる、っていうのが一応の理屈
まあ main()とタスクのメイン関数でしか出番ないけど >>391
390じゃないけど
if(A==1) goto Case1;
if(A==2) goto Case2;
goto CaseDefault;
Case1:
B=1;
goto EndSwitch;
Case2:
C=2;
goto EndSwitch;
CaseDefault:
D=3;
EndSwitch; >>393
最後はEndSwitch:だとは思うけど、そんな感じですね なるほどね。
そうすると、後ろのほうの条件ほど 判定までに時間がかかるということ? 皆さんとは毛色の違う質問ですみません。
Lチカから始めてる最中の駆け出しですが、MPLAB X IDE
の表示がおかしくなってしまい困ってます。
当方の環境:
使用PC: MAC BOOK PRO 2014年型
OS:OSX yosemite 10.10.5
プログラムソフト:MPLAB X IDE 3.10
コンパイラ:XC8
undoのアイコンを連打して戻していたところ、突然
・改行のところすべてにPの鏡文字の方な記号
・スペースのところすべてに『・』
が表示されるようになってしまいました。。。
ビルドやPICへのかきこみはできるのですが、プログラム作成の際の見た目が
なんとも見づらくて困っています。
ググってみましたが、対処法も探しきれず、マニュアルを見ても見つけられず、
editerあたりの設定なのかと思いいろいろ試しても自分ではどうにも解決できませんでした。
一度アンインストールして、再度インストールまでしなおしたのに、同じようになってしまい
悔しい思いをしています。
http://imgur.com/delete/LixVSjZVJ06u2Gl
このような記号を「編集記号」とか「制御文字』とかいうらしいのですが、
通常の表示(『鏡文字P』や『・』を非表示)に戻すにはどのようにしたらよいのでしょうか?
お知恵をお借りできたら助かります。
よろしくお願いします。 逆に出し方を知りたいんだが、ごめんねマックじゃなくて
便乗だけど
タブがスペースに変換されるので編集で位置ずれ起こすのマジ勘弁 >>399
レスありがとうございます。
この現象が起きるような設定の方法、私も知りたいところです…(ノД`)
そうすれば逆の手順で解決できそうなのに。。。 >>395
テーブルジャンプに変換される場合もある。 ♪ 苦しくったって、悲しくったって、
モニターの前なら、平気だわ
ディスクがうなると、胸がはずむわ
コンパイル、アセンブル
ワンツー、ワンツー、デバッグ〜
だけど、涙が出ちゃう バグだらけだもん。 マイコンソフトくらいなら、
状態遷移図かフローチャート書けば、
自動的に生成してくれるソフト、ないかしら。
あと、文章で書くと、出来上がるとか。
#RA2を、SW_Aとする
#RA3を、SW_Bとする
#RA0を、LED2とする
主ループ。
ずっと繰り返す
もし、SW_Aがonになって、1秒たったら、LED2をonにする。
だけど、1秒未満でoffになった日には、LED2はoffのまま。
(SW_A<<1 + SW_B)の値により切り替える
00なら、LED2を0.2秒で点滅させる。
01なら、LED2を0.5秒で点滅させる。
10なら、LED2を1秒で点滅させる。
11なら、LED2をoffさせる。
いずれでもなければ、LED2は点灯 ttp://www.microchip.com/pagehandler/ja-jp/devtools/code_configurator/home.html >>406
PSoC Express/System Level Designがそんな感じでできたんだけどね。
GUI上で、ステートマシンも書けたし、条件判定なんかも、
GUI上でタイルをぺたぺた貼り付けて出来上がりって感じで。
ただ、処理が複雑になると対応しきれないことも多かったのか、
途中で削除されてしまった。 >>410
結局そういうことだよね
初期でつまづく根性無しのための懐柔策でしかない
続かん奴はどうやっても結局続かん
語学と同じね >>410
PSoC Express Design 無くなったの? あれ期待してPSoC始めようかと初心者本読んでたのに >>402
>ボールがうなると、胸がはずむわ
つまり、おっぱいがゆれると・・・ アラーが貼れと命令した
ttp://images.17173.com/2014/news/2014/04/14/2014cpb0414gif03s.gif あの方々って、人差し指立てるのが好きだよね。
コラージュで指人形つけてやりたい。 教えてください。
C言語でマイコンのプログラムを書いていますが、main()に書く内容は、
どの程度の事を書けばよいのでしょうか? >>417
ありがとうございます。
例えば、
while(1){
if( RA2==1'b1 ){ RB3=1; } else { RB3=0; }
else if( RA==1'b1 ){ RB3=1; } else { RB3=0; }
else if( RA==1'b1 ){ RB3=1; } else { RB3=0; }
else if( RA==1'b1 ){ RB3=1; } else { RB3=0; }
else if( RA==1'b1 ){ RB3=1; } else { RB3=0; }
}
と、詳細なレベルで書くのもありますし、
while(1){
SW_LED( RA2 );
}
と、簡単に書くのもあると思います。
下の書き方は、一見、短くてキレイですが、
mainの変数を引数で持って行かなければなりませんし
答えが複数欲しい場合も、
グローバルで受け渡しをしなければなりません。
どのように考えたら良いのでしょうか? 引数を渡すこと、グローバルを使うこと、これらの何が『あなたにとって』
悪いことなのか我々にはわからない。
必要な情報を構造体にして共有するのもいいだろう。
関数外staticを使ってもいいだろう。
条件も無しにどうすればいいとか十人十色としか言えない。
とりあえず『読みやすければいい』でもいいんじゃないか。 マイコンソフト
http://www.micomsoft.co.jp
なぜかハードウェアしか売っていない会社 >>418
まぁ、最初は全部main()に書いていればいい。
そのうち必要だなってことが感じられるようになる。
必要性が感じられないなら、そのくらいまでしか必要がなかったというだけ。
何事もそうだけど「丸暗記するテストのためのもの」ではなくて、
皆がいろいろやっていく上で必要になってきて作られたものだからね。 C言語で教えてください。
2の条件が整ったとき、○○する、という文章を書くとき、
if( ( ) && ( ) ){ ..... というのはできるのですが、
switch文で書くことはできないのでしょうか?
こういうことです
switch ( ( )&&( ) ){
case xx :
case xx :
case xx :
efault :
}
みたいなことです。 {
case true:
default:
}
でいいんじゃね? >>425
ありがとうございます
質問を間違えました。
2つの条件が異なる場合でした。
例えば、
switch(A,B){
case (A=='あ')&&(B=='い') : 処理1; break;
case (A=='う')&&(B=='え') : 処理2; break;
}
のようにです
宜しくお願いいたします すぐ分かるだろうけど書けません。
ロジックを整理してcaseとifで書く。 さっそく ありがとうございました。
やはりだめですか。
通信で受信した文字組合せによって、処理を分岐したいとき、ifよりswitchのほうが、追加が楽なので、
そうしたかったんですが。
ありがとうございました 質問がとっちらかってるな
もっと具体的に書いたら神が下りてくるだろう なんでぇ そんなことか
switch( unsignedInt (a*256+b)){
case 0x2020: //" "
break;
case 0x4161: //"Aa"
break;
} 間違えたかもw
switch( unsignedInt a*256+b )){
*256は多分コンパイラで a<<8に変換してくれるだろう
シリアルの速度が律速するのだからそこで高速化する必要はあるまい
case文は定数しかダメだから また間違えたかもww
間違えたかもw
switch( ((unsignedInt) a) *256+b ){
かな 実際のコンパイラで確認せんと分からんw >>424以降マイコン関係ないし
素のC言語の基礎的な話はム板に行ってくれた方がありがたいよ いや、内容に問題はないと思う。
通信で受信した内容の判別と言っているから、マイコンで合っている。 >>424 こういうのは?
// 状態変数
typedef enum {
State1;
State2;
....
} State;
State st;
// 受信電文解読関数 戻り値は st = State1 みたいな感じで
// 動作分岐関数
void onEvent(State st)
{
switch (st) {
case State1;
// 処理1;
break;
case State2;
// 処理2;
break;
....
default:
// デフォルト処理;
break;
}
} 実は >>426 は文字コードの問題とか色々難しいようだ。 >>436のプログラムの動作がさっぱりわからない。
俺はアホなのか! まあ「部分」しか書いてないから、state machine 型のコード書いたことないと
分からなくて当然 2キャラクタの判定をするのに、ステートをまわすっていうのも
なんだか大げさな気もするけどね。
まぁ、用途次第ってとこか。 C言語初心者からの質問です。
標準入力した文字列を右シフトで動かしたいのですが、どのようなコードでできますでしょうか?
例として、abcd が1シフト後、 dabc になる感じです。
どうかお願いします。 まず文字コードと文字数をはっきりさせないと適切な案内は出来ないよ
ASC?SJIS?UNI? unsigned char temp;
temp = DATA[0];
DATA[0] = DATA[1];
DATA[1] = DATA[2];
DATA[2] = DATA[3];
DATA[3] = temp; >abcd が1シフト後、 dabc
unsigned long d=0x41424344;
d= (d>>8)|(d<<24); 標準入力した文字列ってことは4文字限定ってことはないだろう
といざ書いてみると何に使うのか判らないなコレ
>>443は何に使うんです?
void str_rotate_r(char *s) {
int i, len = strlen(s);
if (len > 1) {
char tmp = s[len-1];
for (i = len-1; i > 0; --i) s[i] = s[i-1];
s[0] = tmp;
}
} >>451
キャラクタ液晶とかドットマトリクスLED
とかに渡せば繰り返す電光メッセージになるじゃん そういやそんなのもあったなぁ
だったら必要なのって左ローテートの方なんじゃ unsigned long dat[SIZE];
unsigned char c;
int i;
c = dat[i]&0xff;
for (i=SIZE-1; i>0; i--) {
dat[i] = (dat[i] >>8) | (dat[i-1] << 24);
}
dat[0] = (dat[i] >> 8) | (c << 24); マイコンソフトではないけど、久しぶりにExcel VBAをやった。
デバッグに1日かかってしまった。理由は、次の通り。
変数宣言しなくても、好きなところで好きな名前の変数を、突然使える。
変数にタイプミスがあって、これを見つけるのに3時間がかかった。
タブが、常に4スペースで扱われており、とても使いにくく、入力に時間がかかる。
語間が、勝手に1スペースに置き換えられて、自分の好きな形式で書けない。
継続行の±には、_ を使用するが、行末の次に1スペース入れなければならない。
これがわかるまでに1時間かかった。
Excelのセルに「表示形式で2桁、0付き」で設定したのに、セルを取り込むと1桁になってしまう。
文字で取ってきたかと思えば、数字だったり、型がメチャクチャ >>457
いつものエディタで書いて、コピペして使うものだと思っていた。 ExcelのVer?
95だけど、先頭の文字が文字だと文字型、数字だと数値型で
「'12」とか「12A」とかの扱いに困った
97だともうちょっとマシに printf()が重いです。
軽いprintf()ってあるでしょうか?
欲しいのは、"%04x\r\n" とかの書式の部分だけでいいです。
sprintf()でも重いですか? >>460
はい。
浮動小数点の処理が含まれるのでサイズが大きくなるのはしかたありません。
小数の処理のない実装があるのでネットでさがしてください。
具体的なターゲットが書いて無いので細かな紹介は出来ません。 >>461
ありがとうございます。
浮動小数点ですか。複雑そうです。
でも、浮動小数点を使っていないのですが、使わなくてもROM上に乗ってくるのでしょうか? http://japan.xilinx.com/support/answers/19592.html
にメモリの使用量の実例があります。
printfも関数なので含まれている機能を使わないからといってサイズがちいさくなりません。リンクは関数単位になります。 >>460
Microchip XC8 の doprnt.c が参考になる。
define で色々機能選べる様になってる。 乗算命令のないtinyだと10進数で出力すんのも重いし書式なんて使わずHexとByteだけの関数を個々で用意するのよ
>>460の例ならPutHex(u8); PutByte('\r'); PutByte('\n');のように やっぱり、みなさんも1文字ごとに送るのって、やるんですね
ちょっと安心した 10進数だって
100を引ける回数をカウント→100位
余りから10を引ける回数をカウント→10位
余り→1位
で簡単に表示できるよ chanさんのxprintfできまりでしょう
ttp://elm-chan.org/fsw/strf/xprintf_j.html >>457 モジュールの最初に Option Explict のおまじないは必須 >>469
整数のわり算使ってもそれほど遅くならない。
実質クロック1MHz程度のパソコン時代の印象強すぎ。 ☆ 日本の核武装は早急に必須ですわ。☆
総務省の『憲法改正国民投票法』、でググってみてください。
日本国民の皆様方、2016年7月の『第24回 参議院選挙』で、改憲の
参議院議員が3分の2以上を超えると、日本人の悲願である改憲の成就が
決まります。皆様方、必ず投票に自ら足を運んでください。お願い致します。☆ Orangeと言えば、BASICの走る安価なパソコンでしょう >>469
マイナスひゃくをそのアルゴリズムにかけてみたら表示が000になった PICについて聞きたいことがあるんですが、ここで質問しても大丈夫ですか? PIC初心者です。
ダイナミック点灯を用いるとLEDの消費電力はどのようになるか7segボードを参考に具体的な数値を基に考察し、またこのときLEDの表示の明るさについても論じる。
※7セグメントLEDはPARA LIGHT C-551SRを使用。DCは5V
この課題を取り組んでいるのですがデューティー比の出し方がいまいちわからず困っています。
抵抗1kΩ、電圧5Vの場合電流はIはV=RIより0.005Aですよね?
このときのスタティック点灯の場合の消費電力は電流×電圧で求まるので5×0.005=0.025Wとなり、この数値にデューティー比をかけることによりダイナミック点灯の消費電力が求まるのですが、このデューティー比の求め方が分かりません。
一応自分なりに調べた結果、デューティー比とは周期に対するオン時間の比率をデューティーと言うらしいのですが、そもそも周期がいまいちよくわかりません。
例えば、7セグメントLEDが4つ並んでいるとします。左から1234と7セグメントLEDに表示させます。このとき各7セグメントLEDの表示する時間を__delay_ms(100)とした時周期が100msとなるのですか?
どなたか教えていただけないでしょうか?
よろしくお願いいたします。 >0.005Aですよね?
ちがいます。抵抗部分にかかる電圧は、
LEDのVfが減殺されたものになる筈です。
>周期がイマイチ
課題に、PICのソースは添付されてないの?
>左から1234
ダイナミック点灯だと、オーソドックス(※)には
ある瞬間は4の位置のだけ光らせて
別の瞬間は3の位置だけ光らせて
別の瞬間は2の位置だけ光らせ
残像で四個とも点灯しているように見せます。
__delay_ms関数をどう使っているかはソースを読んでください。
(※非オーソドックスだと、7segのabcdefg素子ごとにスキャンする可能性も微レ存?) マルチ投稿が流行りかな
なんか宿題臭い
まず
>抵抗1kΩ、電圧5V
ではスタティック?点灯でも暗くて役に立たない
次に
100msでダイナミック点灯だとちらついて見づらい
そもそも制限抵抗とLEDを1つの抵抗とみなせばP=VIで消費電力計算できる
C-551はアノード(+)が共通
出力をカノード7ポート(−)とアノード(+)4ポート準備する
7個のLEDを同時に点灯(制御)させるのを4回行う
または4個のLEDを同時に点灯(制御)させるのを7回行う
回路図はどっかのサイトを参照しろ「7セグ ダイナミック 回路図」
回路と点灯方法により必要な抵抗の数とトランジスタの数が異なる
ちらつかないためには「1周」するのに0.1秒以内 しまった
カソード(−)コモンだった
アノード(+)7ポート、カソード(−)4ポート
抵抗7つ、トランジスタ4つ
7個のLEDを同時に点灯(制御)させるのを4回(桁)行う
回路図はどっかのサイトを参照しろ「7セグ ダイナミック 回路図」
ちらつかないためには「1周」するのに0.1秒以内 別に無理してダイナミックにする必要ないでしょ
0.1秒じゃ写真映り悪いし 初心者にはダイナミック点灯を教えるより先にシフトレジスタ教えた方がいいと常々思ってる。 >>491
>ダイナミック点灯を教えるより先にシフトレジスタ教えた方が
何の関係があるの? たかが4桁の7セグ表示で何苦労してんだよってことだろ。 すみませんすごく初歩的な質問です
rx62nのブルーボードを使っているんですが、入力で0.5Vを感知するとマイコンから3.3Vを出力し、入力が0.4を下回ると出力が切れるプログラムを書きたいですがA/D変換がさっぱりでかけません
ライターはHEWです。どなたかA/Dの書き方とかご教授願えませんでしょうか >>495
「rx62n adc サンプル」でggrks
12ビットなら1目盛3.3V/4096
10ビットなら1目盛3.3V/1024
0.5V、0.4Vは何目盛か自分で計算白 しかしそんか簡単な内容にRX使うかねー
リセットIC使えって
高専?大学? 研究室がNECからお金もらってるんだろーな
卒論の提出期限って過ぎてるよね PSoCだったら、アナログブロックでヒステリシスコンパレータを作って
CPUは初期設定だけやってあとはHALTしておくっていうことを
しそうな課題だな。 そもそもマイコン使う理由がないよなw
コンパレータ1つでいいじゃんという・・・
ディレイかけたりでもするならマイコンもアリだろうけど
それでも8ピン位のpicかavrでいいじゃんってなるけど 相談させてください。
クイズの早押し回路を考えています。
条件は、
・スイッチの数=4個
・スイッチ信号は、押す=H、押さない=L
・チャタリング=なし の前提
・単独1着を見つけたら、その出力1つだけ=Hにする。
マイコンでやるときは、
while(1){
data = a_port; // スイッチ内容を変数に入れる
switch (data){ // その内容
case 0x01 : // 1人だけなら
case 0x02 :
case 0x04 :
case 0x08 : b_port = data; break; // そのbitを出力
default : b_port = 0x00; break; // それ以外は0
}
}
と書けば、1人だけのときは、発見できます。
しかし、本来同着は まずなくて 必ず単独1着だと思っています。
上記の場合でも、while()のスピード内に2人が押せば、
同着になってしまいます。
while()をもっと速く回すしか、方法はないのでしょうか? 電卓の1、3、7、9からスイッチを引っ張り出す
最上位桁の人が最早 >>502
人間が判別できないくらいの速度で回してれば問題ないじゃないか
まあ、どうしても気になるなら割り込み使え
ソフトスレで言うことじゃないかもしれんが 割り込みだろうがなんだろうがマイコンのクロック周期以下の判断はできないでしょ 同着の時はは乱数で一人選んじゃいなよ。
「それでも俺のほうが早い」といえるほど遅いハードはそう無いだろ。 人間のやることに、10-6秒以下の区別が必要なのか
そもそもチャタリングが発生して、同時押しでも、スパーク消えた瞬間
もう1人に回答権が行くだろうに >>502
あまり厳密に考えると絶対に破綻する。
結局は「それらしく動く」ことが大事 502です。
みなさん、ありがとうございます。
確かに、>>503の言うとおり「どんなに早く回しても同着になるときはなる 」のですが、
できる限り判定したい = 同着判定は無しにしたいと思いました。
最初に外部割り込みを考えましたが、割込を検出してから割込処理に飛んで、ポートの値を取り込むと、
時間がかかってしまい、同着の確立が上がってしまうと思ったのです。
しかし、よく考えてみると、同着結果を出力しなければ良いので>>507のお話のように、
乱数でどちらか決めてしまえば良いことに気づきました。ありがとうございます。
乱数の生成の初期値には、ツェナーダイオードのノイズをA/Dコンバータの変換により
生成して、決して同着を作らないことにしました。
どうもありがとうございました。 http://www.nico video.jp/watch/sm14553716 マイクロ秒の違いなんて人間に認識できないんだから、
優先順位固定かラウンドロビンででいいと思うんだが・・・
まあ趣味でやる分には乱数でも何でもやればいいか。 iPodのイヤホンが壊れました。左の音が殆ど出ません。
(少し聞こえるので断線ではないようです。)
不思議な故障なのですが、フューズが入っていて、
プログラマブルに電流でフューズを切るみたいなソフト制御が動くことがあるのでしょうか?
デジボル(テスタ)は持っていますが、電池切れで今は抵抗値はわかりません。 何がつながっているか分からない場合に抵抗値でスピーカーかイヤホンか判別する機構はあります
代表例としては、PC用のジャックセンス
iPodには多分付いていないでしょうね マ イ ン ド コ ン ト ロ ー ル の手法
・沢山の人が、偏った意見を一貫して支持する
偏った意見でも、集団の中でその意見が信じられていれば、自分の考え方は間違っているのか、等と思わせる手法
・不利な質問をさせなくしたり、不利な質問には答えない、スルーする
誰にも質問や反論をさせないことにより、誰もが皆、疑いなど無いんだと信じ込ませる手法
偏った思想や考え方に染まっていたり、常識が通じない人間は、頭が悪いフリをしているカルト工作員の可能性が高い
靖 国 参 拝、皇 族、国 旗 国 歌、神 社 神 道を嫌う カ ル ト
10人に一人は カ ル ト か 外 国 人
「ガ ス ラ イ テ ィ ン グ」 で 検 索 を ! なるほど抵抗値を測っているのですね。
イヤフォンも安価なものは1000円以下から、高いものは数万円までしてどれがいいのかわかりません。
A.T.社の音質はどんなものでしょうか。
純正品が無難ですか?
有名なネット販売社にもAPL純製品の偽物安価品が(沢山)出回っている情報が寄せられています。
家電量販店にも偽物が沢山出回っているのでしょうか。
本体も偽物が出回っている話はよく聞きますが、偽物への輸入規制はできないのでしょうか。
安かろう悪かろうは困っています。 迷ったら、偏差値80の価格のものを買うことにしてる /:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ヽ
/:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::://ヽ:::::::::::::::|
l:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::// ヽ::::::::::::::l
l:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::/:::「'ヽ:::::::::::// ヽ:::::::::::|
|::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ノl:::ノ l:::::::/ ヽ::::::::|
ノ:::::::::::::::::::::::::::::::::::::::::::::::::::::/ ゙゙ ノ:::/ ,,;;;;;;,, ,,,,ヽ:::::l
):::::::::::::::::::::::::::::::::::::::::::::::/ ノ/ __,'''i: ('''__):::l
)::::::::::::::::::::::::::::::::::::::::::::::::::/  ̄ ̄ン:. :「 ̄`ヾ
1:::::::::::::::::::::::「 `┤l:::::::::::::::::l  ̄ , ヽ ̄ l
`l:::::::::::::::::::::ヽ :l li:::::::::::::/ /´ `l | <ヴッ!!!
ヽ::::::::::::::::::::::\_」 lヽ::::/ !:-●,__ ノ /
ノ:::::::::::::::::::::::::::ノ | l `゙゙ ,,;;;;;;;;;;;;;;;;;;;;, /ヽ
,/ ヽ::::::::::::::::::::::( l l::::::::.. /.:''/´ ̄_ソ / `ヽ
ヽ:::::::::::::::ヽ | l:::::::::::... /::// ̄ ̄_ソ / \
ヽ:::::::\| l::::::::::::::::... / :::.ゝ` ̄ ̄/ / ヽ
ヽ:::l l:::::::::::::::::::..  ̄ ̄;;'' / ヽ
l l;;;;;;:::::::::::::::.....;;;;............;;;;;;''ノ l
l l '''''''''''''''''''''''''''''''''''''' ̄l | |
https://www.youtube.com/watch?v=dFj6B-dIKY8 その後、カナル型ステレオイヤホン買ってきました。iPhoneで使うには十分な音質でした。
しかし、macbookで使うと音質がだいぶ落ちます。macbookの音質が優れているので気になります。
今のところ沢山出ている1000円の日本製TV用ヘッドフォンがベストの音質です。
iPhone iPad等の偽物は、誰かが外国のその工場のラインを使って、設計情報もそのまま
使って作っていると思われます。オリジナルで簡単に真似できるレベルではないので、闇の生産・販売ルートがあると思われます。
外国によっては市場が大きいので安くてもかなり利益がでるのでしょうかね。 初心者ですが質問です。
RS232の出力をPWMのように制御できないでしょうか?
送信終了割込を使って、byte間に間髪入れずに送信して、
start bitは、常に0で、stop bitは、常にHとして、他のbitを制御するというものです。
data = 0x00 → 0000000001000000000100000....duty 最小
data = 0x0f → 0000011111000001111100000....duty 50%?
data = 0xff → 0111111111011111111101111....duty 最大
という感じです。 >>520
何を聞きたいのか分からないよ。
原理的に合ってるか不安?
実装の仕方がわからない?
やってみたら? >>520
3bitPWMができますね。
送信完了割り込みじゃなく送信データレジスタ空き割り込みで
間髪入れない連続送信ができますよ。 00 01 03 07 0f 1f 3f 7f ffで9パターンか
大した分解能は得られないな
ボーレート倍々にして複数バイト使うとか でも、CRで積分すれば、立派に直流電圧調整になるような気もします。
I/Oピンが足りないときのこそくな手段ということで。 教えてください。
EEPROMにデータを書くときに、悩んでいます。
EEPROMに書き込み途中で電源を切られても大丈夫なように、
A, B の2ページの書き込み領域を持って、書き込む度にA, B 交互に使っていけば、
途中で電源offされても、最悪、前回の値は残っていることになります。
そして、どちらのページを読めばいいのかを示す番地を設けて、
Aに書き込んだら、その番地に「A」と書いて、読み出す時は、その番地に書かれた文字により、
読み込み先を判断すれば良いと思いました。
我ながら名案だと思ったのですが、困ったことがあります。
データ書き込み後に、その特定番地に「A」とか「B」とかを書いている瞬間に電源offにされたら、
どうしよう、ということです。
AでもBでもない文字に化けてしまったら、読み出すときの指標がなくなってしまいます。
何か解決策が有るでしょうか? >>526
それをどこに書いたかを特定番地に「C」とか「D」とか書いておけば・・・ @化けてたらROM上のデフォルトで上書きする
AEEPROM更新中は電源切るなって運用にする
B電源監視回路で化けそうなタイミングであれば書き込みを実行しない。 マジレスすると、CRC付けといてチェックすれば?
2つあったら新しいほう使うとかで。 >>525
書き込みを開始する直前に、そのページ名を書く番地も用意する。
完了後の起債と同一でなければ、書き込み中にコケたと判断できる。 AとBの大きい方のシリアル値のほうを使う。
保存はシリアル値をインクリメントして小さい方に書き込む。
$ffffに達したら$0000と$0001にラップアラウンドする対策を忘れない。 なにをもって「新しいデータ」と判断するのか・・・・
完了後って電源切れてるのにプログラム走ってるのか・・・
シリアル書き込みでエラーとなってしかも大きな数字になったら・・・
さぁ盛り上がってまいりました。 2つだと新しいのがどっちか判らないから
3つ以上で冗長化するといいよ
A[DATA][S/N] B[DATA][S/N] C[DATA][S/N]
として書き込みは[DATA]→[S/N]の順にABC順繰りに書き込んでいく
S/Nはバイト値で255→0→1→2のように順繰りにする
ブート時はABCを読んでS/NがN N+1 N+2の関係の新しい値を最後と判定する 面倒くさいから、書換えが終了するくらいの時間は持つように電源回路を
工夫する。 Aデータを書いてから、最新を示す3つの番地に、「A」、「A」、「A」を書く
Bの場合も同じ
読む時は、
3つの番地の先頭番地の内容を読む。
値がAならAページを読む。Bも同様。
値が、正しく読めなかったら、そこでこけているので、次の番地の内容を読んで、
そのページを読む。
3つの番地の内容が、
AAAなら、Aページが正しく書けている。
A??でも、Aページは正しい
?BBなら、Aページはこけている。2番目の内容であるBページを読む。ただし、一世代前のデータである
こんなんで、どう? とっくに正解出てんだけどな。
>>528のBと>>535 データの更新をしています。
電源を切らないでください。 >>537
運用で逃げるんじゃなくて、プログラム技術の話をしてるんだけどね >>525を何回も読んだが「プログラム技術で」何とかしたいとは書いてないし、
電源監視回路は運用方法ではないぞ。
横道で騒ぐのもいいが正当な対策方法も教えてあげなきゃ。 同じデータを書けばいいやん
ほんで、データに連番のシリアルナンバーふって
頭には前回のシリアル番号
最後尾に書き込むデータのシリアル番号
頭と最後尾のデータが連番になってたら
書き込まれている
連番じゃなかったら途中電源遮断やね
その場合はもう一方のデータで
コントローラ側がちゃんと電源低下でリセット掛かるのが
大前提だけど 偶然最後尾の連番が書き込まれる場合があるかもしろんから
最後尾の後には、何らかの誤り検出数値入れた方がいいねえ 冗長化しても半端な電圧が続いたら書いたデータが全滅してるかもしれないので
ブリーダ抵抗を入れよう 運用で逃げたり、ハードウェアの力を借りれば、
簡単に解決することくらい、質問者だって100も承知だと思うよ。
スレタイだってそうであるように、ソフトで解決する議論をすべき。 >>545
電源が不安定が前提じゃどのみちソフトで解決しようがない
マイコンに限らずPCだってそうでしょ >>546
出来る事と言えば、データが壊れているかの判定を工夫する事位だな。 >>545
本来はハードで対策すべきってことすら知らない可能性は考えないんだ。
思い込みって怖いな。 >>545
>>525が書いたのを読む限り
データを確実に書き込む方法は
考えなくて良いでしょ
前回書き込んだのが保存されてれば良いだけ
な感じがするんだが >>525
> A, B の2ページの書き込み領域を持って、書き込む度にA, B 交互に使っていけば、
> 途中で電源offされても、最悪、前回の値は残っていることになります。
この前提なら最後に書いた読み出しフラグが正しく書けてなくてもデータは正しく更新されてるから
どっち読んでもいいってことじゃないの? だから、書き込み後に、最新ページを示す文字を複数バイト持てと言っている そして書き込むデータ量がどんどん増えて、
エラーの確率もどんどん膨らむのであった。 >>556
書き込み不良が発生したかどうかが解らないから。 だから、最終ページを表す文字が偶然
他方と同じに化けたらどうすんだと言っている >>558
化けるのはデータとは限らない。
アドレスが化けたら、何処が書き変わるかわからん。 信用できないものを信用出来るようにする?
それは論理的に矛盾している。 単純にならECCでエラーを減らす方向じゃない?
検知範囲を広げればメモリ効率は上がるけれど修正出来る量が減るからね。 > 検知範囲を広げればメモリ効率は上がるけれど修正出来る量が減るからね。
??? >>563
データにエラーが有るかどうかが分かれば良いから、CRC 追加くらいで良い。
今時のマイコンならCRC 計算用のハード付いてるから、処理も簡単。 考えてみればCPUって怖いな。
アドレスバスやデータバス、コントロールバスで1秒間に何千万個(何億個?)のビット情報をやり取りして、
そのうちの1ビットでもノイズなどで0/1が反転すれば、
とんでもない事になる可能性がある。 >>525
CRCでもかけとけ
んで起動時にCRCを読んで有効な方を読む
両方CRCが有効だったら日付(か通し番号など)が新しい方を読む
当然日付(通し番号)は保存するごとにデータの一部に入れとく
以上 この手のエラー対策って、
定電流源からバチンと電源スイッチを切る場合と、
電池が電源で徐々に終止電圧まで放置みたいな場合とで全く違ってきたりしないかな
前者ならこれまでだらだら書かれてる通り適当にチェックすれば良いと思うけど、
後者はまずEEPROM書き込みを打ち切る基準の電圧を検出する方が先じゃない? >>571
今時のマイコンなら、ブラウンアウトリセット位付いてるだろ? >>572
それだけだと、書き込みルーチンの途中で打ち切られちゃうことが
おきるからダメ
マイコン・EEPROMの電源が同じレギュレータからとってるとしたら
そのレギュレータの入力を測って、一定の電圧以上であることを
確認してから小さなブロック単位で書き込む >>576
だよ
だから無効データとして使わないことにすればいい
無理に使って誤動作することの方がだめなので >>577
途中で止まったらそのブロックはエラーになるから、ひとつ前のデータを使えば良い。 エラーかどうかの判定が難しいと思う。
>>579の話は、堂々巡りな気がする。 データが書けたのを確認してから通番を更新すればエラーのチェック
は必要ないと思うが EEPROMの内部動作の知識ないんだけど、書き込みコマンドの実行中に
電源電圧が落ちたときって、書き込み中のブロックにしか影響ないって
保証されてるものなの?
他のデータが破壊されたりすることって絶対ない? 書き込み中に電源ぶっちされたらどうやってもやばいのか
昔のパソコンてシャットダウンて概念が無くていきなり電源切れたとか言うけど
あれはどういう仕組みだったの >>588
それはパソコンじゃなくてOSの話じゃないの? 電源保護機能付きのなら
書き込み途中でも他の領域を保護するので大丈夫
書き込み領域は保護されない
昔メーカに問い合わせたらそんな回答だった
なのでCPU側さえ電源監視してればオッケーだよ そうかUPSみたいなの付ければよくね?
ノートパソコンは停電に強かったりするよね
311の時も助かったよ 教えて頂けますか。
RS232Cの通信で、STX ETX というのがあります。
スタートテキストとエンドテキストの略のようで、0x02, 0x03です。
これは何のためにあるのでしょうか?
先頭にこれを置いてから文字送信を開始すると、何か良いことがあるのでしょうか。
「これから文字が始まりますよ」という意味だとしても、ノイズで1bitずれたら
0x03になり「文字はここまでですよ」という意味になってしまいます。
どの文字を持ってきても、化ける可能性はあると思いますので、
STX無しに、いきなり文字を送信しても良いのではないか、と思うのです。
それとも1文字受けてからのほうが、受信側の暖機になって良いとか、でしょうか STX、ETXがなくても困らないような通信であればなくても問題ない。
STX、ETX(さらにエラー検出符号)があると化けたデータによる誤動作の心配が減る。
STXが化けてETXになったならその電文を捨てるだけなので何ら困ることはない。
単純な電文なら最後にCR付けるだけなんてのもいっぱいあるよ。 >>593
ありがとうございます。
>STX、ETXがなくても困らないような通信であればなくても問題ない。
ですよね。だと思っています。
>STX、ETX(さらにエラー検出符号)があると化けたデータによる誤動作の心配が減る。
この理由は何でしょうか?
エラー検出符号は置いといて、STX, ETXがあると、誤動作の心配が減るというのがわかりません。
>STXが化けてETXになったならその電文を捨てるだけなので何ら困ることはない。
ETXに化けるのは話の都合上の例でしたが、データが化けて電文1行欠落は良くないんじゃないでしょうか。
単純な電文なら最後にCR付けるだけなんてのもいっぱいあるよ。 パケットの考え方は「エラーが起こったパケットは捨てて再送要求する」のが前提。
つまり電文欠落なんてのもあって当然。
ノイズがスタートビットに見えてごみバイトが発生するかもしれない。
だからこそ「ここ(STX)からここ(ETX)まで」が必要になる。
受信アイドル中にある1バイトを受信したときに、
それは電文の一部として記録すべきバイトなのか、
捨てていいバイトなのかどうやって判断します? >>595
BASICコンテンションの話なのにパケットはないだろ
TCP/IPは7Fの連続で同期取ってるだろ BASIC手順だってパケット通信
SYNで同期とってる 「パケット」って表現が不適当ならばごめん。
「電文フォーマット」にでも置き換えて。
要は電文が正しいかそうじゃないか判断するフォーマットとして
STX,ETXってのもあるよと伝えたかったんだが、もっとうまい説明頼む。 ちなみに、BASIC手順は非同期通信じゃなくて同期通信
592〜594の話は、BASIC手順(的)なフォーマットを
非同期通信に流用する話だね >>597
だがフィリップカーンがパケットの概念示すまでパケットと言わなかったような気がする 先頭バイトが送信バイト数だとかチェックサムだとか各社色々だよね 昔、BSCで色々行けた記憶あるが今は各社バラバラだね BSC自体は598が書いてるように同期シリアルの規格だけど
世の中では同期シリアル使ってるところは例外的だから
非同期シリアルにフォーマット流用してるのは「BSC風」フォーマットに
過ぎないからね 固定電話のナンバーディスプレイのMODEM信号はSTX, ETXにCRC付けてる STX発生後は、0x00〜0x1fの間は、絶対にないよ、という意味だろうか? PICマイコンで、プログラムをして遊んでいます。
Cの書き方について質問があります。
本とネットの独学なので、正しい書き方でやっているのか、不安で質問しました。
1. ヘッダーファイルには、何を書くのが正しいのでしょうか?
私が書いているのは、
・PICのconfigrationビットの設定(#pragma...です)
・#define xxxx X
・I/O入出力方向 (TRISです) >>608
複数のソースファイルに入って分ける時に、共通して必要になるものを書く >>609
なんか変になった
複数のソースファイルに分ける時ね ありがとうございます。
複数のソースファイルに分ける、というのは、どういう事を言うのでしょうか?
すでに、そこがわかりません。すみません。
例えば、以下のような内容が、1つの "hoge.c" にまとめて書けば、ソースを分割する
ということは必要ないと思うのです。
-------- 1つのソースの始まり --------
#include "xxx.h" // メーカーの作ったヘッダファイル
void SW_input(){ // 自作の関数
...
}
__intrrupt xxx(){ // 割込処理
.....
}
int main(){
各種初期化
while(1){
主処理
}
}
-------- 1つのソースの終わり -------- >>611
1つのソースファイルで済む規模なら、ヘッダファイル作らなくてもいいと思う
大きいプロジェクトになると関数とかネームスペース毎にソースファイル作ったりする ソース分割する必要が無いならヘッダを別に作る必要もないでしょ。
ヘッダファイルを作ることが正しいとかじゃなく、作った方が良いなら作る。
ソースを分けるのは機能ごとに見やすくするためであったり、流用しやすくしたり、
複数の人間で分担したり、分けた方が都合が良いから分けるんであって、
絶対に分けなければならないってことはない。 >>611
そのとおり
分割するかどうかはある意味好みの部分もある
例えば、LCD表示はLCD.cとLCD.hにしてあるけど
configやTRISは分けてないなあ >>607
基本的にはキャラクタベースのデータフォーマットで
任意のバイナリーデータ送るときは、確かDLE(Delimitter)
の後に続ける・・・というようなのが本来のフォーマット
だったはず
バイナリーデータの終わりはどうやって見つけるかは覚えてない^^; >>612-614
ありがとうございます。やはりそうなんですね。
疑問が解けて嬉しいです。
友達に聞いたら「なんでヘッダファイルつかわないの?」と、さも使うもの(must)と
言うので、疑問に思っていました。便利に見える方法でいいんですよね。
関数毎にソースを分けた場合、メインと関係づけるのは、
#include "xxx.c" と書いて、コンパイラーに、その場所に置いてもらう、
という方法で良いのでしょうか?
これも友達が、#include "xxx.lib" でリンカーで結合しなきゃ、と、
これまた「それが当然」のようなことを言うのです。(ちょっとイラっと来てます)
どうなのでしょうか。いまいちリンカーというのがわからないのですが。
昔ほどPCが遅くないので、常にフルコンパイルでいいじゃないか、と思っているんですが >>616
なんかもういろいろおかしい
分割コンパイルについて書いてある本買ってきた方がいいぞ >>616
どういう環境使ってるのか分からないけど、今はIDEに
色々サンプルプロジェクトがついてるのが普通だから
それを片っ端から開いてみれば、一般的なプロジェクトの
作り方・構造が分かると思うよ >>617,618
ありがとうございます。
>>617のページは、素晴らしいですね。一気に読んでしまいました。
全体の半分くらいしか、意味わかりませんでしたが、勉強したいと思います。
ありがとうございました。
そもそもの話ですみません、ヘッダファイルというのは、どのような理由で生まれて来たので
しょうか。ソースの先頭に付けるからヘッダなのかなぁ、と思いますけれども、
別に xxx.h としなくても、xxx.c として、#include すれば良いと思うのです。
すみません。 xxx.h とするのは慣習だから、xxx.c としても文法的にはかまわないけど
普通は実行コード(ざっくばらんに言うと関数定義)を含む
ソースは xxx.c とし、含まないのは xxx.h とする
xxx.cをincludeするっていう技法も、過去には分割コンパイル・リンクの
できない環境で使われてたことがあるよ どのような理由で生まれて来たか、っていうのはCの本でも読んだほうが
いいと思うけど、1例としては複数のソースで使う定数に名前を
つけたい、っていうのがある
#define M_PI 3.14159 /* みたいなやつ */ コンパイラ=>アセンブラ=>リンカ=>ロケータ=>コンバータ
^
|
コンパイラ=>アセンブラ=>ライブラリアン 興味の湧く話で勉強になっています。僕も1つ教えてください。
Cには構造体があります。あまりの便利さに最初に見たときは、とても感激し興奮しました。
質問なんですが、アセンブラにも構造体や共有体があるのでしょうか?
それとも、ひたすらシフトとANDとORでやるのでしょうか? >>625
変数って概念無いし、当然、型も無い。
有るのはメモリーだけ。 ありがとうございます。
やはり無いんですね。そうすると、switch()も無さそうですね。
了解しました。ありがとうございました >>628
条件分岐命令は、フラグが立っているかどうか、だけしかない。
ただ、プログラムカウンタに直接アクセス出来るので、switch 的な分岐は作りやすい。 >>629
>条件分岐命令は、フラグが立っているかどうか、だけしかない。
BNE アドレス
BEQ アドレス とか
というやつでしょうか。 XBASICで初めてcもどきを体験した
戻り値が1個なのに愕然とした。使えねーじゃん
でも戻り値に構造体が使える事にきがついた あらとっても
べんりじゃーん 最近はたくさんある引数も構造体でまとめて与えるのが主流かな
個別引数だと順番覚えるしかないけど、構造体のメンバーは名前で
区別できるし、最近の開発環境だとエディターのドロップダウン
リストから選ぶだけで記述できるから >>633
>void hoge ( &a, &b ) {
この意味がわかんないです。
>>634
>最近はたくさんある引数も構造体でまとめて与えるのが主流かな
頭いいですね。なるほど、これはいいですね。 >>633の意味がわからん人も出てきてるとは…時代の流れを感じる >>637
今なら、2ちゃん見ている機械で、いくらでも調べられるのにな。 >>625
アセンブラは山から切り出してきた丸太
Cは製材してパネルや建具まで加工済み、という感じかな
質問をたとえると
「パネル(C)には連結できるような穴明け加工が可能ですが
丸太(アセンブラ)ではどうですか?」 構造体をそのまま引数で渡しても問題ないですか?
昔どこかでポインタのほうが良いって見た覚えがあるのですが、何だったか思い出せません、記憶違いかもしれません
呼び出された側の関数で書き換えることはあまりなく、いまは構造体をそのまま渡しています。 >>640
コピーする時間と、消費するスタックが足りるならいいんじゃね
個人的にはやらないけど >>640
ポインタで渡すと、構造体の内容変更したら、呼び出した側も変化する。
値で渡したら、変更しても、呼び出した側は変化しない。 規模が小さければグローバル変数でいいんじゃねって時もあるだろう みなさん、ヒープ領域は、いくつ取ってますか?
私は画像はやりませんが、2047バイト取っています。 RA...RAMが256バイトしかないマイコンだってあるんだから! RAMがないマイコンの事もたまには思い出してあげてください レジスタがRAMほどあれば楽勝
AVRでUARTの受信リングバッファにレジスタ8個使った事があるw >>647
組み込みだとヒープを使うライブラリを使うことは少なさそうだが。 この場合のレジスタとは、
○○設定レジスタとして何かを設定する用のレジスタだけど、
RAMが足らないので、その周辺機能は使わずに、
設定レジスタを記憶場所として使う、
という意味でしょうか? >>654
たとえばAVRのmega328には256個のレジスタが有り、機能は大きく二種類に分かれている。
0〜31:汎用レジスタ
32〜255:外部パラレル入出力、SP、カウンタ/タイマ、ADC、I2C・・・割り込みや各種動作条件設定など
汎用レジスタには演算の他にも、単なるバッファとしてデータを格納出来る。
インデックスレジスタを使ったアドレッシングも出来るので、
多分、>>651 は32個の汎用レジスタの中の、アドレスが連続した8個のレジスタを
受信用のリングバッファに使ったのだろう。
8バイトでバッファオーバーフローしないなら、リングにする意味があるのかなと思うが。
(難しかったらゴメン、短い文章でうまく説明できない) >>655
説明ありがとうございます。
難しくありません。よくわかりました。
A, B, H, LなどのCPUの処理用のアキュームレータはちゃんとある上に、
さらに、その0〜31の汎用レジスタがあるということでしょうか?
「贅沢に」という意味は、
0〜31の32個のレジスタは、本来ちゃんと使うべき用途があるので、
他の目的で使うことはしないのに、よく8バイト「も」使ったね、
という理解で良いでしょうか? 横レスです。AVRはほとんど忘れてしまってるから
「知らんくせに書くな」って言われるかもだけど
A,B,H,L とかなくて、R0-R31のうちの一部がそれに相当する
レジスタだったはず
R0-R31にアドレスが割り振られてるっていうのもAVR固有ですね。 C言語のポインタを勉強していますが、今ひとつ良くわかりません。
以下のように理解していますが、正しいでしょうか?
1. 以下の記述は、右の意味があります。
unsigned int p; // 16bitの、数字用の入れ物を確保する
unsigned int *p; // 16bitの、番地用の入れ物を確保する
2. 数字の入れ物には「数値を表す数字」を入れること。
番地の入れ物には「番地を表す数字」を入れること。
3. VBAのBASICに対比すると、
unsigned int p は、Dim p As Integer
unsigned int *p は、Dim p As String
4. 上記1.の宣言部分を見れば「*」の有無によって、pが何者かがわかるけど、
ソースの途中で p を見つけても、数字用か番地用かは、わからない。
よって、p = p + 1; は、エラーにはならない。
数字用なら、その中の数字を1つ増加させるけど、番地用は、
番地を1つ進めるだけ。
どうでしょうか。 >>658
ポインタは型によって、実際に加減算される値が異なる。 int *pにて、pはアドレス、*pは数値。
p=p+1するとアドレスは4進む(32ビットCPUの場合)。 ありがとうございます。
>int *p
の「int」は「pの中身で示された番地」のbit幅が16bitである、ということで、
p=p+1したときに「進む番地数」とは関係無い
という理解で良いでしょうか>
>p=p+1するとアドレスは4進む(32ビットCPUの場合)。
この「4」という数は、ソフト上で操作できるものではなくて、
「マイコンのbit数を8で割った数毎」に加算される、例えば
・8bitマイコン PIC16F なら、1つずつ
・16bitマイコン PIC24F なら、2つずつ
・32bitマイコン PIC32 なら、4つずつ
という理解で良いでしょうか? >>659-661
あかん、ポインタ間違って覚えたみたい
常駐してお勉強だなぁ >>664
マイコンに依存ではない
コンパイラに依存 int は、short より大きく、long より小さいんじゃなかったっけ? intがshortと同じこともあるし、longと同じこともある。 ありがとうございます。
ということは、
>int *p
の場合の、
*p = 0x1234 は、ぴったり16bitでOKで、
*p = 0x12345678 は、溢れると言う理解で良いですね。
実際にpに入れる値は、
p = 0x12;
p = 0x1234;
p = 0x12345678;
どれになるかは、コンパイラー依存なので、人間が決める事はできない、という理解で良いでしょうか? コンパイラ依存なのでintが何ビット長かで変わる
なので、stdint.h 読み込んで uint16_t とか使った方が
後で違う環境になった時に楽だよ ありがとうございます。
そうすると、以下のようなことも起こりうるでしょうか。
unsigned char *p;
p = 0x0000;
*p = 0x12; p++;
*p = 0x34; p++;
*p = 0x56;
結果
0x0000番地 12
0x0001番地 00
0x0002番地 00
0x0003番地 00
0x0004番地 34
0x0005番地 00
0x0006番地 00
0x0007番地 00
0x0008番地 56 char はバイトに固定っていうのがCの言語仕様で規定されてるって
ウワサで聞いた気がする >>671
データを収めるとき符号拡張して4バイト境界で格納
すればそうなる。それはマイコンの仕様に書いてあるでしょ ポインタとは何か?一言で言えば
間接アドレッシング機構のことです。
K&Rの原書見ても、きちんと理解できるような記述にはなってなかった印象がある。
アセンブラでここら辺のプログラム経験あれば、
すぐ感覚的に理解できるんだけどね。
ポインタのインクリメントでアドレスにアクセスするのがなぜおいしいか?
理由は、
ハードウェアがそういう命令持ってて、インデックス計算のためのクロックを消費しないから。
テーブルから一つずつ順番に読みだしてレジスタに格納するような記述が便利で効率的
あと、やっちゃいけない記述でこんなのがある
func( p++,p++);
普通コンパイラは後のポインタからインクリメントされるけど、仕様として決まってなかったはず。 >>669
問題
int を charポインタで受けてエンディアンを確認するプログラムを書いてみよ
warningは出るけど >>671
さすがにcha *でそうなるのは一般的とは言えないような。
マイコンによっては2バイトとか4バイトで番地がふられてるのもあるし、
奇数番地から16ビットアクセスができないとうのもある。
ビッグエンディアンなら3番地と7番地になるし、質問の範囲が広いので
CPUと開発環境によるということになってしまう。 unsigned long x = 0x12345678;
unsigned char *p;
p = &x
fprintf( stderr,"%x\n", *p++);
fprintf( stderr,"%x\n", *p++);
fprintf( stderr,"%x\n", *p++);
fprintf( stderr,"%x\n", *p++);
fprintf( stderr,"%x\n", *p);
最後の一発で、アドレスエラーで今のOSなら安全に停止するはず。
ひとつ前のインクリメントですでにアウトかも。 *p++ というのは、
*(p++) アドレス番地の加算して、そこの値 のことでしょうか?
それとも、
(*p)++ 現在のp番地の値の加算なのでしょうか?
ポインターは難しいです。 Cの文法から説明して解説する能力ないですが、*(p++) のはずです。
自分で書くとき理解が怪しいと思ったら、分けて書くほうが確実
昔はコンパイラ技術が未熟で、生成コードが違ったりしてたけど
今はそんなことないはずだし、仮に違ってたとしても、そんなこと
問題になるケースはほとんどないはずですから >>679
*p++ == *(p++)
あと、こういうのは演算子の優先順位なんだが、
そんなの覚える必要なく、()を使ってコンパイラに指示すればいいだけ。
そのうち慣れてくる >>678
明示的にキャストかけて、
p = (unsigned char *)&x ;
としないと、今のコンパイラはエラー吐くね。gccで確認した。
昔はwarningだけで最後まで行った。
んで、最後の2行 p+4 はxの格納場所の1バイト先見てるので、
本来はアクセスエラーなんだけど,CygwinX64は停止しないな。 >>680
>自分で書くとき理解が怪しいと思ったら、分けて書くほうが確実
分けてというのは複数行でってこと?
最適化がアホなコンパイラだと、本来1命令でできることを複数命令でやってくれて実行速度落ちる場合があるよ。
1行でカッコ使って優先順位を明示してやればさすがにそういうことはないけど 英語だけど置いときます。時計回り渦巻き法。
ttp://c-faq.com/decl/spiral.anderson.html >>683
命令ってのはインストラクションのこと?
数クロック気にするならアセンブラで書けよ。
だいたい、K&R を引っ張ってくるなよ。 皆さん すごいですね。
職業でプログラムやってる人ですか?
とても詳しい。 そもそもこの問題のCPUが何ビットか、リトルエディアンかラージか書いてない時点で 趣味でも10年ぐらいやってりゃcなんてマスターできるよ
c++は多分無理だけど >>685
Cで書くにしても、アセンブラをイメージできないアホはエンベのコーディングなんかやるなゴミ
Cの最もベーシックな部分を理解する上で、原点のK&R 引用すら思い浮かばないお前が糞ってことだゴミ >>689って、実社会でも、あのような口の利き方してるんだろうか。 いや思っているんだが口に出せないハートチキンだな。 ポインターで質問があります。
以下のポインターについての文章は、知恵袋からの引用です。
>aという容器はプログラム空間のどこかに実際に存在しているわけですが、
>この容器の在り処、言うなれば住所をアドレスと呼びましょう。
>例えば「戸棚の上の左から2番目」のような具体的な場所を想像してください。これをアドレスと呼びましょう。
>int *b;
>というのはポインタ変数の宣言です。前述の容器に例えるならポインタ変数というのは「アドレス専用の容器」といえます。
>住所専用です。値はいれない。この場合、まだ容器の中は空っぽです。ここまでが前提です。
>さて問題となっている「警告/エラー」の件ですが
>b = a;
>は、bというアドレス専用の容器に、aの中に入っている5という値をいれようとしています。
>「その容器はアドレス専用ですよ!?」と警告されたわけです。
>アドレス専用ですから例えば「aのアドレス ( 戸棚の上の左から二番目 )」というような情報ならいいけれども
>「5」なんていれられても困ります。アンケートの住所欄に年齢を書いているようなものです。
>そこで
>b = &a;
>としてみる。変数の前に&をつけると、その変数の値そのものではなくて
>その場所、アドレスを教えてくれる決まりがあります。
>そうするとb(アドレス専用容器)には、aのアドレス(「戸棚の上の左から二番目」)
>が入れられることになります。これならエラーにはなりません。
質問
>アドレス専用ですから例えば「aのアドレス ( 戸棚の上の左から二番目 )」というような情報ならいいけれども
>「5」なんていれられても困ります。アンケートの住所欄に年齢を書いているようなものです。
上記文章を読むと、5 という値に何か属性があるように読めるのですが、
入れる入れ物の用途は異なるけど、代入する値は、同じ 5 (0x05) で代入可能と思うのですが、違うでしょうか? >>671
0x0000番地 12
0x0001番地 34
0x0002番地 56
0x0003番地 不定
0x0004番地 不定
0x0005番地 不定
0x0006番地 不定
0x0007番地 不定
0x0008番地 不定 >>693
char* p = (char*)5;
みたいなこと?
それなら可能だし、MMUの無いようなマイコンでは普通に使うけど
ただ、*pに書き込んだり、*pを読み込むことができるかどうかは別の話 >>690
ここはマイコンスレなんだよウスノロ
組込に関係ないなら出ていけ低能
あと、マイコンでなくともアセンブラ出力をイメージできないアホが生意気にCでコーディングすんな土方 >>693 型が違うから型変換が必要
5 と書いたら int/long int/unsigned long int型の定数
ttps://msdn.microsoft.com/ja-jp/library/hycyd72d.aspx
5.0と書いたら double型の定数
ttps://msdn.microsoft.com/ja-jp/library/w9bk1wcy.aspx >>698
ありがとうございます。
>型が違うから型変換が必要
ということは、以下のような事でしょうか?
int *b; // ポインタ型変数b 目的地のbit幅は16bit p++での増分はコンパイラ次第で不明
int a,c; // 通常の変数、数値。bit幅は16bit。aとcの2つ
b=a; // これは×。ポインタ型変数b ← 通常変数だから
b=&a; // これは○。ポインタ型変数b ← ポインタ型変数(?)だから
a=c; // これは○。通常変数 ← 通常変数だから
a=&c; // これは×。通常変数 ← ポインタ型変数(?)だから
上記が正しいとすると、
&a の、&は、キャストみたいな感じがしますが、それとは違うのでしょうか?
あと、
(unsigned int *)a
のような記述も見るのですが、これ >>696
ウスノロ、低脳に土方かぁ・・・
いまいちピンと来ないな、単語が古すぎる
次回はもっと工夫してくれ、オチがあれば嬉しい(笑) >>699
&はポインタをもつ対象からポインタを求める演算子
昔の言い方ならlvalueを求める演算子
だから(int *)(0x12345678)などとはかけるけど
&(0x12345678)とは直接かけない
無理やり書くなら
&(*((int *)(0x12345678)))とでもやりますか 意味ないけど >>699
>int a,c; // 通常の変数、数値。bit幅は16bit
これも bit幅はコンパイラ次第 > int *b; // ポインタ型変数b 目的地のbit幅は16bit p++での増分はコンパイラ次第で不明
bは、int型の変数のアドレスを入れるための変数。
int型の変数のサイズが16bitなら(コンパイラに依る)、b++での増加は16bit=2Byteなので2
64bit用にコンパイルしたら、int型の変数は64bitになることが多い(コンパイラ依存ね)のでb++で8増える
「不明」ではなく、次の変数のアドレスになるように増える訳ね >>703
横からですが、以下の理解で合っていますでしょうか?
int *b;
1) bは「int型の変数」 のアドレスを入れるための変数。 intは、左記「」に修飾されるですよね?
2) b++ で増加する番地は、上記「int型の変数」の「intの定義」によって変わるが、
それは、「intの定義」を8bitで割った値、と決まっている。
例 int=8bitのコンパイラなら、1つずつ
int=16bitのコンパイラなら、2つずつ
int=32bitのコンパイラなら、4つずつ 以下同文
3) bに代入する場合「代入する値のbit幅」はメモリー空間のbit幅による。
例 メモリー空間が0x00〜0xff番地のコンピュータなら、char の値しか入れられない
メモリー空間が0x0000〜0xffff番地のコンピュータなら、16bitまで の値しか入れられない
メモリー空間が0x00000〜0xfffff番地のコンピュータなら、20bitまで の値しか入れられない 以下同文 >>704
おれも横から書き込んだだけだった
1),2)は合ってるけど、3)はコンパイラ依存のはず。
386SXみたいな32bitCPUだけどメモリ用のバスは24bitしかないCPU向けにコンパイラを作ったとしても、普通、ポインタ変数は32bitにすると思う。
24bit=3Byteの変数なんて扱いにくいし、ポインタ変数のアドレスを入れる変数(int ** とか)を考えると、++した時に3増加させるってのは考えづらいよね。
メモリ使用効率を重視したコンパイラなら24bitにするのかもしれないけど。 1wordが8bitというのも絶対ではなくて、
別に9bitでもいいんですよ。
12bit CPUだって作れないこともない。 >>704
>int *b;
>1) bは「int型の変数」 のアドレスを入れるための変数。 intは、左記「」に修飾されるですよね?
bはint型を指し示すポインタ。int *b; はそういう宣言。
bにはざっくり言えばメモリアドレスが入る。
bがintを指し示すポインタであるからこそ、b++はint型の大きさ一つ分増加する
>メモリー空間のbit幅による。
メモリを指し示すアドレスの大きさな。 >>708
そんなのあったんですね。
DSPだと変なビット数多いけど、昔のマイコンも面白いですね。 昔は日本の電機メーカー各社がCPU作っていたんだよな。 友達の間では、
・TK-80・・・誰でも持ってる、情報多い
・H68/TR・・マニア、コンソールがカッコイイ
・L-Kit8, 16・・・・誰も持っていない、アセンブラがキー1発で入力できる
・TLCS??? ・・・・東芝 誰も見たことがない EX-80は見かけるがEX-5は見たことない。
EX-0に至っては神話レベルか。 Lkit-16は16ビット固定語長で、今風に言えばRISCだな
日本は40年も前にこんな優秀なオリジナルCPUを作れていたのに
どうしてこんな事になってしまったのか・・・ 商売にならないからだよ
もうひとつは発信力というか、
開発環境を含めてユーザー教育、ユーザーサポートをどこも嫌がった。
極力売り切りで済ませたかった。
日本語というローカル言語がいろんな意味で阻害要因として大きいんじゃないかな? 日本の半導体メーカは大口顧客しか見てないからな。
個人ユーザやファンを増やすって視点が全くない。今でも。 そうやって大口顧客に買い叩かれ
開発に回す予算も無く
風前の灯
この国全体の様子とよく似ている ディスコンにならないdsPICとPIC32でいいや、情報も多いし中小相手でもサンプルくれるし そもそも、TK-80とかは「マイコントレーニングキット」という名前だった。
誰向けのトレーニングなのか、未だに不明 ハードウェア開発者、ロジックICゴリゴリでシステム作ってた連中向けだったね、最初は。 確か、10万円くらいした。
小遣いでは、買えなかった。 >>722
なるほど。あいんさ
ちなみに、アセンブラ無いだろうから、ニーモニックの書かれた印刷物だけかな すごーい。このスレ、3行以上の文章が書ける頭(・∀・)イイ!!人が多いわ。
他のスレは長くても2行がやっとだねぇ・・・orz
物理板見てきたら5行くらいは普通に書ける人が多いのがわかった。
電電版のあたしたちは、もっと学び、努力すべきではないでしょうか。 >>724
お前もスゴイぞ。
3行以上書いてるからな。
巣に戻ったら仲間に自慢していい。
俺だってもう4行書いてしまったから頭が良いのだ。
それでいいのだw >>725 いいえ。このスレを褒めました。
>>726 5行書けましたね。頭(・∀・)イイ!!
スマホが普及するとパソコンも使えなくなる人が増えるという文明劣化が始まっているよね。
だから1,2行がやっとの人が増えるのだと思う。こうなると作文すら書けなくなるよね。
プログラム書けるのが神業になる時代がやってくるの?
頭(・∀・)イイ!!人工知能の汎用学習機能開発は、遠ーい夢のまた夢かなぁ??
人気のパソコンがバグだらけで動かなくなってんのに、テレビは何もわかってないのかなぁ? 悩み事としては、Win7のバグが治らないのでOSXとiOSにしたのですが、最近はOSXとiOSもバグが治りません。
WinXP, Mavericks, iOS5.1までは、そこそこの高品質だったのですが、だんだんバグが治らない
状況が徐々に悪化しています。
この状況を改善するにはどうしたら良いでしょうか? CP/Mでも使っていればいいんでない?ソース公開されてるし、たいしたサイズでもない。 MS-DOS、PC-DOSもおすすめ
ubuntuもいんじゃな MS-DOSは、PC98で初めてさわった。
最初に覚えたコマンドは、DIR だった。
すでに MIFES と エコロジー が入っていたので、さすがに edlin はやらなかった。
3.5インチのフロッピーが羨ましかったのを覚えてる。 エコロジーV思い出した
PC98なのにマウス操作できるうえに色々と機能あったね コピーや移動が楽ちんにできるのもビックリだけど、
消してしまったファイルが復活できるのに、驚いた。
エコロジー様様 セクタ表示や編集もできたり圧縮ファイルの中身表示に対応してたり画期的だったね
あの頃にしては珍しくベンチマーク機能もあったしメモリ割り当ての表示機能もあった DOSやUbuntuで人気OSの代わりをするというのが質問の意図じゃなくて、
WinXP/OSX等で10年間以上も使われてきた仕事用の高価なアプリ群が新しいOSで動かない、
しかもOSのバグで動かないとなると、これは困った話で
これから先を考えると、どうやって仕事を続けるのか?という悩み事なんです。
例えばCPMやMS-DOS時代ではもともとそうした優れた仕事用アプリが無かったわけで
それらを古いOSでは交替がきなかいんです。 >>735
XPを使い続けるしかないんじゃないかな 本当にOSのバグなのかね?
むしろバグが直って動かなくなったとかね。 >>735
OS更新しなければいいだけじゃないの
NETに繋げず特定用途専用として そしてネットにはつながなかったが、USBから感染…
ソフト更新しないとお金にならないから仕方ないよね >>736
病院ではXP使ってますね。PCは何の問題も無い様子ですが、メインテ料金が高価そう。
Win7 の一番高い製品よりも、WinXP SP3が何を比較してもWin7が負けてます。
つまりVista失敗が大変痛いわけです。
Win9が無くなって、Win10は謎が多いって、結構問題は大きいなーと。
macbookユーザ増えたのもわかる気がする。デザインがおしゃれと若い女性には受けてるらしい。 >>740
Macはユーザー切り捨てするから金持ちじゃ無いと続かないよ それはあるかもしれない。
マイクロソフトはユーザの声をよーく
聞いてくれるのが良い社風。
だけどこのままでは危ない気がする。
PowerPC(x86の2倍性能)からcore-i になったのも、なんかあるなー・・・と。 googleさんではIBM POWER9サーバ採用らしいのですが、これがいいのかな?
九州で震度7だそうです。
リアクター止めないと・・・。落ち着いて行動願います。 OSが古すぎて新しいウイルスじゃ感染しないとかね。
>>735
VMwareでも入れて昔のXPでも動かしてりゃいい。
XP持っていないなら、7Proを手に入れればXPモードがついてくる。
7Proのリテールを手に入れれば、ホストOSの下の仮想マシンとして
7Proをインストールして、その下でXPモードが動かせるんじゃないかいな。 XPもいまだに「悪意のあるソフトウェアの削除ツール」は毎月のように
更新されて来るな >>745
韓国が思いっきしそれやられたんだよなぁ…。
自国で勝手にパッチあてるからもうもうお金払わねーってやって古いシステムみんなで使ってたら
マジで何から何までダウンしたとか…。 Win10が最後のOSと言っているメディアがあるのです。
パソコンがオワコンになったら、スマートホンで仕事するの?
んなことできるわけないと思うのですが、どうでしょうか。
個人的にはx86のマルチコアもARMのマルチコアもアーキテクチャは既に失敗しているので
作りなおすか、設計全体について時計の針をXP時代に戻さないと、この先やっていけないと思う。
スマホを使う文化は、社会全体のビジネスの発展、自らの首をしめるマイナスの現象が見えてる。
日本全体でみんなの頭がどんどん悪くなる方向に文明を後退させてきていると思う。 アーキテクチャの何が問題ですか?
x86もARMも特長を活かした使い方してるんじゃないの?
マルチタスクがーって具体的に理想的なマルチタスクとは何ですか? おおざっぱには、マルチコアによるメモリアクセス競合と高速IOバスのアービトレーションがうまくできず、
キャッシュヒット率が低下、性能低下が起こり、
バスアービターであるチップセットの論理不良が取れなくなる課題が解決できない点です。 Win10TH2(10586)とかWin10RedstoneとかWin10MobileとかWin10IoTなど
Win10の名前を冠したOSが出てるだけで、Win10(10240)が最後のOSだという記事はないと思う 他から転載
C→プログラミングの幹 ITで生きていくならやって損は無いけど、使う場面あんま無いし得は少ないかも
C++→パンドラの匣。これを開けたら絶望が待っているけど、乗り越えたら希望が手に入る。
Java→幅広く使われてる GUIアプリとかサクッと作れちゃう
使えたら職にしやすいかも 個人的には書いてて楽しくない
デザパ知らないと実装がめちゃくちゃに成りやすい
js→ナウでヤングな言語 使いやすくて簡単かつ、挫折しにくい。
すぐにモノが出来る。超絶職にしやすい。一ヶ月集中して勉強したらフリーで仕事取れるレベルに簡単
php→この言語しか触れないとペチパーとバカにされる。rubyが増えてきてPHP案件減ってるけど、
まだまだ現役でWEB系でよく使う言語。JSよりかは難しいかもだけど、JavaとかCに比べると楽ちん
ruby→完全オブジェクト指向。日本語のリファレンスが多い。
サクッと使い捨てのスクリプト組むのに便利。入りやすい。イテレーターとか便利。
python→数学系のAPIが強い。文法がシンプル。
インデントを強要されるから初心者でもある程度キレイなコードが書ける。勉強用としても結構良いかも。 >>748
別に失敗でも何でも無いだろうさ。あえて言うならCPU一人に処理を
押し付けることを前提にしている>748の発想そのものが間違ってるって
あたりかな? マイコンの話ではないけど、NIというところのLABOVIEWというソフトのランタイムを
ダウンロードしてインストールしました。
しかしランタイムとは何なのでしょうか? といも大きい容量です。
CPU = i7 で、SSD なのに、インストールに20分以上かかりました。
マイコンのhexとはちがうでしょうけど、なんでこんなに大きいのでしょうか? LaboviewはPLCでやるような制御をPCでやるようなもんだべ
DCSではないけど
Laboviewで有名なのは画像処理だべ
COGNEXとかみたいなことができるからサイズでかいの当たり前だべ
まともに買うと高いべ >>757
LabVIEWで画像処理は大変そうだなぁ。
Laboviewとは別物かもしれないけど。 LabVIEWのフルバージョンで画像処理と信号処理と測定の自動化に使ってる
マイコンに組み込めたら、もっと幅が広がるのにとは思うけどNIの自社製品が売れなくなるからしないだろうね LaboとLab違う製品なのか知らんかった
labviewはFPGA,asicにもできるけど
cognex visonproのARMかlinuxばんが欲しい
windowsは仕様がちょこちょこ変わるからいやずら そろそろWin10 PCを使わないといけないかなという現象が出てきました。
ALT+CTRL+DELでも応答が無いので電源を強制OFFしました。
FujitsuとSurfaceではどちらが安定して動きますか?
まだ様子見の人が多いのでしょうか、Win7では超不便で辛い今日このごろです。
Win 10 PC 使ってる人は、どんな調子ですか? LabViewって、簡単らしいけど、使ったことない。
LabViewで作ったアプリ(?)を使ったことがあるけど、
使いにくそうだった。作成者のセンスもあるんだろうけど
Windowsのアプリと同じつもりで接すると、びっくりするような所で違和感がある。 >>761
OSとかあんまり関係ないんじゃないの?それ
強制終了効かないが多発してるなら
ウイルスとかドライバとかハードとかの原因沢山あるので
オイラならとりあえず
・ディスクチェック
・ウィルススキャン
・ドライバ最新版にする
・メモリチェック
やってダメならリカバリで出荷状態かな
あーあとはPC内部のコネクタとか抜けかかったりとかでも
フリーズ頻発あったな
ま、買い換えちゃうのが一番手っ取り早いっちゃ早い
Win10使ってるけど
細かい不具合たまにあるよ
サービスがCPU食いまくったり
スタートボタン効かなくなったり
正直7の方が安定度高いなぁ
色々機能切りまくれば、体感速度は10に軍配上がるけどね LabVIEWの長所は保守性かと、1年ぶりに見て内容がすぐわかる
LabVIEWにする必要がないなら無理にしなくてもいいよ、値段結構する >>765
>値段結構する
どのくらいする物なんですか? 個人では買えそうにない?
ハードはUSBケーブル1本でOKでしょうか? Win95時代にLABVIEW考えたことあるけど高かった
手持ちのVB2だと測定器(熱電対のAD)のDLLが無くて結局なに使ったっけ?
思い出せたら書き込む(20年前だ無理だな) >>766
NIの製品から細かいオプションを見ることをオススメする(測定装置も含めて)
オプション一切なしの信号処理や微分積分もできないバージョンで17万
信号処理などのついた開発版で44万
自分の使ってるバージョンで200万円(いま24%引き) 某大手部品メーカーがPLCからLabviewに替えようといている
SI屋としては迷惑 ありがとうございます。現在、調査解析と修復中です。
メモリソケット周辺での波形乱れがあり、データ伝送のSHF周波数ドメインレベルでのインピーダンス整合に課題がありそうです。
この実装方式はおそらく90MHzくらいが限界ではないでしょうか。
メモリフェッチが途中で停止しCPUが待ち状態で身動きがとれず制御不能に陥るグリッジもあるようです。
CPUが停止しているとプログラムは動けないのでOSでもどうにもできない課題があるようです。
こんなケースに備えてあたしのパテントを実装するとそんなことにはならないのにかなり落胆しています。OTL
経験的にはCPU,LSI、Memory SIMは、ハンダ直付の方がLSIピン周辺での波形の乱れが少なく
あたしはそう設計してきているのですが、外国製品の製造メーカによっては、まだ良く知られていない
結果がこの現象を招いているようです。
その関係メーカでは、ハードウェア高周波設計ノウハウが、マイコンボード設計に対し現在未習得なのかもしれません。 マイコンで、C++のような、クラスとかを使ってプログラムできますか? 使用するマイコンの開発環境次第。
ArduinoなんかはGCC使ってるからC++ すみませんが教えて欲しいのですが、
C言語で、
long a;
int b;
b=a/500;
と書いたとき変数aに2000が入っていたらbが4になり格納されるでしょうか?
longとintで宣言した変数を混ぜて計算するとエラーになるかどうかはコンパイラー次第でしょうか? >>776
>エラーになるかどうかはコンパイラー次第でしょうか?
エラーにはならないでしょう。コンパイラーの仕様通りに計算される。
普通は、bit幅の違う変数をいきなり計算はしない。
キャストして、bit幅を合わせて計算するね。 長いビット長に合わせるコードを出す。
明示的にキャスト書いた方がいいね。 符号をはっきりさせたいので、
int a;
とはせずに、
unsigned int q;
と、毎回書いてる。
等号の右辺左辺も、bit幅同じでない書き方はやめている。
必ずキャストして使う。 >>780
int a と unsigned int q だと型が違うだろ。 >>766>>768
つ[LabVIEW Home Bundle]
ttp://sine.ni.com/nips/cds/view/p/lang/ja/nid/213095 >>765
保守性が高くなる様に描かないと(プログラムは「書く」ものだけど、
LabVIEWに限っては「描く」でも違和感無いなw)、悲惨な事になるけどねw
(例:ケースストラクチャで、重要ではなさそうなケースを表に
出してセーブするとか。)
テキストでプログラムを記述する言語と違って、差分…diffとかを簡単に
取れないのもマイナスポイントですね。
あと描いたものが属人的になりがちなのも。 b=a/500;
ワーニングはでるが問題ないケースが多い。
しかしショボイコンパイラーをつかうとエラーなしで変な答えがでるばあいがある。
そのときは
b = a / 500l;
で治る。
この場合はワーニングが出る。
b = (int)(a / 500l);
こうするとワーニングはなくなる。
500lはロングの数値表現、まれにではあるがlをつけないと誤った結果を出す
コンパイラがある。
安全レベルでは次の順番になる。
level1) b = a/500; b = (int)(a / 500);
level2) b = a / 500l;
level3) b = (int)(a / 500l); 大文字で 500L って書く方が好きだ
1 と l が見分けやすいフォントを使ってはいるが intで宣言した変数に割り算の結果を格納した場合、正数部分だけ格納されるのでしょうか?
int a
int b
bが3の場合
a=7/bなら
aは2になるでしょうか? >>787
%を使い
a=7%b
だと、余りの部分がどの様に格納されるのでしょうか?
また、上記のそのままだと答えの正数部分が格納される。で合ってるでしょうか? %すると余りが帰って来るよ
実際のマイコンでやってみなよ この辺りの話って言語の本読んだ方が早い気がするんだが
処理系特有の話でも無い限りマイコン関係ないじゃん >>790
マイコン専用ではないけど、マイコンに無関係ではないので、
話題として、何がいけないの?
>>786
>a=7%b だと、余りの部分がどの様に格納されるのでしょうか?
a=2になるよ。 Cのdiv()やldiv()の事を知りたいだけだったりしてw 小さな8ビットのPICやAVRでも並列処理(マルチタスク)は可能でしょうか? できるよ。
PICROSとかATROSなら勉強にちょうどいいかも。
検索してみ。 >>793
PIC18以上なら、FreeRTOS が対応してる。 富士には月見草がよく似合うし、シンプルなCPUにはシンプルな並列処理がよく似合う(笑)
シンプルだからプログラマが注意すべき点が多くなるし、
プログラムの仕様によってタスク切り替え部の細部もどんどん変わってくるけど、
それはまぁ仕方がない。
でもシンプルだから、使うCPUが
必要なスタック領域を確保出来る、タイマ割り込みが可能
ならすぐに少ない資源で適用できます。
(興味の無い人は次を読み飛ばして) 以下のサンプルはAVRtiny2313のアセンブラ用の一例で、
タイマ割り込み(timer0のcompA)で、レジスタZを保存しながらタスク2個を交互に切り替えている。
−−−−−−−−−−−−−−−−−−
cli
push zl 現在のタスクのスタックにZレジスタを保存
push zh
in zl,sreg 〃 フラグレジスタを保存
push zl
mov zl,sv_spl 現在のタスクのSPをsv_splレジスタに保存し、
in sv_spl,spl 保存していたSPを次に実行するタスクのSPと入れ替え
out spl,zl
pop zl 次に実行するタスクのスタックのフラグレジスタと入れ替え
out sreg,zl
pop zh 〃 Zレジスタと入れ替え
pop zl
reti (次に実行するタスクのスタックから実行再開番地を取り出して実行・・・ハードが処理)
−−−−−−−−−−−−−−−−−−
準備としては、
タスク2の開始番地をスタック領域2にプッシュし、
さらにフラグやZのレジスタ保存分だけSPを深くし、
数mS間隔のタイマ割り込みをスタートし、
スタック領域1をSPにセットし、
そのままタスク1を実行開始する。
タスクの個数を増やすことも出来るし、
タイマ割り込みの中で他の仕事(ディレイカウンタの計数など)も可能。 読み返したら大事な説明を忘れている。
「サンプルの先頭のcli命令はソフトウェア(ユーザー)ディスパッチのため」 こういうプリエンプティブマルチタスクみたいなのは組み込みで使われ
てるのかな。
タイマー割り込みで簡単なスケジューラでタスクを起動する方が現実的
だと思う。俺はそうしてる。 「タイマー割り込みで簡単なスケジューラでタスクを起動する」
=プリエンプティブマルチタスク
ではないの? 「終了」じゃなくてタスクの「切り替え」を強制的に行うのが
「プリエンプティブ」ってことだと理解してるんだけど だから>>803が使ってる方式が強制的じゃないんでしょってことよ。
「終了」と「切替」の表現が間違ってたのはすまん。 >>803に聞くしかないんだけど、タイマー割り込み使うスケジューラで
タスクの「切替」が強制的じゃない、っていうのがどうも理解できない
「ノンプリエンプティブ」なら、走ってるタスクが自分から実行権を
放棄しないかぎり他のタスクに実行権は渡らないわけでしょ? 理解してんじゃん。その通りだよ。
メリットがわからないとか?
まあでも>>803の発言はプリエンプティブなタスク切替が作れないか、
使いこなせない為じゃないのかな。
強制切替じゃないってことはレジスタを保証する必要も、
マルチバイトアクセスを気にする必要もないんだろうから。 808は
「タイマー割り込み使ってるのにプリエンティブじゃないスケジューラ」
っていうのが理解できないってことだよね?
オレもどういうものか分からないけど、こんなんだろうか?
(単なる関数8個を順に呼び出すだけのものだけど)
void main()
{
・初期化
・(ワンショット)タイマ割り込み起動
while(1){
・メインの処理
}
}
void timer_int_handler(void)
{
static int funcNo;
switch(funcNo++){
case 0: func0(); break;
case 1: func1(); break;
・・・・・・
case 7: func7();
default: funcNo = 0;
}
・(ワンショット)タイマ割り込み起動
} >>810
それ最近読んだ本↓で解説してた方法だ
http://www.shoeisha.co.jp/book/detail/9784798112084
まぁ、プリエンプション無しでマルチタスクを実装するには
一番手取り速いけどね。
なお、タスクのコードは必ずステートマシンンのお化けになる模様 関数を定周期で呼び出すだけなら、タイマー割り込みとか使う必要はなくて
メインのループ内でフリーランタイマーを読んで適切な時に呼び出すような
構造にすればいいだけだね
810みたいなのにアドバンテージあるとしたら、メインに対してタスクのほうが
プリエンティブってとこかな
※810の方法では「定周期」じゃないから、そこはフリーランタイマー読むとか工夫必要 普通に定周期割り込みでいいよ。
割り込みを持ってないようなマイコンならフリーランタイマーを読む方法で。 最初にスタートさせたらずっとカウント(アップまたはダウン)しっぱなし
のタイマー、っていうかカウンタって言ったほうが正しいかな
Windows のAPIだと、GetTickCount() >>817
812はよくあるノイズ
「素人」だとか「全然分かってない」とか書き捨てて行くだけ 【質問】arduino unoを使って([K-04912] 小型圧電振動ジャイロモジュール)の数値の変化でDCモーター(130)が作動するプログラムを書きたい〜うまくいかない〜
シリアルモニタにはジャイロの数字の変化が表示されるのですが、それと関係なくモーターが作動し続ける〜〜
volの値は反映されているようです
int leftP = 1;
int rightP = 2;
const float AREF = 5.0; /* 電源が3.3[V]のときは 3.3 */
const float SENS = 0.67; /* 0.67[mV/deg/sec] */
const float OFFSET = 276; /* 1.35[V]/5[V] * 1024 (3.3Vのときは419) */
void setup() {
Serial.begin(9600);
while (!Serial) {}
pinMode(leftP, OUTPUT);
pinMode(rightP, OUTPUT);
//Serial.begin(9600);
}
void loop() {
int val = 40; //0~255の値にする
digitalWrite(rightP, LOW);
digitalWrite(leftP, LOW);
int G1, G2;
float g1, g2;
G1 = analogRead(A0);
G2 = analogRead(A1);
g1 = (G1-OFFSET);
g2 = (G2-OFFSET);
g1 = g1 / 1024.0 * AREF / SENS;
g2 = g2 / 1024.0 * AREF / SENS;
//温度が25度以上になったら回転を始める
if(G1 > 300){
digitalWrite(rightP, LOW);
digitalWrite(leftP, HIGH);
delay(1000);
digitalWrite(rightP, LOW);
digitalWrite(leftP, LOW);
delay(1000);
digitalWrite(leftP, LOW);
digitalWrite(rightP, HIGH);
delay(1000);
digitalWrite(rightP, LOW);
digitalWrite(leftP, LOW);
//valが大きいほど出力値も大きくなる
analogWrite( 3 , val ); //出力値:1~255
}
Serial.print(G1);
Serial.print(" ");
Serial.println(G2);
/*Serial.print(" ");
Serial.print(g1);
Serial.print(" ");
Serial.println(g2);*/
どこがいかんのじゃろ >>811
>なお、タスクのコードは必ずステートマシンンのお化けになる模様
シーケンサを思い出した。
1ビットCPUであるシーケンサは基本的にポーリングで立ち止まる事は無い。
プログラムの初めから終わりまでスキャンを繰り返しながら、状態を遷移させて、
リアルタイム処理を実現する。
Win9xもそうだったけど、プリエンプティブでないマルチタスクって何かいじましい。
明日は檜になりたい「あすなろの木」みたいだ。 アプリケーションソフトを作る立場から見れば、Windows95って十分プリエンプティブだったと思うのだけど。
違ったっけ。
3.1のときは処理を細切れにしてでも、短い時間でOSに返さないといけなかったけど。 delay()を使わないとソフトを作れないような人はプリエンプティブじゃ
ないと無理 普通はループによるdelay()じゃなくてシステムコールの「待ち」を呼ばせて
その中でタスクのディスパッチを行うから、大丈夫じゃない?
今のWindowsだって、sleep()使わずにループでdelay()させるとかは
決して推奨されることじゃない delay()を使わないとソフトを作れないような人はマルチタスクは無理 >>820
なにがしたいのか分かんない計算多過ぎだから適当にエスパーすると
if行のG1が間違い 途中で変数宣言できるのか。
すごいコンパイラーだな。 C99からはブロックの最初でなくてもできるようになったようだよ
ANSI-Cでも、関数ブロックの最初って誤解してた人(オレ含む)が
多いと思うけど、普通のブロックの最初でもできるらしい えっ! そうなんですか。知らなかった。
勉強になりました。
でも、あちこちで宣言するのも、見にくくなりますよね。 よく使うのが、ループの制御変数のような限られた範囲で使う変数を
その近くで宣言する場合
C++だと for(int i=0; i<100; i++) とか書けるのを、似たこと
Cの文法の小変更でやりたい、ってことでC99に入ったんだと思う >>829
いや、目的はできるだけ変数のスコープ (寿命) を小さくすること。
使い終わったら消滅する方がいいから、ブロックの方がいい場合もあるかもね。 C++使えばいいだけじゃない?
今はたいていの環境で使えるでしょ 結論として、ATtinyや8bitPIC用のプリエンプティブなマルチタスクはアセンブラでないと実現が難しいのでしょうか? Cでプリエンプティブってことは、
タスクの数だけレジスタやスタックの退避場所が必要になるから現実的ではないでしょ。
それなりのマルチタスクやりたいならある程度RAM持ってるチップ使おうや。 そうですね、AVRは32個もレジスタがあるし、tiny2313はSRAMが128バイトしかないし
確かに現実的では無いですよね mega328あたりなら2KBあるから数タスク程度は何とかなる。
汎用レジスタとステータスレジスタをタスク自身のスタックに積んで
スタックポインタだけ管理すればいい。
スタック使用量を気にしながらだからノウハウは要るけど。
実際、他の処理気にせずに何かに専念したいってのはそんなに多くない。(俺の場合)
3〜4タスクに分散させれば、かなりややこしい事してもソースはすっきりする。 教えてください。
PCのC言語なら、書けるし読める人がいたとして、
その知識でマイコンのCはできるものでしょうか?
新卒を採用する能力評価に、何かプログラムを書いてもらおうと思うのですが、
どのようなテーマが良いでしょうか。
・Lチカ(タイマー割込、GPIO)
・アナログ電圧をLCDに表示(A/D)
・その値を、ターミナルに表示(UART)
・スイッチ取り込み、ノイズ除去(チャタリング除去、移動平均)
くらいを、テストしたいですのが。 自分の採用時は、
24bitADで取り込んでフーリエ変換してカラー液晶にグラフ表示してSDにデータ保存とかだったかな >>839
テストしたい項目が、PCではやらないことばっかりだから、微妙な感じ
学習期間が必要じゃね? >>840
そんなに難しい試験だったの? すごいな。 >>839
ご自分でマイコンソフトの開発経験があるのなら、初めて使うCPUと
開発環境で、ライブラリとかサンプルソースなしでやるとしたら
仮にLチカ(割り込みなし)でも、どれだけ時間食うかご存じのはず
だから、その能力評価というものにどれだけの時間かけられるかって
ことしだいだから、インターンシップの中とかでやるのなら別にして
試験というような形では無理だと思う
もしやるとしたら、「エンベデッドシステムスペシャリスト試験」
みたいな内容になるだろうけど、これだって事前に告知しとかないと
いきなりは無理 上のでは、人事部長に「できる方法を考えろっ!」って怒鳴られそうなんで
実践(戦?)的な方法を考えてみた
1.サンプルプログラムの豊富なマイコン評価ボードを事前に支給する
2.いくつかのサンプルプログラムを指定してコンパイル・リンクして
実行できるように準備しておくことを要求
3.指定したサンプルプログラムをいくつか組み合わせる、あるいは
改変することで実現できるテーマを与えておき、そのプログラムを
作成しておくことを要求
4.試験時には、3で作成したプログラムを改変し、新たな機能を追加することを要求
※追加機能は、2で指定したサンプルプログラムからコピペで持ってきたり
自前の(ハードウェア独立な)コーディングを付け加えたらできる範囲内で なお、試験時は当然ネット接続可、かつ試験担当者に色々質問することも可とする
技術面接試験として位置づけてもいいかも >>839
スタートアップや必要なハードウェアの設定まで用意してあげるなら、なんとかなりそうかな。
マイコン (組み込み) のソフトは、アセンブラ、レジスタ操作やスタック関連は避けて通れないからねえ。
リソースの少なさに発狂するかも。 >アセンブラ、レジスタ操作やスタック関連は避けて通れない
つ、また出たよw >アセンブラ、レジスタ操作やスタック関連は避けて通れない
どこまで必要かはマイコンによりけりですかね。OSとかは抜きで。 OS抜きならより裸のマイコンいじくるんだから
より一層 >アセンブラ、レジスタ操作やスタック関連は避けて通れない だな >>839は
>マイコンのCは
とたずねて例まで挙げてるのに
>アセンブラ、レジスタ操作やスタック関連は避けて通れない
とか、いつものごり押し開始
かすりもせずに通れるのになw OS無しでもデフォルトのスタートアップ(など)で充分な案件だしな MPLAB IDE使ってるけど、スタートアップルーチンなんて、
見たことも聞いたこともないよ。
プロジェクト >>850
リアルタイムOSを作るような人ならともかく、OSを使ったプログラミングをする人やベアメタルなら
>>852、>>853でいけちゃうケースが多いのでは?
というか、いまどきのある程度のリソースを持つマイコンと開発環境なら、通常のプログラミングに
アセンブリ言語は必須ではないようにしてあると思うよ。どこのメーカーもそういう志向で開発してるだろうし。 CPUの1ステート待ちは、PICのCだと、
__delay32(1)
と書けば良いです。アセンブラは必要ないです。
ただ、知っておくことは有意義だと思います。 私はMCUで並列処理をやる時は全てフルアセンブラで書いている。
今までに一番大きい並列処理のプログラムはZ80コアのMCUの65K。
(つまりメモリを使い切った)
ポーリングや状態遷移が多いプログラムだと、並列処理は驚くほどすっきりすることがあるけど、
I/O処理の時間が厳密に規定される仕様だったりすると、並列処理は少し不向きで、
過去にはマルチタスクで書いた後、シングルタスクに戻したこともある。
もしも、温度・湿度・気圧データを収集する装置があって、
・各センサーから定期的にADCで読み取って、パネルのLCDに表示し、
PCから要求されれば読み取り値を送信し、RAMのリングバッファに蓄積する
・測定条件はPCからの通信、およびパネルのSWやロータリエンコーダなどで
いつでも自由に変更できる
・蓄積したバッファ内容をPCから要求があればプロトコル付で送信する。
送信中も測定は続ける。
なんて仕様だともう検討無しで並列処理にする。
プログラマの技量によって完成したプログラムの質は変わるでしょうね。
たとえば上のデータ収集装置でいえば、バッファ内容をPC送信中にLCD表示が
松:送信していないときと変わらない
竹:カクカクと更新される
梅:表示が停止する
だったりするかもw ペーパーテストと面接で工夫すればいいだろ。
どんだけ暇な会社なんだ。
知識経験豊富だけじゃなく学習速度が早いのを採れ。
勤務態度とコミュニケーションが良好は当たり前だからここでは論じない。 >>856
UARTやSPIの割り込みハンドラもできない奴が
並列処理とかやっちゃいけないと思うんだけど。 PICのCCPモジュールキャプチャーモードについて質問です。
16F88で動いたプログラムを使って16F1827で同じ事をしようとすると動作しませんでした。
(ANSELをANSELA及びANSELBにするなど16F1827に合わせて一部は変更しています)
F1シリーズではECCPになっていますが以前のPICと比べて設定しなければならない項目など増えたりしているのでしょうか?
使用したプログラムは下記の通りです。
//**********************************************************************
//■■■関数宣言■■■
extern void main();
extern void init_port();
extern void init_ccp_capture_mode();
extern long measurement();
//**********************************************************************
//■■■マクロ定義■■■
//CCP
sbit CCP1_Direction at TRISB.B0;
//LED
sbit LED1 at PORTA.B1;
sbit LED1_Direction at TRISA.B1;
#define LED1_ON LED1 = 1
#define LED1_OFF LED1 = 0
sbit LED2 at PORTB.B4;
sbit LED2_Direction at TRISB.B4;
#define LED2_ON LED2 = 1
#define LED2_OFF LED2 = 0
//other
#define INPUT_MODE 1
#define OUTPUT_MODE 0
#define USEC_60HZ 16667
#define USEC_50HZ 20000
//********************************************************************** //**********************************************************************
//■■■メイン関数■■■
void main()
{
long width;
//
OSCCON = 0b01110000; //クロックを8MHzに設定します。
ANSELA = 0b00000000; //A/D変換モジュールは使用しません。
ANSELB = 0b00000000;
CM1CON0.C1ON = 0; //コンパレータは使用しない。
CM2CON0.C2ON = 0;
APFCON0.CCP1SEL = 1; //CCPはRB0を使用
//
init_port();
init_ccp_capture_mode();
//
while (1) {
width = measurement();
//
if ((width > (USEC_60HZ - 1000)) && (width < (USEC_60HZ + 1000))) {
LED1_ON;
continue;
}
if ((width > (USEC_50HZ - 1000)) && (width < (USEC_50HZ + 1000))) {
LED2_ON;
continue;
}
LED1_OFF;
LED2_OFF;
}
}
//**********************************************************************
//■■■入出力ポート初期化関数■■■
void init_port()
{
LED1_Direction = OUTPUT_MODE;
LED1_OFF;
LED2_Direction = OUTPUT_MODE;
LED2_OFF;
CCP1_Direction = INPUT_MODE;
}
//********************************************************************** 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f) //**********************************************************************
//■■■CCP(キャプチャモード)初期化関数■■■
void init_ccp_capture_mode()
{
// CCPの設定
CCP1CON.CCP1M3 = 0;
CCP1CON.CCP1M2 = 1;
CCP1CON.CCP1M1 = 0;
CCP1CON.CCP1M0 = 1;
CCPR1H = 0;
CCPR1L = 0;
PIE1.CCP1IE = 0;
PIR1.CCP1IF = 0;
// TIMER1の設定
T1CON.TMR1CS = 0;
T1CON.T1CKPS0 = 1;
T1CON.T1CKPS1 = 1;
T1CON.TMR1ON = 0;
TMR1H = 0;
TMR1L = 0;
PIE1.TMR2IE = 0;
PIR1.TMR2IF = 0;
T1CON.TMR1ON = 1;
}
//**********************************************************************
//■■■パルス幅測定関数■■■
long measurement()
{
long width;
//
while (PIR1.CCP1IF == 0) // キャプチャフラグ確認
;
//
T1CON.TMR1ON = 0; // タイマーオフ
TMR1H = 0;
TMR1L = 0;
T1CON.TMR1ON = 1; // タイマーオン
PIR1.CCP1IF = 0;
//
width = CCPR1H;
width <<= 8;
width |= CCPR1L;
// usec変換 4 = (1 / 8000000Hz) * 4 * 8 * 1000000
return (width * 4);
}
//********************************************************************** 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f) >>860
おやおや、今度はここで聞いてますか?
このソースって、どこのCコンパイラですか? >>859
並列処理ではプログラマの意思に関係無く割り込みがかかるので、
むしろ各種割り込み処理は必須ですよ。
並列処理やった事無いでしょ? フルアセンブラ出来ないでしょ?
スキルアップのために是非勉強して下さい。 いや、アセンブラもマルチタスクも苦じゃないけどさ、
フルアセンブラを自慢して、なおかつそれを実行してるってところがすごく痛いなと思った。
お前が死んだら誰もコードメンテナンス出来ないんだぜ。
>バッファ内容をPC送信中にLCD表示が
> 松:送信していないときと変わらない
> 竹:カクカクと更新される
> 梅:表示が停止する
>だったりするかもw
こんな発言自体おまえ自身がやらかした過去だってことだろ。
何でたかがデータ送信一つで表示がカクつくんだよ。
まともな割り込み処理書けてないってことじゃん。 >>863
MikroCです。
16F88では問題なく動いたのが16F1827で動かないのが原因が解らないのですがCCPモジュールを動かすための設定ってF1シリーズから増えたりしてるのでしょうか? >フルアセンブラを自慢して、なおかつそれを実行してるってところがすごく痛いなと思った。
自慢なんかしていませんよ。どこの文章、語句が自慢しているようにみえた?
フルアセンブラのマルチタスクには制約もある、みたいに書いているし。
>お前が死んだら誰もコードメンテナンス出来ないんだぜ。
私が死んだ後のメンテナンスは一切不要です。
喜ぶべきか?悲しむべきか?w
あっ、思い出した、E社で一人だけ機能追加している人がいます。
私に断りも無いし、何も質問してこないけど、苦労しているのかな?
>こんな発言自体おまえ自身がやらかした過去だってことだろ。
「もしも〜だったりするかも」と仮定形で書いてあります。
私自信が過去にやらかしたことではありませんよ。
そんなドジはしません。
>何でたかがデータ送信一つで表示がカクつくんだよ。
>まともな割り込み処理書けてないってことじゃん。
仮定の仕様なので実際にカクカクとなるかどうかは分かりません。
仮定の仕様を長々と書くわけにもいかないし、複雑な仕様ならそういう可能性があるなと思っただけです。
なお、まとまな割り込み処理が書けている、という自信はありません。
最後に
どんなプログラムもシングルタスクで実現出来ます。
あなたがCのシングルタスクで、どんな仕様でも実用的な納期で実現出来るなら、それは素晴らしい。
自慢して良いと思う。
そんなあなたにはフルアセンブラもマルチタスクも無用の長物でしょう。
さぁて遅くなった、昼飯喰いに行くか。 >>866
そもそも、16F88と16F1827が互換だとは、どこの情報?
普通は、PICの型番が変わったら、
メモリー容量違いの品種でなければ、コンパチなんてあり得ないから、
全く別物だと考えて、configとかの値を全部確認するんだよ。
大した数じゃないし、1つ1つ比較していけば、すむ事だと思うよ。
みんなそうしてる。 >>869
チッ、まともに反論する能力も無ぇのか、ったくしょうがねぇ軟弱野郎だな。
ま、いいや、今回は特に許す(笑)
悔い改めて生きるんだぞ(大笑) sokutei()関数で測った測定値の最高値を記録する場合に
while(1){
cnt=sokutei();
if(max<<cnt){max=cnt;}
}
と書いたのですがmaxの中に最高値が記録されません。
どの様に修正すれば良いでしょうか? if(max<cnt){max=cnt;}
でいけるのではないでしょうか。
「<」でなく「<<」になっているので、シフト演算になってしまっています。
タイプミスでなければ。 cntと略されると cunt の略かと思ってしまう。はい、変態です。 >>876
すみません、タイプミスじゃな<<と二つ打っていました。==と同じ感覚で間違えました。
ありがとうございました。 >>876
少し気になったので合わせてお聞きしたいのですがこの場合
if(max<cnt){max=cnt;}と
if(cnt>max){max=cnt;}の
どちらでも同じ結果が得られるでしょうか?
よろしくお願いいたします。 >>879
同じです。
「大きい方を右」または「基準値を右」など、自分なりのルールを決めておくとよいでしょう。 小学生レベル
a>b
b<a
で引っかかる人を初めて見た つい先日pic16f84aでプログラムを始めたのですが、(picプログラマv4 v6.76.1)でライターを検出できず困っています。ライターはAE-PICPGM Uです。
原因と解決法についてご教授願いますm(_ _)m >>881
数学の問題でそれらが違う意味ってなかったかな?
そんなの思い出した。 >>883
>解決法についてご教授願いますm(_ _)m
つ PICKIT3 >>883
先日始めた人が、何でAE-PICPGM Uとかに行き着いちゃったのかなあ。
>ライターを検出できず
をもっと詳しく書かないと無理かな。
あと、こっち行った方がいいかも。
http://wc2014.2ch.net/test/read.cgi/denki/1461994030/ USB?232C絡みでハマる事はあるだろうけど、
つうか本当に何で今からやる人がソレなんだよって思うわw
昔から使っててUSBしかない新しいPCでもなんとか使い倒したみたいな人ならまだしも。 >先日始めた人が、何でAE-PICPGM Uとかに行き着いちゃったのかなあ。
俺はそれもさることながら、pic16f84a に引っかかりを感じました。
先輩エンジニアが残したもののメンテならともかく、まさか入門でこれなのだとしたら
未だに書籍が豊富とはいえ、やりきれないなあと感じます。 初心者入門にはかなり適さないと思われるデバイスだもんね。 最近は秋月のPICkit3も高くなったから
AE-PICPGM Uの方が後々つぶしがきくかもと思う可能性もあるけどね
自分が入門した時には1mmもかすらなかったライターなので
購入に至った経緯には興味がある
どこか有名どころで推奨してるとか? >>883
中華pickit3で十分 海外通販で2000くらい
入門書やネットでは、xcコンパイラに対応してるのは
少ないので、コピペで、、、は期待しない
オススメは
pic16の新シリーズ
pic18
2553 Yahooマイクロファン モジュール
4553 秋月モジュール
pic24fj64ga002
mccが使えると楽かも
オシレータ内臓型だとコンデンサ2、3個で遊べる 質問者は付いたレスを見てガックリ来ちゃったんだろうか。
でもこれからPICをやるならAE-PICPGM Uはオクにでも出してPICkit3を
買うことを薦めるな。 USB-シリアルケーブルを使っているとしたら、ケーブルに使われている
USB-シリアル変換ICにもよるのだけど、それがFTDIなら
デバイスマネージャで当該シリアルポートのポートの設定→詳細設定で
転送サイズやバッファサイズを小さくして、
レスポンス時間を短くする
…と状況が変わるかも。
>>891
>入門書やネットでは、xcコンパイラに対応してるのは
>少ないので、コピペで、、、は期待しない
えー。そうなん?
それが本当なら、PICに新規参入する人が減っているってことかもなあ。 こんにちは
USBのホストをマイコンでやりたいのですけど、
どのマイコン、というか どこの開発環境だと楽に出来そうでしょうか?
フルスクラッチは とてもできないので、
まずはサンプルソースが欲しいのですが。
USBにもプロファイルみたいなものがあるなら、
COMポート扱いのみで良くて、相手機器はUSBメモリだけです。 >入門書やネットでは、xcコンパイラに対応してるのは少ないので、
少ないってのはウソ。
XC以外のソースにもお目にかかるけど古いものばかり、
最初のうちは選り分けてても十分用が足りるだけのものは出回っている。
最終的な問題は、ソースの量でなく、英語力の不足だと思う。 >>885>>886>>891>>892
返信ありがとうございます
ぜひ参考にさせて頂きますm(_ _)m
>>887>>890
ライタは譲り受けた物でして。困っちゃいますね >>894
代理店に相談すればサンプルコードくれるよ >>894
Full Speed でよければ、STM32F4あたり
High Speed なら、STM32F7かな
STMは、評価ボードも安いしサンプルプログラムも豊富
以前は、自社製のフリー統合開発環境がないのがネックだったけど High Speed ホストになれるのでは、AtmelのSAM3Xが早くから出てたね
評価ボードとしてはArduino Dueの中華互換機が使えて安いけど
JTAGデバッガを別に用意しないといけないのが弱点
まあ、今だとLPC-Link2とか使えるかな STMの評価ボードの値段は、もう自分で基板作ってIC載せるとか
趣味の基板製作以外では引き合わないって思わせるな
TIなんかのは、キャンペーンで一時的に安く供給してても
いつのまにか供給自体なくなっちゃたりするけど、STMのは
結構長く供給してるし PICのプログラムで値の変換をしようとして上手く動かず困っています。
使用環境はMikroCです。
0から10000までの測定値を2000から300までの範囲に対応させたくて、
測定値/10000*(700-2600)+2600という式を使いました。
int sokutei;
int keisankekka;
keisankekka = sokutei/10000*(300-2000)+2000;
としたところsokuteiが変化してもkeisankekkaの中身が2000になってしまいます。
整数型だといけないのかと思いsokuteiをdoubleで定義しても変わらずでした。
この場合どうすれば計算結果を得れるでしょうか?
よろしくお願いします。 keisankekka も double にしないと切り捨てられますよ。
sokutei はキャストすればいいと思います。
int sokutei;
double keisankekka;
keisankekka = (double)sokutei/10000*(300-2000)+2000; >>902
long sokutei;
long keisannkekka;
keisankekka = ( ( 10000 - sokutei ) * 1700 + 3000000 ) / 10000; >>903
ありがとうございます。
思うように計算結果が出るようになりました。 >>904
ありがとうございます。
式を変形させて計算する方法ですか。
思い付きませんでした。 ラジコン用のサーボをPICで動かそうとして悩んでいます。
条件は周期10msでパルス幅0.7から2.6msをRB5の端子からの出力です。
パルス幅の指定はint PW;に700から2600と入ります。
以下のように書いたのですがパルス幅の可変が出来ませんでした。
int PW;
int SYUUKI;
while(1){
PW=SOKUTEI();
SYUUKI=10000-PW;
PORTB.B5=1;
for(i=0,i<PW;i++){chien();}
PORTB.B5=0;
for(i=0,i<SYUUKI;i++){chien();}
}
void chien(){
Delay_us(1);
}
SOKUTEI()関数での測定により若干周期がずれますがサーボはパルス幅が重要で周期は若干ずれても影響ないので無視しています。
パルス幅を可変するにあたって何か致命的なミスをしているでしょうか?
よろしくお願いします。 教えても理解できると思えない。
マジでLチカからタイマーの勉強しなおせ。 >>907
30年前はこんなレベルでも雑誌執筆者になれた >>908
>>909
すみません、稚拙なプログラムはなのは自分でも解っているのですが、タイマーを使わず作りたいと思いました。
何がいけないのが教えて頂けないでしょうか? >>907
PIC PWM サーボ ソースでくぐれ
取りあえず動いたら、タイマー割り込みに挑戦してほしい
動かなかったらクラウドワークスあたりに発注したらいいよね >>907
SOKUTEI()関数が何をやっている関数なのか分からんので、答えようがない。 >>912
ADCで読んだ値を元に変換しているだけです。
LCD繋いだプログラムではキッチリ700から2600に変換されていました。 >>907
>パルス幅の可変が出来ませんでした。
可変は出来てるでしょ
幅が狙い通りじゃないだけで
実際にパルスを測定してみた? @タイマーを使いたくない
Aタイマーを使うスキルがない
どっちよ? フォント最大にしてよく眺めろ。
for(i=0,i<PW;i++){chien();} >>920
見落としてた。気づかなかった。真面目に読んでなかった。てか、そこでタイプミスするのか。取りあえず、本当にすまない。 >>920
関心する
コンパイラがエラー吐いてくれるような内容は
気にも留めないし目に入らないから 時折見せる2ch民の異常なまでの同調性ってキモいよなって思う >>926
forってオーバーフローして勝手にぬけるか? 本来コンパイルエラーになるべき構文だから動作を考えるだけムダ
鼻から悪魔が出なかった幸運に感謝するしかない >>908
コードを見る限り、考え方は間違ってないと思うが、
どこを見てそう思ったのか。 >>934
今回Delay_us走らせることで、この手の関数だかマクロの精度や制限を知ることも大事なのではないか。
現実は2ちゃんねるより厳しいから、元スレの人にはがんばってほしい。 だから「Lチカからタイマーの勉強しなおせ」なんじゃないの?
>>935が言うような超基本的なことなんにも経験してなさそう >>931
判定式がi++になるから初期値i=0でFALSEになるからループせず即抜けだな 何でビルドできる前提?
ま、どんなコンパイラか知らんけどさ。 「急いては事を仕損じる」とか「急がば回れ」とか「慌てる乞食は貰いが少ない」とか? 早起きは三文の得
…違うか。
でも、おつ。本当に必要になったときに、忘れてて再スレ建てをしないかどうかだけが気がかり。 >>902
測定値や計算結果の定義域が固定なら(=0〜10000や2000〜300の値が
プログラム実行時に変化しないのなら)
sokutei/10000*(300-2000)+2000
→2000-sokutei*17/100 == (200000-sokutei*17)/100
一方、
(200000-sokutei*17)/100+0.5 == (200050-sokutei*17)/100
なので、
>>903
int sokutei;
double keisankekka;
keisankekka = 2000 - sokutei * 0.17;
>>904
int sokutei;
long keisannkekka; // intでもいいのかも
keisankekka = (200000L-sokutei*17L)/100; // 小数点以下切捨て
keisankekka = (200050L-sokutei*17L)/100; // 小数点以下四捨五入 速度上の理由とかで、long同士の除算を避けたい場合は、
(2000 - sokutei * 0.17) * 2^21 ≒ 4194304000 - sokutei * 356516
(2000 - sokutei * 0.17 + 0.5)* 2^21 ≒ 4195352576 - sokutei * 356516
なので、
int sokutei;
long keisannkekka; // intでもいいのかも
keisankekka = (4194304000UL - sokutei * 356516UL)>>21; // 切捨て
keisankekka = (4195352576UL - sokutei * 356516UL)>>21; // 四捨五入 ちょっと修正
>>947
356516 == 2^2*19*4691 == 2^2 * 89129
なのに注意すると、
4194304000 - sokutei * 356516 == (1048576000 - sokutei * 89129) * 2^2
4195352576 - sokutei * 356516 == (1048838144 - sokutei * 89129) * 2^2
ビットシフトを2ビット分節約しても精度を損なわないので、
int sokutei;
long keisannkekka; // intでもいいのかも
keisankekka = (1048576000L - sokutei * 89129L)>>19; // 切捨て
keisankekka = (1048838144L - sokutei * 89129L)>>19; // 四捨五入 PICだとか、ARMだとか、AVRだとか、マイコンの種類に関係なく、
いろいろなソフトウェアの話がでるといいと思う。
>>946のような話は、とても参考になります 理解を助けるために、あえてまとめない場合も多いけどね。
最適化はコンパイラにまかせておく方が主流な気もする。 >>949
この方向を極めるにはこれがおすすめ
ttps://www.amazon.co.jp/dp/443420159X
>>850
うん。
CPU速度やメモリとかがリッチなターゲットなら、
keisankekka = 2000 - sokutei * 0.17;
って書くのが理解し易いですし、変換式が変更になる場合等の保守性も
良好でしょうね。 今気が付いたけど、
keisankekka = 2000 - sokutei * 0.17;
を四捨五入して整数化したものと、
keisankekka = (200050L-sokutei*17L)/100;
とでは結果が異なる場合があるのは内緒なw
sokuteiが5750の場合とかね。
0.17が二進の浮動小数で正確に表現出来ない事に起因するので諦めるしか! 一方で、sokutei∈[0, 10000](整数)の範囲で、
keisankekka = (200050L-sokutei*17L)/100;
に、
keisankekka = (1048838144L - sokutei * 89129L)>>19;
を一致させようとすると、1048838144Lに398足して、
keisankekka = (1048838542L - sokutei * 89129L)>>19;
って微調整すればいいのだけど、こんな事やってられないよなぁw >>955-956
ターゲットに依るんでしょうね。
実行速度が問題になる場合は、実機でベンチマーク取って
どの方法にするかを決めるしか! プログラムROMってね何%まで使えますか?
気持ち悪いので、いつも50%くらいで使っているんですが。
70%を超えると、ドキドキしてしまいます。 なににドキドキするのかわかりませんが、基本 100% 使えるでしょう。
それよりあなたの書き込みの方がキモいです。 >>957
やっぱ実機で検証して満足行くかですね。
しかし、普段Cでしか書かないので同じ計算量でもintだと出来たHEXの容量が少ないlongやdoubleだと容量が大きい、程度の認識しか無いのですが命令数も多い少ない有るのでしょうか?
自分もMikroCのフリーなので2kワードの制限で使ってるので興味深いです。 コンパイラにアセンブラコード吐かせてどんな処理になってるかみたりしますね。
まあ普通に思いつくコード書いてれば、たいていそれがほぼ最適なコードになるんですがね。
無理してポインタとか駆使しても、見にくいだけで大して効果はないという。 さて、
0.17≒2^13/48188==2^11/12047
なので、
2000 + sokutei * 0.17 + 0.5
≒ (2000 + sokutei * 2^11/12047 + 0.5)*12047/12047
≒ (24100024 + sokutei * 2^11)/12047
これから、
int sokutei;
long keisannkekka; // intでもいいのかも
keisankekka = (24100024L + (long)sokutei<<11)/12047; // 四捨五入
>>948と比較して、定数がひとつだけ16ビット値に収まる様になった。
除算は乗算よりも演算速度が不利な場合があるけど、それよりも、
メモリを削るのを優先させたい場合もあると思う。 メモリーが足りないときは、何でもやりますよね。
未使用の周辺機能の設定レジスタをRAM代わりにするとか。 >>962について、>>953みたいな事を試みると、
24100024Lに99足してやると良くて、
keisankekka = (24100123L + (long)sokutei<<11)/12047; // 四捨五入
これも手作業ではやってらんないw ん〜〜、自分で決められる立場にない人ばっかりなんだろうとは思うけど
今は最低でも Cortex-M0 使うことに何の障害もないはず
発注元がバカだったとしても、「今はこういうマイコンが出てます」って
提案して「それはダメだ」とか拒絶されることって、少なくとも自分の
経験ではないんだけどな >>965
8051は永遠に不滅でぇーす!w
…触った事ないけどww
USBつきとか頭おかしい←絶賛
ttp://www.atmel.com/ja/jp/products/microcontrollers/8051architecture/usb_mcus.aspx >>952みたいな事態に何でなるのかと云うと、計算過程で、
0.17 * sokutei ≡ 0.5(mod 1)
になる様なsokuteiが存在して(50, 150, 250, ...)、かつ
0.17 * sokuteiを含む式の値を正確に計算出来ないからなので、
0.17ではない他の値の場合には当て嵌まらないのに注意してね。
つか偶数丸めなんか知らんぞw
みんな真面目に偶数丸めになる様に組んでる? まだやってたのか・・
コンパイラは最適化最強にするとこんな感じのコード吐くんだよ↓
int sokutei;
int keisankekka;
keisankekka = 2000 - (int)((11142L * sokutei) >> 16);
この程度に四捨五入なんていらんだろ。
どうしても四捨五入したいならこうだが時間とメモリの無駄。
keisankekka = 2000 - ((int)((22284L * sokutei) >> 16 + 1) >> 1); みなさんに質問です。
世の中に、バグのないソフトウェアって、あると思いますか?
JRの切符と改札のソフトは、バグを潰しに潰したのか、異常は出ないですよね。
銀行もスゴイ。自動車は・・・ ソフトウェアにバグが存在しないことは証明できない、と誰かが証明していた。 LEDチカチカくらいならバグなしに出来そうだけど。 確かに、巷では、バグの80パーセントは10年たっても
発見されていない場合が多いともいわれるし
20年後にバグが発見されることもある・・・・ >LEDチカチカくらいならバグなしに出来そうだけど。
でも、電源on時に起動しないとか・・・ これはハードウェアのバグか。
ちなみに、プログラム動作用にLED1個を贅沢に付けているのは、この私です。 >プログラム動作用にLED1個を
動作確認用に、なら俺も付けてる。
LEDと抵抗、合わせてたった2円だしな。 四捨五入ですらバグが入り込む事があるんだぜw
ttp://d.hatena.ne.jp/hnw/20160702 LED 1つでも、点滅してくれていると「おっ、タイマ割り込み、ちゃんと動いてるね」と
わかって、いい。
タイマー割り込みじゃなくて、メインループでon/offするのが筋だろうけどね。 10年くらい前になるけど、ボードにJTAGデバッグ用のコネクタ付けようとしたら
派遣先の責任者に、「実運用時には、シリアルポートからプログラム及び
FPGAのコンフィグデータをダウンロードしてフラッシュメモリに書き込むから
(コストダウンのために)必要ない」って言われた。
自分は、ハードだけの担当で、派遣期間も終わりに近かったから
言われた通りに(回路図だけ書いて)おさらばしたら、半年後に
他の仕事してるときに、「頼むから週2日とかでいいから来てくれ」って
言われて、1か月ほど週2日で行った。
すでに修羅場は過ぎてたみたいだけど、聞いたところによると、その前の
2か月ほどは(派遣先の正社員が毎日午前3時に退社とか)地獄だったらしい。
フラッシュメモリへの書き込みプログラムが出来損ないで、30分とか
掛かってたこともあるんだけど、ホント、自分で開発やったことない連中は
デバッグ(官僚用語では「評価」とか言うらしいけどw)環境軽視してるんだなって
痛感した、今ではいい思い出 へー、スゴイね。
連日午前3時までやって、翌日はちゃんし8時半とか9時に来るの?
デバッグと同じくらい、チェック(検査)も舐めちゃ行けない。
「あの電圧を測定するくらいなら、1分もかからずにできるな」と思ったら
測定のための線だしの段取りだけで1時間とかザラ。測定は5秒ね。
アートワークの時に出してもらっとけじ良かったな、と後悔しても遅いね。
とにかく端子やチェックランドは付けて置いて損は無いよね。
実務で徹夜を何度もやったことのある人なら、わかってくれる システム設計がテキトーだと後が大変って教訓ならわかる 例外処理にバグがあったとして、
その例外処理が発生する確率が極めて少ない確率だった場合、
バグは発生しないように見える状態が継続します。
そんなもん。 while(1){バグ対策がバグの嵐を呼ぶ。結局、作り直す。} 1カ所変更したら、全機能をチェックし直す。これが基本ですよね。
やってられません。 >>982
>10年くらい前になるけど
まで読んだ。 >>989
自動化出来るとこは自動化しておくとかって思ったけど、
このスレが対象にしてるやつって、PC内だけでチェックが完結する訳では
ないんでしょうねぇ…。 pc内では完結しなくても、pc繋いだら完結するのが出来たら良いかな。 一箇所変更したら全機能チェックしないと逆にバグで
やられてしまいます。
俗に言うパッチあててそのまま納入したらバグの嵐になったことがある。 // コメント1行だけの追加でも、やっぱり全チェックでしょうか? >>994
行番号とかのデバッグ用の情報無しでコンパイルしたバイナリが、
コメント追加の有無で(バイナリに埋め込まれたタイムスタンプを除いて)
変化しないのなら、気にしないのも手ではないかと。
一致しないのならコンパイラが腐ってるので捨て!
…る訳にはいかないのだろうな。メーカー純正ツールの場合は。 コメント行追加とかデバッグON-OFFでオブジェクトが違うとか
今時ないと思うんだけど、甘いかな? そうだと思う。
けど、もしかしたら・・・と思うと。
チェックに使ったデバッグルーチンも「込み」で完成品にすることがほとんど。 このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 701日 4時間 52分 41秒 2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/
http://pink-chan-store.myshopify.com/
レス数が1000を超えています。これ以上書き込みはできません。