[戻る]
新着表示

Re^3: CASTの使い方 投稿者:n 投稿日:2017/01/29(Sun) 16:13:00 No.808

Zmanさん

nです。

i2*(long)i3*(long long)i4
の評価は、もう少し複雑です。

キャスト演算子は前置型の2項演算子です。
(op1)op2と記し、op2のみ評価してop1の型に型変換します。

乗算は優先順位が低いので、キャストより後に評価されます。
ただし、a*b*cの乗算は、どこから先に行われるかわかりません。
a*b
b*c
a*c...等、どれもあり得るのです。

同じソースコードでも、処理系が異なると実行結果も変わり得ます。
人間が行う乗算の順序を前提にしてCの式を考えてはいけません。
互換性を高めるためにも、式を複数行に分けることをお勧めします。

> nさん、回答ありがとうございます。
>
> >i2*i3を評価した段階でint型のオーバーフローが起こり得ます。
> そのために i2*(long)i3*i4 としたとき
>
> i2*(long)i3 はlong 範囲内としても
> i2*(long)i3*i4 はlong型としてオーバーフローする場合は
> i2*(long)i3*(long long)*i4 とすれば
>
> i2*(long)i3 の計算結果(long)をlong long に変換して (long long)i4 に掛けることになる
> ・・・ということでよいでしょうか?
>
> > Zmanさん
> >
> > はじめましてnです。
> >
> > i1=L1-(i2*(long)i3*i4/L2);
> > のように、先にint型変数をキャストする必要があります。
> >
> > (long long)(i2*i3*i4/L2)では、
> > i2*i3を評価した段階でint型のオーバーフローが起こり得ます。
> > 演算結果をあとからlonglongにキャストしても手遅れです。
> >
> > 1. (long)i2*i3*i4
> > または、
> > 2. i2*(long)i3*i4
> > のように、int型の変数をlong型へキャストします。
> >
> > 同じ優先順位の演算の評価順序は、処理系依存なので、
> > 2のほうが安全です。
> >
> >
> > > CCSCコンパイラ(PCM)でキャストを使うときの考え方を教えてください。
> > >
> > > int i1,i2,i3,i4;
> > > long L1,L2;
> > >
> > > i1=L1-(i2*i3*i4/L2);
> > >
> > > の計算をするとき
> > > ただし、実際の値としては
> > > (i2*i3*i4/L2)はlong範囲内
> > >  L1-(i2*i3*i4/L2)はint範囲内
> > > になるものとします。
> > >
> > > 1. (i2*i3*i4) がlong範囲を超える場合
> > >   i1=L1-(long long)(i2*i3*i4/L2)
> > > i2,i3,i4,L2 は (long long)に自動変換されて計算される
> > >   
> > > 2. (i2*i3*i4) がlong範囲内の場合
> > > (i2*i3*i4/L2) においてL2がlongなのでi2,i3,i4はlongに自動変換されて計算されるので
> > > i1=L1-(i2*i3*i4/L2)
> > >
> > > ・・・でよいでしょうか?
> > > 間違いがありましたら、ご指摘をお願いします。

Re^2: CASTの使い方 投稿者:Zman 投稿日:2017/01/29(Sun) 14:33:51 No.807

nさん、回答ありがとうございます。

>i2*i3を評価した段階でint型のオーバーフローが起こり得ます。
そのために i2*(long)i3*i4 としたとき

i2*(long)i3 はlong 範囲内としても
i2*(long)i3*i4 はlong型としてオーバーフローする場合は
i2*(long)i3*(long long)*i4 とすれば

i2*(long)i3 の計算結果(long)をlong long に変換して (long long)i4 に掛けることになる
・・・ということでよいでしょうか?

> Zmanさん
>
> はじめましてnです。
>
> i1=L1-(i2*(long)i3*i4/L2);
> のように、先にint型変数をキャストする必要があります。
>
> (long long)(i2*i3*i4/L2)では、
> i2*i3を評価した段階でint型のオーバーフローが起こり得ます。
> 演算結果をあとからlonglongにキャストしても手遅れです。
>
> 1. (long)i2*i3*i4
> または、
> 2. i2*(long)i3*i4
> のように、int型の変数をlong型へキャストします。
>
> 同じ優先順位の演算の評価順序は、処理系依存なので、
> 2のほうが安全です。
>
>
> > CCSCコンパイラ(PCM)でキャストを使うときの考え方を教えてください。
> >
> > int i1,i2,i3,i4;
> > long L1,L2;
> >
> > i1=L1-(i2*i3*i4/L2);
> >
> > の計算をするとき
> > ただし、実際の値としては
> > (i2*i3*i4/L2)はlong範囲内
> >  L1-(i2*i3*i4/L2)はint範囲内
> > になるものとします。
> >
> > 1. (i2*i3*i4) がlong範囲を超える場合
> >   i1=L1-(long long)(i2*i3*i4/L2)
> > i2,i3,i4,L2 は (long long)に自動変換されて計算される
> >   
> > 2. (i2*i3*i4) がlong範囲内の場合
> > (i2*i3*i4/L2) においてL2がlongなのでi2,i3,i4はlongに自動変換されて計算されるので
> > i1=L1-(i2*i3*i4/L2)
> >
> > ・・・でよいでしょうか?
> > 間違いがありましたら、ご指摘をお願いします。

Re: CASTの使い方 投稿者:n 投稿日:2017/01/28(Sat) 23:50:27 No.806

