X



トップページ電気・電子
1002コメント383KB
マイコンソフト 悩み事相談室
レス数が1000を超えています。これ以上書き込みはできません。
0001PIC24FV32KA304
垢版 |
2014/09/11(木) 14:10:27.62ID:9fiLP72Z
.
  ∧ ∧    
  ( ´・ω・) < コンフィグって何? 昆布なら知ってる。  ボラチルって何? ボラは魚だよ。
  ( ∪ ∪   ,.-、     ,.-、   ,.-、     ,.-、
  と__)__)  (,,■)   (,,■)  (,,■)   (,,■)
         PIC    AVR  H8    ARM

  学校でC言語を習ったことがあるので「楽勝でしょ」って、マイコンを始めたけど、
  わからないことだらけ。誰か教えて!

  PCとは、別世界のマイコンのソフト。難しいよね。

  ツールの使い方、ツールの設定、マイコン特有のC言語の書き方、
  「デバッグモードにプログラミングモード。何?」 Eclips, Emacs って何?
  VBAしか知らないよぉ、という人まで、
  各社マイコンに関するマイコンソフト相談室です。

  質問者は、「初心者質問スレ」の>>1を見て、分かり易く質問を書いてね。
  回答者は、威張らない、バカにしない、言葉使い注意で、親切に教えてあげてね。

  あっ、そうそう。 
  ハードウェアに関する質問は、それぞれのマイコンのスレに、達人がいるから。

  では、質問、ドゾ〜
0002774ワット発電中さん
垢版 |
2014/09/11(木) 14:35:56.41ID:j+XJOBoe
データx(2〜32767)以上で一番近い、1ビットだけ1になった値yを取得したいんですが
シフトしながら比較ループを繰り返すより効率良いよい方法ってないでしょうか?

for (y = 2; y <= 0x8000; y = y << 1) {
  if (y >= x) break;
}

yを例えば0x80から始めて、x以上かxより小さいかでシフト方向を切り替えるって方法も考えられますが
ループ回数がせいぜい半分になるだけですよね。。
0003774ワット発電中さん
垢版 |
2014/09/11(木) 19:23:30.47ID:jiduBXzl
この問題は x - 1 について2進表記した場合
1が立ったもっとも大きい桁を求めて
その2倍の桁に当たる数を答えればよい
ういう類のは昔から研究が盛んで
ttp://www.nminoru.jp/~nminoru/programming/bitcount.html
このページでいうNLZが求まれば解ける
(つづく)
00043
垢版 |
2014/09/11(木) 19:24:39.92ID:jiduBXzl
おいらはこんな風に解いてみた
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;
}
}
}
(つづく)
00053
垢版 |
2014/09/11(木) 19:25:28.62ID:jiduBXzl
} 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回の比較で求められるがどうだろうか
00063
垢版 |
2014/09/11(木) 19:27:17.20ID:jiduBXzl
こんなのも考えたがスタックを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;
}
00073
垢版 |
2014/09/11(木) 19:28:14.67ID:jiduBXzl
こんなんかいてチェックした
int main(int argc, char *argv[]) {
int x, y;
for (x = 2; x < 32768; x++) {
y = f(x);
printf("%d %d\n", x, y);
}
}
(おわり)
0008774ワット発電中さん
垢版 |
2014/09/12(金) 03:14:15.43ID:K2WqplYa
いきなり、ハイレベルな話題ですね。
00093
垢版 |
2014/09/12(金) 08:33:00.80ID:xHkW10qb
>>5
×5回の比較で求められるがどうだろうか
○4回の比較で求められるがどうだろうか

_o_
0010774ワット発電中さん
垢版 |
2014/09/12(金) 11:15:09.63ID:hoYjjaQA
表を二個使う。
1バイト実装で1〜32の定数を返すニーモニクがあるなら
32767個並べてテーブルを用意し、その直前の番地で
引数をプログラムカウンタに足して飛ぶ。返り値の1〜32が
(答えのビット位置になるように表に答えを格納しておく)
1〜32ビットの引数から該当するビットパターンを返す内容の行に
変換する二つ目の表での分岐を経て答えを返す。
比較を一切せず、二回のジャンプで可能。
0012774ワット発電中さん
垢版 |
2014/09/12(金) 13:04:25.63ID:hoYjjaQA
ジャンプテーブルもテーブルの一種ですよね・・・

PICの場合はRETLWがあるからPCLに足して分岐させたりできます、ただ、
ページをまたがないように配慮する必要があります・・・
0013774ワット発電中さん
垢版 |
2014/09/13(土) 01:22:54.33ID:BbsLXRJ6
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()を成立させて{}で待つ、という方法です。
この待ちがないと、文字が化け化けになってしまいます。

質問しっぱなしですみません、今日はもう寝ます。ごめんにさい。
0014774ワット発電中さん
垢版 |
2014/09/13(土) 05:26:34.37ID:2zH4nfVS
while(TRMT == 0);

or
while(TRMT == 0){}
or
while(1){
if(TRMT == 0) break;
}
or
......
iroiro yattemirutoiiyo
0015774ワット発電中さん
垢版 |
2014/09/13(土) 08:59:18.67ID:X74+LI9m
>>13 こっちではその2行はコンパイル通るよ
PIC16Fってのがみそかなあ
while(~TRMT){}; <- この空文orセミコロンの一方は不要ってのはいいよね
while(~TRMT){} か
while(~TRMT); ね
でもエラーには関係なさそう
それ ここに書いてない35行目より前の行に原因ないですか?
0016774ワット発電中さん
垢版 |
2014/09/13(土) 12:39:05.83ID:eglDsTBr
データシートみれば分かるけどTRMTはステータスレジスタ中の特定ビット位置に
配置された機能の名称なのでエラー出て当然
0018774ワット発電中さん
垢版 |
2014/09/13(土) 13:37:25.74ID:BbsLXRJ6
>>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;
0019774ワット発電中さん
垢版 |
2014/09/13(土) 14:43:10.84ID:BbsLXRJ6
>>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の値を入れて来るの? 比較できないじゃん」
ということのようですね。

そうならそうと、日本語で説明してくれ。俺は悪くない。

ありがとうございました。
0020774ワット発電中さん
垢版 |
2014/09/13(土) 14:47:49.88ID:0LhsoOS3
>>18
{}は複文、;は空文。
while(式){};という記述は、{}がwhile(式)に対する文として認識され;は次の文として認識される。
文法的には誤りが無いのでエラーにはならない。
複文、空文のいずれでも良いが、今回の場合は「明示的に実行文が無い」という事なので、while(式); の方が意味合い的に近いと思うがコンパイルすればどちらも同じ結果かと。
0021774ワット発電中さん
垢版 |
2014/09/14(日) 14:19:24.10ID:ASoYbxBf
教えてください。

switch case文が好きで、よく使います。
しかし、ソース記述するときに、インデントは、どのようにしたら良いのでしょうか?

switchは { } なので、forなどと一緒で 次のように1段下げていますが、
switch (xxx){
  case xx :  break;
  default :  break;
}

switch (xxx){
case xx :  break;
default :  break;
}
と言って、言うことを聞かない子もいます。
どちらが本当でしょうか?
0022774ワット発電中さん
垢版 |
2014/09/14(日) 17:38:03.75ID:/WktBUMr
好き好きw
グループプログラミングならルール決めるか
エディタが提供するインデントルールに従うとかすれば

私は下派
コロンで区切るってことは ラベル(goto文の飛び先)
とおなじものだと考えているんだろう という解釈で
breakはインデントを下げて書いてる 見逃したとき悲惨なので

switch (argv[1][0]){
case 'a' :
case 'A' :
bf = 0;
 break;
case 'b' :
case 'B' :
default :
bf = 1;
 break;
}
0023774ワット発電中さん
垢版 |
2014/09/14(日) 17:39:03.46ID:/WktBUMr
ごめん こうね

switch (argv[1][0]){
case 'a' :
case 'A' :
 bf = 0;
 break;
case 'b' :
case 'B' :
default :
 bf = 1;
 break;
}
0024774ワット発電中さん
垢版 |
2014/09/16(火) 13:25:14.37ID:tplka4u+
教えてください。

#pragma についてです。

#define とか、#includeなどの、プリプロコマンド(?)は、
defineだからコンパイラーが読んでいくときに置き換えるんだな、
ここに、別ファイルを入れ込むんだな、とわかりますが、
#pragmaに出会ったときのコンパイラの仕草がわかりません。
PICのときはconfigのセットに使われるようですが、
まさかSunのワークステーションでconfig はないだろうし、

#pragmaに出会ったときのコンパイラー君の動作を教えてください。
処理系で全く違う動きをするのでしょうか?
0025774ワット発電中さん
垢版 |
2014/09/16(火) 14:08:56.96ID:+k5WM6Jj
>処理系で全く違う動きをするのでしょうか?

そうです。処理系ごとに固有の機能のために用意されたのが#pragmaですので。
0026ミ ' ω ` ミ
垢版 |
2014/09/16(火) 14:12:21.51ID:GtB9SuBQ
プリプロセサ指令 ( preprocessor directive )

#pragma は、その後に何か書いてそのコンパイラ特有の機能を呼び出すためにある。
0027774ワット発電中さん
垢版 |
2014/09/16(火) 14:52:28.36ID:tplka4u+
>>25, 26
ありがとうございます。
>固有の機能のために用意されたのが#pragmaですので。
やはり、そうなのですか。
そうすると、
#pragmaの動作、記述方法は、各コンパイラーの取説を読まないとわからない、
という理解ですね。
どうもありがとうございました。
0028774ワット発電中さん
垢版 |
2014/09/17(水) 02:51:45.86ID:sf+7PZeG
MPLABとXC16のの無償版を使っていますが、
warning : あなたの使っているの、無償版だからね。
みたいなwarningが出ます。これを出ないようにする方法はありますか?
以前に、別スレで見たような気もするんですが
0033774ワット発電中さん
垢版 |
2014/09/18(木) 09:01:59.85ID:V0IrYE/3
アチョーッ!       じゃなくて、ライセンス認証部をクラックして有償ソフトを無断利用できるようにすること=割る、割られたsoftwareや悪用行為をWarezと呼ぶ。っていうか逆かw
0034774ワット発電中さん
垢版 |
2014/09/19(金) 02:19:49.52ID:HBHBTqQF
初心者ですが、教えてください。

MPLABのテクストエディターについてです。
1つ目
ソース上のキーワードを選択して、そのキーワードの出てくる箇所を教えてくれる機能は
ありますでしょうか? (機能の名前がわからないのです)
Findだと、そのファイルの中だけですが、
それは、プロジェクトの中の全てのソース、ヘッダファイルも検索してくれるものです。
結果は、新規ファイルを開いて、そこにパスとともに列記され、その行をダブルクリック等すると、
その場所を開いてくれる、というものです。
秀丸などでは、grep(グレップ?)という機能がそれに当たります。

2つ目
MPLABのテクストエディターでTAB=4で設定してソースを書くのですが、秀丸なと一般的なエディタで
それを開くと、整列がおかしくなります。
よく見ると、MPLABでTAB=4に設定しても、1TABと、半角4つでは、位置が異なり、綺麗に整列しません。
一般のエディタと同じようにTAB設定するには、どうとたら良いのでしょうか?

3つ目
コンパイル結果のエラーの青い文字の上で、ダブルクリックしても、ソースの該当場所に飛びません。
以前はちゃんと飛んでくれたように記憶しています。どの設定を触れば良いのでしょうか?

宜しくお願いします。
0036774ワット発電中さん
垢版 |
2014/09/19(金) 09:39:29.74ID:HBHBTqQF
>>35
えっ? 僕のことでしょうか?
偉そうではないです。
本当は、MPLABで秀丸エディターがうまく使えるといいんですが、
MPLABに秀丸を登録できるのですが、1つ目や3つ目のことができないのです。
それができれは、秀丸を使わなくてもよいのです。
0037774ワット発電中さん
垢版 |
2014/09/20(土) 10:59:19.88ID:WANwkjVb
他スレから誘導されてきました。

以前に別のスレで話題になっていましたを回線使う話ですが
だとをユーザーが書くのでそのときの話の対策でできますが
だとを書かなくてもができます逆にユーザーがを書くと
二重定義で怒られます
でを回線使う方法を教えてください困っています
0039774ワット発電中さん
垢版 |
2014/09/21(日) 02:36:53.00ID:mpaaFAZ6
PIC24Fで、LEDの光量調整に、PWMを初めて使います。
しかし、1日中格闘しましたが、動きませんでした。
原因
・設定が多くて、それぞれの意味がよくわからない。なぜフォルトが関係あるのか。
・なぜPWMに同期が関係するのか、わからない。
・クロックソースは、システムクロックを使い、16bitのカウンターをフリーで回して、
  比較値も1個でいいのに、設定値が2つもある。
・クロック源にタイマーが5本選べるのだが、その周期の設定方法がわからない。
・サンプルを検索しても、16F, 18Fはボロボロ出てくるのに、24Fになると、
  一気に無くなる。明日後閑さんの本を買ってこよう。
・データシートが英語で、わけがわからない。
・そもそも、俺がバカという噂もある。

ちょっと情けない1日だった。
0040774ワット発電中さん
垢版 |
2014/09/21(日) 04:43:33.72ID:rMrChZpA
>>39
PWMは、PICの周辺モジュールの中でも、一番面倒なものの1つ。
まぁ、ガンバレ。
0041774ワット発電中さん
垢版 |
2014/09/21(日) 06:38:31.27ID:MCfBJJ7P
>>39
http://ww1.microchip.com/downloads/en/DeviceDoc/33035a.pdf
の64.7.3かい?今チラ見しただけだけど、確かに凝ったつくりというのか
あれもこれもと詰め込んだ感じだね。これだけ凝るならWizardでも用意
すればいいのにね。(おかげで一回PSoCすると戻りにくくなる(笑))
とりあえず、PWMの管理はこれが骨でしょ。
&#8226; CCPxTMRL as the Timer register
&#8226; CCPxRA for the Rising Edge Value register of the next period
&#8226; CCPxRB for the Falling Edge Value register of the next period
&#8226; CCPxPRL for the Timer Period register

Faultはパワー制御なんかでFETのゲート制御なんかにPWMを
使っていて、何かヤバイことになったときの緊急停止用では?
0042774ワット発電中さん
垢版 |
2014/09/21(日) 12:50:27.56ID:rMrChZpA
どんなに複雑な機能でもいいけど、
・なぜ、このような機能があるのか
・どのようなときに有効にすべきか
・そして、サンプルコード
が書かれていればいいんだけど、
わかっている人のために、わかっている人が作るから、あのような設定になる。
16FのPWMは簡単だったのにね。
ホントにWizardが欲しいわ。
0043774ワット発電中さん
垢版 |
2014/09/23(火) 00:04:14.84ID:KJDqzsq1
>>2
xより大きいyなら
xをレジスタに入れて左ビットシフトを行いx==0になったら、
y=1を同じ回数+1回右ビットシフト
x以上のyなら知らん
0044774ワット発電中さん
垢版 |
2014/09/23(火) 02:54:13.82ID:1toXh/Yr
>>39
心配すんな、俺は、PIC24のA/Dに1日かかった。
機能多すぎ。テーターシートの説明悪い。
0045774ワット発電中さん
垢版 |
2014/09/24(水) 03:19:17.10ID:EfsHsnSn
Microchipのサイトに、セクション毎のデータシート というか使い方説明の日本語訳がある。
モジュールの使い方など、英語ではわかりにくい部分を説明してくれて、とても助かる。
日本語なので、英文のそれに比べて、16倍分かりやすくて、助かる。
ただ、誤記が多い。レジスタ名の番号違いとか文字抜けなど。
編集者は、どんな校正をしているのか、と思う。
0046774ワット発電中さん
垢版 |
2014/09/24(水) 20:57:03.38ID:eziRoGJE
教えてください。
#ifdef についてです。
デバッグ時のprintfを埋め込んでおき、簡単にスイッチするのに、#ifdef があることを知りました。
そこで調べてみたのですが、

林晴比古さんの本では、
#defin DEBUG 1

#if DEBUG 
   printf(....
#endif
と、ありますが、ネットで検索したものには、

#define DEBUG

#ifdef DEBUG 
   printf(....
#endif
と、あります。
どちらも動くのでしょうが、本来の正しい姿は、どちらなのでしょうか?

また、#define DEBUG だけで、置き換える値なしでよいのでしょうか?
0048774ワット発電中さん
垢版 |
2014/09/25(木) 00:44:08.72ID:9yv5IXCx
#ifdef #ifndef は古くからあるマクロで
#if は後から追加されたマクロです
どっちも使っていいですが
#if DEBUG と #ifdef DEBUGは意味が違います
#if defined(DEBUG) なら #ifdef DEBUG と同等です
詳しくはこちら
ttp://msdn.microsoft.com/ja-jp/library/ew2hz0yd.aspx
0049774ワット発電中さん
垢版 |
2014/09/25(木) 01:36:51.25ID:Ml9vIpxV
>>48
ありがとうございます。よくわかりました。ご紹介のページ、読んで見ます。

ちなみに、#ifdef DEBUG 等の文章は、
目立つように、画面の左端から書き出すものでしょうか? 
それとも、通常のソースと同じように、インデントを付けて 
ソースの中に埋め込んでしまうものでしょうか?

画面左に置くのもいいかな、と思いますが、
せっかくインデントを付けて、流れるようなソースを書いたのに、
台無しになってしまうように思います。
通常みなさんは、どのようにされているのでしょうか?
0050774ワット発電中さん
垢版 |
2014/09/25(木) 07:13:57.71ID:9yv5IXCx
個人ならお好みで
グループ開発ならなんかルールを決めて
としかいいようがない だいたいマイコンねたじゃなくて
C言語ねただし

わたしの感覚では マクロはコンパイラへの直接指令のような
もので あくまで付け足し C言語とは別物
でもこれは異論百出であろう マクロなくして
C言語なし と思う人多数かも しかし マクロの働きをする
別の仕掛けを用意してもかまわないわけで

ttp://www.sra.co.jp/public/sra/product/wingnut/gcc/cpp-j.html
005148,50
垢版 |
2014/09/26(金) 08:34:57.49ID:Tl7xp5RT
昨日新旧K&R本(仕事場においてある)で裏をとって
いろいろ間違っていたのでお詫びと訂正
1) #if は新しいマクロ→間違い 古いK&Rにも載ってるよ orz
新しいのは #if の後ろに書ける defined という演算子と #elif
2) マクロはつけたし C言語とは別もの→いいすぎ マクロはC語の一部
やっぱり古いK&R で マクロによって言語を拡張していると書いてある
いろいろ嘘ついてスマソ _o_
0052774ワット発電中さん
垢版 |
2014/09/26(金) 22:16:34.56ID:YHFrk2+b
>>50,51
わざわざ、ありがとうございました。
>>50で紹介いただいたサイト、面白いですね。思わず読み込んでしまいました。
本にしてもいいくらいの内容でした。
#defineの働きは、すごいですね。奥か深そうです。

ただし、#defineの機能によりソースが簡単に見えても、その実はかなりの行数になっていた、
ということもありそうなので、注意したいと思います。

しかし、面白いページでした。ありがとうございます。
0053774ワット発電中さん
垢版 |
2014/09/27(土) 14:25:25.18ID:HdpbAPBe
みなさん、こんにちは。PICのC言語で質問があり来ました。
以下の様なことがしたいですが、PICでできるでしょうか?

ソースの途中で
txPC( "Hello" );  // PCにRS232経由でHelloと書く
rx_data = inPC();  // 改行が来るまでの文字列を受け取り、rx_dataに格納する

宜しくおねがいします
0055774ワット発電中さん
垢版 |
2014/09/27(土) 15:43:22.77ID:HdpbAPBe
ありがとうございます。

引数として、'A'とか'B'はできるのですが、"Hello"などの複数を入れると
エラーでてしまいます。
グローバルで text2="Hello"をとって置いて、
txPC(text2)という感じで番号で指定するのはできるのですが、
そうではなくてその都度文字列を渡したいのです。
0056774ワット発電中さん
垢版 |
2014/09/27(土) 16:00:47.63ID:BOINi97q
txPCって関数の宣言ってどうなってんの?
引数は const char * なのか?
0058774ワット発電中さん
垢版 |
2014/09/27(土) 17:22:20.75ID:/Oz+DN0f
>引数として、'A'とか'B'はできるのですが、"Hello"などの複数を入れると
>エラーでてしまいます。
なんでこういう連中ってどういうエラーメッセージが出ているか
書かないのかな?
得意のコピペするだけだろうに。
0059774ワット発電中さん
垢版 |
2014/09/27(土) 17:28:12.04ID:yDogR68y
>>55
> エラーでてしまいます。

で、そのエラーはてめえらでエスパーしろとか
俺はパスするわ
0060774ワット発電中さん
垢版 |
2014/09/27(土) 18:14:38.77ID:HdpbAPBe
すみません説明不足でした。エラーが出るというのが間違いです。すみません。

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が反応しなくなって、慌てています。
0061774ワット発電中さん
垢版 |
2014/09/27(土) 18:19:33.69ID:HdpbAPBe
まちがえました。配列です。
unsigned char text2[] = { 'H', 'e', 'l', 'l', 'o' };  でした。
0062774ワット発電中さん
垢版 |
2014/09/27(土) 20:06:15.31ID:+1vn2MBd
else if( x == text2 )
てのでまずエラーだわねえ

txPCてのがちゃんとうごくなら
int n, i;
n = strlen(text2);
for (i = 0; i < n; i++) txPC(text2[i]);
でおしまいのような
0063774ワット発電中さん
垢版 |
2014/09/27(土) 20:07:21.47ID:+1vn2MBd
ああ,
unsigned char text2[] = { 'H', 'e', 'l', 'l', 'o' , '\0'};

unsigned char text2[] = "Hello";
とやってね
0064774ワット発電中さん
垢版 |
2014/09/27(土) 20:23:04.17ID:BOINi97q
>>61
それはそれで、if (x == text2) がわけわからんことになるよ
まずはC言語で文字列を関数の引数として渡す方法を調べてみ
0066774ワット発電中さん
垢版 |
2014/09/27(土) 23:00:29.21ID:WzFfUYd6
>>60
引数がunsigned charだから1文字しかわたせないんじゃね。
ポインタを渡さないと。
0067774ワット発電中さん
垢版 |
2014/09/28(日) 03:15:44.61ID:PNHobL+2
PICで質問があります。

PCからRS232で文字を受信したいと思います。1回の文字数は3文字です。
PCは必ず3文字送る予定ですが、受信側のPICの都合やケーブルのノイズなどで、
3文字でなく4文字だと思ったり、2文字のまま3文字を待ち続ける、ということもあると思います。
こういう場合の定石は、どのようにすべきでしょうか?
もちろん、ケースバイケースだと思いますが、
・4文字だと思ってしまった場合は、受信データを破棄して、最初に戻り、
  1文字目を待ち続ける
・3文字目がちっとも来ない、という場合は、時間で見切って最初に戻る

一般的にどのようにするのが正解でしょうか。
0068774ワット発電中さん
垢版 |
2014/09/28(日) 09:32:33.57ID:tDrMUQxm
PCからの送信が垂れ流しなのか通信制御するのか
データ化けするかもならチェックサムもいるし
垂れ流しでも応答でもタイムアウト管理は必須

ちょっと色々足りなさすぎてよくわからん
取り敢えず3文字受け取れば良い、なら
・3文字目がちっとも来ない、という場合は、時間で見切って最初に戻る
これでいい
0069774ワット発電中さん
垢版 |
2014/09/28(日) 11:06:01.06ID:o0YeEGDe
>>67
まず受け取れない時に次の文字が来ちゃったとか、ノイズで変な文字になったりしたら、オーバーランとかフレーミングエラーになる(検出できないこともある)
相手も設定できるなら、パリティチェックもできる

> こういう場合の定石は、どのようにすべきでしょうか?

まず、一文字目が確実に判定できるようにする
三文字が ASCII 文字なら、頭に 0x00 をつけるとか、バイナリーなら Base64 でエンコードするとか

エラーになったらそれまで読んだ部分は捨てて一文字目を待つのが基本
0070774ワット発電中さん
垢版 |
2014/09/28(日) 11:33:41.73ID:HiN/wJmC
おいらなら固定長で考えずEOT(End of Transmission)文字を
決めといてそれを見るようにするな
あとこっちから「こないぞ?」って親側に催促できる機能が
つけられたらつけとく
親から垂れ流しっぱなし って場合は データのはじめかおわりを
表わす文字がくるとおもうのでそれをたよりに通信を立て直すしかない
あとは状態遷移図をさぼらずちゃんと書く
通信はともかくめんどいのでがんばる
0071774ワット発電中さん
垢版 |
2014/09/29(月) 18:26:44.50ID:HYefIw5a
最下位層でエラーが起きるのは当然なので、上位層のプロトコルを
作ってそこでエラー検出と始末のつけ方を決める。

今更流行らないのかもしれないけど、一応7階層モデルの考え方とか、
比較的簡単なX.25程度はザッと頭に入れておいて損は無いと思うよ。
0072774ワット発電中さん
垢版 |
2014/09/30(火) 13:29:07.09ID:DhXf1SwE
教えてください。

採用面接で「マイコン、何が扱えるの?」と聞かれて、PICだと答えたら、
「PICですかぁ〜」と言われました。
決してPICが悪いことはないと思っているいし、自信はあるのですが
露骨な態度に、萎えてしまいます。

世の中のマイコン事情は、ARMとか78KとかH8なのでしょうか?
心が折れそうです。揺らぐ心に、説教してください。
0073774ワット発電中さん
垢版 |
2014/09/30(火) 13:40:57.91ID:qruQjEQA
どこ受けたんよ? PIC使ってもんだいなさそうな職種なん?
0076774ワット発電中さん
垢版 |
2014/09/30(火) 20:41:23.37ID:YZxahowe
>>72
PIC っつーても色々あるから、十把一絡げで答えるような奴はうちでも採用しないだろうな
0077774ワット発電中さん
垢版 |
2014/09/30(火) 20:42:44.00ID:OCSzRmGs
>どこ受けたんよ? PIC使ってもんだいなさそうな職種なん?
やっぱりPICは問題ありなのでしょうか?
0078774ワット発電中さん
垢版 |
2014/09/30(火) 20:46:09.87ID:OCSzRmGs
ていうか、>>72は僕ではありません。
僕は「初めてのPIC」に書き込みました。
誰かが、こちらに貼り付けた用です。
0079774ワット発電中さん
垢版 |
2014/10/03(金) 23:42:32.96ID:yE/FajNs
教えてください。電気初心者です。

PICのIOポートで、16bit出力を同時にon/offさせることはできるでしょうか?
例えば、
  b_port = 0x1234;
  c_port = 0x5678;
と書いたところで、8bitずつ変化してしまい、16bit同時では無くなってしまいます。
これを、16bit同時に「ポンッ」と変化させることはできるでしょうか?
HC573等、外部にラッチを置けばよいのでしょうが、PICのI/Oだけでやりたいのです。

PICの品種は、ミッドレンジでも24Fでもいいです。
24Fだと、GPIOも16bit構成になってはいますが、
連続して16bit取れる品種が見つけられませんでした。
0080774ワット発電中さん
垢版 |
2014/10/04(土) 02:00:31.39ID:+VDSpa4D
>79
DIP28ピンのPIC24FJ64GA002でもQFP44ピンのPIC24FJ64GA004でも
RB0-15がつかえるはずだけど。16bitPIC(dsPIC30系は除く)で28ピン以上なら
だいたいRBが連続で取れそうだけど。

用途がもしDACなら下記の品種なら16bitDACが乗ってるよ
http://akizukidenshi.com/catalog/g/gI-08458/
0081774ワット発電中さん
垢版 |
2014/10/04(土) 04:05:23.39ID:RbX2TMlG
>>80
どうもありがとうございました。確かにb_portは連続していますね。
調べ不足ですみませんでした。

16bit D/Aいいですね。 これまではR-2R + OP AMPでしたので、
今度使ってみたいと思います。ADも16bitなら文句なしでしたね。
0082774ワット発電中さん
垢版 |
2014/10/06(月) 16:28:56.59ID:vyouwGuR
初心者ですが、教えてください。
MPLAB IDEを使っていますが、
ウインドウ上部に、ReleaseとDebugという選択メニューがあります。
この切替は何のためにあるのでしょうか?
というか、どのようにして使い分けるのでしょうか?
0083774ワット発電中さん
垢版 |
2014/10/06(月) 16:35:42.91ID:qoUqaxpF
デバックモードにすると、最適化しないとかデバック用ライブラリをリンクする。そういうのが無いとソースコード連動でステップ実行とかパフォーマンス測定とかできない。リリースにするとバイナリモジュールが小さくなるし、実行速度が上がる。
PIC使ったことないけど、似たようなものじゃね
0084774ワット発電中さん
垢版 |
2014/10/06(月) 19:19:55.72ID:+nHj+ig9
目的は >>83 の通りだが、デバッグとか最適化のためだけじゃない
正確にはビルドコンフィグレーションといって、ビルド設定を複数用意して
切替えてビルドするためにある
設定の対象はコンパイラ・リンカのオプションだよ

デバッグ用途の他にプリプロセッサマクロでコンパイル結果を切替えたい時に
マクロ定義をコンパイルオプションに設定したコンフィグレーションを追加したりする
0085774ワット発電中さん
垢版 |
2014/10/08(水) 02:44:43.29ID:2rXn6QBD
初心者ですが宜しくお願いします。
初めて質問いたします。

PICをC言語で動かしてみたいと思っています。
C言語のソフトとして、MicrochipのX16と、CCSのCコンパイラーがあることまでは調べました。
お金の大小は関係無しで、C言語の初学者が購入する場合、どちらがよいでしょうか?
コンパクトで無駄のない、高速動作のコードを吐く方を買いたいと思っています。
0086774ワット発電中さん
垢版 |
2014/10/08(水) 13:18:04.64ID:VWwiLYBT
どちらにもお試し版があるので、それを試すと良いと思う。
(CCSにお試し版があったかわかんないけど)
0087774ワット発電中さん
垢版 |
2014/10/08(水) 19:24:20.95ID:Hh+eRHYl
>>85 >>86
無料のは最適化に制限が掛かってる場合があるので、要確認。
お試ししてから、最後は有償になるのかな。
0090774ワット発電中さん
垢版 |
2014/10/09(木) 17:52:33.68ID:Lty3W5Op
すみません、初心者です。
教えてください(>_<)

