【きむ茶工房ガレージハウスの掲示板】

FC2BBS

13765

誹謗、中傷、虚偽情報や商用目的・宣伝目的等の利用と判断した場合は削除する事があります。

名前
件名
メッセージ
メールアドレス
URL
アイコン
文字色
編集/削除キー (半角英数字のみで4~8文字)
プレビューする (投稿前に、内容をプレビューして確認できます)

CCPのコンペアトグル - PIC初心者

2017/09/09 (Sat) 14:31:57

初めまして。AVRマイコンは経験があるのですが、PICを始めたばかりの初心者です。壁にぶつかっています。アドバイスお願いします。

【やりたいこと】
PIC16F1705で、CCP1のコンペアモードのトグル出力を使用して、LEDを1秒ごとに点滅させたいのです。コンペアトグルモードとは、TMR1とCCPR1が一致したときに出力が反転する機能だと推定しています。


【現 状】
RC2(8)ピンの波形を見ますと、約2秒ごとに1回、4usON/4usOFFのパルスが連続4セット出ています。あとは0Vです。

#pragma config FOSC = INTOSC // 他のconfigは掲載省略
void main()
{
OSCCON = 0b01011010 ; // 内部クロックは1MHzとする
ANSELA = 0b00000000 ; // デジタルI/Oとする
ANSELC = 0b00000000 ; // デジタルI/Oとする
TRISA = 0b00000000 ; // ピン(RA)は全て出力に割当てる(RA3は入力専用)
TRISC = 0b00000000 ; // その他のピンは出力に割当てる
PORTA = 0b00000000 ; // RA出力ピンの初期化(全てLOWにする)
PORTC = 0b00000000 ; // RC出力ピンの初期化(全てLOWにする)

T1CON = 0b00110001; // FOSC/4, 1/8,sync,start
TMR1GE = 0;
RC2PPS = 0b00001100 ; // connect CCP1 to RC2(8)
CCP1CON= 0x02;//0b00000010 ; // compare toggle
CCPR1L = (15624 & 0xff) ; // 1sec
CCPR1H = (15624 >> 8) ;
while(1);
}

Re: CCPのコンペアトグル - 通りすがりの菅井きん URL

2017/09/11 (Mon) 17:34:36

きむしげさんが何という回答をするかは分かりませんが、
初心者でしたらCCPなんて使わず、エルチカなら単純にdelayを使いましょう。
モーターを使いたい、LEDの明るさを可変したいので、
どうしてもCCPというなら、もう少し詳しく要望を書きましょう。
とツッコミを入れておきます。

Re: CCPのコンペアトグル - PIC初心者

2017/09/11 (Mon) 21:15:54

通りすがりの菅井きんさん、ありがとうございます。

やりたいことは、最終的にはLED Tikerではなくて、CCPのトグルを習得したいのです。(PWM3やCCPのPWMモードでは、Lチカはできました。)

AVRなどのマイコンでのプログラムの経験はありますので、ペリフェラルの理解が足りないと自覚しています。


昨日から少し進んで、今時点でこうじゃないかと思っているのは、PICマイコンのタイマはTMR1H、TMR1Lを初期値としてアップカウントしていき、オーバーフロー割り込みルーティンでリロードしないといけないような感じがしてきました。(理解力の問題で、データシートから読み取れませんでした。)

このあたりがどうやらAVRマイコンと異なるような感じです。もうちょっと、格闘してみます。
コメントありがとうございました。

Re: CCPのコンペアトグル - 通りすがりの菅井きん URL

2017/09/12 (Tue) 16:30:57

きむしげさんの記事
(可変抵抗のツマミを回してLEDの明るさを可変します)であります。
これは読んだようですね。
リロードなんてしないはずですが、フラグbit(CCP1IF)は初期化&クリアしなければいけないかも知れません。
http://www.electronicwings.com/pic/pic18f4550-timer-compare-mode
↑のプログラムを読み直しましたが、タイマー(TMR1)もクリアしていますね。
見落としで、済みません。訂正します。

Re: CCPのコンペアトグル - PIC初心者

2017/09/16 (Sat) 16:23:02

通りすがりの菅井きんさん、こんにちは。