Zmanさん

はじめましてnです。

i1=L1-(i2*(long)i3*i4/L2);
のように、先にint型変数をキャストする必要があります。

(long long)(i2*i3*i4/L2)では、
i2*i3を評価した段階でint型のオーバーフローが起こり得ます。
演算結果をあとからlonglongにキャストしても手遅れです。

1. (long)i2*i3*i4
または、
2. i2*(long)i3*i4
のように、int型の変数をlong型へキャストします。

同じ優先順位の演算の評価順序は、処理系依存なので、
2のほうが安全です。


> CCSCコンパイラ(PCM)でキャストを使うときの考え方を教えてください。
>
> int i1,i2,i3,i4;
> long L1,L2;
>
> i1=L1-(i2*i3*i4/L2);
>
> の計算をするとき
> ただし、実際の値としては
> (i2*i3*i4/L2)はlong範囲内
>  L1-(i2*i3*i4/L2)はint範囲内
> になるものとします。
>
> 1. (i2*i3*i4) がlong範囲を超える場合
>   i1=L1-(long long)(i2*i3*i4/L2)
> i2,i3,i4,L2 は (long long)に自動変換されて計算される
>   
> 2. (i2*i3*i4) がlong範囲内の場合
> (i2*i3*i4/L2) においてL2がlongなのでi2,i3,i4はlongに自動変換されて計算されるので
> i1=L1-(i2*i3*i4/L2)
>
> ・・・でよいでしょうか?
> 間違いがありましたら、ご指摘をお願いします。

CASTの使い方 投稿者:Zman 投稿日:2017/01/28(Sat) 15:44:33 No.805

CCSCコンパイラ(PCM)でキャストを使うときの考え方を教えてください。

int i1,i2,i3,i4;
long L1,L2;

i1=L1-(i2*i3*i4/L2);

の計算をするとき
ただし、実際の値としては
(i2*i3*i4/L2)はlong範囲内
 L1-(i2*i3*i4/L2)はint範囲内
になるものとします。

1. (i2*i3*i4) がlong範囲を超える場合
  i1=L1-(long long)(i2*i3*i4/L2)
i2,i3,i4,L2 は (long long)に自動変換されて計算される
  
2. (i2*i3*i4) がlong範囲内の場合
(i2*i3*i4/L2) においてL2がlongなのでi2,i3,i4はlongに自動変換されて計算されるので
i1=L1-(i2*i3*i4/L2)

・・・でよいでしょうか?
間違いがありましたら、ご指摘をお願いします。

Re^5: lcdのビジーチェック 投稿者:negishi 投稿日:2017/01/22(Sun) 15:44:56 No.803

lcd_cmd(0x0e);がシミレーションではLATBは0x0eになるのですがPORTBは0x0cとなりカーソルが表示されなかったので割り込みピンint0(RB0)と
int1(RB1)を入力でなく出力に設定したところPORTBは0x0eになったのですが、PORTBが0x0eとなったのと同時に今度はlwdiv.cというファイルが
開いてそこから先にシミレーションが進まなくなってしまいました。どうしたら先に進めることが出来るでしょうか?



