• 締切済み

loop が止まらなくて困ってます。

koj-t001の回答

  • koj-t001
  • ベストアンサー率0% (0/0)
回答No.2

質問のあった日にちを考えるともう解決したかもしれませんが 回答してみます。 質問内容とソースを見る限りでの推測ですが、AMFILEから読み込んだキーが CMFILEにも存在するときにWPO001Rに書き込むという流れで良いのでしょうか? その前提で話を致します。 sugiyameさんの回答にもあった通り、VALIDであろうとINVALIDであろうと WPO0001Rに出力をしてしまいます。 それと、DO文から抜ける条件がその中に無い為、抜けることができず 永遠に同じ内容を書き込む結果になっていると思います。(INVALIDの時 何が書き込まれるかは分からないですが....) これがオーバーフローの原因ではと思われます。 対応としてはまず、 1.INVALIDの場合はWRITEを行わない 2.DO文から抜ける条件をその中にいれる。 修正をしてみては如何でしょうか? 大きなお世話かもしれませんが修正例を書いておきます。 C READ AMFILE 70 * C *IN70 DOWEQ*ZERO * C AMCUST CHAINCMFILE 60 * C N60 WRITEWPO001R * C READ AMFILE 70 * C ENDDO * C SETON LR *

関連するQ&A

  • 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

  • 条件分岐のバッチファイル

    「D&Dした複数ファイルを、そのファイル名と同名のフォルダ(既に作成済み)の中にある、Aというフォルダに移動する。」という動作をするバッチファイルを、以前の質問などを参考にしながらわからないなりに作ってみました。 :LOOP if %1 == "" GOTO XEND move %1 "C:\Documents and Settings\(ユーザー名)\デスクトップ\%~n1\A" SHIFT GOTO LOOP :XEND PAUSE これで動作したのですが、これにさらに 「ファイルの拡張子がjpgならフォルダAへ、bmpならフォルダBへ、  pngかつファイルサイズが2MB以下ならばフォルダCへ、それ以上ならフォルダDへ移動」 という動作を追加したいです。結構複雑なのですが、これはバッチファイルで可能なのでしょうか? 長文の上、わかりにくくてすいません。 可能ならば、どなたか教えていただけないでしょうか。よろしくお願いします。

  • 2つのcppファイルから

    1つのexeファイルを作る必要性が出てきました。 (現在質問中の質問に関連しています。) 例えば file.cpp: #include<iostream> using namespace std; void Output(int x) { cout<<x<<endl; } void main(void) { for(int i=0;i<9;Output(i++)); } をコンパイルリンクすれば済むことを file1.cpp: #include<iostream> using namespace std; void Output(int x) { cout<<x<<endl; } file2.cpp: void main(void) { for(int i=0;i<9;Output(i++)); } という風に分かれているファイルをコンパイルリンクしなければならないのです。 cpp -e file.exe -c file1.cpp -c file2.cpp ではエラーになります。 どうすれば良いのでしょうか?

  • PICのアセンブラからC言語へ変換のアドバイスです

    C言語ならわたしはわかるのですが、アセンブラは理解できるレベルにありません。機会があればいつか挑戦したいです。話は変わりますが、 以下のアセンブラのソースでLEDの点滅まで出来ましたが、これをC言語で理解したいと思っています。翻訳できる方がいらっしゃればご協力のほどよろしくお願いします。また、そこまでは無理でもわかる範囲でアドバイスを戴けたらと思います。よろしくお願いします。 asmソースです。 list p=16f628a #include<p16f628a.inc> __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF 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 Codes 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 bsf PCON,OSCF 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 ;Delay Routine DLY_250 ; 250ms movlw d'250' movwf CNT1 DLP1;1ms movlw d'200' movwf CNT2 DLP2 nop nop decfsz CNT2,f goto DLP2 decfsz CNT1,f goto DLP1 return END

  • バッチファイルの変数について

    以下のバッチファイルを作成して実行したのですが、PATH_NAMEの変数が 設定されず、ファイルコピーがされません。 どのように、コードを記載すれば良いのでしょうか。 ご教授願います。 REM コピーするファイル数を設定 SET /a FILE_NUM = 2 REM コピー元のパスを設定 SET PATH_P1=C:\Copy01.txt SET PATH_P2=C:\SAMPLE\Copy02.txt REM 上記で設定したファイルを順番にC:\TEST\へコピーする SET /a N=1 :LOOP SET /p PATH_NAME = PATH_P%N% copy %PATH_NAME% C:\TEST\ if "%N%"== "FILE_NUM " (goto EXIT) SET /a N=N+1 goto LOOP :EXIT

  • ロックインアンプの制御プログラム

    こんにちは。 どなたか下記のプログラムをVisual Basic 6.0使用のソースコードに 変換していただける方いませんでしょうか? これはSRS社製のSR510ロックインアンプのRS232C経由でパソコンで制御するためのプログラムコードです。 10 ′ EXAMPLE PROGRAM TO READ THE SR510 OUTPUT AND RAMP THE X6 ANALOG OUTPUT 20 ′ USING IBM PC BASICA AND THE COM1: RS232 PORT. 30 ′ 40 ′ 50 ′ ON THE REAR PANEL OF THE SR510, SET SWITCH #1 OF SW2 DOWN 60 ′ AND ALL OTHER SWITCHES IN SW2 UP. (9600 BAUD, NO PARITY) 70 ′ 80 OPEN ″COM1:9600,N,8,2,CS,DS,CD″ AS #1 90 ′ SET UP COM1: PORT TO 9600 BAUD, NO PARITY, 8 DATA BITS, 2 STOP BITS, 100 ′ IGNORE CTS (CLEAR TO SEND), DSR (DATA SET READY), 110 ′ AND CD (CARRIER DETECT). 120 ′ 130 PRINT #1, ″ ″ ′CLEAR UART BY SENDING SPACES 140 PRINT #1,″Z″ ′RESET SR510 150 FOR I = 1 TO 200: NEXT I ′WAIT FOR RESET TO FINISH 160 ′ 170 X = 0 ′INIT X6 OUTPUT TO ZERO 180 ′ 190 PRINT #1, ″Q″ ′READ OUTPUT 200 INPUT #1,V1 ′INTO V1 210 ′ 220 PRINT ″OUTPUT = ″;V1 230 ′ 240 X =X + .0025 ′INCREMENT X6 OUTPUT BY 2.5 MV 250 IF X > 10 THEN X = 0 ′RESET X6 RAMP 260 PRINT #1, USING ″X6, ##.###″;X ′SET X6 OUTPUT VOLTAGE 270 ′ 280 GOTO 190 ′LOOP FOREVER 他力本願でまことに申し訳ありませんが何とぞよろしくおねがいします。

  • ファイルの内容を変換するインタプリタ?

    ファイルの内容を変換する簡単なプログラムを作りたいのですが、 CやVBなどコンパイル環境がありません。 何かいい方法はないでしょうか。 フリーかシェアウェアのインタプリタとか。 OSはWindwos XPです。 目的は、 htmlファイル内の料金を税込みに変換したい。 htmlファイルは1000ファイルある。 プログラムはこんな感じです。 ファイルを開く LOOP: 1文字読む。EOFならファイルを閉じる。 もし、文字が \(円マーク)なら --次の4文字を数字に変換 --数字を1.05倍する。 --ファイルに書く 違ったら --ファイルに書く goto LOOP このプログラムをさらに、UNIXみたいに、 foreach file (*) --プログラム.exe $file end のような感じにしたいのです。 どうぞよろしくお願い致します。

  • サブフォルダ内のファイルを読むD&D

    複数のavi動画ファイルをD&Dして avidemuxで処理するシェルスクリプト(バッチファイル)を以下のように書きました。 :start if "%~1" == "" goto end "C:\Program Files\Avidemux 2.6 - 64bits\avidemux_cli" --load %1 --output-format MP4v2 --save "%~dpn1.mp4" --quit shift goto start :end exit これを改良して フォルダ毎D&Dして、読み込んで サブフォルダ内に入っている全てのaviファイルに上記の処理をかけられる バッチファイルを作成したいのですが どのようにして作れば良いですか?

  • 友達から頼まれましたが。。。

    問題もよくわからず困っています。 問題:ファイル名を指定し~~の出現頻度を表示する。 大文字小文字は区別無し。 #include<stdio.h> int main(int argc,char *argv[]) { int i,c,freq[26]={0}; FILE *fp; if(argc<(1){ put("入力ファイルがないよっ!!"); goto(2); } argv++; if((fp=fopen((3),"r"))==NULL){ printf("ファイル%sをオープンできません。\n",(3)); goto(2); } while((c=fgetc(fp))!=EOF{ if(c(4)'a'(5)c(6)'z') freq[(7)]++; else if(c(4)'A'(5)c(6)'Z') freq[(8)]++; } fclose(fp); for(i=0;i<26;i++) printf("%cまたは%c%5d\n",(9)+i,(10)+i,freq[i]); RET:return(0); } かっこには何が入るのでしょうか?そしてこれはどんな問題なのでしょうか? 申し訳ないですがお願いします。

  • PIC、USART USART送信ができません

    下記のプログラムでUSART接続してPICマイコンからPCに送信しようとしています。 PICマイコンはP16F877 アプリにはTera Term というアプリケーションを使用しています。 このプログラムはUSARTの送信とステッピングモータを交互に動作させるプログラムです。 このプログラムを実行したところ、ステッピングモータが微小に動作したままとまってしまいました。 Tera Termにも文字は出力されませんでした。 そのため、1周目だけTXREGレジスタにデータを格納するところまでは出来ていると思います。 しかし、データ送信が行われないため、2週目以降はTSRレジスタがBUSY状態となりプログラムが進行しないのだと考えています。 以下のサイトを参考に模索しましたが、原因が分かりませんでした。 http://www.kimurass.co.jp/pic/0625p.htm http://www.picfun.com/pic19.html どのように対処したらよろしいでしょうか? 原因やアドバイスなど教えていただけたら幸いです。 ~~プログラム~~ list p=16F877 #include <p16F877.inc> __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF& _LVP_OFF w_temp EQU 0x0C status_temp EQU 0x0D ;変数 cblock 020h CNT15mS ;15mSカウンタ CNT5mS ;5mSカウンタ CNT1mS ;1mSカウンタ CNT50uS ;50μSカウンタ USART_TEMP ;USARTのワークレジスタ POINT ;point of table BUFFER ;buffer endc ;*************************割り込み退避************************** ORG 0x000 goto MAIN ORG 0x004 movwf w_temp movf STATUS,w movwf status_temp movf status_temp,w movwf STATUS swapf w_temp,f swapf w_temp,w retfie ;************************************************************* MAIN ;-----------------------------設定---------------------------- ;BANK1 Setting bsf STATUS,RP0 clrf TRISA movlw B'11110000' clrf TRISB movlw B'01000000' movwf TRISC ;RXピンを入力に設定 movlw B'00100000' movwf TXSTA ;SET TX MODE movlw 0FH ;Set Baud Rate 19Kbps movwf SPBRG ;Set BRG ;BANK0 Setting bcf STATUS,RP0 clrf INTCON movlw 07H movwf ADCON1 ;------------------------------------------------------------ ;----------------------------初期化--------------------------- clrf PORTA clrf PORTB bcf STATUS,C bcf STATUS,Z ;------------------------------------------------------------ ;===========================MAIN_LOOP======================== MAIN_LOOP bsf STATUS,RP0 READY_CHECK btfss TXSTA,TRMT goto READY_CHECK bcf STATUS,RP0 movlw 'A' movwf TXREG call STEPPING_MOTTER goto MAIN_LOOP ;============================================================ ;================= STEPPING MOTORE ========================== STEPPING_MOTTER call wait1ms call wait1ms movlw B'00000001' movwf PORTB call wait1ms call wait1ms movlw B'00000010' movwf PORTB call wait1ms call wait1ms movlw B'00000100' movwf PORTB call wait1ms call wait1ms movlw B'00001000' movwf PORTB RETURN ;================= 15mS WAIT ================================ wait15ms MOVLW d'3' MOVWF CNT15mS wait15ms_loop CALL wait5ms DECFSZ CNT15mS,F GOTO wait15ms_loop RETURN ;================= 5mS WAIT ================================= wait5ms MOVLW d'100' MOVWF CNT5mS wait5ms_loop CALL wait50us DECFSZ CNT5mS,F GOTO wait5ms_loop RETURN ;================= 1mS WAIT ================================= wait1ms MOVLW d'20' MOVWF CNT1mS wait1ms_loop CALL wait50us DECFSZ CNT1mS,F GOTO wait1ms_loop RETURN ;================= 50μS WAIT ================================ wait50us ; 1サイクル(4クロック):0.2μS ; 50μS=0.2μS×250サイクル MOVLW d'82' ;1 MOVWF CNT50uS ;1 wait50us_loop DECFSZ CNT50uS,F ;1 GOTO wait50us_loop ;2 RETURN ;2+1 ;============================================================ ;------------------------------------------------------------ END