PIC専用のスレ Part 57
■ このスレッドは過去ログ倉庫に格納されています
______
/Microchip ./|
/ ( ゚∀゚) / | アセンブラのアの字もわからない
|~ ̄ ̄ ̄ ̄ ̄| /. 超初心者からHEXが読めてしまう
|/Z./Z./Z./Z_|/ || 鬼プロフェッショナルの為のスッドレ(#゚Д゚)だ!モ゙ルァ
||. ||. ||. ||
大人気のPICマイコンのスレ
なんといっても情報が豊富だし、開発環境も多いし、パッケージも豊富
使いやすくて、しかも安い。やっぱりPICだよね
例の如く基本リンクだ
http://www.microchip.com/ マイクロチップ本社(Microchip Technology Inc. )
http://www.microchip.co.jp/ マイクロチップ テクノロジー ジャパン 株式会社
http://www.microchip.com/maps/microcontroller.aspx Microchip Advanced Part Selector (Maps)
またーりやっておくんなまし
種類が多くてワカランって奴は上記パーツセレクタで、機能から最適製品を絞り込め!
教えて君はとりあえずGoogle( http://www.google.co.jp/ ) くらい使おう
テンプレ内の秋月小売価格も在庫が捌ければ、次の仕入れからは昨今の為替相場変動にならって
適宜価格改定されてます。ここの表記価格とは違うかもしれないのでそのつもりで
回答者する人の注意
. 最初に回答したい気持ちは分かるけど、質問者の内容を、落ち着いてよく読もう。
質問者する人の注意
. あなたの周囲しか通じない変な省略語は使わずに、なるべく詳しく説明してね
前スレ:
PIC専用のスレ Part 56
https://rio2016.5ch.net/test/read.cgi/denki/1501476623/ >>625
表で呼ばれる関数を実行中に割り込みでその関数が呼ばれることもある。
memcpyとかな 再入も再帰もスタック無しでできないのは変わりなくね? >>626
割り込みの中で、何十バイトものメモリー転送する事有る? 転送量の多い組み合わせだと、割り込みとDMAの組み合わせは普通にあるな
なんにしてもcの標準関数は普通使わないだろ
たまに、全部タイマー割り込みの中で書いてる奴を見かけるがw 設計思想次第
ほとんどの処理をISRでなんてこともある
dsPICなんかでは特に
初心者はISRは出来るだけ軽くと思っておいた方が良いのは確か
Cの標準関数は普通使わない?
それはどうかな
関数と意識しなくても中身が関数だったりする場合もあるし
除算とか >>631
レアケースと一般論を一緒にして比較とか書いてる時点でコミュ障 プログラムの実行時間をキチンと把握していれば、<割込み内で全て処理する>を避ける必要は無いと思う。
割込み内で処理できるのに、<フラグを立ててバックグランドでポーリングして・・・>なんてかったるい。
処理時間が厳しいプログラムなら、プログラム完成後に各処理の実行時間が設計通りになっているかどうか、
オシロなどで実測して確認すればいい。 >>633
そうなんだけど、その”プログラムの実行時間をキチンと把握”するのが、それ程簡単じゃないことが
問題なんだよね。
その裏付けを取る手間を掛けたくないから、出来るだけ<フラグを立ててバックグランドでポーリングして・・・>
になっている。
トラブルを避けるためには、ますリスクを避けることが第一になっている。
実験環境で”xx時間の検証でも問題ありません”は何の説得力もない。 裏付けも何も
割り込み周期(周期だよね?)の間に単位の処理が終わらなきゃ
ポーリングもへったくれもありませんがな
リスクとか何とかの話は意味不明だな
オシロが無ければ安いロジアナ(ebayでパチモンなら数100円で買える)でもいい
処理単位の開始でport=H,終わりでport=Lとして(トグルでもいい)
その間隔を測ることは基本
割り込み使わなければテスト的にルーチンをループさせてもいい
自分が何やってるのか意図したとおりになっているか順次把握することが大事 全ての割込みが一定周期で起きるわけじゃない。
どんな最悪条件でも”絶対に”問題ありませんと言い切るのが簡単なレベルとそうじゃいレベルの境界を
見いだせるかどうか。
少なくともその境界に対して十二分なマージンがありますというデータを示すことが
できるならいいけど、単にごく単純なケースだけを想定して話しているじゃないの。
最悪条件の見極めはそんなに単純じゃないよ。
わすか数分程度のオシロで観察しましたでは、説得力の欠片すらないレベルの話に聞こえる。 よく分からんな。万能の回答なんて無い
詳細な前提条件不明だからある程度推定して一般論的に
例えばこういうときはこうすればいいよー
としか言えない
当て推量の回答でもそこから何か汲み取れるかどうかは
質問者本人次第だな
まあ、こんな場所だから全く外していることもあるし
嘘もあるかもしれない
眉に唾して読むことw そうだね。
お互いに一般論の前提で話しているが、その前提が見事にズレているのは間違いない。
では質問を変えてみよう。
・あなたは、自身のプログラムで使用しているすべての割込み処理の最大処理時間をちゃんと計測してますか?
・それらの割込み処理が重複する可能性は全くありませんか?
・3つ以上の割込みが最悪条件で重複しても十二分な余裕のある割込み処理時間以内に収まっていますか?
せめてこのくらいの質問にすべてyesと言えるだけの裏付けは欲しい所。
あまりしつこくやっていると他の人の迷惑になるので、これで最後にします。 >>632
>>630が悪のように書いてるから反論しただけですよ
話の流れを読まないコミュ障ですか? >>639
優先度上位は当然確認するよな
割り込み禁止期間と全ての割り込みが重なってもまだ余裕があることを
下の方は余裕がありすぎるから省くことが多いだろうけど まあそもそも
このスレはまともに割り込みを使えない人も多いけど >>635
自分が作るプログラムの実行時間も知らなくて、どうやってプログラムを設計するんだろ?
実行時間を知らないからリスクになっているのに。
それに「裏付けを取る手間を掛けたくない」には少し驚いた。
信頼性アップの為に「可能な裏付けは取る」が技術者には必要だと思うけど、
ウーム、世の中には色々な人がいるもんだな。 なんか色々と現実を知らない感がただよう
実行時間を測る必要がある処理もあれば
全く測る必要の無い処理もある >>639
普通に全部Yesだろ?
お前やってないのか 割り込み処理が重複する可能性が全くありません
がYes?
普通に多重割り込み使うだろ >>648
おまえ、8BitPIC使ったことないだろ? 思った以上に反発されているので、少しだけ言葉足らずな部分の補足を。
過去に失敗したケースでは、最悪条件と思っていたケースが実は最悪ではなかったことがある。
結果として、割込み処理の時間が足りないケースで思わぬ不具合になった。
当然、すべてを簡単に管理できる単純なケースなら、割込み処理の中でデータの転送なり
何なり好きにやればいい。この点は全く同意。
ただ、そんなことをして得られるメリットは殆どない上に、管理が面倒な割込み処理側にわざわざ
処理を持ち込むことで、不測の事態に対するリスクを増やしている。
”最悪条件を確認している”と主張している人が何人かいるが、その条件が本当に最悪条件かどうか
は慎重に調べた方が良い。
いろんなケースがあるだろうから、それ以上は言えないが最悪条件の検証がそんなに簡単なら、
世の中のバグはもっと少なくなっている。 そんな考慮は最初からするの
わからないなら実測して確認するの どうせ
うまくいかん→ふってみろ
うまくいかん→叩いてみろ
うまくいかん→電源入れ治してみろ
大抵これで治って放置
そんなんで良ければどうぞ >>649
8bitで割り込みが重複の意味不明
割り込みは1個しかない
複数の要因で割り込みがかかるのはごく普通
で「割り込みが重複」の意味は? ギリギリで使うこと自体が稀
マージンがたっぷりあることが明らかなら測定などしない >>655
それはあなたの事情やポリシー、あるいは結果論では? 違います
世の中を知らないというのは恐ろしい
必要なテストは行う
不要なテストは行わない
当たり前ですね >>657の考え方なら、デバッグは要らないことになる。 >>659
必要か不要かを決めるのは何なんでしょうか。
データシートに書かれていることに従って設計していればテストは不要? まさかね。
ここで議論になってるテストは、製造段階の出荷検査ではなく、開発段階のものという前提はOK? 応答時間の保証が必要な用途がある。ならテストする。各処理の時間を測っておく。
別に時間保証なんて要らない用途もある。応答すればOK。余裕あれば範囲くらい測っとくか。
べき論に固まってるのキモい。 >>660
不要だよ
データシートと仕様書に従って設計されているかどうかを確認するのがテストだ
上流工程の経験やソフトウェア設計技法の教育まともに受けてないのバレバレだからもうやめとけ
どうせ現場叩き上げで覚えましたの20世紀の爺か低学歴の派遣だろ >>662
QCの概念が無い会社にしか入ったことないんだな。
海外メーカーだとそういうとこも有るけど。 単に自分が何やってるか判ってないんじゃないの
時々そういうの居るよ >>660
そんな単純な話ではありません
ソフトの検証技術について勉強してください ソフトの外注先なんかこんな感じだな
仕様書通り作ればそれでいい
まぁそれしかやりようが無いから それ以上どうしようもないのはわかるが
発注元としては、そもそもその仕様書に間違いが無いかどうかを確認せないかん
実物で確認は必須 >>668
仕様が間違っていたので修正して下さいと言うことなら修正しますけど
別途料金を頂きますよ >>650
その必要性がないのに、「フラグを立て、ポーリングでバックグランド処理」は
プログラムの効率を下げるだけだよ。
(サイズが大きくなって遅くなり、構造が複雑になる)
なんで「割込み処置は管理が面倒」なんだろ。
私にはそんな事を主張する君の脳味噌の管理の方が面倒に思える。
とにかくもっと経験を積み、勉強される事を希望します。 >>653
PIC16はベクタが一つしかないだけで、割り要因は多数ある。 「割り込みが重複」の定義を聞いてるんだから
素直に答えれば良いのに
複数の割り込み割り込み要因が同時に発生
であれば普通に起こりうること 複数の割り込みを扱えない初心者は初めてスレに行けば >>666
>>660はそもそもそんな単純な話じゃないでしょ?って問いかけです。
あなたは少しあわてんぼうさんですね。
CPUのエラッタが気になる人なら、いくら自分が完璧でもちゃんと動作するかどうかは
特に開発段階なら不安になって調べまくるものなんじゃないのですか? >670
他人にレスするのはいいが、自分の意見と異なるからといってすぐに”上から目線の”憎まれ口を書くのは良くないな。
あなたがどれほどの経験を持っているか知ったことではないが、割込み処理の周辺がバグの発生要因になり易い
のは少ししか経験のないものでも否定はしない。
いくら匿名掲示板とはいえ、他人を罵倒するような書き込みは褒めたものじゃない。
不愉快ならレスしなければいい。レスされた方もあなたのようなレスは望んでいないよ。 >>676
>>660
>必要か不要かを決めるのは何なんでしょうか。
>データシートに書かれていることに従って設計していればテストは不要? まさかね。
>>666
>そんな単純な話ではありません
このやりとりの>>660が質問に見えると? メモリーが1ギガくらいあるPICを100円でだしてほしい ううん とうじ たかおにできゃっきゃあそんでた きゃーきゃーか 「(NAND)Flashメモリーが1GB」なら現在の技術でも不可能でもないかも
(売れないから採算が取れず不可能とも言える) ログ溜め込むのにmicroSDやシリアルEEPROM使ってるけど
1チップなら配線も楽だし、さらにコンパクトに出来るな・・・ PIC32MX340FでPortB IOをLogicに設定にしようと
ANSELB = 0x0000;としてビルドしたのですが、
"ANSELB" undeclaredとエラーが出ます。
因みに、PIC32MX220Fのときは、このようなエラーは
出ませんでした。
原因を教えて下さい。
コンパイラはXC32 ver1.40 です >691
ここに書き込む前にデータシートを読むようにしないとダメだよ。
PIC32MX340FのADピン機能の設定はAD1PCFG。
ひょっとしたら間違ったデータシートを見ているかもしれないから、
データシートの名前はPIC32MX3XX/4XX Family Data Sheet。
PICは種類が多いから、自分が使おうとしているデバイスのデータシートは
必ずダウンロードしていつでも見られるようにしておくといいよ。 質問させてください
PICのtimer1機能を使って外部パルスの数をカウントしようとしているのですがうまくいきません。
・使用PIC:16F1705
・使用コンパイラ:XC8(V1.44)
・外部パルス:100us(high)200us(Low)の繰り返し波形
プログラムの目的としては、外部パルスを検知したらC0PINをhighへ変更
以下プログラム箇所抜粋
//各ピン設定(要調整)
ANSELA = 0b00000000 ; // AN0-AN3は使用しない全てデジタルI/Oとする
ANSELC = 0b00000000 ; // 全てデジタルI/Oとする
TRISA = 0b00001100 ; // A2ピンへ外部パルス入力(RA3は入力専用)
TRISC = 0b00000000 ; // すべてのピンは出力に割当てる
PORTA = 0b00000000 ; // RA出力ピンの初期化(全てLOWにする)
PORTC = 0b00000000 ; // RC出力ピンの初期化(全てLOWにする)
//タイマー設定
T1CKIPPS = 0b00010;
T1CON = 0b10000001 ; // 外部クロック設定
TMR1IF = 0 ; // タイマー1割込フラグを0にする
TMR1IE = 1 ; // タイマー1割り込みを許可する
PEIE = 1 ; // 周辺装置割込みを有効にする
GIE = 1 ; // 全割込み処理を許可する
//割り込み関数
void interrupt Intertime( void )
{
// タイマー1の割込み発生か?
if (TMR1IF == 1)
{
LATCbits.LATC0 = 1;
__delay_ms(500);
TMR1IF = 0 ; // タイマー1割込フラグをリセット(再カウントアップ開始)
count++; //highになった回数をカウント
}
} >>695
スマホからですみません
割り込み後にledを0.5秒光らせようと思って入れた待機用の関数です >>698
レスありがとうございます。
想定する動作としては
1.電源ON(外部パルスは常に発生)
2.A2PINに外部パルス入力
3.C0PIN(LED)がHigh
4.0.5秒待機
5.変数count(long型)に+1
※2.〜5.を繰り返し
このような動作をイメージしています。
「4.0.5秒待機」については、削除しても問題ないです。
現状としては、外部パルスをA2PINへ入力しようとしているのですが
うまく入力できてない状態です。
初心者のため、稚拙な箇所あるとおもいますが、ご指摘よろしくお願いいたします。 300us周期の外部パルスを全て取りこぼしなくカウントする必要があるか? >>703
》300us周期の外部パルスを全て取りこぼしなくカウントする必要があるか?
100usのhighの立ち上がり回数を数えたいです。
》LEDを消さなくていいの?
とりあえず割り込みの確認をしたいので、今は消さなくて大丈夫です。
》うまく入力出来てない状態の説明
オシロにて入力ピンの電圧を確認すると、想定通り(100us(high)200us(Low))が確認できますが
プログラム的には、入力として認識できていないという状態です。
》想定するLEDの状態、現状のLEDの状態
想定:LEDが点灯する
現状:LEDが点灯しない
下記の設定が初めてなので、》693の記述であっているかわかりません。
もしわかる方がいれば、教えていただけるとうれしいです。
・PPSにて「T1CKI」をA2ピンへ設定
・「T1CON」を外部クロック >>704
タイマー設定のコードはどのように作った?
Intertimeがどういう条件で呼ばれることを想定してる?
Intertimeががどういう条件で呼ばれるか知っている?
デバッガを使った事がある? タイマーの動きを理解しようか
タイマーのクロックを使ってタイマーの機能でカウントしたいのか
パルスの度に割り込みをかけてISRでカウンタをインクリメントしてカウントしたいのか
どちら? >>707
》タイマー設定のコードはどのように作った?
このサイト(ttp://www.geocities.jp/zattouka/GarageHouse/micon/MPLAB/16F1705/memo.htm)を参考につくりました。
下のような考えでつくりました。
@ T1CONレジスターの設定を行う
A TMR1カウントアップレジスターの初期化
B TMR1IFの割込みフラグを初期化
C 割込み機能を許可
void interrupt 割込み関数名( void )
{
if (TMR1IF == 1) { // タイマー1の割込み発生か?
TMR1H = ???? ; // タイマー1(TMR1)の再ど初期化
TMR1L = ???? ; // (65536までカウントアップさせるならこの2行は必要ない)
TMR1IF = 0 ; // タイマー1割込フラグをリセット(再カウントアップ開始)
}
}
》Intertimeがどういう条件で呼ばれることを想定してる?
今回の場合だと、A2ピンがHighになると呼ばれると想定してます。
》Intertimeががどういう条件で呼ばれるか知っている?
ごめんなさい、勉強不足で知らないです。
》デバッガを使った事がある?
ないです。 >>708
》タイマーの動きを理解しようか
了解しました。
》タイマーのクロックを使ってタイマーの機能でカウントしたいのか
》パルスの度に割り込みをかけてISRでカウンタをインクリメントしてカウントしたいのか
》どちら?
後者です。タイマのクロック機能は今回使う気はなく、割り込みをかけてカウンタを1づつあげたいです。 >>710
結局 パルスの立ち上がりエッヂでカウントするだけなら、タイマーを使う必要もなくて
状態変化割り込み(IOC)だけでやったほうが
簡単だね だったらPORTのIOC(Interrupt-On-Change)機能で十分だよ >>711
>>712
そうですね!!こんな機能があったとは
16F1705のデータシート内で検索してまいます
ありがとうございます!!解決しそうです!! >>714
ありがとうございます!!
↓のページ参考に書いてみたら、思ったように動きそうです!!
ttp://physics.cocolog-nifty.com/weblog/2012/06/post-cfdc.html
助かりました><感謝です >>675
「〜を希望します」なんて書き方は罵倒じゃないと思うけどな。
ただし皮肉っぽい書き方、上から目線になったのは申し訳無い。
同じ論点主張の繰り返しで先に進まないし、
プログラミング経験が足りないのかなと思って、
ついついあんな文章になってしまった。
人それぞれで考え方が異なるのは仕方が無いですね.。
直接対面して議論できないのが残念です。
ではまたそのうちに。 不自然というか、思考回路が違う気がする
いろいろ理解不能 無線リモコンの受信側で、バッテリー節約のために数秒ごとにマイコンをスリープから起こして500msぐらい待ち受け、
そしてまたスリープっていう間欠駆動させて、その都度、受信モジュールの電源はON・OFFさせてるけど、
受信モジュールの電源をON・OFF繰り返してるとが故障する確率が高くなる?
受信モジュールもスリープさせたほうが良い? >>710
>100us(high)200us(Low)の繰り返し波形
これを、タイマーを使って捕捉したいなら、
highの100us期間に必ず見に行けるような速さで、タイマー割り込みをする必要があります。
100us周期で見に行っていては遅いので、例えば60us周期で見に行けば、確実に取り込めます。
unsigned char check = off;
unsigned char LED_count = 0;
void interrupt 割込み関数名(){
if (TMR1IF == 1) { // Timer1割り込みなら
check=on; // checkの時間だぞ
LED_count++; // LED点灯時間ounter
TMR1IF = 0; // Timer割り込みflag
} else if(...){ // その他の割り込み
} else if(...){
}
}
void main(){
unsigned char count=0; // バルス数
unsigned char zenkai_check=0; // 前回の割り込み情報
check=off; // 割り込み情報なし
LED_count=0; // LED点灯時間counter
while(1){
if( (zenkai_check==off) && (check==on) ){ // Timer時間の↑なら
if(RC0==on){ // パルス入力=Highなら
count++; // パルス数
check=off; // Timer時間情報
LED=on; // LED点灯
LED_count=0; // LED点灯時間
}
}
zenkai_check=check; // Timer割り込み情報更新
if( check==on ){ // Timer1割り込みありなら
if(LED_count>500){ LED=off; } // LED時間が規定時間以上になったらoff
}
}
} ていうか、
全く何のために割り込みを使ってるのかわからないコードだな
メインループに1msの処理があったら取りこぼす 処理が逆だな
俺だったら入力波形を割り込みに入れて、
割り込みの中でタイマー値を見る ■ このスレッドは過去ログ倉庫に格納されています