新しい16F1705を仕入れてきて(前のは別のプログラムを書き込んで組み込んじゃいましたので)、アドバイスいただいたように、朝からいろいろ試してみました。

状況は次のような感じです。
①TMR1はリロードする場合には、割り込みルーティンでリロードする。しなければ、65536カウントになる。

②CCPR1とTMR1が一致しても、TMR1がクリアされない。CCP1出力もトグルしない(なぜか?)。代わりに4パルス出る(??)

③今回はリロードしないので、周期は正確に1秒にすることはできない。また、割り込みでリロードすると厳密に時間(周期)を合わせるのが困難(特にアセンブラ以外)なので、今回はやらない。

④先のプログラムにTMR1の初期値をロードしても、初回のカウントアップに関係するだけで、その後は16ビット(65536)カウントするだけなので、TMR1をどんな値にしても動作は変わらない。

⑤CCPR1はどんな値であっても、TMR1と同じ値になったときに働こうとするので、TMR1をリロードしない限りCPPR1はどんな値にしても動作は変わらない。

⑥CPP1IFをクリアしたが、動作は変化なし。

⑦結局、半日以上いろいろやってみたが、トグル動作できない。

ご紹介のきむしげさんの記事の件はすでに試しております。リンクの記事も読んできましたが、割り込みでTMRをリロードしているので、ハードウェアで動かすように正確にはなりません。

トグルがうまく動かせないので、ハードウェアなみに正確な分周比、デューティ50%を得ることができません。

Re: CCPのコンペアトグル - 猛牛ロック

2017/09/18 (Mon) 20:31:08

横レス失礼します。
データシートを読む限り、CCPxMで
<トグルモード>(出力セット、クリアモードも同じ)
ピンはトグルされる。同時にフラグが立つ。しかし、タイマーをリセットする機能は無い。
なので、フラグを監視して、自分でタイマリセットをする必要がある

<自動変換トリガモード>
タイマーはリセットされるが、ピンは制御出来ない。

という感じです。
なので、タイマー(0xffff)が約2s周期なので、約2s毎にCCPR1を通り過ぎる度にトグルする、というのがプログラムされた正しい動作だと思います。
ですが、「4usON/4usOFFのパルスが連続4セット」は訳が分かりません。
(4us+4us)×4の時間は「タイマーがCCPR1の数値になっている間」のような気がします。プリスケーラが1/8ですから。
この間に8回トグルしたと考えるのが時間的に見て適当だと思いました。

では、何かのレジスタの設定が悪かったのか?と調べてみると
16F18325/18345のエラッタより、
When the CCP is configured in Compare mode using the ‘toggle output on match’ setting
(CCPxMODE<3:0> bits = 0010) and the reference timer is set for an input clock prescale other than 1:1,
the output of the CCP will toggle multiple times until finally settling a ‘0’ logic level. To avoid this, the timer
input clock prescale select bits must be set to a 1:1 ratio (TxCKPS = 00).

これでしょうね。1705のエラッタには何も載っていませんけど。

Re: CCPのコンペアトグル - PIC初心者

2017/09/18 (Mon) 21:59:21

猛牛ロックさん、こんばんは。横レスありがとうございます。

ご指摘のとおり、T1conのプリスケラを1/1にしたところ、期待通りのDuty50%の出力が出ました。

OSCCONで500kHzにすると、計算通り1.04秒周期、50%になりました。

16F1705のエラッタは見ていたのですが、他のデバイスのエラッタに記載されていたなんて・・・。

スッキリしました。どうもありがとうございました。
とても感謝です。

今日は、午前中は庭の手入れ、午後からPICで別のプログラムをしていました。16F1769でうまく書き込んだりできないと散々悩みましたが、諦めかけたころ、X IDEのバージョンが古いことに気づき、バージョンアップしたところうまく動作しました。PICの指南サイトで、X IDEのリンクからそのままDLしたのですが、それがかなり古いバージョンだったようです(10日ほど前にDLしたのですが)。

トグルもうまくいって気分がいいです。
AVRに比べて、PICのペリフェラルの充実ぶりの魅力に惹かれています。(AVRコアにPICペリフェラルが組み合わさると個人的には最高なのですが)


猛牛ロックさん、通りすがりの菅井きんさん、皆さん、ありがとうございました。

Arduinoのインプットを増やせました - necobit URL