> ヘッダファイルなのでmain関数はありません
> lcd_initの辺りをそこら中にブレークポイントを作ったところ
> lcd_incmdはパスしてlcd_cmd(0x06)のcmdoutの処理が終わった所で止まりました。ヘッダーファイルからソースコードへは戻れませんでした。
>
>
> > どこで止まるのかブレークポイントを付けて、デバッグを繰り返して下さい。
> > void lcd_init()のlcd_incmdで止まるしかないです。
> > main()がないので、何とも言えませんが、キチンと呼び出せていないかどちらかです。
> >
> > > やはりbit_testが無いとうまく動かないのでしょうか。
> > > bit_testをつけるとビルドで失敗します
> > > 複数個所あるwhile((lcd_ready(),7));をコメントアウトして下さい。で
> > > コメントアウトして無視するとlcd_initが実行されません。
> > > シミュレーションでも動いてないし、実際にPICに書いてもLCDが何も反応が無くLCDの初期化がされてないみたいです。
> > > どっかからbit_test関数を持ってこれないでしょうかね。ccs-cのコンパイラーではbit_testが動いていたので探せばどっかに関数がありますかね。
> > > なんでxc8のコンパイラでわざわざプログラムを作ったのかはitoa関数が使えるからなんですがxc8ではbit_test関数はないのですかね。困りました。
> > >
> > >
> > >
> > >
> > > > mplabxでデバッグしましたか?
> > > > 関数がないと言われているのではないですか?
> > > > while(bit_test(lcd_ready(),7))が正しそうですが、
> > > > bit_test()関数がどこにあるかは知りません。
> > > > 関数の場所が分からなければ、複数個所あるwhile((lcd_ready(),7));をコメントアウトして下さい。
> > > > コピペするならば、きちんとコピペしましょう。
> > > >
> > > > > lcdのビジーチェックでデータビット7が0になってもビジーチェックを抜けられません。どうすれば抜けられるか教えていただけますか?ソースコードは以下のようになっています。開発環境はmplabx idev3.5 xc8v1.4です 
> > > > >
> > > > > #define _XTAL_FREQ 20000000 // クロック周波数設定
> > > > > /**** 液晶表示用設定 *****/
> > > > > #define DB7 RB7 //DB7 pin
> > > > > #define DB6 RB6 //DB6 pin
> > > > > #define DB5 RB5 //DB5 pin
> > > > > #define DB4 RB4 //DB4 pin
> > > > > //#define DB3 pin_b3 //DB3 pin
> > > > > //#define DB2 pin_c6 //DB2 pin
> > > > > //#define DB1 pin_c5 //DB1 pin
> > > > > //#define DB0 pin_c4 //DB0 pin
> > > > > #define RS LATD7 //RS pin
> > > > > #define RW LATD6 //RW pin
> > > > > #define STB LATD5 //E pin (STB pin)
> > > > > #define bmode 0x0f
> > > > > ///////////////////////////////////////////////
> > > > > // LCD control Library
> > > > > // lcd_init()-------- initialize
> > > > > // lcd_ready()------- busy check
> > > > > // lcd_cmd(cmd)------ send command
> > > > > // lcd_data(string)-- display string
> > > > > // lcd_clear() ------ clear display
> > > > > ///////////////////////////////////
> > > > >
> > > > > /// lcd ready check function
> > > > > int lcd_ready(){
> > > > > int high,low;
> > > > > TRISB=(0x0f | 0xF0); //upper is input
> > > > > LATDbits.RS=0;//_low(rs)
> > > > > LATDbits.RW=1;//high(rw); //read mode
> > > > > LATDbits.STB=1;//high(stb);
> > > > > high=PORTB &0xF0; //input upper
> > > > > LATDbits.STB=0;//low(stb);
> > > > >
> > > > > LATDbits.STB=1;//_high(stb);
> > > > > low=PORTB & 0xF0; //input lower
> > > > > LATDbits.STB=0;//low(stb);
> > > > > TRISB=(0x0f);
> > > > > return(high | (low>>4)); //end check
> > > > > }
> > > > >
> > > > > ////////// lcd display data function
> > > > > void lcd_data(int asci){
> > > > > //db = asci; //set upper data
> > > > > LATB=(asci);
> > > > > LATDbits.RW=0;//_low(rw); //set write
> > > > > LATDbits.RS=1; //set rs high
> > > > > LATDbits.STB=1; //strobe
> > > > > LATDbits.STB=0; //low(stb);
> > > > >
> > > > > asci=asci<<4;
> > > > > LATB=(asci); //set lower data
> > > > > LATDbits.STB=1; //strobe
> > > > > LATDbits.STB=0; //low(stb);
> > > > > while((lcd_ready(),7));
> > > > >
> > > > >
> > > > > }
> > > > > ////////// lcd command out function
> > > > > int cmd;
> > > > > void cmdout(int cmd){
> > > > > LATB=(cmd);
> > > > > LATDbits.RW=0; //set write
> > > > > LATDbits.RS=0; //set rs low
> > > > > LATDbits.STB=1; //strobe
> > > > > LATDbits.STB=0;
> > > > > cmd=cmd<<4;
> > > > > PORTB=(cmd);
> > > > > LATDbits.STB=1; //strobe
> > > > > LATDbits.STB=0;
> > > > > }
> > > > >
> > > > > void lcd_cmd(int cmd){
> > > > > cmdout(cmd);
> > > > > while(( lcd_ready(),7)); //end check
> > > > > }
> > > > >
> > > > > ///// lcd display clear function
> > > > > //MCHP void lcd_clear();{
> > > > > void lcd_clear(){
> > > > > lcd_cmd(1); //initialize command
> > > > > __delay_ms(100);
> > > > > }
> > > > >
> > > > > ///////// lcd initialize function
> > > > > //MCHPvoid lcd_incmd(int cmd);{
> > > > > void lcd_incmd(int cmd){
> > > > > //db = cmd; //mode command
> > > > > LATB=(cmd);
> > > > > LATDbits.RW=0; //set write
> > > > > LATDbits.RS=0; //set rs low
> > > > > LATDbits.STB=1; //strobe
> > > > > LATDbits.STB=0; //low(stb);
> > > > > __delay_ms(10);
> > > > > }
> > > > >
> > > > > //MCHP void lcd_init();{
> > > > > void lcd_init(){
> > > > > __delay_ms(15);
> > > > > lcd_incmd(0x30); //8bit mode set
> > > > > __delay_ms(5);
> > > > > lcd_incmd(0x30); //8bit mode set
> > > > > __delay_ms(5);
> > > > > lcd_incmd(0x30); //8bit mode set
> > > > > __delay_ms(5);
> > > > > lcd_incmd(0x20); //4bit mode set
> > > > > __delay_ms(5);
> > > > >
> > > > > lcd_cmd(0x2C); //DL=0 4bit mode
> > > > > lcd_cmd(0x08); //disolay off C=D=B=0
> > > > > lcd_cmd(0x0e); //display on C=D=1 B=0
> > > > > lcd_cmd(0x06); //entry I/D=1 S=0
> > > > > }

Re^4: lcdのビジーチェック 投稿者:negishi 投稿日:2017/01/19(Thu) 21:25:41 No.801

ヘッダファイルなのでmain関数はありません
lcd_initの辺りをそこら中にブレークポイントを作ったところ
lcd_incmdはパスしてlcd_cmd(0x06)のcmdoutの処理が終わった所で止まりました。ヘッダーファイルからソースコードへは戻れませんでした。


