PIC16F84を使ってアセンブラでプログラムしているのですが、どうしてもアセンブルが成功しません。

エラーを中心にプログラムを削りまくったところ、ADDWF命令とRETLW命令でコケているようです。(テーブル処理)
以下のプログラムで、ADDWFの位置で「ラベル(ADDWF)の位置が変です」というエラーが出てしまいます・・・。

 LIST P=PIC16F84;
 INCLUDE "P16f84.inc"

 ORG 0
START
 ADDWF PC,W
 END

どういうことなんでしょうか?(T-T
(タブはスペースに置換済みです)

このQ&Aに関連する最新のQ&A

A 回答 (1件)

PICは使ったことがないですが、これまでのアセンブリ言語の経験では、


たいていラベル名の後に : (コロン)が必要だったと思います。
START:
のように付加する必要があるというのでもありませんか?
    • good
    • 0
この回答へのお礼

ありがとうございます。原因がわかりました。Webからコピーした部分だったので、
全角スペースが入っていました・・・。(\(T-T)/どかーん)
なぜ違うエラーが出たのかわかりませんが、とにかくお騒がせして申し訳ありませんでした。

お礼日時:2001/06/21 15:49

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

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

QPIC 16F84A のプログラム

①MOVLW 01H と
②MOVLW 9 というのは
どのように動作が違うのでしょうか?
①はWレジスタに16進数"01"をセットするということだと思うのですが
②もWレジスタに10進数"9"をセットするということなのですか?

Aベストアンサー

PICは手がけたことが無いので一般論ですが
レジスタに値が入った時点では、それは数値になるので
値を16進数で表記しようが、10進数で表記しようが何ら関係ありません。
では、なぜ値を16進数で表記したり、10進数で表記したりするのか?
それは人間に対して判り易くするためです。
例えば、
値が個数を表しているなら10進数で表記したほうが判り易い。
値がポートの出力パターンを表しているなら16進数(欲を言えば2進数)で表記したほうが判り易い。
それだけです。

QPIC16F84Aで入力があるとスタートするプログラム

PIC16F84Aで、アセンブリ言語でプログラムをしています。

RA4を入力端子とし、入力があればプログラムがスタートするということをしたいんですけどうまくいきません。

私の作ったプログラムはこのようになっています。

 listp=16f84A 
 include <p16f84A.inc>
 __CONFIG _HS_OSC & _PWRTE_ON & _WDT_OFF

tim1   EQU  0x20
     org  0x00
     NOP
     GOTO start

start
     BSF  STATUS,RP0
     MOVLW B'00010000'
     MOVWF TRISA
     CLRF TRISB
     BCF  STATUS,RP0
     MOVLW B'00010000'
     MOVWF PORTA
     CLRF  PORTB

main
     MOVLW  001h
     MOVWF  tim1
timlp1  BTFSC  PORTA,5
     CALL   playball
     GOTO   main

playball
     MOVLW  B'00001111'
     MOVWF  PORTA
     MOVLW  B'11111111'
     MOVWF  PORTB
     RETURN

修正点などありましたら教えて下さい。

PIC16F84Aで、アセンブリ言語でプログラムをしています。

RA4を入力端子とし、入力があればプログラムがスタートするということをしたいんですけどうまくいきません。

私の作ったプログラムはこのようになっています。

 listp=16f84A 
 include <p16f84A.inc>
 __CONFIG _HS_OSC & _PWRTE_ON & _WDT_OFF

tim1   EQU  0x20
     org  0x00
     NOP
     GOTO start

start
     BSF  STATUS,RP0
     MOVLW B'00010000'
     MOVWF TRISA
...続きを読む

Aベストアンサー

BTFSC  PORTA,5

BTFSC  PORTA,4
ではないのですか?(RA4が入力でしょ?)
入力の回路がわかりませんが
BTFSS  PORTA,4
かも知れませんね。
恐らくasmの冒頭だけの抜粋だと思いますので
どんな動作かはわかりかねますがここまでの回路までなら普通に動作すると思います。
(最後にENDを追加した形でMPLAB IDEでシュミレーション確認済)   

QPIC16F84のプログラム

PIC16F84のプログラムでこのようなものを作りました。

revel1  movlw75
      movwftm3

      movlw255
      movwftm4

no1_on  movrb,#11110000b     ;(1)
      movrb,#10000000b
      movrb,#11000000b
      movrb,#10100000b
      movrb,#11000000b
      movrb,#10000000b    ;(2)

      decfsztm4,1
      gotono1_on

      decfsztm3,1
      gotono1_on

これは、(1)~(2)の動作を75×255=19125回(多分)繰り返すという物です。
同様の処理を多数行ないたいのですが、プログラムしてみたところ、容量オーバーの為か?アセンブルできませんでした。これを同様の動作でもう少しシンプルに出来ないでしょうか?よろしくお願いします。

PIC16F84のプログラムでこのようなものを作りました。

revel1  movlw75
      movwftm3

      movlw255
      movwftm4

no1_on  movrb,#11110000b     ;(1)
      movrb,#10000000b
      movrb,#11000000b
      movrb,#10100000b
      movrb,#11000000b
      movrb,#10000000b    ;(2)

      decfsztm4,1
      gotono1_on

      decfsztm3,1
      gotono1_on

これは、(1)...続きを読む

Aベストアンサー

補足拝見しました。
movlwの問題ではないと言う事ですね。

そして、約100回、同じ物を書かれたのでしょうか?

とすると、やはり、容量オーバーしますね。

PICにはあまりプログラム領域はありませんから。
MPLABだと、確かに容量オーバーでアセンブルできないと
思います。(もっと高価なアセンブラをお使いでしたら失礼!)

(1)~(2)を数十パターン用意するのでしたら
やはり、CALL命令が良いと思います。
そういう書き方は、PICが一番得意とする処です

(プログラムカウンタの扱いは柔軟なのに
 プログラムそのものはガチガチなのが、PICの特徴ですから)

QPIC16F84Aのプログラムについて(初歩的な質問)

PICのプログラムを勉強しています。簡単なプログラムとして電源を入れるとPORTBにつないだLEDを3回点滅させて、最後は点灯しっぱなし(電源きるまで)にしようとしていますが、点灯しっぱなしにならずにずっと点滅してしまいます。(プログラムの最初に戻ってるらしい)昔のBASICなどですと「100 GOTO 100」とかすると変数の値はそのままで無限ループするので、PICでもSTATUSレジスタのPORTBを1にする命令を何回もGOTOによって繰り返させてますが出来ません。何故でしょうか?PORTBを電源切るまで1にしたままにするにはどうすればいいのでしょうか?勉強不足で私自身何もわかってませんがよろしくお願いいたします。

Aベストアンサー

点滅は出来てるのですよね?
ところで使用言語はなんですか?

点滅3回のループの脱出条件が間違ってるんじゃ
無いでしょうか?

最後に点灯したままにしたければ
  点滅のループを抜けた後
  tentou; などで点灯させておく。
  while( true);
としておけば、永久に点灯したままの筈です。

QPIC初心者です。 PIC16F88のLED制御で以下のプログラムを実

PIC初心者です。 PIC16F88のLED制御で以下のプログラムを実行すると点滅を繰り返します。
意図としては1度だけ光って消えてほしいのですが…
CONFIG部分がおかしいのでしょうか?
環境として、PCはVista、MPLABとPICkit2を使用しています

お分かりになる方、お願いいたします。
以下ソースです
LISTP=PIC16F88
INCLUDE"P16F88.INC"

__CONFIG _CONFIG1, _INTRC_IO & _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_ON & _WDT_OFF
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_ON

BSFSTATUS,RP0
CLRFTRISB
BCFSTATUS,RP0
BCFSTATUS,0
CLRFPORTB

MAIN
BSFPORTB,0
NOP
NOP
NOP
(以下、NOPが100個ほど)
NOP
BCFPORTB,0

END

PIC初心者です。 PIC16F88のLED制御で以下のプログラムを実行すると点滅を繰り返します。
意図としては1度だけ光って消えてほしいのですが…
CONFIG部分がおかしいのでしょうか?
環境として、PCはVista、MPLABとPICkit2を使用しています

お分かりになる方、お願いいたします。
以下ソースです
LISTP=PIC16F88
INCLUDE"P16F88.INC"

__CONFIG _CONFIG1, _INTRC_IO & _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_ON & _WDT_OFF
_...続きを読む

Aベストアンサー

END命令は議事命令といわれており、CPUに実行停止を命令するのではなく、コンパイラに対してコードの終端を明示しているだけです。

下記URLのコードを参考にしてみては如何でしょうか?
http://homepage1.nifty.com/rikiya/software/310picpio1.htm
プログラムの最後でループしているだけですが。


このカテゴリの人気Q&Aランキング

おすすめ情報