3V系マイコン→5V系マイコンへ
Nchオープンドレインで通信する場合
High出力の時は入力
(プルアップして5V接続してあるある)にしますよね?
その場合3V系マイコンに5Vが入力されて
破壊されないのですか?
0091774ワット発電中さん
垢版 |
2014/10/09(木) 18:37:25.58ID:c7906nzD
普通はだめ。5Vでプルアップしても3V+αにしかならない。
5V系がTTLコンパチ入力なら3V出力のまま直結でいけるけど。
0092774ワット発電中さん
垢版 |
2014/10/09(木) 19:03:38.82ID:K0zNmjC9
>>90
ピンに電源電圧以上の電圧をかけていいICは、ほぼ無いと考えていい。

3V出力----レベル変換IC-----5V入力

レベル変換IC = 74HCTxx (T付きは入力敷居値が低い)
レベル変換IC = 74LVCC3245だったかな、秋月に売っている
0094774ワット発電中さん
垢版 |
2014/10/12(日) 14:24:06.55ID:OX67S3sZ
初心者です。教えてください。

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の部分に登録しなくても
  コンパイルが通ります。ここに登録してないファイルがあっても、自身のフォルダー内を見に行くのなら、
  いちいちそこに登録する必要はないと思うのですが、どうでしょう?

よろしくお願いします。
0096774ワット発電中さん
垢版 |
2014/10/12(日) 18:16:24.85ID:K0iHrm7Q
プロジェクトウィザードでプロジェクト作ると自動的にXC8・hはインクルードされます
0097774ワット発電中さん
垢版 |
2014/10/12(日) 21:43:33.20ID:GTK4RiOl
>「はぁ?」なエラーがたくさん出ます。
>(前回通ったソースなのに何言ってんの?)
君面白いよ
0098774ワット発電中さん
垢版 |
2014/10/13(月) 01:57:21.19ID:PXxezVzK
>>94
僕も不思議に思ってる。
通常は、SourceFileのところにmainのあるソースファイルを登録し
その他の.cは、Other Sourceに入れている。Other...に入れれば、
エラー修正の時にも、それをダブルクリックで行けるから、便利。
0099774ワット発電中さん
垢版 |
2014/10/13(月) 07:24:04.71ID:Ww27Jpw/
>>98
登録するのは、そのプログラム特有のソース。(メイク時にファイルが更新されてるか、チェックされる)
標準のヘッダーや、標準ライブラリは、独自に手を加えない限りは登録必要無し。
0100774ワット発電中さん
垢版 |
2014/10/13(月) 09:14:07.70ID:PXxezVzK
>>99
>(メイク時にファイルが更新されてるか、チェックされる)
そうすると、>>94の現象が説明できない気がする。
チェックの結果「更新なし」とれば、いくつ登録してあっても問題ないように思います。
0101774ワット発電中さん
垢版 |
2014/10/14(火) 12:48:08.88ID:86CyBhgH
教えてください。初心者です。

PIC MPLAB IDE 8.92 + XC16 です。
既存の別プロジェクトを開くとき、project menu の中に、「Recent Project」みたいな
ところがあり、過去のプロジェクトのリストが出てくると思っていたのですが、
ないみたいです。
みなさん、どのようにして既存のプロジェクトに、サッとアクセスしているのでしょうか?

ファイルから、Recent Workspace からでしょうか?
それとも、ProjectメニューからOpen...でしょうか。
あるいは、Windows 上でフォルダ内のxxx.mcpでしょうか?

Projectメニューの中に、Recent Project があり、そこに、過去10個分のプロジェクトがあるとか、
そういうのは無いのでしょうか?
0102774ワット発電中さん
垢版 |
2014/10/14(火) 12:55:25.65ID:tMLgXvUK
ファイルエクスプローラーから、ワークスペースファイルをダブルクリック
0103774ワット発電中さん
垢版 |
2014/10/14(火) 14:36:29.73ID:86CyBhgH
>>102
ありがとうございます。
やはり、WorkSpaceをダブルクリックですか。

よくある統合開発環境だと、xxx.pjt (プロジェクトファイル)から起動だと思いますが、
MPLABの場合は、WorkSpaveもmcp (MicroChip Project file)の2つがあるのに、
なぜWorkSpaceからなのでしょうか?
xxx.mcpからでいいと思うのですが。
0104774ワット発電中さん
垢版 |
2014/10/15(水) 17:09:44.43ID:Jsff6LAx
8MHz以上のクロックを外部から入力できて、クロックEdgeからPORT出力までの
時間が規定されていて、Maxで1周期内で外部回路が取り込める(出力遅延時間<<125ns)
マイコンってないでしょうか?
遅延時間自体が問題なので、PORTのトグル自体は8MHzでできなくても構わないです
PIC18シリーズがデータシートに規格が載っているので、いくつかデバイスを調べてみた限りでは
Maxで150ns等とあるのでダメそうです。
0105774ワット発電中さん
垢版 |
2014/10/15(水) 18:57:55.18ID:Br/I2DnA
>>104
言ってることがさっぱりわからん。
PORTに何を出力するんだかわからんし、外部回路が取り込むって何を取るんじゃら?
0106774ワット発電中さん
垢版 |
2014/10/15(水) 19:17:36.68ID:bmXNUSl1
>>104
何をしたいのか書きなよ
その要件なら、入力と出力繋げばいいんじゃね? の回答しか返ってこないと思うぞ w
0108774ワット発電中さん
垢版 |
2014/10/15(水) 21:57:18.30ID:WPYAyoZM
>>104
マイコンで入出力遅延時間を一定にするのは、
結構大変かと思う。
IF()の真偽で時間は変わるだろうし、割込をした日には、もう何がなにやら。

FPGAを使えば、ほぼ期待通りのものが作れる
0112774ワット発電中さん
垢版 |
2014/10/22(水) 01:42:15.72ID:NphTpmKG
C言語初心者です。PICのCで悩んでいます。

enumの効果の範囲がわかりません。
・例えば、グローバル変数のように置いたときは、全域に対して効く
・また、関数の中に書くと、その関数の中だけの効果になり、他の関数からは見えない
・なので、グローバルの位置に書いた enum { a=1, b, c,d }; と、
 関数内部にも、enum { a=2, b, c,d };と書いたとき、全く別物扱いされるのでしょうか?

よろしくお願いします。


この考えは正しいでしょうか?
0113774ワット発電中さん
垢版 |
2014/10/22(水) 02:09:50.64ID:ksx/2cF+
その考えが正しいかどうか確かめるには

・まずそのプログラムを書いてみる。
・コンパイルしてみる。
・シミュレーターで実行してみる。
・結果を見てみる。
・正しいかどうかわかる。

こんなstepを踏めば叶うでしょう。
0114774ワット発電中さん
垢版 |
2014/10/22(水) 09:27:37.67ID:ncnlhpNg
もし同じ名前で宣言してコンパイラ通るならバグ続出する悪寒…
0115774ワット発電中さん
垢版 |
2014/10/22(水) 10:54:15.78ID:GquJjZCI
#include <stdio.h>
enum{ a=1};

int
main(){
enum {a=2};

fprintf(stderr,"%d\n", a );
}

>>112
>C言語初心者です。PICのCで悩んでいます。

書き方が分からなくて悩んでるならまだしも、
単に変数のスコープで何で自分で書いて確かめないんだアホ
これがゆとりか?
0116774ワット発電中さん
垢版 |
2014/10/22(水) 11:01:29.89ID:ncnlhpNg
PICのCの標準エラー出力ってどこにリダイレクションされるん?
0121774ワット発電中さん
垢版 |
2014/10/23(木) 07:26:08.54ID:Oj2bIodF
静かな湖畔の森の影から・・・アホーアホーアホッアホッアホー♪
0122774ワット発電中さん
垢版 |
2014/10/23(木) 09:34:00.80ID:i58R/wkV
>>119
己のアホさかげんを棚に上げて開きなおりか?アホ
死んだら?アホ
0123774ワット発電中さん
垢版 |
2014/10/23(木) 09:48:56.62ID:lNjA4Oll
picやる人って、こういう人ばっかり?
AVRでは、親切に教えてくれたのに
0125774ワット発電中さん
垢版 |
2014/10/23(木) 12:48:46.82ID:RbCgFPbQ
(システム側のつかっている変数のは重複禁止だった気がするけど
ユーザー定義のものに限れば)
ローカル側が優先されるってだけで同名の重複宣言はできなかったっけ?
0127774ワット発電中さん
垢版 |
2014/10/23(木) 17:56:47.24ID:RlahQykH
>>123
こんな便所の落書き掲示板に書かれたことを信用するようなゆとり頭?
親切に嘘を教える事もあるよ。
0128774ワット発電中さん
垢版 |
2014/10/23(木) 18:04:34.64ID:i58R/wkV
>>123
>>126
理解できないのはテメエ自身でなくて人様の責任か?えぇヲラ、アホ
感じ悪いのはテメエらだ。死ねゴミ
0132774ワット発電中さん
垢版 |
2014/10/23(木) 22:50:52.45ID:16AKWrox
日常生活じゃガクブルでとても自己主張なんて出来ない
そんなヤツに限って「匿名」を傘にイキガる滑稽さが悲しい
しかも指摘されての逆切れ付き!
0133774ワット発電中さん
垢版 |
2014/10/24(金) 10:00:48.81ID:krbOasqy
ゆとり馬鹿の戯言まとめ

その一
>>112
>enumの効果の範囲がわかりません。
>・例えば、グローバル変数のように置いたときは、全域に対して効く
>・また、関数の中に書くと、その関数の中だけの効果になり、他の関数からは見えない
>・なので、グローバルの位置に書いた enum { a=1, b, c,d }; と、
> 関数内部にも、enum { a=2, b, c,d };と書いたとき、全く別物扱いされるのでしょうか?

その二 どこに疑問の本質があるかもわからないゆとり馬鹿
>>116
>PICのCの標準エラー出力ってどこにリダイレクションされるん?

その三 馬鹿でも傷つくことだけは一人前www
>>126
>確かに感じ悪い

その四 己のアホを反省するどころか逆ギレ
>>132
>日常生活じゃガクブルでとても自己主張なんて出来ない
>そんなヤツに限って「匿名」を傘にイキガる滑稽さが悲しい
>しかも指摘されての逆切れ付き!

死ねよアホは
0136774ワット発電中さん
垢版 |
2014/10/25(土) 08:59:31.25ID:fEy6W1SQ
>>135
わざわざまんまコンパイルできるように>>115にリスト書いて、
明確に答えてやってるのにアホかテメエは。
どこまでアホなんだ。
しかもPICのCて、スコープが機種依存するとでも思ってるのかこの馬鹿は。
もう死ねよダニ
0137774ワット発電中さん
垢版 |
2014/10/25(土) 09:01:51.14ID:fEy6W1SQ
>>134
なんだって?ゴミ
さっさと死ねや。
死ねなきゃぶち殺しに行ってやるから住所さらせや糞野郎
0139774ワット発電中さん
垢版 |
2014/10/25(土) 18:41:33.17ID:eC/nBZN4
>>137
そのうち通報されるよ、気をつけな。
ほれ、住所w
〒100-8929 東京都千代田区霞が関2丁目1番1号
0140774ワット発電中さん
垢版 |
2014/10/25(土) 18:47:26.65ID:PPy7ls3P
>>137
ネタにしては面白くない
ネタでないなら気の毒なヤツ
どっちにしても哀れw
0141774ワット発電中さん
垢版 |
2014/10/27(月) 00:35:51.89ID:3vYvclh/
>>116
ファイルシステム無いから、リダイレクトは無理。

putch() getch() を自前で、作る。
0142774ワット発電中さん
垢版 |
2014/11/02(日) 13:57:50.99ID:OImDRTLG
プログラムデバッグするのに、printf()で値を垂れ流しして、テラタームで受信と表示。
あとでゆっくりスクロールして、内容確認しています。

ここで質問なのですが、テラタームを、マウスで 受信start stop する方法はあるのでしょうか?

というのは、右手でマイコン基板のスイッチ操作をして、左手マウスでテラタームを操作しているのですが、
テラタームは、受信した文字を常に表示しているので、これを止めることができずに、
受信画面の文字をカット&ペーストするときに、ドンドンとスクロールしてしまい、
切り出しがうまくいきません。
しかたなく、マイコンの電源をoffにして、送信停止して、カット&ペーストします。
しかし、マイコン電源を切るとPICKit3も認識ができなくなり、いちいち面倒です。

もしテラタームのメニュー等で受信の start stop 機能があるなら、
左手のマウスでテラタームをstopをすれば、マイコン側は操作しなくても良いと思ったのです。
しかし、その機能(あるいは似た機能)が見つけられません。

どなたか、ご存じの方、教えてください。
よろしくお願いします。
0143774ワット発電中さん
垢版 |
2014/11/02(日) 14:04:29.37ID:nYqqNb4O
>>142
使ったこと無いけどログ機能があるからこれでファイル保存できるんじゃない?
0146774ワット発電中さん
垢版 |
2014/11/02(日) 14:21:03.67ID:nYqqNb4O
Tera Termで設定で「最下行だけ自動スクロールする」のチェックを外すだけでいいのかな?
0147774ワット発電中さん
垢版 |
2014/11/02(日) 16:12:32.64ID:OImDRTLG
>>143-
ありがとうございます。
ログは使ったことがありますが、面倒かどうかという意味で、外していました。
一旦Logを終了して、秀丸で探してopenしなければなりませんし、
再度テラタームをスタートさせる手間が必要です。

>「最下行だけ自動スクロールする」
って、どこのメニューにありますか? setupのgeneralでしょうか。

少し考えましたら、通信線にスイッチを入れれいいかも、と思いました。
ついでに、クロス、ストレートの切替スイッチも設けて、表示を止めたいときに通信線OFFにする。

作ってみよう。
0148774ワット発電中さん
垢版 |
2014/11/02(日) 17:15:47.47ID:nYqqNb4O
>>147
日本語でインストールしたからその項目で言うと
[設定]-[その他の設定]-[全般]-[最下行でだけ自動スクロールする]

もしかしたらうまくいかないかもしれないです
今手頃な環境がなくてテストできないので
0149774ワット発電中さん
垢版 |
2014/11/02(日) 17:30:17.70ID:nYqqNb4O
マイコン側に受信する関数を作って
マイコンは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;
 }
}
0150774ワット発電中さん
垢版 |
2014/11/02(日) 17:43:39.39ID:OImDRTLG
>>148,149
ありがとうございました。
今日はセコムかけられてしまったので、明日テストしてみます。
ありがとう
0152774ワット発電中さん
垢版 |
2014/11/03(月) 00:06:55.68ID:XkZ78wva
割り込みをやり始めたばかりです。
7セグのダイナミック点灯を割り込みで実現
させる場合、

while ( 1 )
{
7セグLED表示(1234); // 桁の移動は割り込み
}

同じ数でループしているだけなのに、チラつきます。
せっかく、空ループで無駄時間を稼ぐのから、割り込み
が使えるようになったのに。
0153774ワット発電中さん
垢版 |
2014/11/03(月) 00:22:27.69ID:oWIiSiZU
よくわからないな
割り込み部分と「7セグLED表示(1234); // 桁の移動は割り込み」が何を意味するのか
もう少しコード(プログラム)をちゃんと貼ってもらわないとこれじゃ把握できないって
0154774ワット発電中さん
垢版 |
2014/11/03(月) 00:39:05.41ID:NrWi49AG
タイマ割り込みの頻度が低いんじゃねぇの?
ダイナミック駆動ってことはカラムとロウの切り替え順序が逆だと、隣の桁と表示がダブってちらつくように見えるかもしれんな。

俺の部下だったら蹴り入れるな
0155774ワット発電中さん
垢版 |
2014/11/03(月) 12:00:00.28ID:HbHjOhTQ
切り替えたときに1回消さないと
前の桁のが見えちゃってるとか
0156774ワット発電中さん
垢版 |
2014/11/03(月) 14:38:00.43ID:jS/0S3GQ
MPLAB X IDE + XC8 でPIC12F629のhexファイルを作ろうとしています。
ネットを参考にしながらLチカは出来たのですが、ライブラリを使用する方法がわかりません。

#include <plib/delays.h> を入れて、Delay1KTCYx(ms);を読んでいます。
コンパイルは通りますが、リンク時に _Delay1KTCYxのラベルが見つからないとなります。
Delay1KTCYx が入っているライブラリファイルをLibrariesに指定すればリンクも成功しますが、いちいちどのライブラリファイルが必要かを調べるのは手間です。
自動でライブラリファイルを取り込むにはどのようにすれば良いでしょうか。
0158774ワット発電中さん
垢版 |
2014/11/03(月) 17:12:14.91ID:GX2wbjIt
7セグメントLEDのダイナミック表示は結構めんどくさい。
表示したい値の受け渡しは、グローバルで取った表示したい値を、先頭で1回取り込むだけにする。

現在桁のコモン線をoffにする
次の桁の文字パターンをセットする
少し待つ
次の桁のコモン線をonにする
のように、桁移動には全offの期間を設ける。そうしないと、残像が次の桁にも出てしまう
0159774ワット発電中さん
垢版 |
2014/11/03(月) 17:15:31.78ID:GX2wbjIt
>>156
xc8なら、
__delay_ms(xxx)とか、
__delay_cycle(xxx) ←ちょっと怪しいけど、サイクルで待つやつ
とかがあるはずなので、それではダメなの?
0161774ワット発電中さん
垢版 |
2014/11/03(月) 17:26:02.72ID:8qY9pYfg
>>156
ライブラリファイルは自分で指定するのが普通かと思うんだが、自動でリンクするってあるのかな?
0162774ワット発電中さん
垢版 |
2014/11/03(月) 18:49:45.19ID:k+2cLpkF
>>161
少なくとも俺は見たことない
そもそもライブラリの指定なんて最初にやるだけだから気にしたことないし
0163774ワット発電中さん
垢版 |
2014/11/03(月) 19:35:36.36ID:6w8aQ9tG
>>160
plibはPIC18用
使える標準ライブラリと使い方はは、マニュアルに書いてある。
0164774ワット発電中さん
垢版 |
2014/11/03(月) 20:25:50.83ID:jS/0S3GQ
>>161,162
Windows向けの総合環境だとライブラリのディレクトリを指定してやれば必要なライブラリをリンクするんですよね。
PIC向けだと使用するライブラリを指定するのが普通なんですね。

>>163
PIC18向けの環境ならライブラリは自動リンクするんですか?
0165774ワット発電中さん
垢版 |
2014/11/03(月) 21:04:16.79ID:1Lz/SkJl
>>164
Windows の Visual Studio でもライブラリは指定するけど?
ありがちな奴はデフォルトで指定されてるが
0166774ワット発電中さん
垢版 |
2014/11/04(火) 15:58:09.70ID:hjn9d8cI
Win7+MPLAB X IDE + XC8 環境で ICD3で書き込みしようとすると
コネクトエラーになる。
なんでだろう?
swicherのしたにあるwinusbドライバーをデバイスマネージャー
で直接指定して更新してみたがやはりコネクトエラーになる。
ICD3のバージョンが古いのかと思って動いている別のPCのMPLABで
バージョンを確認してみたが最新になっている。
誰かたすけて。
0168774ワット発電中さん
垢版 |
2014/11/04(火) 17:13:18.38ID:THbhzXT3
そのICDは過去に使ったことあるの?
僕は初期不良当たったことあるんだよね。
0170774ワット発電中さん
垢版 |
2014/11/04(火) 17:46:14.64ID:hjn9d8cI
>167
 デフォールトでターゲットから
>168
 ある。MPLABでは正常動作する。
>169
 直接だよ。
0171774ワット発電中さん
垢版 |
2014/11/13(木) 23:58:39.16ID:7a+BmJLx
初心者です。教えてください。

PIC24Fで、PWMを出力するプログラムを作りました。
それなりにDutyが変化するのですが、値を0にしても
2クロック分の1が出て、零になりません。
何かコツでも有りますでしょうか?
0172774ワット発電中さん
垢版 |
2014/11/14(金) 00:00:54.70ID:KasT+FoI
プログラムうpしないならエスパーの集うスレでどうぞ
ここ板違いなんで
0174774ワット発電中さん
垢版 |
2014/11/14(金) 10:57:36.64ID:gBlB4OT4
>>171
そういう仕様なのかもしれんぞ
0で0%、FFで100%が出せないPWMは結構ある
その方が回路が簡単になるからなんだけど
PICはそういう所を削って小さく安くしてるから
と思ったけど、PIC24ならそんなことないかもね
0177774ワット発電中さん
垢版 |
2014/11/29(土) 11:48:49.49ID:Br1YYVPI
PWMモジュールを割り当ててしまうと、I/Oができないんです。
その都度モジュールをoffするということでしようか?
0179774ワット発電中さん
垢版 |
2014/11/29(土) 12:32:31.21ID:+/Ao5Rsn
>>177
PULSE STEERING MODEでSTRxを0にすればPORTに出力したデータが
出ると思うが

ENHANCED PWM AUTO-SHUTDOWN MODEでもできる
0180774ワット発電中さん
垢版 |
2014/12/01(月) 13:08:54.54ID:SqzDRwcd
STEERINGって、どういう意味でしょうか。
ハンドルしか思い浮かばないんですが、この場合どういう意味でしょうか
0181774ワット発電中さん
垢版 |
2014/12/03(水) 22:50:26.76ID:7E1rmHj8
舵を切ること → 何かの方向をかえること → ポートの機能を切り替えること
じゃないかな
0182774ワット発電中さん
垢版 |
2014/12/16(火) 16:27:20.29ID:UfLrgrHF
電子工作趣味の範囲でビデオゲーム基板みたいなのを作りたいのですが、グラフィックチップで扱い易いのは無いものでしょうか?

パチンコ基板であるアクセルのAGシリーズみたいなのは無理としてもそれに準ずるみたいなのです。

PIC16F88でビデオ操作しましたが32×24ドットの表示しか出来ませんでした。
0186774ワット発電中さん
垢版 |
2015/01/01(木) 01:45:35.31ID:btT7Gqth
.
あけましておめでとうございます。
今年も、マイコンソフト 悩み事相談室 を宜しくお願いします。
0187774ワット発電中さん
垢版 |
2015/01/24(土) 19:27:12.61ID:Z92yVL3n
LPC1114をmbed化して使っているのですが、SDカード書き込みを一定回数以上行うと処理が終了してしまいます
例えば、hello worldとだけ書き込む場合は26回、MPU6050のデータを書き込む場合は20回ファイルを閉じるとそれぞれ処理が終了します
処理が終了するといってもLチカして挙動を確認すると、直前にLEDがついているとつきっぱなしに、消えていると消えっぱなしになっていました

while(1)で無限ループさせようとしているのに、このような挙動になってしまうのはどうしてなんでしょうか?
SDカード書き込みにはSDFileSystemというライブラリを使用しています
SDカードではなくSDHCカードに書き込んでいるのが原因なのでしょうか?それとも何度もファイルを閉じると処理落ちしてしまうのでしょうか?

よろしくお願いいたします
0188187
垢版 |
2015/01/24(土) 19:50:31.28ID:Z92yVL3n
すいません、上の書き込みに誤りがありました
正しくはそれぞれ27回目と21回目のファイルオープンで処理が終了しているようです
0189774ワット発電中さん
垢版 |
2015/01/25(日) 20:12:45.61ID:BPt/Hyy1
PICのRB0/INTピンって、割り込みを監視しながら普通の入力ポートみたいに現在値を取得することってできるのかな?教えて下さい先生方。
0191774ワット発電中さん
垢版 |
2015/01/26(月) 00:18:50.47ID:ViaeqY5f
>>190
先生!LATレジスタをググってみましたがストンときませんでした!あと一歩!あと一歩お導きを!
0193774ワット発電中さん
垢版 |
2015/01/26(月) 17:58:14.41ID:QkMkZDbh
>>190>>192
先生方!ありがとうございました!
0194774ワット発電中さん
垢版 |
2015/01/28(水) 13:32:33.05ID:vy10bibv
初心者です。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 の使い方が何か間違っているのでしょうか?

よろしくお願いします。
0196774ワット発電中さん
垢版 |
2015/01/28(水) 14:13:24.29ID:vy10bibv
>>195
さっそく、ありがとうございました。
ご指摘の通り直したら、すんなりと通りました。
どうもありがとうございました。

相談して良かったです。ありがとうございました。
0197774ワット発電中さん
垢版 |
2015/02/01(日) 22:56:43.52ID:yJd9WW1C
>196
#define で定義したものは、単純に文字の置き換えがされる。

#define D1 0x000668UL;
test(0,D1);

は実際には
test(0, 0x000668;);
となってしまので、エラーになる
0199774ワット発電中さん
垢版 |
2015/02/02(月) 21:01:11.59ID:mBa21Hy6
人の発言に勝手に補足してくどい奴っているよね
会議とかの時は邪魔だから消えろと思う
0205774ワット発電中さん
垢版 |
2015/02/04(水) 14:59:14.30ID:MOOQ+xoU
おまえか?…便所のエロいラクガキに
デッサンの狂いを正した赤ペン先生はっ

元絵は鉛筆で消せたのに油性ペンで書くんじゃないバカチンがっ!!
0206774ワット発電中さん
垢版 |
2015/02/07(土) 02:48:11.13ID:lCk6oY2U
教えてください。

PICをC言語で書いています。
通信で送られてきた文字列データを取り出す方法がわかりません。
送られてきた文字 = "123,456,
0207774ワット発電中さん
垢版 |
2015/02/10(火) 02:16:01.78ID:t6iB3KaN
>>206
こういうことでいいの?
int getNum(char *cp) {
int num = 0;
while(1) {
if(*cp<'0' || *cp>'9') break;
num = num*10 + (*cp-'0');
cp++;
}
}


これがあれば、
x = getNum(送られてきた文字);
で、いいかと。
0208774ワット発電中さん
垢版 |
2015/02/10(火) 02:18:18.76ID:t6iB3KaN
あう、getNum関数の最後に、

return num;

を忘れています。
0209774ワット発電中さん
垢版 |
2015/02/10(火) 02:27:36.70ID:t6iB3KaN
次々に数字を取り出すつもりなら、
こんな関数を作った上で、

char *cpNext(char *cp) {
while(1) {
if(*cp<'0' || *cp>'9') break;
cp++;
}
return cp;
}

二つの関数を繰り返し呼び出せばいい。
0210774ワット発電中さん
垢版 |
2015/02/10(火) 02:28:53.23ID:t6iB3KaN
実際にやってみると、こんな感じだね。

int x;
char *cpcp = 送られてきた文字;
while(1) {
x = getNum(cpcp);
cpcp = cpNext(cpcp)
if(*cpcp==0x00) break; // 終わり?
}

関数一つでやってもいいんだけど、
こっちの方がわかりやすいかと。
0212774ワット発電中さん
垢版 |
2015/02/10(火) 12:05:30.51ID:HmJutys4
受信文字列の中から、0d,0aの組み合わせを見つけて、
受信先頭からそこまでの文字列を、別の文字列に入れ直す、って、
簡単にできますか? 今は、
・受信文字列に0d,0aがあるか調べる
・もしあれば、受信文字列の先頭から1文字ずつ取っていく
・前回の文字==0dで、今回の文字==0aなら、その桁数を記憶する。
・0d0aの位置がわかったので、別の配列[count]=受信配列[count] で、
 copyしていく。
というのをやっています。
0215774ワット発電中さん
垢版 |
2015/02/10(火) 22:56:21.71ID:t6iB3KaN
>>212
簡単にできるかどうか聞いてるんだったら、俺は簡単にできるとか答えるぞ。
そういうときは、もっといい方法がないかって聞けばいい。
C言語も大変そうだが、それよりもまず日本語をなんとかして欲しい。

俺なら先に1文字コピーする。
コピー中のアドレスがcpだとして、*cp==0x0d && *(cp+1)==0x0a なら、
コピーした文字列の最後に0x00(終端コード)を上書きがオススメ。

ポインタ知らないなら、また別の方法を考えないとね。
0216774ワット発電中さん
垢版 |
2015/02/11(水) 02:16:12.16ID:IQZNPz3q
ポインターは難しいな。
宣言の時には*が付いてるのに、
使うところでは*がないので、何が何だかわからなくなる
0218774ワット発電中さん
垢版 |
2015/02/11(水) 05:07:44.98ID:mnHRw4Wl
ライブラリでかいじゃん。
0219774ワット発電中さん
垢版 |
2015/02/11(水) 11:12:16.26ID:NRvqRgEN
>>216
宣言の時の*はポインター変数である印。
char ptr a;
とかにしてくれれは良かったのにな。
0221774ワット発電中さん
垢版 |
2015/02/11(水) 14:10:31.81ID:IQZNPz3q
char *p; と宣言すると、
charですので、pの示す番地は、1byte毎に増減します。
でもそのpに入れられる数値の長さは、何byteなのでしょうか?
0222774ワット発電中さん
垢版 |
2015/02/11(水) 14:29:32.95ID:6Cj7SFHI
sizeof(char *)

あとcharは1バイトとは限らない
0223774ワット発電中さん
垢版 |
2015/02/11(水) 14:32:25.27ID:zdw/u7yC
ポインタと配列をごちゃ混ぜにするな。
ポインタ変数はあくまでアドレスを格納する変数に過ぎん。
そのポインタの示すアドレスが書き込んでいい場所かどうかなんて他で決定される。
0226774ワット発電中さん
垢版 |
2015/02/11(水) 14:59:17.97ID:IQZNPz3q
#define PDR (*(volatile unsigned char*) 0xffd9)