> どこで止まるのかブレークポイントを付けて、デバッグを繰り返して下さい。
> void lcd_init()のlcd_incmdで止まるしかないです。
> main()がないので、何とも言えませんが、キチンと呼び出せていないかどちらかです。
>
> > やはりbit_testが無いとうまく動かないのでしょうか。
> > bit_testをつけるとビルドで失敗します
> > 複数個所あるwhile((lcd_ready(),7));をコメントアウトして下さい。で
> > コメントアウトして無視するとlcd_initが実行されません。
> > シミュレーションでも動いてないし、実際にPICに書いてもLCDが何も反応が無くLCDの初期化がされてないみたいです。
> > どっかからbit_test関数を持ってこれないでしょうかね。ccs-cのコンパイラーではbit_testが動いていたので探せばどっかに関数がありますかね。
> > なんでxc8のコンパイラでわざわざプログラムを作ったのかはitoa関数が使えるからなんですがxc8ではbit_test関数はないのですかね。困りました。
> >
> >
> >
> >
> > > mplabxでデバッグしましたか?
> > > 関数がないと言われているのではないですか?
> > > while(bit_test(lcd_ready(),7))が正しそうですが、
> > > bit_test()関数がどこにあるかは知りません。
> > > 関数の場所が分からなければ、複数個所あるwhile((lcd_ready(),7));をコメントアウトして下さい。
> > > コピペするならば、きちんとコピペしましょう。
> > >
> > > > lcdのビジーチェックでデータビット7が0になってもビジーチェックを抜けられません。どうすれば抜けられるか教えていただけますか?ソースコードは以下のようになっています。開発環境はmplabx idev3.5 xc8v1.4です 
> > > >
> > > > #define _XTAL_FREQ 20000000 // クロック周波数設定
> > > > /**** 液晶表示用設定 *****/
> > > > #define DB7 RB7 //DB7 pin
> > > > #define DB6 RB6 //DB6 pin
> > > > #define DB5 RB5 //DB5 pin
> > > > #define DB4 RB4 //DB4 pin
> > > > //#define DB3 pin_b3 //DB3 pin
> > > > //#define DB2 pin_c6 //DB2 pin
> > > > //#define DB1 pin_c5 //DB1 pin
> > > > //#define DB0 pin_c4 //DB0 pin
> > > > #define RS LATD7 //RS pin
> > > > #define RW LATD6 //RW pin
> > > > #define STB LATD5 //E pin (STB pin)
> > > > #define bmode 0x0f
> > > > ///////////////////////////////////////////////
> > > > // LCD control Library
> > > > // lcd_init()-------- initialize
> > > > // lcd_ready()------- busy check
> > > > // lcd_cmd(cmd)------ send command
> > > > // lcd_data(string)-- display string
> > > > // lcd_clear() ------ clear display
> > > > ///////////////////////////////////
> > > >
> > > > /// lcd ready check function
> > > > int lcd_ready(){
> > > > int high,low;
> > > > TRISB=(0x0f | 0xF0); //upper is input
> > > > LATDbits.RS=0;//_low(rs)
> > > > LATDbits.RW=1;//high(rw); //read mode
> > > > LATDbits.STB=1;//high(stb);
> > > > high=PORTB &0xF0; //input upper
> > > > LATDbits.STB=0;//low(stb);
> > > >
> > > > LATDbits.STB=1;//_high(stb);
> > > > low=PORTB & 0xF0; //input lower
> > > > LATDbits.STB=0;//low(stb);
> > > > TRISB=(0x0f);
> > > > return(high | (low>>4)); //end check
> > > > }
> > > >
> > > > ////////// lcd display data function
> > > > void lcd_data(int asci){
> > > > //db = asci; //set upper data
> > > > LATB=(asci);
> > > > LATDbits.RW=0;//_low(rw); //set write
> > > > LATDbits.RS=1; //set rs high
> > > > LATDbits.STB=1; //strobe
> > > > LATDbits.STB=0; //low(stb);
> > > >
> > > > asci=asci<<4;
> > > > LATB=(asci); //set lower data
> > > > LATDbits.STB=1; //strobe
> > > > LATDbits.STB=0; //low(stb);
> > > > while((lcd_ready(),7));
> > > >
> > > >
> > > > }
> > > > ////////// lcd command out function
> > > > int cmd;
> > > > void cmdout(int cmd){
> > > > LATB=(cmd);
> > > > LATDbits.RW=0; //set write
> > > > LATDbits.RS=0; //set rs low
> > > > LATDbits.STB=1; //strobe
> > > > LATDbits.STB=0;
> > > > cmd=cmd<<4;
> > > > PORTB=(cmd);
> > > > LATDbits.STB=1; //strobe
> > > > LATDbits.STB=0;
> > > > }
> > > >
> > > > void lcd_cmd(int cmd){
> > > > cmdout(cmd);
> > > > while(( lcd_ready(),7)); //end check
> > > > }
> > > >
> > > > ///// lcd display clear function
> > > > //MCHP void lcd_clear();{
> > > > void lcd_clear(){
> > > > lcd_cmd(1); //initialize command
> > > > __delay_ms(100);
> > > > }
> > > >
> > > > ///////// lcd initialize function
> > > > //MCHPvoid lcd_incmd(int cmd);{
> > > > void lcd_incmd(int cmd){
> > > > //db = cmd; //mode command
> > > > LATB=(cmd);
> > > > LATDbits.RW=0; //set write
> > > > LATDbits.RS=0; //set rs low
> > > > LATDbits.STB=1; //strobe
> > > > LATDbits.STB=0; //low(stb);
> > > > __delay_ms(10);
> > > > }
> > > >
> > > > //MCHP void lcd_init();{
> > > > void lcd_init(){
> > > > __delay_ms(15);
> > > > lcd_incmd(0x30); //8bit mode set
> > > > __delay_ms(5);
> > > > lcd_incmd(0x30); //8bit mode set
> > > > __delay_ms(5);
> > > > lcd_incmd(0x30); //8bit mode set
> > > > __delay_ms(5);
> > > > lcd_incmd(0x20); //4bit mode set
> > > > __delay_ms(5);
> > > >
> > > > lcd_cmd(0x2C); //DL=0 4bit mode
> > > > lcd_cmd(0x08); //disolay off C=D=B=0
> > > > lcd_cmd(0x0e); //display on C=D=1 B=0
> > > > lcd_cmd(0x06); //entry I/D=1 S=0
> > > > }

