- 5767. エラーの内容を教えて下さい [ナルト] 2005/08/05 20:40
- はじめまして。
アセンブラでプログラムを作っている者です。
下にあるエラーの意味をどなたか教えて頂けないでしょうか?
対策はどのようにすれば宜しいのでしょうか?
どなたか宜しくお願いします。
Message[306] C:\PROGRA~\test.ASM 813 : Crossing page boundary -- ensure page bits are set.
Message[305] C:\PROGRA~\test.ASM 244 : Using default destination of 1 (file).
- 5768. Re: エラーの内容を教えて下さい [CHOBI] 2005/08/05 22:17
- >はじめまして。
>アセンブラでプログラムを作っている者です。
>下にあるエラーの意味をどなたか教えて頂けないでしょうか?
>対策はどのようにすれば宜しいのでしょうか?
>どなたか宜しくお願いします。
>Message[306] C:\PROGRA~\test.ASM 813 : Crossing page boundary -- ensure page bits are set.
PIC16F87xなどの複数のページをもった機種では、GOTO命令やCALL命令を使う際、HIGH擬似命令を使ってPCLATHをセットしてやるのが基本です。サブルーチンを同じバンクに集めてorg命令でアドレスを固定してしまう手もあります。またリローケータブル命令を使用してサブルーチンをリロケータブルに書けばMPASMが処理してくれます。
FROM http://www.geocities.jp/michi_kou/faq.htm#Q27
>
>Message[305] C:\PROGRA~\test.ASM 244 : Using default destination of 1 (file).
プログラム上でdestination(格納先)を明確に指定
しましょう。(私も良く忘れてこのメッセージがでます)
(^_^;)
- 5771. エラー [ナルト] 2005/08/06 01:45
- 回答ありがとうございます。
1番目のエラーは、プログラムのサイズが大き過ぎてエラーが起きてるのかなと勘違いしてました。
いらない部分のプログラムをいくらか削除したら、
1番目のエラーは表れなくなってたので。
(ちなみに、今はHexファイルで12KBです。)
GOTO命令やCALL命令を使う場合は、サブルーチンでBANKの切替を行うのは良くないってことですか?
「HIGH擬似命令を使ってPCLATHをセットしてやるのが基本です。」とありますが、
このPCLATHについて勉強するにあたり、このHP以外でお勧めのHPなどがあれば教えて頂けないでしょうか??
この辺りがよく理解できていないので、
もっと勉強してみたいと思います。
また宜しくお願い致します。
- 5772. 投稿者削除 [ ] 2005/08/06 02:12
-
- 5773. ページとPCLATHについて [新参者] 2005/08/06 02:18
http://www.picfun.com/memframe.html
- >「HIGH擬似命令を使ってPCLATHをセットしてやるのが基本です。」とありますが、
>このPCLATHについて勉強するにあたり、このHP以外でお勧めのHPなどがあれば教えて頂けないでしょうか??
>この辺りがよく理解できていないので、
>もっと勉強してみたいと思います。
このHP内に詳しく書かれてますよぉ。
http://www.picfun.com/memory02.html
因みにレジスタ・データメモリ(RAM)領域の区切りはバンク(Bank)、
プログラム(ROM)領域の区切りはページ(Page)と呼び分けましょう。
- 5774. Re: エラー [JO_O] 2005/08/06 02:23
- 毎度JOです。
アセンブルが排出するリストファイルを見てみましょう。
いろんな情報が入っています。
- 5842. ページの割当て方 [ナルト] 2005/08/15 11:54
- MPLAB(Ver 4.12.12)を使用して、現在あるプログラムに、
http://www.picfun.com/memory02.htmlに記載されている
【プログラミングテクニック】の
(1) 別のPAGEのサブルーチンをCALLする方法
(2) 直接PCLATHを設定する方法
のどちらかを付加して試しているのですが、
両方ともうまくいきません。
[STEP]でプログラムを走らせていくと、
(1)or(2)のプログラムを走らせたあとに、
「Program Memory Window」が表示されます。
{(1)or(2)を今あるプログラムに付加せずにプログラムを走らせると、
「Program Memory Window」は表示されません。
正常に動作してます。}
そこで、質問したいのですが、
ページ0以外のページにプログラムを配置したい場合は、
MPLABで自動的にページを割り当ててくれるんですか?
ページの割り当て方もよく分かってません。
メインのASMファイルの中に下記のプログラムを書いても上手くいきません。
MAIN(今あるプログラム)
MOVLWHIGH (TEST1)
MOVWFPCLATH ;上位をPCLATHへ
CALLSUB_1
GOTOMAIN
ORG 0x900;page1
TEST1サブルーチンの内容
RETURN
END
メインのASMファイルの中に下記のようにインクルードさせてるのは問題ないですよね?
INCLUDE<REI1.ASM>
INCLUDE<REI2.ASM>
他に注意点などがあれば教えてもらえないでしょうか?
宜しくお願いします。
- 5843. Re: ページの割当て方 [DANGAN4] 2005/08/15 13:48
- >ページ0以外のページにプログラムを配置したい場合は、
>MPLABで自動的にページを割り当ててくれるんですか?
>ページの割り当て方もよく分かってません。
MPLAB v7.20 の場合ですが、リンカスクリプトファイル 16f877.lkr をプロジェクトに加えてページを割り当ててもらう方法もあります。
以下は この場合の例ですが、基本的にORGは使用しません。
STARTUP CODE ;org 0 と同じと思えば良い
goto start ;初期化処理への goto
nop
nop
nop
goto intope ;割り込み処理への goto
PROG1 CODE ;ここから page0 に割り当てられる
intope
割り込み処理を記述
retfie
start
電源投入直後の初期化処理を記述
main
メインの処理を記述
pagesel sub1 ;PAGE1 へ切り替え
call sub1 ;PAGE1 のルーチンをCALL
pagesel main ;PAGE0 へ切り替え
goto main
PROG2 CODE ;ここから PAGE1 に配置
sub1
サブルーチン
return
リンカスクリプトファイル 16f877.lkr の中身を見てみると解りやすいでしょう。
- 5846. Re: ページの割当て方 (PCLATH扱いエラーの原因) [新参者] 2005/08/15 17:10
- >メインのASMファイルの中に下記のプログラムを書いても上手くいきません。
>MAIN(今あるプログラム)
>MOVLWHIGH (TEST1)
>MOVWFPCLATH ;上位をPCLATHへ
>CALLSUB_1
>GOTOMAIN
>
>ORG 0x900;page1
>TEST1サブルーチンの内容
>RETURN
>END
「Program Memory Window」が表示される直接的な原因は
PCLATHを(Page1へ)操作したままCALLから復帰後も元に戻していないので
次の GOTO命令(GOTO MAIN)で誤って不正アドレス(おそらくPage1の未使用領域)へ
ジャンプしているからでしょう。
「Program Memory Window」の示すアドレスに注目すれば判る筈
; CALL SUB_1 ;←間違いでしょ?
CALL TEST1
; CLRF PCLATH ;Page0指定
; BCF PCLATH,3;Page1→Page0
pagesel MAIN;PCLATHをMAINのあるPage0へ戻す
GOTO MAIN
上のように CLRF PCLATH や pagesel MAIN などで
PCLATHを元に戻す必要があるわけです。
ページの割当て方については DANGAN4さんの書かれているようにする方法もありますね。
一応、自分で意識的に割当てる方法について書こうかと思ったけど…何も特別なことはありません。
http://www.picfun.com/memory02.html 【プログラムメモリの構造】に書かれている通り
PCアドレス範囲でページ区切りですから、プログラムがアドレス0000〜07FFの範囲にあればPage0、
ORG指定などで0800〜0FFFの範囲内ならPage1です。
(アドレス意識せず長いプログラムを書いてページを跨いでしまうこともあるので注意しましょう)
>他に注意点などがあれば教えてもらえないでしょうか?
>宜しくお願いします。
親ネタに戻って…
>Message[306] (略): Crossing page boundary -- ensure page bits are set.
はGOTO/CALL命令がページを跨ぐことに対する単なる警告なので、
プログラムの先頭のほうに下記のような記述を追加すればメッセージを抑止できます。
ERRORLEVEL -302,-306,-202
(Message[306]の他、[302],[202]の警告抑止)
- 5854. 理解できました [ナルト] 2005/08/17 15:56
- 返答頂きまして、ありがとうございます。
いろいろなやり方があるんですね。
私は、http://www.picfun.com/memory02.html 【プログラムメモリの構造】に、
「またRETURN命令の時は全てスタックから戻るのでPCLATHの設定は必要ありません。」と書かれていたので、
RETURN命令後は、どのやり方のあとでも自動的にページ0へ戻るものだと思って勘違いしてました。
よく理解出来たうえに、いろいろなやり方を勉強できて良かったです。
返答して下さいまして、ありがとうございました!