外出自粛中でも楽しく過ごす!QAまとめ>>

PICを始めたばかりの初心者です。
PICの内部プログラムメモリが容量小の為、外部に容量大のプログラムメモリを置きたいのですが、外部EEPROMにプログラムを書き込み、内部EEPROMに変換プログラムの様なモノを書き込んで動作させることは出来ないのでしょうか?よろしくお願い致します。

A 回答 (1件)

可能です。

昔のコンピューターでは外部磁気テープドライブに拡張プログラムを置いて、次々とプログラムを読み直しながら処理していました。
ただし、PICの場合苦労する割りに報われません。
外部EEPROMのプログラムを読み込むとして、実行するためには内部EEPROMにコピーしなければなりません。RAMにコピーしてもいいのですが、EEPROM以上に狭いのが問題です。
EEPROMの広いPICをご検討ください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPIC のデータ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;

}

お世話になります。
PICのデータEEPROMへの初歩的な書き込みができずに悩んでいます。
ご経験のある方、私の誤りについてご教示いただければありがたく思います。

PICについてはいくつかの種類でプログラムを書いていますがEEPROMのデータ領域は初めてです。
各種のサイトでは簡単らしいのですが・・・

当方の試験作業は次のとおりです。

対象チップ PIC16F819
パソコン Windows-XP
書き込み装置 PIC-kit3
書き込みソフト MP-LAB IDE V8.83
プログラム言語 HI-TECH C V9.83
電源 Pic-Kit3から5Vで供...続きを読む

Aベストアンサー

<Read EEPROM> コマンドを実行していますか? pic_eeprom -> MPLAB
また出力されたアセンブルリストを確認してみては

http://sdr-de-bcl.blog.so-net.ne.jp/2010-03-27
http://sfukuda.at.webry.info/201112/article_10.html

参考URL:http://www.robotsfx.com/robot/robohow/RoboHow106/RoboHow106.html

QPICはアセンブラとC言語のどちらにすればよいですか

PICマイコンをはじめるにあたって、アセンブラかC言語、どちらにしようか迷っていたところ、下記の知恵袋で「まだ、C言語に手を出していないのであれば、絶対にアセンブラーから学んで下さい。」

ttp://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1386032198

と、書いてありました。実は以前よりC言語を勉強していたのですが、どちらにすればよいですか?
詳しくは上のサイトを見て頂きたいのですが、この知恵袋の回答者の方が言う「構造体・ポインター」の直前、アドレス・バイトとビット付近で現在つまずいていて、PICとまとめてC言語の書籍で補おうとしていたのですが、タイミングとしてはちょうど良いでしょうか?

C言語のレベルとしては、プログラミングで必ず出てくる、文章表示と繰り返し・条件分岐・論理演算くらいしかわかりません。

C言語とアセンブラ、現在の自分にどちらの方が適当かご教示ください。

Aベストアンサー

「繰り返し・条件分岐・論理演算」が分かっているならとりあえずプログラミングの入門は済んでいるようですね。この辺でアセンブラに手を出すのは面白いと思います。

ただ、アセンブラを学ぶにあたってPICマイコンは最悪です。
kabasanさんも「苦行以外の何物でもなく」とおっしゃっていますが、PICのアーキテクチャ(構造)は最近の流行から外れており、非常に癖があります。
私もPICはよく使っていますが、パズルとしての楽しさを求めてアセンブラを書いているように思います。
癖の詳細については割愛しますが、ざっと言うと「レジスタが1つのみ」「命令とデータのアドレスが別」「命令数が35個などと少ない」あたり。
なおこれはPICのうち、ベースライン・ミッドレンジ・Enhancedミッドレンジ・ハイエンド(PIC18)に当てはまります。
他の、PIC24・PIC32については上記の癖はありませんが、これらのPICはマイナーなので、あえてそれらを選ぶ理由はないように思います。
(PICを選ぶ理由は情報の多さと入手性のよさが主なので)

命令セットが素直なマイコンとしては、AVRマイコンが良いでしょう。PICに比べて情報が少ないのが難点ですが。
またARM(特にThumb命令セットのCortexM0(+)あたり)もよいですが、こちらも情報が少ないですし高性能なゆえの難解さがあります。
マイコンにかぎらずアセンブラを学びたいならx86という手もなきにしもあらず。命令セットは非常に複雑ですが、その分かゆいところに手が届く便利さがあります。情報が多いのも嬉しいところ。

「繰り返し・条件分岐・論理演算」が分かっているならとりあえずプログラミングの入門は済んでいるようですね。この辺でアセンブラに手を出すのは面白いと思います。

ただ、アセンブラを学ぶにあたってPICマイコンは最悪です。
kabasanさんも「苦行以外の何物でもなく」とおっしゃっていますが、PICのアーキテクチャ(構造)は最近の流行から外れており、非常に癖があります。
私もPICはよく使っていますが、パズルとしての楽しさを求めてアセンブラを書いているように思います。
癖の詳細については割愛しますが、...続きを読む

QPICに書き込むプログラムや変数の容量を少なくする方法