Re^3: lcdのビジーチェック 投稿者:momo 投稿日:2017/01/19(Thu) 19:38:20 No.800

どこで止まるのかブレークポイントを付けて、デバッグを繰り返して下さい。
void lcd_init()のlcd_incmdで止まるしかないです。
main()がないので、何とも言えませんが、キチンと呼び出せていないかどちらかです。

> やはりbit_testが無いとうまく動かないのでしょうか。
> bit_testをつけるとビルドで失敗します
> 複数個所あるwhile((lcd_ready(),7));をコメントアウトして下さい。で
> コメントアウトして無視するとlcd_initが実行されません。
> シミュレーションでも動いてないし、実際にPICに書いてもLCDが何も反応が無くLCDの初期化がされてないみたいです。
> どっかからbit_test関数を持ってこれないでしょうかね。ccs-cのコンパイラーではbit_testが動いていたので探せばどっかに関数がありますかね。
> なんでxc8のコンパイラでわざわざプログラムを作ったのかはitoa関数が使えるからなんですがxc8ではbit_test関数はないのですかね。困りました。
>
>
>
>
> > mplabxでデバッグしましたか?
> > 関数がないと言われているのではないですか?
> > while(bit_test(lcd_ready(),7))が正しそうですが、
> > bit_test()関数がどこにあるかは知りません。
> > 関数の場所が分からなければ、複数個所あるwhile((lcd_ready(),7));をコメントアウトして下さい。
> > コピペするならば、きちんとコピペしましょう。
> >
> > > lcdのビジーチェックでデータビット7が0になってもビジーチェックを抜けられません。どうすれば抜けられるか教えていただけますか?ソースコードは以下のようになっています。開発環境はmplabx idev3.5 xc8v1.4です 
> > >
> > > #define _XTAL_FREQ 20000000 // クロック周波数設定
> > > /**** 液晶表示用設定 *****/
> > > #define DB7 RB7 //DB7 pin
> > > #define DB6 RB6 //DB6 pin
> > > #define DB5 RB5 //DB5 pin
> > > #define DB4 RB4 //DB4 pin
> > > //#define DB3 pin_b3 //DB3 pin
> > > //#define DB2 pin_c6 //DB2 pin
> > > //#define DB1 pin_c5 //DB1 pin
> > > //#define DB0 pin_c4 //DB0 pin
> > > #define RS LATD7 //RS pin
> > > #define RW LATD6 //RW pin
> > > #define STB LATD5 //E pin (STB pin)
> > > #define bmode 0x0f
> > > ///////////////////////////////////////////////
> > > // LCD control Library
> > > // lcd_init()-------- initialize
> > > // lcd_ready()------- busy check
> > > // lcd_cmd(cmd)------ send command
> > > // lcd_data(string)-- display string
> > > // lcd_clear() ------ clear display
> > > ///////////////////////////////////
> > >
> > > /// lcd ready check function
> > > int lcd_ready(){
> > > int high,low;
> > > TRISB=(0x0f | 0xF0); //upper is input
> > > LATDbits.RS=0;//_low(rs)
> > > LATDbits.RW=1;//high(rw); //read mode
> > > LATDbits.STB=1;//high(stb);
> > > high=PORTB &0xF0; //input upper
> > > LATDbits.STB=0;//low(stb);
> > >
> > > LATDbits.STB=1;//_high(stb);
> > > low=PORTB & 0xF0; //input lower
> > > LATDbits.STB=0;//low(stb);
> > > TRISB=(0x0f);
> > > return(high | (low>>4)); //end check
> > > }
> > >
> > > ////////// lcd display data function
> > > void lcd_data(int asci){
> > > //db = asci; //set upper data
> > > LATB=(asci);
> > > LATDbits.RW=0;//_low(rw); //set write
> > > LATDbits.RS=1; //set rs high
> > > LATDbits.STB=1; //strobe
> > > LATDbits.STB=0; //low(stb);
> > >
> > > asci=asci<<4;
> > > LATB=(asci); //set lower data
> > > LATDbits.STB=1; //strobe
> > > LATDbits.STB=0; //low(stb);
> > > while((lcd_ready(),7));
> > >
> > >
> > > }
> > > ////////// lcd command out function
> > > int cmd;
> > > void cmdout(int cmd){
> > > LATB=(cmd);
> > > LATDbits.RW=0; //set write
> > > LATDbits.RS=0; //set rs low
> > > LATDbits.STB=1; //strobe
> > > LATDbits.STB=0;
> > > cmd=cmd<<4;
> > > PORTB=(cmd);
> > > LATDbits.STB=1; //strobe
> > > LATDbits.STB=0;
> > > }
> > >
> > > void lcd_cmd(int cmd){
> > > cmdout(cmd);
> > > while(( lcd_ready(),7)); //end check
> > > }
> > >
> > > ///// lcd display clear function
> > > //MCHP void lcd_clear();{
> > > void lcd_clear(){
> > > lcd_cmd(1); //initialize command
> > > __delay_ms(100);
> > > }
> > >
> > > ///////// lcd initialize function
> > > //MCHPvoid lcd_incmd(int cmd);{
> > > void lcd_incmd(int cmd){
> > > //db = cmd; //mode command
> > > LATB=(cmd);
> > > LATDbits.RW=0; //set write
> > > LATDbits.RS=0; //set rs low
> > > LATDbits.STB=1; //strobe
> > > LATDbits.STB=0; //low(stb);
> > > __delay_ms(10);
> > > }
> > >
> > > //MCHP void lcd_init();{
> > > void lcd_init(){
> > > __delay_ms(15);
> > > lcd_incmd(0x30); //8bit mode set
> > > __delay_ms(5);
> > > lcd_incmd(0x30); //8bit mode set
> > > __delay_ms(5);
> > > lcd_incmd(0x30); //8bit mode set
> > > __delay_ms(5);
> > > lcd_incmd(0x20); //4bit mode set
> > > __delay_ms(5);
> > >
> > > lcd_cmd(0x2C); //DL=0 4bit mode
> > > lcd_cmd(0x08); //disolay off C=D=B=0
> > > lcd_cmd(0x0e); //display on C=D=1 B=0
> > > lcd_cmd(0x06); //entry I/D=1 S=0
> > > }

