初めてのPIC 0x12
■ このスレッドは過去ログ倉庫に格納されています
PICを触り始めて比較的日が浅いという初心者のためのスレです。
もちろん、日は経っているが自分はまだ初心者という方も大歓迎です。
PIC選びやPICを使った回路設計は誰でも最初は不安なものです。
恥ずかしがらずに何でも尋ねてみましょう。
なお、PIC関係のスレにはもう1つ「PIC専用のスレ」があります。
質問・回答する際は…
必ずPICの型番と開発環境を明記しましょう。
プログラムはレス内に直接書き込まず以下を利用しましょう。
http://codepad.org/
その際心がけることは…
品格に劣る回答者はスルー(相手すると逆効果)
素人玄人などと上から目線の回答者は無視
良い回答が出るまでしばらく再発言しないのもあり(良回答は後に出やすい)
回答者のアドバイスで後日解決したら結果報告
回答者は初心者に優しく
Atmel買収以降アンチによる荒らしも横行してるので見かけても無視
(特にスレ立て当初はこぞって荒らしに来るのでスルー)
必要なソフトなど(基本無料)
統合開発環境 MPLAB X ttp://www.microchip.com/mplab/mplab-x-ide
コンパイラ(XC8 XC16 XC32) ttp://www.microchip.com/mplab/compilers(高機能版のみ有料)
コード生成プラグイン(MCC) ttp://www.microchip.com/mplab/mplab-code-configurator
マイクロチップ・ライブラリ(MLA) ttp://www.microchip.com/mplab/microchip-libraries-for-applications
必要なハードなど
初心者はPIC16F1以降の型番で始めると無理なく始められます。
最初からPIC32で始めるのもあり。
MCCの利用でハードルはむしろ低いです。
http://akizukidenshi.com/catalog/g/gI-11902/
プログラムの書き込みには書き込み器が必要です。
持っていない場合はPICkit4などを購入しましょう。
なお、eBayやAliExpressで買えるPICkit3の中華クローンも十分な性能が報告されています。
PIC一覧、スペック検索
ttp://www.microchip.com/ParamChartSearch/chart.aspx?branchID=1005
ttp://www.microchip.com/maps/microcontroller.aspx
過去スレ
0x11 2018/08/05〜 ttps://rio2016.5ch.net/test/read.cgi/denki/1533446166/
0x10 2018/06/29〜 ttps://rio2016.5ch.net/test/read.cgi/denki/1530265723/
0x0F 2018/05/01〜 ttps://rio2016.5ch.net/test/read.cgi/denki/1525183933/
0x0E 2018/02/13〜 ttps://rio2016.5ch.net/test/read.cgi/denki/1518524799/
0x0D 2017/10/25〜 ttp://rio2016.5ch.net/test/read.cgi/denki/1508935254/
0x0C 2017/07/27〜 ttp://rio2016.2ch.net/test/read.cgi/denki/1501157324/
0x0B 2017/05/08〜 ttp://rio2016.2ch.net/test/read.cgi/denki/1494235320/
0x0A 2017/01/04〜 ttp://rio2016.2ch.net/test/read.cgi/denki/1483498857/
0x09 2016/09/07〜 ttp://rio2016.2ch.net/test/read.cgi/denki/1473238791/
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
では、質問どうぞ〜っ これすごくね?
youtube)Simple DIY PCB with a 3D Printer
3DプリンターでPCBができるんだな。
ガチで普通に短時間でゼロから完成品をつくる方法と
全部で3Dプリンタ3万 ドリル2000円 ドリルシャフト1000円 くらい?
基盤発注やらエッチングよりいいのでは?
回路幅は1.5mmくらいなので(エンドミル変えても精度きついか)
Fusionとか1基盤が1週間やら2週間で2500円でしょ?
3万で揃うのでこれいいかもしれない。 で、それガーバーデータ喰わせればプリントしてくれるの? 年がら年中基板作ってる訳ではないので発注でいいや。機材置いとく場所もないし。 >>669
動画見たけど、3Dプリンタじゃないだろ。 >>669
急いでいるときには、便利だけど、レジストのかかっていない、基板は使いづらい。
片面だし、エンドミル、高くて長持ちしないし、うるさいしね。
1週間待てるなら、発注が全然安いよ。 週末なんでプログラミング挑戦中
単に点灯なら本通り打ち込めばいいけどスイッチによる2色切り替えに難儀してる…
https://i.imgur.com/Wv0u4JL.gif スイッチうまくいかないですですね
このRB5ハザードスイッチを押す度にON−OFFを繰り返すようにしたいのですがこのスレで直接プラグラミングについての質問はNGですかね?
https://i.imgur.com/PT3muPDh.png やっぱりチャタリングだったか…
数十msec間を開けて3回連続オンだったらオンにするとかプログラム上の対策が必要 これだとスイッチを押してる間はハザードが点くけど押すごとにON-OFF切り替えにはならない…
void main(void) {
OSCCON = 0b01110010;
OPTION_REG = 0b00000010;
WPUB = 0b00111111;
ANSELA = 0b00000000;
ANSELB = 0b00000000;
TRISA = 0b00100000;
TRISB = 0b11111111;
PORTA=0;
PORTB=0;
while(1){
if(RB5==0){
PORTA=0b11000011;
__delay_ms(500);
PORTA=0b00000000;
__delay_ms(500);
}else{
PORTA=0b00000000;
}
}
return;
} >>684
とりあえずトグルで点灯か消灯かは
LATBbits.LATB0 ^= 1;
を使えば1なら0に0なら1になります。
あと、私なら、
while(RB5==0);
も入れるかな。
ただ、ハザードは点滅を続けるか止めるかだし、
ハザードを点滅させながらヘッドライトのオンオフとかもしたいわけでしょ?
やっぱりタイマー割り込みを勉強してもらった方がいいかもです。
__delay_ms();使わずに点滅させる方が後々楽だと思います。
さらに言えばMCC使った方が手っ取り早いんだけど、話が複雑すぎてここじゃ説明できない。
「XC8 MCC Lチカ」とかで検索してみてください。 >>685
アドバイスありがとう
話の半分も理解出来ないのでぼちぼち検索しながらやってみます
トグルは模型のスケール的にも使いたくないのでプッシュモーメンタリーで考えてます
回路図が全部トグルになってましたね… >>686
トグルって言葉があいまいでした。
モメンタリのスイッチを使い、押す度に点灯・消灯をトグルで繰り返すという意味で使ってます。
A ^= 1;
は、実行するたびにAの値が0/1を繰り返します。
チャタリング対策は別として、基本は
if(B==0){
A ^= 1;
}
とやるだけです。
while(B==0);
は押したスイッチを放したかどうかを判定します。 >>687
情報ありがとう
>>688
あ、ではやりたい事であってますね
わざわざありがとうございます >>688
うまくいかないです…
void main(void) {
OSCCON = 0b01110010;
OPTION_REG = 0b00000010;
WPUB = 0b00111111;
ANSELA = 0b00000000;
ANSELB = 0b00000000;
TRISA = 0b00100000;
TRISB = 0b11111111;
PORTA=0;
PORTB=0;
while(1){
while(RB5==0){
PORTA^=0b11000011;
__delay_ms(500);
}
}
return;
} プログラムが上手く出来ないならCRフィルタの方が早くね? PWMが出来る端子が違ってましたね
あとスイッチ類はうまくいかないのでシンプルにON-OFFで挑戦してみます
https://i.imgur.com/Tf1c1ZTh.png >>690
>うまくいかないです…
では何もわからないないので、具体的にどうなって、何がうまくないのか書いて。 >>693
プッシュスイッチでON-OFFを切り替える操作がしたかったけど上手くいかないです >>693
>何がうまくないのか書いて。
>>694
>上手くいかないです
こいつ、馬鹿なのか? >>695
日本語不自由?
やりたい事があったが達成出来なかった
初心者なので原因は分からない
って事じゃん >>696
日本語読む気すらない?
誰も原因なんか聞いてない。
どう上手くいかなかったのか具体的に書けって言ってる。 ま、エスパーさんを待ち続けたらいいよ、きっとそのうち登場するでしょw ちょい前のレスも読まない?
モメンタリで点灯消灯を切り替えたいってやり取りしてんじゃん >>699
>モメンタリで点灯消灯を切り替えたい
は目的、到達点な。
現在の状況を書け言うとんの。
東京駅まで行きたいんですが、迷いました。
っていうから、今どこにいるのかってきいとんじゃ。
近くにどんな建物があるか説明せえ言うとんじゃ。
意味わからんか?
お前、真正のアホウか? >>701
>>690←の状況でって事じゃん
あんた迷子の人にお前何処にいるんだ?って聞くの?
分かんないから迷ってんでしょ
落とし物した人にどこで落としたか教えろって聞くの? つーかレス読んでると本当の初心者に詳細説明しろって無理でしょ は?
まわり見渡せばどんな建物があるかくらい説明できるだろ、馬鹿か?
どこ通ってどこへ立ち寄ったかで、どこで落とした可能性があるか考えるやろ、馬鹿か?
何もしないで突っ立ってるだけか?
ま、いいや。
そうやって、ずっとエスパーを待ってなよ。 ID:ojpyTgNB
ID:5XQhuC6m
ID:FfO2a1Z+
なら、お前が教えてみせろ。 短気だなw
教えてあげる気があるんならケンカ腰で言わなくてもいいのに
後輩とか他人に感謝された事無いんじゃね? 日本には良い言葉がある。
他人を説得したり納得させたい時に思い出せ。
「 物 は 言 い よ う 」 少しエスパーしてみる
ハザード、つまり点滅をソフトウェア処理で実現したいが、690だとスイッチを押している間しか点滅しないのが問題って事なのかな?
スイッチはハザードONOFFの切り替えだけが役目。ONの間はスイッチを押していなくても点滅を繰り返す必要があるのに、690のコードはRB5が0の間しか点滅処理出来ないのが問題。
つまり点滅処理は、スイッチ押下判定であるwhile(rb5==0)の外に出す必要がある >>702
今、コンビニの前です。
角に交番があります。 みなさんアドバイスありがとです
点滅プログラムは自分にはハードル高そうで諦めモードです…
>>691
物理的回路でチャタリングを防ぐって事ですかね
色々検索してみましたがまだ自分の理解の外で何が必要かすら分からないです
とりあえず点滅回路のRA3,RA4以外を単純にモーメンタリースイッチでON-OFFが当面の目標かな
https://i.imgur.com/Tf1c1ZTh.png >>690
少し慣れてきたらスイッチやLEDに全部名前を付けておいた方がいい
#define Light_ON 1
#define Light_OFF 0
#define Switch_ON 0
#define Switch_OFF 1
#define High_beam_LED RA1
#define High_beam_SW RB0
if(RB0==0)RA1=1; より
if(High_beam_Switch==Switch_ON)High_beam_LED=Light_ON; 途中で送信してしまった…
まあ、あまり名前に凝り過ぎても却ってわかりづらくなるからほどほどにしないといけないけど
適度に使えばあっちを見たりこっちを見たりしなくていいようになる >>711
点滅も外付け回路でやる手もある
簡単なのは外付けで点滅専用PICを用意するとか >>712
プログラムの中に名前を入れたほうが役目が分かりやすいって事?
やり方が分からないので調べてみます
>>714
単価の安いPICなら可能ですね >>690
何回かサンプリングして、フィルターをかける >>715
1.希望としてスイッチ押したらどうなって欲しいのか
2.現実としてスイッチ押したらどうなってしまってるのか
この2つを明確にしないと進まないよ
たかが模型の電飾程度のことでもう2週間以上何の進展もないのはそのせい
言われたことを何もやらないし>>708のような有益な回答には全く返答せず
逆にゴミのようなレスにばかり反応してる
とりあえず、プログラムを部分的にでなく全部書くことから >>719
希望としてはこの図の通りでプッシュモーメンタリースイッチでのLEDのON-OFF
現状は押した時だけ点灯でON-OFF切り替えになってない
https://i.imgur.com/Tf1c1ZTh.png
プログラムは>>690が全てでそれ以上は進んでない
進みが遅いのは間違いないけどゼロから初めてるんでアドバイスが理解出来なくて申し訳ない…
>>708さんのアドバイスも具体的にどうしたら解決するのか理解できない >>714
>>716
PIC12F1822があるのでそれをウインカーリレーとして使おうかな…
まあいずれにしてもチャタリングが解消しないとダメだけど >>720
押している間だけ0.5秒間隔で4つのLEDが点滅
ボタンを放すと点灯したままか、消えたままのどちらか
どっちになるかはその都度違う
こういう動作をしているかをまず確認してレスしてください。 プッシュイスイッチのトグル動作は、スイッチの状態と、現在の点灯状態を把握しておかないと実現できないですよ。
1.sw=off led=off 初期状態 点灯待ち
2. sw=on になったら 3.へ
3.wait 10msec(例えば)
4.sw=off だったらチャッタなので 2.
そうでなければ 5.へ
5.sw=on led=on 点灯
6.sw=off になったら 7.へ
7.wait
8.sw=on だったらチャッタなので 6.へ
そうでなければ 9.へ
9. sw=off led=on 消灯待ち
10.sw=on になったら 11.へ
11.wait
12.sw=off だったらチャッタなので 10.
そうでなければ 13.へ
13.sw=on led=off 消灯
14.sw=off になったら 15.へ
15.wait
16.sw=on だったらチャッタなので 14.へ
そうでなければ 1.へ LEDの点灯状態に関わらずスイッチの判定は必要だから場合わけいらんよ >>720
while(RB5==0);
はそこじゃないな、こんな感じでどう?
http://codepad.org/nl6k9HaL
ちなみに、これで、ボタン押す度に4つのLEDがトグルで点灯か消灯かになる。
点滅はしない。
>>685にすでに書いたけど、点滅はタイマー割り込みとかで別に用意する。
まずこの状態を理解しないと次に進んでもダメ。 >>720
使ってるスイッチは、そもそもモメンタリじゃないだろ。
動作からしてただのプッシュスイッチだ。
スイッチにテスタ当てて、ちゃんと「モメンタリ動」するか確認したの?
してみて。 >>728
>使ってるスイッチは、そもそもモメンタリじゃないだろ。
>動作からしてただのプッシュスイッチだ。
そうなの?
そう判断する根拠を教えて。 みなさん色々ありがとう
ひとつずつ検証してみます
>>727
具体的にありがとう助かります
>>728
ただのプッシュスイッチの定義が分からない
使っているのは押している間だけ通電してるタイプのスイッチ こんな感じ?意図が違ったらごめん。
unsigned char psw = 0xFF;
unsigned char mode = 0;
void main(void)
{
init();
while (1) {
delay_ms(10);
psw = psw << 1;
if ( IO_RB4_PORT ) {
psw = ( psw | 0x01 ) & 0x0F;
}else{
psw = ( psw & 0xFE ) & 0x0F;
}
if ( psw == 0x0C ) {
mode++;
if ( mode >= 4 ) {
mode = 0;
}
}
switch ( mode ) {
case 0:
IO_RA3_LAT = 1;
IO_RA4_LAT = 1;
break;
case 1:
IO_RA3_LAT = 1;
IO_RA4_LAT = 0;
break;
case 2:
IO_RA3_LAT = 0;
IO_RA4_LAT = 0;
break;
case 3:
IO_RA3_LAT = 1;
IO_RA4_LAT = 0;
break;
}
}
} >>729
>そう判断する根拠を教えて。
モメンタリスイッチは "押してる間だけ" っていう動作はしない。
"押してる間だけ"っていう動作は「プッシュスイッチ」。
そんなことより、本当にモメンタリ動作するのか確かめたの? >>718
タッチセンサーの機能をどうやって実現しているかによる。 プッシュスイッチもモメンタリスイッチも違う概念を説明する用語なんだけどな…
プッシュのロッカースイッチも
トグルのモメンタリスイッチも存在する。 >>727
RA3とRA4に指定して書き込んでみたけどスイッチワンプッシュで押した間とか、0.5秒くらい点灯でその後消える
安定点灯しないし、点灯維持しないで最終的には消えた状態になる
チャタリングが起きてる? DIPタイプのICをソケットから抜くとき斜めに抜いてしまって、足が曲がり、
それを2、3回繰り返すと金属疲労で足が折れてしまうことがあります。
そのICをつかうためにはどうすればいいんでしょうか。 >>737
ちょっと、説明がわからないです。
忙しくポチポチしない限りチャタリングってそれほど悪さしないもんですけどね。
では、スイッチは無視して、単純なプログラムだけのLチカはどうですか?
http://codepad.org/A8TiWfwO
何も押さなくても0.5秒間隔で点滅し続ける、いわゆる単純なただのLチカです。
どうなります? >>741
点滅OKです
これは前に作った
RA3=1;
__delay_ms(500);
RA3=0;
__delay_ms(500);
と同じ感じですね >>740
どこから折れたかによるし、何に使うかにもよるけど、
基本リード線の切れ端でどうにかする、でしょ。
ちなみに、しょっちゅう曲がるけど、折れちゃったことはないなあ。
曲げちゃったのは最優先で使っちゃうから。 >>743
ほう、ではいよいよスイッチですかね。
その前に、スイッチの代わりに何か線の切れ端を手で挿し込むかPICの足に触れさせたらどう?
ジャンパー線の片方をGNDに挿しておき、もう一方でPICのピンをつんつんするの。
プログラムは1つ前のこれで。
http://codepad.org/nl6k9HaL
うちでは全く問題なく、つんで点灯、つんで消灯、つんで点灯…、ってなります。 >>744
PICは勉強中でして、抜き差しが多いものですから。
今は書き込みにはゼロプレッシャーソケットをつかうし、
引き抜き器も買いまして、もうそういうことはないとは思います。
足の折れたPICは何か固定用途を見つけて、外側からリードをはんだ付けします。
コメントありがとうございました。 >>745
短いサイクルでつんつんすると、つんで点灯、つんで消灯、つんで点灯となりますが
つんで点灯後に何もしないと自動消灯となり点灯維持しないですね >>747
スイッチはプルアップするか内蔵プルアップ指定してる? >>746
へ〜〜〜
足って折れるものなのか〜〜〜〜〜
この20年間一度も折れたことないけど
しかも、ピン数少ないならピンセットで簡単に取れるし
28or40ピンならマイナスドライバーで均等にすきま作って奥まで差し込めば
簡単に抜けると思うが????? >>747
とりあえず、チャタリングとは別に何か問題がありそうですね。
点灯させておいて放置すると勝手に消えるんですね?
1.そのあとまたつんつんするとどうなります?
もう2度と点灯しませんか?
2.つんで消灯させてからしばらく放置したあとでつんしたら点灯しますか?
あと、環境を教えてください。
ブレッドボードとか、電源はどうしてるかとか。
それと、Cionfiguration Wordも見せてください。 >>739
わかったよ。
普通のプッシュスイッチな。
だったら、プログラムに書いた通りの動作であってる。
別にチャタリングとか関係ない。
押してる間だけ点滅するソフトになってる。
だから、今のソフトを改造して
トグル動作をするソフトを書く必要がある。
その時はチャタリング考慮しないと多分誤動作する。 ID:GOrDpMNa
まだいたのか。
相変わらず偉そうにレスしてるが、
>モメンタリスイッチは "押してる間だけ" っていう動作はしない。
>"押してる間だけ"っていう動作は「プッシュスイッチ」。
に関して何か言うことはないのか? ID:GOrDpMNa
良くしゃあしゃあと出てくるよな。
しかも、相変わらずの上から。
厚顔無恥。 >>751
またつんつんで同じ動作ですね
電源はPICkit3から供給する設定です
ブレッドボードに16F1827と部品を挿したまま、RA5、RB7、RB6、VDD、VSSにPICkit3も挿した状態です
現在はRA3、RA4だけ挿してテストしてます
https://i.imgur.com/jKrXD1oh.jpg
http://codepad.org/hTTMTB5Y >>755
Watchdog timer 有効にしてるのだったら、ちゃんと、ループ内でクリアしないとリセットかかるよ。 >>752
モーメンタリやオルタネートがスイッチの動作
プッシュやトグル、ロッカーなんかはスイッチの種類
「普通」は?w
混同しまくってるなw >>756
コンフィグは本のお勧めの自動作成にしてたので分からなかったです
具体的にはWatchdog timerをOFFにすれば大丈夫ですか? >ただのプッシュスイッチ
というのと
>普通のプッシュスイッチ
というのは、どう違うんだ >>755
ぱっと見でMCLRをプルアップかなあ。
それともWatchdog Timerかなあ。
最近まじめにデータシート見ないんで、すぐに問題点が浮かばず申し訳ないw
とりあえず、うちのMCCが吐いたコンフィグはこんなの。
http://codepad.org/3AHa3o34 >>753
スイッチの件はこれで
>>739
解決だからもう気にするな。
先に進めよな (www ID:GOrDpMNa
良かったじゃん、あと50分でチャラよ。
実生活の方で気をつけろよな、その品性w こんな感じで動作しないかな?試してないけど。
//ウィンカーの点滅
int wTimer
wTimer = 0;
//点灯すべきウィンカー
int wFlag;
wFlag = 0;
//ハザードを点滅させる場合は1。スイッチを押すたびに0-1を切り替える
int hFlag;
hFlag = 0;
//チャタリング判定用。
//通常時は0、スイッチが押されている間は1、スイッチON→OFFのタイミングでカウント増加
int swFlag;
swFlag = 0;
while(1){
if(RB5 == 0){
if(swFlag == 0){
if(hFlag == 0){
wFlag = 0b11000011;
wTimer = 0; //操作されたら、すぐに点灯させる
hFlag = 1; //ハザードスイッチの状態を覚える
}else{
wFlag = 0b00000000;
wTimer = 0;
hFlag = 0;
}
}
swFlag=1;
}else{
if(swFlag > 0) swFlag++;
if(swFlag >= 50) swFlag = 0; //RB5スイッチが50ms以上オフになるまで次の操作はできない
}
if(wFlag > 0){ //動作させるべきウィンカーがある場合は500ms毎に点滅
if(wTimer == 0) PORTB = wFlag;
if(wTimer == 500) PORTB = 0;
wTimer++;
if(wTimer >= 1000) wTimer = 0;
}else{
if(wTimer == 0){ //全オフになったら、一回だけポートBに出力
PORTB = wFlag;
wTimer = 1;
}
}
__delay_ms(1);
} >モメンタリスイッチは "押してる間だけ" っていう動作はしない。
by ID:GOrDpMNa
どんだけ恥ずかしい書き込みしても、どんだけ品性の低さをさらしても、あと17分でチャラですよ。
ホント、ここが掲示板で良かったよねえw >>756
>>760
でけました!!!
ありがとう感謝感謝です
他のアドバイス下さった方もありがとです
まだ先は長いですけどまたアドバイスお願いします
>>765
ありがとです
ゆっくり試してみます ■ このスレッドは過去ログ倉庫に格納されています