16f877のpicマイコンでプログラミング作業を行っています
もともとPC上でのソフト開発がメインだったので
マイコンプログラムはいろいろ制約があり大変です

現在C言語によってプログラムを書いているんですが
ccscでコンパイルすると容量不足でエラーがでます
not enough ram for valiaホニャララ

等がよく出ます。

マニュアルを読むと変数を減らせとかいろいろ書いてありますが
減らしても改善できません。
知人に聞くとアセンブラで書くといいよと言われましたが
アセンブラはわからないのでCじゃないとだめです

なにか容量をあまり取らないコーディングやその他のテクニックをご存知の方
教えてください、お願いします。

また、参考になる書籍やURL等がありましたら教えてください

Aベストアンサー

PICでRAM利用領域を減らそうとするなら、
1.グローバル変数をできるだけ利用しない
2.ローカル変数も最小限に
3.不必要な関数コールをやめる
4.ネストの多いループは極力減らす。
5.変数である必要のない内容はCONST定義を行ってフラッシュ内に移動する
6.正否判定のためのintはshortを利用して圧縮する

という感じでしょうか。
他のマイコンと異なり、汎用レジスタが1つしかなくスタックも7段が最大という特徴をうまくごまかすために
CCSでは究極の最適化を行っています。
ただ、このため不必要なバンクの切り替えやRAM利用も増えるわけで、思った以上に消費されているのが実情です。

Qテスターで電池残量を測るためにはどうしたら良いですか?

テスターで電池残量を測るためにはどうしたら良いですか?

大昔、電池残量を測るための機械を使ったことがあります。
恐らく、電池の電圧か電流を測定することで、現在何%残量があるか測るものだったと思います。
今、手元にテスターがあるのです、このテスターを使って電池の残量を測れないかと考えております。
検索してみると
http://oshiete.goo.ne.jp/qa/2385342.html

電圧ではなく、適当な抵抗器を直列に接続し、流れる電流量を測定すれば良いと書かれているページが見つかりました。
しかしながら、具体的に何Ωの抵抗器を使うかということまでは書かれていませんでした。

具体的にどうやってテスターを用いて乾電池の残量を調べられるのでしょうか?

実際、いま測定したいと考えている乾電池は単3です。

上記のページには、単一なら300mA位で、単三なら100mA位、と書かれていますが、
乾電池の大きさによらず、電圧値は同じなので、同じ抵抗器を繋げば同じ電流量が流れると思うのですが、
乾電池の大きさによって判定の仕方が異なるのでしょうか?

どなたか詳しい方がおられたら教えて下さい。

テスターで電池残量を測るためにはどうしたら良いですか?

大昔、電池残量を測るための機械を使ったことがあります。
恐らく、電池の電圧か電流を測定することで、現在何%残量があるか測るものだったと思います。
今、手元にテスターがあるのです、このテスターを使って電池の残量を測れないかと考えております。
検索してみると
http://oshiete.goo.ne.jp/qa/2385342.html

電圧ではなく、適当な抵抗器を直列に接続し、流れる電流量を測定すれば良いと書かれているページが見つかりました。
しかしながら、具体...続きを読む

Aベストアンサー

テスターで、電池残量は測定できません。
起電力(解放時の電圧)を測って、目安にしているだけです。
使用するに合わせて、内部抵抗が大きくなり、解放電圧は十分でも、大きな電流を取り出そうとすると電圧降下が大きくなり、使用に耐えなくなります(微弱電流で作動する機器には使用可能)。
>適当な抵抗器を直列に接続・・・。
残量というより、能力のチェックです。
可変抵抗を使い、抵抗値を下げて行き、抵抗の端子間電圧が定格(1.5V)を保って、何アンペア流せるか(新品との比較で判断する)、定格(1.5V)を下回ると、それは内部抵抗による電圧降下です。
>乾電池の大きさによらず、電圧値は同じなので、同じ抵抗器を繋げば同じ電流量が流れる。
内部抵抗が同じならそのとうりです、・・・んが、大きくなれば、極板の面積も大きくなり、内部抵抗が小さくなります。
その状態で、電圧を測れば、単三の電圧が低くなっています(内部抵抗による電圧降下)。
※ E=IR 1.5=0.3R   抵抗は5オームです。

Q三端子レギュレーターで12Vから5Vと3.3V

三端子レギュレーターで12Vから5Vと3.3Vを作り出す場合、この回路でいいですか?
LM7805にはヒートシンクをつける予定です。

全体的にダメ出しという感じでアドバイス頂ければうれしいです。
また、コンデンサーの容量というか、例えばチップコンデンサーでも使用できますか?
D1とD2は電源を切った際に出力側に残った電気を逃がすためのものですが、12V側で電源のON/OFFをする場合でもあったほうがいいですか?

-条件
電源12VDC
5VにはATMEGA328P(Arduino)など(MAX200mA)
3.3VにはLCDモジュール(3.3V/5mA)
+-逆に接続した場合の事を考えて、ダイオード(D3)を入れています。
負荷がショートした場合の安全を考えて、ポリスイッチPS1(500mA)をつけています。