Re^2: lcdのビジーチェック 投稿者:negishi 投稿日:2017/01/19(Thu) 19:08:15 No.799

やはりbit_testが無いとうまく動かないのでしょうか。
bit_testをつけるとビルドで失敗します
複数個所あるwhile((lcd_ready(),7));をコメントアウトして下さい。で
コメントアウトして無視するとlcd_initが実行されません。
シミュレーションでも動いてないし、実際にPICに書いてもLCDが何も反応が無くLCDの初期化がされてないみたいです。
どっかからbit_test関数を持ってこれないでしょうかね。ccs-cのコンパイラーではbit_testが動いていたので探せばどっかに関数がありますかね。
なんでxc8のコンパイラでわざわざプログラムを作ったのかはitoa関数が使えるからなんですがxc8ではbit_test関数はないのですかね。困りました。




> mplabxでデバッグしましたか?
> 関数がないと言われているのではないですか?
> while(bit_test(lcd_ready(),7))が正しそうですが、
> bit_test()関数がどこにあるかは知りません。
> 関数の場所が分からなければ、複数個所あるwhile((lcd_ready(),7));をコメントアウトして下さい。
> コピペするならば、きちんとコピペしましょう。
>
> > lcdのビジーチェックでデータビット7が0になってもビジーチェックを抜けられません。どうすれば抜けられるか教えていただけますか?ソースコードは以下のようになっています。開発環境はmplabx idev3.5 xc8v1.4です 
> >
> > #define _XTAL_FREQ 20000000 // クロック周波数設定
> > /**** 液晶表示用設定 *****/
> > #define DB7 RB7 //DB7 pin
> > #define DB6 RB6 //DB6 pin
> > #define DB5 RB5 //DB5 pin
> > #define DB4 RB4 //DB4 pin
> > //#define DB3 pin_b3 //DB3 pin
> > //#define DB2 pin_c6 //DB2 pin
> > //#define DB1 pin_c5 //DB1 pin
> > //#define DB0 pin_c4 //DB0 pin
> > #define RS LATD7 //RS pin
> > #define RW LATD6 //RW pin
> > #define STB LATD5 //E pin (STB pin)
> > #define bmode 0x0f
> > ///////////////////////////////////////////////
> > // LCD control Library
> > // lcd_init()-------- initialize
> > // lcd_ready()------- busy check
> > // lcd_cmd(cmd)------ send command
> > // lcd_data(string)-- display string
> > // lcd_clear() ------ clear display
> > ///////////////////////////////////
> >
> > /// lcd ready check function
> > int lcd_ready(){
> > int high,low;
> > TRISB=(0x0f | 0xF0); //upper is input
> > LATDbits.RS=0;//_low(rs)
> > LATDbits.RW=1;//high(rw); //read mode
> > LATDbits.STB=1;//high(stb);
> > high=PORTB &0xF0; //input upper
> > LATDbits.STB=0;//low(stb);
> >
> > LATDbits.STB=1;//_high(stb);
> > low=PORTB & 0xF0; //input lower
> > LATDbits.STB=0;//low(stb);
> > TRISB=(0x0f);
> > return(high | (low>>4)); //end check
> > }
> >
> > ////////// lcd display data function
> > void lcd_data(int asci){
> > //db = asci; //set upper data
> > LATB=(asci);
> > LATDbits.RW=0;//_low(rw); //set write
> > LATDbits.RS=1; //set rs high
> > LATDbits.STB=1; //strobe
> > LATDbits.STB=0; //low(stb);
> >
> > asci=asci<<4;
> > LATB=(asci); //set lower data
> > LATDbits.STB=1; //strobe
> > LATDbits.STB=0; //low(stb);
> > while((lcd_ready(),7));
> >
> >
> > }
> > ////////// lcd command out function
> > int cmd;
> > void cmdout(int cmd){
> > LATB=(cmd);
> > LATDbits.RW=0; //set write
> > LATDbits.RS=0; //set rs low
> > LATDbits.STB=1; //strobe
> > LATDbits.STB=0;
> > cmd=cmd<<4;
> > PORTB=(cmd);
> > LATDbits.STB=1; //strobe
> > LATDbits.STB=0;
> > }
> >
> > void lcd_cmd(int cmd){
> > cmdout(cmd);
> > while(( lcd_ready(),7)); //end check
> > }
> >
> > ///// lcd display clear function
> > //MCHP void lcd_clear();{
> > void lcd_clear(){
> > lcd_cmd(1); //initialize command
> > __delay_ms(100);
> > }
> >
> > ///////// lcd initialize function
> > //MCHPvoid lcd_incmd(int cmd);{
> > void lcd_incmd(int cmd){
> > //db = cmd; //mode command
> > LATB=(cmd);
> > LATDbits.RW=0; //set write
> > LATDbits.RS=0; //set rs low
> > LATDbits.STB=1; //strobe
> > LATDbits.STB=0; //low(stb);
> > __delay_ms(10);
> > }
> >
> > //MCHP void lcd_init();{
> > void lcd_init(){
> > __delay_ms(15);
> > lcd_incmd(0x30); //8bit mode set
> > __delay_ms(5);
> > lcd_incmd(0x30); //8bit mode set
> > __delay_ms(5);
> > lcd_incmd(0x30); //8bit mode set
> > __delay_ms(5);
> > lcd_incmd(0x20); //4bit mode set
> > __delay_ms(5);
> >
> > lcd_cmd(0x2C); //DL=0 4bit mode
> > lcd_cmd(0x08); //disolay off C=D=B=0
> > lcd_cmd(0x0e); //display on C=D=1 B=0
> > lcd_cmd(0x06); //entry I/D=1 S=0
> > }