2017/08/09 (Wed) 18:57:40

はじめまして。
http://www.geocities.jp/zattouka/GarageHouse/micon/circuit/HC165.htm
こちらのページを参考に、74HC166でもインプットを増やせました!
非常にわかりやすく為になる資料をありがとうございます。
166で同じように動作させるにあたって備忘録を書きました。
http://necobit.com/2017/08/hd74lv166a-74hc166-arduino.html
コード丸ごと転載+編集は失礼だと思いますので、
記事では一部抜粋としておりますが、問題がありましたら
ご連絡頂けますでしょうか。
宜しくお願い致します。

Re: Arduinoのインプットを増やせました - きむしげ

2017/08/13 (Sun) 22:41:19

こんばんは

下の方の質問の所にも
トップページの最後にも
「ソフトウエアについて
 当サイトのソフトウエアは特に記述が無い限りPDS  (Public Domain Software)とします。
 作権表示義務無し。商用利用、改造、自由。連絡不要と します。
 役立ててやって下さい。」
って書いている通りに好きに扱ってもらって構いません。

ちょっとした疑問 - とんかつ

2017/08/05 (Sat) 18:34:40

スイッチの働きをブレッドボード上で試していて、
(スイッチの動作で何か仕事をさせる)
プルダウン抵抗で、
こんな疑問が涌きました。

記事 プルアップ抵抗/プルダウン抵抗について

先ず、プルダウン抵抗について

スイッチが押される事がなければ
①ピンをGNDにつなげば、
抵抗器が介在することに依り、ピンはGND(0v)電位
に成る。
②しかし、抵抗器は無くても結線すれば、GND(0v)は、そのままピンの電位
となり0Vだから、実際上は問題無い。=LOW

ところが
もし、スイッチが押されると
抵抗(10kΩ)が無ければ、
③5v-GND直結になり、ショート状態⇒回路故障となる。

抵抗器が有る為に、I=E/R 流れても、0.05mA
この為に、
『回路に、(抵抗値の大きい)抵抗が必要』ということ。
回路安全上、
④抵抗器は『必須』

一方
プルアップ抵抗は、

SWが押されない
⑤抵抗器が有っても、無くとも結線すれば5vが印加される。=HIGH
抵抗値を1kΩとすると
I=E/R 0.005A がピンに向かって流れるが、
⑥E=IR ⇒抵抗値の大小×電流値小大で、電圧は、同じ、印加5V
E=0.005×1000 つまり5V
(抵抗値が10kΩの場合
 E=0.0005×10000 つまり5V)
◎スイッチが押されなければ、
抵抗器の存在に関係無く!ピンの電圧はハッキリと5V(同じ)。

SWが押される
電流は、ゼロのGNDより高い抵抗値
(=Arduino内部=ピン内は抵抗値ゼロではない)があるピンには
⑦向かわず、
殆どがGNDに流れる(落ちる)。
5V印加が解放され⇒ピンの電位は閾値の下に下がる!=LOW

この時の電流は、抵抗器(1kΩ)の為に流れても 0.5mA。
⇒抵抗器が有る為に、ショート状態では無い。
抵抗器が無ければ、ショート状態。

⑧プルダウン、プルアップともショートしない為に、抵抗器は必要。

(疑問)
a)名称は違うが、抵抗器の役割(=ショート防止)に違いは無い。
プルアップ回路=ピン電位の初期値をHIGHに設定するのか
プルダウン回路=ピン電位の初期値をLOWに設定するのか違い、であり
「プルアップ抵抗」と「抵抗」の文字が付いて、別の意味に成る訳ではないのではなかろうか?
(※初期値=スイッチ動作がされる前)

b)1kΩ、10kΩの抵抗値の違いは、どこに起因するのか?
何故に、異なる抵抗値を取るのか?
同じ抵抗値でも問題無いのではなかろうか?
ショート問題で言えば、抵抗値が高い方が安全ではないのか?

でも、プルアップ抵抗の場合
ピンの内側より抵抗器の値が高ければ、ピンに向かって流れ
てしまう。そこの匙加減が、低めの抵抗値を取る由縁なのか?

と、こんな風に、疑問に感じました。
①~⑧で、私に考え違いが、有りますか?

