質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

1回答

913閲覧

bu9797afuv LCDセグメントドライバについて

yukadanbo

総合スコア0

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

0クリップ

投稿2022/07/04 02:55

編集2022/07/07 07:58

LCDセグメントドライバについての質問です。
開発環境:MPLAB X IDE
開発言語:C
CPU:PIC16F18346
ドライバ:bu9797afuv
I2C通信で全点灯コマンドを入力しているのですが、動作しません。
以下、プログラムです。

//****************C header file config.h**************// // PIC16F18346 Configuration Bit Settings // 'C' source line config statements // CONFIG1 #pragma config FEXTOSC = OFF // FEXTOSC External Oscillator mode Selection bits (Oscillator not enabled) #pragma config RSTOSC = HFINT32 // Power-up default value for COSC bits (HFINTOSC with 2x PLL (32MHz)) #pragma config CLKOUTEN = OFF // Clock Out Enable bit (CLKOUT function is disabled; I/O or oscillator function on OSC2) #pragma config CSWEN = OFF // Clock Switch Enable bit (The NOSC and NDIV bits cannot be changed by user software) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled) // CONFIG2 #pragma config MCLRE = OFF // Master Clear Enable bit (MCLR/VPP pin function is digital input; MCLR internally disabled; Weak pull-up under control of port pin's WPU control bit.) #pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled) #pragma config WDTE = OFF // Watchdog Timer Enable bits (WDT disabled; SWDTEN is ignored) #pragma config LPBOREN = OFF // Low-power BOR enable bit (ULPBOR disabled) #pragma config BOREN = OFF // Brown-out Reset Enable bits (Brown-out Reset disabled) #pragma config BORV = LOW // Brown-out Reset Voltage selection bit (Brown-out voltage (Vbor) set to 2.45V) #pragma config PPS1WAY = OFF // PPSLOCK bit One-Way Set Enable bit (The PPSLOCK bit can be set and cleared repeatedly (subject to the unlock sequence)) #pragma config STVREN = OFF // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will not cause a Reset) #pragma config DEBUG = OFF // Debugger enable bit (Background debugger disabled) // CONFIG3 #pragma config WRT = OFF // User NVM self-write protection bits (Write protection off) #pragma config LVP = OFF // Low Voltage Programming Enable bit (High Voltage on MCLR/VPP must be used for programming.) // CONFIG4 #pragma config CP = OFF // User NVM Program Memory Code Protection bit (User NVM code protection disabled) #pragma config CPD = OFF // Data NVM Memory Code Protection bit (Data NVM code protection disabled) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #include <xc.h> #include <stdio.h> #include <stdint.h> /* For uint8_t definition */ #define _XTAL_FREQ 32000000 //プロトタイプ宣言// void PIC_init(void); // LCDドライバモジュール表示制御関数 void lcdInitialize(void); // LCD初期化 // LCDモジュールI2Cプロトコル関数 void lcdI2CProtocol(uint8_t, uint8_t, uint8_t); // I2Cプロトコル各信号の生成関数 void i2cProtocolStart(void); // スタートビット生成 void i2cProtocolStop(void); // ストップビット生成 void i2cProtocolSendData(uint8_t); // 1バイトデータ送信 uint8_t i2cProtocolCheckAck(void); // ACK信号チェック // I2C Ack/Nack定義 #define I2C_ACK 0x00 #define I2C_NACK 0xff // LCDモジュール #define LCD_I2C_ADDRESS 0x7c // LCDモジュールのI2Cアドレス //**************C header file drvcon.h**************// #include "config.h" // // LCDモジュール初期化 // void lcdInitialize(void){ __delay_us(100); i2cProtocolStop(); //ストップコンディション生成 i2cProtocolStart(); //スタートコンディション生成 i2cProtocolSendData(LCD_I2C_ADDRESS); //I2Cアドレス送信 i2cProtocolSendData(0xEA); //ICSET Software Reset実行 i2cProtocolSendData(0xF0); //BLKCTL Blink OFF i2cProtocolSendData(0xA4); //DISCTL 80Hz、フレーム反転、Power save mode1 i2cProtocolSendData(0xE8); //ICSET 内部クロック入力 i2cProtocolStop(); //ストップコンディション生成 i2cProtocolStart(); //スタートコンディション生成 i2cProtocolSendData(LCD_I2C_ADDRESS); //I2Cアドレス送信 i2cProtocolSendData(0xFA); //APCTL 全点灯コマンド i2cProtocolSendData(0xA8); //MODESET Display ON i2cProtocolStop(); //ストップコンディション生成 return; } // // I2Cプロトコル制御関数 // // スタートコンディション生成 void i2cProtocolStart() { // SSP1CON2レジスタのSENビットを1に設定すると // スタートコンディションが生成される // 発行が完了するとSSP1IFが1になるのでwhile文で待つ SSP1IF = 0; SSP1CON2bits.SEN = 1; while (SSP1IF == 0) {} SSP1IF = 0; return; } // ストップコンディション生成 void i2cProtocolStop() { // SSP1CON2レジスタのPENビットを1に設定すると // ストップコンディションが生成される // 発行が完了するとSSP1IFが1になるのでwhile文で待つ SSP1IF = 0; SSP1CON2bits.PEN = 1; while (SSP1IF == 0) {} SSP1IF = 0; return; } // 1バイトデータ送信 void i2cProtocolSendData(uint8_t data) { // SSP1BUFに送信したいデータをセットすると、そのデータが送信される // 発行が完了するとSSP1IFが1になるのでwhile文で待つ SSP1IF = 0; SSP1BUF = data; while (SSP1IF == 0) {} SSP1IF = 0; return; } // Ack/Nackチェック uint8_t i2cProtocolCheckAck() { uint8_t ackStatus; if (SSPCON2bits.ACKSTAT) { ackStatus = I2C_NACK; } else { ackStatus = I2C_ACK; } return ackStatus; } //***************C header file picinit.h**************// #include "config.h" void PIC_init(void){ ANSELB = 0; //PORTBをデジタルピンに設定 TRISB = 0b10100000;//RB7、RB5を入力それ以外のPORTBは出力 ODCB5 = 1; // RB5をオープンドレイン ODCB7 = 1; // RB7をオープンドレイン SSP1CLKPPS = 0x0F; // RB7をCLK入力に指定 RB7PPS = 24; // RB7をCLK出力に指定 SSP1DATPPS = 0x0D; // RB5をDATに入力指定 RB5PPS = 25; // RB5をDAT出力に指定 SSP1STAT = 0x80;   //スルーレート制御はOff SSP1ADD = 0x13; //クロック設定 400kHz 32M SSP1CON1 = 0x28; //I2C Master mode } //***********main.c**************// #include "config.h" #include "drvcon.h" #include "picinit.h" void main(void){ PIC_init(); //PICマイコン初期設定 lcdInitialize(); //LCDセグメントドライバ初期設定 }

