PICのEQUについての質問

このQ&Aのポイント
  • PICのEQUとequについての理解がつかず、質問があります。
  • EQUとequの違いや使い方について教えてください。
  • コード内でEQUやequを使用する際の注意点についても教えてください。
回答を見る
  • ベストアンサー

PICのEQUでつまづいてしまいました

PICを習い始めた者です。EQUの理解でつまづいてしまいました。どなたか入門者向けの説明が上手な方、宜しくお願いします。なお、勉強させていただいているページは↓こちらです。 http://www.k3.dion.ne.jp/~digikoma/swf/flpic.html PICの「EQU」と「equ」は、 「大小文字の違いだけで、BULIDしたときは同じ働き」 と理解していたのですが、下記の記述でこんがらかってしまいました。 ;;(ここから引用→ http://www.k3.dion.ne.jp/~digikoma/shoho/shoho11.html#top);; INDF   EQU 0x00 TMR0  EQU 0x01 PCL   EQU 0x02 STATUS EQU 0x03 FSR   EQU 0x04 TRIS_A EQU 0x05 TRIS_B EQU 0x06 TRIS_C EQU 0x07 PORT_A EQU 0x08;PORT_A,4がマイクロ SW4 PORT_B EQU 0x09;7セグメント表示器へ(Hで点灯) PORT_C EQU 0x0A;PORTC_0=LED1を点滅用にする FLG equ PORT_C+1 ;Bit0をSW4の検知状態フラグとして使用する ;↓↓ SW4のON期間の経過値 C_CNT equ FLG+1 ;↓↓ スイッチが押して離した回数 SW_CNT equ C_CNT+1 ;↓↓ LEDタスクへの侵入カウンター LED_RC equ SW_CNT+1 ;↓↓ LEDの点灯(ON)期間のカウンタ LED_ON equ LED_RC+1 ;↓↓ LEDの消灯(OFF)期間のカウンタ LED_OF equ LED_ON+1 ;;(ここまで引用 );; ↑ここでは「INDF」~「LED_OF」のラベルにアドレスを与えているわけですね。(質問1) で、次のところからがわからないんです。 ;;(ここから引用);; CHAT equ 0x07;チャタリング時間(0xFD) JOBCNT equ 0x04;点滅タスク侵入カウンタ(0x00) ON_TIM equ 0x02;LEDの点灯期間(0x25) OF_TIM equ 0x08;LEDの消灯期間(0x60) ;;(ここまで引用 );; ↑ここであたかもラベルのようにみえる「CHAT」~「OF_TIM」にはアドレスが与えられなくてもいいんでしょうか? 小文字の「equ」の後に16進数がありますけど、これはSFRの領域をしてるのではないんでしょうか?(質問2) この後に↓次の記述が来てます・・・ ;;(ここから引用);; ; *** SW4検知の初期化  bcfFLG,0  clrfSW_CNT;スイッチ検知初期化  clrfC_CNT;チャタ検知用のカウンタ初期 ; *** LED点滅の初期化(CPU速度で調整必要)  movlwON_TIM;点灯期間の時間をセット  movwfLED_ON (略) ;;(ここまで引用 );; ↑この部分に相当するところをBULIDの後、逆コンパイラで確認すると、次のようになっています。 0x008  0x018D clrf  SW_CNT 0x009  0x018C clrf  C_CNT 0x00A  0x3002 movlw  0x02 0x00B  0x008F movwf  LED_ON つまり「ON_TIM」に「equ」をつかって「0x02」を代入しているから、 上の「0x00A  0x3002 movlw 0x02」のところでは自動的に16進数「0x02」が入っているのですね。 EQU,equ はアドレスを指定したり、数値を指定したりと、両方が出来るのですか?(質問3) このこんがらかりをナンとか直してください。お願いします!

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

