- 締切済み
マイコンPIC16F84Aについて
BSF STATUS,RP0 BSF TRISA,0 CLRF TRISB BCF STATUS,RP0 LOOP MOVLW05h MOVWF,PORTB MAIN BTFSC PORT,0 こんな感じです。 入力にセンサーを使用してオンしたらLEDが点灯する回路にしたいのですがプログラムに詳しい方がいましたら教えていただけないでしょうか?
- 51885
- お礼率100% (3/3)
- その他(プログラミング・開発)
- 回答数1
- ありがとう数2
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- FoolWord
- ベストアンサー率73% (14/19)
BTFSCは指定したレジスタビットが0の時、次の命令をスキップするコマンドです。 分岐するならこうなるのかな? MAIN BTFSC PORTA,0 GOTO SW_ON SW_OFF MOVLW 00h MOVWF PORTB GOTO MAIN SW_ON MOVLW 01h MOVWF PORTB GOTO MAIN
関連するQ&A
- PICのスイッチのプログラムについて
基本的な事なのですが、よろしくお願いします。 以下のアセンブラのソースでPICを作ってみました。プログラムを変えてみたり、回路を変えてみたりしましたが、改善されませんでした。回路の構成は、LED(仮に、A・Bとします)2個、スイッチ1個、PIC、抵抗器など・・・これを交互にスイッチのオンオフで切り替える。としています。現状の問題点は、スイッチ入力で、LEDAは光るときは綺麗に光りますし、消えるときは綺麗に消えます。問題は、LEDBのほうで、光るときに高速で点滅します。理由と対策が解りません。どなたか教えてください。よろしくお願いします。 list p=16f628a #include<p16f628a.inc> __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF 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 main_loop btfsc PORTA,0;この辺りがよくわかりません。 goto loop2 bsf PORTB,0 bcf PORTB,1 goto main_loop loop2 bcf PORTB,0 bsf PORTB,1 goto main_loop 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ループ状態ですがテキストとは違います。 何かおかしいのでしょうか?
- ベストアンサー
- その他(プログラミング・開発)
- PIC16F84Aで入力があるとスタートするプログラム
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 修正点などありましたら教えて下さい。
- ベストアンサー
- その他(プログラミング・開発)
- 初歩の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 以下省略 空白が文字化けして見にくくてすみません。
- ベストアンサー
- 物理学
- PICマイコン16F84Aを使った入出力でつまづいてます。
とても初心者な質問です。 色々調べましたがわかりませんでしたので質問させていただきます。 要するに、PORTAを書き換えてRA0~4につないだ任意のLEDを点灯させたいだけなんですが、うまいこといきません。 LEDの極性は間違いないようです。 以下がソースです。 このソースではb'11111'を転送する事で全てのポートAのLEDを点灯させたいつもりなのですが、実際のテストボードでは何故か RA0,RB3,RB5,RB7が点灯して、もうわけわかりません。どなたかご教授お願いします。 LIST P=PIC16F84A ; INCLUDE P16F84A.INC ; __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF ORG 0 INIT BSF STATUS,RP0 CLRF TRISA CLRF TRISB BCF STATUS,RP0 ; <メイン> LOOP MOVLW b'11111' MOVWF PORTA GOTO LOOP 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アセンブラを出来る方、教えてください!
初めに、カテゴリー間違ってたら、ごめんなさい。 大学の授業でライントレースロボットのアセンブラプログラムをやっています。 「以下のプログラムをセンサ入力を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 とするのではないかな、くらいです。(合ってるか分かりませんが) この問題を解ける方、いましたらお願いします。 (注)プログラムがスペースが分かりにくくなっていますが、本当のプログラムはちゃんとスペースが空いて、列も揃っています。行の先頭に付いているーは強制的に左寄せになるのを、すこしでも見やすくするための物で、意味はありません。
- ベストアンサー
- その他(プログラミング・開発)
- 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初心者です。よろしくお願いします。 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 何日も堂々巡りをしてまして埒があかないので質問させていただきました。 どこが間違えているのでしょうか???? よろしくお願いいたします。
- 締切済み
- その他(プログラミング・開発)
- 電子工作
簡単なLED点灯回路を作ってみようと思っています。 アセンブラ言語は初めてなんですが、テストプログラムを見たのですがよくわかりません。分かる方、教えてください。 これは7セグドライバーを用いてアノードコモンの二桁LEDを光らせる ものなんですが、以下がそのテストプログラムです。 org 00h bcf STATUS,RP1 bsf STATUS,RP0 ;Bank1へ切り替え movlw b'00000100' ;RA2をアナログに設定 movwf ANSEL movlw b'00000100' ;RA2を入力に設定 movwf TRISA movlw b'00000000' movwf TRISB movlw b'01110000' ;発振周波数8Mに設定 movwf OSCCON movlw b'00000101' movwf OPTION_REG bcf STATUS,RP1 ;Bank0へ切り替え bcf STATUS,RP0 bcf PORTA,0 (1) bcf PORTA,1 (2) movlw d'9' (3) movwf PORTB loop nop goto loop end これを実行するとLEDに「99」と表示されます。 便宜上(1)~(3)をここで加えましたが、この部分が何をやっているのか よく分かりません。 まず、(1)と(2)について、 一と十の位ののLEDのコモン(アノード部)をHiにしているのでしょうか? また(3)では7セグドライバは2進で入力しなければならないんじゃないですか?なぜ10進の数字が入力されているんでしょうか。 分かる方、教えてください、よろしくお願いします。
- ベストアンサー
- その他(趣味・娯楽・エンターテイメント)
お礼
ありがとうございます。 お礼遅れて申し訳ありません💦 勉強になりました、ありがとうございました。