Re: lcdのビジーチェック 投稿者:momo 投稿日:2017/01/19(Thu) 16:31:05 No.798

mplabxでデバッグしましたか?
関数がないと言われているのではないですか?
while(bit_test(lcd_ready(),7))が正しそうですが、
bit_test()関数がどこにあるかは知りません。
関数の場所が分からなければ、複数個所あるwhile((lcd_ready(),7));をコメントアウトして下さい。
コピペするならば、きちんとコピペしましょう。

> lcdのビジーチェックでデータビット7が0になってもビジーチェックを抜けられません。どうすれば抜けられるか教えていただけますか?ソースコードは以下のようになっています。開発環境はmplabx idev3.5 xc8v1.4です 
>
> #define _XTAL_FREQ 20000000 // クロック周波数設定
> /**** 液晶表示用設定 *****/
> #define DB7 RB7 //DB7 pin
> #define DB6 RB6 //DB6 pin
> #define DB5 RB5 //DB5 pin
> #define DB4 RB4 //DB4 pin
> //#define DB3 pin_b3 //DB3 pin
> //#define DB2 pin_c6 //DB2 pin
> //#define DB1 pin_c5 //DB1 pin
> //#define DB0 pin_c4 //DB0 pin
> #define RS LATD7 //RS pin
> #define RW LATD6 //RW pin
> #define STB LATD5 //E pin (STB pin)
> #define bmode 0x0f
> ///////////////////////////////////////////////
> // LCD control Library
> // lcd_init()-------- initialize
> // lcd_ready()------- busy check
> // lcd_cmd(cmd)------ send command
> // lcd_data(string)-- display string
> // lcd_clear() ------ clear display
> ///////////////////////////////////
>
> /// lcd ready check function
> int lcd_ready(){
> int high,low;
> TRISB=(0x0f | 0xF0); //upper is input
> LATDbits.RS=0;//_low(rs)
> LATDbits.RW=1;//high(rw); //read mode
> LATDbits.STB=1;//high(stb);
> high=PORTB &0xF0; //input upper
> LATDbits.STB=0;//low(stb);
>
> LATDbits.STB=1;//_high(stb);
> low=PORTB & 0xF0; //input lower
> LATDbits.STB=0;//low(stb);
> TRISB=(0x0f);
> return(high | (low>>4)); //end check
> }
>
> ////////// lcd display data function
> void lcd_data(int asci){
> //db = asci; //set upper data
> LATB=(asci);
> LATDbits.RW=0;//_low(rw); //set write
> LATDbits.RS=1; //set rs high
> LATDbits.STB=1; //strobe
> LATDbits.STB=0; //low(stb);
>
> asci=asci<<4;
> LATB=(asci); //set lower data
> LATDbits.STB=1; //strobe
> LATDbits.STB=0; //low(stb);
> while((lcd_ready(),7));
>
>
> }
> ////////// lcd command out function
> int cmd;
> void cmdout(int cmd){
> LATB=(cmd);
> LATDbits.RW=0; //set write
> LATDbits.RS=0; //set rs low
> LATDbits.STB=1; //strobe
> LATDbits.STB=0;
> cmd=cmd<<4;
> PORTB=(cmd);
> LATDbits.STB=1; //strobe
> LATDbits.STB=0;
> }
>
> void lcd_cmd(int cmd){
> cmdout(cmd);
> while(( lcd_ready(),7)); //end check
> }
>
> ///// lcd display clear function
> //MCHP void lcd_clear();{
> void lcd_clear(){
> lcd_cmd(1); //initialize command
> __delay_ms(100);
> }
>
> ///////// lcd initialize function
> //MCHPvoid lcd_incmd(int cmd);{
> void lcd_incmd(int cmd){
> //db = cmd; //mode command
> LATB=(cmd);
> LATDbits.RW=0; //set write
> LATDbits.RS=0; //set rs low
> LATDbits.STB=1; //strobe
> LATDbits.STB=0; //low(stb);
> __delay_ms(10);
> }
>
> //MCHP void lcd_init();{
> void lcd_init(){
> __delay_ms(15);
> lcd_incmd(0x30); //8bit mode set
> __delay_ms(5);
> lcd_incmd(0x30); //8bit mode set
> __delay_ms(5);
> lcd_incmd(0x30); //8bit mode set
> __delay_ms(5);
> lcd_incmd(0x20); //4bit mode set
> __delay_ms(5);
>
> lcd_cmd(0x2C); //DL=0 4bit mode
> lcd_cmd(0x08); //disolay off C=D=B=0
> lcd_cmd(0x0e); //display on C=D=1 B=0
> lcd_cmd(0x06); //entry I/D=1 S=0
> }