そうそう、ついでにいえば、逆アセンブルした内容で、 0x008  0x018D clrf  SW_CNT 0x009  0x018C clrf  C_CNT 0x00A  0x3002 movlw  0x02 0x00B  0x008F movwf  LED_ON となっていて、(おそらく)movlw ON_TIM だけが、movlw 0x02 という表記になってしまっているのは、おそらくは、開発環境が気を利かせただけでしょう。 アセンブラした時点で、equ で割り当てた、名前と数値の対照表を持っていますので、 clrf 0x0d を、0x0d = SW_CNT というテーブルを引いて、clrf SW_CNT と表示するのは可能です。 この場合、アドレッシングモードから、clrf 0x0d の 0x0d は「アドレス」だとわかりますから、名前で表示した方がわかりやすいし、かつ、0x0d という数値がアドレスとして使用されているのなら、それは、SW_CNT だというのは、ほぼ決定できます。 ただ、 movlw 0x02 のほうは、数値の 0x02 を何というラベルで表したらいいのか、はっきり決められないことが多いです。 もちろん、ON_TIM という名前に割り当たっている数値が 0x02 だというのはわかっていますが、逆に、ほかに 0x02 というデータが存在していないかというのがなかなか判断できないと。 しかも、一度は、 0x00A  0x3002 movlw  0x02 の、0x3002 という数字になってしまったものから、元に戻しているわけですから、本当に、movlw 0x02 という書き方をしている可能性もあるわけです。 というわけで、アドレッシングモードから判断して、アドレスを指定している部分だけを、名前で置き換えたということだと思います。

chy_farm
質問者

お礼

2度もご丁寧にありがとうございました。こちらの方の上の方が一度読んだだけだとまだ理解できていないので、よーーーく読み直してみます! 本当にありがとうございました。

その他の回答 (3)

回答No.3

EQUの宣言は、アッセンブルする前にラベルを定義した値に置き換えます。 以下の例では、 >PORT_C EQU 0x0A;PORTC_0=LED1を点滅用にする >FLG equ PORT_C+1 >;Bit0をSW4の検知状態フラグとして使用する FLG equ 0x0A+1 と置き換え、FLGを宣言し、 >;↓↓ SW4のON期間の経過値 >C_CNT equ FLG+1 C_CNT equ 0x0A+1 +1 と置き換え、C_CNTを宣言します。 すなわち、アドレスでも数値でもなく、それらを示す文字の宣言です。 したがって、EQUの記述がいくらあってもアッセンブル後のコードサイズは増えません。

chy_farm
質問者

お礼

ご丁寧に解答してくださってありがとうございました。感謝いたします。今後とも宜しくお願いいたします。

回答No.2

