[戻る]
新着表示

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
}

Re^2: xc8でコンパイルエラー 投稿者:negishi 投稿日:2017/01/05(Thu) 18:53:09 No.788

projectのpropertyでbuildingのpre and post step operation
にチェックを入れないと以下の3つのエラーが出ます。
18f452_lcd_adc.c:64: error: (314) ";" expected

18f452_lcd_adc.c:102: error: (984) type redeclared

18f452_lcd_adc.c:102: error: (1098) conflicting declarations for variable "INTCONbits" (18f452_lcd_adc.c:102)


の3つの内一番上の";" expectedは void interrupt sw_detect(){に;をいれろと言っていますvoid interrupt sw_detect();{にすれば消えますが、文法的に変になってしまうし他の関数の前にも入れろと言ってきて全部の関数の前にいれるとエラーは確かに無くなりますが
今度は
nbproject/Makefile-default.mk:84: recipe for target '.build-conf' failedと
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failedと出て結局エラーになってしまいます。

またincludeで呼んでるファイルは全部project上に表示されてます。
日本語のディレクトリ名も1つも使ってません



> このエラーが出るということはプログラムに何らかの間違いがあるということです。
> このメッセージの前にErrorのメッセージがないでしょうか?
> あるいはソースファイルの行番号に赤丸が付いているところはないでしょうか?
>
> その他、原因と考えられることには下記があります。
> ・includeで読んでいるファイルがプロジェクトにない
> ・日本語のディレクトリ名を使っている
> ・呼んでいる関数がない
> などなど
>
> > mplab x 3.5でxc8コンパイラーでビルドすると
> > nbproject/Makefile-default.mk:144: recipe for target '.pre' failed
> > と
> > nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failedの2つのエラーが出てコンパイル出来ませんソースファイルのエラーならまだわかるのですが、XC8 コンパイラーの設定が上手くできてないことによるエラーのようなのでどうしていいのかよくわかりません。
> > XC8のビルドがうまくいった方でわかる方がいたらどうすればビルドがうまくいくか教えていただきたいです

Re: xc8でコンパイルエラー 投稿者:Gokan 投稿日:2017/01/05(Thu) 09:21:05 No.787

このエラーが出るということはプログラムに何らかの間違いがあるということです。
このメッセージの前にErrorのメッセージがないでしょうか?
あるいはソースファイルの行番号に赤丸が付いているところはないでしょうか?

その他、原因と考えられることには下記があります。
・includeで読んでいるファイルがプロジェクトにない
・日本語のディレクトリ名を使っている
・呼んでいる関数がない
などなど

> mplab x 3.5でxc8コンパイラーでビルドすると
> nbproject/Makefile-default.mk:144: recipe for target '.pre' failed
> と
> nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failedの2つのエラーが出てコンパイル出来ませんソースファイルのエラーならまだわかるのですが、XC8 コンパイラーの設定が上手くできてないことによるエラーのようなのでどうしていいのかよくわかりません。
> XC8のビルドがうまくいった方でわかる方がいたらどうすればビルドがうまくいくか教えていただきたいです

xc8でコンパイル時buildエラー 投稿者:negishi 投稿日:2017/01/03(Tue) 14:22:58 No.785

mplab x 3.5でxc8コンパイラーでビルドすると
nbproject/Makefile-default.mk:144: recipe for target '.pre' failed

nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failedの2つのエラーが出てコンパイル出来ませんソースファイルのエラーならまだわかるのですが、XC8 コンパイラーの設定が上手くできてないことによるエラーのようなのでどうしていいのかよくわかりません。
XC8のビルドがうまくいった方でわかる方がいたらどうすればビルドがうまくいくか教えていただきたいです

Re^8: カウントダウンタイマー 投稿者:ベッカー 投稿日:2016/12/21(Wed) 23:20:14 No.782

3000円くらいしたかと思ったのですが
1100円でamazonで売ってますね
電源とか、コネクタ考えると確かに
安いですね。考えてみます。ありがとうございます。

> もろもろ含むとarduinoの方が安いです。
> そしてPICのプログラムはチップに依存しますが、arduinoはボードがあれば基本それだけです。
> そして、難しいと言っている命令語はPICでは避けて通れず、半端なく多いですし、英語のデータシートの読み込みが必須になります。
> arduinoは参加者が多く、それらの命令語の処理をみんなでライブラリ化しているので、素人でもいじり易くなっています。
>
> > RA と RBの出力で制御するのは理解できるのですが
> > ただ命令語のようなものを理解するのに苦しみます。
> > anduinoも考えましたがただ高いのでやめました。
> > 趣味でやっているのでコストを下げたかったのが
> > 理由ですけど、
> >
> > > そのキットを最後までやれば、一応はPICは理解できるはずです。
> > > 実際にどこまでやったのですか?
> > > PIC16F627Aは84Aより新しいですが、それらは既にPICの主流ではありません。遺物を購入してしまいましたね。
> > >
> > > どこまで作り込むかによりますが、ボタン電池駆動ならPIC、そこまで考えず、5Vバッテリで動けばいいのなら、今更ですがarduinoで製作して下さい。
> > > どちらかというと、PICは本職が組み込み、玄人向けです。
> > > arduinoなら、7セグの製作例も多く、ポン付けでできるのがメリットです。ただ本人次第ですが、勉強には全くならないです。
> > >
> > > > 陰性さん
> > > > そうですね。勉強しないとわからないので下記のキットを購入して
> > > > 勉強中ですが、頭がよくないので理解しがたいところです。
> > > >
> > > > http://www.adwin.com/product/ECB-900T.html

Re^7: カウントダウンタイマー 投稿者:陰性 投稿日:2016/12/20(Tue) 17:31:20 No.781

もろもろ含むとarduinoの方が安いです。
そしてPICのプログラムはチップに依存しますが、arduinoはボードがあれば基本それだけです。
そして、難しいと言っている命令語はPICでは避けて通れず、半端なく多いですし、英語のデータシートの読み込みが必須になります。
arduinoは参加者が多く、それらの命令語の処理をみんなでライブラリ化しているので、素人でもいじり易くなっています。

> RA と RBの出力で制御するのは理解できるのですが
> ただ命令語のようなものを理解するのに苦しみます。
> anduinoも考えましたがただ高いのでやめました。
> 趣味でやっているのでコストを下げたかったのが
> 理由ですけど、
>
> > そのキットを最後までやれば、一応はPICは理解できるはずです。
> > 実際にどこまでやったのですか?
> > PIC16F627Aは84Aより新しいですが、それらは既にPICの主流ではありません。遺物を購入してしまいましたね。
> >
> > どこまで作り込むかによりますが、ボタン電池駆動ならPIC、そこまで考えず、5Vバッテリで動けばいいのなら、今更ですがarduinoで製作して下さい。
> > どちらかというと、PICは本職が組み込み、玄人向けです。
> > arduinoなら、7セグの製作例も多く、ポン付けでできるのがメリットです。ただ本人次第ですが、勉強には全くならないです。
> >
> > > 陰性さん
> > > そうですね。勉強しないとわからないので下記のキットを購入して
> > > 勉強中ですが、頭がよくないので理解しがたいところです。
> > >
> > > http://www.adwin.com/product/ECB-900T.html

Re^6: カウントダウンタイマー 投稿者:ベッカー 投稿日:2016/12/20(Tue) 16:47:29 No.780

RA と RBの出力で制御するのは理解できるのですが
ただ命令語のようなものを理解するのに苦しみます。
anduinoも考えましたがただ高いのでやめました。
趣味でやっているのでコストを下げたかったのが
理由ですけど、

> そのキットを最後までやれば、一応はPICは理解できるはずです。
> 実際にどこまでやったのですか?
> PIC16F627Aは84Aより新しいですが、それらは既にPICの主流ではありません。遺物を購入してしまいましたね。
>
> どこまで作り込むかによりますが、ボタン電池駆動ならPIC、そこまで考えず、5Vバッテリで動けばいいのなら、今更ですがarduinoで製作して下さい。
> どちらかというと、PICは本職が組み込み、玄人向けです。
> arduinoなら、7セグの製作例も多く、ポン付けでできるのがメリットです。ただ本人次第ですが、勉強には全くならないです。
>
> > 陰性さん
> > そうですね。勉強しないとわからないので下記のキットを購入して
> > 勉強中ですが、頭がよくないので理解しがたいところです。
> >
> > http://www.adwin.com/product/ECB-900T.html

Re^5: カウントダウンタイマー 投稿者:陰性 投稿日:2016/12/20(Tue) 16:23:30 No.779

そのキットを最後までやれば、一応はPICは理解できるはずです。
実際にどこまでやったのですか?
PIC16F627Aは84Aより新しいですが、それらは既にPICの主流ではありません。遺物を購入してしまいましたね。

どこまで作り込むかによりますが、ボタン電池駆動ならPIC、そこまで考えず、5Vバッテリで動けばいいのなら、今更ですがarduinoで製作して下さい。
どちらかというと、PICは本職が組み込み、玄人向けです。
arduinoなら、7セグの製作例も多く、ポン付けでできるのがメリットです。ただ本人次第ですが、勉強には全くならないです。

> 陰性さん
> そうですね。勉強しないとわからないので下記のキットを購入して
> 勉強中ですが、頭がよくないので理解しがたいところです。
>
> http://www.adwin.com/product/ECB-900T.html

Re^4: カウントダウンタイマー 投稿者:ベッカー 投稿日:2016/12/20(Tue) 14:54:11 No.778

陰性さん
そうですね。勉強しないとわからないので下記のキットを購入して
勉強中ですが、頭がよくないので理解しがたいところです。

http://www.adwin.com/product/ECB-900T.html

Re^3: カウントダウンタイマー 投稿者:陰性 投稿日:2016/12/20(Tue) 11:43:18 No.777

横から失礼します。
貴方がやろうとしていることは、教科書のかなり前半部分で実現できます。
いきなり目的を達成しようとする前に、教科書或はネットでPICあるいはarduinoの基礎を学びましょう。
学んでみれば、実現するのにそれほど難しい内容ではありません。
それができないならば、キットでも購入して下さい。

> 返信ありがとうございます。
> しかし 素人すぎて、プログラムをみてもよくわかりません。
> c言語の本を読みあさりましたがイマイチ基本もできていないので
> 理解に苦しんでいます。
>
> すみませんが、
> 下記 プログラムを16F84Aに書き込んでも動作しないのは
> なぜなのかがいまいちわからないところです。
> LEDが付きぱなしで、うまく作動しません。
> 16F84Aなので5Vで問題ないような気がしますが、やはり
> ハードの接続等がおかしいのでしょうか?
>
> /************************************
> 16F84A HI-TECH C v.9.83
> 2桁7セグメントLEDのダイナミック点灯
> ************************************/
> #define _LEGACY_HEADERS
> #include "PIC.h"
> #define _XTAL_FREQ 20000000 //20MHz
>
> __CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT);
>
> unsigned char i;
> unsigned char d0, d1;
> unsigned char p[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
>
> void interrupt warikomi(void)
> {
> T0IF = 0; //TMR0割り込み禁止
> i++;
> if (i == 2)
> {
> i = 0;
> }
>
> if (i == 0)
> {
> PORTA = 0x1E; // 1桁目
> PORTB = p[d0];
> }
> else
> {
> PORTA = 0x1D; // 2桁目
> PORTB = p[d1];
> }
> }
>
> main(void)
> {
> TRISA = 0x00; //RA0〜RA4は出力
> PORTA = 0x03; //RA0とRA1をHighレベルにする
> TRISB = 0x00; //RB0〜RB7は出力
> PORTB = 0x00;
> OPTION = 0x86; //プリスケーラ64
> TMR0 = 0x00; //TMR0は0からスタート
> T0IE = 1; //TMR0割り込み許可
> GIE = 1; //すべての割り込み許可
> i = 0;
>
> while (1)
> {
> for (d1 = 0; d1 < 10; d1++)
> {
> for (d0 = 0; d0 < 10; d0++)
> {
> __delay_ms(500);
> }
> }
> }
> }
> > タイマの割り込みを使うと下記のような感じで時間の制御ができます。
> > 下記は赤LEDを1秒間隔でオンオフを継続し、スイッチが押された
> > 時から青LEDを2秒間隔でオンオフするというものです。
> >
> > /**********************************************
> > * LEDチカチカ タイマ1,3使用
> > * PIC16F18325
> > **********************************************/
> > #include <xc.h>
> > // コンフィギュレーション
> > #pragma config FEXTOSC = OFF, RSTOSC = HFINT1, WDTE=OFF, LVP=OFF
> >
> > /***** メイン関数 ***********/
> > void main(void) {
> > OSCCON1 = 0x60; // PLL Off 1/1
> > OSCFRQbits.HFFRQ = 3; // 4MHz
> > LATC = 0x05; // ブリッジオフ
> > TRISA = 0x30;
> > TRISC = 0;
> > ANSELA = 0; // すべてデジタル
> > ANSELC = 0;
> > /** タイマ1初期設定 1sec **/
> > T1CON = 0xC1; // LFINTOSC 1/1 開始
> > TMR1H = 0x86; // 31kHz/31000=1Hz
> > TMR1L = 0xE8;
> > PIE1bits.TMR1IE = 1; // 割込み許可
> > /** タイマ3初期設定 2sec **/
> > T3CON = 0xC0; // LFINTOSC 1/1
> > TMR3H = 0x0D; // 31kHz/62000=0.5Hz
> > TMR3L = 0xD0;
> > PIE3bits.TMR3IE = 1; // 割込み許可
> > /* グローバル割り込み許可 */
> > INTCONbits.PEIE = 1;
> > INTCONbits.GIE = 1;
> > /******** メインループ ***********/
> > while(1){
> > if(PORTAbits.RA5 == 0){ // S1オンの場合
> > LATCbits.LATC3 = 1; // 青点灯
> > TMR3H = 0x0D; // 31kHz/62000=0.5Hz
> > TMR3L = 0xD0;
> > T3CONbits.TMR3ON = 1;// タイマ3動作開始
> > while(PORTAbits.RA5 == 0);// オンの間待つ
> > }
> > }
> > }
> > /******************************************
> > * タイマ1,3割り込み処理関数
> > *****************************************/
> > void interrupt isr(void){
> > if(PIR1bits.TMR1IF){ // タイマ1割り込みの場合
> > TMR1H = 0x86; // 31kHz/31000=1Hz
> > TMR1L = 0xE8;
> > LATCbits.LATC5 ^= 1;// 赤反転
> > PIR1bits.TMR1IF = 0;// 割り込みフラグクリア
> > }
> > if(PIR3bits.TMR3IF){ // タイマ3割り込みの場合
> > TMR3H = 0x0D; // 31kHz/62000=0.5Hz
> > TMR3L = 0xD0;
> > LATCbits.LATC3 ^= 1;// 青反転
> > PIR3bits.TMR3IF = 0;// 割込みフラグクリア
> > }
> > }
> >
> >          以上
> >
> >
> > > PIC初心者ですが見よう見まねで下記のHPのキッチンタイマーを
> > > 製作したのですがアセンブラはいまいち理解しにくいためC言語でカスタムしようと奮闘中です。
> > > 今回私がバスケをやっており、そのための大型タイマーを作成して現在使用していますが、今度 24秒と14秒を切り替えしながらできる
> > > ものを作りたいのですがいかんせん初心者でよくわかりません。
> > >
> > > 今回の参考先のHPのプログラムをいじって作成しようと思うのですがオリジナルを作成して、動かしてみたのですがうまく動きません
> > > メールもしたのですが、古すぎて見ていないのか面倒なのかで返事がありませんのでどうかお助け下さい。
> > >
> > >
> > > キッチンタイマ参考HP
> > > http://www.asahi-net.or.jp/~rn8t-nkmr/family/pic/kt/index.html
> > >
> > > 24秒と14秒切り替えタイマーの参考HP
> > > http://physics.cocolog-nifty.com/weblog/2012/06/led-bffe.html

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

- WebForum -