- 締切済み
アセンブリ言語から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
- hijirisan
- お礼率0% (0/5)
- C・C++・C#
- 回答数5
- ありがとう数0
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- don_go
- ベストアンサー率31% (336/1059)
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)
裏技ですが, 「C 言語」の方に, アセンブラをそのまま入れる文があるだろうから (たいてい asm とか _asm とか __asm とか), それを使う. 一応「C 言語」ですよね.
- zwi
- ベストアンサー率56% (730/1282)
私が推測すると、C言語でキッチンタイマーを作る課題が出て、ネットを探したらアセンブラのキッチンタイマーのソースコードが見つかったので、C言語に変換してくださいって言う課題の丸投げだと思いますが違いますか? アセンブラが分かっていて、C言語の勉強中で、課題としてキッチンタイマーを作りたいと言う状況では無い気がします。 この掲示板は、手助けは出来ますが、丸々作成することは規約に反して削除条件に該当しますので、どちらにしろ変換は無理なんですが、自分で出来ている部分と分からない部分を必ず書き込んでください。全然出来ていないってのは無しですよ。 morigannさんも書かれていますが、周辺回路の仕様やプログラムの仕様も不明だと手助けは不可能ですから必ず書き込んでください。
- morigann
- ベストアンサー率17% (57/329)
説明不足で申し訳ありませんでした。 自分の発言した仕様書とは、 「キッチンタイマー」を作る上でどのように作るかの?を示した物です。 例えば、 「数字表示は何桁にするのか?」 「タイマーは1秒刻み?にするのか?」 「デジタル表示の配置順は?」 「1桁表示時の10の位の表示はどうするのか?」 など「キッチンタイマー」と一言で言っても決めないと出来ない事は多々あります。 質問者様が「自分でこのソースを作ったがここまでしか出来なかった」のように発言されておられましたので、元になる仕様書の開示を求めました。 もし質問者様が完全オリジナルで作られたのであれば、どのように設計されたかをお教えいただきたいと思います。
- morigann
- ベストアンサー率17% (57/329)
「しかしアセンブリ言語でしかわかりませんでした。」 どういう状況になったらそうなるんでしょう? 課題などを丸写しにしたような質問についてはマナー違反として削除されますよ。 とりあえず簡単に見たところ「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
- ベストアンサー
- C・C++・C#
- 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 何日も堂々巡りをしてまして埒があかないので質問させていただきました。 どこが間違えているのでしょうか???? よろしくお願いいたします。
- ベストアンサー
- その他(インターネット・Webサービス)
- ポケコン 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がすべて立つのですが、 ループ中にやっても何も変化がありません。 ループしていないか、判定ができていないかのどちらかなのですが・・・。 デバッグしてみても、きちんとループ・判定できているのですが いざ焼いてみると動作しません。わかりますでしょうか。
- ベストアンサー
- その他(プログラミング・開発)