• 締切済み

PICのLVD割込中のリセット回避

現在、PIC18F2550を使用してプログラムを組んでいます。 電源遮断前にEEPROMへ書込を行ってからシャットダウンできるように 大きめのコンデンサを使って充電し LVD機能を使用して割込を行い、アイドルモードにしたり内部クロックへの切り替え等の 省電力化をしてEEPROMへ書込を行っています。 電源を遮断して1秒程度してから電源を再投入すると 問題なく動くのですが、瞬断のようにOFF-ONを 瞬間的に行うと誤作動を起こしたように上手く作動しません。 恐らく、低電圧を検知してLVD割込に入って EEPROM書き込み等を完了する前に復電して 初期化リセットされる(初期化時にEEPROM読込エラーとなる?)ため ではないかと推測しています。 LVD割込時処理を完了するまで待機してから 初期化することが出来れば良いのですが どのように実現すれば良いか分かりません。 助言いただけますでしょうか。 出来ればプログラム書き換えだけで対応したいです。 MCLRポートはI/Oポートとして使用しているため 出来れば使用したくありません。 コンパイラはCCS社コンパイラを使用しています。 プログラムは全て書くと膨大になるのでLVD割込時のみ書きます。 要望があれば補足書き込みします。 よろしくお願いいたします。 // ==================== 電源遮断時処理 =========================== #int_lowvolt void Low_voltageDetect_isr() // low voltage detect interrupt routine { glLVDdetect = 1; while (PIR2bits.LVDIF) // check if LVDIF is set disable_interrupts(INT_EXT1); // INT1(RB1)割り込み禁止 入力信号 setup_oscillator(OSC_31KHZ | OSC_INTRC | OSC_IDLE_MODE); PIR2bits.LVDIF = 0; // set LVDIF to zero EEPROM_W(); // EEPROM書き込み }

みんなの回答

  • tadys
  • ベストアンサー率40% (856/2135)
回答No.3

リセットが掛かったときの RCON: レジスタのPOR、BORを確認してください。 もし、POR==0、BOR==1であれば、Brown-out Reset をオフにすると上手くいくでしょう。 BORの電圧はプログラムで選択できるので試してみても良いでしょう。 もし、POR==1であれば、Vdd電圧の変化によるリセットなので、回路で工夫するしかありません。 回答するには、具体的な回路情報が必要です

全文を見る
すると、全ての回答が全文表示されます。
  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.2

恐らくパワーオンリセットが上手くかからない為と思われます シャットダウン処理にて、RESET命令を実行してみては? (外部接続機器のリセットがかからない場合もあります) 参考 http://www.picfun.com/pic18/pic18xx04.html

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

Power ON Resetはソフトウエアではどうしようもありません。 ハード側で瞬断を防止する回路(Power OFF後一定時間電源の供給を絶つなど)を作るより無いでしょう。

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