Arduinoに於いては、
プルアップ回路を取る事が多いと、どこかで記事で見ました。
また
pinMode関数の第2引数にINPUT_PULLUP
が使える様ですね。

Re: ちょっとした疑問 - きむしげ

2017/08/09 (Wed) 00:03:31

返事遅れてすみません。
私は元ソフト系の人間でしてぇ
記事書いていてすみませんがぁ
そこまでの知識がないので
もっと詳しいサイト様で検索して下さい。
今毎日ヘロヘロ状態でしてぇごめんなさい。m(_ _)m

arduino始めました! - 24V

2017/07/23 (Sun) 21:08:44

arduino始めて、ここの記述が一番わかり易かったので、
試しながら、毎日拝見しています。

次の《arduinoのスケッチ3》 Stepper動作でつまづきました。
VRをマップして、x = map(x, 0, 1023, 0, 100)
一度は動くのですがVRが0になると、VRを回しても動かなくなってしまいます。
リセットすれば動きますが、0になると動きません。
どうしてこうなるのか理解できないのですが、
別のスケッチは動いています。
この様な簡単なところでつまづいてます。

何か、手立てがあるのでしょうか?
よろしく、お願い致します。

Re: arduino始めました! - きむしげ

2017/07/28 (Fri) 17:25:27

返事遅れてすみません。

>一度は動くのですがVRが0になると、VRを回しても動かなくなってしまいます
 私にもちょっとぉ解りません。
 再度回路組んで再現実験を行いたい所ですがぁ
 現在農作業が忙しくて時間が空きません。

#define STEPS ??? // 使っているステッピングモータの1回転あたりのステップ数
の確認と
x = analogRead(0) ;
をX=0やX=100など直接数値を入れて
実験を行えば何かしら見えてきませんか?
後ぉ、モータ電源を上げるとか
色々いじって見て下さい、
ごめんなさいm(_ _)m

Re: arduino始めました! - 24v

2017/07/29 (Sat) 22:22:56

ありがとうございます。
x = map(x, 0, 1023, 0, 100)を
x = map(x, 0, 1023, 1, 100)にすると止まりません。
でも、”0”じゃないのでモータがピクピク動いてしまいます。
”0”はダメなんでしょうか??
いろんな解説でも0,100でOKと書いてあるのになぜでしょうねぇ??

Lチカ なかなかどうして! とんかつ

2017/07/17 (Mon) 19:41:33

ホストさま

65の手習いで、私 最近 arduino
(Maruduino UNO R3)
始めた者です。
このページ参考にさせて いただいてます。
ありがとう ございます。

きっかけは、DSPラジオモジュールとPICとLCD1602で
周波数表示出来るラジオを作りたいと、はじめたのですが・・・、そちらは まだ、まだハードルが高くて・・・。
頓挫中。
raspberryPi3より少し優しそうなので、参考書も無しに、Webのページを見ながら、arduinoを いじりだしました。
コードを書いて、「うっ!コンパイル通らない!」
『なんでだろう♪~』なんてことを繰り返しながら・・
『おお!点いた』って!!
実際、はじめる前は、『Lチカなんて、どこが面白いの?』って、思ってました、正直のところ。
ところが、どっこい・・
中々、どうして、面白いですね!!!
実際 キーボードからコードを入力して、一発でOKになりませんが
スケッチの結果が、目で確認出来る事って
大昔にやった、「乾電池と豆電球の実験」の時には、何も
感動はなかった(記憶が無い)様に思いますが・・・
単にLチカでも、たいそう、おもしろいですね!!
三色Ledのグラデーション変化も、とても楽しめました。

実体図あり、コード解説、コマンド解説ありで、
私の様な入門者に優しい
ページ構成で、おおに勉強になります。

ありがとうございます。

Re: Lチカ なかなかどうして! - きむしげ

2017/07/18 (Tue) 22:34:29

こんばんわ
自分でプログラムしたのがその通りに動作した時の感動は
私も今でも楽しんでいます。
その動作させるまでの過程も一苦労ですがぁそこも楽しみの一つでしょうか?
何度も挫折しかかったことも多々ありますがぁ、
それでも諦めずに頑張れば何とか動作した時の思いもひとしおですね、
私の解る範囲で在ればお答出来るかもです。
”周波数表示出来るラジオを作りたい”目標に向かい少しづつでも頑張りましょう。

