• 締切済み

アセンブリ言語からC言語への変換について

PICでキッチンタイマーを作ろうとしているんですが、C言語で作ることが指定されています。しかしアセンブリ言語でしかわかりませんでした。そこで次のアセンブリ言語のプログラムをC言語に直して下さい。 スタート/ストップ処理 start_timer BTFSC working,0 GOTO stop_timer BSF working,0 CALL beep CALL wait wait_start_sw BTFSC PORTA,START_SW GOTO main CALL wait GOTO wait_start_sw stop_timer BCF working,0 CALL beep CALL wait GOTO wait_start_sw タイマのリセット処理 reset_timer BTFSC working,0 GOTO main CALL init_timer CALL beep CALL wait wait_reset_sw BTFSC PORTA,RESET_SW GOTO main CALL wait GOTO wait_reset_sw 7セグメントLEDの表示操作 … MOVLW 2 CALL getdigit MOVWF PORTB … getdigit ADDWF PCL,1 RETLW 11000000b RETLW 11111001b RETLW 10100100b RETLW 10110000b RETLW 10011001b RETLW 10010010b RETLW 10000010b RETLW 11011000b RETLW 10000000b RETLW 10010000b

みんなの回答

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.5

http://www.cqpub.co.jp/toragi/TRBN/trsample/2004/tr0405/0405bg5.pdf はじめてのPICマイコン入門<第5回> キッチン・タイマの製作(後編) 上記のソースからコメントを取って丸投げした模様... ハードの仕様は下記を参照の事 http://www.cqpub.co.jp/toragi/TRBN/trsample/2004/tr0404/0404bg4.pdf はじめてのPICマイコン入門<第4回> キッチン・タイマの製作(前編)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

裏技ですが, 「C 言語」の方に, アセンブラをそのまま入れる文があるだろうから (たいてい asm とか _asm とか __asm とか), それを使う. 一応「C 言語」ですよね.

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

私が推測すると、C言語でキッチンタイマーを作る課題が出て、ネットを探したらアセンブラのキッチンタイマーのソースコードが見つかったので、C言語に変換してくださいって言う課題の丸投げだと思いますが違いますか? アセンブラが分かっていて、C言語の勉強中で、課題としてキッチンタイマーを作りたいと言う状況では無い気がします。 この掲示板は、手助けは出来ますが、丸々作成することは規約に反して削除条件に該当しますので、どちらにしろ変換は無理なんですが、自分で出来ている部分と分からない部分を必ず書き込んでください。全然出来ていないってのは無しですよ。 morigannさんも書かれていますが、周辺回路の仕様やプログラムの仕様も不明だと手助けは不可能ですから必ず書き込んでください。

  • morigann
  • ベストアンサー率17% (57/329)
回答No.2

説明不足で申し訳ありませんでした。 自分の発言した仕様書とは、 「キッチンタイマー」を作る上でどのように作るかの?を示した物です。 例えば、 「数字表示は何桁にするのか?」 「タイマーは1秒刻み?にするのか?」 「デジタル表示の配置順は?」 「1桁表示時の10の位の表示はどうするのか?」 など「キッチンタイマー」と一言で言っても決めないと出来ない事は多々あります。 質問者様が「自分でこのソースを作ったがここまでしか出来なかった」のように発言されておられましたので、元になる仕様書の開示を求めました。 もし質問者様が完全オリジナルで作られたのであれば、どのように設計されたかをお教えいただきたいと思います。

  • morigann
  • ベストアンサー率17% (57/329)
回答No.1

「しかしアセンブリ言語でしかわかりませんでした。」 どういう状況になったらそうなるんでしょう? 課題などを丸写しにしたような質問についてはマナー違反として削除されますよ。 とりあえず簡単に見たところ「RETLW」で0~9のセグメントのON/OFFビットを設定してるんだなぁ・・・ Cではテーブルにして・・・かな。 補足:ソースより仕様書出して下さい!仕様書!