equ という疑似命令は、「数値を名前で呼べるようにする」という働きだけしかありません。 あと、普通のアセンブラでは、アドレスもデータも「単なる数字」と思った方がいいです。 アドレスは、「その数値で表される場所」を操作するし、 データは、「その数値で表されるもの」対象自体が操作の対象になります。 さて、 PORT_C EQU 0x0A;PORTC_0=LED1を点滅用にする これは、PORT_C という名前に、0x0a という値を割り当てているだけです。 FLG equ PORT_C+1 これは、FLG という名前に、PORT_C + 1 という値を割り当てています。 ちなみに、PORT_C には、0x0a という値が割り当てられていますので、具体的には、FLG に 0x0b が割り当てられます。 以下同様。 ラベルにアドレスを割り当てているわけではなくて、単に、「名前に数値を割り当てている」だけです。 CHAT equ 0x07;チャタリング時間(0xFD) JOBCNT equ 0x04;点滅タスク侵入カウンタ(0x00) この二つの文も、それぞれ、CHAT に 0x07 という数値を、JOBCNT に0x04 という数値を割り当てているだけです。 で、ここまでは、PORT_C というのも単なる名前ですし、CHAT というのも単なる名前です。 どちらかが定数で、どちらかがアドレスという切り分けはないです。 というわけで、まずは、ここまでのところで、 ● ↑ここでは「INDF」~「LED_OF」のラベルにアドレスを与えているわけですね。(質問1)  いいえ、アドレスを与えているのではなく、単に、「名前に数値」を割り当てているだけです ● ↑ここであたかもラベルのようにみえる「CHAT」~「OF_TIM」にはアドレスが与えられなくてもいいんでしょうか? 小文字の「equ」の後に16進数がありますけど、これはSFRの領域をしてるのではないんでしょうか?(質問2)  単に、CHAT とかの名前に数値を割り当てているだけです。  その数値を保持する領域などはありませんので、領域をつぶしたりしません。 で、ここまででさらに混乱させてしまったかもしれませんが、ある数値が、「アドレス」だったり、「データ」だったりするのは、実は、アセンブラの「アドレッシングモード」の話です。 clrf SW_CNT で、SW_CNT というアドレスの中身が操作できるのは、「clrf は、次にある数値をアドレスと見なして実行する」からですし、 movlw 0x02 で、数値の0x02 を代入しようとするのは、「movlw は、次にある数値をデータと見なして実行する」からです。 なので、 ● EQU,equ はアドレスを指定したり、数値を指定したりと、両方が出来るのですか?(質問3)  これは、equ は、名前に数値を割り当てます。  その数値を、データと見なすか、アドレスとして見なすかは、アセンブラのここの命令(のアドレッシングモード)によります。 ということになります。

chy_farm
質問者

お礼

なるほどーー、そう言うモードがあったのですか! 分かり易く読ませていただきました。ありがとうございます。

  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.1

EQU は定数を設定します、レジスタに代入すれば数値になり データメモリのアドレスに名前をつけてわかりやすくします 0x00 と書くより INDF としたほうが判りやすいです、またPICの種類によりINDFのアドレスも変化 するので、INCファイルで設定されています

chy_farm
質問者

お礼

初心者の質問におつきあい下さってありがとうございました。今後とも宜しくお願いいたします。