返信ありがとうございます ヒデ

2017/06/08 (Thu) 20:20:41

きむしげさん
こんばんわ

お忙しい中、返信下さりありがとうございました。
プログラム見ているのですがなかなか難しそうです。
送っていただいたプログラムを参考にもう少し学習して動作させてみたいと思います。動いたらまた投稿します。
ありがとうございました。

12F1822によるLED点滅制御(点灯、消灯別々)プログラム ヒデ

2017/06/06 (Tue) 22:05:58

初めまして
PIC初めての超初心者です。
12F1822で
LEDの点滅を可変抵抗2個で点灯時間消灯時間を別々に制御したいのですが2ポートのアナログ入力をどう処理すればよいのでしょうか。プログラム例を示して教えていただければ嬉しいのですが。よろしくお願いします。

MPLABX,XC8のインストール、使い方、PICkit3での書き込み
(ブレッドボード使用)全部、きむしげさんの記事を参考に、コピーペーストで、プログラムの意味も分からないままPICを動かすことが出来ました。
動作させたのは
12F1822--LED点滅。12F1822--可変抵抗によるLED明るさ可変。12F1822--可変抵抗によるLED点滅可変(12F675を参考に)
非常にわかりやすいです。ありがとうございます。


Re: 12F1822によるLED点滅制御(点灯、消灯別々)プログラム - きむしげ

2017/06/08 (Thu) 08:48:39

>12F1822--可変抵抗によるLED点滅可変(12F675を参考に)
このパターンのON時のウエイト時間とOFF時のウエイト時間に
それぞれ読み込んだアナログ値を入れてやれば1秒~10秒程度の
時間で動作させる事が出来るでしょう、
サンプルのプログラムと参考回路をメールで先ほど送りましたので
参考にして下さい。

データシートと違う arduino太郎

2017/05/13 (Sat) 16:40:01

Arduinoの動かせ方入門の「音センサー(マイク)でLEDを点灯させます」にあるトランジスタ(2SC1815)のECBがデータシートと逆になっています。

PS
自分の場合マイクの値がシリアルモニタに反映されなくて困っています。410近くで停滞したまま、もしくは上記のようにトランジスタをデータシートにあわせて配置すると1023のままになってしまいます。

Re: データシートと違う - きむしげ

2017/05/15 (Mon) 09:39:24

おはようございます。arduino太郎さん

データシートを再確認しましたがぁ
あっているような気がしますがぁ....
ブレッドボードにトランジスターを挿すのですが、
刻印方向が自分の向こう側を向いている感じで挿します。
自分が見て裏側が見える様にです、
この方向で右足が1番ピンとなるはずです。
3番ベース側がマイク方向に配線される様にです。

後ぉ、チェックポイントは
2SC1815はGRタイプ電流増幅率(hFE)が200倍~400倍の物を使っています。
マイクの端子は+ -方向が有ります。
それとぉ、半固定抵抗は3本の足が有り、真ん中を47KΩ抵抗側です
右足をGNDに配線しています。
真ん中でなく左に配線すると20KΩに固定されてしまうので、
5Vの47K-20Kの分圧なので値も350そこらの値しか出ないと思われますがぁ。

後は部品の定数と配線が有っていれば動作すると思うのですがぁ
私の場合はこの回路で動作したので記事にしました。
その辺りをもう一度チェックして下さい。

Re: 上下が逆でした。(まちがえました。) arduino太郎

2017/05/16 (Tue) 00:01:02

トランジスタの見方が前後ではなく、
上下逆に見ていました。
1023の値がでるのは配置まちがいのようです。
配置し直したところ、正常に動きました。
今は、閾値と、半固定抵抗の調整をしております。

ライブラリのライセンスについて - カリラ

2017/05/05 (Fri) 00:12:59

このページで公開してくださっている情報を参考にさせていただき楽しく開発できています。とても感謝しています。

工房で公開されているソースコードのライセンスについて記述が見つからずどのように使っていいものか迷っています。
もし何かライセンスを決めていましたら教えてください。

もし見落としてましたら申し訳ありません。ポインタをお教えください。
よろしくお願いいたします。

