簡易ロジック計算ソフトの探し方

このQ&Aのポイント
  • アセンブラからC言語に移行したい方におすすめ
  • バイナリー数値の計算結果を表示してくれるツール
  • 簡単なロジック計算を行うためのソフトウェア
回答を見る
  • ベストアンサー

「簡易ロジック計算ソフト」みたいなモノがないかなぁ

半年くらいPICをアセンブラで動かす練習をしてきました。 最近少し複雑な仕事をさせたくて、それでどうしてもアセンブラだとこんがらかって分からなくなるので、この際C言語のプログラミングに移行したいと考えてます。 で、例えば(例下記)サンプルのコードを見ると、andやorのロジックが(自分には)複雑で、手計算ではまた分からなくなりそうです。 --------------------------------------------- (例); #include "LCD_Lib3.h" //////// データ出力サブ関数 void lcd_out(char code, char flag){ // Set upper 4 bits Data on LATB12-LATB15 LCD_DATA = (LCD_DATA & 0x0FFF) | ((unsigned int)(code & 0xF0)<<8); 以下省略 --------------------------------------------- それで、バイナリー数値をand, orなどでいくつか組み合わせた場合の(上の例のような具合の)計算結果をバイナリーで表示してくれるような「簡易ロジック計算ソフト」みたいなモノがないか探しています。 そのようなソフトの知識をお持ちの方がいらしたら教えてくださいませ。 を使っているところを分かりやすく見てみたい

質問者が選んだベストアンサー

  • ベストアンサー
  • SortaNerd
  • ベストアンサー率43% (1185/2748)
回答No.4

MPLABのシミュレータで動かせばよいのではないでしょうか。 他に、Excelを使うと入力を変えたときの結果が一覧できて便利です。 ただし式をExcel用に書き直す必要があり、またANDやORが無いのでVBAで作らなければならず面倒です。 また、JavaScriptで適当に書くのはどうでしょう。 単純な式ならCと似たようなものですから書き換えは楽で、ブラウザですぐ表示できます。

chy_farm
質問者

補足

ありがとうです。 >「MPLABのシミュレータ」 うーん、やっぱりこの手がイイですかねぇ。確かに便利ですよね。これで仮に入力しといて、シィミュレーションをそこだけオンにしてからストップさせてレジスタを拝見すれば分かることになりますね。 それでやってみますか、、、ちょっと試してみます。

その他の回答 (5)

noname#208507
noname#208507
回答No.6

> 10と01をandしたら11じゃなかったの?って感じです。これって、こっちの間違い? 間違いです。00が正しいです。 こればかりは納得しないと、これから先に進めないでしょう。 とりあえずC言語の前に、情報処理の基礎について一通り学んでみてはいかがでしょうか。

chy_farm
質問者

補足

間違いを教えてくれてありがとうです。 間違ってました。 まだまだです、、、がんばります。

回答No.5

レジスタの使い方に係わる問題ですので、いちいち計算するのではなくて この程度であれば暗算で出来るように訓練した方が良いと思います。 ・16進表示で 'LCD_DATA' の下3桁を取りだし、 ・16進表示で 'code' の2桁目を8ビット右シフトする、即ち、4桁目にする 上の2つを合成する → 新しいLCD_DATAはcodeの2桁目が4桁目になり、下3桁は元のLCD_DATAの物になる

chy_farm
質問者

補足

ありがとうです。 なかなかベテランの方ですね?暗算・手計算が間違いなく出来てるのか、まだ不安がつきまとうレベルなんですよー。 だからまずそれを確かめ算したい、というところです。 早く頭の中でささっと分かっちゃうようになりたいでする。

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

「Cコンパイラ」というソフトがあります.

chy_farm
質問者

補足

ありがとうです。 マイクロソフトの「Visual C」のことですか?ダウンロードして見てみましたが、まだこれで何をどういじったら「目的の確かめ算」ができるのかが? 替わりに「FlipCal Version 1.1 」というのをさがして試してみましたが、バイナリーのand, orがどうも納得いかないんですよ。 > 10 and 01 と入力すると BIN : 0000 と帰ってくる。 10と01をandしたら11じゃなかったの?って感じです。これって、こっちの間違い?

回答No.2

