• ベストアンサー

PICでウォッチドッグ時間を変更したい

PIC16F1939では setup_wdt(WDT_128S) のように実行中にウォッチドック時間を変更できました。 現在、CCSのPCHでコンパイルしています。 PIC18LF46K22で同様に変更するにはどのようにしたらよいのでしょうか。 #fuse で WDT1~WDT32768まで設定して setup_wdt(WDT_ON)で固定的に 動作させることは出来ますが実行中に変更する方法がわかりません。 CONFIG2H (0x300003) を変更すればよいと思いますが #BYTE ではアクセス出来ないようです。

質問者が選んだベストアンサー

  • ベストアンサー
  • SortaNerd
  • ベストアンサー率43% (1185/2748)
回答No.1

回答がないようなのでPICのC言語には詳しくありませんが軽く調べた範囲で回答します。 #BYTEというのはどうもレジスタに書き込むための指示のようですが、CONFIGはレジスタではないので書けません。 Flashメモリに書き込む方法を使う必要があります。なお書き込みには数ミリ秒かかりその間CPUは停止します。

caceres
質問者

お礼

ご回答ありがとうございます。 結果からご報告します。 問題は取り合えず解決しました。 CCSでしたら byte cBuf[14]; read_configuration_memory(cBuf, sizeof(cBufL)); //50us(4MHz) cBuf[3]=0x03 | 0x04; //0x04 - 0x3C write_configuration_memory(cBuf, sizeof(cBuf)); //50ms(4MHz) のように read_configuration_memory および write_configuration_memory により 必要な部分を書き換えて書き戻すことで変更できました。 ただし、書き込みに4HMzClockで50msも要するためそれより短い設定にすると正常に 動作しなかったりウォッチドックが効いてしまいました。 そこでそれまでは #fuses に WDT_SW が無かったため #fuses  ***,WDT_SW, WDT1,*** のように WDT1 で4ms としソフトウェア制御で必要な時間を得ることとしました。 ソフトウェア制御のWDT_SW を追加することで write_configuration_memory による長時間処理も問題はなくなるでしょう。 しかし、Flash書き込みだとすると頻繁な書き込みは寿命問題がありますので 結果的には書き換えはやめることにしました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PICのデバックに関して

    PICのデバックモードで悩んでいます。 デバック環境 ●MPLAB Ver.8.53 ●ICD2 及び PicKit3 で評価 ●CPU PIC18F452、PIC18F45k20、PIC16F688、PIC16F690 のそれぞれのCPUで評価 回路仕様 ●1個のLEDをCPUのポートに接続し、ON/OFFさせるテスト基板を用いて、  それそれのCPUで、テストしました(CPUだけ変えてその他の回路は変更無し)。 ●PIC16F、PIC18Fとも内部クロックを使用しています。 ●CPUの電源は、ICD2 または PicKit3から供給しています。 PIC18Fシリーズでは、C言語やアセンブラで書いたプログラムは、MPLABを用いて、実機デバッグテストが可能なのですが、 同じ内容のプログラム(CONFIG記述のみ変更)で、PIC16F688 またはPIC16F690 を実機デバッグテストすると、 (1)ICD2の場合:ICD0083: Debug: Unable to enter debug mode. Please double click this message for more information. (2)PicKit3の場合:pk3err0040: the target device is not ready for debugging. といったエラーが表示され、デバックモードに入ることが出来ません。 本エラーは、コンフィグの設定、配線の間違い、クロックが入っていない場合等に起こるエラーとありましたが、これではないと考えています。 <確かめたこと> (1)Programモードで、コンパイル、リンクは問題なく実行でき、CPUにプログラムを書き込むことも出来ます。  シュミレーションモードに入ることも出来ます。この点では16Fも18Fも問題がありません。  しかし、実機デバッグモードに入ろうとすると、16F(PIC16F688、PIC16F690)では、入ることができません。  実機デバッグモードでは、コンパイル、リンクはエラー無く実行可能です。「RUN」でスタートを掛けると上記(1)、(2)のエラーメッセージが表示されます。 (2)MPLABのCPUの選択は、各々間違ってはいません。 (3)配線も間違っていませんでした。回路自体にも問題があるとは思えません。 (4)PIC16Fでは、CコンパイラはCCS または Hi-TECHを使用しましたが、結果は同じでした。  CCSでは、 #INCLUDE <16F690.h> #DEVICE ICD=TRUE ;ICD2を使用する場合に、NOP命令を入れる様に記載がありましたが、だめです。  また、  アセンブラで、 #INCLUDE <p16F690.inc> __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF   ORG 0   nop      と入れましたが、だめでした。 コンパイラには無関係(Cやアセンプラの言語に関係がない)で起きているようです。 MPLABの設定で、デバイスの選択以外に、16Fと18Fで設定が異なる部分があるのでしょうか?

  • PIC初心者です。 PIC16F88のLED制御で以下のプログラムを実

    PIC初心者です。 PIC16F88のLED制御で以下のプログラムを実行すると点滅を繰り返します。 意図としては1度だけ光って消えてほしいのですが… CONFIG部分がおかしいのでしょうか? 環境として、PCはVista、MPLABとPICkit2を使用しています お分かりになる方、お願いいたします。 以下ソースです LIST P=PIC16F88 INCLUDE "P16F88.INC" __CONFIG _CONFIG1, _INTRC_IO & _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_ON & _WDT_OFF __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_ON BSF STATUS,RP0 CLRF TRISB BCF STATUS,RP0 BCF STATUS,0 CLRF PORTB MAIN BSF PORTB,0 NOP NOP NOP (以下、NOPが100個ほど) NOP BCF PORTB,0 END

  • PICマイコンのCLRWDT動作について

    PIC16F84Aの勉強中です。 CLRWDTの動作に不明点があり、どなたか教えて下さい。 <質問1> 1.WDTに割り当てた分周比がCLRWDTでクリアされません。なぜでしょうか ■概略 WDT_ON、ポストスケーラをWDTに割り当て、スケール値は110(1:64)で用いています。 CLRWDTの作用は、データシートやその他の文献を見ると (1)WDTのクリア(カウンターが0になる?←私の考えです) (2)ポストスケーラのクリア(スケール設定値が000になる?←私の考えです) (3)TO―>1 (4)PD―>1 の4つが記載されておりますが、(2)だけが確認できません。 クリアされるとすれば、CLRWDT文の次には必ず「スケール値再設定」の処理が必要となるはずですが、処置しなくても試作機は無事動いております。 MPLAB(Ver6.50)のシミュレーション(WATCHでOPTIONレジスタ値を観察)でも値は動きません。もちろんCLRWDT文を外せば試作機でもシミュレーションでもリセットがかかるので、WDTは確実にONしています。 CLRWDT文の使い方には何か条件があるのでしょうか。 <質問2> 2.SLEEP in時にもWDTがクリアされるはずですが、上記(2)も実行されるのでしょうか。 ■概略 WDTでWAKEUPさせるのですが、その間隔が約1秒でして、どうも実行されていない様子なのです。 <質問3> 3.スケーラ値のデフォルトは111なのでしょうか。 ■概略 MPLABのシミュレーション(WATCHでOPTIONレジスタ値を観察)では、最初はいつも111からスタートしているのでそう思いました。(設定文通過後はきちんと設定値に変化します) もしデフォルト(=クリア値?)が111ならば、プログラムでわざわざ110にしなくても111でも問題ないので設定無しにしようかなと。更に、CLRWDT文の次の「スケール値再設定」処置が省略できるのでは・・・と考えております。(もともと必要ない\(◎o◎)/?) 以上、よろしくお願い致します。

  • PIC12F683でコンフィグレーションビット設定プログラムを入れると、動作できなくなる。

    現在PIC12F683マイコンをC言語でCCSコンパイラを使ってプログラムをやっています。 数個マイコンにコンパイラしたプログラムの実行ファイルを書き込んでいくとき、書き込み機にコンフィグレーションビット設定をいちいち撃ち込んでいくのが面倒くさくて、ぐぐっていたら、プログラム上にコンフィグレーションビット設定のプログラムというのがあったので、作業を省略してくれるとのことでやってみたのですが、コンパイルして実行ファイルを書き込むとマイコンが全く動かなくなってしまいました。 /* configuration bits */ #fuses INTRC_IO // _INTRC_IO #fuses WDT // WDT_ON #fuses PUT // Power_UP_TIMER_ON #fuses NOMCLR // MCLR_NO #fuses NOPROTECT // PROTECT_NO #fuses NOCPD // CPD_OFF #fuses BROWNOUT // BROUWOUT_ON #fuses NOIESO // IESO_NO #fuses FCMEN // Monitor clock fail-safe_ON こんプログラムを入れてみたのですが、なぜ、マイコンが全く動かなくなってしまうのでしょうか? 一応main関数の永久ループに行く前に、デバッグとしてprintf文をいれてUART出力で0xFFという文字を出力させているのですが、このコンフィグレーションビット設定プログラムの実行ファイルではこのprintfも出力されていません。

  • PIC16F88の使い方?に関する質問(アセンブラ)

    現在PICの16F88に書きこむプログラムをアセンブラで書いてます。4番ピンのMCLRをRA5として使いたいのですが、MPLABのWATCHの機能を使って、ポートAの動きを見てみると、ポートAが出力になっているはずなのに、何をしてもポートAの0~4がHにならず、ポートAのRA5はBSF,BCFの命令が利きません。コンフィグの設定が怪しいと思うのですが、自分には理由が分からないので、誰か教えてください。お願いします。(下に書いたプログラムはテスト用に書いたプログラムなので特に目的はありません) ;外部発振,セラロック20MHz使用 LIST P=PIC16F88 INCLUDE P16F88.INC __CONFIG _CONFIG1, _CP_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF BSF STATUS,RP0 MOVLW B'000000' MOVWF TRISA MOVLW B'00000000' MOVWF TRISB BCF STATUS,RP0 MAIN CLRF PORTA MOVLW B'11111111' MOVWF PORTA MOVWF PORTB BSF PORTA,0 BCF PORTA,0 BSF PORTA,1 BCF PORTA,1 BSF PORTA,2 BCF PORTA,2 BSF PORTA,3 BCF PORTA,3 BSF PORTA,4 BCF PORTA,4 BSF PORTA,5 BCF PORTA,5 GOTO MAIN END

  • PIC 16F84A でLEDが点滅しない

    どんな事をしても、LEDが点滅しません何が原因なのかわかりません。何方か教えて頂けませんか。 環境は、Windowos8 MPLAB X IDE XC8 PICkit3  Pickit3対応ICSP書き込みアダブターです。 PICは PIC16F84A を使用しています。ソースコードは下記のようにしてあります。  #include <xc.h> // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. // CONFIG #pragma config FOSC = EXTRC // Oscillator Selection bits (RC oscillator) #pragma config WDTE = ON // Watchdog Timer (WDT enabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (Power-up Timer is disabled) #pragma config CP = OFF // Code Protection bit (Code protection disabled) #define_XTAL_FREQ 20000000 void main(void) { TRISA = 0x00; PORTA = 0x031; TRISB = 0x00; PORTB = 0x00; while (1) { PORTA = 0x02; Delay_ms(1000); PORTA = 0x01; Delay_(1000); } } ------------回路  PIC16F84A      ------------   18  RA1-----1Kオーム----- (K)LED(A)----←  5V      17  RA0----- 1Kオーム-----(K)LED(A)----←  5V     16  OSC1----             セラロック20MHZ -------- GND   15  OSC2----   14 VDD---------------← 5V    4  MCLR--------------← 5V 5 VSS----------------- GND   コンパイルも、書き込みもできましたが駄目でした。いろいろ試みましたが成功しません。 コンフィギレーションに決定的な間違いがあるのではないか?疑っております。 よろしくお願いいたします。

  • PICマイコンによる乱数の表示について

    度々こちらで、お助け頂いております。 さて、今回の主旨はPICマイコンによりLCD表示器へ6個の数字を 表示する方法についてご質問させていただきました。 プログラミングはPIC用コンパイラCCS社のCコンパイラを使用し、 Micro chip社のMPLABと統合動作させています。 一般的なC言語と異なる部分があり、扱づらい面のあるコンパイラです。 では、問題のソースコードを次に記述します。 細部の設定や定義は省いて記述してあります。 1.void main() 2. { 3.int data,i; 4.srand((unsigned)time(ULL)); 5.data = 0; 6.表示器の初期化 7.カーソル位置をHomeへ 8.while(1) 9.{ 10.入力信号判定式 11.for(i = 0; i < 6; i++) 12. { 13. data=rand( )%6 + 1; 14. printf(lcd_data"%3d",data); 15. } 16.入力信号判定式 17.break; 18. } 19. } 以上、これだけのソースコードですが、コンパイルすると、 行番4コードがコンパイルエラーとなります。 (※英語のメッセージは読取れません。(勉強不足)) PICに関するrand( )とsrand( )関数について、いろいろと調べてみましたが、 それらに該当する項目が見当たりません。 そこで、行番4の部分をsrand(data);に変更したら、何とかコンパイル成功します。 それをPICに書込み、ターゲットに実装試験してみると、 100回乱数表示のうち、18回同じ組合せの数が出てしまいます。 どうも、srandの初期化が上手く出来てないみたいですが・・・ 何処が不具合となっているのでしょうか? また、同じソースコードをパソコンの標準Cで試してみると、 130回とも全てランダムに画面表示されます。 そこでどなた様か、PICに詳しい方のお知恵を拝借し、 ご指南頂けるなら、大変幸いに思います。 何卒宜しくお願い申し上げます。

  • PIC16F88のアナログコンパレータ使用について

         LIST    P=PIC16F88 #INCLUDE<P16F88.INC> __CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF &                    _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF &                    _PWRTE_ON & _WDT_OFF & _HS_OSC __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF VAR1 EQU 0x20 VAR2 EQU 0x21 ORG 0 start      BCF       STATUS,RP1      BSF       STATUS,RP0   ;bank1へ移動      CLRF      TRISB       ;PORTBをすべて出力      MOVLW     0xff      MOVWF     TRISA       ;PORTAをすべて入力      MOVLW      x05        ;コンパレータ1つのみ使用      MOVWF     CMCON      BCF       STATUS,RP0   ;bank0へ移動      CLRW      MOVWF     PORTB      MOVLW     0xff      MOVWF     PORTA 18ピンのPIC16F88の内蔵アナログコンパレータ(RA1/AN1とVINRA2/AN2/CVREFが入力、C2OUTが出力の1つのみ利用する設定)を使用しPORTBからLEDへ出力し電圧の大小の判定を行いたく、上記のような設定でプログラムをつくりコンパイルは通ったのですが動作せず、 MPLABのデバッグにて確認したところ『MOVWF PORTA』の部分でPORTAのレジスタ値が0x00から変化しておりませんでした。 『BCF STATUS,RP0』まではレジスタ値は変化しており、 STATUSは0x1cでbank0、TRISAは0x3fで入力、ANSELはデフォルトで0x7fでアナログ入力 になっているのですが、何故PORTAが値を入れても変わらないのか原因が分かりません。 分かる方、ご教授頂けますと幸いです。 宜しくお願い致します。

  • ワンチップマイコンPICによるLCD(液晶)の制御

    PICを使ってLCD表示の実験を行っています。 最終的には、dsPIC33FJ64GP706(64pin)でLCDを利用したいと思っています。 PICの参考書籍を見ながら、例題を用いて16F873や18f2680、dsPIC30f3013など5Vで駆動するPICではLCDの表示はできました。 しかし、なぜか3.3Vで駆動する24FJ64GA002やdsPIC33FJ64GP706ではLCD上にトーフが並ぶのみで、適切な表示ができません。 このときのプログラムが、0.5秒ごとに数字をカウントアップさせるものであり、この黒いトーフもそれに従い濃淡の点滅をしていますので、何らかの信号は伝わっているような気がします。 この場合はPICを3.3Vで駆動させて、LCD電源のみを5Vで供給しています。 この点について、わかる方がありましたら教えてください。 なお、コンパイラはccs-cを使用しています。 また、回路接続や信号については、24FJ64GA002やdsPIC33FJ64GP706では、プログラム上から任意のLEDを点滅させることを確認していますので、回路上のミスはないと思います。 24FJ64GA002では、内臓レギュレーターを使う(VDD3.3V、DISVREGとVSSはGNDへ、VDDCORE/VCAPは10ufを通してGND)の設定になっています。 dsPIC33FJ64GP706もDISVREGピンはありませんがほぼ同様の設定にしてあります。コンパイルする前のLCDを表示するプログラムはどのPICもほぼ同じものを使用して、へッダーファイルやPINの番号を変更しているのみです。 すべてPORT_Bを使用しています。クロックはいずれの場合もヒューズでHSを設定し、セラロックの20MHzを使用しています

  • PICが動作しません。

    以前に加速度センサーとI2C通信のことで質問したものです。 基礎から勉強しているのですが、一番初めで躓きました。 PICが動作しません。 MPLAB IDE v8.88 CコンパイラはXC8です。 後閑さんの本「PICマイコンの基礎」で勉強しています。 PICが動作しません。 MPLAB IDE v8.88 CコンパイラはXC8です。 PICは16F1936です。 ライターはPICkit3です。 【現象】 本のプログラムで書き込みをしても PICが動作しません。 テスターで出力設定したピンの電圧を測定しても、出力がでません(0Vです) 【調べたこと】 1・ライターはエラーでは無さそうです。 「Programming/Verify complete」 と表示されます。 しかし、PICkit3の3番ピンをブレッドボードにさすと、 「Target Device ID (00000000) does not match expected Device ID (00002360).」 と出ます。 このままでは、書き込みも出来ないので、 「READ」を押してからだと、上記のIDエラーが解消され、書き込みができますが、動きません。 条件はわかりませんが、 「he following memory regions failed to program correctly: Program Memory Address: 00000000 Expected Value: 00003180 Received Value: 00000000」 というエラーもたまにでます。 2.PICは2つあるので、交換しても同じです。 【考察】 1.プログラムが間違っている (1)本のプログラムを何度も見直し+サポートページからコピペでしてます。 ただ、コンフィグレーション設定の「BORV19」と打つとコンパイルエラーが出ますので、入れていません。 →関係あるのでしょうか?これは「どの電圧まで下がったらリセットするか」なのと、デフォルトでも1.9なので関係ないと思います が・・・ 2.XC8のコンパイラが悪い? ヘッダファイルは「XC.h」と「htc.h」両方で試しました。 何か相性等があるのでしょうか。 【プログラム】 25ピンから電圧を出力するだけのプログラムに変更し確認しましたが動作しませんでした。 #include <xc.h> __CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_ON & CLKOUTEN_ON & IESO_OFF & FCMEN_OFF); __CONFIG(WRT_OFF & PLLEN_OFF & STVREN_OFF & LVP_OFF); #define _XTAL_FREQ 8000000 // クロック周波数設定 void main(void) { OSCCON = 0x70; // 8MHz INTOSC ANSELB = 0; // PORTBをデジタルに設定 TRISB = 0; // PORTBすべて出力モード /** メインループ 永久ループ **/ while(1) { RB5=1; } } 私なりに色々とネットで調べても解決しませんでした。 長文で、大変失礼ですが、ご回答下さると幸いです。

専門家に質問してみよう