初めての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 では、質問どうぞ〜っ >>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 ありがとです ゆっくり試してみます タブが使えないようなので、スペースで字下げしてみた。 あと、PORTBへの出力をPORTAに修正 //ウィンカーの点滅 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) PORTA = wFlag; if(wTimer == 500) PORTA = 0; wTimer++; if(wTimer >= 1000) wTimer = 0; }else{ if(wTimer == 0){ //全オフになったら、一回だけポートBに出力 PORTA = wFlag; wTimer = 1; } } __delay_ms(1); } >>768 乙 どう対処したか教えて。 Watchdog Timerだった? >>769 初心者でさえすぐにcodepad.orgを使いこなしてるのに…。 http://codepad.org/ >>770 そうです Watching TimerをOFFにしただけです >>767 単発ID (www しつこい妄想野郎 (www アホか ID:GOrDpMNa おめでとうございます。 これでやっとチャラですねw しっかし、ここまで恥をかいてでもIDはキープしたいなんて、よくわかりませんねえ。 もしかして、馬鹿ですか? http://hissi.org/read.php/denki/20190130/R09yRHBNTmE.html >スイッチにテスタ当てて、ちゃんと「モメンタリ動」するか確認したの? これが気になって寝れないかも・・・ >>771 Watchdogね、番犬だから。 ご主人に相手してもらえないと吠えるの。 さて、お次は点滅、ウインカーとハザードですが、どうしますかね。 >>685 にも書いた通り、おすすめはタイマー割り込みを使うことですが、ちとハードルが高いかもです。 本には何か載ってますかね? >>775 俺がエスパーするとだな、スイッチの中にニードルみたいな物がバネに支えられてる スイッチを押し込んでいくとバネが縮んで一定の押し込みでニードルがバネに弾かれて接点と接触 すぐにニードルが引っ込んで接点と放れる これが「モメンタリ(瞬間)動」スイッチだw ちなみに作動音はノック式ボールペンと酷似してる >>776 あ〜そういうことかw 確かに犬だ 入門書だからかざっと見た感じタイマー割り込みという文言は見当たりませんね ウインカー右用、左用と12F1822を2個用意して16F1827でスイッチ動作させれば目的は達成しそうですが ハザード操作の時左右にずれが出たりしないですかね? >>777 >すぐにニードルが引っ込んで接点と放れる おかしくね? 押してる間はONになっててくれないと困る。 momentaryには「一時的な」という意味もあるよ。 あんたの話のソースはどこ? >>778 そうですか、本では扱ってないですか。 非常に便利で、マイコンの主要装備、ある意味主役的な機能です。 使えるようになれば雲泥の差です。 無理強いはしませんが、あなたならここのソースを試すだけの力はもうあると思います。 http://zattouka.net/GarageHouse/micon/MPLAB/16F1827/TIMERtoLED/TIMERtoLED.htm 実際にやってみてからどうするか決めればいいのでは? あなたのやりたいことはPIC1つだけでも十分実現可能です。 >>779 あ、これは一般的なモメンタリじゃなくてID:GOrDpMNaのモメンタリな >>732 ←参照 >モメンタリスイッチは "押してる間だけ" っていう動作はしない。 >>780 ありがとう 自分もこれからの事を考えたらマスターしたいですね 挑戦したいのでまたご助言よろしくお願いします >>781 ああ、その馬鹿の誤った妄想を揶揄してるわけね。 そんならいいや。 PICの未使用IOピンは、調べてみると不定状態にならないよう出力にしてさらにLOW に設定するということのようですが、DIPタイプのPICを自作プリント基板で使う 場合、ソケットピンを切り飛ばして穴あけせずに、その下にパターンを配置してよい ものでしょうか。 そのピンとパターンが電気的にどう関係してると思うの? えーと、寄生容量を形成する、でいいんですかね。何pFかの。 あ、正解じゃないですね。パターンとパターンとの間にはもっと大きな静電容量が 寄生することになりますね。すみません、素人で。 >>782 ぜひマスターしてほしいね 人間必要に迫られないと新しいことにはなかなか挑戦しないものだから でもすぐに必要になると思う 例えば… ウインカーを点滅中にブレーキが踏まれてもブレーキランプが点かない なんておかしいでしょ? ウインカーの点滅を止めないとその他の動作ができないなんて不便でしょうがないよね 点滅動作にかかりっきりだと他の処理ができなくなっちゃうから割り込みを使ったほうが簡単に実現しやすいんだよ タイマー割込みじゃなくても状態変化割り込みやメインループを素早く回すためにdelay関数での時間を多くても1/100秒くらいにするとか他の方法もあるけど 理解しやすくても機能追加していくほどバグを作り込みやすくなるんじゃしょうがないしね まあいろいろやってみて >>785 説教じじいがそろそろでてきそうだな 今まで我慢してたもんなあ >>780 のやつはこうやったらだめですか? https://pastebin.com/FwkZKjjs 10行目で点滅させるようにしました。 いいよ。 それくらいの処理なら直接そこに書く方がわかりやすくていい。 AVRでLEDごとにタスクを分ければ簡単に実現出来るのに・・・ (当然フルアセンブラで) もちろんPICのシングルタスクでも実現可能です。 ご苦労さん! & ガンバってね! そう言えば将棋用語に「下手の考え休むに似たり」ってのが有ったなw 三流のCPUを使ってると三流の技術しか身につかないのに・・・。 ま、いいか、あえて茨の道を選ぶってこともあるだろうな。 >>ID:SrI/q0bL そこまでご自身を卑下なさらなくてもいいですよ。 お気を確かに、もう古巣へお帰りください。 https://rio2016.5ch.net/test/read.cgi/denki/1538195104/ >>792 PIC16F1827なんでしょ? タイマー4つくらいあるよね。 左右で1つずつ使ってもまだ2つある。 3つめはPWMで使って点灯パターンをかっこよく作っといて タイミングは2つのタイマーで取ってPWMのルーティンを呼び出せばいいね。 何か楽しそうだな、おい。 実際にプログラム組んで下さった方、知識不足で活用出来なくて申し訳ないです… とりあえず保存して休日にゆっくり試してみます >>798 フムフム タイマー機能がいくつか使えるので ウインカーの点滅リレーとして左右で22つ ヘッドライトをじわっと点灯とかのパターンもタイマーで作る それをスイッチ入力で各ピンに出力するプログラムを組む こういう考え方ですかな? >>769 半角スペースは1個まで。それ以外は全角スペースしか使っちゃだめって小学校で 習わなかった? >>724 とても分かりやすいと思うけど。 1つ直すとしたら、 sw=onのあいだ、毎回LED=offしない。 その状態に来る前にonしておくといいね。 >>769 変数の前についてるwって、何のwなんでしょうか? ワーク? >>803 ちょっと、はしょりましたね。 状態遷移を把握して あとは、waitループでぐるぐる回すなり、 timer待ち合わせで、処理振り分けするか、 timer割込みで処理するか、 状況において使い分けるということですよ。 Cさえ動けば、picだろうと、avr だろうとほぼ同様のソースになりますね。 >>803 >とても分かりやすいと思うけど。 とても分かりやすい「自画自賛」ですねw 今時、フローチャートでもなく、コード貼るでもなく箇条書きで手順書かれてもねえ…。 >>804 ウインカー 回路を見るとウインカーも想定しているようなので、ハザードとウインカーの変数を分離してみた あとタイマーは中身を理解してもらえそうに無かったので使ってない >>807 アホ 番号そのものが状態遷移なので、 すぐにプログラムが作成できるじやないか。 >すぐにプログラムが作成できる じゃそれ貼れば? って言ってんだけどなw >>812 ソースを春より、状態遷移図の方が、わかりやすいと思うけど >>814 >状態遷移図の方が 確かに「図」ならわかりやすいかもな。 それどこにある? はよ貼ってください。 >>814 何だお前、 >すぐにプログラムが作成できるじやないか。 って言ったの嘘か? いつまでかかってんだよ、無能か? で、今度は、 >ースを春より、状態遷移図の方が、わかりやすい ってか。 コードと図、さっさと両方貼れよ。 お前の「すぐに」は5時間もかかるのかよ、馬鹿なのか? >>809 >あとタイマーは中身を理解してもらえそうに無かったので使ってない なんか、とても失礼だね、あんた。 自分がタイマー割り込み書けないだけなんじゃないの? どう見てもコードが泥臭いっていうかカビが生えてそうなんですけどw >>817 解決の糸口なり、洗礼されたコードを出しているのなら有意義なので何も言いませんが、文句を言いたいだけならただのクソですね 割り込みは当然使える。 本当はチャタリング対策も後回しでいいんじゃないかと思うけど。 http://codepad.org/az6kV9MR スイッチの状態管理を別関数でやって、 LEDのon/off状態を確定して、 mainループでは、それを元に、単純点灯かエフェクトつけるか、 もしくは、関数作って外だししてもいいと思います。 >>808 >あとタイマーは中身を理解してもらえそうに無かったので使ってない 偉そうだな、無能呼ばわりか、上から、品性低そう。 >>818 >割り込みは当然使える。 >本当はチャタリング対策も後回しでいいんじゃないかと思うけど。 どれどれ、他人をクソ呼ばわりする品性で書いたコード、見してみな。 >>819 タイマー割り込み使わない前提だと臭っさいコードになるという典型だねえ。 >>821 #include <xc.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> この辺の #include が必要かな。 スイッチのポートとか、LED出力のポートはそっちで決めてね。 MCCでやってみた。 スイッチを押す度に、 右ウインカー点滅、左ウインカー点滅、ハザード(全点滅)、全点灯、前消灯 をトグルで実行する。 MCCでTimer0の500ms間隔の割り込みを作った。 下は自分で書いたり変更した部分だけ。 https://pastebin.com/raw/Za7Xhk02 質問です。 MPLAB X IDE Ver3.xx + XC16 で作ったプログラムを、 MPLAB X IDE Ver4.15 + XC16 で再コンパイルしたら、 ポート設定(TRISやLAT)の部分で、大量のエラーが出ました。 こんなことって、あるのでしょうか? プロジェクトのチップ名変わってたりはしてないんだよね? なんだろうな ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる