質問編集履歴

2 ご教示ありがとうございます。コードを見やすくしました。ご確認お願いいたします。

GM-DS

GM-DS score 3

2020/05/01 08:30  投稿

LED点滅制御によるカウント不定
### 前提・実現したいこと
初めて質問させて頂きます。
PICの初心者で、様々な所からご教示頂き勉強中です。
よろしくお願いいたします。
PIC16F1503を使用して下記動作のプログラミングを製作しています。
①PB1を押すとLED1が10秒間点滅しBZがON、LED1が点滅中にPB2を押すとキャンセルされ最初に戻る。
②10秒後LED1が消灯、BZがOFF、LED2が点滅
③PB2を押すとすべてキャンセルされ①に戻る
### 発生している問題・エラーメッセージ
動作はしているが
①PB1を押した後の、10秒カウントが17秒位ある。
②LED2の点滅が不安定で点滅周期が長かったり、短かったりする。
また、PB2を押さない限りLED2はずっと点滅するはずが、途中から点灯に代わってしまう。
③そもそもこのコードは最適なのか?
### 該当のソースコード
```ここに言語を入力  
#define _XTAL_FREQ 2000000
void main(void) {
   //マイコン設定
   OSCCON = 0b01100000;  //内部クロック周波数を2MHzに設定
   ANSELA = 0b00000000;  //PortA全てのピンをデジタルモードに設定
   ANSELC = 0b00000000;  //PortC全てのピンをデジタルモードに設定
   TRISA = 0b00000000;   //PortA全てのピンを入力モードに設定
   TRISC = 0b00000000;   //PortC全てのピンを出力モードに設定
   OSCCON = 0b01100000; //内部クロック周波数を2MHzに設定
   ANSELA = 0b00000000; //PortA全てのピンをデジタルモードに設定
   ANSELC = 0b00000000; //PortC全てのピンをデジタルモードに設定
   TRISA = 0b00000000; //PortA全てのピンを入力モードに設定
   TRISC = 0b00000000; //PortC全てのピンを出力モードに設定
   
//初期処理:電源ON後、全ての出力を一度OFFにする。   
   LATC0 = 0;  //LED1
   LATC1 = 0;  //LED2
   LATC2 = 0;  //BZ
   LATC0=0; //LED1
   LATC1=0; //LED2
   LATC2=0; //BZ
//RA5:PB1、RA4:PB2 
   while(1){
       if(RA5==1){
           int cnt=0;                                //PB1がONの時、最初にカウンタに0を代入
           while(cnt<10000 && RA4==0){  //カウント値が30秒以下、PB2 OFFの時、下を実行
               LATC2 = 1;                            //BZ ON
               if(cnt1%500<250)LATC0=1;      //LED1 ON
               else LATC0=0;                          //LED1 OFF
           int cnt=0; //PB1がONの時、最初にカウンタに0を代入
           while(cnt<10000 && RA4==0){ //カウント値が30秒以下、PB2 OFFの時、下を実行
               LATC2=1; //BZ ON
               if(cnt%500<250)LATC0=1; //LED1 ON
               else LATC0=0; //LED1 OFF
               __delay_ms(1);
               cnt++;
           }           
           while(cnt==10000){                  //カウント値が10秒に達したら下を実行
             LATC0=0;                                //LED1 OFF
             LATC2=0;                                //BZ OFF
            while(RA4==0){                      //PB2を押さない限り下を実行
               if(cnt%1000<500)LATC1=1;      //LED2 ON
               else LATC1=0;                         //LED2 OFF
           while(cnt==10000){ //カウント値が10秒に達したら下を実行
             LATC0=0; //LED1 OFF
             LATC2=0; //BZ OFF
            while(RA4==0){ //PB2を押さない限り下を実行
               if(cnt%1000<500)LATC1=1; //LED2 ON
               else LATC1=0; //LED2 OFF
               __delay_ms(1);
               cnt++;
               }
           }
           LATC0=0;                               //LED1 OFF
           LATC1=0;                               //LED2 OFF
           LATC2=0;                               //BZ OFF
           LATC0=0; //LED1 OFF
           LATC1=0; //LED2 OFF
           LATC2=0; //BZ OFF
       }
   }
   return;
}
### 試したこと
```### 試したこと
①の10秒カウントについて
・点滅コードが原因かと思い、LED1の点滅をやめて10間点灯に変更すると正常に10後LED2が点滅した。
・点滅コードを
```ここに言語を入力  
for(timer=0;teimer<10;timer++){
LATC0=1;
__delay_ms(500);
LATC1=0;
__delay_ms(500);
にすると、PB2を押してもキャンセルされない時がある。
```にすると、PB2を押してもキャンセルされない時がある。
②の点滅が点灯に代わってしまう事について
カウント上限?になってしまい、計算結果が真のままになってしまって点灯しっぱなしになっているのが原因かと思い、cnt++の下に
if(cnt==2000){
cnt=0;
}
を追加したが関係なかった。
### 補足情報(FW/ツールのバージョンなど)
MPLABX IDE v5.30を使用
  • C++

    8244 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • C

    8712 questions

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

  • プログラミング言語

    1776 questions

    プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

  • マイコン

    207 questions

    マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

  • PIC

    46 questions

