PIC初心者用掲示板

PICの初心者用の質問箱です。
何でもお気軽にどうぞ!

■最新ツリー一覧

□このツリー付近のツリー一覧

★新規ツリー作成

◆ 5767. エラーの内容を教えて下さい [ナルト] 2005/08/05 20:40
    ┗ 5768. Re: エラーの内容を教えて下さい [CHOBI] 2005/08/05 22:17
        ┗ 5771. エラー [ナルト] 2005/08/06 01:45
            ┗ 5772. 投稿者削除 [ ] 2005/08/06 02:12
            ┗ 5773. ページとPCLATHについて [新参者] 2005/08/06 02:18
                ┗ 5842. ページの割当て方 [ナルト] 2005/08/15 11:54
                    ┗ 5843. Re: ページの割当て方 [DANGAN4] 2005/08/15 13:48
                    ┗ 5846. Re: ページの割当て方 (PCLATH扱いエラーの原因) [新参者] 2005/08/15 17:10
                        ┗ 5854. 理解できました [ナルト] 2005/08/17 15:56
            ┗ 5774. Re: エラー [JO_O2005/08/06 02:23


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_O2005/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へ戻るものだと思って勘違いしてました。
よく理解出来たうえに、いろいろなやり方を勉強できて良かったです。

返答して下さいまして、ありがとうございました!