• 締切済み

PICアセンブラの割り算のプログラムを教えて

PIC 16F84A を使いラジコンで送受信の実験をしています。 割り算で小数点以下の数字を使いたいのです。 1/10 = 0.1 あるいは 2/10 = 0.2 とかです。 プログラムの組み方が分かりません。 BCF STATUS,C RRF ***** というようなプログラムを使うようなのですが、 初心者に分かりやすく教えて頂けないでしょうか。 よろしくお願いします。

  • y4580
  • お礼率74% (29/39)

みんなの回答

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.1

結果どうしたいのか? 単に処理できればいいのならフリーで公開されてるコード探すとか、アルゴリズムは把握してるけど PIC で書けないのか、それとも少数の除算が分からないのか? 少数、とりあえず固定少数のロジックということなら、整数の除算と基本は一緒です。違いは必要なビットまで少数点以下まで処理することと、それに伴ってワークエリアを確保しておくこと。整数部8bit,小数部8bitの16bit同士の除算だと、結果は整数部16bit,小数部16bitになります。 1/10,2/10 みたいに整数同士のケースなら int a = 1, b = 10; a <<= 8; printf("%x\n", a / b); とかの下位8bitが少数部です。

y4580
質問者

お礼

ご丁寧な解答ありがとうございます。 おかげさまで色々な計算方法があることが 分かってまいりました。 早速試してみたいと思います。 ありがとうございました。

関連する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

  • 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

  • 割り算の計算方法について

    初歩的な質問ですいません。いつもパソコンや電卓に頼っていたら割り算の計算方法を忘れてしまいました。もちろん割り算というのは九九が基本となるということは分かっておりますが、 どの数字をどの数字と掛ければ良いか?分からなくなってしまいました。仮に553÷40という割り算の場合、40√553とすると思いますが、どの数字をどの数字と掛ければ良いか分からなくなってしまいました。割り算というのは553の中に40が幾つ入っているかということなのでしょうが・・・このように考えると、13となると思いますが、余りが30出てしまいます。余りが出ると通常は更に割り算をすると思うのですが・・・? どうも計算式が分からなくなってしまいました。また、割り算をしていると余りというものが出てくる場合があると思いますが小数点以下は、切捨てという場合は、言葉通り・の後ろに表示される数字は全て0として良かったでしょうか? とても初歩的な質問ではありますが、計算式等、詳しくご指導を頂けませんでしょうか。 どなた様か、よろしくお願いします。

専門家に質問してみよう