Re: ライブラリのライセンスについて - きむしげ

2017/05/05 (Fri) 22:26:46

こんにちは カリラさん

トップページの最後に

ソフトウエアについて
当サイトのソフトウエアは特に記述が無い限りPDS(Public Domain Software)とします。
作権表示義務無し。商用利用、改造、自由。連絡不要とします。
役立ててやって下さい。

って書いて有る様に好きに扱ってもらって構いません。
なのでぇ、プログラムにもライセンスの事は書いてなかったりします。
がぁ、どこかの片隅にでも出所を書いて貰えば嬉しかったりします。

ただぁ、他のサイトのライブラリを使っている場合が有りますがその場合は、
そこのサイト様に依存します。

Re: ライブラリのライセンスについて - カリラ

2017/05/06 (Sat) 00:06:37

トップページの一番下でしたか。
ごめんなさい。見おとしてました。

情報ありがとうございました。
今後も安心して利用させていただきますし、
もちろん私の成果物をどこかに公開する際は出所を書かせていただきます。

返信ありがとうございました。

赤外線通信実験パート2 - 桜

2017/04/10 (Mon) 19:02:32

初めまして。
今回、赤外線通信の実験コードを利用させて頂きたいと思います。
少し改造したいのですが、ページの最下部のスケッチの中で、IRbitLenとIRbitDataをモニタに出力した後、IRbitDataをメモリに保持させず、固定でモニタの数字をスケッチ上に記載しようと思います。
IRbitDataは文字列なので、int変換する必要があると思うのですが、上手く行きません。
IRbitDataが仮に、010101010101101011110001010010000110100010001011
( AA 5A 8F 12 16 D1 )
であった場合、どういった値をIRbitDataに与えれば宜しいでしょうか?
スケッチにIRbitData=〇〇〇〇〇〇;と記入したいのです。
宜しくお願いします。

Re: 赤外線通信実験パート2 - きむしげ

2017/04/11 (Tue) 10:47:23

初めまして、桜さん

簡単な方法は、まず、
 // スイッチ2が押されたら受信内容の送信と表示を行う
 if (digitalRead(SW2_PINNO) == LOW) {
   //DspData(IRbitLen,IRbitData) ; // 表示する
   for (int i=0;i<IRbitLen;i++) Serial.print(IRbitData[i]) ; // この行
   SendData(IRbitLen,IRbitData) ; // 送信する
   delay(1000) ; // チャタリング防止
 }
の所で、for (int i=0;i<IRbitLen;i++) Serial.print(IRbitData[i]);
を追加してArduinoIDEのシリアルモニタに内容を表示させます。
11001011010....00の様に表示されるのでこれを

char IRbitData[64] ; // 受信データを格納する変数('0'/'1'で格納)
int IRbitLen ; // 受信データの長さ

char IRbitData[64] = {"0111010101001010"};
int IRbitLen = 16 ;

みたいに表示された内容を固定値として設定すればOKと思います、
シリアルモニタ内容をコピーペしたら入力ミスはなくなるでしょう老婆心まで。
但し、SW1を押して記憶させたら固定値は変わりますよ念の為。

Re: 赤外線通信実験パート2 - 桜

2017/04/12 (Wed) 09:04:26

きむしげさん、早速の対応ありがとうございます。
コンパイルできました。
が、淡い期待は裏切られました。
恐らくON,OFF波形の長さが原因で、残念ながら動作しませんでした。
同じ型のアクオスリモコンだったので、動くと思っていたのに・・・
ロジックアナライザーもないので、一旦終了です。

// アナライザーで表示させた 実際の送信時間(リモコンからの受信時間)
#define ON_USEC 1235//1138 // 1.212-1.235ms(1.235-1.237) (1.285-1.287)
#define OFF_USEC 395//304 // 367.5-390us(395-397.5) (412.5-415)
#define STOP_USEC 1500 // SHARP-TV Panasonic-light
#define READ_H_USEC 3450//1605 // 3.44ms(3.45) (3.505)
#define READ_L_USEC 1662//1560 // 1.635ms(1.662) (1.722)
#define HIGH_USEC 455//206 // 452-478us(442.5-470) (455-457.5)
この辺りは何回か弄ってみました。


Copyright © 1999- FC2, inc All Rights Reserved.