-調べたこと
LM7805について
  マニュアルに記載されている値
   入力側コンデンサー 0.33μF
   出力側コンデンサー 0.1μF

XC6202P332TBについて
  マニュアルに記載されている値
   入力側コンデンサー 1μF
   出力側コンデンサー 1μF

それではアドバイスの程、よろしくお願い致します。

三端子レギュレーターで12Vから5Vと3.3Vを作り出す場合、この回路でいいですか?
LM7805にはヒートシンクをつける予定です。

全体的にダメ出しという感じでアドバイス頂ければうれしいです。
また、コンデンサーの容量というか、例えばチップコンデンサーでも使用できますか?
D1とD2は電源を切った際に出力側に残った電気を逃がすためのものですが、12V側で電源のON/OFFをする場合でもあったほうがいいですか?

-条件
電源12VDC
5VにはATMEGA328P(Arduino)など(MAX200mA)
3.3VにはLCDモジュール(3.3V/...続きを読む

Aベストアンサー

1)D1とD2は電源を切った際に出力側に残った電気を逃がすためのものですが、12V側で電源のON/OFFをする場合でもあったほうがいいですか?

D3だけ逆接続対策で入れておおけばいいと思います。

2)負荷がショートした場合の安全を考えて、ポリスイッチPS1(500mA)をつけています。

 両方の3端子電源ICは出力ショート保護機能が入っているので不要です。

3)コンデンサについて

 a)入力の12Vラインには100uF程度の電解コンデンサを入れた方が良い。
 b)5V出力のC3は10uF以上にした方が良い。
 c)3.3V出力のコンデンサC4(1uF)はセラミックコンデンサにして値はこのままで大きな値に変更しないこと。大きくすると発振してしまう危険があります。XC6202P332TBは内部の出力トランジスタがドレイン出力タイプのため負荷容量の影響に敏感です。

4)配線
  つなげてはいけない箇所は添付図で×で示しましたのでカットしてください。
  つなげるべきラインはオレンジの線で示してあります。

QPICシリアル通信での入出力送信方法

現在PIC勉強中の初心者です。
教えて頂きたいのですが、

現在PIC16F877Aを2台使用して相互間をシリアル通信で結び、
一台のPICからの入力12点を二台目のPICの出力12点に出力するプログラムを作成中です。
現在は通信で1点の入力をうけ1点の出力にだすところまでは何とかできました。

そこで調べても合理的で良いやりかたが見つからなかったのでよく御存じの方に教えて頂きたいのですが、
12点の入力をどのようなやり方でまとめ、シリアル通信で送り、どのようなやり方で展開し12点の出力を出すのか良いやり方がありましたら教えて下さい。
(入力はRA,RE,RC,RDを使い、出力はRB,RC,RDを使用してます)
(自分としては2進数でまとめて2つ送ったらわかりやすいのではないかと思っているのですが..)

Aベストアンサー

PICも含めて、いかなる組込みマイコンでシリアル通信を行う場合でも、その内蔵のシリアル通信機能を使えば、比較的簡単に「送信」する事は誰でも可能です。

問題は、シリアルデーターの2バイト以上の受信です。
(1)その内蔵のシリアル通信機能で、いつ来るか判らない「受信データー」を絶えず環視している必要が有る。->つまり割込処理とするか、あるいは絶えず受信のプログラムを優先的に動かしている必要があるという事です。

(2)内蔵機能であろうが、プログラムでのシリアル受信であろうが、1バイト以上連続して何バイトもデーターが送られて来る様な場合には、その間髪入れずに送られてくるバイトデーターを、取りこぼす事無く、次々と記憶する領域(バッファー)が必要となります。

PICの内蔵シリアル受信機能には、バイトバッファを2個持っています。つまり、2個までは連続したバイトデーターを取りこぼしする事無く自動で受信できますが、それ以上連続したバイトを受信すると、取りこぼしを起こすという事です。

今回は、2バイトで済むので、特に問題なく受信が可能と思いますが、あまりにも、通信のノイズに対する防御が無くて、今後のためにも、そのままの受信はお薦めできません。

詳しくは、下記サイトにPICでのシリアル通信で、割込型ソフトウエアFIFOバッファについて、やさしく詳しく教えています。

ご参照ください。これを知らないと、2バイト以上の受信が全てのマイコンで出来ません。
「パレットソフト」
http://www.palettesoft.co.jp/index.htm
HOME > 技術談話 > PIC microcontroller > シリアル通信

頑張って下さいね。

PICも含めて、いかなる組込みマイコンでシリアル通信を行う場合でも、その内蔵のシリアル通信機能を使えば、比較的簡単に「送信」する事は誰でも可能です。

問題は、シリアルデーターの2バイト以上の受信です。
(1)その内蔵のシリアル通信機能で、いつ来るか判らない「受信データー」を絶えず環視している必要が有る。->つまり割込処理とするか、あるいは絶えず受信のプログラムを優先的に動かしている必要があるという事です。

(2)内蔵機能であろうが、プログラムでのシリアル受信であろうが、1バイト...続きを読む


人気Q&Aランキング