探さなくても、Windowsに標準の電卓のメニューの表示をプログラマを選んで変えれば良いだけですが(Windows7)

chy_farm
質問者

補足

早速ありがとうです。まだしぶとくXPです。XPでもありますね。でも (LCD_DATA & 0x0FFF) | ((unsigned int)(code & 0xF0)<<8) みたいに連続で入力してから、ポンッと出したいんですよ。

  • DarkMoon
  • ベストアンサー率21% (225/1046)
回答No.1

2進数の論理演算(AND,OR,NAND)機能を搭載した 関数電卓(ポケットコンピュータ)なら 昔からあります。 ソフトも探せばあるかも。

chy_farm
質問者

補足

早速ありがとうです。 試しに rakurakulogicと logic306と CEDARlogic の3つをインストールしてみましたが、これで正しいのかどうか?わかりません。これは使えそうですか?

関連するQ&A

  • ANDとかORのロジック図を描いて、1や0を設定してその回路の結果を導くソフト

    ANDとかOR、タイマー・・・を使える タイトルのようなソフトがあったと思うのですが、 どのような名前だったか覚えていません。 既存のロジックを解析したいのですが、 どうも複雑で追いきれません。 で、同様のロジックを作成して解析したいのです。 どのようなソフトがあるか教えて下さい。 恐らくないと思いつつ・・・フリーソフトでありません?

  • バイナリーで出てくるデータの変更

    計測器からバイナリーで出てくるデータを直し保存したいのですが char data1[2048] 計測器からデータを読み込み data1に入れるプログラム printf("Data read: %s\n", data1); とやると、バイナリデータのため文字化けしてしまいます。 このバイナリデータを呼び出して以下のように変更したいです。 ・11bits 4kWords 11111111111で正の最大値、 10000000000で0、 01111111111で負の最大値(一番左が符号ビット)となるバイナリデータを 01111111111で正の最大値、 00000000000で0、 11111111111で負の最大値と変更する 中心の数1024よりも大きい場合は中心の数を引き、 小さい場合には補数を取るためにー1.0を掛ければいいと思うのですが それをC言語でどのようにやればいいのかわかりません。 C言語にあまり詳しくないのですが、よろしくお願いします。

  • PDOのデータ取得方法について

    お世話になります。 以前まで「mysql_query」でSQLを実行していたのをPDOで行うように変更しております。 prepareの「?」の部分までのSQLにした場合(1)、データ取得出来ますが (2)ですとエラーも返ってこなくデータ取得出来ません。 色々と試してはいますが、全く出来なくて大変困っています。どうかご教示くださいませ。 1)SELECT * FROM table WHERE data_code = ? and data_code2 = ? 2)SELECT * FROM table WHERE data_code = ? and data_code2 = ? and (data_code3 = "null" or data_code3 is null or data_code3 = "") ※PHP5.3、MySQL5.0です。

    • 締切済み
    • PHP
  • LCDを用いたカウントダウンプログラムについて

    今、PIC16F84AとLCDを用いて255からカウントダウンするところをLCDに表示するプログラムを作っています。 開発環境は ・MPLAB X IDE ・XC8コンパイラー ・PIC Kit3 を使っています。 プログラムはコンパイル、ビルドおよび書き込みは正常にできます。 しかし、いざ動かしてみるとカウントが「255」から「254」にならず「52」になってしまいます。 プログラムのどこがおかしいか全くわかりません。 また、プログラムにおいてLCDの表示ルーチンは、「Hi-Tech C」のサンプルを使用していて (Delay関数の個所をXC8用に書き換えています。)パスコンは、つけたほうが良いのですが、今回はつけていません。 参考のため回路図とプログラムを掲載しますので解決策がありましたら教えてください。 よろしくお願いいたします。 ////////////////以下ソースコード//////////////////// /* * File: main.c * * Created on 2015/12/24, 16:37 */ //#define _LEGACY_HEADERS #include <pic.h> #include <stdlib.h> #include "lcd.h" #define _XTAL_FREQ 4000000 #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer (WDT disabled) #pragma config PWRTE = ON // Power-up Timer Enable bit (Power-up Timer is disabled) #pragma config CP = OFF // Code Protection bit (Code protection disabled) void ioport(void); void main(void) { unsigned char data; char str[2]; ioport(); lcd_init(); data=255; while(1){ lcd_clear(); lcd_goto(0x00); itoa(str,data,10); lcd_puts(str); if(data<0){ data=255; } __delay_ms(250); __delay_ms(250); data--; } } void ioport(void) { TRISA=0x00; PORTA=0x00; TRISB=0x00; PORTB=0x00; } //////////////////////////////////

  • 温度センサIC LM35DZを使った回路について

    LM35Dzを使った温度測定回路をブレッドボードで作りました。 しかし、LCDに表示される温度と部屋の中にある温度計に表示されている温度の値が違います。 現在部屋の中にある温湿度計(TEM-200-W)では「22.8℃」と表示しています。 しかし、ブレッドボードで作った温度計では「26.6℃」と表示しています。 この差(誤差?)はどうして起こるのでしょうか? また、どのようにすれば自作した温度計回路の値を温湿度計の値に近づけることができるのでしょうか。 教えてください。 参考までに回路図とプログラムを掲載します。 /////////////////////////main.c////////////////////////////////////// #include <pic.h> #include <stdlib.h> #include "lcd.h" #define _LEGACY_HEADERS #define _XTAL_FREQ 4000000 __CONFIG(CCPMX_RB0 & DEBUG_OFF & LVP_OFF & BOREN_OFF & MCLRE_ON & PWRTE_ON & WDTE_OFF & FOSC_INTOSCIO); void ioport(void); unsigned short Adconv(unsigned char ch); unsigned short Code2mV(unsigned char ch); void main(void) { unsigned short V, T1,T0; char str1[8],str2[8]; OSCCON=0x60; ioport(); lcd_init(); lcd_clear(); while(1){ V = Code2mV(2); T1 = (unsigned short)((double)V/10.0); T0= V-10*T1; itoa(str2,T1,10); lcd_goto(0x00); lcd_puts(str2); lcd_goto(0x02); lcd_putch('.'); itoa(str1,T0,10); lcd_goto(0x03); lcd_puts(str1); lcd_goto(0x04); lcd_putch(0xDF); lcd_goto(0x05); lcd_putch('C'); __delay_ms(1000); lcd_clear(); } } void ioport(void){ CMCON=0x07; TRISA=0b00000100; ANSEL=0b00000100; PORTA=0x00; ADCON1=0x80; TRISB=0x00; PORTB=0x00; } unsigned short Adconv(unsigned char ch) { ADCON0=(ch<<3)&0x38; ADCS2=0; ADCS1=0; ADCS0=1; ADON=1; ADIF=0; __delay_us(20); GO_DONE=1; while(GO_DONE); return (ADRESH<<8) | ADRESL; } unsigned short Code2mV(unsigned char ch) { unsigned short ret, data; ret=0; data=Adconv(ch); ret += data<<2; ret += data>>1; ret += data>>2; ret += data>>3; ret += data>>7; return ret; } ///////////////////////////lcd.c///////////////////// #ifndef _XTAL_FREQ // Unless specified elsewhere, 4MHz system frequency is assumed #define _XTAL_FREQ 4000000 #endif #include<htc.h> #include"lcd.h" #defineLCD_RS RA0 #defineLCD_RW RA7 #define LCD_EN RA6 #define LCD_DATAPORTB //#defineLCD_STROBE()((LCD_EN = 1),(LCD_EN=0)) void LCD_STROBE(void) { LCD_EN=1; __delay_us(1); // LCD_EN パルス幅確保 LCD_EN=0; } /* write a byte to the LCD in 4 bit mode */ void lcd_write(unsigned char c) { __delay_us(40); LCD_DATA = ( ( c >> 4 ) & 0x0F ); LCD_STROBE(); LCD_DATA = ( c & 0x0F ); LCD_STROBE(); } /* * Clear and home the LCD */ void lcd_clear(void) { LCD_RS = 0; lcd_write(0x1); __delay_ms(2); } /* write a string of chars to the LCD */ void lcd_puts(const char * s) { LCD_RS = 1;// write characters while(*s) lcd_write(*s++); } /* write one character to the LCD */ void lcd_putch(char c) { LCD_RS = 1;// write characters lcd_write( c ); } /* * Go to the specified position */ void lcd_goto(unsigned char pos) { LCD_RS = 0; lcd_write(0x80+pos); } /* initialise the LCD - put into 4 bit mode */ void lcd_init() { char init_value; //ADCON1 = 0x06;// Disable analog pins on PORTA init_value = 0x3; TRISA=0x0E; TRISB=0x00; LCD_RS = 0; LCD_EN = 0; LCD_RW = 0; __delay_ms(15);// wait 15mSec after power applied, LCD_DATA = init_value; LCD_STROBE(); __delay_ms(5); LCD_STROBE(); __delay_us(200); LCD_STROBE(); __delay_us(200); LCD_DATA = 2;// Four bit mode LCD_STROBE(); lcd_write(0x28); // Set interface length //lcd_write(0xF); // Display On, Cursor On, Cursor Blink lcd_write(0x0C);// Display On, Cursor On, Cursor Not Blink lcd_clear();// Clear screen lcd_write(0x6); // Set entry Mode

  • 2次元配列への格納方法について

    こんにちは。 FILE *fp; SIZE 1024; int n; char Buf[1025]; while((n = fread(Buf,1,SIZE,fp)) != 0){ } というように、fread関数を用いて1024バイトずつ配列Bufへ格納しています。 以下に示すようなことを行う場合、どのように記述すればよいのでしょうか? B:バイナリデータ T:数値 TBBBBBBBBB・・・・・・B←1024バイト目 TBBBBBBBBB・・・・・・B ・ ・ ・ ・ TBBBBBBBBB・・・・・・B というように、配列内に格納したいと思っています。 Tは、テキストデータで1,2,3・・・・100という整数型を格納。Bは、バイナリデータでfread関数から取得したバイナリデータを格納します。 なぜ、Tを格納したいかといいますと、どのバイナリデータを指しているか?を判別するためです。 上記のようなことを行うためには、2次元配列を使用すればよいのでしょうか? 例:char Buffer[100][1025]

  • PIC16F88に書き込んだプログラムについて

    以前、直流電圧と電流を測定する回路を製作し、その時書いたプログラムでは正常にLCDに表示されていたのですが、最近になって測定した電圧および電流を1秒間に8回更新するように書き替えました。しかしLCDに正常に表示されなくなりました。 プログラムと回路図を掲載しますのでどなたか、どうすればいいか教えてください。 よろしくお願い致します。 ////////////////////以下プログラム/////////////////////////////////////////////////// <lcd.c> #include <pic.h> //#include "lcd.h" //#include "delay.h" #define _XTAL_FREQ 4000000 #define LCD_RS RA0 #define LCD_RW RA7 #define LCD_EN RA6 #define LCD_DATA PORTB #define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0)) /* write a byte to the LCD in 4 bit mode */ void lcd_write(unsigned char c) { //DelayUs(40); __delay_us(40); LCD_DATA = ( ( c >> 4 ) & 0x0F ); LCD_STROBE(); LCD_DATA = ( c & 0x0F ); LCD_STROBE(); } /* * Clear and home the LCD */ void lcd_clear(void) { LCD_RS = 0; lcd_write(0x1); //DelayMs(2); __delay_ms(2); } /* write a string of chars to the LCD */ void lcd_puts(const char * s) { LCD_RS = 1; // write characters while(*s) lcd_write(*s++); } /* write one character to the LCD */ void lcd_putch(char c) { LCD_RS = 1; // write characters lcd_write( c ); } /* * Go to the specified position */ void lcd_goto(unsigned char pos) { LCD_RS = 0; lcd_write(0x80+pos); } /* initialise the LCD - put into 4 bit mode */ void lcd_init() { char init_value; //ADCON1 = 0x06; // Disable analog pins on PORTA init_value = 0x3; //TRISA=0; //TRISB=0; LCD_RS = 0; LCD_EN = 0; LCD_RW = 0; //DelayMs(15); // wait 15mSec after power applied, __delay_ms(15); LCD_DATA = init_value; LCD_STROBE(); //DelayMs(5); __delay_ms(5); LCD_STROBE(); //DelayUs(200); __delay_us(200); LCD_STROBE(); //DelayUs(200); __delay_us(200); LCD_DATA = 2; // Four bit mode LCD_STROBE(); lcd_write(0x28); // Set interface length //lcd_write(0xF); // Display On, Cursor On, Cursor Blink lcd_write(0x0C); lcd_clear(); // Clear screen //lcd_write(0x6); // Set entry Mode lcd_write(0x07); } <main.c> #include <pic.h> #include <stdlib.h> #include "lcd.h" #define _LEGACY_HEADERS #define _XTAL_FREQ 4000000 __CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_ON & MCLRE_OFF & BOREN_OFF & LVP_OFF & CPD_OFF & WRT_OFF & CCPMX_RB0 & CP_OFF); __CONFIG(FCMEN_OFF & IESO_OFF); unsigned int ADConv(unsigned char ch) { ADCON0=(ch<<3)&0x38; ADCS2=0; ADCS1=0; ADCS0=1; ADON=1; ADIF=0; __delay_us(20); GO_DONE=1; while(GO_DONE); return (ADRESH<<8) | ADRESL; } unsigned short Code2mV(unsigned char ch) { unsigned short ret; ret=0; ret += ADConv(ch)<<1; ret += ADConv(ch)>>1; ret += ADConv(ch)>>3; ret += ADConv(ch)>>4; ret += ADConv(ch)>>5; return ret; } void ioport(void) { CMCON=0x07; ANSEL= 0b00001110; TRISA = 0b00001110; PORTA=0x00; TRISB = 0b00000000; PORTB=0x00; } void main(void) { static double data, offset; static unsigned int v ,i,n1,n0; static unsigned char buf[8], cnt,tmp1[2],tmp2[2]; OSCCON = 0b01100000; // �N���b�N��8Mhz ioport(); ADCON1=0b11100000; lcd_init(); lcd_write(0x0D); lcd_goto(0); lcd_puts("Starting"); lcd_goto(0x40); lcd_puts("DC Meter"); __delay_ms(2500); lcd_clear(); offset=0.0; while (1) { data=0.0; for(cnt=0; cnt<10; cnt++) { data += Code2mV(1); } data /= 10.0; data *= 2.4287109375; data *= 11.0; data -= offset; v=(unsigned int)(data); n1=(unsigned int)(v/1000); n0=v-1000*n1; itoa(tmp2,n1,10); itoa(tmp1,n0,10); lcd_goto(1); lcd_puts(tmp2); lcd_goto(3); lcd_putch('.'); lcd_puts(tmp1); lcd_goto(6); lcd_puts("V"); data =0.0; for(cnt=0; cnt<10; cnt++) { data += Code2mV(2); } data /= 10.0; data *= 2.4287109375; data /= 11.0; offset = data; i=(unsigned int)(10.0 * data); itoa(buf,i,10); lcd_goto(9); lcd_puts(buf); lcd_goto(13); lcd_puts("mA"); __delay_ms(125); } }

  • PICマイコン 割り込み実行時間 (遅延時間)

    PICマイコン 割り込みの実行時間について、教えてください。 PICマイコン初心者です。 いろんな方々のプログラム例を参照させてもらっています。 PIC18F1320 を使って、外部割り込みを試していますが、トリガー信号の立ち上が入るタイミングで、割り込み処理を行いますが、トリガー信号から、割り込み動作Hが立ち上がりのが、遅くて困っております。トリガー信号から、遅れが少なくなる方法を教えてください。下記に現在のプログラ C言語を示します。 ・ポートRB1の外部割込 立ち上がりトリガー。 ・ポートRB0、RB2の状態をbstatに入れてIF文で、出力RB6 Hを出力したい。 ・トリガー立ち上がりから、約2usecも遅れてRB6がHに。遅延を出来るだけ少なくしたい。 ・ if (bstat==0)時で約2usec、if (bstat==3)時で約4usecと差が出るのも、改善したい。 #pragma code high_vector=0x8 //高位レベル割り込み void high_interrupt (void){ _asm GOTO high_isr _endasm } #pragma code //デフォルトコードセクションに戻る #pragma interrupt high_isr //割り込み処理関数宣言 void high_isr (void){ INTCON3bits.INT1IE=0; //外部割込みINT1の禁止 // INTCONbits.PEIE=0; //低位割り込み禁止 INTCONbits.GIE=0; //全割り込み禁止 INTCON3bits.INT1IF=0; //INT1の割り込みフラグをリセット if (bstat==0){ LATBbits.LATB6=1; // Delay1TCY(); //wait Delay1TCY(); //wait Delay1TCY(); //wait LATBbits.LATB6=0; // Delay1TCY(); //wait Delay1TCY(); //wait Delay1TCY(); //wait } else if(bstat==1){ LATBbits.LATB6=1; // Delay1TCY(); //wait Delay1TCY(); //wait LATBbits.LATB6=0; // Delay1TCY(); //wait Delay1TCY(); //wait } else if(bstat==2){ LATBbits.LATB6=1; // Delay1TCY(); //wait LATBbits.LATB6=0; // Delay1TCY(); //wait } else if(bstat==3){ LATBbits.LATB6=1; // Delay1TCY(); //wait LATBbits.LATB6=0; // Delay1TCY(); //wait } INTCON3bits.INT1IE=1; //外部割込みINT1の許可 // INTCONbits.PEIE=1; //低位割り込み許可 INTCONbits.GIE=1; //全割り込み許可 } // メインプログラム void main (void){ TRISB = 0b00000111; // RB0/1/2:input TRISA = 0xFF; // ALL A input // PORTB = 0; PORTA = 1; bstat= ((PORTBbits.RB0+0)+(PORTBbits.RB2*2));// RB0とRB2の状態を読み込み OpenRB1INT(PORTB_CHANGE_INT_ON & // ポートRB1の外部割込みオン RISING_EDGE_INT & //立上りエッジでオン PORTB_PULLUPS_OFF //Bポートの抵抗プルアップOFF ); RCONbits.IPEN=1; //割り込み優先順位制御ON(0:優先順位制御OFF) INTCON3bits.INT1IP=1; //INT1の割り込みを高順位割り込みにセット INTCON3bits.INT1IE=1; //INT1の割り込みを許可 INTCON2bits.INTEDG1=1; //立上がりエッジでオン // INTCONbits.PEIE=1; //低位割り込み許可 INTCONbits.GIE=1; //全割り込み許可 while (1) PIC関係サイトを探しても、割り込みでの遅れ時間については、ヒントがありませんでした。 相当な遅れは、あきらめるしかないのでしょうか? ご存知の方、アドバイスをお願い致します。

  • PIC18F1320でwarningがでる

    PIC18F1320で MPLAB X IDE v3.26 XC 8です warningがでる warningがでてもプログラムは動く warningがでなくしたい LCD液晶表示装置を使うので8ビット符号なし整数型がいい 0から255の8ビット符号なし整数型しか使わない キャラクターコードをLATB(PORTB)に送るため プログラムで-1や256になったりしないよう制御してある #include <xc.h> CONFIG 省略 ほとんど省略 // EQU unsigned char TMRA=1; unsigned char TMRB=1;//など void main(void) { TMRA = TMRA - 20; TMRB = TMR+1;//など } newmain.c: warning: (xxx) conversion to shorter data type よろしくお願いします。

  •  Hidocchiと申します。

     Hidocchiと申します。  下記エクセル計算式におきまして、ご質問させていただきます。 BB1365をクリックしますと、以下のような計算式が出てきました。 =IF(OR(P1365<>1,Q1365<>-1,AND(OR(BT1365<>1,CH1365<>1),OR(BU1365<>1,BU1365<>1),OR(BV1365<>1,CE1365<>1),OR(BX1365<>1,CB1365<>1),OR(BW1365<>1,CF1365<>1),OR(BV1365<>1,BW1365<>1),OR(CE1365<>1,CD1365<>1))),"",1) 「P1365が1でない、あるいはQ1365が1でない、その場合、……!?」    単純なIF文、AND, OR, <>の構文は理解しているつもりなのですが、上記のようにカッコが複数に及ぶような複雑なものになりますと、オツムがヒートオーバーしてしまいました。  つきましては、上記計算式のご説明を、そしてできましたなら、かような複雑な計算式を解きほぐすコツのようなものがございましたら、ご教示の程賜れば幸いでございます。  それでは、よろしくお願い申し上げます。