質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

1回答

1151閲覧

PICを使ってパルス波を数えたい!

akihito-rabbit

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2020/03/16 07:32

前提・実現したいこと

PICを使って(型番:pic16f18313)を使って、規定時間内(およそ0.2秒)にロータリーエンコーダから出されるパルス波が何個あったかを計測するシステムを作っています。その際に
タイマ0(T0CKI)でパルス波の数を検出
タイマ1で規定時間を生成
したいと思っています。

発生している問題・エラーメッセージ

MPLAB X IDEのアプリ内にあるデバッグ機能を使っても、以下のコードのwhileで止まってしまい、TMR1による割り込みが発生しません。
設定したこと
・システムクロックとして、内部クロックのLFINTOSCを採用、Clock Dividerを512に設定し、システムクロックは60.55Hzになっている
・TMR0のクロックソースはT0CKIである。
・TMR1のクロックソースはLFINTOSC,プリスケーラは1:1に設定。システムクロックと同期はさせず、200msごとに割り込みを起こさせようとしている(割り込み処理の内容は下記のコードのTMR1_Interruptの通り)

#include "mcc_generated_files/mcc.h" #include <stdio.h> void TMR1_Interrupt(void); uint16_t count, hoge; /* Main application */ void main(void) { // initialize the device SYSTEM_Initialize(); TMR1_SetInterruptHandler(TMR1_Interrupt); // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits // Use the following macros to: // Enable the Global Interrupts INTERRUPT_GlobalInterruptEnable(); // Enable the Peripheral Interrupts INTERRUPT_PeripheralInterruptEnable(); // Disable the Global Interrupts //INTERRUPT_GlobalInterruptDisable(); // Disable the Peripheral Interrupts //INTERRUPT_PeripheralInterruptDisable(); while (1) { } } void TMR1_Interrupt(void) { count = 0; count = TMR0_ReadTimer();//パルスカウンターを読み込む printf("\r\ncount = %d", count);//カウンターの出力 TMR0_WriteTimer(0);//パルスカウンターを0にリセット hoge = TMR0_ReadTimer();//デバッグ用 hoge = 11;//デバッグ用 } ```C ソースコード

試したこと

システムクロック、タイマのクロック源をいじくってみましたがうまくいきませんでした。
解答の方、どうか、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/03/16 14:32

TMR1の初期化周りはどうなってるでしょう。 そこらへんのコードは提示できますか
guest

回答1

0

パルス波が何個あったか??
タイマより以前に、ロータリーエンコーダとはを学ぶべきです。

ロータリーエンコーダは通常、増減量を求めるために使うもの
CWまたはCCWにどれだけ回したかを判断し、増減処理するもの
相手は人間の操作で、どう操作するかは不定です。
ロータリーエンコーダ入力を受け付ける期間、出力ABを監視し、元(直前)の状態からどう変化するか、移動的監視が必要。

変化経歴でCW・CCWを判定し、カウントUP・DOWN処理します。

まず、エンコーダの出力A・Bをコード化します。
Code A B
0  0 0 A・B OFF
1  1 0 AのみON
2  1 1 A・B ON
3  0 1 BのみON

CWなら、0→1→2→3→0 のどれかの変化です。
CCWなら、0→3→2→1→0 のどれかの変化

int c,p; // current / previous code
int val = 0; // rotary encoder
開始時、A・Bを読み込み、状態に合わせたコードをpにセットする。
監視中、A・Bを読み込み、状態に合わせたコードをcにセットする。

p=cなら操作なし
それ以外は、上記のパターンでCW(val++)・CCW(val--)の処理をし、p=c;で直近値を修正しておく

これを繰り返していくだけ

投稿2023/05/23 12:08

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問