初めてのPIC 0x09 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
.
_ _ PICをさわるのは今日が初めて、という超初心者のためのスレです。
(O>――<O) PIC選び、PICを使った回路は、誰でも最初は不安なものです。
/ (・) (・) ヽ 恥ずかしがらずに何でも聞いてください。速攻で教えてくれますよ。
○ /▼\ ○ 質問のしかたは、初心者質問スレの発言1を見てくださいね。
|(ヽ二フ ) |
/  ̄ ̄ ̄ ヽ
f ヽ / | PIC関係のスレは、レベルに合わせて以下のスレもありますので、活用しましょう。
ヽ \ / ノ ・PIC専用のスレ
| \_ )(_/ ! 本家本元のPICスレです。口の悪い人もいますが、楽しくやってるみたい。
| | ここの話がわかるようになれば、あなたはもう一人前のPICerです。
| | ・マイコンソフト 悩み事相談室
| | ̄ ̄| | マイコンソフトやツールの質問は、こちらでどうぞ。的確な回答があります。
(_ノ ヽ_)
質問する時のコツ
・性格の悪い回答者はスルーしよう(相手すると逆効果)
・素人玄人などと 上から目線の回答者は、無視してください。相手してはいけません。
・そこそこ良い回答が出るまでしばらく再発言しないのもあり(良回答は後に出やすい)
・回答者のアドバイスで後日解決したら、結果報告しよう(とても喜ばれる)
・回答者は、僕たち初心者に優しくしてください。あなたも通ってきた道のはずです。
さ、質問どうぞ〜っ
0x08 2016/04/30〜 ttp://rio2016.2ch.net/test/read.cgi/denki/1461994030/
0x07 2016/02/05〜 ttp://wc2014.2ch.net/test/read.cgi/denki/1454648249/
0x06 2015/07/18〜 ttp://wc2014.2ch.net/test/read.cgi/denki/1437151298/
0x05 2015/04/07〜 ttp://wc2014.2ch.net/test/read.cgi/denki/1428391368
0x04 2015/01/02〜 ttp://wc2014.2ch.net/test/read.cgi/denki/1420205108
0x03 2014/09/22〜 ttp://wc2014.2ch.net/test/read.cgi/denki/1411314715
0x02 2014/05/20〜 ttp://wc2014.2ch.net/test/read.cgi/denki/1400522979
0x01 2013/11/17〜 ttp://ai.2ch.net/test/read.cgi/denki/1384626558 使うチップがコロコロ変わる人たちは難儀な仕様かもな。
俺関係ないけど。 ごく稀に動作しなくなる非常に厄介なバグ
こういうコードは書いちゃダメ >>739
自分は今でも定義ファイルエディターを使って新しいPICの
パラメータを作って使用しています。
デバッグなしのWriterとして使うためのパラメータなら
誰でもコピペで作ることができるのでNetで検索してみてください。
ちなみに、PICKIT2は自作のものを使用しています
部品代として1500円はかからないと思いますよ
(PIC18F2550に書き込める環境があるならですが) PIC18F14K50のUSBで独自の機能を持ったデバイスを作成するときって、ドライバも書かなきゃいけないですよね? >>744
n==4の成立判定後の瞬間に割り込みが掛かったら終わりということだな
通常はnの操作は割り込みルーチン内に置き、多重割り込みは禁止した状態で行う、が正解か? >>748
自己レス。見当外れなこと書いてしまった
でもnの操作が割り込みルーチン内と、ルーチン外に散らばっているのは気持ち悪い unsigned short int n;
↓
volatile unsigned short int n; 問題の本質は、ifかswitchかという瑣末な問題じゃない
割り込み内外で同じ変数を変更するというのは危険な状況(バグを内在する状況)が発生し得るから
基本的には割込み内で変更して外では参照するだけ(or外で変更して割込み内では参照するだけ)
という書き方をする癖を付けた方が良い
どうしても両方で変更する場合は絶対に衝突が発生しない事を確認するか、どんな状況で衝突が発生しても
問題ないようにプログラムする必要がある
あと、if(n==0){}else if(n==1){} ... else if(n==4){n=0;} という書き方だと、万が一nが5とか6になってしまうと
割込みかかりまくってnが一周して0に戻るまで正常な状態に戻らない
ここは最後を else if(n==4) ではなく、単に else としておけば異常な状態が早期に終息する。
状態遷移(有限オートマトン)で設計する場合には、状態を表す変数の型で表し得る全ての値に対して
適切な状態を定義するようにするべき(0から4までしか使わない「はず」だからという設計は良くない)
まあ、バグが露見しにくくなっていつまでもバグが残る可能性があるというデメリットもあるけど、
一般的には「想定外」の事態を早期に終息させる方がより優先される場合が多い
どうしてもバグが残るのがイヤなら、 else if(n==4) {} else {異常時の処理} という形で、「想定外」の
nが5とか6になったら到達する状態を作るのも一つの方法。
ついでにifかswitchかという話をしとくと、アホなコンパイラだと状態数がわずかでもswitch文は絶対
テーブルジャンプにしてしまう場合がある。
ま、あんまり気にするような事じゃないけど、予想外にコードがデカくなったり遅くなったりする場合がある
(そんな場合があるからビックリすんなよって言ってるだけでswitch使うなという話じゃない) 割り込み内で別の変数にフラグ立てて、main内でフラグが立った時だけn++してnの比較処理をすればいい >>746
すばらすい!
devicefileediterとかでやってるのかなw
ぜひ、DeviceFile.dat公開して、ダウンロードできるようにしてくれ。
ネットがつながってないと書き込みできないPICKIT3はうんこだw
PICKIT2、最強だよねww >>729
// 改造案です
unsigned char int_flag; // 割込来たぞフラグ
void interrupt(){
if (INTCON.INTF == 1) { // 外部割り込みなら
int_flag = 1; // 割込来たぞフラグ
INTCON.INTF = 0; // 割込発生を忘れる
// DELAY_MS(100); // 割込の中でdelay()は、いけません。
}
}
void main() {
unsigned short int n;
「各種設定(現在のまま? 知らん)」
int_flag = 0; // 割込来たぞフラグ
INTCON = 0b10010000; // 全体割込許可
while(1){ // ずーっとやり続ける
if( int_flag == 1 ){ // 割込が来たらしい
int_flag = 0; // 了解
++n; // n加算して
if ( n == 0 ){ 処理0 } // nが0なら、処理0を行う
else if( n == 1 ){ 処理1 } // nが1なら、処理1を行う
else if( n == 2 ){ 処理2 } // nが2なら、処理2を行う
else if( n == 3 ){ 処理3 } // nが3なら、処理3を行う
else if( n == 4 ){ 処理4 } // nが4なら、処理4を行う
else { n = 0; } // 規定外のnの場合の行き先を決める
}
}
} タイマを1msくらいで追加して、int_flagが来たらタイマをカウントして100以上になったらif処理で… 12F1822だったらUSARTを追加するのだがなぁ >>755
unsigned char int_flag; // 割込来たぞフラグ
↓
volatile unsigned char int_flag; // 割込来たぞフラグ
「各種設定(現在のまま? 知らん)」
に含まれてんだろうけど、
n=0;
は残しとかないと一見おかしく見える
if( int_flag == 1 ){ // 割込が来たらしい
DELAY_MS(100); // 割込み内のを無くしたなら代わりにこっちに入れなきゃ
int_flag = 0; // 了解
(このディレイとフラグのクリアはelse {n=0;}の後に持ってきた方が多分望ましい) >>756
↑の最後にも書いたけど、これおそらくはボタンとか押したのを外部割込みで取り込んで何か処理しようと
してるんだと思うけど、割込み後に100ms待ってから処理するとボタンの反応が悪いような感じになる。
ディレイがチャタリングを読み飛ばすのを目的としてるだけなら、一発目が来た所で処理して、後100ms間の
割込みは無視する、という方が感覚的にしっくりくると思う。 >>759
100msもディレイさせるのが気に入らないだけ
キー入力ならタイマ割り込みでポート監視して3回連続ONで確認した方が良いだろう あと、>>755のコードと元の>>705では処理が全く違う
>>705は割込みが無い間もif(n==0)〜の処理を繰り返し実行している
>>755だと割込みがあったときに一回だけ実行される
どっちが望んだ動作なのかは>>705しか知らない事なので、とりあえず違うよってことだけは言っとく 割り込み処理でDELAY_MS(100);やってたくらいだから入力は充分遅いんだろ。
それならINT割り込みを止めて10ms程度のタイマー割り込みで処理したほうが
いいな。
そうすれば複数のポートを同時に処理できるし、ダブルクリックでも長押し
でも応用がきくぞ。 みなさん、いろいろありがとう。
とにかく、delay_ms()は無くしましょう。
良いことは1つも無いですよね。
(とりあえずというときだけ使うけどね)
今回の100msが何のために必要なのかわかんなかったので、
取ったまま、付け忘れました。すみません。
私の、基本的なプログラムのスタイルは、こんな感じ
void timer割込{
if( count++ > 設定値 ){ timer = up; } ← elseしないのがミソ
}
void timer_control( unsigned char K, unsigned time ){
if( K == start ){
設定値 = time;
count = 0;
それなりの処理
} else if( K == stop ){
それなりの処理
}
}
void main(){
unsigned char st = 10; // 状態遷移の初期番号
if( st = 10 ){ // 最初の周回
初期化(); // 初期化して
timer_control( start, 100 ); // 100msのtimer start
st = 20; // 次の周回
} else if( st = 20 ){ // LED off期間
if( timer == up ){ // timer upしたら
LED1 = 1; // LED on
timer_control( start, 200 ); // 200ms timer start
st = 30; // 次の周回
}
} else if( st = 30 ){ // LED on期間
if( timer == up ){ // timer upしたら
LED1 = 0; // LED off
st = 20; // 次の周回
}
}
} if( st = 10 )
って、
if(1)
じゃねーかw いつになくためになる真っ当な流れだと思っていたのに、全くもう あっ、ごめん、ごめん。
if( st == 10 ){ だったね。失礼しました。 >>758
なんか質問者さんから無視されてる℃素人716だけどw
やっぱりvolatile宣言しないとダメだよね? 割り込みからアクセスされるのはvolatileが当たり前。
コンパイラの最適化で変数をレジスタ化されたら割り込みで書き換えても反映されんだろ。 レジスタ化じゃなくて、
n=0;
while(n==0){//nが割り込みで変更されるのを待つ
//ここではnを変更しない
}
みたいなのを、コンパイラが「ナーンダ。nはずっと0ジャン」って勘違いして、
結果として最適化されて
n=0;
while(1){//無限ループ
//ここではnを変更しない
}
になるのを防ぐのではなかったっけ。
例は良くないかもしれないけれど、最適化に絡む問題だったはず。 すみません。>>773を訂正。
×例は良くないかもしれないけれど、最適化に絡む問題だったはず。
〇例は良くないかもしれないけれど、この種の最適化に絡む問題だったはず。 初めてのPICっていうより、初めてのC言語ってレベルwww
まあ実際そういう人が多いんだろうけど >>754
PICKIT2しかないけど、PICKIT3ってネット繋がってないとダメなのかぁ
古いデバイスしか使ってないから、しばらくこのままでいいか >>776
今ってcって組み込みしか使わないんじゃね? >>779
C言語は低水準言語なんです。
高級言語じゃないけど、移植性は良い。だから組み込みに合っている。 PICkit3のクローンが千円台で買えるのになw
どこで苦労したいか、人それぞれだね。 >>781
組み込みはライブラリなんて使わないよ。
デバッグ時は互換の関数名はある程度用意するが、自分(グループ)のコード以外は保証できないしょ? >>784
使うのはstdioとstdlibくらいだな >>785
mathもstringもctypeも使うぞw 通信ライブラリ使わないと面倒クセー
イーサネットとかUSBとかもオレオレニヤニヤコードなのか? >組み込みはライブラリなんて使わないよ。
そういうポリシーの人や会社があるのは理解しているけれど、
組み込みにだってLinux、Windowsを使う時代だし、そうじゃないポリシーの人もたくさんいる。
選ぶのは客で良い。俺は自分で組むときは後者だし、他の人、会社に依頼するときも後者を選ぶかな。 加減のみで乗算は無い、ビットシフトはあるけどね。
ちなみにPICってビットシフトはバレルシフト(ファンネル)ですか? >>791
それに発生するエントリを自分で作ってリンクすれば良い。
じゃないと余分なコードまでリンクされる。
×÷もシフトで組めるけどな。 Z80とか乗除算がないプロセッサから入ったおっさんには無問題 Machikania動きませんでした orz
俺の買った秋月32MXのオーバークロック耐性が虚弱だったのか。
小学生の子供に半田付けをさせたのが悪いのかもしれないけどね。 まあ、後閑の本も間違いだらけ、ネットで間違い探し募集して
るくらいだかなw 普段は低速クロックで動かして、負荷がかかったら、自動的にパソコンみたいに
クロック周波数が上がるようにできないんでしょうか C使ってるけどバラタイルが必要なのってどんなとき? >>802
普通はボラだね。
バラタイルって言われてわかったやつ偉い。 誤解ないように。ボラタイルだからね。
ちなみに金融だとボラティリティをボラと略すけど、
Cのを略したのは聞かない。 ヴォラタイルなんだろうな。
俺は昔Turbo C++2.0でvolatile修飾子を知ったな。 他のスレでも外来語のカナ表記で叩き合いになることがあるけれど、
素で間違っていたりローカル表現を一般表現だと思っているような例だけでなくて、
叩き合いの焚き付けのためにヘンな表現をする人だっている。
あまり焚き付けに乗らない方が良くない?
逆に質問する場合、焚き付けのつもりもなくて、真面目に質問するなら volatile とそのまま書く方が良いと思います。
volatile は 揮発性 という意味なんだけど、おそらく「書いたり読んだりした内容がいつの間にか変わっているかもしれない」という感じだと思う。
割込みで変更される変数や、ポート変数は、プログラムの流れ以外で変更される場合がありますね。 non volatile memoryの場合は揮発性でいいけど
cのvolatileは、変わりやすいとか気まぐれなとかの
訳語の方がしっくりくる。
そういう意味で金融のボラと同じ意味合い。
Cに即して言えば、今見ている文面からは想像できない
方法で値が変えられてしまう可能性がありますよ。
とコンパイラに伝えること。
例えば、
a=x;
b=x;
と書いてあってxがvolatile宣言されてる場合は、
コンパイラはa==bということを推定してはいけない >>808
最適化無かった時代なら、volatile なんて、要らないからな。 >>811
いや、interrupt修飾子が登場したからでは? >>812
interrupt修飾子がない時代の
8086用Hi-Tech C (1986年頃)に
volatileは導入されたよ >>813
なるほど割り込み関係は .asm もあるからなぁ。 >>813
Hi-TechCはAm29000関係で使っていたけど当時優れたコンパイラーということで導入したな。
Sun3版とPC-DOS版だったな。
PLABのC8もHi-TechCの産物なのですか? 廃盤にはしないだろうけど新商品開発もしないやろね>AVR >>817
PIC18系をAVR に置き換える感じだろ。
PIC16F1 出来てからは、メリット殆ど無くなってたし。 >>812
全く最適化しない場合にvolatileありなしで動作が変わるコードって例えばどんなの? >>820
>>812が言ってるのは
------------------------------------------------------
>最適化無かった時代なら、volatile なんて、要らない。
↑
いや、最適化があってもそれだけなら volatile なんて要らない。
割込みをコンパイラが意識するようになったから、最適化に関係して volatile も必要になった。
------------------------------------------------------
こういうことだと思う。
でも、割込みがなくても、volatile は要るよね。 >>821
SFRとかに最適化効くと困るからな。
割り込み使わなくても、volatile 必要。 秋月、先日から16F1825品切れだけど、再入荷するのかいな。
しかし、なんでこのチップだけ売り切れなんだろう。
俺的には、18325なんかもっと高機能で、40円も安いのに、
そっち使えばいいと思うけどな。
もしかして、PICKIT2で書き込みできるから人気あんのか?ww PicKit2の専用ソフトの使い勝手がいいから、pickit3,icd2持ってるけど、pickit2を
使ってる。
pickit2の専用ソフトは、tools/check communication で、
picの型番が検出されるところ。pickit3用の専用ソフトもあるけど、この機能は当時無かった。
Mplab-xは、立ち上げるのに時間がかかるので嫌いです。 >>820
同じ変数に値を2回書くとか (最後だけ有効 >>824
MPLAB XはIDEだから、比較するのはおかしい。
MPLAB IPEと比べろ。 >>826
MPLAB IPEは、今初めて知りました。 >>825
最適化が無ければvolatileがなくても2回普通に書くんじゃ? >>ID:kG2xjFOi
何も知らないが、とりあえず騒ぐ。 MPLAB IPE は気が付かなかったけど、
確かめてみたらうちの Win7 64bit の構成では、
mplab v8.92 では、Failed to properly connect to PICkit 3
というエラーが出て使えないですね。
ちなみに、xpでは、使えます。
MPLAB IPE 3.5でも、Connection Failedで使えません。
pickit3のシリアルナンバーまでは検出しています。
初期型のハードなので、問題があるのかもしれません。
ただ、別途 Pickit3 Programmer v3.01をダウンロードしてみると、
昔のベータ版と違って、PICの型番が検出できることがわかったので、
自分の用途では、PICKIT2と同じような使い方が出来そうなのでしばらく試してみようと思います。
純正のpickit2が市場から消えて困っていたので、助かりました。 >>830
ドライバ切り替えしてないだけじゃないの?
おっちょこちょい臭がプンプン >>830
>ただ、別途 Pickit3 Programmer v3.01をダウンロードしてみると、
>自分の用途では、PICKIT2と同じような使い方が出来そうなので
それ、2010年だか2011年だかにアップデート終了してて
最新デバイスはサポート外だから。それが使えたからって、なんの
意味もないと思うが。
とにかくいえるのは、PicKit3はゴミだってこと。 >とにかくいえるのは、PicKit3はゴミだってこと。
では、このスレの初心者は、他に何を使ったらよろしいでしょうか? >>823
おいらも16F1825再入荷待機組
16F18325はconfigワード設定とEEPROM書込みが大きく変更されててなかなか慣れない…
やっぱり程よくシンプルで必要機能の揃ってる1823/1825/1827/1829シリーズが大好きだー! >>836
その話題は10年前に終わっているぞ
浦島太郎か????????? >>836
お前の16F84、そろそろ書き換え回数が限界じゃないか? ■ このスレッドは過去ログ倉庫に格納されています