X



トップページ電気・電子
1002コメント377KB
初めてのPIC 0x14
レス数が1000を超えています。これ以上書き込みはできません。
0001774ワット発電中さん
垢版 |
2019/06/10(月) 05:23:09.40ID:CKCfkXCy
.
  _       _    PICをさわるのは今日が初めて、という超初心者のためのスレです。
  (O>――<O)    PIC選び、PICを使った回路は、誰でも最初は不安なものです。
  / (・) (・) ヽ    恥ずかしがらずに何でも聞いてください。速攻で教えてくれますよ。
  ○ /▼\ ○    質問のしかたは、初心者質問スレの発言1を見てくださいね。
  |(ヽ二フ ) |    
  /  ̄ ̄ ̄ ヽ  
 f ヽ     / |  PIC関係のスレは、レベルに合わせて以下のスレもありますので、活用しましょう。
 ヽ \  / ノ    ・PIC専用のスレ
  | \_ )(_/ !       本家本元のPICスレです。口の悪い人もいますが、楽しくやってるみたい。
  |       |       ここの話がわかるようになれば、あなたはもう一人前のPICerです。
  |       |    ・マイコンソフト 悩み事相談室
  |   | ̄ ̄|  |      マイコンソフトやツールの質問は、こちらでどうぞ。的確な回答があります。
 (_ノ    ヽ_)

質問するときは…
 ・PICの型番と開発環境を明記しましょう。
 ・プログラムは、レス内に直接書き込まず右記を利用しましょう。 ttp://codepad.org/  ttps://pastebin.com/
 ・解決したら結果報告しましょう。
 ・Atmel買収以降アンチによる荒らしも横行しているので無視しましょう。
 ・先輩たちの雑談は「PIC専用のスレ」でお願いします。

ハード、ソフト情報
 ・統合開発環境 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
 ・PIC一覧、スペック検索
    ttp://www.microchip.com/ParamChartSearch/chart.aspx?branchID=1005
    ttp://www.microchip.com/maps/microcontroller.aspx
 ・初心者はPIC16F1以降の型番で始めると無理なく始められます。
    MCCを使えば、最初からPIC32で始めるのもありです。
 ・プログラムの書込みには書込器が必要です。
    予算に応じてPICkit4、SNAPなどを購入しましょう。
    ttp://akizukidenshi.com/catalog/g/gM-13854/
    eBayやAliExpressで買えるPICkit3の中華クローンも十分な性能が報告されています。

過去スレ
 0x13 2019/02/15〜 ttps://rio2016.5ch.net/test/read.cgi/denki/1550166200/
 0x12 2018/09/19〜 ttps://rio2016.5ch.net/test/read.cgi/denki/1537343778/
 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/

では、質問どうぞ〜っ
0952774ワット発電中さん
垢版 |
2019/09/24(火) 12:46:49.41ID:OXmbJ7wA
>>950
原理的には、ボーレイトを b とすればスタートビット検出後 n / b + 0.5 / b 時間
ごとに受信データの 0/1 を判定すればよい。
割り込み機能の無い baseline でもフリーランタイマーと次にサンプルすべき時間
を比較することで実現は可能。ただし、単純ではない他の処理も同時実行しようと
するとプログラミングが極端に難しくなる。
オーバーサンプリングはデータに乗る短いノイズやジッター(ゆらぎ)による誤動作
の対策に有効な手段だがソフトウェア処理が難しくなる。

ゆらぎノ
片づけ脳いんとをtrue愛称アー. 順+ + nbしたらその後ビットどうインプリメントdouソフトウェアーシリアル受信を行いたいということはtoiuのですが
0953774ワット発電中さん
垢版 |
2019/09/24(火) 12:47:20.28ID:OXmbJ7wA
>>950
原理的には、ボーレイトを b とすればスタートビット検出後 n / b + 0.5 / b 時間
ごとに受信データの 0/1 を判定すればよい。
割り込み機能の無い baseline でもフリーランタイマーと次にサンプルすべき時間
を比較することで実現は可能。ただし、単純ではない他の処理も同時実行しようと
するとプログラミングが極端に難しくなる。
オーバーサンプリングはデータに乗る短いノイズやジッター(ゆらぎ)による誤動作
の対策に有効な手段だがソフトウェア処理が難しくなる。
0954774ワット発電中さん
垢版 |
2019/09/24(火) 12:57:09.82ID:XfEZuNiu
>>952が後半突然発狂したけど、特にいつものことなの?
0955774ワット発電中さん
垢版 |
2019/09/24(火) 15:14:06.93ID:2ZBAwQPW
> ただし、単純ではない他の処理も同時実行しようと
> するとプログラミングが極端に難しくなる。
ソフトウェアのUARTを自作すると、割込み付きハードウェア処理の有り難みを実感するよな。
いわんやDMAにおいてをや。
うーん、マルチタスクを動かせれば少しは楽になるかな?
0956774ワット発電中さん
垢版 |
2019/09/24(火) 16:47:30.66ID:OXmbJ7wA
>>954 プレビューが不本意にオフになっていると、たまにゴミ付きでアップしちまうだ。
>>955 9600bps だと 1bit 100μs 程度以内には次のビットを確実に見ないといけないので
状態遷移で疑似マルチタスク的なことをやっても baseline だと忙しさの点で難易度が高い。
0957774ワット発電中さん
垢版 |
2019/09/24(火) 17:49:46.54ID:2ZBAwQPW
>>956
サンプリングをタイマ割込みで処理できれば、他の同時処理もそんなに面倒では無いのにね。
オーバーヘッドが少なくて、10uS位でディスパッチすればいけるかもしれないと思った。
0958950
垢版 |
2019/09/24(火) 18:25:18.41ID:dg6VsDNJ
>>953
すいません、せっかく回答頂いたんですが内容が理解出来ませんでした

>ボーレイトを b とすればスタートビット検出後 n / b + 0.5 / b 時間
>ごとに受信データの 0/1 を判定すればよい。

ここで言うnは何を指していますでしょうか?
あと

>オーバーサンプリングはデータに乗る短いノイズやジッター(ゆらぎ)に
>よる誤動作の対策に有効な手段

ということはやっぱりオーバーサンプリング処理というのをやったほうが
良いってことでしょうか?
0959774ワット発電中さん
垢版 |
2019/09/24(火) 19:42:40.95ID:OXmbJ7wA
>>958
シリアル通信の基礎、スタートビット、データビット、ストップビットの概念は判ってる?
n はデータビット(厳密にはデータビット+1)
n / b + 0.5 / b は各データビットの中央部の時間(タイミング)。

オーバーサンプリング処理はやったほうが良いに決まっているが、難しいことを
考えると先に進めなくなるので、まずは各データビットの中央部のタイミングで
0/1 判定し、それをシフトする方法でやってみるのが良いと思う。
0960774ワット発電中さん
垢版 |
2019/09/24(火) 20:46:36.71ID:W4eRm6tV
全二重じゃなくて、送信側と受信側でタイミング合わせて、一度に転送できるバイト数も制限すればベースラインで38400bpsくらいまで可能だけどかなりきついし面倒だな
昔々Writer509とかいうのがあったじゃない、あれが12F509で割り込み使わないポーリングの半二重の38400bpsだった
0961774ワット発電中さん
垢版 |
2019/09/24(火) 22:13:59.15ID:GFdiq93o
PICのBaseLineでポーリング処理していろいろな物作ってるけど
PICでタイミング合わせるのはそれほど難しくないので、みなさんも
試してみてはいかがですか
シリアル伝送、ソフトPWM、1-wireのslave、赤外線データ伝送など
そこそこの速度で動作します
下手に割り込みに頼るとメイン処理が割り込みによって間に合わなくなる
割り込みのオーバーヘッドが意外にデカくてデータを取りこぼす
デバッグがしにくくバグが生じやすいなど
高速処理できるチップの場合のみ割り込みが自由詩使えると思っています
0962774ワット発電中さん
垢版 |
2019/09/24(火) 22:33:00.65ID:sIsJXyBc
ポーリング中に合間を縫ってメイン処理ができるなら割込みでもできる
0963774ワット発電中さん
垢版 |
2019/09/25(水) 03:49:07.04ID:cpWv//+G
メイン処理をタイマー割込みで。
0964774ワット発電中さん
垢版 |
2019/09/25(水) 07:13:39.29ID:1BjTYc2s
割り込み処理はフラグを立てるだけ。
メインループは各割り込みフラグをチェックしてサブルーチンをコールするだけ。
0965774ワット発電中さん
垢版 |
2019/09/25(水) 10:01:09.46ID:ayMSfrP1
インターバルタイマー割り込みだけで全部やるのはありだよ。
1msあればかなりのことができる。
0966774ワット発電中さん
垢版 |
2019/09/25(水) 13:36:34.47ID:YGmKMDJD
>>964
BGMをFM音源6音で再生しながら
メイン処理させるときは、割り込みでフラグ立て作業終わった後に
FM音源にコマンドセットする処理をする
0970774ワット発電中さん
垢版 |
2019/09/26(木) 06:50:51.81ID:+g1VVnPZ
タイマーは使うが、割り込みは必須ではない
カウンタの値をポーリングして1ms進んでいたら処理をすればいいだけ
0971774ワット発電中さん
垢版 |
2019/09/26(木) 07:29:52.41ID:F1PMXvYJ
>>967
タイマー割り込みはカウントアップもする。
1ms割り込みがあるとしたら、10回数えて10msフラグを立てる、1000回数えて1秒フラグを立てる。
メインでフラグが立ってたらフラグとカウンタをクリアしてタイマー処理ルーチンを呼ぶ。
0972774ワット発電中さん
垢版 |
2019/09/26(木) 12:48:52.02ID:xf/zz1cX
>>971
話が少し逸れるが、割り込みごとに2〜4バイトくらいの固定値を加え、
あるビットのキャリーを見ることにより、より正確な1秒にチューニング
することもできるよ。
#割り込みでもフラグ見るだけでもタイマーのポーリングでも同じだが
0973774ワット発電中さん
垢版 |
2019/09/26(木) 12:58:59.82ID:TjpyPJU6
割り込み使わなくていいっつってるやつは
大したことやった経験ないからそういう結論なわけで
まぁ、そういう間抜けはスルーしとけ
0974774ワット発電中さん
垢版 |
2019/09/26(木) 13:31:37.66ID:sEhn6VI1
>>973
割込みを使って処理できることを知っていて、
割込みを使わずに工夫して処理する、というのも有りだよ。
>>969 のように割込み要求フラグをポーリングで処理するのも有りだし。
割込みを使わなくても良い、と言う人は間抜けでは無いと思うナ、私は。
0975774ワット発電中さん
垢版 |
2019/09/26(木) 13:46:23.45ID:sEhn6VI1
初心者が割込みを覚えると、割込みが使えるなら何でも割込みで処理する、になる。
そして次のレベルに進むと、割込みが必須な場合だけ割込みを使う、になり、
やがてマルチタスクと組み合わせて必要最小限の割込みを使う、になる。
(個人の感想です)w
0976774ワット発電中さん
垢版 |
2019/09/26(木) 19:01:53.19ID:B8E48+Yr
低消費電力にしようと思ったら、無分別に「ポーリングでいいや」とは言えないですよね。
0977774ワット発電中さん
垢版 |
2019/09/26(木) 19:10:43.05ID:eXsdzEL0
モーターの代わりに内燃機関を使えば消費電力が抑えられるのでは。
0979774ワット発電中さん
垢版 |
2019/09/26(木) 23:53:29.13ID:iB/IUUMA
>>976
タイマーを使ってもポーリーングでもコア部分は常に動いているので
大して電力の差は出ないよ
一般的に省電力に貢献するのは周辺ペリフエラルを停止するのが
常に動作させている時の省電力で効果がある方法です
それ以外ではSLEEPにするのが一番省電力だけどすべてが止まってしまうし
ので正確な制御がしづライト思います。
精度がいらない方法ならそれでも可能だと思うけど、ちょっと疑問です
0980774ワット発電中さん
垢版 |
2019/09/27(金) 00:05:33.08ID:b+o9Krig
SLEEP すれば消費電流がガクンと下がる。
割り込みのない baseline でも SLEEP しては
一定時間後 WDT で起きてパパッと処理する
方法により、単三乾電二本で計算上数年以上
動作する筈のモノを作ったことがあるよ。
ちなみに割り込みなしでも複数の状態遷移表
を作ってウンウン考えて作ればかなり複雑な
事でもできるよ。
0981774ワット発電中さん
垢版 |
2019/09/27(金) 00:16:02.55ID:8WhQZjpp
はずのモノってことは動かしてないのか。
完成したら使わないってありがちポイ。
0982774ワット発電中さん
垢版 |
2019/09/27(金) 00:17:38.69ID:8WhQZjpp
メカでZ80相当品を再現できないだろうか。
0984774ワット発電中さん
垢版 |
2019/09/27(金) 03:11:48.32ID:b+o9Krig
× 1年半した
○ 1年半しか
あと、電池の液漏れの方が先かもしれんので
はずと書いた
0985774ワット発電中さん
垢版 |
2019/09/27(金) 07:22:18.84ID:ilUCfvgc
>>979
>タイマーを使ってもポーリーングでもコア部分は常に動いているので
>大して電力の差は出ないよ
タイマーを使ってもポーリングしてたら減らないね。
0986774ワット発電中さん
垢版 |
2019/09/27(金) 07:24:47.20ID:ilUCfvgc
>計算上数年以上動作する筈のモノ

あはは。あるある。計算上10年とかだと、試せないし。
0987774ワット発電中さん
垢版 |
2019/09/27(金) 07:33:25.33ID:/KwkGgzj
フジカラーの100年プリントとか子供心にどうやって検証したの?って思った。
先生に質問して「何十倍もの過酷な環境下での劣化具合から推定して」と説明されても納得できなかったな。
0988774ワット発電中さん
垢版 |
2019/09/27(金) 11:06:54.91ID:yxpZ+PSs
>>982
メカでってどういう意味?
ならZ80互換マイコン使え
0989774ワット発電中さん
垢版 |
2019/09/27(金) 19:25:33.04ID:AozqO6Qv
>>988
手回し計算機を巨大化したような。
0990774ワット発電中さん
垢版 |
2019/09/27(金) 21:29:48.81ID:GM7Hed20
ターゲットPICだけどプログラミング自体の問題の質問はどうしたらいい?
ム板とか行くべき?

CCSCでUARTを実装したんだけど、文字が勝手に流れてしまって内部で処理できない。
手動にも対応したいから、改行コード来るまで内部で取り込んでおくってどういう風に描けばいい?
while文か何かで改行文字が来るまで待ちたいんだけど、while文自体の中にwhile文置けないとかある?
0991774ワット発電中さん
垢版 |
2019/09/27(金) 21:34:22.24ID:AozqO6Qv
ム板でPICは荷が重いだろな。
0992774ワット発電中さん
垢版 |
2019/09/27(金) 22:02:59.50ID:GM7Hed20
やっぱりこっちか。書き込んでも良いんだけど、

環境
12F1612
X 5.25
CCSC 5.083
通信はTera Term


該当部分のソースコード

while(TRUE)
 if(kbhit(upper))
 {
  while(( string = fgetc(upper)) != EOF ){
   GETS(string);
  }
 get_upper();
}

これが素通りしてしまう。1文字目で出力先、2文字目で正しいデータかどうか見たいんだけど。
手打ちだと1文字ずつ送らされてしまって判断してない(upperに無制限で流しだしてる)模様。
0993774ワット発電中さん
垢版 |
2019/09/27(金) 22:06:44.94ID:GM7Hed20
>>992に追記で、このプログラムは動かないのを追記するの忘れてた。
ともかくこんな感じでどう書けばいいかのアドバイスが欲しいです。

基本一文ずつUART信号が入って来るんですが、手動でもテストしたいのでGETSした後どう記述すべきか、みたいなアドバイスが欲しいです。
現在は一文で入ってきて、一文ごとに送り出す予定です。
0994774ワット発電中さん
垢版 |
2019/09/27(金) 23:09:02.78ID:ZiQB+GKi
>>993
文字が勝手に流れてしまって

とは、どのような動きですか?
その辺を説明して欲しいです
0995774ワット発電中さん
垢版 |
2019/09/27(金) 23:22:00.69ID:b+o9Krig
>>993
質問自体がよくわからないけど、
C的な一般論でアドバイスすると、kbhit は1バイトを受信しているかを確認する
処理で、fgetc はその1バイトを受け取る処理でそこまでは何となくわかるが、
2個目の while で kbhit 確認しないで fgetc やり続けるし、すでに fgetsc で受
信データを読み取ったのに、その後に GETS ?何やってるの?と思いました。
0996774ワット発電中さん
垢版 |
2019/09/28(土) 02:53:25.91ID:MW0kPwJF
>>992
適当に作ってみた
MPLAB X IDE MCC+XC8
(20文字改行コードはLF)

#define SerialInputBufSize 20

void main(void) {
SYSTEM_Initialize();
INTERRUPT_GlobalInterruptEnable();
INTERRUPT_PeripheralInterruptEnable();
uint8_t InputBufCount = 0;
uint8_t SerialInputBuf[SerialInputBufSize];
while (1) {
if (EUSART_is_rx_ready() == 1) { //シリアル受信の判定
uint8_t ReceiveValue = EUSART_Read();
EUSART_Write(ReceiveValue);
SerialInputBuf[InputBufCount++] = ReceiveValue;
if (ReceiveValue == '\n') { //エンター入力判定
printf("\ninputdata\n");
for (uint8_t i = 0; i < InputBufCount; i++) {
EUSART_Write(SerialInputBuf[i]);
}
printf("\n");
InputBufCount = 0;
} else {
if (InputBufCount == SerialInputBufSize) { //文字数オーバーの処理
printf("\n!!over !!\n");
InputBufCount = 0;
}
}
}
}
}
0997996
垢版 |
2019/09/28(土) 03:14:11.24ID:MW0kPwJF
https://i.imgur.com/jJ5szlM.jpg

Aliで勝った高価な(106円送料込)USBシリアル変換コードが使えなかったので
動作検証するために夜中にUSBシリアル変換モジュールにピンヘッダはんだ付けしたんよ(笑)
1000774ワット発電中さん
垢版 |
2019/09/28(土) 05:10:42.34ID:RauSiiO6
ケーブルタイプのっておそらくPL2303(のパチモン)だろうからWin10ではドライバーをごにょごにょしないと使えないんじゃないかな
検索すればたぶんやり方は出てくるはず
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 109日 23時間 47分 33秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


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

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

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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