lcdのビジーチェック 投稿者:negishi 投稿日:2017/01/18(Wed) 19:34:31 No.797

lcdのビジーチェックでデータビット7が0になってもビジーチェックを抜けられません。どうすれば抜けられるか教えていただけますか?ソースコードは以下のようになっています。開発環境はmplabx idev3.5 xc8v1.4です 

#define _XTAL_FREQ 20000000 // クロック周波数設定
/**** 液晶表示用設定 *****/
#define DB7 RB7 //DB7 pin
#define DB6 RB6 //DB6 pin
#define DB5 RB5 //DB5 pin
#define DB4 RB4 //DB4 pin
//#define DB3 pin_b3 //DB3 pin
//#define DB2 pin_c6 //DB2 pin
//#define DB1 pin_c5 //DB1 pin
//#define DB0 pin_c4 //DB0 pin
#define RS LATD7 //RS pin
#define RW LATD6 //RW pin
#define STB LATD5 //E pin (STB pin)
#define bmode 0x0f
///////////////////////////////////////////////
// LCD control Library
// lcd_init()-------- initialize
// lcd_ready()------- busy check
// lcd_cmd(cmd)------ send command
// lcd_data(string)-- display string
// lcd_clear() ------ clear display
///////////////////////////////////

/// lcd ready check function
int lcd_ready(){
int high,low;
TRISB=(0x0f | 0xF0); //upper is input
LATDbits.RS=0;//_low(rs)
LATDbits.RW=1;//high(rw); //read mode
LATDbits.STB=1;//high(stb);
high=PORTB &0xF0; //input upper
LATDbits.STB=0;//low(stb);

LATDbits.STB=1;//_high(stb);
low=PORTB & 0xF0; //input lower
LATDbits.STB=0;//low(stb);
TRISB=(0x0f);
return(high | (low>>4)); //end check
}

////////// lcd display data function
void lcd_data(int asci){
//db = asci; //set upper data
LATB=(asci);
LATDbits.RW=0;//_low(rw); //set write
LATDbits.RS=1; //set rs high
LATDbits.STB=1; //strobe
LATDbits.STB=0; //low(stb);

asci=asci<<4;
LATB=(asci); //set lower data
LATDbits.STB=1; //strobe
LATDbits.STB=0; //low(stb);
while((lcd_ready(),7));


}
////////// lcd command out function
int cmd;
void cmdout(int cmd){
LATB=(cmd);
LATDbits.RW=0; //set write
LATDbits.RS=0; //set rs low
LATDbits.STB=1; //strobe
LATDbits.STB=0;
cmd=cmd<<4;
PORTB=(cmd);
LATDbits.STB=1; //strobe
LATDbits.STB=0;
}

void lcd_cmd(int cmd){
cmdout(cmd);
while(( lcd_ready(),7)); //end check
}

///// lcd display clear function
//MCHP void lcd_clear();{
void lcd_clear(){
lcd_cmd(1); //initialize command
__delay_ms(100);
}

///////// lcd initialize function
//MCHPvoid lcd_incmd(int cmd);{
void lcd_incmd(int cmd){
//db = cmd; //mode command
LATB=(cmd);
LATDbits.RW=0; //set write
LATDbits.RS=0; //set rs low
LATDbits.STB=1; //strobe
LATDbits.STB=0; //low(stb);
__delay_ms(10);
}

//MCHP void lcd_init();{
void lcd_init(){
__delay_ms(15);
lcd_incmd(0x30); //8bit mode set
__delay_ms(5);
lcd_incmd(0x30); //8bit mode set
__delay_ms(5);
lcd_incmd(0x30); //8bit mode set
__delay_ms(5);
lcd_incmd(0x20); //4bit mode set
__delay_ms(5);

lcd_cmd(0x2C); //DL=0 4bit mode
lcd_cmd(0x08); //disolay off C=D=B=0
lcd_cmd(0x0e); //display on C=D=1 B=0
lcd_cmd(0x06); //entry I/D=1 S=0
}

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |

- WebForum -