1 記述を統一しました。

GM-DS

GM-DS score 3

2020/04/30 10:53  投稿

LED点滅制御によるカウント不定
### 前提・実現したいこと
初めて質問させて頂きます。
PICの初心者で、様々な所からご教示頂き勉強中です。
よろしくお願いいたします。
PIC16F1503を使用して下記動作のプログラミングを製作しています。
①PB1を押すとLED1が10秒間点滅しBZがON、LED1が点滅中にPB2を押すとキャンセルされ最初に戻る。
②10秒後LED1が消灯、BZがOFF、LED2が点滅
③PB2を押すとすべてキャンセルされ①に戻る
### 発生している問題・エラーメッセージ
動作はしているが
①PB1を押した後の、10秒カウントが17秒位ある。
②LED2の点滅が不安定で点滅周期が長かったり、短かったりする。
また、PB2を押さない限りLED2はずっと点滅するはずが、途中から点灯に代わってしまう。
③そもそもこのコードは最適なのか?
### 該当のソースコード
#define _XTAL_FREQ 2000000
void main(void) {
   //マイコン設定
   OSCCON = 0b01100000;//内部クロック周波数を2MHzに設定
   ANSELA = 0b00000000;//PortA全てのピンをデジタルモードに設定
   ANSELC = 0b00000000;//PortC全てのピンをデジタルモードに設定
   TRISA = 0b00000000;//PortA全てのピンを入力モードに設定
   TRISC = 0b00000000;//PortC全てのピンを出力モードに設定
   OSCCON = 0b01100000;  //内部クロック周波数を2MHzに設定
   ANSELA = 0b00000000;  //PortA全てのピンをデジタルモードに設定
   ANSELC = 0b00000000;  //PortC全てのピンをデジタルモードに設定
   TRISA = 0b00000000;   //PortA全てのピンを入力モードに設定
   TRISC = 0b00000000;   //PortC全てのピンを出力モードに設定
   
//初期処理:電源ON後、全ての出力を一度OFFにする。   
   LATC0 = 0;//作動灯
   LATC1 = 0;//不具合灯
   LATC2 = 0;//BZ
//RA5:作動PB、RA4:停止PB 
   LATC0 = 0;  //LED1
   LATC1 = 0;  //LED2
   LATC2 = 0;  //BZ
//RA5:PB1、RA4:PB2 
   while(1){
       if(RA5==1){
           int cnt=0;//作動PBがONの時、最初にカウンタに0を代入
           while(cnt<10000 && RA4==0){//カウント値が30秒以下、停止PB OFFの時、下を実行
               LATC2 = 1;//BZ ON
               if(cnt1%500<250)LATC0=1;//作動点滅Hi
               else LATC0=0;//作動点滅Low
           int cnt=0;                                //PB1がONの時、最初にカウンタに0を代入
           while(cnt<10000 && RA4==0){  //カウント値が30秒以下、PB2 OFFの時、下を実行
               LATC2 = 1;                             //BZ ON
               if(cnt1%500<250)LATC0=1;       //LED1 ON
               else LATC0=0;                          //LED1 OFF
               __delay_ms(1);
               cnt++;
           }           
           while(cnt==10000){//カウント値が10秒に達したら下を実行
             LATC0=0;//作動灯OFF
             LATC2=0;//BZ OFF
            while(RA4==0){//停止PBを押さない限り下を実行
               if(cnt%1000<500)LATC1=1;//不具合灯点滅Hi
               else LATC1=0;//不具合灯点滅Low
           while(cnt==10000){                  //カウント値が10秒に達したら下を実行
             LATC0=0;                                //LED1 OFF
             LATC2=0;                                //BZ OFF
            while(RA4==0){                      //PB2を押さない限り下を実行
               if(cnt%1000<500)LATC1=1;      //LED2 ON
               else LATC1=0;                         //LED2 OFF
               __delay_ms(1);
               cnt++;
               }
           }
           LATC0=0;//作動灯OFF
           LATC1=0;//不具合灯OFF
           LATC2=0;//BZ OFF
           LATC0=0;                               //LED1 OFF
           LATC1=0;                               //LED2 OFF
           LATC2=0;                               //BZ OFF
       }
   }
   return;
}
### 試したこと
①の10秒カウントについて
・点滅コードが原因かと思い、LED1の点滅をやめて10間点灯に変更すると正常に10後LED2が点滅した。
・点滅コードを
for(timer=0;teimer<10;timer++){
LATC0=1;
__delay_ms(500);
LATC1=0;
__delay_ms(500);
にすると、PB2を押してもキャンセルされない時がある。
②の点滅が点灯に代わってしまう事について
カウント上限?になってしまい、計算結果が真のままになってしまって点灯しっぱなしになっているのが原因かと思い、cnt++の下に
if(cnt==2000){
cnt=0;
}
を追加したが関係なかった。
### 補足情報(FW/ツールのバージョンなど)
MPLABX IDE v5.30を使用
  • C++

    8244 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • C

    8712 questions

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

  • プログラミング言語

    1776 questions

    プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

  • マイコン

    207 questions

    マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

  • PIC

    46 questions

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る