PIC16F18346データシート
[https://akizukidenshi.com/download/ds/microchip/pic16f183x6.pdf]
bu9797afuvデータシート
[https://fscdn.rohm.com/jp/products/databook/datasheet/ic/driver/lcd_segment/bu9797afuv-j.pdf]

マイコン、LCDドライバ、LCD表示器の接続は完了していて
電源を入れ、上記のプログラムを書き込みましたがLCD表示器の動作は確認できませんでした。
以上、お力添えいただけたら幸いです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2022/07/04 03:03

このままではコードが読みづらいので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください で、どこまで動作チェック、信号チェックができているんでしょうか。 いきなりコード丸投げで動作しないと言われてもどーにもなりませんよ
yukadanbo

2022/07/04 03:26

ご指摘ありがとうございます。 質問修正しました。
guest

回答1

0

回答がついてないようなので、こういう場合の(I2C通信に限っての)デバッグ法を書いておきます

#あくまで、回路図が正しいという前提なので注意

まずはオシロスコープを用意しましょう。
0. CPUのI2C端子に想定するデータが正常に出力されているのかをチェック
0. LCDドライバIC側のI2C端子に同じ信号が出ているのかをチェック
0. I2C信号をモニタし、スレーブアドレス送信後にACKがアクティブになってるかをチェック
0. ACKがアクティブにならない場合はスレーブアドレスが間違ってるので修正
以上をチェックして、I2C通信の疎通をさせましょう

投稿2022/07/06 22:58

y_waiwai

総合スコア87684

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問