上記の文章は、
・ソースの途中で、PDRと書かれていたら、その右側の文字の塊と入れ替えて考えてね、コンパイラさん。
・volatile は、使って無くても消してしまわないでね、コンパイラさん。
・右側の文字の塊の、一番外側の()の意味がわからないです。無くてもいいと思います。

これ以上聞かないで下さい。
0227774ワット発電中さん
垢版 |
2015/02/11(水) 16:46:25.69ID:V93rvqK6
まっ、どうやればいいのかを考えるのも学生の「仕事」さ。
0228774ワット発電中さん
垢版 |
2015/02/11(水) 20:46:48.78ID:lumub4F/
>>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;
と書ける。
0229774ワット発電中さん
垢版 |
2015/02/12(木) 03:07:39.90ID:12MXBcpZ
>>228
>unsigned char *p;    /* ucを指し示すポインタpを宣言 */
これは、示す相手の数値のビット幅が8bit(unsigned char)という意味でしょうか?
つまり、
  番地  内容
0x12345678 0x12
0x12345679 0x67
0x1234567a 0x22
という感じで、番地の値のbit幅は、32bitかも24bitかも16bitかも知らないけど、
その箱の中身の値は8bitである、という理解です。
0230774ワット発電中さん
垢版 |
2015/02/12(木) 07:07:18.74ID:FRie6vC9
>>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のアドレス空間、メモリマップ
がわかってないと。
0231774ワット発電中さん
垢版 |
2015/02/12(木) 07:18:03.46ID:FRie6vC9
追記
ただ単純にポインタでつまづいてしまっているなら、iodefineを紐解こうと
するのは余計混乱するかも。これはこれで便利なものとして使って、
ポインタと配列とか文字列の取り扱いをPCの環境で練習した方がいいの
かもしれない。
0232774ワット発電中さん
垢版 |
2015/02/16(月) 17:00:06.77ID:MeW8IwF1
教えてください。

チェックサムの計算がしたいです。
Xorで行う、とのことです。僕が知っているチェックサムは、1byte単位でドンドン加算して、
下位1byteがチェックサムだと信じていました。
Xorでやるのも加算と同じ値が出ると思ったら、違う値になります。
例) 01 02 03 04
加算式=0A
Xor式=04  です。
何が正解なのでしょうか?
よろしくお願いします。
0233774ワット発電中さん
垢版 |
2015/02/16(月) 18:24:48.76ID:e4nFM85q
加算と排他的論理和は違うだろ。
あとチェック「サム」なんだから、加算が正解。
0234774ワット発電中さん
垢版 |
2015/02/16(月) 18:54:54.72ID:MeW8IwF1
>>233
ありがとうございます。
>チェック「サム」なんだから、加算が正解。
なるほど、サムですもんね。大変納得しました。ありがとうございます。

でもネットで検索すると、Xorでやるのもたくさん出てきますので、
何か暗黙の了解なのでしょうか。

でも、自身を持って「合計」で行きます。
どうもありがとうございました。
0235774ワット発電中さん
垢版 |
2015/02/16(月) 22:34:30.34ID:qqENiX59
>>232
xorでやってもいい。決まりごとを決めてそれが検証できればいいのだから。

Wiki
チェックサム (Check Sum)とは誤り検出符号の一種である。(中略)誤り検出その他データの検証
のための符号として広く使われてきた経緯から、俗に誤り検出符号自体の代名詞としても用いられ
る場合がある。例えばCRCの符号値やMD5のハッシュ値を、それぞれ「CRCチェックサム」
「MD5チェックサム」と呼ぶことがある。これらはアルゴリズムが異なりsumでもないため「チェックサム」
と呼ぶことは、語義的には正確ではないものの、「(チェックサムよりも)信頼性の高い誤り検出符号」
程度の意味で使われる。
0236774ワット発電中さん
垢版 |
2015/02/16(月) 23:13:09.87ID:MeW8IwF1
>>235
ありがとうございます。
>(チェックサムよりも)信頼性の高い誤り検出符号
こういうことですね。
例えば、通常の加算だけだと、1/100の確率で見逃してしまうものが、
Xorのタイプの「チェックサム」だと、1/1000になり、
CRCとかだと、もっとスゴイ。
こんなふうに理解しました。
ありがとうございました。
0238774ワット発電中さん
垢版 |
2015/02/18(水) 23:13:07.11ID:3q5LEWkH
unsigned char a;
for(a=0; a<255; a++){...}
って書いたら、いつまでも回り続けて、止まりません。
8bit変数でfor()を回して、0〜255の1回だけ回したいのですが、
8bit変数では出来ないのでしょうか?
for()を途中でやめて、
最後はベタで書くというのは考えましたが、格好悪いと思いました。
0239774ワット発電中さん
垢版 |
2015/02/18(水) 23:31:32.70ID:wQcjqbVL
それだと0〜254のループだな。
ループ内でaを書き換えたりしてないか?
0240774ワット発電中さん
垢版 |
2015/02/18(水) 23:33:54.62ID:+Rw3HsRT
a<=255じゃない?
そもそもwhile(1)の中に入ってるとかってオチはないよな
0242774ワット発電中さん
垢版 |
2015/02/19(木) 01:33:56.54ID:gN2p0Vs3
>>238
charで255より大きな数は表現出来ない。
ループ変数をintにして、キャストして使えばいい。
0243774ワット発電中さん
垢版 |
2015/02/19(木) 02:05:25.58ID:kWEBqwf4
unsigned char a;
for(a=0; a<=255; a++){...}
って書いたら、止まらないだろう。
コンパイラが警告してこない?
0248774ワット発電中さん
垢版 |
2015/02/26(木) 03:51:37.97ID:G0zgVFWK
質問が2つあります。

1. strcat( str_A, str_B ) のとき、str_AとBを足した文字列長が、
Aの長さを超える場合、Aには、可能な限りのところで切られてしまう、という
理解で良いでしょうか?

2. RS232の受信の場合、受信割込を使用する場合、以下のような考え方で正しいでしょうか?
  
0249774ワット発電中さん
垢版 |
2015/02/26(木) 10:39:06.92ID:HmES/XND
>>248
1 きいて済ますんじゃなくて、自分で仕様書読んで確認する習慣付けろよ。。。
 (最悪の場合、ここで嘘おしえられて損害発生して責任負えるのか?ということ)

 C++とかMFC(のCStr)じゃなく、Cの標準ライブラリのものなら、
 メモリの管理はユーザーの責任でしょうから
 後ろのデータを壊そうが延長しちゃうと思うず。

2 以下?が不明なので語りえない
0250774ワット発電中さん
垢版 |
2015/02/26(木) 14:56:27.53ID:+6g9bzr5
>>249
ありがとうございました。
やはり破壊するかもしれないので、配列を多めに取っておきたいと思います。

2つ目は、書いてる途中で寝てしまいました。すみません。
以下に、改めて書き直します。

2. RS232の送信で、送信割込を使用する場合、以下のような考え方で正しいでしょうか?
1) 送信したいデータを配列に入れて作成、最後に0x00入れる
2) main()で、送信フラグをonする。
3) 別の関数で、
・mainの送信フラグをチェックして、onなら
  ・割込部の割込フラグ(U1TXIE)=1;
  ・送信配列の1byte目を送信する。
  ・終わり
・割込処理は、上記送信の終了をきっかけに、配列の末尾0x00が来るまで、
 根気よく1byteずつ送る。
 0x00だったら、送信停止して、送信終了フラグをon
・mainは、送信終了フラグ==onにより終了を知る。

受信割込は、外部からの受信信号がきっかけですが、
送信割込は、誰かが1byte送らないと、自発的には送信できないですよね?
0251774ワット発電中さん
垢版 |
2015/02/26(木) 21:18:44.48ID:5Ol7pI/F
大国に囲まれたほぼ無勝、千敗の超〜賎な民は馬や船に乗って押し寄せたヒャッハー
なお兄さん達にGo韓され続けたため、その末裔こそが細目の△△魔となってしまった
のは無慈悲な地政学的宿命。 リアル性器待つ覇者○○○○ハーンと同一のYを継ぐ者
が現在全世界で1600万人もいるが貢献大。恨の文化や歴史捏造癖は、ドラマと異なり
惨めな歴史故だがお陰で若干体格は良くなりましたとさ。 あ〜キムい、キムい。
0252774ワット発電中さん
垢版 |
2015/02/26(木) 23:14:49.74ID:ttTmCNMk
>>250
PICなら送信可能になったときに、送信割り込みフラグが立つ。
送るものが無いときは、割り込み禁止にする必要ある。
0253774ワット発電中さん
垢版 |
2015/02/26(木) 23:29:08.68ID:mNxTW0kT
よくある勘違い。
必ずしも割り込み禁止にする必要は無く、フラグをクリアするだけでも良い。
0255774ワット発電中さん
垢版 |
2015/02/27(金) 16:04:02.91ID:8b/GOVuX
俺が実装するなら配列じゃなくてリングバッファーをつかうかな。
0256774ワット発電中さん
垢版 |
2015/02/27(金) 17:39:23.10ID:I2a4VqcE
小さなマイコンでの送信ごときにリングバッファなんていらんだろ。
受信にゃ有効だが。
0257774ワット発電中さん
垢版 |
2015/02/28(土) 06:06:13.66ID:yPKgQI4A
℃素人プログラムには不要
0258774ワット発電中さん
垢版 |
2015/03/19(木) 19:22:06.86ID:8tW8Gu5h
0か1のビットデータが順次送られてきて、たとえば最新32ビットを保持し、
うち16個が1だったらその32ビットを出力してから保持データを捨てる、といった動作をさせたいんですが
効率的な定番の方法ってないでしょうか?

送られてきたビットが1なら個数のカウントに1を足し、もっとも古いビットが1だったら
カウントから1を引いて、データをシフトする、というやり方を
思いついたのですが、どうも個数が16個だったり15個だったり17個だったりして・・
パソコンも実機もなかなか触なくて、いまは仕方なく
効率が悪いですがシフトのたびに1の数を全部数えています。

C言語を使用しています。
0259774ワット発電中さん
垢版 |
2015/03/20(金) 05:23:15.72ID:SMsW8z8n
それでいいと思う。
32C16=60万通りもあるからテーブル用意しておけない。
0260774ワット発電中さん
垢版 |
2015/03/21(土) 03:24:00.97ID:S9YSILwM
適応フィルタってやっぱりFPGAとかでないと無理でしょうか?
ArduinoやPIC、AVR,ARMでは無理ですか?
0261774ワット発電中さん
垢版 |
2015/03/21(土) 03:57:35.62ID:2ar5LI1N
>>260
乗算器や積和計算のできるハードマクロを持つものなら、マイコンでも可能と思う。
でも、FPGAのような並列動作ができないので、相当に高速なマイコンであるか、
処理対象が遅い場合にしか処理が追いつかないと思う
0262774ワット発電中さん
垢版 |
2015/03/21(土) 04:14:55.69ID:S9YSILwM
>>261
肝は並列動作と高速なのですね。
ハウリングキャンセラーを作りたいのですがFPGAの様なのは扱ったことが無かったので・・・
考えたのは、
マイコンで適応フィルタ。
Psocの様なプログラマブルアナログマイコンで。
マイコン+アナログ回路。
ですが、高速性がネックですね。

やっぱFPGA勉強するしかなさそうですね。
0264774ワット発電中さん
垢版 |
2015/03/22(日) 18:13:59.00ID:Q4/3qeq6
補聴器が高くて同じこと考えてた
花粉症で集中力ないからやれないけど、やりたいねぇ
FPGAの開発環境をはじめからと思うと、是非dsPICでやりたい
0265 ◆HIKaRi/Dzs
垢版 |
2015/03/22(日) 18:45:25.30ID:cdwTHA6H
PSoC 5LPとかを使えばお手軽にそこそこ楽しめそうな気もする
0266774ワット発電中さん
垢版 |
2015/03/22(日) 23:56:18.42ID:4r8k2g0S
>>264
人の声特化とかなら、サンプリング周波数落としてやればdsPICでいけそう
0267264
垢版 |
2015/03/23(月) 15:03:51.18ID:xkmXqSx3
どーせじいさんは高音分からんからな 低周波&IIRフィルターでいけると思う
問題は補聴器つくるおじさん(わい)も高音の聞こえが悪いことだ
0268774ワット発電中さん
垢版 |
2015/03/29(日) 02:40:23.47ID:jQoUt5Ql
質問教えてください。
例えば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' && ・・・・){ のように、総当たり戦で調べるのは思いつくのですが、
何かスマートじゃないなと思いまして、質問しました。
宜しくお願いします。
0270774ワット発電中さん
垢版 |
2015/03/29(日) 15:09:09.21ID:Rjs3GCiN
やはり、全部総なめで ストリコンプになりますでしょうか?
0271774ワット発電中さん
垢版 |
2015/03/29(日) 17:18:39.58ID:1ykze7+Y
>>270
簡単にやるなら総当たり

凝るならハッシュ使うとか比較する文字列をソートしておいてバイナリサーチするとか
0272774ワット発電中さん
垢版 |
2015/03/29(日) 17:20:59.87ID:LuZVBYjs
>>268
>さらにデータ数がの何組かある場合は
コマンドの後にパラメータが続く様なら、strcmp() 以前に sscanf() で受信データから分割取り出し必要じゃね?
0273774ワット発電中さん
垢版 |
2015/03/31(火) 11:58:31.38ID:+fRorwP/
質問お願いします。

論理演算の && || で得られるのは、0か非0だと学びました。
0は0つしかないのでわかりますが、非0というのは、
1、2、3・・・・どれになるかは、処理系(コンパイラー)依存と考えれば良いでしょうか?

つまり、
if( ((a==b) && (c==d)) == 1 ){
というのはダメということでしょうか?
0274774ワット発電中さん
垢版 |
2015/03/31(火) 14:24:43.78ID:D6pC4B6f
ご想像通りダメです。
非0は「true」、0は「false」を使うようにしましょう。
0275774ワット発電中さん
垢版 |
2015/03/31(火) 14:57:26.03ID:+fRorwP/
了解しました。
true falseも使ったことないのですが、#define true 0 と自分でデハインを定義するのでしょうか?

ひとまず
if( (・・・) != 0 ){ でいこうと思います。

どうもありがとうございました。
0278感電ショボーン
垢版 |
2015/04/10(金) 17:24:42.02ID:WkrUKnS7
定数は左に書いた方が堅いコードになりますお

(タイポやら操作ミスして意図せずに代入式に
なってしまった時に、コンパイラが跳ねてくれます)

if((・・・)!=0){ ... }だと、
if((・・・)=0){ ... }にしてしまったときにコンパイラを通る危険があります。

if(0!=(・・・)){ ... }だと、くしゃみをして偶然if(0=(・・・)){ ... }になってしまっても
代入できねえよボケ!ってコンパイラが怒ってくれますのでより安全です。
0279774ワット発電中さん
垢版 |
2015/04/10(金) 18:14:57.74ID:oRG4kzHU
>>278
そうですね。
でも、自分がどの辺でミスをするか 自分で自分のことがわかってくると、
意外にif(x==0){でも行けます。
それより間違いやすいのは、
「:」と「;」
「0」と「O」
「6」と「8」
「'」と「`」
「1」と「l」
液晶の解像度が悪いと、どちらも同じに見えてしまい、デバッグが....
0280774ワット発電中さん
垢版 |
2015/04/23(木) 13:49:01.89ID:JdmfSPTr
>>278
ifで、==の間違いは、さほど起こらないでしょう。
ifの中では==だと注意するから
0281774ワット発電中さん
垢版 |
2015/05/13(水) 13:11:43.13ID:B3hYdPkO
誘導されてきたのでこちらのスレで質問します。

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にした場合、
起動後一番左上にカーソルがきちんと表示されています。(文字は表示されない。)
0282774ワット発電中さん
垢版 |
2015/05/13(水) 15:59:25.12ID:yi/Jm2as
>>281
向うでコントラストの指摘をしましたが、カーソル表示されてるなら、そう書いてよ。
一応カーソルだってキャラジェネ的には「文字」だからね。

あと、省略形で書いているのかもしれないけど、

  LCD_RS    = 0;      // コマンドレジスタ
  LCD_E     = 1;      // Enable

こういう書き方はおかしいでしょ。

  LCD_CTL_PORT &= ~_BV(LCD_RS);   // コマンドレジスタ
  LCD_CTL_PORT |= _BV(LCD_E);     // Enable

ならわかる。
0283774ワット発電中さん
垢版 |
2015/05/13(水) 17:04:12.27ID:Nv+o9tON
いや、
#define LCD_E RB0
#define LCD_RS RB1
とあって、よく見みたら指定したポートが間違ってましたというオチ
0285774ワット発電中さん
垢版 |
2015/05/13(水) 17:17:09.12ID:rjCH71d1
個人的見解としては、EのL期間が短か過ぎるんだと思う。
230ns満たしてるかな?
0286774ワット発電中さん
垢版 |
2015/05/13(水) 23:55:29.21ID:B3hYdPkO
>>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つの順番は合っているのでしょうか?
0287774ワット発電中さん
垢版 |
2015/05/14(木) 02:00:55.15ID:n+ggTJNa
> LcdCmdOut(0x07);    // EntryModeSet
これだとS=1 1/D=1で、書き込んだ後表示全体が左にシフトされるみたい
だけどいいのかな?
0x06でやってみたら
0288774ワット発電中さん
垢版 |
2015/05/14(木) 03:13:37.57ID:ZKEsteXw
>>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の使い方に疑問があるような書き方だけど、あなたが他で変な事をしているのかもしれない。

頑張ってください
0289774ワット発電中さん
垢版 |
2015/05/14(木) 07:00:48.22ID:aGiyoQ+/
>>286
確かに、私もマイコンや開発環境なんか気にしたくないが、
1GHzのマイコンと1MHzのマイコンでは違うんだから仕方ない。
LCDの使い方言うのなら、LCDのポートの信号をロジアナで取って晒してくれ。
0290774ワット発電中さん
垢版 |
2015/05/14(木) 21:50:01.86ID:R4gj7NhB
LCDの代わりに、EとかRSにLED繋いだら期待通りに光るん?
0291774ワット発電中さん
垢版 |
2015/05/14(木) 23:17:06.87ID:BUaerYUG
そもそも、ポートはちゃんと出力に設定されているのかな?
周辺兼用ポートで周辺有効になってて、I/Oに叩いたデータが出てない可能性もある。
>>290 をやって確かめてみるべき。
ひ弱なポートでも、今時の超高輝度LED(赤)+3.3kΩを充分駆動できるで。
0292774ワット発電中さん
垢版 |
2015/05/14(木) 23:46:32.98ID:9/0z5iFK
>>287
ほんとうですか!今手元にマイコンがないので試せないのですが、試してみます。

>>288
ソースの書き換えは分かりやすいようにと配慮したつもりでしたが逆効果だったようですね。
申し訳ありません。
wait_ms(1)を全てのタイミングで入れてみて試してみます。

>>289
もし訳ありません。次回から気をつけます。

>>290>>291
ポートは出力に設定してあります。
LEDをつないで光るかどうか試してみます。
0296774ワット発電中さん
垢版 |
2015/05/18(月) 09:40:13.04ID:qbYa0gb7
>>287さんの言うとおりでした。
0x06に変えてみたところ、正常に動作しました。
やはりlcdの使い方が間違っていたようですね。
本当にありがとうございました。
0297774ワット発電中さん
垢版 |
2015/05/30(土) 02:13:10.63ID:w1x2Pyqw
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
    }
  }
}
0300774ワット発電中さん
垢版 |
2015/05/30(土) 13:19:13.23ID:R/j3+Zvo
>>297
どちらもイヤだな。
1は、#ifが出しゃばって、本来のソースが見づらい
2は、なじみ過ぎて、逆に本来のソースが見えない
0302774ワット発電中さん
垢版 |
2015/05/30(土) 13:39:59.22ID:R/j3+Zvo
#if使う前提なら、あの2つ以外に記述方法ってあるの?

だから俺は、#ifは使わないんだ。だから代替案出せないんだよ。

そういう>>301は代替案なしの発言 そのままですが、どうなの?
0303774ワット発電中さん
垢版 |
2015/05/30(土) 13:42:00.13ID:CE/b3CPZ
>>302
だったらそう書いとけばいいだろ
別におれはソースに対してコメントしてねーし
0306774ワット発電中さん
垢版 |
2015/06/11(木) 03:46:15.58ID:pLhpa9AR
教えてください。

ウオッチドッグタイマーという機能があります。
常にカウントしているタイマーを、プログラムで定期的にリセットしに行くと
ずっとoffですが、プログラムミスで暴走したときなど、定期的リセットをしなくなると
onして、マイコン全体のリセットをする、という機能です。

質問ですが、
ウオッチドッグタイマを、定期的にリセットしに行く文章は、
一般的に、プログラム中のどこに置けばよいのでしょうか?
・main()の最初に置く
・タイマー割込の中に置く
・両方置く
タイマー割込だけだと、main()ではまったときに困るし、
mainだけだと、その逆が心配です。

ウオッチドッグタイマの時間ですが、どのくらいにするのが一般的なのでしょうか?
定期的にリセットする時間の2倍くらいでしょうか?

マイコンのウオッチドッグタイマは、初めて使うのでわからないことばかりです。
0307774ワット発電中さん
垢版 |
2015/06/11(木) 11:47:00.01ID:RHGeuDMZ
>定期的

いつから周期が一定でないとダメだと思っていた?
0308774ワット発電中さん
垢版 |
2015/06/11(木) 12:34:16.79ID:+j+KwdYS
>>307
つまんねえ揚げ足取りはいいから・・・

>>306
一般的なウォッチドッグの時間なんてない。
システム全体としてこれ以上の時間暴走されると
燃えたり壊れたりするからまずいって時間が基準になる。
そんなのが無いなら1秒だろうが1分だろうが好きにすればいい。
0309774ワット発電中さん
垢版 |
2015/06/11(木) 13:23:58.52ID:6qSoUBGY
というか、main()の最初でしかリセットしないと、電源オン時に1回しかリセットしないでしょ。

ウォッチドッグで何をウォッチするのか、どの暴走を想定しているのかによって、リセットの
仕方は変わるでしょ。

普通はmain()の中で、while 0とかで無限ループ作って、そこでイベントに対処した処理を
呼び出す形のプログラムになるから、そこにリセットを入れる。
0312774ワット発電中さん
垢版 |
2015/06/11(木) 18:40:09.27ID:bIiI2uiv
そもそもWDTが必要になるってどんなときだよ?
そんなに手抜きしたいの?
0313774ワット発電中さん
垢版 |
2015/06/11(木) 19:19:46.32ID:X/ppkWQ0
WDTの利用で手抜きになる理屈がわからん。
>>312 はもうちょっと脳内想定を開示してくれ。
WDTリセット(暴走)発生を想定しないで、無い物として実装(起動すら)しないのが一番手抜きだと思うが。
0314774ワット発電中さん
垢版 |
2015/06/11(木) 22:35:38.96ID:2cOk6umM
僕もそう思う。
止まらないプログラムを作って、その保険にWDTを入れるのだと思う。
入れない方が手抜きだと思う。
0317774ワット発電中さん
垢版 |
2015/06/13(土) 13:25:10.61ID:18tbfnjU
でもネットに上がっているプログラムで、
WDT入れているのを、ほとんど見ないけど、みんな使わないのかな?
0318774ワット発電中さん
垢版 |
2015/06/13(土) 13:51:09.66ID:mtr7uS/S
電源ON→LED点灯→なぜかリセット→LED点灯→なぜかリセット→…
でLチカやってる俺には必要なしw
0320774ワット発電中さん
垢版 |
2015/07/04(土) 15:15:54.93ID:yLKgWFj+
http://blogos.com/member/775/opinion/
http://chiebukuro.yahoo.co.jp/my/myspace_ansdetail.php?writer=uochoco
http://detail.chiebukuro.yahoo.co.jp/qa/question.php?request_type=3&;request_nn=uochoco
http://srad.jp/~uochoco
https://twitter.com/uochoco
https://pbs.twimg.com/media/A-MHrHdCMAE7YfG.jpg
https://pbs.twimg.com/media/A98lyHpCQAA1Aus.jpg
https://pbs.twimg.com/media/A9D31bgCEAA2uhP.jpg
https://pbs.twimg.com/media/A9YajD2CEAAHUYZ.jpg
0321774ワット発電中さん
垢版 |
2015/07/10(金) 23:48:39.13ID:PSF4ruFM
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入れ替わるように書いたつもりです。

よろしくお願いします。
0323774ワット発電中さん
垢版 |
2015/07/11(土) 10:37:41.62ID:grWgj0HR
これで点滅が分かるなんて
すんごいクロック遅いんだね。
0327774ワット発電中さん
垢版 |
2015/07/11(土) 20:45:03.40ID:3viRleEA
んじゃ
while(1){
for ( kakunin = 0 ; kakunin < 2000 ; kakunin ++){
各種処理
}
PORTB.B4 ^= 1 ;
}
ではどうか?
0328774ワット発電中さん
垢版 |
2015/07/12(日) 01:00:11.32ID:OUaJ3qeO
321です。みなさん、レスありがとうございます。

結論から言いますと、>>322さんにご指摘頂いた=が足りない。文法上のミスでした。
修正ついでに長々と書くのをやめてアドバイスを頂きました ^= で反転させるように書き直しました。

修正後はとんでもなく速い速度で点滅したので時間間隔は調整しましたが、
当初のif(PORTB.B4 = 1)の時にゆっくりの感覚で一瞬だけ光ってたのが謎です。
if(PORTB.B4 = 1)だと条件文に書いてあってもPORTB.B4 = 1が実行されてしまってたのでしょうか?
0329774ワット発電中さん
垢版 |
2015/07/12(日) 02:06:05.50ID:bBGp7fYX
>>328
まあ、if()の==はよく間違えるので、早く慣れて欲しい。
=の時の挙動は、知らない。
だって、if()の中で=だけにはしないから、=だけにしたときのことを知ろうとも思わないんだ。

動作中を示すLEDチカチカは、よくやるね。
mian()が固まっていないかを書き人するためのチカチカならいいけど、
プログラム自体の動作モニタとしてのチカチカなら、main()では処理しないね。
タイマー割込で済ますよ。理由は、main()でやるとめんどくさいのと、
各種処理によってLEDの点滅が不規則になり、格好悪いから。
main()の中に目障りに思う。タイマー割込のソースにはワンパターンで
実績があるソースが入れてあるので、そのまま使ってる。

あと、ワンパターン化しているのは、待ち時間のタイマーね。
RS2132の送受信のリングバッファもワンパターン化したいけど、
まだまだ技量が無くて、できていない。
0330774ワット発電中さん
垢版 |
2015/07/12(日) 02:48:20.09ID:bBGp7fYX
× 書き人するためのチカチカ
○ 確認するためのチカチカ
0331774ワット発電中さん
垢版 |
2015/07/13(月) 00:42:38.20ID:IsUZw60H
すみません。
文法と言うかCの書き方の事で質問です。
PICですが作例など見ていると、void interrupt()で何の割り込みが入ったかを確認する時に

