- 締切済み
PICアセンブラの割り算のプログラムを教えて
PIC 16F84A を使いラジコンで送受信の実験をしています。 割り算で小数点以下の数字を使いたいのです。 1/10 = 0.1 あるいは 2/10 = 0.2 とかです。 プログラムの組み方が分かりません。 BCF STATUS,C RRF ***** というようなプログラムを使うようなのですが、 初心者に分かりやすく教えて頂けないでしょうか。 よろしくお願いします。
- y4580
- お礼率74% (29/39)
- その他(ソフトウェア)
- 回答数1
- ありがとう数2
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- trapezium
- ベストアンサー率62% (276/442)
結果どうしたいのか? 単に処理できればいいのならフリーで公開されてるコード探すとか、アルゴリズムは把握してるけど PIC で書けないのか、それとも少数の除算が分からないのか? 少数、とりあえず固定少数のロジックということなら、整数の除算と基本は一緒です。違いは必要なビットまで少数点以下まで処理することと、それに伴ってワークエリアを確保しておくこと。整数部8bit,小数部8bitの16bit同士の除算だと、結果は整数部16bit,小数部16bitになります。 1/10,2/10 みたいに整数同士のケースなら int a = 1, b = 10; a <<= 8; printf("%x\n", a / b); とかの下位8bitが少数部です。
関連するQ&A
- 初歩の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初心者です。 PIC16F88のLED制御で以下のプログラムを実
PIC初心者です。 PIC16F88のLED制御で以下のプログラムを実行すると点滅を繰り返します。 意図としては1度だけ光って消えてほしいのですが… CONFIG部分がおかしいのでしょうか? 環境として、PCはVista、MPLABとPICkit2を使用しています お分かりになる方、お願いいたします。 以下ソースです LIST P=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 BSF STATUS,RP0 CLRF TRISB BCF STATUS,RP0 BCF STATUS,0 CLRF PORTB MAIN BSF PORTB,0 NOP NOP NOP (以下、NOPが100個ほど) NOP BCF PORTB,0 END
- ベストアンサー
- その他(プログラミング・開発)
- PIC アセンブラ TMR0の使い方がいまいちわかりません。
*文字数制限の為コメントや繰り返し処理プログラムの一部を省きました。解りにくくてすみません。ココに載せてくれとかあったらそっちに全部載せます。 目標としてはPICでデジタル時計を作りたいのですが、手始めに正確な1秒を作って7セグを0から9まで表示しそれを繰り返す。と言うものをやってみようと思いプログラムしましたがウンともスンとも言いません。 流れとしては 初期処理 ↓ TMR0割り込みが発生するまで無限ループ ↓ 割り込みが発生したら割り込み回数をカウントし(12,8MHzクロック、プリスケーラを256設定で1250回フラグをカウントすると1秒)1秒間分カウントが終わったら7セグの表示を切り替え無限ループに戻る どの数字まで表示したかは任意のレジスタに1を立てて判断する。PICはPIC16F628AなのでTMR1とかもあるんですが気分的にTMR0だけで時間を作ってみたかったのでTMR1とかは使ってません。で、3回くらいやり直してプログラムを作ったんですが全然動きません。 1、何処が悪いんでしょうか? 2、また、PIC16F628Aでは16番ピンがクロックの入力として使えますが その設定方法があってるかわかりません。 コンフィグ設定で OSCをHSにしてポートの設定でRA7を入力にしておけば良いんでしょうか?プログラム中の記述で合ってますでしょうか? 3,7セグをカウントアップするだけのプログラムなのに こんなに長くなる物なんですか? (プログラムが下手だから?アセンブラだから?) 4、1秒のカウント方法ですがプログラム中の記述で正確に1秒をカウントしてますか?(計算間違ってますでしょうか?) 以下、プログラムになります。 list p=pic16f628a include "p16f628a.inc" __CONFIG _LVP_OFF &_MCLRE_ON &_BODEN_OFF &_PWRTE_ON &_WDT_OFF &_HS_OSC time0 equ d'30' ;time4まで作る tcount equ d'43' count0 equ d'35' ;count7まで作る koko0 equ d'43' koko1 equ d'44' org 0 goto start org 4 goto wari start bcf intcon,gie movlw b'00000111' movwf cmcon bsf status,rp0 movlw b'00000111' movwf option_reg movlw b'10100000' movwf trisa clrf trisb bcf status,rp0 bcf status,z bcf intcon,t0if movlw b'00001000' movwf count0 ;この間に1から6の同じ処理が入ります。 movlw b'00000000' movwf count7 time movlw .30 movwf time0 bsf intcon,gie bsf intcon,t0ie clrf tmr0 roop btfsc tcount,0 call segout swapf count0,0 movwf portb swapf portb,0 movwf count0 ;この間に1から5が入ります swapf count6,0 movwf portb swapf portb,0 movwf count6 goto roop wari bcf intcon,t0ie bcf intcon,t0if incf time0,1 btfss status,z goto modori bcf status,z movlw .255 movwf time0 incf time1,1 bcf status,z goto modori bcf status,z movlw .255 movwf time0 movlw .255 movwf time1 incf time2,1 bcf status,z goto modori bcf status,z movlw .255 movwf time0 movlw .255 movwf time1 movlw .255 movwf time2 incf time3,1 bcf status,z goto modori bcf status,z movlw .255 movwf time0 movlw .255 movwf time1 movlw .255 movwf time2 movlw .255 movwf time3 incf time4,1 bcf status,z goto modori bcf status,z movlw .30 movwf time0 movlw b'00000001' movwf tcount modori bsf intcon,t0ie retfie segout clrf tcount btfss koko0,0 goto seg1 ;この中間にseg2からseg6が入ります。 btfss koko0,7 goto seg8 btfss koko1,0 goto seg9 nop goto seg0 seg1 bsfkoko0,0 movlw b'00000010' movwf count0 movlw b'00000100' movwf count1 movlw b'00000000' movwf count2 movlw b'00000000' movwf count3 movlw b'00000000' movwf count4 movlw b'00000000' movwf count5 movlw b'00000000' movwf count6 movlw b'00000000' movwf count7 nop return ;この中間にseg2からseg9が入ります seg0 clrf koko1 clf koko0 movlw b'00001000' movwf count0 movlw b'00000100' movwf count1 movlw b'00000010' movwf count2 movlw b'00000001' movwf count3 movlw b'10000000' movwf count4 movlw b'01000000' movwf count5 movlw b'00000000' movwf count6 movlw b'00000000' movwf count7 return end
- ベストアンサー
- その他(プログラミング・開発)
- PIC16F88の使い方?に関する質問(アセンブラ)
現在PICの16F88に書きこむプログラムをアセンブラで書いてます。4番ピンのMCLRをRA5として使いたいのですが、MPLABのWATCHの機能を使って、ポートAの動きを見てみると、ポートAが出力になっているはずなのに、何をしてもポートAの0~4がHにならず、ポートAのRA5はBSF,BCFの命令が利きません。コンフィグの設定が怪しいと思うのですが、自分には理由が分からないので、誰か教えてください。お願いします。(下に書いたプログラムはテスト用に書いたプログラムなので特に目的はありません) ;外部発振,セラロック20MHz使用 LIST P=PIC16F88 INCLUDE P16F88.INC __CONFIG _CONFIG1, _CP_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF BSF STATUS,RP0 MOVLW B'000000' MOVWF TRISA MOVLW B'00000000' MOVWF TRISB BCF STATUS,RP0 MAIN CLRF PORTA MOVLW B'11111111' MOVWF PORTA MOVWF PORTB BSF PORTA,0 BCF PORTA,0 BSF PORTA,1 BCF PORTA,1 BSF PORTA,2 BCF PORTA,2 BSF PORTA,3 BCF PORTA,3 BSF PORTA,4 BCF PORTA,4 BSF PORTA,5 BCF PORTA,5 GOTO MAIN END
- ベストアンサー
- その他(インターネット・Webサービス)
- 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のテストプログラムを作ったのですが、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で温度計をつくりたいのですが。アセンブラを教えてください。
初歩的な質問でもうしわけないのですが、 PIC16F819のPICを買いまして、CMOS温度センサーにオペアンプをかけ PA1につなぎ、A/D変換 PB0~7まで7セグを並列に3つつなぎ。 PA4,6,7から各ポートにトランジスタのBにいれ、Cに+5、Eに7セグのCOMをいれ 3桁の数字を表示させたいのです。 たしか、ダイナミックスキャンというものだと思います。 とりあえず、センサーから入ってきた数値をそのまま表示させたいのですが。 ダイナミックスキャンのアセンブラのプログラムがうまくいきません。 簡単に教えていただきたいのですが。 わかる方お願いします。 ハードは問題はないと思います。
- ベストアンサー
- その他(プログラミング・開発)
- PICマイコンをアセンブラでAD変換をした時に、、
現在PICマイコンの16f88を用いてアセンブラでAD変換の勉強をしています。とりあえずいろいろなサイトやデータシートを見てAD変換した結果をPORTBに出力させるテスト用のプログラムを完成させたのですが、AD変換の結果を格納するADRESLのデータをうまく読み込むことができませんでした。その時のプログラムは(結果は左詰め,X_Lは自分で定義した変数) BSF STATUS,RP0 MOVF ADRESL,W MOVWF X_L ;ADRESLの結果をX_Lに保存 BCF STATUS,RP0 MOVF X_L,W MOVWF PORTB こんな感じです。わざわざADRESLの結果をX_Lに保存しなくても直接出力することもできるんですが気にしないで下さい。で、このプログラムだとPORTBにつないだ全てのLEDが点灯します。 ところがプログラムを以下の様に書き変えたら見事にADRESLレジスタの中身が出力できました。何が起きたのでしょうか?バンクの切り替えの前にWレジスタをX_Lレジスタに書き込むのと、バンクを切り替えてからWレジスタをX_Lレジスタに書き込むのとでは結果が同じになると思うのですが、、、。 BSF STATUS,RP0 MOVF ADRESL,W BCF STATUS,RP0 MOVWF X_L MOVF X_L,W MOVWF PORTB
- ベストアンサー
- その他(プログラミング・開発)
- PICについて
今PICでの電子工作をやり始めた初心者なのですが、 急にプログラムを書き込んでもLEDが光らなくなりました。 回路などはまったくいじってないです。 プログラムは基本的なプログラムです。 テキストに沿ってやっているので。 LIST P=PIC16F84A INCLUDE P16F84A.INC __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF BSF STATUS, RP0 CLRF TRISA CLRF TRISB BCF STATUS, RP0 MOVLW B'00001111' MOVWF PORTB LOOP GOTO LOOP END プログラムに間違いはないと思います。 きちんとアセンブルもされておりますので。 アセンブルにはMPLAB IDEを使っています。 原因をさぐってみてもわからなかったのですが、 レジスタの値を確認してみたところ、 アドレスが0006のところの値がすべて00となっておりテキストと違う値となっておりました。 これが原因かなと思うのですが、これはうまくアセンブルされていないということでしょうか? アセンブルした結果は次の通りです。ちゃんと成功しているみたいです。 ですが、きちんとLEDが点灯していたときと比べてやたらとWarningの文字が多いような気がします。 初心者でもわかりやすいようにわかる方がいましたらどなたか教えてください。 よろしくお願いします。 Clean: Deleting intermediary and output files. Clean: Deleted file "STEP10.err". Clean: Deleted file "C:\PIC_program\STEP10.cod". Clean: Deleted file "C:\PIC_program\STEP10.hex". Clean: Deleted file "STEP10.lst". Clean: Done. Executing: "C:\Program Files\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F84A "STEP10.asm" /l"STEP10.lst" /e"STEP10.err" Warning[205] C:\PIC_PROGRAM\STEP10.ASM 1 : Found directive in column 1. (LIST) Warning[205] C:\PIC_PROGRAM\STEP10.ASM 2 : Found directive in column 1. (INCLUDE) Warning[205] C:\PIC_PROGRAM\STEP10.ASM 4 : Found directive in column 1. (__CONFIG) Warning[203] C:\PIC_PROGRAM\STEP10.ASM 6 : Found opcode in column 1. (BSF) Warning[203] C:\PIC_PROGRAM\STEP10.ASM 7 : Found opcode in column 1. (CLRF) Message[302] C:\PIC_PROGRAM\STEP10.ASM 7 : Register in operand not in bank 0. Ensure that bank bits are correct. Warning[203] C:\PIC_PROGRAM\STEP10.ASM 8 : Found opcode in column 1. (CLRF) Message[302] C:\PIC_PROGRAM\STEP10.ASM 8 : Register in operand not in bank 0. Ensure that bank bits are correct. Warning[203] C:\PIC_PROGRAM\STEP10.ASM 9 : Found opcode in column 1. (BCF) Warning[203] C:\PIC_PROGRAM\STEP10.ASM 11 : Found opcode in column 1. (MOVLW) Warning[203] C:\PIC_PROGRAM\STEP10.ASM 12 : Found opcode in column 1. (MOVWF) Loaded C:\PIC_program\STEP10.COD. BUILD SUCCEEDED: Sat Nov 20 19:57:55 2010
- ベストアンサー
- C・C++・C#
- 割り算の計算方法について
初歩的な質問ですいません。いつもパソコンや電卓に頼っていたら割り算の計算方法を忘れてしまいました。もちろん割り算というのは九九が基本となるということは分かっておりますが、 どの数字をどの数字と掛ければ良いか?分からなくなってしまいました。仮に553÷40という割り算の場合、40√553とすると思いますが、どの数字をどの数字と掛ければ良いか分からなくなってしまいました。割り算というのは553の中に40が幾つ入っているかということなのでしょうが・・・このように考えると、13となると思いますが、余りが30出てしまいます。余りが出ると通常は更に割り算をすると思うのですが・・・? どうも計算式が分からなくなってしまいました。また、割り算をしていると余りというものが出てくる場合があると思いますが小数点以下は、切捨てという場合は、言葉通り・の後ろに表示される数字は全て0として良かったでしょうか? とても初歩的な質問ではありますが、計算式等、詳しくご指導を頂けませんでしょうか。 どなた様か、よろしくお願いします。
- ベストアンサー
- 数学・算数
お礼
ご丁寧な解答ありがとうございます。 おかげさまで色々な計算方法があることが 分かってまいりました。 早速試してみたいと思います。 ありがとうございました。