• 締切済み

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 -----------------------------------------

みんなの回答

  • katouka09
  • ベストアンサー率50% (130/256)
回答No.1

>8つのLEDを右から左に一つずつ順番に点灯したあと左から右に順番に点灯させるプログラムをつくりたい 消灯させないで点灯させるのは無理なのでは? loop1: btfsc PORT_A,1 goto loop1 PORT_Aの1ビット目がON(1)のままなら無限ループになるし、OFF(0)に なれば、ループから抜けます。 loop2: btfss PORT_A,0 goto  loop2 PORT_Aの0ビット目がOFF(0)のままなら無限ループになるし、ON(1)に なれば、ループから抜けます。 あとは自分で考えてみてください。

関連するQ&A

  • 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 何日も堂々巡りをしてまして埒があかないので質問させていただきました。 どこが間違えているのでしょうか???? よろしくお願いいたします。

  • 16F873AにてLEDの点灯

    16F873AにてLEDの点灯 16F873AにてLEDの点灯をさせる回路とプログラムを作っています。 PORTBとPORTCからトランジスタアレイ経由のLEDを接続。 セラロックは10MHz。5V電源を使っています。 普通に点灯は出来ているのですが、RA0からRA3にに入力があったら 点灯パターンを変化させたいです。 MAINにてRA0をチェックして、入力があったらLOOPに移動するつもりですが、 起動後いきなりLOOPに移動してしまいます。 初心者で勉強しているつもりですが、ネットの寄せ集めのコピペで 16F84Aで同じ事は出来ました。16F873Aでは上記のような状態です。 どうか解決方法を教えて下さい。 宜しくお願い致します。 ------------------------------- LIST P=PIC16F873A INCLUDE P16F873A.INC __CONFIG _HS_OSC & _PWRTE_ON & _WDT_OFF & _LVP_OFF GPR_1 EQU 020h GPR_2 EQU 021h GPR_3 EQU 022h ORG 0 INIT BSF STATUS,RP0 MOVLW 007h MOVWF ADCON1 MOVLW 00Fh MOVWF TRISA CLRF TRISB CLRF TRISC BCF STATUS,RP0 MAIN1 BTFSC PORTA,0 GOTO MAIN1 GOTO LOOP LOOP MOVLW 01h MOVWF PORTB CALL T100mS MOVLW 02h MOVWF PORTB CALL T100mS MOVLW 04h MOVWF PORTB CALL T100mS CLRF PORTB CALL T100mS BTFSC PORTA,0 GOTO MAIN1 GOTO LOOP ; << 100mS待つサブルーチン >> T100mS MOVLW 002h MOVWF GPR_3 T100LP CALL T50mS DECFSZ GPR_3,F GOTO T100LP RETURN ; << 50mS待つサブルーチン >> T50mS MOVLW 07Dh MOVWF GPR_2 T50LP CALL T04mS DECFSZ GPR_2,F GOTO T50LP RETURN ; << 0.4mS待つサブルーチン >> T04mS MOVLW 0F9h MOVWF GPR_1 T04LP NOP DECFSZ GPR_1,F GOTO T04LP RETURN END

  • PICでLEDを点滅させる

    16F628Aを使ってLEDが点滅するプログラム作ることはできたのですが、それを16F873A用に組み替えてみたのですが点滅せずに点灯したままになります。ハード的な問題なのかそれともプログラム問題なのかがわかりません。マイコンの勉強をはじめたばかりなのでお教えいただければたすかります。 ちなみにプログラムは以下のようになっています。クロックは10MHzです。 開発環境はMPLABをつかっていて秋月のキットを使って書き込んでいます。 ; ; ; list p=pic16f873a #include <P16F873A.INC> __CONFIG _WDT_OFF & _HS_OSC & _CP_OFF & _PWRTE_ON & _LVP_OFF COUNT EQU 20H COUNT1 EQU 21H ORG 0 MAIN BSF STATUS,RP0 CLRF TRISA CLRF TRISB CLRF TRISC BCF STATUS,RP0 MOVLW B'11111111' MOVWF PORTC CALL LA CLRF PORTC CALL LA GOTO MAIN LA MOVLW B'11111111' MOVWF COUNT LOOP2 MOVLW B'11111111' MOVWF COUNT1 LOOP NOP NOP NOP NOP NOP NOP NOP DECFSZ COUNT1,1 GOTO LOOP DECFSZ COUNT,1 GOTO LOOP2 RETURN END

  • 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) このこんがらかりをナンとか直してください。お願いします!

  • PIC16F819とMAX232Cについて困っています。

    まだ駆け出しでわからないことだらけで、以下のプログラムをふまえてPIC16F819とMAX232C(RS232C?)を接続したいのですが、どうプログラム(アセンブラ)を追加したら、また回路的にどうしたらいいのかわからないので教えてください。以下のプログラム(コメント省略)は、電圧変化により出力(LEDの点灯数の変化)を行ったものです。 LIST p=PIC16F819 #include <P16F819.inc> __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _LVP_OFF AD_DATA_H EQU 20h AD_DATA_L EQU 21h WAITCOUNT EQU 22h ORG H'00' GOTO START ORG H'04' GOTO START ;------------------------------ ; 初期設定 ;------------------------------ START BSF STATUS, RP0 BCF ADCON1, ADFM BCF ADCON1, ADCS2 BSF ADCON1, PCFG3 BSF ADCON1, PCFG2 BSF ADCON1, PCFG1 BCF ADCON1, PCFG0 MOVLW B'00000001' MOVWF TRISA MOVLW B'00000000' MOVWF TRISB BCF STATUS, RP0 CLRF ADCON0 CLRF PORTA CLRF PORTB ;------------------------------- ; メインルーチン ;------------------------------- MAIN CALL AD_CONVERT MOVLW b'10000000' SUBWF AD_DATA_H, W BTFSC STATUS, C GOTO V_UPPER_HALF GOTO V_LOWER_HALF V_UPPER_HALF MOVLW b'11000000' SUBWF AD_DATA_H, W BTFSC STATUS, C GOTO V_3_4 GOTO V_1_2 V_LOWER_HALF MOVLW b'01000000' SUBWF AD_DATA_H, W BTFSC STATUS, C GOTO V_1_4 GOTO V_ZERO V_3_4 MOVLW b'00000111' MOVWF PORTB GOTO MAIN V_1_2 MOVLW b'00000011' MOVWF PORTB GOTO MAIN V_1_4 MOVLW b'00000001' MOVWF PORTB GOTO MAIN V_ZERO MOVLW b'00000000' MOVWF PORTB GOTO MAIN ;--------------------------------- ; A/D 変換サブルーチン ;--------------------------------- AD_CONVERT MOVLW B'10000001' MOVWF ADCON0 CALL WAIT_100U BSF ADCON0, GO BTFSC ADCON0, GO GOTO ADLOOP MOVF ADRESH, W MOVWF AD_DATA_H MOVF ADRESL, W MOVWF AD_DATA_L RETURN ;------------------------------------------------------------ ; 100usec ( 100usec = 0.2u/Cycle at 20MHz x 500 ) ;------------------------------------------------------------ WAIT_100U MOVLW D'165' MOVWF WAITCOUNT WAIT_100UL DECFSZ WAITCOUNT,F GOTO WAIT_100UL RETURN END 長くなりましたがご教授どうかお願いします。

  • PICの条件分岐について

    お世話になります。PICについて質問があります。ボタンを押せば、PORTBのLEDに対する出力が変わるという物ですが、意図したようになりません。PORTに対する設定は間違っていないと思うのですが、チャタリングを考慮したプログラムになっており、上手く条件分岐してくれません。条件というのは、PORTAに入力があれば、25ms待機して再度PORTAを見に行きます。そのときにもPORTAに入力があれば、変数に格納した数値を一つずつ減らしていき、そのときに0であればPORTBを設定したとおりに出力するというものです。以下がソースですが、ここがおかしいということだけでも教えてくださると助かります。よろしくお願いします。 list p=16f628a #include<p16f628a.inc> __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF SWI equ 0x21 SWI2 equ 0x22 CNT1 EQU 0x20 CNT2 EQU 0x21 ORG 0x000 goto main ORG 0x004 main bcf STATUS,RP0 bcf STATUS,RP1 clrf INTCON clrf PORTA movlw 0x07 movwf CMCON bsf STATUS,RP0 bsf PCON,OSCF clrf TRISB movlw 0x03 movwf TRISA bcf STATUS,RP0 clrf PORTA clrf PORTB clrf SWI main_loop btfss PORTA,1 goto flase_wait_routine goto trues_wait_routine flase_wait_routine goto main_loop trues_wait_routine call DLY_25 btfss PORTA,1 goto main_loop incf SWI,f movf SWI,W movwf SWI2 decfsz SWI2,f goto a_loop_1 bsf PORTB,0 bcf PORTB,1 bcf PORTB,2 bcf PORTB,3 goto main_loop a_loop_1 decfsz SWI2,f goto a_loop_2 bcf PORTB,0 bsf PORTB,1 bcf PORTB,2 bcf PORTB,3 goto main_loop a_loop_2 decfsz SWI2,f goto a_loop_3 bcf PORTB,0 bcf PORTB,1 bsf PORTB,2 bcf PORTB,3 goto main_loop a_loop_3 decfsz SWI2,f goto a_loop_4 bcf PORTB,0 bcf PORTB,1 bcf PORTB,2 bsf PORTB,3 clrf SWI goto main_loop a_loop_4 goto main_loop ;Delay Routine DLY_25 ; 25ms movlw d'25' movwf CNT1 DLP1;1ms movlw d'20' movwf CNT2 DLP2 nop nop decfsz CNT2,f goto DLP2 decfsz CNT1,f goto DLP1 return END

  • PIC 初歩プログラムについて

    PICの初めてのプログラムを書いたのですがテキストのように動きません。 ORG 0 ; MAIN  BSF STATUS,RP0 MOVLW B'00000000' ;ポートB 出力 MOVWF TRISB ; MOVLW B'00001111' ;ポートA 0,1,2,3入力 MOVWF TRISA ; BCF STATUS,RP0 SW BTFSS PORTA,0 GOTO  LED1 BTFSS PORTA,1 GOTO LED2 GOTO SW LED1 MOVLW B'00000010' MOVWF PORTB GOTO SW LED2 MOVLW B'00000001' MOVWF PORTB GOTO SW END 入力SWを押していないときがHIです。したがって何もしなければSWのループになると思うのですが、LED2に行ってしまいます。BTFSC POARTA,1とすればSWループ状態ですがテキストとは違います。 何かおかしいのでしょうか?

  • PICアセンブラを出来る方、教えてください!

    初めに、カテゴリー間違ってたら、ごめんなさい。 大学の授業でライントレースロボットのアセンブラプログラムをやっています。 「以下のプログラムをセンサ入力をPORTA、モータドライブをPORTBとしプログラムを完成させよ(本講義で用いる装置はそのような回路になっていないので実行できない)。」 という問題なんですが分かる方居ますでしょうか? ;改造するプログラム ーーーーLIST P=PIC16F628A ーーーーinclude "P16F628A.inc" ーーーー__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _CP_OFF STATUS EQU 3 RP0 EQU 5 PORTA EQU H'05' PORTB EQU H'06' TRISA EQU H'85' TRISB EQU H'86' LR EQU D'7' LL EQU D'0' FRONT EQU B'00011000' RIGHT EQU B'00001000' LEFT EQU B'00010000' ーーBSF STATUS,RP0 ーーCLRF TRISA ーーMOVLW B'11000011' ーーMOVWF TRISB ーーBCF STATUS,RP0 ーーCLRF PORTA ーーCLRF PORTB LINE BTFSC PORTB,LL ーーGOTO MIGI ーーBTFSC PORTB,LR ーーGOTO HIDARI ーーGOTO MAE MAE MOVLW FRONT ーーIORWF PORTB,1 ーーMOVLW B'11011011' ーーANDWF PORTB,1 ーーGOTO LINE MIGI MOVLW RIGHT ーーIORWF PORTB,1 ーーMOVLW B'11001011' ーーANDWF PORTB,1 ーーGOTO LINE HIDARI MOVLW LEFT ーーIORWF PORTB,1 ーーMOVLW B'11010011' ーーANDWF PORTB,1 ーーGOTO LINE ーーEND 私が今、予想しているのは MOVLW B'11111111' MOVWF TRISA CLRF TRISB とするのではないかな、くらいです。(合ってるか分かりませんが) この問題を解ける方、いましたらお願いします。 (注)プログラムがスペースが分かりにくくなっていますが、本当のプログラムはちゃんとスペースが空いて、列も揃っています。行の先頭に付いているーは強制的に左寄せになるのを、すこしでも見やすくするための物で、意味はありません。

  • 初歩の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 以下省略 空白が文字化けして見にくくてすみません。

専門家に質問してみよう