void interrupt tc_int(void){
 if(T0IF){

と書いているのを見かけますが、これは

if(T0IF == 1){

と同じと考えてよいのでしょうか?

ネットで作例を見る限り、MPLABのコードでもMikroCのコードでもどちらでも見かけますが、
コンパイラによって違う以前のC言語の基本的な事なのでしょうか?
0333774ワット発電中さん
垢版 |
2015/07/13(月) 01:22:45.57ID:esKUivim
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)
なんだろうね。
0334774ワット発電中さん
垢版 |
2015/07/13(月) 03:03:02.47ID:uoF6uaJB
>>331
if( T0IF ){ って、「俺は通なんだぜ」と言っているように見えるけど、
間違いのもとなので、>>333のように、ちゃんと書いた方がいい。

真 はゼロ以外 偽 は、ゼロ
と覚えるといい。
0335774ワット発電中さん
垢版 |
2015/07/13(月) 03:26:14.06ID:XhsBkFUo
いやむしろ、(概念的に)booleanであるものと数値の比較はやめてくれ
0336774ワット発電中さん
垢版 |
2015/07/13(月) 05:24:26.08ID:+bcP6BBk
K&Rのサンプルでも
void strcpy(char *s, char *t)
{
  while (*s++ = *t++)
    ;
}
こうした慣用法はマスターすべきと言ってるよ
0337774ワット発電中さん
垢版 |
2015/07/13(月) 08:59:12.10ID:FzJvm/u0
K&Rは、Cの創始者として尊重するけど
>>336のコードは、今は書くべきではないと思う
Cを理解するには良い例だけど、セキュリティに問題がある
0339774ワット発電中さん
垢版 |
2015/07/13(月) 09:11:38.31ID:cfuVZVZZ
>>337
カーニハンはC言語の設計には関わってないし、そもそも創始者って何だよ。
0340774ワット発電中さん
垢版 |
2015/07/13(月) 12:42:33.07ID:+HU2nSe/
>>336
>while (*s++ = *t++)
これはどういう動きをするのでしょうか?
sとtの位置を1つずつ変えながら、sの中身=tの中身を実行。
代入の結果に「0」とか「1」とか、あるのでしょうか?
0341774ワット発電中さん
垢版 |
2015/07/13(月) 13:05:54.16ID:+F87u+Tl
>>340
代入の結果は代入した値

なので、結果が偽、つまり0が出るまでコピーすることになる
0342774ワット発電中さん
垢版 |
2015/07/13(月) 13:12:05.19ID:G+c5IcU/
>>340
文字列の複写
ポインタtの指している所の内容をポインタsの指している所の内容に代入、
それぞれのポインタをインクリメント後、式を評価。
文字列の終端が\0コピーし終わってwhileを抜ける。
こんなコードはいまどきは推奨されない。

でも、Cなら単純な while ( val )...、 if( val )... ぐらいは書きたい。
0343774ワット発電中さん
垢版 |
2015/07/14(火) 03:25:25.77ID:ybIDC8eH
>>341
>代入の結果は代入した値
ありがとうございます。代入にも返値があるんですか。始めて知りました。
ということは、
a = ( b = c );
というのは、bにcの値を代入して、その代入した値が a になる。
つまり、a=c;  同時に b=c; という理解で良いでしょうか?
0344774ワット発電中さん
垢版 |
2015/07/14(火) 03:27:15.67ID:ybIDC8eH
>>341
ありがとうございます。
確かに文字列の複写として、本にも出ていますが、
単に数値のcopyという理解でよいですよね? コンピュータは文字か数字かは
わかんないようですし。
0345774ワット発電中さん
垢版 |
2015/07/14(火) 20:37:42.20ID:luM+lwo4
>>343
式は値を持つと思えばよろし
a + bは値なわけで、a = bも同じように考える
0346774ワット発電中さん
垢版 |
2015/07/15(水) 13:05:05.39ID:fIkQYVpd
ありがとうございます。

すると、例えば、aは1、bは2、で c = a + b という場合、c=3 になります。

if( a+b ){    と、

if( (a+b) == 0 ){  は、同じでしょうか?
0349ぼく小学生(^p^)
垢版 |
2015/07/15(水) 15:54:04.72ID:SuVlIuMn
だからー… if(T0IF!=0) ぢゃなくて
IF(0!=T0IF)と書けと何度言わせるんだおめーら!(^p^)
0350774ワット発電中さん
垢版 |
2015/07/15(水) 18:49:30.55ID:FzrZy7kt
>>349
if(T0IF == 0)とどう違うんですか?
0!の場合は、 = は一つで良いのでしょうか?
0352774ワット発電中さん
垢版 |
2015/07/15(水) 19:27:54.85ID:SbhLi8oL
>>350
!=はノットイコールを示す比較演算子ですよ。
まずC言語の基礎を習ってから、それでも悩ましいときにこちらにおいでくだされ
0353774ワット発電中さん
垢版 |
2015/07/15(水) 19:46:26.44ID:7E2Gymzz
>>349
ヒューマンエラーはゼロにはできないからねぇ
プロの現場では当たり前なのかね
0357774ワット発電中さん
垢版 |
2015/07/17(金) 01:14:38.73ID:67GcdyOq
>>347
>いつまで「C言語の基礎」を続ける気だ?
いいじゃん。
あんたみたいな賢い人ばっかりじゃないんだよ。
0358ぼく小学生(^p^)
垢版 |
2015/07/17(金) 13:23:55.14ID:37w7+Zkd
>354
ネットを検索してみると、なるほどたしかに一部で(思慮の足りない人が)
ヨーダ記法は読みにくいとか過去の遺物だと騒いでいるようですが
たとえば
 while(定数 == 変数)
みたいな表記を含むコードをデバッグやら 確認やらしている際に
意図せず(操作ミスで)字を消してしまい
 while(定数 = 変数)
としてしまう様なバグの発生も、起こりえるわけです。
そういう時にもコンパイラで異常を告げてくれて発覚しやすくなる分
比較的ソリッドな記法なのです。その意味においては!=の際にも
御利益があるわけです。
 読みにくいなんていう個人的都合を優先する人も居るようですが
慣れればヨーダ記法の方が読みやすいですお
0360774ワット発電中さん
垢版 |
2015/07/17(金) 16:27:57.45ID:JKdric0B
質問させてください。

Cで、スイッチ文を見ました。
  switch ( a ) {
  case 1 :・・・・・ break;
  case 1 :・・・・・ break;
  defolt :・・・・・ break;
  }
と書かれていましたが、{が来たなら、次の行は1つ下げるのではないのでしょうか?
  switch ( a ) {
    case 1 :・・・・・ break;
    case 1 :・・・・・ break;
    defolt :・・・・・ break;
  }
どちらでも動作しましたが、下げないで書くのはなぜなのでしょうか?
0361774ワット発電中さん
垢版 |
2015/07/17(金) 16:55:22.57ID:vGSMu9Xv
>>359
消防だけだとお思いか。

>>360
>defolt
default な。

>どちらでも動作しましたが、下げないで書くのはなぜなのでしょうか?
caseラベルがダブってるのにエラー吐かないんか。
それはともかく、下げる・下げないは、コード書く方の都合で、Cコンパイラの解釈的に関係無い。
 switch(a){
case 1: ・・・; break;
default: ・・・; break;
 }
でも同じ。
0362774ワット発電中さん
垢版 |
2015/07/17(金) 20:31:04.44ID:JKdric0B
>>361
ありがとうございました。

defaultですね。すみません。

字下げの件は、確かにどちらでも動くのですが、
if(){
  a = b + c;
}
のように、{ }で挟まれた中身は1段下げて書くのですが、
switch()の{ }では、下げない書き方を、不思議に思いました。

ありがとうございます
0364774ワット発電中さん
垢版 |
2015/07/17(金) 22:29:35.80ID:JKdric0B
確かに流儀ですね。

その人は、if()の時にも下げないんだろうか、
もしif()の時は下げて、switch()のときに下げないのなら、
その違いを、どのように納得しているのだろうか、
と気になってしまいました。
ありがとうございます。
0365774ワット発電中さん
垢版 |
2015/07/17(金) 23:31:04.27ID:kW61leGQ
switch文のあれは結局ラベルだから、アセンブリ言語に親しんできた人は
行頭に置きたくなるのかもしれないと想像します
0366774ワット発電中さん
垢版 |
2015/07/18(土) 00:43:01.05ID:8RPvVIjr
>>364
>>363だけどその人の流儀なんて書いたけど俺もそうやってたわw
理由はVisual StudioのVC++のエディタが自動的にそのように整形するため。
無理に逆らうと余計なエネルギーを使うことになるからね。
中カッコの位置も違う。
switch (a)
{
case 0:・・・・・ break;
case 1:・・・・・ break;
default:・・・・・ break;
}
0367774ワット発電中さん
垢版 |
2015/07/18(土) 02:02:40.19ID:OdSmHP7o
なんで 改行して { 書くのでしょうね。行が増えて判読性が落ちるのに
0369774ワット発電中さん
垢版 |
2015/07/18(土) 07:21:19.65ID:yMYNDmvD
>>367
可読性は人それぞれ
開始の中かっこと終了の中かっこの位置が
揃っていたほうが読みやすい人もいるのだ
0370774ワット発電中さん
垢版 |
2015/07/18(土) 08:28:19.20ID:8RPvVIjr
>>367
俺は中カッコはこのスタイルになれてしまって他所の仕事を手伝った
とき、そこのやり方に合わせて改行しないで書いたら余計な神経を
使うはめになった。
0372774ワット発電中さん
垢版 |
2015/07/29(水) 00:08:54.83ID:VEMwEcIK
>>360
switchでインデントしてcaseでもインデントすると、どんどん右に行っちゃうから、だからswitchとcaseを同じインデント位置にする

switch { でインデントしてcaseの次行ではインデントしない人もいるみたいだけど、それは気持ち悪いし
0374774ワット発電中さん
垢版 |
2015/07/30(木) 03:44:08.01ID:mFXyShh2
switch文は、意見の分かれるところだね。
秀丸にはswitchのインデントについて指定できるようになっているみたい。
0375774ワット発電中さん
垢版 |
2015/07/30(木) 08:53:28.15ID:HcqyFUCT
caseの中で一時的なローカル変数宣言する為に大カッコ書くと更にインデント増えるし
0377774ワット発電中さん
垢版 |
2015/08/03(月) 04:15:54.01ID:y6l99jZA
教えてください。

チェックサムという言葉があります。
データ列の各byteを単純加算して、最後の8bitを照合に使用するというものです。

本やネットを見ると、
チェックサムという人もいますし、サムチェックという人もいます。
どちらが正解なのでしょうか?

チェックサム check sum ですので、sumを検査すること のように思いますし、
サムチェック sum check ですので、???? わかりません
0378774ワット発電中さん
垢版 |
2015/08/03(月) 08:24:42.71ID:NZ3VW8/y
計算結果がチェックサム、
計算済みのチェックサムと新規に計算したチェックサムを比較照合する行為がサムチェック
0380774ワット発電中さん
垢版 |
2015/09/19(土) 02:18:23.10ID:aVobKplc
C言語の書き方で教えてください。

本などの見よう見まねの独学で、今は以下のように書いています。

main

// タイトル

#include "XC.h"
#include "strihg.h"

unsigned main(){
  unsigned char A;

  init();
  io_function();

  while(1){
    本文
  }
}
0385774ワット発電中さん
垢版 |
2015/10/01(木) 17:13:52.40ID:pLy3uaS1
390だと、return文がないって警告が出る
かといって、戻らないのに return 0 とかダミーで書くのも変
void main()ってするのが、一番妥当かな

ちなみに、オレはmain()の中の無限ループには
Loop:
色々
goto Loop;
って書いてる。(あんまり賛同者いないだろうけど)
0387774ワット発電中さん
垢版 |
2015/10/02(金) 01:54:52.15ID:TRHlSX5t
>ちなみに、オレはmain()の中の無限ループには
>Loop:
>色々
>goto Loop;
それもいいけど、それだとインデントはどのようになるんですか?

やっばり、
while(1){
}
がいいなぁ
0390774ワット発電中さん
垢版 |
2015/10/03(土) 11:39:25.20ID:8lnCxIkk
だからswitch文のあれは中身はgoto文とラベルだと何度言ったら(ry
0391774ワット発電中さん
垢版 |
2015/10/03(土) 14:06:36.67ID:C2eanTNI
えっ? switch文って、そうなの?

switch (A) {
  case 1 : B=1; break;
  case 2 : C=2; break;
  default : D=3; break;
}
だと、どう書けるの?

if(A==1){
0392774ワット発電中さん
垢版 |
2015/10/03(土) 14:26:42.59ID:bK8QxmaT
>>387
void main(void)
{
色々
Loop:
色々
goto Loop;
}

インデントが1段省けるのと、breakで抜けたりしない
無限ループだってことを強調できる、っていうのが一応の理屈
まあ main()とタスクのメイン関数でしか出番ないけど
0393774ワット発電中さん
垢版 |
2015/10/03(土) 15:04:54.48ID:bK8QxmaT
>>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;
0395774ワット発電中さん
垢版 |
2015/10/04(日) 02:11:18.20ID:HTwy50hH
なるほどね。
そうすると、後ろのほうの条件ほど 判定までに時間がかかるということ?
0398774ワット発電中さん
垢版 |
2015/10/09(金) 22:13:44.25ID:9hSyxx93
皆さんとは毛色の違う質問ですみません。

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』や『・』を非表示)に戻すにはどのようにしたらよいのでしょうか?

お知恵をお借りできたら助かります。
よろしくお願いします。
0399774ワット発電中さん
垢版 |
2015/10/09(金) 22:40:45.33ID:W355hVCN
逆に出し方を知りたいんだが、ごめんねマックじゃなくて

便乗だけど
タブがスペースに変換されるので編集で位置ずれ起こすのマジ勘弁
0400774ワット発電中さん
垢版 |
2015/10/10(土) 00:23:45.93ID:Eq9MCvdh
>>399
レスありがとうございます。
この現象が起きるような設定の方法、私も知りたいところです…(ノД`)
そうすれば逆の手順で解決できそうなのに。。。
0402774ワット発電中さん
垢版 |
2015/11/13(金) 21:39:16.35ID:gZc4NUlk
♪ 苦しくったって、悲しくったって、
  モニターの前なら、平気だわ

  ディスクがうなると、胸がはずむわ
    コンパイル、アセンブル
      ワンツー、ワンツー、デバッグ〜

  だけど、涙が出ちゃう  バグだらけだもん。
0404774ワット発電中さん
垢版 |
2015/11/14(土) 10:28:40.80ID:k7EAK5UQ
何の曲かわからんな
0406774ワット発電中さん
垢版 |
2015/11/14(土) 20:14:06.52ID:f+M6STKh
マイコンソフトくらいなら、
状態遷移図かフローチャート書けば、
自動的に生成してくれるソフト、ないかしら。

あと、文章で書くと、出来上がるとか。

#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は点灯
0410774ワット発電中さん
垢版 |
2015/11/15(日) 22:20:33.16ID:iRZYSWky
>>406
PSoC Express/System Level Designがそんな感じでできたんだけどね。
GUI上で、ステートマシンも書けたし、条件判定なんかも、
GUI上でタイルをぺたぺた貼り付けて出来上がりって感じで。

ただ、処理が複雑になると対応しきれないことも多かったのか、
途中で削除されてしまった。
0411774ワット発電中さん
垢版 |
2015/11/16(月) 01:55:50.43ID:z9qhJaeK
>>410
結局そういうことだよね
初期でつまづく根性無しのための懐柔策でしかない
続かん奴はどうやっても結局続かん
語学と同じね
0412774ワット発電中さん
垢版 |
2015/11/16(月) 10:38:37.46ID:6SBKQCZk
>>410
PSoC Express Design 無くなったの?  あれ期待してPSoC始めようかと初心者本読んでたのに
0413774ワット発電中さん
垢版 |
2015/11/17(火) 20:11:20.09ID:H/iXan4H
>>402

>ボールがうなると、胸がはずむわ

つまり、おっぱいがゆれると・・・
0414774ワット発電中さん
垢版 |
2015/11/17(火) 22:07:40.64ID:CaN97GZD
アラーが貼れと命令した
ttp://images.17173.com/2014/news/2014/04/14/2014cpb0414gif03s.gif
0415774ワット発電中さん
垢版 |
2015/11/20(金) 14:23:11.62ID:c/Np0CFM
あの方々って、人差し指立てるのが好きだよね。
コラージュで指人形つけてやりたい。
0416774ワット発電中さん
垢版 |
2015/12/09(水) 03:59:58.69ID:5MYU+YuF
教えてください。

C言語でマイコンのプログラムを書いていますが、main()に書く内容は、
どの程度の事を書けばよいのでしょうか?
0418774ワット発電中さん
垢版 |
2015/12/11(金) 13:18:19.28ID:O4GUoRW2
>>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の変数を引数で持って行かなければなりませんし
答えが複数欲しい場合も、
グローバルで受け渡しをしなければなりません。

どのように考えたら良いのでしょうか?
0419774ワット発電中さん
垢版 |
2015/12/11(金) 13:54:07.88ID:s/9zqBnL
引数を渡すこと、グローバルを使うこと、これらの何が『あなたにとって』
悪いことなのか我々にはわからない。
必要な情報を構造体にして共有するのもいいだろう。
関数外staticを使ってもいいだろう。
条件も無しにどうすればいいとか十人十色としか言えない。
とりあえず『読みやすければいい』でもいいんじゃないか。
0420774ワット発電中さん
垢版 |
2015/12/12(土) 02:52:53.00ID:pr+2/j2X
マイコンソフト
http://www.micomsoft.co.jp

なぜかハードウェアしか売っていない会社
0422774ワット発電中さん
垢版 |
2015/12/12(土) 13:45:26.31ID:FxYBKj00
>>418
まぁ、最初は全部main()に書いていればいい。
そのうち必要だなってことが感じられるようになる。
必要性が感じられないなら、そのくらいまでしか必要がなかったというだけ。

何事もそうだけど「丸暗記するテストのためのもの」ではなくて、
皆がいろいろやっていく上で必要になってきて作られたものだからね。
0424774ワット発電中さん
垢版 |
2015/12/14(月) 01:54:30.14ID:pIlXZv9V
C言語で教えてください。

2の条件が整ったとき、○○する、という文章を書くとき、
if( ( ) && ( ) ){ ..... というのはできるのですが、
switch文で書くことはできないのでしょうか?
こういうことです

switch ( ( )&&( ) ){
  case xx :
  case xx :
  case xx :
  efault :
}
みたいなことです。
0426名無しさん@そうだ選挙に行こう
垢版 |
2015/12/14(月) 08:31:47.49ID:9hD+9r4w
>>425
ありがとうございます
質問を間違えました。
2つの条件が異なる場合でした。
例えば、
switch(A,B){
case (A=='あ')&&(B=='い') : 処理1; break;
case (A=='う')&&(B=='え') : 処理2; break;
}
のようにです
宜しくお願いいたします
0428名無しさん@そうだ選挙に行こう
垢版 |
2015/12/14(月) 11:10:46.74ID:9hD+9r4w
さっそく ありがとうございました。

やはりだめですか。

通信で受信した文字組合せによって、処理を分岐したいとき、ifよりswitchのほうが、追加が楽なので、
そうしたかったんですが。

ありがとうございました
0431名無しさん@そうだ選挙に行こう
垢版 |
2015/12/14(月) 11:36:33.26ID:22MKt+5Q
間違えたかもw
switch( unsignedInt a*256+b )){
*256は多分コンパイラで a<<8に変換してくれるだろう
シリアルの速度が律速するのだからそこで高速化する必要はあるまい
case文は定数しかダメだから
0432名無しさん@そうだ選挙に行こう
垢版 |
2015/12/14(月) 11:45:53.11ID:22MKt+5Q
また間違えたかもww
間違えたかもw
switch( ((unsignedInt) a) *256+b ){
かな  実際のコンパイラで確認せんと分からんw
0434774ワット発電中さん
垢版 |
2015/12/15(火) 00:42:28.85ID:SnxAfLbD
>>424以降マイコン関係ないし
素のC言語の基礎的な話はム板に行ってくれた方がありがたいよ
0435774ワット発電中さん
垢版 |
2015/12/15(火) 01:59:19.15ID:tdRArSKx
いや、内容に問題はないと思う。
通信で受信した内容の判別と言っているから、マイコンで合っている。
0436774ワット発電中さん
垢版 |
2015/12/15(火) 03:11:12.11ID:56tRv1JH
>>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;
}
}
0440774ワット発電中さん
垢版 |
2015/12/15(火) 19:14:08.20ID:1mPYW/de
まあ「部分」しか書いてないから、state machine 型のコード書いたことないと
分からなくて当然
0442774ワット発電中さん
垢版 |
2015/12/16(水) 12:42:11.08ID:hrSQ/0y/
2キャラクタの判定をするのに、ステートをまわすっていうのも
なんだか大げさな気もするけどね。
まぁ、用途次第ってとこか。
0443774ワット発電中さん
垢版 |
2015/12/16(水) 13:31:30.42ID:ozj1V/j0
C言語初心者からの質問です。
標準入力した文字列を右シフトで動かしたいのですが、どのようなコードでできますでしょうか?
例として、abcd が1シフト後、 dabc になる感じです。
どうかお願いします。
0444774ワット発電中さん
垢版 |
2015/12/16(水) 14:34:17.95ID:cp9e4zf6
まず文字コードと文字数をはっきりさせないと適切な案内は出来ないよ
ASC?SJIS?UNI?
0446774ワット発電中さん
垢版 |
2015/12/17(木) 00:54:35.79ID:Bu2/satg
unsigned char temp;

temp = DATA[0];
DATA[0] = DATA[1];
DATA[1] = DATA[2];
DATA[2] = DATA[3];
DATA[3] = temp;
0451774ワット発電中さん
垢版 |
2015/12/17(木) 20:18:22.31ID:oyOtoToJ
標準入力した文字列ってことは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;
}
}
0452774ワット発電中さん
垢版 |
2015/12/17(木) 20:41:18.67ID:1436LBf9
>>451
キャラクタ液晶とかドットマトリクスLED
とかに渡せば繰り返す電光メッセージになるじゃん
0453774ワット発電中さん
垢版 |
2015/12/17(木) 23:10:06.71ID:oyOtoToJ
そういやそんなのもあったなぁ
だったら必要なのって左ローテートの方なんじゃ
0455774ワット発電中さん
垢版 |
2015/12/18(金) 13:42:08.59ID:O+15NDXp
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);
0456444
垢版 |
2015/12/18(金) 14:08:37.47ID:FmB2KOaQ
質問主の >>443 はどこ行った?
0457774ワット発電中さん
垢版 |
2015/12/19(土) 19:37:39.91ID:l18sWYzd
マイコンソフトではないけど、久しぶりにExcel VBAをやった。
デバッグに1日かかってしまった。理由は、次の通り。

変数宣言しなくても、好きなところで好きな名前の変数を、突然使える。
変数にタイプミスがあって、これを見つけるのに3時間がかかった。

タブが、常に4スペースで扱われており、とても使いにくく、入力に時間がかかる。

語間が、勝手に1スペースに置き換えられて、自分の好きな形式で書けない。

継続行の±には、_ を使用するが、行末の次に1スペース入れなければならない。
これがわかるまでに1時間かかった。

Excelのセルに「表示形式で2桁、0付き」で設定したのに、セルを取り込むと1桁になってしまう。
文字で取ってきたかと思えば、数字だったり、型がメチャクチャ
0459774ワット発電中さん
垢版 |
2015/12/19(土) 21:15:03.46ID:O4ee+aql
ExcelのVer?
95だけど、先頭の文字が文字だと文字型、数字だと数値型で
「'12」とか「12A」とかの扱いに困った
97だともうちょっとマシに
0460774ワット発電中さん
垢版 |
2015/12/22(火) 22:55:22.39ID:N66tJcUo
printf()が重いです。
軽いprintf()ってあるでしょうか?

欲しいのは、"%04x\r\n" とかの書式の部分だけでいいです。
sprintf()でも重いですか?
0461774ワット発電中さん
垢版 |
2015/12/22(火) 23:09:00.58ID:RWuFv6vH
>>460
はい。
浮動小数点の処理が含まれるのでサイズが大きくなるのはしかたありません。
小数の処理のない実装があるのでネットでさがしてください。
具体的なターゲットが書いて無いので細かな紹介は出来ません。
0462774ワット発電中さん
垢版 |
2015/12/23(水) 01:36:26.70ID:NYvzDR/g
>>461
ありがとうございます。
浮動小数点ですか。複雑そうです。

でも、浮動小数点を使っていないのですが、使わなくてもROM上に乗ってくるのでしょうか?
0466774ワット発電中さん
垢版 |
2015/12/23(水) 14:08:58.74ID:tfxXS0tb
>>460
Microchip XC8 の doprnt.c が参考になる。
define で色々機能選べる様になってる。
0467774ワット発電中さん
垢版 |
2015/12/24(木) 03:06:05.24ID:T4FUPv5a
乗算命令のないtinyだと10進数で出力すんのも重いし書式なんて使わずHexとByteだけの関数を個々で用意するのよ
>>460の例ならPutHex(u8); PutByte('\r'); PutByte('\n');のように
0468774ワット発電中さん
垢版 |
2015/12/24(木) 08:44:20.57ID:G9O0E83T
やっぱり、みなさんも1文字ごとに送るのって、やるんですね
ちょっと安心した
0469774ワット発電中さん
垢版 |
2015/12/24(木) 08:51:42.45ID:wgDp7vg3
10進数だって
100を引ける回数をカウント→100位
余りから10を引ける回数をカウント→10位
余り→1位
で簡単に表示できるよ
0472774ワット発電中さん
垢版 |
2015/12/25(金) 08:02:50.17ID:LJAuJMbX
chanさんのxprintfできまりでしょう
ttp://elm-chan.org/fsw/strf/xprintf_j.html
0476774ワット発電中さん
垢版 |
2016/01/11(月) 13:45:31.72ID:xzUxlmQO
>>469
整数のわり算使ってもそれほど遅くならない。

実質クロック1MHz程度のパソコン時代の印象強すぎ。
0477774ワット発電中さん
垢版 |
2016/01/13(水) 23:12:06.85ID:KetRvgoi
☆ 日本の核武装は早急に必須ですわ。☆
総務省の『憲法改正国民投票法』、でググってみてください。
日本国民の皆様方、2016年7月の『第24回 参議院選挙』で、改憲の
参議院議員が3分の2以上を超えると、日本人の悲願である改憲の成就が
決まります。皆様方、必ず投票に自ら足を運んでください。お願い致します。☆
0483774ワット発電中さん
垢版 |
2016/01/19(火) 10:20:02.91ID:9w7Y+p2Q
>>469
マイナスひゃくをそのアルゴリズムにかけてみたら表示が000になった
0484774ワット発電中さん
垢版 |
2016/01/19(火) 13:50:42.63ID:bzl5X42p
PICについて聞きたいことがあるんですが、ここで質問しても大丈夫ですか?
0485774ワット発電中さん
垢版 |
2016/01/19(火) 13:52:48.14ID:bzl5X42p
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となるのですか?

どなたか教えていただけないでしょうか?
よろしくお願いいたします。
0486774ワット発電中さん
垢版 |
2016/01/19(火) 15:46:43.28ID:9w7Y+p2Q
>0.005Aですよね?
ちがいます。抵抗部分にかかる電圧は、
LEDのVfが減殺されたものになる筈です。

>周期がイマイチ
課題に、PICのソースは添付されてないの?

>左から1234
ダイナミック点灯だと、オーソドックス(※)には
ある瞬間は4の位置のだけ光らせて
別の瞬間は3の位置だけ光らせて
別の瞬間は2の位置だけ光らせ
残像で四個とも点灯しているように見せます。
__delay_ms関数をどう使っているかはソースを読んでください。
(※非オーソドックスだと、7segのabcdefg素子ごとにスキャンする可能性も微レ存?)
0487774ワット発電中さん
垢版 |
2016/01/19(火) 17:44:04.01ID:2ReEjPWp
マルチ投稿が流行りかな
なんか宿題臭い

まず
>抵抗1kΩ、電圧5V
ではスタティック?点灯でも暗くて役に立たない
次に
100msでダイナミック点灯だとちらついて見づらい
そもそも制限抵抗とLEDを1つの抵抗とみなせばP=VIで消費電力計算できる

C-551はアノード(+)が共通
出力をカノード7ポート(−)とアノード(+)4ポート準備する
7個のLEDを同時に点灯(制御)させるのを4回行う
または4個のLEDを同時に点灯(制御)させるのを7回行う
回路図はどっかのサイトを参照しろ「7セグ ダイナミック 回路図」
回路と点灯方法により必要な抵抗の数とトランジスタの数が異なる
ちらつかないためには「1周」するのに0.1秒以内
0488774ワット発電中さん
垢版 |
2016/01/19(火) 21:46:20.61ID:2ReEjPWp
しまった
カソード(−)コモンだった

アノード(+)7ポート、カソード(−)4ポート
抵抗7つ、トランジスタ4つ
7個のLEDを同時に点灯(制御)させるのを4回(桁)行う
回路図はどっかのサイトを参照しろ「7セグ ダイナミック 回路図」
ちらつかないためには「1周」するのに0.1秒以内
0490774ワット発電中さん
垢版 |
2016/01/20(水) 00:28:05.50ID:lPfu8A21
別に無理してダイナミックにする必要ないでしょ
0.1秒じゃ写真映り悪いし
0491774ワット発電中さん
垢版 |
2016/01/20(水) 03:09:59.51ID:Xsrp3yZB
初心者にはダイナミック点灯を教えるより先にシフトレジスタ教えた方がいいと常々思ってる。
0493774ワット発電中さん
垢版 |
2016/01/20(水) 11:20:56.95ID:i9TW7j2p
>>491
>ダイナミック点灯を教えるより先にシフトレジスタ教えた方が
何の関係があるの?
0495774ワット発電中さん
垢版 |
2016/01/21(木) 18:08:06.85ID:pUWDRXeS
すみませんすごく初歩的な質問です
rx62nのブルーボードを使っているんですが、入力で0.5Vを感知するとマイコンから3.3Vを出力し、入力が0.4を下回ると出力が切れるプログラムを書きたいですがA/D変換がさっぱりでかけません
ライターはHEWです。どなたかA/Dの書き方とかご教授願えませんでしょうか
0497496
垢版 |
2016/01/22(金) 19:31:00.79ID:2iTQjT/m
>>495
「rx62n adc サンプル」でggrks
12ビットなら1目盛3.3V/4096
10ビットなら1目盛3.3V/1024
0.5V、0.4Vは何目盛か自分で計算白
0499774ワット発電中さん
垢版 |
2016/01/22(金) 22:17:12.54ID:2iTQjT/m
しかしそんか簡単な内容にRX使うかねー
リセットIC使えって
高専?大学? 研究室がNECからお金もらってるんだろーな
卒論の提出期限って過ぎてるよね
0500774ワット発電中さん
垢版 |
2016/01/23(土) 00:08:45.65ID:1ngeMG4c
PSoCだったら、アナログブロックでヒステリシスコンパレータを作って
CPUは初期設定だけやってあとはHALTしておくっていうことを
しそうな課題だな。
0501774ワット発電中さん
垢版 |
2016/01/24(日) 16:12:57.96ID:ZFTEuc2M
そもそもマイコン使う理由がないよなw
コンパレータ1つでいいじゃんという・・・
ディレイかけたりでもするならマイコンもアリだろうけど
それでも8ピン位のpicかavrでいいじゃんってなるけど
0502774ワット発電中さん
垢版 |
2016/01/30(土) 13:03:12.58ID:MAd0pD4q
相談させてください。

クイズの早押し回路を考えています。
条件は、
・スイッチの数=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()をもっと速く回すしか、方法はないのでしょうか?
0504774ワット発電中さん
垢版 |
2016/01/30(土) 13:14:28.28ID:1wykKHwh
電卓の1、3、7、9からスイッチを引っ張り出す
最上位桁の人が最早
0505774ワット発電中さん
垢版 |
2016/01/30(土) 13:55:46.63ID:lL6uDlaq
>>502
人間が判別できないくらいの速度で回してれば問題ないじゃないか

まあ、どうしても気になるなら割り込み使え
ソフトスレで言うことじゃないかもしれんが
0506774ワット発電中さん
垢版 |
2016/01/30(土) 14:02:55.72ID:hiGpoQ3P
割り込みだろうがなんだろうがマイコンのクロック周期以下の判断はできないでしょ
0507774ワット発電中さん
垢版 |
2016/01/30(土) 18:02:55.84ID:JDKe5oCC
同着の時はは乱数で一人選んじゃいなよ。
「それでも俺のほうが早い」といえるほど遅いハードはそう無いだろ。
0508774ワット発電中さん
垢版 |
2016/01/30(土) 18:42:15.11ID:Wkt25s49
人間のやることに、10-6秒以下の区別が必要なのか
そもそもチャタリングが発生して、同時押しでも、スパーク消えた瞬間
もう1人に回答権が行くだろうに
0509774ワット発電中さん
垢版 |
2016/01/30(土) 21:10:15.53ID:7QYEEeEq
>>502
あまり厳密に考えると絶対に破綻する。
結局は「それらしく動く」ことが大事
0510774ワット発電中さん
垢版 |
2016/01/30(土) 21:14:22.86ID:MAd0pD4q
502です。
みなさん、ありがとうございます。
確かに、>>503の言うとおり「どんなに早く回しても同着になるときはなる 」のですが、
できる限り判定したい = 同着判定は無しにしたいと思いました。
最初に外部割り込みを考えましたが、割込を検出してから割込処理に飛んで、ポートの値を取り込むと、
時間がかかってしまい、同着の確立が上がってしまうと思ったのです。
しかし、よく考えてみると、同着結果を出力しなければ良いので>>507のお話のように、
乱数でどちらか決めてしまえば良いことに気づきました。ありがとうございます。

乱数の生成の初期値には、ツェナーダイオードのノイズをA/Dコンバータの変換により
生成して、決して同着を作らないことにしました。

どうもありがとうございました。
0512774ワット発電中さん
垢版 |
2016/01/30(土) 22:01:46.88ID:Gae8NIaN
マイクロ秒の違いなんて人間に認識できないんだから、
優先順位固定かラウンドロビンででいいと思うんだが・・・
まあ趣味でやる分には乱数でも何でもやればいいか。
0513774ワット発電中さん
垢版 |
2016/01/30(土) 22:35:28.97ID:zZHtkGcg
iPodのイヤホンが壊れました。左の音が殆ど出ません。
(少し聞こえるので断線ではないようです。)
不思議な故障なのですが、フューズが入っていて、
プログラマブルに電流でフューズを切るみたいなソフト制御が動くことがあるのでしょうか?
デジボル(テスタ)は持っていますが、電池切れで今は抵抗値はわかりません。
0514774ワット発電中さん
垢版 |
2016/01/31(日) 00:20:49.15ID:wYg0ysnp
何がつながっているか分からない場合に抵抗値でスピーカーかイヤホンか判別する機構はあります
代表例としては、PC用のジャックセンス
iPodには多分付いていないでしょうね
0515774ワット発電中さん
垢版 |
2016/01/31(日) 00:48:21.96ID:La0Ocb5j
マ イ ン ド コ ン ト ロ ー ル の手法

・沢山の人が、偏った意見を一貫して支持する
 偏った意見でも、集団の中でその意見が信じられていれば、自分の考え方は間違っているのか、等と思わせる手法

・不利な質問をさせなくしたり、不利な質問には答えない、スルーする
 誰にも質問や反論をさせないことにより、誰もが皆、疑いなど無いんだと信じ込ませる手法

偏った思想や考え方に染まっていたり、常識が通じない人間は、頭が悪いフリをしているカルト工作員の可能性が高い

靖 国 参 拝、皇 族、国 旗 国 歌、神 社 神 道を嫌う カ ル ト

10人に一人は カ ル ト か 外 国 人

「ガ ス ラ イ テ ィ ン グ」 で 検 索 を !
0516774ワット発電中さん
垢版 |
2016/01/31(日) 09:00:26.84ID:UtZjSUB4
なるほど抵抗値を測っているのですね。
イヤフォンも安価なものは1000円以下から、高いものは数万円までしてどれがいいのかわかりません。
A.T.社の音質はどんなものでしょうか。
純正品が無難ですか?
有名なネット販売社にもAPL純製品の偽物安価品が(沢山)出回っている情報が寄せられています。
家電量販店にも偽物が沢山出回っているのでしょうか。
本体も偽物が出回っている話はよく聞きますが、偽物への輸入規制はできないのでしょうか。
安かろう悪かろうは困っています。
0517774ワット発電中さん
垢版 |
2016/02/02(火) 13:03:37.53ID:5vG63JT7
迷ったら、偏差値80の価格のものを買うことにしてる
0518774ワット発電中さん
垢版 |
2016/02/02(火) 23:30:08.97ID:GSELVvcr
    /:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ヽ
    /:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::://ヽ:::::::::::::::|
    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
0519774ワット発電中さん
垢版 |
2016/02/20(土) 15:34:43.86ID:W9MgvSQs
その後、カナル型ステレオイヤホン買ってきました。iPhoneで使うには十分な音質でした。
しかし、macbookで使うと音質がだいぶ落ちます。macbookの音質が優れているので気になります。
今のところ沢山出ている1000円の日本製TV用ヘッドフォンがベストの音質です。
iPhone iPad等の偽物は、誰かが外国のその工場のラインを使って、設計情報もそのまま
使って作っていると思われます。オリジナルで簡単に真似できるレベルではないので、闇の生産・販売ルートがあると思われます。
外国によっては市場が大きいので安くてもかなり利益がでるのでしょうかね。
0520774ワット発電中さん
垢版 |
2016/03/01(火) 03:38:30.26ID:+nuxyVH0
初心者ですが質問です。

RS232の出力をPWMのように制御できないでしょうか?
送信終了割込を使って、byte間に間髪入れずに送信して、
start bitは、常に0で、stop bitは、常にHとして、他のbitを制御するというものです。
 data = 0x00 → 0000000001000000000100000....duty 最小
 data = 0x0f → 0000011111000001111100000....duty 50%?
 data = 0xff → 0111111111011111111101111....duty 最大
という感じです。
0521774ワット発電中さん
垢版 |
2016/03/01(火) 08:48:16.86ID:8Tjue7oN
>>520
何を聞きたいのか分からないよ。
原理的に合ってるか不安?
実装の仕方がわからない?

やってみたら?
0522774ワット発電中さん
垢版 |
2016/03/01(火) 10:02:56.99ID:geiAPRiG
>>520
3bitPWMができますね。
送信完了割り込みじゃなく送信データレジスタ空き割り込みで
間髪入れない連続送信ができますよ。
0523774ワット発電中さん
垢版 |
2016/03/01(火) 21:35:06.71ID:/ElV2KI6
00 01 03 07 0f 1f 3f 7f ffで9パターンか
大した分解能は得られないな
ボーレート倍々にして複数バイト使うとか
0524774ワット発電中さん
垢版 |
2016/03/01(火) 22:04:02.36ID:gbr8whUY
でも、CRで積分すれば、立派に直流電圧調整になるような気もします。
I/Oピンが足りないときのこそくな手段ということで。
0525774ワット発電中さん
垢版 |
2016/03/08(火) 05:20:33.59ID:UVf9QGK+
教えてください。

EEPROMにデータを書くときに、悩んでいます。
EEPROMに書き込み途中で電源を切られても大丈夫なように、
A, B の2ページの書き込み領域を持って、書き込む度にA, B 交互に使っていけば、
途中で電源offされても、最悪、前回の値は残っていることになります。
そして、どちらのページを読めばいいのかを示す番地を設けて、
Aに書き込んだら、その番地に「A」と書いて、読み出す時は、その番地に書かれた文字により、
読み込み先を判断すれば良いと思いました。
我ながら名案だと思ったのですが、困ったことがあります。

データ書き込み後に、その特定番地に「A」とか「B」とかを書いている瞬間に電源offにされたら、
どうしよう、ということです。
AでもBでもない文字に化けてしまったら、読み出すときの指標がなくなってしまいます。

何か解決策が有るでしょうか?
0527774ワット発電中さん
垢版 |
2016/03/08(火) 08:16:29.10ID:TM4Dv/7B
>>526
それをどこに書いたかを特定番地に「C」とか「D」とか書いておけば・・・
0528774ワット発電中さん
垢版 |
2016/03/08(火) 10:41:22.99ID:GXMRZME8
@化けてたらROM上のデフォルトで上書きする
AEEPROM更新中は電源切るなって運用にする
B電源監視回路で化けそうなタイミングであれば書き込みを実行しない。
0529774ワット発電中さん
垢版 |
2016/03/08(火) 11:00:13.35ID:kCt4erUz
マジレスすると、CRC付けといてチェックすれば?
2つあったら新しいほう使うとかで。
0530774ワット発電中さん
垢版 |
2016/03/08(火) 11:22:19.90ID:naxOOg6b
>>526
頭いいなぁ。
0531774ワット発電中さん
垢版 |
2016/03/08(火) 14:23:17.03ID:1FYwlALY
>>525
書き込みを開始する直前に、そのページ名を書く番地も用意する。
完了後の起債と同一でなければ、書き込み中にコケたと判断できる。
0532774ワット発電中さん
垢版 |
2016/03/08(火) 14:26:34.50ID:t8rOiVMB
AとBの大きい方のシリアル値のほうを使う。
保存はシリアル値をインクリメントして小さい方に書き込む。
$ffffに達したら$0000と$0001にラップアラウンドする対策を忘れない。
0533774ワット発電中さん
垢版 |
2016/03/08(火) 15:48:19.70ID:GXMRZME8
なにをもって「新しいデータ」と判断するのか・・・・
完了後って電源切れてるのにプログラム走ってるのか・・・
シリアル書き込みでエラーとなってしかも大きな数字になったら・・・

さぁ盛り上がってまいりました。
0534774ワット発電中さん
垢版 |
2016/03/08(火) 16:49:19.26ID:TbkS5A88
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の関係の新しい値を最後と判定する
0535774ワット発電中さん
垢版 |
2016/03/08(火) 17:21:48.75ID:Y3wNOX01
面倒くさいから、書換えが終了するくらいの時間は持つように電源回路を
工夫する。
0536774ワット発電中さん
垢版 |
2016/03/08(火) 19:13:26.92ID:UVf9QGK+
Aデータを書いてから、最新を示す3つの番地に、「A」、「A」、「A」を書く

Bの場合も同じ

読む時は、
3つの番地の先頭番地の内容を読む。
値がAならAページを読む。Bも同様。
値が、正しく読めなかったら、そこでこけているので、次の番地の内容を読んで、
そのページを読む。
3つの番地の内容が、
AAAなら、Aページが正しく書けている。
A??でも、Aページは正しい
?BBなら、Aページはこけている。2番目の内容であるBページを読む。ただし、一世代前のデータである

こんなんで、どう?
0538774ワット発電中さん
垢版 |
2016/03/08(火) 20:12:19.01ID:N5hYBPDE
データの更新をしています。
電源を切らないでください。
0539774ワット発電中さん
垢版 |
2016/03/08(火) 20:48:24.74ID:naxOOg6b
>>
0540774ワット発電中さん
垢版 |
2016/03/08(火) 20:50:14.66ID:naxOOg6b
>>537
運用で逃げるんじゃなくて、プログラム技術の話をしてるんだけどね
0541774ワット発電中さん
垢版 |
2016/03/08(火) 21:20:46.30ID:ucH5JfQd
>>525を何回も読んだが「プログラム技術で」何とかしたいとは書いてないし、
電源監視回路は運用方法ではないぞ。
横道で騒ぐのもいいが正当な対策方法も教えてあげなきゃ。
0542774ワット発電中さん
垢版 |
2016/03/08(火) 22:30:06.94ID:NZ4c9b/c
同じデータを書けばいいやん
ほんで、データに連番のシリアルナンバーふって
頭には前回のシリアル番号
最後尾に書き込むデータのシリアル番号
頭と最後尾のデータが連番になってたら
書き込まれている

連番じゃなかったら途中電源遮断やね
その場合はもう一方のデータで

コントローラ側がちゃんと電源低下でリセット掛かるのが
大前提だけど
0543774ワット発電中さん
垢版 |
2016/03/08(火) 22:51:26.01ID:NZ4c9b/c
偶然最後尾の連番が書き込まれる場合があるかもしろんから
最後尾の後には、何らかの誤り検出数値入れた方がいいねえ
0544774ワット発電中さん
垢版 |
2016/03/09(水) 02:06:42.78ID:RnEdPR6S
冗長化しても半端な電圧が続いたら書いたデータが全滅してるかもしれないので
ブリーダ抵抗を入れよう
0545774ワット発電中さん
垢版 |
2016/03/09(水) 03:36:33.22ID:fRcyIOPT
運用で逃げたり、ハードウェアの力を借りれば、
簡単に解決することくらい、質問者だって100も承知だと思うよ。
スレタイだってそうであるように、ソフトで解決する議論をすべき。
0546774ワット発電中さん
垢版 |
2016/03/09(水) 03:41:47.18ID:RnEdPR6S
>>545
電源が不安定が前提じゃどのみちソフトで解決しようがない
マイコンに限らずPCだってそうでしょ
0548774ワット発電中さん
垢版 |
2016/03/09(水) 09:09:40.84ID:pY3hNJ5G
>>545
本来はハードで対策すべきってことすら知らない可能性は考えないんだ。
思い込みって怖いな。
0549774ワット発電中さん
垢版 |
2016/03/09(水) 11:39:46.75ID:Ic51XA0Y
>>545

>>525が書いたのを読む限り
データを確実に書き込む方法は
考えなくて良いでしょ

前回書き込んだのが保存されてれば良いだけ
な感じがするんだが
0551774ワット発電中さん
垢版 |
2016/03/09(水) 13:31:12.01ID:M5ZNbELP
何を使えと言うんだ?
0552774ワット発電中さん
垢版 |
2016/03/09(水) 14:22:21.69ID:2R05v3nr
>>525

> A, B の2ページの書き込み領域を持って、書き込む度にA, B 交互に使っていけば、
> 途中で電源offされても、最悪、前回の値は残っていることになります。

この前提なら最後に書いた読み出しフラグが正しく書けてなくてもデータは正しく更新されてるから
どっち読んでもいいってことじゃないの?
0553774ワット発電中さん
垢版 |
2016/03/09(水) 19:05:59.71ID:fRcyIOPT
だから、書き込み後に、最新ページを示す文字を複数バイト持てと言っている
0555774ワット発電中さん
垢版 |
2016/03/09(水) 23:36:52.48ID:GkSUEwOw
そして書き込むデータ量がどんどん増えて、
エラーの確率もどんどん膨らむのであった。
0558774ワット発電中さん
垢版 |
2016/03/10(木) 04:56:41.39ID:yfZU5gcG
だから、最終ページを表す文字が偶然
他方と同じに化けたらどうすんだと言っている
0559774ワット発電中さん
垢版 |
2016/03/10(木) 05:01:57.64ID:B2iI+3W/
>>558
化けるのはデータとは限らない。
アドレスが化けたら、何処が書き変わるかわからん。
0560774ワット発電中さん
垢版 |
2016/03/10(木) 07:10:55.62ID:3IijEbML
信用できないものを信用出来るようにする?
それは論理的に矛盾している。
0563774ワット発電中さん
垢版 |
2016/03/11(金) 07:51:36.01ID:Z5U/ydHN
単純にならECCでエラーを減らす方向じゃない?
検知範囲を広げればメモリ効率は上がるけれど修正出来る量が減るからね。
0564774ワット発電中さん
垢版 |
2016/03/11(金) 09:30:44.68ID:hpP+HohL
> 検知範囲を広げればメモリ効率は上がるけれど修正出来る量が減るからね。

???
0565774ワット発電中さん
垢版 |
2016/03/11(金) 09:33:08.14ID:S/zUcbJJ
>>563
データにエラーが有るかどうかが分かれば良いから、CRC 追加くらいで良い。

今時のマイコンならCRC 計算用のハード付いてるから、処理も簡単。
0566774ワット発電中さん
垢版 |
2016/03/11(金) 17:28:11.14ID:ZVMw07SK
考えてみればCPUって怖いな。
アドレスバスやデータバス、コントロールバスで1秒間に何千万個(何億個?)のビット情報をやり取りして、
そのうちの1ビットでもノイズなどで0/1が反転すれば、
とんでもない事になる可能性がある。
0570774ワット発電中さん
垢版 |
2016/03/12(土) 08:45:28.55ID:3P5Kq1Z3
>>525
CRCでもかけとけ
んで起動時にCRCを読んで有効な方を読む
両方CRCが有効だったら日付(か通し番号など)が新しい方を読む
当然日付(通し番号)は保存するごとにデータの一部に入れとく
以上
0571774ワット発電中さん
垢版 |
2016/03/12(土) 09:10:11.19ID:QvmCVlwp
この手のエラー対策って、
定電流源からバチンと電源スイッチを切る場合と、
電池が電源で徐々に終止電圧まで放置みたいな場合とで全く違ってきたりしないかな
前者ならこれまでだらだら書かれてる通り適当にチェックすれば良いと思うけど、
後者はまずEEPROM書き込みを打ち切る基準の電圧を検出する方が先じゃない?
0573774ワット発電中さん
垢版 |
2016/03/12(土) 11:59:51.12ID:kbp474pC
>>
0574774ワット発電中さん
垢版 |
2016/03/12(土) 12:01:59.91ID:kbp474pC
>>571
定電流源?
0577774ワット発電中さん
垢版 |
2016/03/12(土) 15:44:48.96ID:w+je1yn1
>>572
それだけだと、書き込みルーチンの途中で打ち切られちゃうことが
おきるからダメ
マイコン・EEPROMの電源が同じレギュレータからとってるとしたら
そのレギュレータの入力を測って、一定の電圧以上であることを
確認してから小さなブロック単位で書き込む
0578774ワット発電中さん
垢版 |
2016/03/12(土) 15:56:43.98ID:3P5Kq1Z3
>>576
だよ
だから無効データとして使わないことにすればいい
無理に使って誤動作することの方がだめなので
0579774ワット発電中さん
垢版 |
2016/03/12(土) 18:46:33.75ID:jOqo8zUy
>>577
途中で止まったらそのブロックはエラーになるから、ひとつ前のデータを使えば良い。
0583774ワット発電中さん
垢版 |
2016/03/13(日) 04:49:02.33ID:EqNEmwmt
データが書けたのを確認してから通番を更新すればエラーのチェック
は必要ないと思うが
0585774ワット発電中さん
垢版 |
2016/03/13(日) 18:45:05.66ID:72Oae+eo
EEPROMの内部動作の知識ないんだけど、書き込みコマンドの実行中に
電源電圧が落ちたときって、書き込み中のブロックにしか影響ないって
保証されてるものなの?
他のデータが破壊されたりすることって絶対ない?
0588774ワット発電中さん
垢版 |
2016/03/13(日) 22:14:35.90ID:esVoarL8
書き込み中に電源ぶっちされたらどうやってもやばいのか
昔のパソコンてシャットダウンて概念が無くていきなり電源切れたとか言うけど
あれはどういう仕組みだったの
0590774ワット発電中さん
垢版 |
2016/03/13(日) 23:52:34.24ID:1YYGo0Ha
電源保護機能付きのなら
書き込み途中でも他の領域を保護するので大丈夫
書き込み領域は保護されない
昔メーカに問い合わせたらそんな回答だった
なのでCPU側さえ電源監視してればオッケーだよ
0591774ワット発電中さん
垢版 |
2016/03/14(月) 00:20:29.99ID:KU9BIp2d
そうかUPSみたいなの付ければよくね?
ノートパソコンは停電に強かったりするよね
311の時も助かったよ
0592774ワット発電中さん
垢版 |
2016/03/15(火) 12:21:32.15ID:7NEnkaCO
教えて頂けますか。

RS232Cの通信で、STX ETX というのがあります。
スタートテキストとエンドテキストの略のようで、0x02, 0x03です。
これは何のためにあるのでしょうか?

先頭にこれを置いてから文字送信を開始すると、何か良いことがあるのでしょうか。
「これから文字が始まりますよ」という意味だとしても、ノイズで1bitずれたら
0x03になり「文字はここまでですよ」という意味になってしまいます。
どの文字を持ってきても、化ける可能性はあると思いますので、
STX無しに、いきなり文字を送信しても良いのではないか、と思うのです。

それとも1文字受けてからのほうが、受信側の暖機になって良いとか、でしょうか
0593774ワット発電中さん
垢版 |
2016/03/15(火) 14:57:06.34ID:xhB2OPkj
STX、ETXがなくても困らないような通信であればなくても問題ない。
STX、ETX(さらにエラー検出符号)があると化けたデータによる誤動作の心配が減る。
STXが化けてETXになったならその電文を捨てるだけなので何ら困ることはない。

単純な電文なら最後にCR付けるだけなんてのもいっぱいあるよ。
0594774ワット発電中さん
垢版 |
2016/03/15(火) 16:41:42.26ID:7NEnkaCO
>>593
ありがとうございます。

>STX、ETXがなくても困らないような通信であればなくても問題ない。
ですよね。だと思っています。

>STX、ETX(さらにエラー検出符号)があると化けたデータによる誤動作の心配が減る。
この理由は何でしょうか?
エラー検出符号は置いといて、STX, ETXがあると、誤動作の心配が減るというのがわかりません。

>STXが化けてETXになったならその電文を捨てるだけなので何ら困ることはない。
ETXに化けるのは話の都合上の例でしたが、データが化けて電文1行欠落は良くないんじゃないでしょうか。

単純な電文なら最後にCR付けるだけなんてのもいっぱいあるよ。
0595774ワット発電中さん
垢版 |
2016/03/15(火) 18:22:09.77ID:xhB2OPkj
パケットの考え方は「エラーが起こったパケットは捨てて再送要求する」のが前提。
つまり電文欠落なんてのもあって当然。
ノイズがスタートビットに見えてごみバイトが発生するかもしれない。
だからこそ「ここ(STX)からここ(ETX)まで」が必要になる。

受信アイドル中にある1バイトを受信したときに、
それは電文の一部として記録すべきバイトなのか、
捨てていいバイトなのかどうやって判断します?
0596774ワット発電中さん
垢版 |
2016/03/15(火) 18:46:48.32ID:OqWycNEq
>>595
BASICコンテンションの話なのにパケットはないだろ
TCP/IPは7Fの連続で同期取ってるだろ
0598774ワット発電中さん
垢版 |
2016/03/15(火) 19:55:02.23ID:xhB2OPkj
「パケット」って表現が不適当ならばごめん。
「電文フォーマット」にでも置き換えて。

要は電文が正しいかそうじゃないか判断するフォーマットとして
STX,ETXってのもあるよと伝えたかったんだが、もっとうまい説明頼む。
0599774ワット発電中さん
垢版 |
2016/03/15(火) 19:55:42.63ID:WJAVAGBR
ちなみに、BASIC手順は非同期通信じゃなくて同期通信
592〜594の話は、BASIC手順(的)なフォーマットを
非同期通信に流用する話だね
0600774ワット発電中さん
垢版 |
2016/03/15(火) 19:55:53.64ID:OqWycNEq
>>597
だがフィリップカーンがパケットの概念示すまでパケットと言わなかったような気がする
0602774ワット発電中さん
垢版 |
2016/03/15(火) 23:18:39.65ID:0s+tAAl7
先頭バイトが送信バイト数だとかチェックサムだとか各社色々だよね
0604774ワット発電中さん
垢版 |
2016/03/16(水) 12:31:06.36ID:zL1V2ql1
BSC自体は598が書いてるように同期シリアルの規格だけど
世の中では同期シリアル使ってるところは例外的だから
非同期シリアルにフォーマット流用してるのは「BSC風」フォーマットに
過ぎないからね
0605774ワット発電中さん
垢版 |
2016/03/16(水) 18:58:29.63ID:frJD41R8
固定電話のナンバーディスプレイのMODEM信号はSTX, ETXにCRC付けてる
0607774ワット発電中さん
垢版 |
2016/03/17(木) 01:58:49.30ID:nF2o+026
STX発生後は、0x00〜0x1fの間は、絶対にないよ、という意味だろうか?
0608774ワット発電中さん
垢版 |
2016/03/17(木) 02:58:35.40ID:PWbs2sPX
PICマイコンで、プログラムをして遊んでいます。
Cの書き方について質問があります。

本とネットの独学なので、正しい書き方でやっているのか、不安で質問しました。

1. ヘッダーファイルには、何を書くのが正しいのでしょうか?
   私が書いているのは、
   ・PICのconfigrationビットの設定(#pragma...です) 
   ・#define xxxx X
   ・I/O入出力方向 (TRISです)
0609774ワット発電中さん
垢版 |
2016/03/17(木) 06:00:51.95ID:T0agxB2O
>>608
複数のソースファイルに入って分ける時に、共通して必要になるものを書く
0611774ワット発電中さん
垢版 |
2016/03/17(木) 13:08:38.46ID:nF2o+026
ありがとうございます。

複数のソースファイルに分ける、というのは、どういう事を言うのでしょうか?
すでに、そこがわかりません。すみません。

例えば、以下のような内容が、1つの "hoge.c" にまとめて書けば、ソースを分割する
ということは必要ないと思うのです。

-------- 1つのソースの始まり --------
#include "xxx.h"     // メーカーの作ったヘッダファイル

void SW_input(){     // 自作の関数
...
}

__intrrupt xxx(){    // 割込処理
.....
}

int main(){
  各種初期化

  while(1){
    主処理
  }
}
-------- 1つのソースの終わり --------
0612774ワット発電中さん
垢版 |
2016/03/17(木) 13:56:34.33ID:G0ut1geZ
>>611
1つのソースファイルで済む規模なら、ヘッダファイル作らなくてもいいと思う

大きいプロジェクトになると関数とかネームスペース毎にソースファイル作ったりする
0613774ワット発電中さん
垢版 |
2016/03/17(木) 13:58:54.34ID:U0httzWP
ソース分割する必要が無いならヘッダを別に作る必要もないでしょ。
ヘッダファイルを作ることが正しいとかじゃなく、作った方が良いなら作る。

ソースを分けるのは機能ごとに見やすくするためであったり、流用しやすくしたり、
複数の人間で分担したり、分けた方が都合が良いから分けるんであって、
絶対に分けなければならないってことはない。
0614774ワット発電中さん
垢版 |
2016/03/17(木) 14:06:17.28ID:JyOt6Y3z
>>611
そのとおり
分割するかどうかはある意味好みの部分もある
例えば、LCD表示はLCD.cとLCD.hにしてあるけど
configやTRISは分けてないなあ
0615774ワット発電中さん
垢版 |
2016/03/17(木) 14:40:27.01ID:tMHdHkkz
>>607
基本的にはキャラクタベースのデータフォーマットで
任意のバイナリーデータ送るときは、確かDLE(Delimitter)
の後に続ける・・・というようなのが本来のフォーマット
だったはず
バイナリーデータの終わりはどうやって見つけるかは覚えてない^^;
0616774ワット発電中さん
垢版 |
2016/03/17(木) 14:44:41.13ID:nF2o+026
>>612-614
ありがとうございます。やはりそうなんですね。
疑問が解けて嬉しいです。
友達に聞いたら「なんでヘッダファイルつかわないの?」と、さも使うもの(must)と
言うので、疑問に思っていました。便利に見える方法でいいんですよね。

関数毎にソースを分けた場合、メインと関係づけるのは、
#include "xxx.c" と書いて、コンパイラーに、その場所に置いてもらう、
という方法で良いのでしょうか?
これも友達が、#include "xxx.lib" でリンカーで結合しなきゃ、と、
これまた「それが当然」のようなことを言うのです。(ちょっとイラっと来てます)
どうなのでしょうか。いまいちリンカーというのがわからないのですが。
    昔ほどPCが遅くないので、常にフルコンパイルでいいじゃないか、と思っているんですが
0618774ワット発電中さん
垢版 |
2016/03/17(木) 16:03:32.05ID:g62YcN2v
>>616
なんかもういろいろおかしい
分割コンパイルについて書いてある本買ってきた方がいいぞ
0619774ワット発電中さん
垢版 |
2016/03/17(木) 16:52:06.53ID:tMHdHkkz
>>616
どういう環境使ってるのか分からないけど、今はIDEに
色々サンプルプロジェクトがついてるのが普通だから
それを片っ端から開いてみれば、一般的なプロジェクトの
作り方・構造が分かると思うよ
0620774ワット発電中さん
垢版 |
2016/03/17(木) 17:00:01.87ID:nF2o+026
>>617,618
ありがとうございます。
>>617のページは、素晴らしいですね。一気に読んでしまいました。
全体の半分くらいしか、意味わかりませんでしたが、勉強したいと思います。
ありがとうございました。

そもそもの話ですみません、ヘッダファイルというのは、どのような理由で生まれて来たので
しょうか。ソースの先頭に付けるからヘッダなのかなぁ、と思いますけれども、
別に xxx.h としなくても、xxx.c として、#include すれば良いと思うのです。

すみません。
0621774ワット発電中さん
垢版 |
2016/03/17(木) 17:17:18.09ID:tMHdHkkz
xxx.h とするのは慣習だから、xxx.c としても文法的にはかまわないけど
普通は実行コード(ざっくばらんに言うと関数定義)を含む
ソースは xxx.c とし、含まないのは xxx.h とする

xxx.cをincludeするっていう技法も、過去には分割コンパイル・リンクの
できない環境で使われてたことがあるよ
0622774ワット発電中さん
垢版 |
2016/03/17(木) 17:25:30.39ID:tMHdHkkz
どのような理由で生まれて来たか、っていうのはCの本でも読んだほうが
いいと思うけど、1例としては複数のソースで使う定数に名前を
つけたい、っていうのがある

#define M_PI 3.14159 /* みたいなやつ */
0624774ワット発電中さん
垢版 |
2016/03/17(木) 19:50:43.82ID:Hvpah7VF
コンパイラ=>アセンブラ=>リンカ=>ロケータ=>コンバータ
                    ^
                    |
コンパイラ=>アセンブラ=>ライブラリアン
0625774ワット発電中さん
垢版 |
2016/03/18(金) 03:19:08.00ID:39hOkhUA
興味の湧く話で勉強になっています。僕も1つ教えてください。
Cには構造体があります。あまりの便利さに最初に見たときは、とても感激し興奮しました。

質問なんですが、アセンブラにも構造体や共有体があるのでしょうか?
それとも、ひたすらシフトとANDとORでやるのでしょうか?
0628774ワット発電中さん
垢版 |
2016/03/18(金) 10:10:13.63ID:39hOkhUA
ありがとうございます。
やはり無いんですね。そうすると、switch()も無さそうですね。
了解しました。ありがとうございました
0629774ワット発電中さん
垢版 |
2016/03/18(金) 10:24:39.43ID:qWmbEhQK
>>628
条件分岐命令は、フラグが立っているかどうか、だけしかない。

ただ、プログラムカウンタに直接アクセス出来るので、switch 的な分岐は作りやすい。
0630774ワット発電中さん
垢版 |
2016/03/18(金) 15:05:51.24ID:4jsKmNgM
>>629
>条件分岐命令は、フラグが立っているかどうか、だけしかない。
BNE アドレス
BEQ アドレス とか
というやつでしょうか。
0632nyannnyannko
垢版 |
2016/03/18(金) 21:23:50.88ID:4DsyICk0
XBASICで初めてcもどきを体験した
戻り値が1個なのに愕然とした。使えねーじゃん

でも戻り値に構造体が使える事にきがついた あらとっても
べんりじゃーん
0634774ワット発電中さん
垢版 |
2016/03/18(金) 22:18:26.93ID:3uaydBN/
最近はたくさんある引数も構造体でまとめて与えるのが主流かな
個別引数だと順番覚えるしかないけど、構造体のメンバーは名前で
区別できるし、最近の開発環境だとエディターのドロップダウン
リストから選ぶだけで記述できるから
0636774ワット発電中さん
垢版 |
2016/03/19(土) 04:13:20.26ID:8HKYRpCT
>>633
>void hoge ( &a, &b ) {
この意味がわかんないです。

>>634
>最近はたくさんある引数も構造体でまとめて与えるのが主流かな
頭いいですね。なるほど、これはいいですね。
0639774ワット発電中さん
垢版 |
2016/03/19(土) 11:09:08.18ID:/qvIpw4T
>>625
アセンブラは山から切り出してきた丸太
Cは製材してパネルや建具まで加工済み、という感じかな

質問をたとえると
「パネル(C)には連結できるような穴明け加工が可能ですが
丸太(アセンブラ)ではどうですか?」
0640774ワット発電中さん
垢版 |
2016/03/19(土) 11:55:00.66ID:rcW47DsF
構造体をそのまま引数で渡しても問題ないですか?
昔どこかでポインタのほうが良いって見た覚えがあるのですが、何だったか思い出せません、記憶違いかもしれません
呼び出された側の関数で書き換えることはあまりなく、いまは構造体をそのまま渡しています。
0641774ワット発電中さん
垢版 |
2016/03/19(土) 12:18:18.30ID:YCfIBS3m
>>640
コピーする時間と、消費するスタックが足りるならいいんじゃね

個人的にはやらないけど
0642774ワット発電中さん
垢版 |
2016/03/19(土) 15:39:43.05ID:uuQOch6m
>>640
ポインタで渡すと、構造体の内容変更したら、呼び出した側も変化する。
値で渡したら、変更しても、呼び出した側は変化しない。
0646774ワット発電中さん
垢版 |
2016/03/19(土) 19:49:32.63ID:xJepmA2G
規模が小さければグローバル変数でいいんじゃねって時もあるだろう
0647774ワット発電中さん
垢版 |
2016/03/20(日) 03:26:13.02ID:evQbtDDL
みなさん、ヒープ領域は、いくつ取ってますか?
私は画像はやりませんが、2047バイト取っています。
0649774ワット発電中さん
垢版 |
2016/03/20(日) 10:22:53.95ID:2UbBtLdu
RAMがないマイコンの事もたまには思い出してあげてください
0651774ワット発電中さん
垢版 |
2016/03/20(日) 13:04:10.28ID:NrYQ6Rqb
レジスタがRAMほどあれば楽勝
AVRでUARTの受信リングバッファにレジスタ8個使った事があるw
0654774ワット発電中さん
垢版 |
2016/03/21(月) 14:42:33.36ID:HZsuucqD
この場合のレジスタとは、
○○設定レジスタとして何かを設定する用のレジスタだけど、
RAMが足らないので、その周辺機能は使わずに、
設定レジスタを記憶場所として使う、
という意味でしょうか?
0655774ワット発電中さん
垢版 |
2016/03/21(月) 15:27:16.28ID:ndxPHy2F
>>654
たとえばAVRのmega328には256個のレジスタが有り、機能は大きく二種類に分かれている。
0〜31:汎用レジスタ
32〜255:外部パラレル入出力、SP、カウンタ/タイマ、ADC、I2C・・・割り込みや各種動作条件設定など

汎用レジスタには演算の他にも、単なるバッファとしてデータを格納出来る。
インデックスレジスタを使ったアドレッシングも出来るので、
多分、>>651 は32個の汎用レジスタの中の、アドレスが連続した8個のレジスタを
受信用のリングバッファに使ったのだろう。
8バイトでバッファオーバーフローしないなら、リングにする意味があるのかなと思うが。
(難しかったらゴメン、短い文章でうまく説明できない)
0656774ワット発電中さん
垢版 |
2016/03/21(月) 21:13:32.30ID:HZsuucqD
>>655
説明ありがとうございます。
難しくありません。よくわかりました。

A, B, H, LなどのCPUの処理用のアキュームレータはちゃんとある上に、
さらに、その0〜31の汎用レジスタがあるということでしょうか?

「贅沢に」という意味は、
0〜31の32個のレジスタは、本来ちゃんと使うべき用途があるので、
他の目的で使うことはしないのに、よく8バイト「も」使ったね、
という理解で良いでしょうか?
0657774ワット発電中さん
垢版 |
2016/03/22(火) 00:17:48.97ID:gUDrhG1Q
横レスです。AVRはほとんど忘れてしまってるから
「知らんくせに書くな」って言われるかもだけど
A,B,H,L とかなくて、R0-R31のうちの一部がそれに相当する
レジスタだったはず

R0-R31にアドレスが割り振られてるっていうのもAVR固有ですね。
0658774ワット発電中さん
垢版 |
2016/03/22(火) 03:32:05.64ID:qZy6uou2
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つ進めるだけ。

どうでしょうか。
0661774ワット発電中さん
垢版 |
2016/03/22(火) 09:56:21.24ID:zwzz7FX8
int *pにて、pはアドレス、*pは数値。
p=p+1するとアドレスは4進む(32ビットCPUの場合)。
0662774ワット発電中さん
垢版 |
2016/03/22(火) 10:00:38.78ID:qZy6uou2
アドレスは、&pでは?
0664774ワット発電中さん
垢版 |
2016/03/22(火) 15:24:49.35ID:jQt04+to
ありがとうございます。

>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つずつ
という理解で良いでしょうか?
0667774ワット発電中さん
垢版 |
2016/03/22(火) 18:31:42.35ID:rNgSPDd+
int は、short より大きく、long より小さいんじゃなかったっけ?
0669774ワット発電中さん
垢版 |
2016/03/22(火) 21:48:19.90ID:jQt04+to
ありがとうございます。

ということは、
>int *p
の場合の、
*p = 0x1234 は、ぴったり16bitでOKで、
*p = 0x12345678 は、溢れると言う理解で良いですね。

実際にpに入れる値は、
p = 0x12;
p = 0x1234;
p = 0x12345678;
どれになるかは、コンパイラー依存なので、人間が決める事はできない、という理解で良いでしょうか?
0670774ワット発電中さん
垢版 |
2016/03/22(火) 21:54:45.53ID:yE9oi4Te
コンパイラ依存なのでintが何ビット長かで変わる
なので、stdint.h 読み込んで uint16_t とか使った方が
後で違う環境になった時に楽だよ
0671774ワット発電中さん
垢版 |
2016/03/22(火) 23:25:30.93ID:jQt04+to
ありがとうございます。

そうすると、以下のようなことも起こりうるでしょうか。
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
0672774ワット発電中さん
垢版 |
2016/03/22(火) 23:43:08.30ID:gUDrhG1Q
char はバイトに固定っていうのがCの言語仕様で規定されてるって
ウワサで聞いた気がする
0673774ワット発電中さん
垢版 |
2016/03/23(水) 00:48:14.48ID:iS4Jq3UD
>>671
データを収めるとき符号拡張して4バイト境界で格納
すればそうなる。それはマイコンの仕様に書いてあるでしょ
0674774ワット発電中さん
垢版 |
2016/03/23(水) 01:32:39.13ID:YjjKWMUa
ポインタとは何か?一言で言えば

間接アドレッシング機構のことです。

K&Rの原書見ても、きちんと理解できるような記述にはなってなかった印象がある。
アセンブラでここら辺のプログラム経験あれば、
すぐ感覚的に理解できるんだけどね。
ポインタのインクリメントでアドレスにアクセスするのがなぜおいしいか?
理由は、
ハードウェアがそういう命令持ってて、インデックス計算のためのクロックを消費しないから。

テーブルから一つずつ順番に読みだしてレジスタに格納するような記述が便利で効率的
あと、やっちゃいけない記述でこんなのがある

func( p++,p++);

普通コンパイラは後のポインタからインクリメントされるけど、仕様として決まってなかったはず。
0675774ワット発電中さん
垢版 |
2016/03/23(水) 01:37:19.55ID:YjjKWMUa
>>669
問題
int を charポインタで受けてエンディアンを確認するプログラムを書いてみよ

warningは出るけど
0676774ワット発電中さん
垢版 |
2016/03/23(水) 01:39:53.94ID://3ji1O5
>>671
さすがにcha *でそうなるのは一般的とは言えないような。
マイコンによっては2バイトとか4バイトで番地がふられてるのもあるし、
奇数番地から16ビットアクセスができないとうのもある。
ビッグエンディアンなら3番地と7番地になるし、質問の範囲が広いので
CPUと開発環境によるということになってしまう。
0677774ワット発電中さん
垢版 |
2016/03/23(水) 01:59:09.19ID:YjjKWMUa
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なら安全に停止するはず。
ひとつ前のインクリメントですでにアウトかも。
0679774ワット発電中さん
垢版 |
2016/03/23(水) 03:27:27.79ID:Vgfi6tXp
*p++ というのは、

*(p++) アドレス番地の加算して、そこの値 のことでしょうか?
それとも、
(*p)++ 現在のp番地の値の加算なのでしょうか?

ポインターは難しいです。
0680774ワット発電中さん
垢版 |
2016/03/23(水) 03:41:30.04ID:11P68P9j
Cの文法から説明して解説する能力ないですが、*(p++) のはずです。

自分で書くとき理解が怪しいと思ったら、分けて書くほうが確実
昔はコンパイラ技術が未熟で、生成コードが違ったりしてたけど
今はそんなことないはずだし、仮に違ってたとしても、そんなこと
問題になるケースはほとんどないはずですから
0681774ワット発電中さん
垢版 |
2016/03/23(水) 06:03:52.07ID:YjjKWMUa
>>679
*p++ == *(p++)
あと、こういうのは演算子の優先順位なんだが、
そんなの覚える必要なく、()を使ってコンパイラに指示すればいいだけ。
そのうち慣れてくる
0682774ワット発電中さん
垢版 |
2016/03/23(水) 06:13:03.36ID:YjjKWMUa
>>678
明示的にキャストかけて、
p = (unsigned char *)&x ;

としないと、今のコンパイラはエラー吐くね。gccで確認した。
昔はwarningだけで最後まで行った。
んで、最後の2行 p+4 はxの格納場所の1バイト先見てるので、
本来はアクセスエラーなんだけど,CygwinX64は停止しないな。
0683774ワット発電中さん
垢版 |
2016/03/23(水) 06:19:28.20ID:YjjKWMUa
>>680
>自分で書くとき理解が怪しいと思ったら、分けて書くほうが確実

分けてというのは複数行でってこと?
最適化がアホなコンパイラだと、本来1命令でできることを複数命令でやってくれて実行速度落ちる場合があるよ。
1行でカッコ使って優先順位を明示してやればさすがにそういうことはないけど
0684774ワット発電中さん
垢版 |
2016/03/23(水) 07:57:59.64ID:l3jQb875
英語だけど置いときます。時計回り渦巻き法。

ttp://c-faq.com/decl/spiral.anderson.html
0685774ワット発電中さん
垢版 |
2016/03/23(水) 09:31:18.88ID:+ciOLog6
>>683
命令ってのはインストラクションのこと?
数クロック気にするならアセンブラで書けよ。
だいたい、K&R を引っ張ってくるなよ。
0686774ワット発電中さん
垢版 |
2016/03/23(水) 10:25:18.98ID:Vgfi6tXp
皆さん すごいですね。
職業でプログラムやってる人ですか?
とても詳しい。
0687774ワット発電中さん
垢版 |
2016/03/23(水) 11:20:58.19ID:9BKJZemn
そもそもこの問題のCPUが何ビットか、リトルエディアンかラージか書いてない時点で
0688774ワット発電中さん
垢版 |
2016/03/23(水) 12:50:21.48ID:C4cm0/Jh
趣味でも10年ぐらいやってりゃcなんてマスターできるよ
c++は多分無理だけど
0689774ワット発電中さん
垢版 |
2016/03/23(水) 13:36:24.23ID:YjjKWMUa
>>685
Cで書くにしても、アセンブラをイメージできないアホはエンベのコーディングなんかやるなゴミ
Cの最もベーシックな部分を理解する上で、原点のK&R 引用すら思い浮かばないお前が糞ってことだゴミ
0693774ワット発電中さん
垢版 |
2016/03/24(木) 13:15:49.34ID:P9pWCEXB
ポインターで質問があります。
以下のポインターについての文章は、知恵袋からの引用です。

>aという容器はプログラム空間のどこかに実際に存在しているわけですが、
>この容器の在り処、言うなれば住所をアドレスと呼びましょう。
>例えば「戸棚の上の左から2番目」のような具体的な場所を想像してください。これをアドレスと呼びましょう。
>int *b;
>というのはポインタ変数の宣言です。前述の容器に例えるならポインタ変数というのは「アドレス専用の容器」といえます。
>住所専用です。値はいれない。この場合、まだ容器の中は空っぽです。ここまでが前提です。
>さて問題となっている「警告/エラー」の件ですが
>b = a;
>は、bというアドレス専用の容器に、aの中に入っている5という値をいれようとしています。
>「その容器はアドレス専用ですよ!?」と警告されたわけです。
>アドレス専用ですから例えば「aのアドレス ( 戸棚の上の左から二番目 )」というような情報ならいいけれども
>「5」なんていれられても困ります。アンケートの住所欄に年齢を書いているようなものです。
>そこで
>b = &a;
>としてみる。変数の前に&をつけると、その変数の値そのものではなくて
>その場所、アドレスを教えてくれる決まりがあります。
>そうするとb(アドレス専用容器)には、aのアドレス(「戸棚の上の左から二番目」)
>が入れられることになります。これならエラーにはなりません。

質問
>アドレス専用ですから例えば「aのアドレス ( 戸棚の上の左から二番目 )」というような情報ならいいけれども
>「5」なんていれられても困ります。アンケートの住所欄に年齢を書いているようなものです。
上記文章を読むと、5 という値に何か属性があるように読めるのですが、
入れる入れ物の用途は異なるけど、代入する値は、同じ 5 (0x05) で代入可能と思うのですが、違うでしょうか?
0694774ワット発電中さん
垢版 |
2016/03/24(木) 16:52:18.14ID:LCiACUv4
>>671
0x0000番地 12
0x0001番地 34
0x0002番地 56
0x0003番地 不定
0x0004番地 不定
0x0005番地 不定
0x0006番地 不定
0x0007番地 不定
0x0008番地 不定
0695774ワット発電中さん
垢版 |
2016/03/24(木) 17:26:18.56ID:SNFiOjU3
>>693
char* p = (char*)5;
みたいなこと?

それなら可能だし、MMUの無いようなマイコンでは普通に使うけど

ただ、*pに書き込んだり、*pを読み込むことができるかどうかは別の話
0696774ワット発電中さん
垢版 |
2016/03/24(木) 21:04:40.29ID:oRRRPyny
>>690
ここはマイコンスレなんだよウスノロ
組込に関係ないなら出ていけ低能
あと、マイコンでなくともアセンブラ出力をイメージできないアホが生意気にCでコーディングすんな土方
0698774ワット発電中さん
垢版 |
2016/03/25(金) 08:15:48.61ID:ZljTFZPE
>>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
0699774ワット発電中さん
垢版 |
2016/03/25(金) 11:34:34.91ID:u9N9Yqn6
>>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
のような記述も見るのですが、これ
0700774ワット発電中さん
垢版 |
2016/03/25(金) 11:41:29.97ID:XeG20+tr
>>696
ウスノロ、低脳に土方かぁ・・・
いまいちピンと来ないな、単語が古すぎる
次回はもっと工夫してくれ、オチがあれば嬉しい(笑)
0701774ワット発電中さん
垢版 |
2016/03/25(金) 13:14:28.94ID:V89pLKZe
>>699
&はポインタをもつ対象からポインタを求める演算子
昔の言い方ならlvalueを求める演算子
だから(int *)(0x12345678)などとはかけるけど
&(0x12345678)とは直接かけない
無理やり書くなら
&(*((int *)(0x12345678)))とでもやりますか 意味ないけど
0702774ワット発電中さん
垢版 |
2016/03/25(金) 14:25:16.81ID:JtdZr6xD
>>699
>int a,c; // 通常の変数、数値。bit幅は16bit
これも bit幅はコンパイラ次第
0703774ワット発電中さん
垢版 |
2016/03/26(土) 17:19:26.22ID:QfWiQqLo
> int *b;  // ポインタ型変数b 目的地のbit幅は16bit p++での増分はコンパイラ次第で不明

bは、int型の変数のアドレスを入れるための変数。
int型の変数のサイズが16bitなら(コンパイラに依る)、b++での増加は16bit=2Byteなので2
64bit用にコンパイルしたら、int型の変数は64bitになることが多い(コンパイラ依存ね)のでb++で8増える
「不明」ではなく、次の変数のアドレスになるように増える訳ね
0704774ワット発電中さん
垢版 |
2016/03/26(土) 18:40:32.55ID:EijM82zE
>>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まで の値しか入れられない  以下同文
0705703
垢版 |
2016/03/26(土) 20:21:20.48ID:QfWiQqLo
>>704
おれも横から書き込んだだけだった
1),2)は合ってるけど、3)はコンパイラ依存のはず。
386SXみたいな32bitCPUだけどメモリ用のバスは24bitしかないCPU向けにコンパイラを作ったとしても、普通、ポインタ変数は32bitにすると思う。
24bit=3Byteの変数なんて扱いにくいし、ポインタ変数のアドレスを入れる変数(int ** とか)を考えると、++した時に3増加させるってのは考えづらいよね。
メモリ使用効率を重視したコンパイラなら24bitにするのかもしれないけど。
0706774ワット発電中さん
垢版 |
2016/03/26(土) 21:12:47.19ID:T+pM/LsG
1wordが8bitというのも絶対ではなくて、
別に9bitでもいいんですよ。
12bit CPUだって作れないこともない。
0707774ワット発電中さん
垢版 |
2016/03/26(土) 21:19:07.30ID:xZjhG9PC
>>704
>int *b;
>1) bは「int型の変数」 のアドレスを入れるための変数。 intは、左記「」に修飾されるですよね?
bはint型を指し示すポインタ。int *b; はそういう宣言。
bにはざっくり言えばメモリアドレスが入る。

bがintを指し示すポインタであるからこそ、b++はint型の大きさ一つ分増加する

>メモリー空間のbit幅による。
メモリを指し示すアドレスの大きさな。
0709774ワット発電中さん
垢版 |
2016/03/26(土) 21:52:35.49ID:T+pM/LsG
>>708
そんなのあったんですね。
DSPだと変なビット数多いけど、昔のマイコンも面白いですね。
0711774ワット発電中さん
垢版 |
2016/03/27(日) 13:31:09.64ID:65dGJ2Z1
友達の間では、
・TK-80・・・誰でも持ってる、情報多い
・H68/TR・・マニア、コンソールがカッコイイ
・L-Kit8, 16・・・・誰も持っていない、アセンブラがキー1発で入力できる
・TLCS??? ・・・・東芝 誰も見たことがない
0712774ワット発電中さん
垢版 |
2016/03/27(日) 13:44:26.95ID:927ApAaQ
EX-80は見かけるがEX-5は見たことない。
EX-0に至っては神話レベルか。
0714774ワット発電中さん
垢版 |
2016/03/28(月) 07:11:46.66ID:2rrNzrEH
Lkit-16は16ビット固定語長で、今風に言えばRISCだな
日本は40年も前にこんな優秀なオリジナルCPUを作れていたのに
どうしてこんな事になってしまったのか・・・
0715774ワット発電中さん
垢版 |
2016/03/28(月) 07:45:16.55ID:IG7s4lSn
商売にならないからだよ
もうひとつは発信力というか、
開発環境を含めてユーザー教育、ユーザーサポートをどこも嫌がった。
極力売り切りで済ませたかった。
日本語というローカル言語がいろんな意味で阻害要因として大きいんじゃないかな?
0716774ワット発電中さん
垢版 |
2016/03/28(月) 09:03:49.44ID:YMBWHn3y
日本の半導体メーカは大口顧客しか見てないからな。
個人ユーザやファンを増やすって視点が全くない。今でも。
0717774ワット発電中さん
垢版 |
2016/03/28(月) 14:22:01.58ID:7iLijvCk
そうやって大口顧客に買い叩かれ
開発に回す予算も無く
風前の灯

この国全体の様子とよく似ている
0718774ワット発電中さん
垢版 |
2016/03/28(月) 18:18:10.55ID:cZTKZRbO
ディスコンにならないdsPICとPIC32でいいや、情報も多いし中小相手でもサンプルくれるし
0719774ワット発電中さん
垢版 |
2016/03/29(火) 00:31:55.19ID:x/RRnrLD
そもそも、TK-80とかは「マイコントレーニングキット」という名前だった。
誰向けのトレーニングなのか、未だに不明
0720774ワット発電中さん
垢版 |
2016/03/29(火) 01:05:19.13ID:B8HihRVe
ハードウェア開発者、ロジックICゴリゴリでシステム作ってた連中向けだったね、最初は。
0721774ワット発電中さん
垢版 |
2016/03/29(火) 03:00:37.36ID:x/RRnrLD
確か、10万円くらいした。
小遣いでは、買えなかった。
0723774ワット発電中さん
垢版 |
2016/03/29(火) 09:42:13.60ID:x/RRnrLD
>>722
なるほど。あいんさ
ちなみに、アセンブラ無いだろうから、ニーモニックの書かれた印刷物だけかな
0724774ワット発電中さん
垢版 |
2016/04/09(土) 22:09:23.24ID:AnQe0GwM
すごーい。このスレ、3行以上の文章が書ける頭(・∀・)イイ!!人が多いわ。
他のスレは長くても2行がやっとだねぇ・・・orz
物理板見てきたら5行くらいは普通に書ける人が多いのがわかった。
電電版のあたしたちは、もっと学び、努力すべきではないでしょうか。
0725774ワット発電中さん
垢版 |
2016/04/10(日) 00:26:11.70ID:FdBHnyOA
バカにしてるのか?
0726774ワット発電中さん
垢版 |
2016/04/10(日) 06:56:29.50ID:7VrTaing
>>724
お前もスゴイぞ。
3行以上書いてるからな。
巣に戻ったら仲間に自慢していい。
俺だってもう4行書いてしまったから頭が良いのだ。
それでいいのだw
0727774ワット発電中さん
垢版 |
2016/04/10(日) 08:45:44.79ID:vknzlFvp
>>725 いいえ。このスレを褒めました。
>>726 5行書けましたね。頭(・∀・)イイ!! 

スマホが普及するとパソコンも使えなくなる人が増えるという文明劣化が始まっているよね。
だから1,2行がやっとの人が増えるのだと思う。こうなると作文すら書けなくなるよね。
プログラム書けるのが神業になる時代がやってくるの?
頭(・∀・)イイ!!人工知能の汎用学習機能開発は、遠ーい夢のまた夢かなぁ??
人気のパソコンがバグだらけで動かなくなってんのに、テレビは何もわかってないのかなぁ?
0728774ワット発電中さん
垢版 |
2016/04/10(日) 14:32:33.76ID:vknzlFvp
悩み事としては、Win7のバグが治らないのでOSXとiOSにしたのですが、最近はOSXとiOSもバグが治りません。
WinXP, Mavericks, iOS5.1までは、そこそこの高品質だったのですが、だんだんバグが治らない
状況が徐々に悪化しています。
この状況を改善するにはどうしたら良いでしょうか?
0729774ワット発電中さん
垢版 |
2016/04/10(日) 14:46:43.14ID:+vtSr6Ff
CP/Mでも使っていればいいんでない?ソース公開されてるし、たいしたサイズでもない。
0731774ワット発電中さん
垢版 |
2016/04/12(火) 03:47:10.08ID:/nY4/BBq
MS-DOSは、PC98で初めてさわった。
最初に覚えたコマンドは、DIR だった。

すでに MIFES と エコロジー が入っていたので、さすがに edlin はやらなかった。
3.5インチのフロッピーが羨ましかったのを覚えてる。
0732774ワット発電中さん
垢版 |
2016/04/12(火) 08:29:31.87ID:MIhHvFW0
エコロジーV思い出した
PC98なのにマウス操作できるうえに色々と機能あったね
0733774ワット発電中さん
垢版 |
2016/04/12(火) 11:52:11.91ID:K2Uok63W
コピーや移動が楽ちんにできるのもビックリだけど、
消してしまったファイルが復活できるのに、驚いた。
エコロジー様様
0734774ワット発電中さん
垢版 |
2016/04/12(火) 12:09:32.17ID:TxHqAcrh
セクタ表示や編集もできたり圧縮ファイルの中身表示に対応してたり画期的だったね
あの頃にしては珍しくベンチマーク機能もあったしメモリ割り当ての表示機能もあった
0735774ワット発電中さん
垢版 |
2016/04/12(火) 20:46:31.95ID:wOmNPuYA
DOSやUbuntuで人気OSの代わりをするというのが質問の意図じゃなくて、
WinXP/OSX等で10年間以上も使われてきた仕事用の高価なアプリ群が新しいOSで動かない、
しかもOSのバグで動かないとなると、これは困った話で
これから先を考えると、どうやって仕事を続けるのか?という悩み事なんです。

例えばCPMやMS-DOS時代ではもともとそうした優れた仕事用アプリが無かったわけで
それらを古いOSでは交替がきなかいんです。
0736774ワット発電中さん
垢版 |
2016/04/12(火) 21:18:46.15ID:K2Uok63W
>>735
XPを使い続けるしかないんじゃないかな
0737774ワット発電中さん
垢版 |
2016/04/12(火) 21:59:29.71ID:NsTeiWzv
本当にOSのバグなのかね?
むしろバグが直って動かなくなったとかね。
0739774ワット発電中さん
垢版 |
2016/04/12(火) 23:23:06.99ID:Ju+cqa7h
そしてネットにはつながなかったが、USBから感染…
ソフト更新しないとお金にならないから仕方ないよね
0740774ワット発電中さん
垢版 |
2016/04/13(水) 21:37:26.53ID:oL4zuO/h
>>736
病院ではXP使ってますね。PCは何の問題も無い様子ですが、メインテ料金が高価そう。
Win7 の一番高い製品よりも、WinXP SP3が何を比較してもWin7が負けてます。
つまりVista失敗が大変痛いわけです。
Win9が無くなって、Win10は謎が多いって、結構問題は大きいなーと。
macbookユーザ増えたのもわかる気がする。デザインがおしゃれと若い女性には受けてるらしい。
0742774ワット発電中さん
垢版 |
2016/04/13(水) 22:15:26.51ID:oL4zuO/h
それはあるかもしれない。

マイクロソフトはユーザの声をよーく
聞いてくれるのが良い社風。
だけどこのままでは危ない気がする。

PowerPC(x86の2倍性能)からcore-i になったのも、なんかあるなー・・・と。
0744774ワット発電中さん
垢版 |
2016/04/14(木) 21:32:04.39ID:rka7C1rA
googleさんではIBM POWER9サーバ採用らしいのですが、これがいいのかな?
九州で震度7だそうです。
リアクター止めないと・・・。落ち着いて行動願います。
0745774ワット発電中さん
垢版 |
2016/04/15(金) 17:15:40.83ID:+BTbw/fF
OSが古すぎて新しいウイルスじゃ感染しないとかね。

>>735
VMwareでも入れて昔のXPでも動かしてりゃいい。
XP持っていないなら、7Proを手に入れればXPモードがついてくる。
7Proのリテールを手に入れれば、ホストOSの下の仮想マシンとして
7Proをインストールして、その下でXPモードが動かせるんじゃないかいな。
0746774ワット発電中さん
垢版 |
2016/04/15(金) 19:07:40.35ID:AgpFSP8f
XPもいまだに「悪意のあるソフトウェアの削除ツール」は毎月のように
更新されて来るな
0747774ワット発電中さん
垢版 |
2016/04/15(金) 19:21:55.82ID:p69Y2Y0l
>>745
韓国が思いっきしそれやられたんだよなぁ…。
自国で勝手にパッチあてるからもうもうお金払わねーってやって古いシステムみんなで使ってたら
マジで何から何までダウンしたとか…。
0748774ワット発電中さん
垢版 |
2016/04/17(日) 11:54:34.83ID:4PIpRAr4
Win10が最後のOSと言っているメディアがあるのです。
パソコンがオワコンになったら、スマートホンで仕事するの?
んなことできるわけないと思うのですが、どうでしょうか。

個人的にはx86のマルチコアもARMのマルチコアもアーキテクチャは既に失敗しているので
作りなおすか、設計全体について時計の針をXP時代に戻さないと、この先やっていけないと思う。

スマホを使う文化は、社会全体のビジネスの発展、自らの首をしめるマイナスの現象が見えてる。
日本全体でみんなの頭がどんどん悪くなる方向に文明を後退させてきていると思う。
0749774ワット発電中さん
垢版 |
2016/04/17(日) 12:32:40.68ID:cteZrRQu
アーキテクチャの何が問題ですか?
x86もARMも特長を活かした使い方してるんじゃないの?
マルチタスクがーって具体的に理想的なマルチタスクとは何ですか?
0750774ワット発電中さん
垢版 |
2016/04/17(日) 17:25:43.03ID:4PIpRAr4
おおざっぱには、マルチコアによるメモリアクセス競合と高速IOバスのアービトレーションがうまくできず、
キャッシュヒット率が低下、性能低下が起こり、
バスアービターであるチップセットの論理不良が取れなくなる課題が解決できない点です。
0751774ワット発電中さん
垢版 |
2016/04/17(日) 17:55:03.76ID:AvM70OK6
Win10TH2(10586)とかWin10RedstoneとかWin10MobileとかWin10IoTなど
Win10の名前を冠したOSが出てるだけで、Win10(10240)が最後のOSだという記事はないと思う
0753774ワット発電中さん
垢版 |
2016/04/18(月) 13:35:57.65ID:eNbPKWmr
他から転載

C→プログラミングの幹 ITで生きていくならやって損は無いけど、使う場面あんま無いし得は少ないかも
C++→パンドラの匣。これを開けたら絶望が待っているけど、乗り越えたら希望が手に入る。
Java→幅広く使われてる GUIアプリとかサクッと作れちゃう
    使えたら職にしやすいかも 個人的には書いてて楽しくない
     デザパ知らないと実装がめちゃくちゃに成りやすい
js→ナウでヤングな言語 使いやすくて簡単かつ、挫折しにくい。
    すぐにモノが出来る。超絶職にしやすい。一ヶ月集中して勉強したらフリーで仕事取れるレベルに簡単
php→この言語しか触れないとペチパーとバカにされる。rubyが増えてきてPHP案件減ってるけど、
    まだまだ現役でWEB系でよく使う言語。JSよりかは難しいかもだけど、JavaとかCに比べると楽ちん
ruby→完全オブジェクト指向。日本語のリファレンスが多い。
    サクッと使い捨てのスクリプト組むのに便利。入りやすい。イテレーターとか便利。
python→数学系のAPIが強い。文法がシンプル。
    インデントを強要されるから初心者でもある程度キレイなコードが書ける。勉強用としても結構良いかも。
0755774ワット発電中さん
垢版 |
2016/04/18(月) 20:51:06.08ID:GEoJAOSW
>>748
別に失敗でも何でも無いだろうさ。あえて言うならCPU一人に処理を
押し付けることを前提にしている>748の発想そのものが間違ってるって
あたりかな?
0756774ワット発電中さん
垢版 |
2016/04/24(日) 20:40:55.02ID:UVrfKWW+
マイコンの話ではないけど、NIというところのLABOVIEWというソフトのランタイムを
ダウンロードしてインストールしました。
しかしランタイムとは何なのでしょうか? といも大きい容量です。
CPU = i7 で、SSD なのに、インストールに20分以上かかりました。
マイコンのhexとはちがうでしょうけど、なんでこんなに大きいのでしょうか?
0757774ワット発電中さん
垢版 |
2016/04/24(日) 21:30:39.24ID:wil9QcBS
LaboviewはPLCでやるような制御をPCでやるようなもんだべ
DCSではないけど
Laboviewで有名なのは画像処理だべ
COGNEXとかみたいなことができるからサイズでかいの当たり前だべ
まともに買うと高いべ
0759774ワット発電中さん
垢版 |
2016/04/24(日) 21:48:22.47ID:ugOtWo8+
LabVIEWのフルバージョンで画像処理と信号処理と測定の自動化に使ってる
マイコンに組み込めたら、もっと幅が広がるのにとは思うけどNIの自社製品が売れなくなるからしないだろうね
0760774ワット発電中さん
垢版 |
2016/04/24(日) 22:05:25.94ID:wil9QcBS
LaboとLab違う製品なのか知らんかった
labviewはFPGA,asicにもできるけど
cognex visonproのARMかlinuxばんが欲しい
windowsは仕様がちょこちょこ変わるからいやずら
0761774ワット発電中さん
垢版 |
2016/04/25(月) 00:45:17.93ID:1X+URX+V
そろそろWin10 PCを使わないといけないかなという現象が出てきました。
ALT+CTRL+DELでも応答が無いので電源を強制OFFしました。

FujitsuとSurfaceではどちらが安定して動きますか?
まだ様子見の人が多いのでしょうか、Win7では超不便で辛い今日このごろです。
Win 10 PC 使ってる人は、どんな調子ですか?
0763774ワット発電中さん
垢版 |
2016/04/25(月) 02:08:10.06ID:vvaQ9XMU
LabViewって、簡単らしいけど、使ったことない。
LabViewで作ったアプリ(?)を使ったことがあるけど、
使いにくそうだった。作成者のセンスもあるんだろうけど
Windowsのアプリと同じつもりで接すると、びっくりするような所で違和感がある。
0764774ワット発電中さん
垢版 |
2016/04/25(月) 04:38:50.30ID:5+9bJkW2
>>761
OSとかあんまり関係ないんじゃないの?それ

強制終了効かないが多発してるなら
ウイルスとかドライバとかハードとかの原因沢山あるので

オイラならとりあえず
・ディスクチェック
・ウィルススキャン
・ドライバ最新版にする
・メモリチェック
やってダメならリカバリで出荷状態かな

あーあとはPC内部のコネクタとか抜けかかったりとかでも
フリーズ頻発あったな
ま、買い換えちゃうのが一番手っ取り早いっちゃ早い

Win10使ってるけど
細かい不具合たまにあるよ

サービスがCPU食いまくったり
スタートボタン効かなくなったり
正直7の方が安定度高いなぁ
色々機能切りまくれば、体感速度は10に軍配上がるけどね
0765774ワット発電中さん
垢版 |
2016/04/25(月) 12:39:28.35ID:D6OeASXe
LabVIEWの長所は保守性かと、1年ぶりに見て内容がすぐわかる
LabVIEWにする必要がないなら無理にしなくてもいいよ、値段結構する
0766774ワット発電中さん
垢版 |
2016/04/25(月) 13:57:13.55ID:aFwzQXp1
>>765
>値段結構する
どのくらいする物なんですか? 個人では買えそうにない?
ハードはUSBケーブル1本でOKでしょうか?
0767774ワット発電中さん
垢版 |
2016/04/25(月) 14:21:48.38ID:xb0GS66G
Win95時代にLABVIEW考えたことあるけど高かった
手持ちのVB2だと測定器(熱電対のAD)のDLLが無くて結局なに使ったっけ?
思い出せたら書き込む(20年前だ無理だな)
0768774ワット発電中さん
垢版 |
2016/04/25(月) 14:22:22.08ID:D6OeASXe
>>766
NIの製品から細かいオプションを見ることをオススメする(測定装置も含めて)
オプション一切なしの信号処理や微分積分もできないバージョンで17万
信号処理などのついた開発版で44万
自分の使ってるバージョンで200万円(いま24%引き)
0769774ワット発電中さん
垢版 |
2016/04/25(月) 15:34:31.68ID:V6NK/FCf
某大手部品メーカーがPLCからLabviewに替えようといている
SI屋としては迷惑
0770774ワット発電中さん
垢版 |
2016/04/26(火) 20:27:34.70ID:ZO6VNjh3
ありがとうございます。現在、調査解析と修復中です。
メモリソケット周辺での波形乱れがあり、データ伝送のSHF周波数ドメインレベルでのインピーダンス整合に課題がありそうです。
この実装方式はおそらく90MHzくらいが限界ではないでしょうか。

メモリフェッチが途中で停止しCPUが待ち状態で身動きがとれず制御不能に陥るグリッジもあるようです。
CPUが停止しているとプログラムは動けないのでOSでもどうにもできない課題があるようです。
こんなケースに備えてあたしのパテントを実装するとそんなことにはならないのにかなり落胆しています。OTL

経験的にはCPU,LSI、Memory SIMは、ハンダ直付の方がLSIピン周辺での波形の乱れが少なく
あたしはそう設計してきているのですが、外国製品の製造メーカによっては、まだ良く知られていない
結果がこの現象を招いているようです。
その関係メーカでは、ハードウェア高周波設計ノウハウが、マイコンボード設計に対し現在未習得なのかもしれません。
0772774ワット発電中さん
垢版 |
2016/05/18(水) 01:36:41.15ID:T71w7I2P
マイコンで、C++のような、クラスとかを使ってプログラムできますか?
0773774ワット発電中さん
垢版 |
2016/05/18(水) 03:28:16.90ID:VorM+t6i
使用するマイコンの開発環境次第。
ArduinoなんかはGCC使ってるからC++
0776774ワット発電中さん
垢版 |
2016/05/31(火) 15:48:51.93ID:ncF5c/71
すみませんが教えて欲しいのですが、
C言語で、
long a;
int b;
b=a/500;
と書いたとき変数aに2000が入っていたらbが4になり格納されるでしょうか?
longとintで宣言した変数を混ぜて計算するとエラーになるかどうかはコンパイラー次第でしょうか?
0778774ワット発電中さん
垢版 |
2016/05/31(火) 23:44:25.96ID:7ahqz54A
>>776
>エラーになるかどうかはコンパイラー次第でしょうか?
エラーにはならないでしょう。コンパイラーの仕様通りに計算される。

普通は、bit幅の違う変数をいきなり計算はしない。
キャストして、bit幅を合わせて計算するね。
0779774ワット発電中さん
垢版 |
2016/06/03(金) 17:57:02.42ID:AHtOwf3a
長いビット長に合わせるコードを出す。
明示的にキャスト書いた方がいいね。
0780774ワット発電中さん
垢版 |
2016/06/04(土) 02:46:16.49ID:X05n1Q6A
符号をはっきりさせたいので、
int a;
とはせずに、
unsigned int q;
と、毎回書いてる。
等号の右辺左辺も、bit幅同じでない書き方はやめている。
必ずキャストして使う。
0782774ワット発電中さん
垢版 |
2016/06/05(日) 06:40:07.63ID:NCoeG16f
>>766>>768
つ[LabVIEW Home Bundle]
ttp://sine.ni.com/nips/cds/view/p/lang/ja/nid/213095
0783774ワット発電中さん
垢版 |
2016/06/05(日) 07:00:15.32ID:NCoeG16f
>>765
保守性が高くなる様に描かないと(プログラムは「書く」ものだけど、
LabVIEWに限っては「描く」でも違和感無いなw)、悲惨な事になるけどねw

(例:ケースストラクチャで、重要ではなさそうなケースを表に
出してセーブするとか。)

テキストでプログラムを記述する言語と違って、差分…diffとかを簡単に
取れないのもマイナスポイントですね。
あと描いたものが属人的になりがちなのも。
0784774ワット発電中さん
垢版 |
2016/06/05(日) 08:19:42.26ID:MivTEdrK
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);
0785774ワット発電中さん
垢版 |
2016/06/05(日) 13:01:32.84ID:An9pddCr
大文字で 500L って書く方が好きだ
1 と l が見分けやすいフォントを使ってはいるが
0786774ワット発電中さん
垢版 |
2016/06/05(日) 16:23:53.77ID:UA1kq8ES
intで宣言した変数に割り算の結果を格納した場合、正数部分だけ格納されるのでしょうか?
int a
int b
bが3の場合
a=7/bなら
aは2になるでしょうか?
0788774ワット発電中さん
垢版 |
2016/06/05(日) 18:10:25.07ID:8yyYrstt
>>787
%を使い
a=7%b
だと、余りの部分がどの様に格納されるのでしょうか?

また、上記のそのままだと答えの正数部分が格納される。で合ってるでしょうか?
0789774ワット発電中さん
垢版 |
2016/06/05(日) 18:11:59.84ID:DNFymp4f
%すると余りが帰って来るよ
実際のマイコンでやってみなよ
0790774ワット発電中さん
垢版 |
2016/06/05(日) 22:49:42.20ID:OeQ1ec9R
この辺りの話って言語の本読んだ方が早い気がするんだが
処理系特有の話でも無い限りマイコン関係ないじゃん
0791774ワット発電中さん
垢版 |
2016/06/06(月) 01:06:29.56ID:k8lb+0Y2
>>790
マイコン専用ではないけど、マイコンに無関係ではないので、
話題として、何がいけないの?

>>786
>a=7%b だと、余りの部分がどの様に格納されるのでしょうか?
a=2になるよ。
0792774ワット発電中さん
垢版 |
2016/06/12(日) 08:55:55.35ID:/Gfe4epQ
Cのdiv()やldiv()の事を知りたいだけだったりしてw
0793774ワット発電中さん
垢版 |
2016/06/22(水) 18:03:02.27ID:w5uZjbj+
小さな8ビットのPICやAVRでも並列処理(マルチタスク)は可能でしょうか?
0794774ワット発電中さん
垢版 |
2016/06/22(水) 18:37:45.59ID:J+ZkXTEP
できるよ。
PICROSとかATROSなら勉強にちょうどいいかも。
検索してみ。
0798774ワット発電中さん
垢版 |
2016/06/25(土) 11:35:19.48ID:3JdtfvMs
富士には月見草がよく似合うし、シンプルなCPUにはシンプルな並列処理がよく似合う(笑)
シンプルだからプログラマが注意すべき点が多くなるし、
プログラムの仕様によってタスク切り替え部の細部もどんどん変わってくるけど、
それはまぁ仕方がない。
でもシンプルだから、使うCPUが
 必要なスタック領域を確保出来る、タイマ割り込みが可能
ならすぐに少ない資源で適用できます。

(興味の無い人は次を読み飛ばして)
0799774ワット発電中さん
垢版 |
2016/06/25(土) 11:39:41.81ID:3JdtfvMs
以下のサンプルは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を実行開始する。

タスクの個数を増やすことも出来るし、
タイマ割り込みの中で他の仕事(ディレイカウンタの計数など)も可能。
0800799
垢版 |
2016/06/26(日) 11:38:53.36ID:cJUin2DK
読み返したら大事な説明を忘れている。
「サンプルの先頭のcli命令はソフトウェア(ユーザー)ディスパッチのため」
0803774ワット発電中さん
垢版 |
2016/06/27(月) 18:28:19.47ID:BjPf1tsq
こういうプリエンプティブマルチタスクみたいなのは組み込みで使われ
てるのかな。
タイマー割り込みで簡単なスケジューラでタスクを起動する方が現実的
だと思う。俺はそうしてる。
0804774ワット発電中さん
垢版 |
2016/06/28(火) 08:41:36.79ID:ApYdDz1l
「タイマー割り込みで簡単なスケジューラでタスクを起動する」
=プリエンプティブマルチタスク

ではないの?
0806774ワット発電中さん
垢版 |
2016/06/28(火) 10:46:39.10ID:ApYdDz1l
「終了」じゃなくてタスクの「切り替え」を強制的に行うのが
「プリエンプティブ」ってことだと理解してるんだけど
0807774ワット発電中さん
垢版 |
2016/06/28(火) 11:55:47.97ID:84pIlNq7
だから>>803が使ってる方式が強制的じゃないんでしょってことよ。
「終了」と「切替」の表現が間違ってたのはすまん。
0808774ワット発電中さん
垢版 |
2016/06/30(木) 23:56:48.23ID:N/jZxfbZ
>>803に聞くしかないんだけど、タイマー割り込み使うスケジューラで
タスクの「切替」が強制的じゃない、っていうのがどうも理解できない

「ノンプリエンプティブ」なら、走ってるタスクが自分から実行権を
放棄しないかぎり他のタスクに実行権は渡らないわけでしょ?
0809774ワット発電中さん
垢版 |
2016/07/01(金) 00:26:24.05ID:CmjeGZxr
理解してんじゃん。その通りだよ。
メリットがわからないとか?

まあでも>>803の発言はプリエンプティブなタスク切替が作れないか、
使いこなせない為じゃないのかな。
強制切替じゃないってことはレジスタを保証する必要も、
マルチバイトアクセスを気にする必要もないんだろうから。
0810774ワット発電中さん
垢版 |
2016/07/01(金) 17:39:58.94ID:KvmrBwVC
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;
}
・(ワンショット)タイマ割り込み起動
}
0812774ワット発電中さん
垢版 |
2016/07/03(日) 21:42:29.83ID:tMNAL1Xn
何素人みたいなこと言ってんだ?
0813810
垢版 |
2016/07/04(月) 02:04:02.28ID:N56qPLdp
関数を定周期で呼び出すだけなら、タイマー割り込みとか使う必要はなくて
メインのループ内でフリーランタイマーを読んで適切な時に呼び出すような
構造にすればいいだけだね

810みたいなのにアドバンテージあるとしたら、メインに対してタスクのほうが
プリエンティブってとこかな
※810の方法では「定周期」じゃないから、そこはフリーランタイマー読むとか工夫必要
0814774ワット発電中さん
垢版 |
2016/07/04(月) 07:16:34.04ID:Cg4gQLyI
普通に定周期割り込みでいいよ。
割り込みを持ってないようなマイコンならフリーランタイマーを読む方法で。
0816774ワット発電中さん
垢版 |
2016/07/04(月) 11:12:48.58ID:N56qPLdp
最初にスタートさせたらずっとカウント(アップまたはダウン)しっぱなし
のタイマー、っていうかカウンタって言ったほうが正しいかな

Windows のAPIだと、GetTickCount()
0818774ワット発電中さん
垢版 |
2016/07/05(火) 03:27:40.06ID:SdpPKanr
プリエンティティ部
0819774ワット発電中さん
垢版 |
2016/07/05(火) 03:40:32.95ID:dInaSga/
>>817
812はよくあるノイズ
「素人」だとか「全然分かってない」とか書き捨てて行くだけ
0820774ワット発電中さん
垢版 |
2016/07/05(火) 04:38:43.51ID:bCpU1BYS
【質問】arduino unoを使って([K-04912] 小型圧電振動ジャイロモジュール)の数値の変化でDCモーター(130)が作動するプログラムを書きたい&#12316;うまくいかない&#12316;
シリアルモニタにはジャイロの数字の変化が表示されるのですが、それと関係なくモーターが作動し続ける&#12316;&#12316;
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);*/

どこがいかんのじゃろ
0821774ワット発電中さん
垢版 |
2016/07/05(火) 07:14:50.66ID:vatTZYft
>>811
>なお、タスクのコードは必ずステートマシンンのお化けになる模様
シーケンサを思い出した。
1ビットCPUであるシーケンサは基本的にポーリングで立ち止まる事は無い。
プログラムの初めから終わりまでスキャンを繰り返しながら、状態を遷移させて、
リアルタイム処理を実現する。

Win9xもそうだったけど、プリエンプティブでないマルチタスクって何かいじましい。
明日は檜になりたい「あすなろの木」みたいだ。
0822774ワット発電中さん
垢版 |
2016/07/05(火) 08:06:10.66ID:5auvO6yR
アプリケーションソフトを作る立場から見れば、Windows95って十分プリエンプティブだったと思うのだけど。
違ったっけ。

3.1のときは処理を細切れにしてでも、短い時間でOSに返さないといけなかったけど。
0823774ワット発電中さん
垢版 |
2016/07/05(火) 10:02:23.45ID:Z3Y+PRgz
delay()を使わないとソフトを作れないような人はプリエンプティブじゃ
ないと無理
0824774ワット発電中さん
垢版 |
2016/07/05(火) 14:32:47.24ID:dInaSga/
普通はループによるdelay()じゃなくてシステムコールの「待ち」を呼ばせて
その中でタスクのディスパッチを行うから、大丈夫じゃない?

今のWindowsだって、sleep()使わずにループでdelay()させるとかは
決して推奨されることじゃない
0825119
垢版 |
2016/07/05(火) 17:47:39.72ID:IuWPZuMU
delay()を使わないとソフトを作れないような人はマルチタスクは無理
0826774ワット発電中さん
垢版 |
2016/07/05(火) 18:41:48.07ID:a8u76G1B
>>820
なにがしたいのか分かんない計算多過ぎだから適当にエスパーすると

if行のG1が間違い
0827774ワット発電中さん
垢版 |
2016/07/06(水) 14:29:14.27ID:gdJOAaH0
途中で変数宣言できるのか。
すごいコンパイラーだな。
0828774ワット発電中さん
垢版 |
2016/07/06(水) 14:53:44.68ID:EBnfDzrv
C99からはブロックの最初でなくてもできるようになったようだよ
ANSI-Cでも、関数ブロックの最初って誤解してた人(オレ含む)が
多いと思うけど、普通のブロックの最初でもできるらしい
0829774ワット発電中さん
垢版 |
2016/07/06(水) 16:08:20.73ID:gdJOAaH0
えっ! そうなんですか。知らなかった。
勉強になりました。

でも、あちこちで宣言するのも、見にくくなりますよね。
0830774ワット発電中さん
垢版 |
2016/07/06(水) 16:55:30.01ID:EBnfDzrv
よく使うのが、ループの制御変数のような限られた範囲で使う変数を
その近くで宣言する場合

C++だと for(int i=0; i<100; i++) とか書けるのを、似たこと
Cの文法の小変更でやりたい、ってことでC99に入ったんだと思う
0831774ワット発電中さん
垢版 |
2016/07/06(水) 18:47:54.71ID:RRahJ1X6
>>829
いや、目的はできるだけ変数のスコープ (寿命) を小さくすること。
使い終わったら消滅する方がいいから、ブロックの方がいい場合もあるかもね。
0834774ワット発電中さん
垢版 |
2016/07/06(水) 23:33:21.32ID:EBnfDzrv
C++使えばいいだけじゃない?
今はたいていの環境で使えるでしょ
0835774ワット発電中さん
垢版 |
2016/07/07(木) 17:28:58.17ID:sNGfFb9Q
結論として、ATtinyや8bitPIC用のプリエンプティブなマルチタスクはアセンブラでないと実現が難しいのでしょうか?
0836774ワット発電中さん
垢版 |
2016/07/07(木) 18:16:51.09ID:iJyVZ794
Cでプリエンプティブってことは、
タスクの数だけレジスタやスタックの退避場所が必要になるから現実的ではないでしょ。
それなりのマルチタスクやりたいならある程度RAM持ってるチップ使おうや。
0837774ワット発電中さん
垢版 |
2016/07/07(木) 21:41:58.42ID:sNGfFb9Q
そうですね、AVRは32個もレジスタがあるし、tiny2313はSRAMが128バイトしかないし
確かに現実的では無いですよね
0838774ワット発電中さん
垢版 |
2016/07/07(木) 23:21:29.34ID:SglIvlp8
mega328あたりなら2KBあるから数タスク程度は何とかなる。
汎用レジスタとステータスレジスタをタスク自身のスタックに積んで
スタックポインタだけ管理すればいい。
スタック使用量を気にしながらだからノウハウは要るけど。

実際、他の処理気にせずに何かに専念したいってのはそんなに多くない。(俺の場合)
3〜4タスクに分散させれば、かなりややこしい事してもソースはすっきりする。
0839774ワット発電中さん
垢版 |
2016/07/09(土) 04:25:46.41ID:Wf/7YtEz
教えてください。

PCのC言語なら、書けるし読める人がいたとして、
その知識でマイコンのCはできるものでしょうか?
新卒を採用する能力評価に、何かプログラムを書いてもらおうと思うのですが、
どのようなテーマが良いでしょうか。
・Lチカ(タイマー割込、GPIO)
・アナログ電圧をLCDに表示(A/D)
・その値を、ターミナルに表示(UART)
・スイッチ取り込み、ノイズ除去(チャタリング除去、移動平均)
くらいを、テストしたいですのが。
0840774ワット発電中さん
垢版 |
2016/07/09(土) 10:04:35.60ID:WkjuWQ8b
自分の採用時は、
24bitADで取り込んでフーリエ変換してカラー液晶にグラフ表示してSDにデータ保存とかだったかな
0841774ワット発電中さん
垢版 |
2016/07/09(土) 10:26:13.09ID:2wfOUhf1
>>839
テストしたい項目が、PCではやらないことばっかりだから、微妙な感じ

学習期間が必要じゃね?
0842774ワット発電中さん
垢版 |
2016/07/09(土) 12:20:56.39ID:Wf/7YtEz
>>840
そんなに難しい試験だったの? すごいな。
0843774ワット発電中さん
垢版 |
2016/07/09(土) 13:37:51.71ID:lowXwMm3
>>839
ご自分でマイコンソフトの開発経験があるのなら、初めて使うCPUと
開発環境で、ライブラリとかサンプルソースなしでやるとしたら
仮にLチカ(割り込みなし)でも、どれだけ時間食うかご存じのはず

だから、その能力評価というものにどれだけの時間かけられるかって
ことしだいだから、インターンシップの中とかでやるのなら別にして
試験というような形では無理だと思う

もしやるとしたら、「エンベデッドシステムスペシャリスト試験」
みたいな内容になるだろうけど、これだって事前に告知しとかないと
いきなりは無理
0844774ワット発電中さん
垢版 |
2016/07/09(土) 16:03:09.35ID:lowXwMm3
上のでは、人事部長に「できる方法を考えろっ!」って怒鳴られそうなんで
実践(戦?)的な方法を考えてみた

1.サンプルプログラムの豊富なマイコン評価ボードを事前に支給する
2.いくつかのサンプルプログラムを指定してコンパイル・リンクして
  実行できるように準備しておくことを要求
3.指定したサンプルプログラムをいくつか組み合わせる、あるいは
  改変することで実現できるテーマを与えておき、そのプログラムを
  作成しておくことを要求
4.試験時には、3で作成したプログラムを改変し、新たな機能を追加することを要求

※追加機能は、2で指定したサンプルプログラムからコピペで持ってきたり
 自前の(ハードウェア独立な)コーディングを付け加えたらできる範囲内で
0845774ワット発電中さん
垢版 |
2016/07/09(土) 16:27:08.69ID:lowXwMm3
なお、試験時は当然ネット接続可、かつ試験担当者に色々質問することも可とする
技術面接試験として位置づけてもいいかも
0847774ワット発電中さん
垢版 |
2016/07/09(土) 21:47:33.23ID:Nkd6baFF
>>839
スタートアップや必要なハードウェアの設定まで用意してあげるなら、なんとかなりそうかな。
マイコン (組み込み) のソフトは、アセンブラ、レジスタ操作やスタック関連は避けて通れないからねえ。
リソースの少なさに発狂するかも。
0848774ワット発電中さん
垢版 |
2016/07/09(土) 21:53:10.16ID:i2Lv8/Pz
>アセンブラ、レジスタ操作やスタック関連は避けて通れない
つ、また出たよw
0849774ワット発電中さん
垢版 |
2016/07/09(土) 23:16:02.06ID:tWBG3hy4
>アセンブラ、レジスタ操作やスタック関連は避けて通れない
どこまで必要かはマイコンによりけりですかね。OSとかは抜きで。
0850774ワット発電中さん
垢版 |
2016/07/09(土) 23:19:15.88ID:R82JTFHM
OS抜きならより裸のマイコンいじくるんだから
より一層 >アセンブラ、レジスタ操作やスタック関連は避けて通れない だな
0851774ワット発電中さん
垢版 |
2016/07/09(土) 23:42:15.87ID:/UkYCLSH
>>839
>マイコンのCは
とたずねて例まで挙げてるのに
>アセンブラ、レジスタ操作やスタック関連は避けて通れない
とか、いつものごり押し開始

かすりもせずに通れるのになw
0852774ワット発電中さん
垢版 |
2016/07/10(日) 01:26:29.53ID:36oUlRyh
OS無しでもデフォルトのスタートアップ(など)で充分な案件だしな
0853774ワット発電中さん
垢版 |
2016/07/10(日) 03:39:15.75ID:hcVGJQyA
MPLAB IDE使ってるけど、スタートアップルーチンなんて、
見たことも聞いたこともないよ。

プロジェクト
0854名無しさん@そうだ選挙に行こう! Go to vote!
垢版 |
2016/07/10(日) 08:06:24.22ID:IN1Mbxgs
>>850
リアルタイムOSを作るような人ならともかく、OSを使ったプログラミングをする人やベアメタルなら
>>852>>853でいけちゃうケースが多いのでは?

というか、いまどきのある程度のリソースを持つマイコンと開発環境なら、通常のプログラミングに
アセンブリ言語は必須ではないようにしてあると思うよ。どこのメーカーもそういう志向で開発してるだろうし。
0856名無しさん@そうだ選挙に行こう! Go to vote!
垢版 |
2016/07/10(日) 17:01:43.30ID:TE0CCanI
私はMCUで並列処理をやる時は全てフルアセンブラで書いている。
今までに一番大きい並列処理のプログラムはZ80コアのMCUの65K。
(つまりメモリを使い切った)
ポーリングや状態遷移が多いプログラムだと、並列処理は驚くほどすっきりすることがあるけど、
I/O処理の時間が厳密に規定される仕様だったりすると、並列処理は少し不向きで、
過去にはマルチタスクで書いた後、シングルタスクに戻したこともある。

もしも、温度・湿度・気圧データを収集する装置があって、
・各センサーから定期的にADCで読み取って、パネルのLCDに表示し、
 PCから要求されれば読み取り値を送信し、RAMのリングバッファに蓄積する
・測定条件はPCからの通信、およびパネルのSWやロータリエンコーダなどで
 いつでも自由に変更できる
・蓄積したバッファ内容をPCから要求があればプロトコル付で送信する。
 送信中も測定は続ける。
なんて仕様だともう検討無しで並列処理にする。

プログラマの技量によって完成したプログラムの質は変わるでしょうね。
たとえば上のデータ収集装置でいえば、バッファ内容をPC送信中にLCD表示が
 松:送信していないときと変わらない
 竹:カクカクと更新される
 梅:表示が停止する
だったりするかもw
0858名無しさん@そうだ選挙に行こう! Go to vote!
垢版 |
2016/07/10(日) 19:30:23.16ID:Lx7c1PVi
ペーパーテストと面接で工夫すればいいだろ。
どんだけ暇な会社なんだ。

知識経験豊富だけじゃなく学習速度が早いのを採れ。
勤務態度とコミュニケーションが良好は当たり前だからここでは論じない。
0859774ワット発電中さん
垢版 |
2016/07/10(日) 21:48:14.59ID:g1aSPAH3
>>856
UARTやSPIの割り込みハンドラもできない奴が
並列処理とかやっちゃいけないと思うんだけど。
0860774ワット発電中さん
垢版 |
2016/07/10(日) 21:59:03.34ID:1ZY6c7Gr
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
//**********************************************************************
0861774ワット発電中さん
垢版 |
2016/07/10(日) 21:59:30.22ID:1ZY6c7Gr
//**********************************************************************
//■■■メイン関数■■■
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)
0862774ワット発電中さん
垢版 |
2016/07/10(日) 21:59:48.79ID:1ZY6c7Gr
//**********************************************************************
//■■■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)
0863774ワット発電中さん
垢版 |
2016/07/11(月) 02:37:11.02ID:4TNFoBS6
>>860
おやおや、今度はここで聞いてますか?
このソースって、どこのCコンパイラですか?
0864774ワット発電中さん
垢版 |
2016/07/11(月) 07:10:42.01ID:slXr/GmM
>>859
並列処理ではプログラマの意思に関係無く割り込みがかかるので、
むしろ各種割り込み処理は必須ですよ。
並列処理やった事無いでしょ? フルアセンブラ出来ないでしょ?
スキルアップのために是非勉強して下さい。
0865774ワット発電中さん
垢版 |
2016/07/11(月) 10:40:10.04ID:rRlwYeEL
いや、アセンブラもマルチタスクも苦じゃないけどさ、
フルアセンブラを自慢して、なおかつそれを実行してるってところがすごく痛いなと思った。
お前が死んだら誰もコードメンテナンス出来ないんだぜ。

>バッファ内容をPC送信中にLCD表示が
> 松:送信していないときと変わらない
> 竹:カクカクと更新される
> 梅:表示が停止する
>だったりするかもw

こんな発言自体おまえ自身がやらかした過去だってことだろ。
何でたかがデータ送信一つで表示がカクつくんだよ。
まともな割り込み処理書けてないってことじゃん。
0866774ワット発電中さん
垢版 |
2016/07/11(月) 12:03:32.53ID:SlvYTNqa
>>863
MikroCです。
16F88では問題なく動いたのが16F1827で動かないのが原因が解らないのですがCCPモジュールを動かすための設定ってF1シリーズから増えたりしてるのでしょうか?
0867774ワット発電中さん
垢版 |
2016/07/11(月) 13:26:58.71ID:slXr/GmM
>フルアセンブラを自慢して、なおかつそれを実行してるってところがすごく痛いなと思った。
自慢なんかしていませんよ。どこの文章、語句が自慢しているようにみえた?
フルアセンブラのマルチタスクには制約もある、みたいに書いているし。

>お前が死んだら誰もコードメンテナンス出来ないんだぜ。
私が死んだ後のメンテナンスは一切不要です。
喜ぶべきか?悲しむべきか?w
あっ、思い出した、E社で一人だけ機能追加している人がいます。
私に断りも無いし、何も質問してこないけど、苦労しているのかな?

>こんな発言自体おまえ自身がやらかした過去だってことだろ。
「もしも〜だったりするかも」と仮定形で書いてあります。
私自信が過去にやらかしたことではありませんよ。
そんなドジはしません。

>何でたかがデータ送信一つで表示がカクつくんだよ。
>まともな割り込み処理書けてないってことじゃん。
仮定の仕様なので実際にカクカクとなるかどうかは分かりません。
仮定の仕様を長々と書くわけにもいかないし、複雑な仕様ならそういう可能性があるなと思っただけです。
なお、まとまな割り込み処理が書けている、という自信はありません。

最後に
どんなプログラムもシングルタスクで実現出来ます。
あなたがCのシングルタスクで、どんな仕様でも実用的な納期で実現出来るなら、それは素晴らしい。
自慢して良いと思う。
そんなあなたにはフルアセンブラもマルチタスクも無用の長物でしょう。

さぁて遅くなった、昼飯喰いに行くか。
0868774ワット発電中さん
垢版 |
2016/07/11(月) 14:01:14.50ID:4C+GSoqN
>>866
そもそも、16F88と16F1827が互換だとは、どこの情報?

普通は、PICの型番が変わったら、
メモリー容量違いの品種でなければ、コンパチなんてあり得ないから、
全く別物だと考えて、configとかの値を全部確認するんだよ。

大した数じゃないし、1つ1つ比較していけば、すむ事だと思うよ。
みんなそうしてる。
0870774ワット発電中さん
垢版 |
2016/07/11(月) 15:59:41.29ID:slXr/GmM
>>869
チッ、まともに反論する能力も無ぇのか、ったくしょうがねぇ軟弱野郎だな。
ま、いいや、今回は特に許す(笑)
悔い改めて生きるんだぞ(大笑)
0875774ワット発電中さん
垢版 |
2016/07/12(火) 16:38:27.86ID:tNuT3SJN
sokutei()関数で測った測定値の最高値を記録する場合に
while(1){
cnt=sokutei();
if(max<<cnt){max=cnt;}
}
と書いたのですがmaxの中に最高値が記録されません。
どの様に修正すれば良いでしょうか?
0876774ワット発電中さん
垢版 |
2016/07/12(火) 16:51:16.79ID:cjPTnOXM
if(max<cnt){max=cnt;}

でいけるのではないでしょうか。
「<」でなく「<<」になっているので、シフト演算になってしまっています。
タイプミスでなければ。
0877774ワット発電中さん
垢版 |
2016/07/12(火) 16:53:33.43ID:JUMynCPo
cntと略されると cunt の略かと思ってしまう。はい、変態です。
0878774ワット発電中さん
垢版 |
2016/07/12(火) 16:59:07.81ID:tNuT3SJN
>>876
すみません、タイプミスじゃな<<と二つ打っていました。==と同じ感覚で間違えました。
ありがとうございました。
0879774ワット発電中さん
垢版 |
2016/07/12(火) 18:57:08.63ID:tNuT3SJN
>>876
少し気になったので合わせてお聞きしたいのですがこの場合
if(max<cnt){max=cnt;}と
if(cnt>max){max=cnt;}の
どちらでも同じ結果が得られるでしょうか?
よろしくお願いいたします。
0880774ワット発電中さん
垢版 |
2016/07/12(火) 21:27:19.74ID:cjPTnOXM
>>879
同じです。
「大きい方を右」または「基準値を右」など、自分なりのルールを決めておくとよいでしょう。
0883774ワット発電中さん
垢版 |
2016/07/15(金) 18:15:08.02ID:Zfn9BMUb
つい先日pic16f84aでプログラムを始めたのですが、(picプログラマv4 v6.76.1)でライターを検出できず困っています。ライターはAE-PICPGM Uです。
原因と解決法についてご教授願いますm(_ _)m
0884774ワット発電中さん
垢版 |
2016/07/15(金) 19:34:42.30ID:K77BkkOv
>>881
数学の問題でそれらが違う意味ってなかったかな?
そんなの思い出した。
0885774ワット発電中さん
垢版 |
2016/07/15(金) 22:37:29.19ID:YZGas9nA
>>883
>解決法についてご教授願いますm(_ _)m

つ PICKIT3
0887774ワット発電中さん
垢版 |
2016/07/16(土) 01:59:04.94ID:aUFafu6t
USB?232C絡みでハマる事はあるだろうけど、
つうか本当に何で今からやる人がソレなんだよって思うわw
昔から使っててUSBしかない新しいPCでもなんとか使い倒したみたいな人ならまだしも。
0888774ワット発電中さん
垢版 |
2016/07/16(土) 09:26:25.77ID:U5AUqY3i
>先日始めた人が、何でAE-PICPGM Uとかに行き着いちゃったのかなあ。
俺はそれもさることながら、pic16f84a に引っかかりを感じました。

先輩エンジニアが残したもののメンテならともかく、まさか入門でこれなのだとしたら
未だに書籍が豊富とはいえ、やりきれないなあと感じます。
0889774ワット発電中さん
垢版 |
2016/07/16(土) 09:58:17.88ID:Cd783o2k
初心者入門にはかなり適さないと思われるデバイスだもんね。
0890774ワット発電中さん
垢版 |
2016/07/16(土) 14:14:08.30ID:We4iseoj
最近は秋月のPICkit3も高くなったから
AE-PICPGM Uの方が後々つぶしがきくかもと思う可能性もあるけどね
自分が入門した時には1mmもかすらなかったライターなので
購入に至った経緯には興味がある
どこか有名どころで推奨してるとか?
0891774ワット発電中さん
垢版 |
2016/07/17(日) 00:02:52.97ID:cPekas5W
>>883
中華pickit3で十分 海外通販で2000くらい
入門書やネットでは、xcコンパイラに対応してるのは
少ないので、コピペで、、、は期待しない
オススメは
pic16の新シリーズ
pic18
2553 Yahooマイクロファン モジュール
4553 秋月モジュール
pic24fj64ga002
mccが使えると楽かも
オシレータ内臓型だとコンデンサ2、3個で遊べる
0892774ワット発電中さん
垢版 |
2016/07/17(日) 01:26:46.02ID:rhlnrdLZ
質問者は付いたレスを見てガックリ来ちゃったんだろうか。
でもこれからPICをやるならAE-PICPGM Uはオクにでも出してPICkit3を
買うことを薦めるな。
0893774ワット発電中さん
垢版 |
2016/07/17(日) 10:25:20.62ID:xYYOQrsh
USB-シリアルケーブルを使っているとしたら、ケーブルに使われている
USB-シリアル変換ICにもよるのだけど、それがFTDIなら

デバイスマネージャで当該シリアルポートのポートの設定→詳細設定で
転送サイズやバッファサイズを小さくして、
レスポンス時間を短くする
…と状況が変わるかも。


>>891
>入門書やネットでは、xcコンパイラに対応してるのは
>少ないので、コピペで、、、は期待しない
えー。そうなん?
それが本当なら、PICに新規参入する人が減っているってことかもなあ。
0894774ワット発電中さん
垢版 |
2016/07/17(日) 14:12:51.10ID:bdR99SVQ
こんにちは

USBのホストをマイコンでやりたいのですけど、
どのマイコン、というか どこの開発環境だと楽に出来そうでしょうか?
フルスクラッチは とてもできないので、
まずはサンプルソースが欲しいのですが。

USBにもプロファイルみたいなものがあるなら、
COMポート扱いのみで良くて、相手機器はUSBメモリだけです。
0895774ワット発電中さん
垢版 |
2016/07/17(日) 14:28:39.91ID:frXA2SnX
>入門書やネットでは、xcコンパイラに対応してるのは少ないので、
少ないってのはウソ。
XC以外のソースにもお目にかかるけど古いものばかり、
最初のうちは選り分けてても十分用が足りるだけのものは出回っている。
最終的な問題は、ソースの量でなく、英語力の不足だと思う。
0896774ワット発電中さん
垢版 |
2016/07/17(日) 16:00:32.80ID:BPab8PGL
>>885>>886>>891>>892
返信ありがとうございます
ぜひ参考にさせて頂きますm(_ _)m
>>887>>890
ライタは譲り受けた物でして。困っちゃいますね
0899774ワット発電中さん
垢版 |
2016/07/23(土) 01:23:02.22ID:7u5Dlcqf
>>894
Full Speed でよければ、STM32F4あたり
High Speed なら、STM32F7かな

STMは、評価ボードも安いしサンプルプログラムも豊富
以前は、自社製のフリー統合開発環境がないのがネックだったけど
0900774ワット発電中さん
垢版 |
2016/07/25(月) 23:13:19.36ID:5to+kLI0
High Speed ホストになれるのでは、AtmelのSAM3Xが早くから出てたね
評価ボードとしてはArduino Dueの中華互換機が使えて安いけど
JTAGデバッガを別に用意しないといけないのが弱点
まあ、今だとLPC-Link2とか使えるかな
0901774ワット発電中さん
垢版 |
2016/07/27(水) 16:54:04.42ID:CLp0puQ+
STMの評価ボードの値段は、もう自分で基板作ってIC載せるとか
趣味の基板製作以外では引き合わないって思わせるな

TIなんかのは、キャンペーンで一時的に安く供給してても
いつのまにか供給自体なくなっちゃたりするけど、STMのは
結構長く供給してるし
0902774ワット発電中さん
垢版 |
2016/07/28(木) 16:21:13.47ID:YtGngK8k
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で定義しても変わらずでした。

この場合どうすれば計算結果を得れるでしょうか?
よろしくお願いします。
0903774ワット発電中さん
垢版 |
2016/07/28(木) 16:38:23.50ID:d/1lsZY1
keisankekka も double にしないと切り捨てられますよ。
sokutei はキャストすればいいと思います。

int sokutei;
double keisankekka;
keisankekka = (double)sokutei/10000*(300-2000)+2000;
0906774ワット発電中さん
垢版 |
2016/07/28(木) 17:07:28.18ID:YtGngK8k
>>904
ありがとうございます。
式を変形させて計算する方法ですか。
思い付きませんでした。
0907774ワット発電中さん
垢版 |
2016/07/29(金) 16:38:07.56ID:ZWL2ul2O
ラジコン用のサーボを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()関数での測定により若干周期がずれますがサーボはパルス幅が重要で周期は若干ずれても影響ないので無視しています。

パルス幅を可変するにあたって何か致命的なミスをしているでしょうか?
よろしくお願いします。
0908774ワット発電中さん
垢版 |
2016/07/29(金) 17:28:59.81ID:WdQn9+0N
教えても理解できると思えない。
マジでLチカからタイマーの勉強しなおせ。
0910774ワット発電中さん
垢版 |
2016/07/29(金) 18:30:04.58ID:ZWL2ul2O
>>908
>>909

すみません、稚拙なプログラムはなのは自分でも解っているのですが、タイマーを使わず作りたいと思いました。

何がいけないのが教えて頂けないでしょうか?
0911774ワット発電中さん
垢版 |
2016/07/29(金) 18:46:11.16ID:mEeWJbB4
>>907
PIC PWM サーボ ソースでくぐれ
取りあえず動いたら、タイマー割り込みに挑戦してほしい
動かなかったらクラウドワークスあたりに発注したらいいよね
0912774ワット発電中さん
垢版 |
2016/07/29(金) 19:28:32.99ID:VPb5km2l
>>907
SOKUTEI()関数が何をやっている関数なのか分からんので、答えようがない。
0913774ワット発電中さん
垢版 |
2016/07/29(金) 19:34:38.21ID:qoiKvRLa
>>912
ADCで読んだ値を元に変換しているだけです。
LCD繋いだプログラムではキッチリ700から2600に変換されていました。
0915774ワット発電中さん
垢版 |
2016/07/29(金) 20:17:16.69ID:iOD8TWoq
>>907
>パルス幅の可変が出来ませんでした。
可変は出来てるでしょ
幅が狙い通りじゃないだけで
実際にパルスを測定してみた?
0916774ワット発電中さん
垢版 |
2016/07/29(金) 20:20:16.58ID:PA/8oaMa
@タイマーを使いたくない
Aタイマーを使うスキルがない

どっちよ?
0919916
垢版 |
2016/07/29(金) 21:51:50.78ID:PA/8oaMa
>>908に同意するわ
0921774ワット発電中さん
垢版 |
2016/07/29(金) 21:58:00.97ID:mEeWJbB4
>>920
見落としてた。気づかなかった。真面目に読んでなかった。てか、そこでタイプミスするのか。取りあえず、本当にすまない。
0923774ワット発電中さん
垢版 |
2016/07/29(金) 23:33:44.20ID:iOD8TWoq
>>920
関心する
コンパイラがエラー吐いてくれるような内容は
気にも留めないし目に入らないから
0929774ワット発電中さん
垢版 |
2016/07/30(土) 11:28:37.83ID:XM5obyLc
時折見せる2ch民の異常なまでの同調性ってキモいよなって思う
0932774ワット発電中さん
垢版 |
2016/07/30(土) 17:32:00.55ID:/Y/FVZl9
本来コンパイルエラーになるべき構文だから動作を考えるだけムダ
鼻から悪魔が出なかった幸運に感謝するしかない
0934774ワット発電中さん
垢版 |
2016/07/30(土) 18:36:41.29ID:ANDIAJ9S
>>908
コードを見る限り、考え方は間違ってないと思うが、
どこを見てそう思ったのか。
0935774ワット発電中さん
垢版 |
2016/07/30(土) 19:18:12.99ID:o6TFLO47
>>934
今回Delay_us走らせることで、この手の関数だかマクロの精度や制限を知ることも大事なのではないか。
現実は2ちゃんねるより厳しいから、元スレの人にはがんばってほしい。
0936774ワット発電中さん
垢版 |
2016/07/30(土) 19:57:24.08ID:NQd7GYMd
だから「Lチカからタイマーの勉強しなおせ」なんじゃないの?
>>935が言うような超基本的なことなんにも経験してなさそう
0938774ワット発電中さん
垢版 |
2016/07/30(土) 22:00:01.14ID:gmeDaPUP
何でビルドできる前提?
ま、どんなコンパイラか知らんけどさ。
0943774ワット発電中さん
垢版 |
2016/07/31(日) 11:23:25.37ID:jM6KjGnG
「急いては事を仕損じる」とか「急がば回れ」とか「慌てる乞食は貰いが少ない」とか?
0944774ワット発電中さん
垢版 |
2016/07/31(日) 12:09:22.07ID:AaA5fHZ0
早起きは三文の得

…違うか。

でも、おつ。本当に必要になったときに、忘れてて再スレ建てをしないかどうかだけが気がかり。
0946774ワット発電中さん
垢版 |
2016/08/01(月) 09:10:10.51ID:gdta0Gtz
>>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; // 小数点以下四捨五入
0947946
垢版 |
2016/08/01(月) 09:41:43.19ID:gdta0Gtz
速度上の理由とかで、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; // 四捨五入
0948946
垢版 |
2016/08/01(月) 10:20:09.01ID:gdta0Gtz
ちょっと修正

>>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; // 四捨五入
0949774ワット発電中さん
垢版 |
2016/08/01(月) 14:03:28.36ID:HFR5pq/+
PICだとか、ARMだとか、AVRだとか、マイコンの種類に関係なく、
いろいろなソフトウェアの話がでるといいと思う。
>>946のような話は、とても参考になります
0950774ワット発電中さん
垢版 |
2016/08/01(月) 14:17:45.78ID:ow8L1XA+
理解を助けるために、あえてまとめない場合も多いけどね。
最適化はコンパイラにまかせておく方が主流な気もする。
0951946
垢版 |
2016/08/01(月) 16:24:01.88ID:1KTUrdUd
>>949
この方向を極めるにはこれがおすすめ
ttps://www.amazon.co.jp/dp/443420159X

>>850
うん。
CPU速度やメモリとかがリッチなターゲットなら、
keisankekka = 2000 - sokutei * 0.17;
って書くのが理解し易いですし、変換式が変更になる場合等の保守性も
良好でしょうね。
0952946
垢版 |
2016/08/01(月) 18:34:43.55ID:9OnHLFU2
今気が付いたけど、
keisankekka = 2000 - sokutei * 0.17;
を四捨五入して整数化したものと、
keisankekka = (200050L-sokutei*17L)/100;
とでは結果が異なる場合があるのは内緒なw

sokuteiが5750の場合とかね。
0.17が二進の浮動小数で正確に表現出来ない事に起因するので諦めるしか!
0953946
垢版 |
2016/08/01(月) 19:05:45.88ID:9OnHLFU2
一方で、sokutei∈[0, 10000](整数)の範囲で、
keisankekka = (200050L-sokutei*17L)/100;
に、
keisankekka = (1048838144L - sokutei * 89129L)>>19;
を一致させようとすると、1048838144Lに398足して、
keisankekka = (1048838542L - sokutei * 89129L)>>19;
って微調整すればいいのだけど、こんな事やってられないよなぁw
0957946
垢版 |
2016/08/02(火) 07:44:33.70ID:qAhqgg7j
>>955-956
ターゲットに依るんでしょうね。
実行速度が問題になる場合は、実機でベンチマーク取って
どの方法にするかを決めるしか!
0958774ワット発電中さん
垢版 |
2016/08/02(火) 12:55:45.51ID:SGjLoi+o
プログラムROMってね何%まで使えますか?
気持ち悪いので、いつも50%くらいで使っているんですが。
70%を超えると、ドキドキしてしまいます。
0959774ワット発電中さん
垢版 |
2016/08/02(火) 13:30:25.81ID:5tz7cI5t
なににドキドキするのかわかりませんが、基本 100% 使えるでしょう。
それよりあなたの書き込みの方がキモいです。
0960774ワット発電中さん
垢版 |
2016/08/02(火) 18:41:17.44ID:6TG4VSSB
>>957
やっぱ実機で検証して満足行くかですね。
しかし、普段Cでしか書かないので同じ計算量でもintだと出来たHEXの容量が少ないlongやdoubleだと容量が大きい、程度の認識しか無いのですが命令数も多い少ない有るのでしょうか?
自分もMikroCのフリーなので2kワードの制限で使ってるので興味深いです。
0961774ワット発電中さん
垢版 |
2016/08/02(火) 21:31:39.45ID:5tz7cI5t
コンパイラにアセンブラコード吐かせてどんな処理になってるかみたりしますね。
まあ普通に思いつくコード書いてれば、たいていそれがほぼ最適なコードになるんですがね。
無理してポインタとか駆使しても、見にくいだけで大して効果はないという。
0962946
垢版 |
2016/08/03(水) 02:19:23.15ID:eKxjBQ58
さて、
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ビット値に収まる様になった。
除算は乗算よりも演算速度が不利な場合があるけど、それよりも、
メモリを削るのを優先させたい場合もあると思う。
0963774ワット発電中さん
垢版 |
2016/08/03(水) 02:31:40.51ID:3GJWCb0I
メモリーが足りないときは、何でもやりますよね。
未使用の周辺機能の設定レジスタをRAM代わりにするとか。
0964946
垢版 |
2016/08/03(水) 02:44:18.95ID:etjzpf9Y
>>962について、>>953みたいな事を試みると、
24100024Lに99足してやると良くて、

keisankekka = (24100123L + (long)sokutei<<11)/12047; // 四捨五入
これも手作業ではやってらんないw
0965774ワット発電中さん
垢版 |
2016/08/03(水) 02:50:42.49ID:a6FUjuf/
ん〜〜、自分で決められる立場にない人ばっかりなんだろうとは思うけど
今は最低でも Cortex-M0 使うことに何の障害もないはず

発注元がバカだったとしても、「今はこういうマイコンが出てます」って
提案して「それはダメだ」とか拒絶されることって、少なくとも自分の
経験ではないんだけどな
0966946
垢版 |
2016/08/03(水) 03:22:22.00ID:etjzpf9Y
>>965
8051は永遠に不滅でぇーす!w

…触った事ないけどww
USBつきとか頭おかしい←絶賛
ttp://www.atmel.com/ja/jp/products/microcontrollers/8051architecture/usb_mcus.aspx
0967946
垢版 |
2016/08/03(水) 03:47:33.08ID:etjzpf9Y
>>952みたいな事態に何でなるのかと云うと、計算過程で、
0.17 * sokutei ≡ 0.5(mod 1)
になる様なsokuteiが存在して(50, 150, 250, ...)、かつ
0.17 * sokuteiを含む式の値を正確に計算出来ないからなので、
0.17ではない他の値の場合には当て嵌まらないのに注意してね。

つか偶数丸めなんか知らんぞw
みんな真面目に偶数丸めになる様に組んでる?
0968774ワット発電中さん
垢版 |
2016/08/03(水) 03:51:40.57ID:R/8mJAlX
まだやってたのか・・
コンパイラは最適化最強にするとこんな感じのコード吐くんだよ↓

int sokutei;
int keisankekka;
keisankekka = 2000 - (int)((11142L * sokutei) >> 16);

この程度に四捨五入なんていらんだろ。
どうしても四捨五入したいならこうだが時間とメモリの無駄。
keisankekka = 2000 - ((int)((22284L * sokutei) >> 16 + 1) >> 1);
0969946
垢版 |
2016/08/03(水) 23:33:54.18ID:8j5SlpDn
>>968
をー
0971774ワット発電中さん
垢版 |
2016/08/05(金) 03:35:47.45ID:4eGtmERS
みなさんに質問です。

世の中に、バグのないソフトウェアって、あると思いますか?
JRの切符と改札のソフトは、バグを潰しに潰したのか、異常は出ないですよね。
銀行もスゴイ。自動車は・・・
0973774ワット発電中さん
垢版 |
2016/08/05(金) 07:23:10.88ID:+YI0VmUa
ソフトウェアにバグが存在しないことは証明できない、と誰かが証明していた。
0975774ワット発電中さん
垢版 |
2016/08/05(金) 10:07:31.16ID:h0pmrqNf
確かに、巷では、バグの80パーセントは10年たっても
発見されていない場合が多いともいわれるし
20年後にバグが発見されることもある・・・・
0976774ワット発電中さん
垢版 |
2016/08/05(金) 14:03:37.40ID:EkITNEpO
>LEDチカチカくらいならバグなしに出来そうだけど。
でも、電源on時に起動しないとか・・・ これはハードウェアのバグか。
ちなみに、プログラム動作用にLED1個を贅沢に付けているのは、この私です。
0977774ワット発電中さん
垢版 |
2016/08/05(金) 14:20:51.57ID:3nZbY4fd
>プログラム動作用にLED1個を
動作確認用に、なら俺も付けてる。
LEDと抵抗、合わせてたった2円だしな。
0978774ワット発電中さん
垢版 |
2016/08/05(金) 14:55:51.91ID:XVaO62hW
え!
0980774ワット発電中さん
垢版 |
2016/08/05(金) 18:32:38.94ID:AfWXBVQB
四捨五入ですらバグが入り込む事があるんだぜw
ttp://d.hatena.ne.jp/hnw/20160702
0981774ワット発電中さん
垢版 |
2016/08/05(金) 20:35:56.44ID:EkITNEpO
LED 1つでも、点滅してくれていると「おっ、タイマ割り込み、ちゃんと動いてるね」と
わかって、いい。
タイマー割り込みじゃなくて、メインループでon/offするのが筋だろうけどね。
0982774ワット発電中さん
垢版 |
2016/08/05(金) 23:07:16.22ID:krW4Xwpu
10年くらい前になるけど、ボードにJTAGデバッグ用のコネクタ付けようとしたら
派遣先の責任者に、「実運用時には、シリアルポートからプログラム及び
FPGAのコンフィグデータをダウンロードしてフラッシュメモリに書き込むから
(コストダウンのために)必要ない」って言われた。

自分は、ハードだけの担当で、派遣期間も終わりに近かったから
言われた通りに(回路図だけ書いて)おさらばしたら、半年後に
他の仕事してるときに、「頼むから週2日とかでいいから来てくれ」って
言われて、1か月ほど週2日で行った。

すでに修羅場は過ぎてたみたいだけど、聞いたところによると、その前の
2か月ほどは(派遣先の正社員が毎日午前3時に退社とか)地獄だったらしい。

フラッシュメモリへの書き込みプログラムが出来損ないで、30分とか
掛かってたこともあるんだけど、ホント、自分で開発やったことない連中は
デバッグ(官僚用語では「評価」とか言うらしいけどw)環境軽視してるんだなって
痛感した、今ではいい思い出
0983774ワット発電中さん
垢版 |
2016/08/05(金) 23:48:16.08ID:EkITNEpO
へー、スゴイね。
連日午前3時までやって、翌日はちゃんし8時半とか9時に来るの?

デバッグと同じくらい、チェック(検査)も舐めちゃ行けない。
「あの電圧を測定するくらいなら、1分もかからずにできるな」と思ったら
測定のための線だしの段取りだけで1時間とかザラ。測定は5秒ね。

アートワークの時に出してもらっとけじ良かったな、と後悔しても遅いね。
とにかく端子やチェックランドは付けて置いて損は無いよね。

実務で徹夜を何度もやったことのある人なら、わかってくれる
0985774ワット発電中さん
垢版 |
2016/08/06(土) 00:15:04.86ID:gxSFR8c7
例外処理にバグがあったとして、
その例外処理が発生する確率が極めて少ない確率だった場合、
バグは発生しないように見える状態が継続します。
そんなもん。
0989774ワット発電中さん
垢版 |
2016/08/06(土) 03:37:56.22ID:6xfp2KvI
1カ所変更したら、全機能をチェックし直す。これが基本ですよね。
やってられません。
0991774ワット発電中さん
垢版 |
2016/08/06(土) 06:52:00.27ID:VxIu7htE
>>989
自動化出来るとこは自動化しておくとかって思ったけど、
このスレが対象にしてるやつって、PC内だけでチェックが完結する訳では
ないんでしょうねぇ…。
0992774ワット発電中さん
垢版 |
2016/08/06(土) 09:02:04.38ID:UUWNijER
pc内では完結しなくても、pc繋いだら完結するのが出来たら良いかな。
0993774ワット発電中さん
垢版 |
2016/08/06(土) 09:46:40.91ID:uYYuioVm
一箇所変更したら全機能チェックしないと逆にバグで
やられてしまいます。
俗に言うパッチあててそのまま納入したらバグの嵐になったことがある。
0994774ワット発電中さん
垢版 |
2016/08/06(土) 14:27:35.39ID:oKfHeE5K
// コメント1行だけの追加でも、やっぱり全チェックでしょうか?
0995774ワット発電中さん
垢版 |
2016/08/06(土) 19:11:53.91ID:/lw0n104
>>994
行番号とかのデバッグ用の情報無しでコンパイルしたバイナリが、
コメント追加の有無で(バイナリに埋め込まれたタイムスタンプを除いて)
変化しないのなら、気にしないのも手ではないかと。

一致しないのならコンパイラが腐ってるので捨て!
…る訳にはいかないのだろうな。メーカー純正ツールの場合は。
0996774ワット発電中さん
垢版 |
2016/08/08(月) 01:09:01.86ID:nxeZ/gD7
コメント行追加とかデバッグON-OFFでオブジェクトが違うとか
今時ないと思うんだけど、甘いかな?
0997774ワット発電中さん
垢版 |
2016/08/08(月) 14:55:28.31ID:PfS2CIS7
そうだと思う。
けど、もしかしたら・・・と思うと。

チェックに使ったデバッグルーチンも「込み」で完成品にすることがほとんど。
0999774ワット発電中さん
垢版 |
2016/08/12(金) 19:02:35.30ID:du2V288Y
123
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 701日 4時間 52分 41秒
10021002
垢版 |
Over 1000Thread
2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/
http://pink-chan-store.myshopify.com/
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況