関連するQ&A

  • 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ループ状態ですがテキストとは違います。 何かおかしいのでしょうか?

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

  • PICでのアップダウンカウンタについて

    以下のプログラムはポートAにアップカウントSWとダウンカウントSW付けて 8bitの2進数データをアップダウンさせるプログラムですが、下限と上限を決めて それ以上、以下カウントしないようにプログラムを変更したいのですが、どうすればいいと思いますか? ちなみにこのプログラムだと255(0)までカウントしたら0(255)に戻ります 下限は 0b00000000(0) 上限は 0b01100100(100) です。 コンフィギュレーション、CALL TIMELOOP1はチャタリング対策のプログラムなので省略して投稿します。 MAIN BTFSS PORTA,1;RA1のスイッチがOFF(1)なら次行をスキップ GOTO COUNTUP;カウントアップへ BTFSS PORTA,0;RA0のスイッチがOFF(1)なら次行をスキップ GOTO COUNTDOWN;カウントダウンへ BTFSS PORTA,2;RA0のスイッチがOFF(1)なら次行をスキップ GOTO MAIN;カウントダウンへ BTFSS PORTA,3;RA0のスイッチがOFF(1)なら次行をスキップ GOTO MAIN;カウントダウンへ GOTO MAIN COUNTUP BTFSS PORTA,1;RA1のスイッチがOFF(1)になったら次行をスキップ GOTO $-1;上の行へ戻る CALL TIMELOOP1;チャタリング対策 INCF COUNT,F;COUNT値を1増やして、 MOVF COUNT,W;Wレジスタに書き込み、 MOVWF PORTB;PORTBへ送る。 GOTO MAIN COUNTDOWN BTFSS PORTA,0 GOTO $-1 CALL TIMELOOP1 DECF COUNT,F;COUNT値を1減らして、 MOVF COUNT,W;Wレジスタに書き込み、 MOVWF PORTB;PORTBへ送る。 GOTO MAIN

  • 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 修正点などありましたら教えて下さい。

  • PIC16F84Aから16F628Aの変換について

    以前PIC16F84Aで問題なく動作しているプログラムを 初期設定を変えて(これでいいのか?も疑問)16F628Aで動かそうとしていますが サブルーチンに入り「タイマー」のルーチンから抜け出せないみたいです。 BILD ALL ではエラーは出ません。 割込みは正常に動作します。 どこがいけないのでしょうか? よろしくお願いいたします。 プログラムはこちらです。 ;------------------------------------------------------------------------- ;     初期設定 list P=pic16f628a include "p16f628a.inc" __CONFIG _HS_OSC & _CP_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_ON & _LVP_OFF & _MCLRE_OFF ORG 0 GOTO MAIN ;----------------------------------------------------------------------- ; 割り込み処理 ORG 4     ;割り込みアドレス CLRW CLRF PORTB     ;ポートBクリア GOTO MAIN ;----------------------------------------------------------------------- ; メインプログラム MAIN   BCF STATUS,RP0          MOVLW B'00000111'         MOVWF CMCON         BSF INTCON,INTE     ;割りこみ許可?          BSF STATUS,RP0     ;ポートAを全て入力に設定         MOVWF TRISA          MOVLW H'01'     ;ポートBは0(ゼロ)以外は出力に設定         MOVWF TRISB         MOVLW 90H     ;INT割り込み許可         MOVWF INTCON         BCF STATUS,RP0     ;ポートBをクリア         CLRF PORTB          CLRW ;---------------------------------------------------------------------- ; スイッチ入力チエック LOOP    BTFSS PORTA,0     ;オープンSWがONか?          GOTO OPEN      ;ONだったら OPENへ         GOTO LOOP ;----------------------------------------------------------------------- ; オープン動作 OPEN    MOVLW 010H      ;ポートB4番に5V出力(リレーON)          MOVWF PORTB        MOVLW D'250'      ;動作時間 '250'設定         MOVWF 0EH      ;アドレス0EHに250を入力          CALL LOOP3      ;サブルーチンLOOP3を呼び出す        GOTO MAIN      ;サブルーチンが終わったら MAIN に戻れ ;------------------------------------------------------------------------ ;----------------------------------------------------------------------- ; サブルーチン(タイマー) TIMER1    MOVLW D'220'           MOVWF 0CH LOOP1    NOP           DECFSZ 0CH,1           GOTO LOOP1         RETURN TIMER2     MOVLW D'100'      ;アドレス0DHに100を入力          MOVWF 0DH LOOP2    NOP           CALL TIMER1      ;TIMER1を呼び出し(行く)           DECFSZ 0DH,1      ;アドレス0DH から1を引き算する           GOTO LOOP2      ;結果が"0"でなかったら LOOP2に戻ってまた引き算          RETURN       ;引き算の結果が"0"になったら「CALL」した「次に(下)」へ戻る LOOP3    NOP      ;何もしない          CALL TIMER2      ;TIMER2を呼び出す(行く)         DECFSZ 0EH,1         GOTO LOOP3          RETURN END    END

  • フローチャート、教えて!

    このプログラムのフローチャートなんですけど・・・。 list P=PIC16F84A INCLUDE "P16F84A.INC" __CONFIG _HS_OSC&_WDT_OFF&_PWRTE_ON ; WCNT EQU 018H ; ORG 0 GOTO START ; ORG 05H ; START BSF STATUS,RP0 MOVLW 03H MOVWF TRISA BCF STATUS,RP0 ; st CALL SPEAKER goto st ; SPEAKER BCF PORTA,2 CALL WAIT2 BSF PORTA,2 CALL WAIT2 RETURN ; WAIT2 MOVLW D'249' ; MOVWF WCNT ; WAIT3 NOP ; NOP ; NOP ; NOP ; NOP ; NOP ; NOP ; DECFSZ WCNT,F ; GOTO WAIT3 ; RETURN ; ; WAIT4 NOP ; DECFSZ WCNT,F ; GOTO WAIT3 ; 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 何日も堂々巡りをしてまして埒があかないので質問させていただきました。 どこが間違えているのでしょうか???? よろしくお願いいたします。

  • ポケコン C言語でBEEP関数を作りたい

    ポケコンにはまっている高校生です。 最近C言語でBASICでいうBEEP命令をC言語でも出来ないかと考えています。 ゲームに使ったり、BASICのBEEP命令では出来ない和音とかも出来るようにしようと考えています。 そこで、簡単なプログラムを作って、音が鳴るかをテストしてみたのですが、 圧電スピーカーから音が鳴ってくれません。 機種は SHARP G850V 作ったプログラムはこのようなものです。 void wait(int);     /* プロトタイプ宣言 */ main() {   int w=0;   fopen("pio:", "w+") /*ポケコンの11ピンを8ビット制御モードに。のはず・・・*/   while(1){       /*ループ開始*/      pioput(4);    /*11ピンの7ピンを1(high)に*/      wait(1000);      pioput(0);    /*8ビット出力をすぺて0(low)に*/      wait(1000);   } } void wait(x){       /*時間つぶし(周波数変更用)*/ int y; for(y=0; y < x*10; y++); } 圧電ブザーを11ピンの3ピン(GND)と7ピン(BASICでBEEPを使うときここにつなぐと音が出るのでこのピンにしてみた) につないで実行してみたのですが、 音はならず、耳を近づけるとかすかにノイズのような音が聞こえます。 wait関数での時間をつぶす長さも100~100000くらいで試してみましたが、聞こえるのはノイズばかりです。 情報が足りなかったりしたら言ってください。 ポケコンやプログラミングに詳しい方 回答お願いします。

  • PICアセンブラ、これって変?

    PIC16F84でのアセンブラなのですが、下記のプログラムで・・・。 MAIN     MOVLW B'00000000'     MOVWF PORTB     BTFSC PORTA,3     GOTO  FINISH     GOTO  MAIN FINISH     MOVLW B'11111111'     MOVWF PORTB     END PortAが入力、Bが出力なのですが、MAINでループしながら待機、 PortAの3bitめがHになったらPortBをすべて立てて終了という感じに なると思いますが、上手くいかないんです。 3bit目にあらかじめ+5Vを印加しておくと、一瞬でPortBがすべて立つのですが、 ループ中にやっても何も変化がありません。 ループしていないか、判定ができていないかのどちらかなのですが・・・。 デバッグしてみても、きちんとループ・判定できているのですが いざ焼いてみると動作しません。わかりますでしょうか。