• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PIC mainループについて)

PIC mainループでRAMの値がクリアされる問題について

naw_okの回答

  • naw_ok
  • ベストアンサー率100% (1/1)
回答No.5

main関数が終わる事は、そのプログラムを全て終わす事です。 一般にmain関数の作りは、初期処理を行った後にループするロジック が入り、そのロジック内で再処理の方法や、終了判定を行う様に作ります。 終了判定された場合等に、後処理を行ったり直接main関数の最後を実行します。 break関数、return関数、exit関数やgoto命令でも制御を移行出来ます。  従って、再処理やタイミング取りは、main関数の頭には戻らず、ループロジック内 や割込みルーチン等を利用して行う様に作ります。

関連するQ&A

  • PICマイコンのプログラムカウンタの操作法は?(C言語)

    HI-TechのPICC PRO 9.65を使ってPIC16F877Aのプログラミングをしています。 しかし、最近マイコンの動作が不安定になり、突然プログラムが暴走したりするので、プログラムカウンタに問題があると疑っています。 昔、アセンブラでプログラムしていた頃はPCLATHに書き込んでからPCLに書き込んだり、ORG命令などで対処していましたが、今回初めてPICCを導入したので対処の仕方がわかりません。 またCコンパイラによっては自動でPCLATHを繰り上げてくれるようなのですが、PICCの場合はどうなのでしょうか。 hexを除いてみると0x0800のあたりもびっしりコードでうまっているのですが。。。 ちなみに asm("ORG 0x0800"); などのようにC言語の中にアセンブラで記述してもうまく解決できませんでした。 PCLATH = PCLATH + 0b000?????; とか色々やってみたのですがだめでした。 そもそもヘッダやインクルードの内容がどの番地に書き込まれているかを調べる良い方法はないでしょうか。 1.PICCはPCの操作を自動でやってくれているのか 2.もしそうでなければどのようにして解決すればよいのか で宜しくお願い致します。

  • PICについて

    今PICでの電子工作をやり始めた初心者なのですが、 急にプログラムを書き込んでもLEDが光らなくなりました。 回路などはまったくいじってないです。 プログラムは基本的なプログラムです。 テキストに沿ってやっているので。 LIST P=PIC16F84A INCLUDE P16F84A.INC __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF BSF STATUS, RP0 CLRF TRISA CLRF TRISB BCF STATUS, RP0 MOVLW B'00001111' MOVWF PORTB LOOP GOTO LOOP END プログラムに間違いはないと思います。 きちんとアセンブルもされておりますので。 アセンブルにはMPLAB IDEを使っています。 原因をさぐってみてもわからなかったのですが、 レジスタの値を確認してみたところ、 アドレスが0006のところの値がすべて00となっておりテキストと違う値となっておりました。 これが原因かなと思うのですが、これはうまくアセンブルされていないということでしょうか? アセンブルした結果は次の通りです。ちゃんと成功しているみたいです。 ですが、きちんとLEDが点灯していたときと比べてやたらとWarningの文字が多いような気がします。 初心者でもわかりやすいようにわかる方がいましたらどなたか教えてください。 よろしくお願いします。 Clean: Deleting intermediary and output files. Clean: Deleted file "STEP10.err". Clean: Deleted file "C:\PIC_program\STEP10.cod". Clean: Deleted file "C:\PIC_program\STEP10.hex". Clean: Deleted file "STEP10.lst". Clean: Done. Executing: "C:\Program Files\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F84A "STEP10.asm" /l"STEP10.lst" /e"STEP10.err" Warning[205] C:\PIC_PROGRAM\STEP10.ASM 1 : Found directive in column 1. (LIST) Warning[205] C:\PIC_PROGRAM\STEP10.ASM 2 : Found directive in column 1. (INCLUDE) Warning[205] C:\PIC_PROGRAM\STEP10.ASM 4 : Found directive in column 1. (__CONFIG) Warning[203] C:\PIC_PROGRAM\STEP10.ASM 6 : Found opcode in column 1. (BSF) Warning[203] C:\PIC_PROGRAM\STEP10.ASM 7 : Found opcode in column 1. (CLRF) Message[302] C:\PIC_PROGRAM\STEP10.ASM 7 : Register in operand not in bank 0. Ensure that bank bits are correct. Warning[203] C:\PIC_PROGRAM\STEP10.ASM 8 : Found opcode in column 1. (CLRF) Message[302] C:\PIC_PROGRAM\STEP10.ASM 8 : Register in operand not in bank 0. Ensure that bank bits are correct. Warning[203] C:\PIC_PROGRAM\STEP10.ASM 9 : Found opcode in column 1. (BCF) Warning[203] C:\PIC_PROGRAM\STEP10.ASM 11 : Found opcode in column 1. (MOVLW) Warning[203] C:\PIC_PROGRAM\STEP10.ASM 12 : Found opcode in column 1. (MOVWF) Loaded C:\PIC_program\STEP10.COD. BUILD SUCCEEDED: Sat Nov 20 19:57:55 2010

  • PICの動作不安定

    PIC16f886を用いて回路を作成しています。 PICにはLCD(SC1602)と動作確認用のLED1個を接続し、PICKIT2を用いてICSPでプログラムを書き込んでいます。 LCDに文字を表示するプログラムと、LOOP内でLEDを0.5sec間隔でLEDを点滅させるだけのプログラムを作成、書き込んだところ問題なく動作しました。 ICSP回路に差し込んであるPICKIT2を抜いて電源を入れるとLCDの表示が途中で停止し、PIC自体も停止しているようです。 再度PICKIT2をICSP回路に差し込んで電源を入れると正常に動作します。 上記の様な症状はどういったことが原因で発生すると考えられるでしょうか? また、対処方法などありましたらご教授宜しく御願い致します。

  • PICのコンフィグレーションワードの書き方

    MPLAB + PICC-Lite + PICkit2 で PIC16F877(20MHz)を使用しようとしています。 今まで、16F627Aを使用していて、今回が初めての16F877です。最初にDポートのLED4つを点滅させるプログラムを実行しようとしました。 最初、ディパッガーでも動かなかったのですが、MPLAB IDEのConfigureメニューのConfiguration BitsをHSに変更したら動きました。 ところがPICkitを外して、16F877単体で動きません。 おそらく、コンフィグレーションワードで、HSを書き込まなければだめらしいということは、わかったのですが、その書き方がわかりません。 現在のソースファイルは以下の通りです。 ----------------------- #include <pic.h> void delay(void) { unsigned char i, j; for (i = 0; i < 254; i++) { for (j = 0; j < 254; j++) { } } } void main(void) { TRISD = 0; unsigned char led = 0x01; do { PORTD = led; if (led == 0x08) { led = 0x01; } else { led <<= 1; } delay(); } while (1); }

  • 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; } } 私なりに色々とネットで調べても解決しませんでした。 長文で、大変失礼ですが、ご回答下さると幸いです。

  • PIC CLITEでデジタルカウンタを作りたい

    7セグLEDを使って,押しボタンスイッチの押した回数(0~9)を7セグで表示するプログラムをHitec社のPIC CLiteで作りたいのですが,押しボタンを押しても回数がランダムで表示されてしまいます.どういったところを直したらいいでしょうか? ***プログラム*** ボタンスイッチを押したぶんだけ数値をカウントする main{ while(1){ if(RA0==0){   …押しボタンのポート ++a; { if(a>=10){   …10回押したら0になる a=0; } ↓7セグに出力 RB4=a%2; RB5=(a/2)%2; RB6=(a/4)%2; RB7=a/4; } }

  • PIC12F1822で内部クロックが使えない

    表題のとおりPIC1F1822+CCS-Cで開発していますが、内部クロックの32MHzが使えません。 setup_oscillator(OSC_32MHZ);と記載した行でエラーが出て16MHzだと動きます。 C:\Program Files\PICC\Devicesにある12f1822.hを見てみるとOSC_32MHZが存在しないことに気がつきました。このコンパイラでは32MHzに対応していないんでしょうか?どなたかご教授願います。

  • 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のCCSコンパイラでのlong

    現在、PIC16f690のプログラムをCCS社のコンパイラを用いて作成しています。 longの変数に数値を入れ、それをPCにシリアル通信で表示しています。 long digi1; long digi2; digi1 = 500; digi2 = 500; printf("%lu",digi1); printf("%lu",digi2); 上記のような時、digi1の値はPCの通信ソフトでは,500と表示されます。 しかし、disi2は244と表示されます。 多分ですが、500 - 256 = 244 でint がオーバーフローしたような状態になっていると推測されます。 変数をlongで宣言しているのに、上記のようなことはありえるのでしょうか? コンパイラのバグでしょうか? なにかお分かりになられる方がいらっしゃいましたら、何卒ご教授よろしくお願い致します。

  • PIC16F819のADC機能について

     PIC16F819のA/D変換プログラムをC言語で作りたいのですが、参考になるサイトや本がないのでどこから手をつけていいのかまったく分かりません。  試しにPICC Compilerの期間限定版をダウンロードして、その中にあったサンプルプログラムを見てみました。PIC16F87X用のADCのサンプルプログラムがあったので、とりあえずMPLABでコンパイルしてみましたが、ADGOの部分でエラーが出てしまいました。どうもPIC16F819ではADGOが使用できないようですが、どうすれば改善されるのでしょうか?  分かる方がいましたら、御教授よろしくおねがいします。 サンプルプログラム #include <pic.h> __CONFIG(DEBUGEN&WDTDIS&LVPDIS); /***Sample code to set up the A2D module********/ void init_a2d(void){ ADCON0=0; ADCON1=0; ADON=1; } /***Return an 8 bit result**********************/ unsigned char read_a2d(unsigned char channel){ channel&=0x07; ADCON0&=0xC5; ADCON0|=(channel<<3); ADGO=1; while(ADGO)continue; return(ADRESH); } /***Main関数*************************************/ void main(void){ unsigned char x; init_a2d(); GIE=0; TRISB=0xF0; for(;;){ x=read_a2d(1); PORTB=(8>>(x>>6)); } }