関連するQ&A

  • PIC 8このLEDの点灯 左から右 右から左

    ↓のコードで 8つのLEDを右から左に一つずつ順番に点灯したあと左から右に順番に点灯させるプログラムをつくりたい そして下のコードに ~~~~ここに1行~~~~と書いているところがあります。 そこになにか一行書くとできるらしいのです。 でもどうやってもできません。 loop1: btfsc PORT_A,1 goto loop1 多分、↑に書いたコードの箇所がずっと無限に回ってるからだとおもいます。 この↓のコードで~~~~ここに1行~~~~の場所に本当になにか一つつけくわえるだけでできるのであれば教えてほしいです。 また、この問題が間違ってるというのであればどこが間違っているかを教えてほしいです。 少しだけならコードをかきかえても大丈夫だそうです。 わかるかたもしいましたら、おねがいします。 INDF EQU 0x00 TMR0 EQU 0x01 PCL EQU 0x02 STATUS EQU 0x03 FSR EQU 0x04 TRIS_A EQU 0x05 TRIS_B EQU 0x06 TRIS_C EQU 0x07 PORT_A EQU 0x08 PORT_B EQU 0x09 PORT_C EQU 0x0A org 0x00 ;ここから↓ MOVLW 0x3F MOVWF TRIS_A CLRW MOVWF TRIS_B MOVWF TRIS_C MOVWF PORT_B MOVWF PORT_C loop1: btfsc PORT_A,1 goto loop1 ~~~~ここに1行~~~~ loop2: btfss PORT_A,0 goto  loop2 goto loop1 -----------------------------------------

  • PICの割り込み機能

    現在電子工作をしており、それにPIC16F84Aを使っています。 正直アセンブリはよくわからないので、C言語でプログラムを作っています。 コンパイラはPICCLITEで、LEDの点灯・消灯に関するプログラムです。 機能としては ・RA0に入力があったときRB0につないであるLEDが消灯しているならLEDを点灯。 ・RA0に入力があったときRB0につないであるLEDが点灯しているならLEDを消灯。 ・RA1に入力があったときLEDが点灯しているなら5秒後にLEDを消灯。 というものを目指しています。 1つ目、2つ目の項目はif文で簡単に実現できましたが、割り込みがうまくいかず、 消えている状態でRA1に入力を入れたときなぜか5秒後に点灯してしまいます。 だからRB0の出力を逆にしてみたんですがうまくいかず・・・。 ハード的には、RB0には反対側から5Vをかけ、 RB0=0の時は点灯 RB0=1の時は消灯 としています。 またセラロックは10MHzのものを使用しています。 現在のプログラムとしては #include "pic.h" #define XTAL_FREQ 10MHZ #define MHZ*1000 void DelayUs(unsigned char cnt){ //時間待ち関数  unsigned char i;  i=(cnt)/(12MHZ/(XTAL_FREQ))|1;  while(--i!=0) continue; } void DelayMs(unsigned int cnt){ //時間待ち関数  unsigned char i;  do{   i=4;   do{    DelayUs(250);   }while(--i);  }while(--cnt); } int cnt,SW; //SWが0なら消灯 //SWが1なら点灯 void interrupt isr(void){ //割り込み関数  if(T0IF==1){   T0IF=0;   cnt--;  }  if(cnt==0){   RB0=1; //消灯   SW=0;   cnt=190;   T0IE=0;   GIE=0;  } } main() {  TRISA=0xFF; //入出力設定  TRISB=0x00;  PORTA=0x00;  PORTB=0x00;  SW=0;  OPTION=0x87; //プリスケーラの設定  TMR0=0x00;  T0IF=0;  T0IE=1;  cnt=190;  while(1){   if(RA0==1){    DelayMs(60); //チャタリング防止    if(RA0==1){     if(SW==0){      RB0=0;      SW=1;     }    else{     RB0=1;     SW=0;    }   }  }  if(RA1==1){   DelayMs(60); //チャタリング防止    if(RA1==1 && SW==1){     TMR0=0;     T0IF=0;     T0IE=1; //割り込み許可     GIE=1; //全体割り込み許可    }   }  } } インターネット上での割り込みのプログラムをいくつか見てみたのですが、 どれもすべて動作を終えて、あとはwhile(1)で割り込みを待つだけ というプログラムばかりでした。 僕のは基本的にRA0の入力によってLEDを点灯・消灯させつつ RA1の入力で割り込みを開始。 5秒後に消えたら割り込みを禁止する。 という仕様にしたいのですが・・・・・・。 1ヶ月ぐらいやってますがうまくいきません。 良ければご回答をお願いします。

  • PIC 簡単なプログラミングで行き詰まりました

    PIC初心者です。よろしくお願いします。 PIC16F84Aを使って 「ポートA 0bIt 」 に入力があったとき(1になったとき) ラベルの「OPEN」に飛びポートBのLEDが一秒点灯。 「ポートA 1bit 」に入力があったとき ラベルの「CLOSE」に飛びポートBのLEDが一秒点灯。 これだけのプログラムなのですが MPLAB IDE v8.63で Debug all すると ;の記述のところで表記のエラーが出ます。 プログラムはこちらです。 list P=pic16f84a include "p16f84a.inc" __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF CNT1     EQU   0CH CNT2    EQU   0DH CNT3     EQU  0EH       ORG    0      GOTO    MAIN           MAIN      BSF    STATUS,RP0      MOVWF    TRISA      CLRF    TRISB      BCF    STATUS,RP0      CLRF    PORTB      CLRW LOOP      BTFSC    PORTA,0      GOTO   OPEN      BTFSC   PORTA,1      GOTO    CLOSE     ;ここで「Symbol not previously defined (CLOSE)」 のエラー                        GOTO    LOOP OPEN      MOVLW    010H      MOVWF    PORTB      CALL   TIMER3    ;ここでSymbol not previously defined (TIMER3)エラー                             CLRF    PORTB      END CLOSE   MOVLW    020H      MOVWF    PORTB      CALL   TIMER3      CLRF   PORTB      END TIMER1     MOVLW    D'62'       MOVWF    CNT1 LOOP1     NOP       DECFSZ    CNT1,1       LOOP1       RETURN TIMER2     MOVLW    D'100'       MOVWF    CNT2 LOOP2     NOP       CALL    TIMER1       DECFSZ    CNT2,1       goto     LOOP2       RETURN TIMER3     MOVLW    D'100'       MOVWF    CNT3 LOOP3     NOP       CALL    TIMER2       DECFSZ    CNT3,1       goto     LOOP3       RETURN      END 何日も堂々巡りをしてまして埒があかないので質問させていただきました。 どこが間違えているのでしょうか???? よろしくお願いいたします。

  • PIC 初心者で行き詰まりました(汗、、、)

    PIC初心者です。よろしくお願いします。 PIC16F84Aを使って 「ポートA 0bIt 」 に入力があったとき(1になったとき) ラベルの「OPEN」に飛びポートBのLEDが一秒点灯。 「ポートA 1bit 」に入力があったとき ラベルの「CLOSE」に飛びポートBのLEDが一秒点灯。 これだけのプログラムなのですが MPLAB IDE v8.63で Debug all すると ;の記述のところで表記のエラーが出ます。 プログラムはこちらです。 list P=pic16f84a include "p16f84a.inc" __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF CNT1     EQU   0CH CNT2    EQU   0DH CNT3     EQU  0EH       ORG    0      GOTO    MAIN           MAIN      BSF    STATUS,RP0      MOVWF    TRISA      CLRF    TRISB      BCF    STATUS,RP0      CLRF    PORTB      CLRW LOOP      BTFSC    PORTA,0      GOTO   OPEN      BTFSC   PORTA,1      GOTO    CLOSE     ;ここで「Symbol not previously defined (CLOSE)」 のエラー                        GOTO    LOOP OPEN      MOVLW    010H      MOVWF    PORTB      CALL   TIMER3    ;ここでSymbol not previously defined (TIMER3)エラー                             CLRF    PORTB      END CLOSE   MOVLW    020H      MOVWF    PORTB      CALL   TIMER3      CLRF   PORTB      END TIMER1     MOVLW    D'62'       MOVWF    CNT1 LOOP1     NOP       DECFSZ    CNT1,1       LOOP1       RETURN TIMER2     MOVLW    D'100'       MOVWF    CNT2 LOOP2     NOP       CALL    TIMER1       DECFSZ    CNT2,1       goto     LOOP2       RETURN TIMER3     MOVLW    D'100'       MOVWF    CNT3 LOOP3     NOP       CALL    TIMER2       DECFSZ    CNT3,1       goto     LOOP3       RETURN      END 何日も堂々巡りをしてまして埒があかないので質問させていただきました。 どこが間違えているのでしょうか???? よろしくお願いいたします。

  • PIC タイマー0の使い方

    PIC16F886を触り始めたのですが、タイマー割り込みで苦戦しています。 タイマー割り込みを使ったLEDの点滅の間隔が、自分の思った時間にならないのです。 下に今のプログラムを載せておきます。 私の今の考え方はこうです。 ・内部クロックは4MHzに設定してある ・TMR0のカウントはクロックの1/4らしい→1MHzなので周期は1μsec ・プリスケーラは1:128に設定→128μsecでTMR0がカウントアップ ・TMR0の初期値を61に設定→195回のカウントアップでT0IF=1 ・128μsec*195μsec=2496μsec≒0.025msec←タイマー割り込み ・40回カウントすると1秒 と、1秒ごとにLEDのON,OFFが切り替わるはずだと考えているのですが、書き込んで計測したところ、約0.8秒でon,offを繰り返しています。 私の考え方やプログラムに間違いがあるのでしょうか? もしくはPICがハード的に壊れているのでしょうか?(picに5Vをかけても動かず、mainが実行中に点灯するLED(この時点では点いていない)の端子の両端を指で触ると何故か動き出します。) 以下プログラムです。(注釈などは省いたので見難いかもしれません) #include <stdio.h> #include <stdlib.h> #include <xc.h> #include <pic.h> #pragma config FOSC = INTRC_NOCLKOUT #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config MCLRE = OFF #pragma config CP = OFF #pragma config CPD = OFF #pragma config BOREN = ON #pragma config IESO = OFF #pragma config FCMEN = OFF #pragma config LVP = ON void interrupt tc_int(void); volatile unsigned int cnt = 0; volatile unsigned int cnt1 = 0; #define sw RB0 #define led RA0 #define led2 RA1 #define led3 RA2 #define _XTAL_FREQ 4000000 void init(void) //初期設定 { OSCCON=0b01101000; // 内部クロック設定 4MHz TRISA=0b00000000; TRISB=0b00000000; TRISC=0b00000000; ANSEL=0x00; /* 割り込み初期設定 */ GIE = 1; // すべての割り込みを許可 T0IE = 0; // タイマー割り込みを禁止 T0CS = 0; // TIMAR0モジュールをタイマーとして使用 PSA = 0; // プリスケーラをTIMER0モジュール用にセット OPTION_REG |= 0x06; // CPUクロックを128分周 TMR0 = 61; // カウンタ値をリセット T0IE = 1; // タイマー割り込みを許可 T0IF = 0; // 割り込みフラグをクリア } int main(void) { init(); sw=1; led=1; led3=0; cnt1=0; LEDflg=0; while(1) { if(cnt1>=10){ led3=~led3; cnt1=0; } } } void interrupt tc_int(void){ // 割り込みハンドラ if(T0IF == 1){ cnt++; TMR0=61; T0IF = 0; // 割り込みフラグをクリア if(cnt>=40){ cnt=0; cnt1++; led2= ~led2; } } }

  • このプログラムがどういう流れで動いてるか教えてください

    PICのプログラミングで以下の課題が学校ででました。 PB0~PB5まで1秒ごとに交互に点灯するプログラムを書くというものです。 CNT1 EQU 20H CNT2 EQU 21H main MOVLW B'00010101' MOVWF PORTB CALL TIM2 MOVLW B'00001010' MOVWF PORTB CALL TIM2 GOTO main TIM1 MOVLW 0F9H MOVWF CNT1 TIMLP1 NOP DECFSZ CNT1,F GOTO TIMLP1 RETURN TIM2 MOVLW 08H MOVWF CNT2 TIMLP2 CALL TIM1 DECFSZ CNT2,F GOTO TIMLP2 RETURN END 上記のプログラムで動きました。 だけど、このプログラムの流れがわからないため 説明できません。 誰かこのプログラムの流れをわかりやすく説明してください。 特にCALLとRETURN、DECFSZがどう動くかわかりません。

  • PICのアセンブラからC言語へ変換のアドバイスです

    C言語ならわたしはわかるのですが、アセンブラは理解できるレベルにありません。機会があればいつか挑戦したいです。話は変わりますが、 以下のアセンブラのソースでLEDの点滅まで出来ましたが、これをC言語で理解したいと思っています。翻訳できる方がいらっしゃればご協力のほどよろしくお願いします。また、そこまでは無理でもわかる範囲でアドバイスを戴けたらと思います。よろしくお願いします。 asmソースです。 list p=16f628a #include<p16f628a.inc> __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF w_temp EQU 0x70 status_temp EQU 0x71 CNT1 EQU 0x20 CNT2 EQU 0x21 ORG 0x000 goto main ORG 0x004 movwf w_temp movf STATUS,w movwf status_temp ;ISR Codes movf status_temp,w movwf STATUS swapf w_temp,f swapf w_temp,w retfie main bcf STATUS,RP0 bcf STATUS,RP1 clrf INTCON clrf PORTA movlw 0x07 movwf CMCON bsf STATUS,RP0 bsf PCON,OSCF clrf TRISA clrf TRISB bcf STATUS,RP0 clrf PORTA clrf PORTB main_loop bsf PORTB,3 call DLY_250 bcf PORTB,3 call DLY_250 goto main_loop ;Delay Routine DLY_250 ; 250ms movlw d'250' movwf CNT1 DLP1;1ms movlw d'200' movwf CNT2 DLP2 nop nop decfsz CNT2,f goto DLP2 decfsz CNT1,f goto DLP1 return END

  • PICのポートからの読み込みが正しくできない

    先月は16F648AのRA4出力が正しく出来ないを質問した者です。 またしてもお願いします 16F648AのRA1,RA0 にSW信号を抵抗でプルアップして入力、RA2はLEDを抵抗を通して直接駆動しています TRISA はこれに対応してXXXX X011 を設定していて プログラム中でRA1を押されたらLED ON, RA0が押されたらLED OFF となるようにテスト用プログラムを作りましたが SW信号を読み取れていないようです 17,18ピンの電圧を見るとSWの動きと正しくON/OFFしています 先月同様見落とししていることがあると思っていますが 正しい、多分正しいと思遺恨でいますこともあって解決できません お気づきの点がありましたら教えてください お願いするばかりですが宜しくお願いします

  • PICのプログラム

    PICのテストプログラムを作ったのですが、LEDの点灯が、順々に動くプログラムのはずがすべてのLEDが同時に着いてしまいます。なぜですか???? とても困っています。誰か教えてくれたらありがたいです。 PICは、16F877Aです。 ポートDにLEDがついています。 TITLE "QUARK Test1 PICUN1" LIST p=PIC16F877A __CONFIG _HS_OSC & _CP_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _WRT_OFF & _DEBUG_OFF #INCLUDE "P16F877A.inc" __IDLOCS D'1' matu EQU 020H matu2 EQU 021H matu3 EQU 022H main ORG 0 clrf STATUS clrf INTCON bsf STATUS,RP0 clrf TRISA clrf TRISB clrf TRISC clrf TRISD clrf TRISE clrf STATUS clrf PORTD clrf matu clrf matu2 clrf matu3 mainloop bsf PORTD,2 call matuloop3 bcf PORTD,2 call matuloop3 goto mainloop ;この後にmatuloop1~3が続く。 END よろしくお願いします。

  • 初歩のPICプログラム

    最近PICはじめたばかりの全くの初心者です。9番ピンのLEDが点滅を繰り返すという16F628用のプログラムがあります。 これを16F84A用に書き換えたいんですが29行目に「Symbol not previously defined (CMCON)」というエラーがでます。どうやら16F84にはCMCONがないからのようです。これをなんとか回避する方法はないんでしょうか。うまく動かない書き換えたプログラムを下におきます。 list p=16f84a w_temp      EQU 0x70 status_temp    EQU 0x71 CNT1         EQU 0x20 CNT2        EQU 0x21       ORG   0x000     goto   main      ORG   0x004     movwf  w_temp     movf  STATUS,W     movwf   status_temp ;ISR Code    movf     status_temp,w    movwf     STATUS    swapf     w_temp,f    swapf     w_temp,w        retfie main    bcf   STATUS,RP0    bcf   STATUS,RP1    clrf   INTCON    clrf   PORTA    movlw   0x07    movwf   CMCON ;ここでエラーがでる    bsf   STATUS,RP0    clrf   TRISA    clrf   TRISB    bcf    STATUS,RP0    clrf    PORTA    clrf    PORTB main_loop    bsf  PORTB,3    call  DLY_250    bcf   PORTB,3    call   DLY_250    goto  main_loop ;Dalay Routine DLY_250   ;250mS 以下省略 空白が文字化けして見にくくてすみません。

専門家に質問してみよう