関連するQ&A

  • PIC12F683 TMR2の割込がうまくいきませ

    タイトルのPICを使ってTMR2の割込動作を確認しているのですが、割込が全く掛かりません。 TMR2は単独で割込を掛けないで動作することは確認できましたがエラーもあるわけでもなく あれこれやっても解決せず迷走中です。また、割込ルーチンはこれまで動作が確認できたプログラムを埋め込んで使っているので問題はないと思っています。 何方かお助け頂けませんでしょうか。宜しくお願い致します。 ;******************************************* ; PIC初期設定 ;******************************************* START_INI BCF STATUS,RP0    ;BANK【0】 MOVLW 07h MOVWF CMCON0 ;GP0-2はデジタルIO BSF STATUS,RP0    ;BANK【1】 MOVLW B'0000000' MOVWF ANSEL ;A/D変換クロックF/2 デジタルI/O BCF OPTION_REG,7 ;GPIO端子をプルアップ MOVLW B'001000' ;RESET端子有効 MOVWF TRISIO ;GP0,1,2,4,5:OUT GPO3:IN MOVLW B'1000000' ;40h MOVWF OSCCON ;クロック=1MHz ;******************************************* ; TMR2の設定 ;******************************************* BCF STATUS,RP0    ;BANK【0】 MOVLW B'000101' ;ポス=1:1 TMR2=ON プリ=1:4 MOVWF T2CON ; BCF PIR1,TMR2IF    ;Timer2 割込み検出フラグをクリア BSF STATUS,RP0    ;BANK【1】 BSF PIE1,TMR2IE    ;Timer2 有効 MOVLW H'FA' ;250 MOVWF PR2    ;TRM2カウントSET ;******************************************* BCF STATUS,RP0     ;BANK【0】 CLRF TMR2 BSF INTCON,GIE     ;割り込み全体を有効

  • H8/3664でのEEPROMの使用について

    初歩的なことで申し訳ないのですが、H8/3664でEEPROMを使えずに困っています。EEPROMへの書き込み命令でプログラムがストップしてしまい、先へ進まなくなってしまいます。書き込み時間も考慮しており、回路にも問題はないと思われます。原因が全くわからず思案に暮れています。どなたかご指南いただけないでしょうか。お願いします。 ちなみに、プログラムはCで書いており、コンパイラはGDLを使用しております。よろしくお願いします。

  • PIC16F1827のEEPROMへの書込み

    PCM V5.0(PIC用CCS社コンパイラ)を Mplab8.92に組込み、PICkit3を使ってプログラムしています。 PIC16F1827のEEPROMへの書込みがうまくいきません。 RAは入力ポートで固定してあります。 RBは出力ポートでLEDが接続してあります。 テストプログラムは一回のみの動作です。 実機で動作させると RAは固定してあるので当然(4)でLEDが点灯しますが、 実機からCPUを抜き取りMplab上でReadすると EEPROMのアドレス0,1,2は異なるデータであり 動作させるたびに違うデータが書込まれています。 しかし (1) a0=35h (2) a1=a6h (3) a2=93h と定数にすると EEPROMのアドレス0,1,2は正しいデータが 書込まれています。 Q1. a0,a1,a2をポート入力とする場合は CPU自体に何か設定する必要があるのでしょうか? それともプログラムに工夫が必要なのでしょうか? いままで使っていたPIC16F88では このようなことはなかったと思うのですが・・・。 ----- テストプログラム ----- a0 = RA; //(1) write_eeprom (0,a0); a1 = RA; //(2) write_eeprom (1,a1); a2 = RA; //(3) write_eeprom (2,a2); if (a0 == a1 && a1==a2) //(4) RB =255; else RB =0;

  • picのタイマ1発振開始時間に関して

    マイコン Pic16F1939を使用して回路を組み、タイマ1を外部に取り付けた水晶で 動作させています(pic自体は内部オシレータで8MHzで動作させ、Timer1は正確な 1秒を取得するために使用しています) 使用している水晶は32768Hzの時計用のものです。 タイマ1が0.5秒ごとにオーバーフローするように設定し、割込みの関数で液晶の 点滅処理をおこなっています。 水晶の両端はそれぞれコンデンサが添付画像のような接続でつながっています。 また、関連部分のプログラムの抜き出しは以下のようになっています。 // 割込み処理 static void interrupt isr(void) { if (PIR1bits.TMR1IF) { // 32Khz水晶 割込み Int_Timer1(); } ~ 省略 ~ } // タイマー1割り込み(32khz水晶) : 0.5秒ごと void Int_Timer1(void) { PIR1bits.TMR1IF = 0; // 次の割り込み許可のためクリア // 0.5秒で次の割り込みが発生するように設定 TMR1H = 0b11000000; TMR1L = 0b00000000;     ~ 点滅処理 ~     ~省略~ return; } そして以下の初期設定用関数 InitTimer1()と InitInterrupt()を main()の始めに呼んでいます。 // Timer1 setting 32kHz , external crystal void InitTimer1(void) { T1CONbits.TMR1CS1 = 1; T1CONbits.TMR1CS0 = 0; T1CONbits.T1CKPS1 = 0; T1CONbits.T1CKPS0 = 0; T1CONbits.nT1SYNC = 1; T1CONbits.T1OSCEN = 1; T1CONbits.TMR1ON = 1; } // 割込み初期化 void InitInterrupt(void) { PIE1bits.TMR1IE=1; // enable timer 1 interrupt INTCONbits.PEIE=1; INTCONbits.GIE=1; } 質問なのですが、実際に液晶が点滅するまでに2秒ほどかかっています。 どこかのホームページでタイマ1の水晶の発振が安定するまでに 数msecかかるというような情報が書いてあったので、ずいぶん 遅いなと感じ2つのコンデンサの容量を10pF~200pFくらいのあいだで色々 変更して試しているのですが、2秒より早く点滅開始となることはありませんでした。 これは、上記プログラムの問題なのでしょうか? それとも2秒ほどかかって発振するのは仕方ない(Picの仕様)なのでしょうか? どなたかご存知の方いらっしゃいましたらご回答をお待ちしております。

  • PICのI2C通信を行っているときにタイマ割り込みはできますか?

    私はC言語(CCS-Cコンパイラを使用)でPICのプログラミングをしています。使用しているPICは16F877Aです。 いま学習リモコンを製作中なのですが、赤外線信号の学習方法としてベタ読みを(1kByte分)行うつもりです。その際、16F877AではデータメモリがEEPROMを合わせても1kByteには足りません。ということは、赤外線信号を39kHz毎にチェックしながら、1ページ分(64byte)信号データがたまったらI2C通信で外部EEPROMにページ書き込みをしなくてはいけない、と考えています。 そこで、「I2C用組み込み関数を使用して外部EEPROM(24LC256)にページ書き込みを行っている最中に、タイマ割り込みは使用できるのか?」また、「タイマ割り込みが使える場合、正確にI2C通信が行えるのか(データが欠けたりしないか)?」を教えてほしいんです。 もちろん、18F452を使用すればデータメモリだけで1kByteを超えるので、この問題は解決できます。しかし、できれば現在手元にあるものを使って作りたいので、どなたか分かる方がみえましたら、教えてください!

  • c18でのusart受信割り込み

    いつもお世話になっております。 pic18f14k50を使用して設計を行っています。 コンパイラはc18です。 usartで受信したときに割り込みを発生させ、規定の処理を実行したいのですが、割り込みが発生せずに困っております。 timer0を使用した割り込みの記述を行った場合は、割り込みは問題なく発生しました。 usart受信割り込みを以下のようなコードで行いたいのですが、間違いがわかる方がいらっしゃいましたら、ご指摘をお願い致します。 void main(){ TRISB=0x20; TRISC=0; OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH,10);     IPENbits.IPEN=0; IPR1bits.RCIP=1; PIE1bits.RCIE=1; INTCONbits.GIE=1; while(1){ } } #pragma interrupt isr #pragma code isrcode = 0x08 void jump_isr(void){ _asm goto isr _endasm } #pragma code void isr(void){ //割り込み関数 if (PIR1bits.RCIF == 1){ PIR1bits.RCIF =0;         処理; } }

  • PIC のデータEEPROMに書き込みができません

    お世話になります。 PICのデータEEPROMへの初歩的な書き込みができずに悩んでいます。 ご経験のある方、私の誤りについてご教示いただければありがたく思います。 PICについてはいくつかの種類でプログラムを書いていますがEEPROMのデータ領域は初めてです。 各種のサイトでは簡単らしいのですが・・・ 当方の試験作業は次のとおりです。 対象チップ PIC16F819 パソコン Windows-XP 書き込み装置 PIC-kit3 書き込みソフト MP-LAB IDE V8.83 プログラム言語 HI-TECH C V9.83 電源 Pic-Kit3から5Vで供給 確認方法 ・MP-LAB- View- EEPROM- のFillmemoryにより、EEPROMにすべてFFH/00Hのいずれもが書き込めることを確認の上、256バイトすべてにFFH ・下記プログラムを走らせる (実行後1秒後に1回書き込み(十進15番地に十進20の例)、以降ランプの点滅。ランプの状態でひとまずの動作の正常は確認) ・MP-LAB- View- EEPROM- により確認・・(全部FFHのまま(泣)) そのほか、チップを新品に交換したり、書き込み時間をEEIFで検査するアルゴリズムにしてみたり、いろいろやってみましたが、壁にぶつかっています。 よろしくお願いいたします。 #include<htc.h> #ifndef _XTAL_FREQ #define _XTAL_FREQ 4000000 #endif __CONFIG(CP_OFF & BOREN_OFF & MCLRE_OFF & PWRTE_ON & LVP_OFF & WDTE_OFF & FOSC_INTOSCIO & DEBUG_OFF & CPD_OFF); void main() { OPTION_REG = 0b00000000; // output pullup OSCCON = 0b01100100; // internal OSC 4MHz TRISA = 0b11111110; // GP-A input RA7=output ADCON1 = 0b10000111; // No AD all digital TRISB = 0b00000000; // GP-B output INTCON = 0b00000000; // no interrupt RB1 = 0;    //Green Lamp off RB3 = 0; //Red Lamp off while (WR = 1) { __delay_ms(1000); } EEADR = 15; EEDATA = 20; EEPGD = 0; GIE = 0; WREN = 1; EECON2 = 0x55; EECON2 = 0xaa; WR = 1;      RB1 = 1; // Green Lamp __delay_ms(100);      RB1 = 0;     GIE = 1;  WREN = 0; EWWW:; // IDLE Lamp Red RB3 = 1; __delay_ms(400); RB3 = 0; __delay_ms(500); goto EWWW; }

  • JTAGによるオンボードでの書き込みエラーについて

    JTAGによるオンボードでFPGA経由でEEPROMにプログラムを書込みたいのですが、うまく書き込みができません。 FPGAはALTERAのCYCLONE?、EEPROMはALTERAのEPCS1を使用し、USBブラスター にてPCから書込みします。 使用していますデバイスは、上記と全く同じものを実装しています違う基板では書込みできます。 書込みできない基板と出来る基板は違う基板の為、パターンは違いますが、 書込みに関係するパターンはほとんど同じです。 (基板の電源やGNDのパターンの引き回しは違います) このような経験のある方、ぜひご教示願います。

  • Atmel Studioのeepromアドレス

    現在Atmel Studio6.2でATmega88pマイコンのプログラミングを行っています。 https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/head/branches/test002_AVRS6_20140819/test02/test02/src/main.c AVR studio4.19 + winAVR Cコンパイラで作成していたコードをAtmel Studio6.2に移してコンパイルを行ったところ、EEPROMアドレスへのデータ書き込みが逆になってしまう現象が起きました。 #define EEPROM __attribute__((section(".eeprom"))) ctl_data EEPROM gctl_data; reg_slave EEPROM greg_slave[100]; int EEPROM eprom_level[14]; char EEPROM eprom_fixid[3]; char EEPROM test_mode; char EEPROM monitor_state; int EEPROM wdt_cnt; int EEPROM cnt_loop_break; このようなコードを”AVR studio4.19 + winAVR”の時からしているのですが、このときは ctl_data EEPROM gctl_data; こちらがEEPROMアドレスの0x0000番地から始まっていたのですが、Atmel Studio6.2の場合は、 int EEPROM cnt_loop_break; こちら側が0x0000番地に配置するようになっていて、逆になってしまっています。 この場合、一番最初のアドレスに割り当てするには、コードも逆にして記述する必要がありますでしょうか? どうぞ、ご教示頂きますようお願いいたします。

  • ICが壊れたのでしょうか(PIC)

    PIC16F873Aを秋月のライターで書き込もうとするとソケットにICが正しく挿入されていませんのようなコメントが出てしまいます。 ICはボードにはんだ付けしてありケーブルをゼロプレッシャーソケットに接続したオンボードの書き込みをしています。 DIPICをライターのソケットにはめると書き込み可能でライターが壊れているわけではないです。ケーブルも他のボードを使用すると書き込めます。ボードの配線もVpp、PGD、PGC、OSC1、Vssの導通しているので問題はなさそうです。Vddが足りないかなとも思いましたが安定化電源使っても変わりませんでした。 となるとやはりICが壊れたのでしょうか?一番思い当たるのはSOPのICを無理やりユニバーサル基板(1.27mmピッチ:ピン間隔は同じ)にはんだ付けしたことくらいです。熱のかけすぎでしょうか? ICの直付けはロジック等をのぞいては行わないので熱で壊したことはあまりないのですがこういうものなのでしょうか。