RL78/G10ファミリR5F10Y16ASPの簡易I2C機能とI2C液晶モジュールAQM1602Aを使ってHello,Worldしてみた。

前回でシリアル・インタフェース IICA の使い方が分かったので、R5F10Y16ASP のシリアル・アレイ・ユニットを使った簡易 I2C 機能で同じことをしてみる。

使うもの

e2 studio で新規プロジェクトを作る。

新規 -> Renesas C/C++ Project -> Renesas RL78 から

プロジェクトを作る。

保存して「コードを生成する」をクリックする。

プロジェクト設定

「適用して閉じる」をクリックする。

生成されたコードをカスタマイズする

最終的に完成するコードは前回とほぼ同じ。

カスタマイズするファイルは

r_cg_userdefine.h と r_cg_tau_user.c は 前回と全く同じ。

src/cg_src/r_cg_tau_main.c

C
/***********************************************************************************************************************
* DISCLAIMER
* This software is supplied by Renesas Electronics Corporation and is only intended for use with Renesas products.
* No other uses are authorized. This software is owned by Renesas Electronics Corporation and is protected under all
* applicable laws, including copyright laws.
* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING THIS SOFTWARE, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NON-INFRINGEMENT.  ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY
* LAW, NEITHER RENESAS ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE FOR ANY DIRECT,
* INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR
* ITS AFFILIATES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* Renesas reserves the right, without notice, to make changes to this software and to discontinue the availability
* of this software. By using this software, you agree to the additional terms and conditions found by accessing the
* following link:
* http://www.renesas.com/disclaimer
*
* Copyright (C) 2012, 2021 Renesas Electronics Corporation. All rights reserved.
***********************************************************************************************************************/

/***********************************************************************************************************************
* File Name    : r_cg_main.c
* Version      : Code Generator for RL78/G10 V1.05.05.02 [08 Nov 2021]
* Device(s)    : R5F10Y16
* Tool-Chain   : CCRL
* Description  : This file implements main function.
* Creation Date: 2023/10/29
***********************************************************************************************************************/

/***********************************************************************************************************************
Includes
***********************************************************************************************************************/
#include "r_cg_macrodriver.h"
#include "r_cg_cgc.h"
#include "r_cg_tau.h"
#include "r_cg_wdt.h"
#include "r_cg_sau.h"
/* Start user code for include. Do not edit comment generated here */
#include <stdint.h>
#include <stdbool.h>
/* End user code. Do not edit comment generated here */
#include "r_cg_userdefine.h"

/***********************************************************************************************************************
Pragma directive
***********************************************************************************************************************/
/* Start user code for pragma. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */

/***********************************************************************************************************************
Global variables and functions
***********************************************************************************************************************/
/* Start user code for global. Do not edit comment generated here */
// I2C LCD (AE-AQM1602A) のターゲット(スレーブ)アドレス
#define AQM1602A_I2C_TARGET_ADDRESS (0x3e)

// I2C LCD (AE-AQM1602A) 用送信バッファ
#define I2C_SEND_BUFFER_SIZE (2U)
static uint8_t gI2C_SEND_BUFFER[I2C_SEND_BUFFER_SIZE];

// 1ミリ秒 × multiply 遅延
void delay_milliseconds(uint16_t multiply) {
    while (multiply-- > 0U) {
        gMILLISECONDS_TIMER_EVENT_OCCURRED_FLAG = false;
        while (!gMILLISECONDS_TIMER_EVENT_OCCURRED_FLAG) {
            HALT();
        }
        R_WDT_Restart();
    }
}

// ミリ秒delay
static inline void delay(uint16_t milliseconds) {
    delay_milliseconds(milliseconds);
}

// I2C LCD (AE-AQM1602A)にコマンドを送信する
void AQM1602A_send_command(const uint8_t command_byte) {
    gI2C_SEND_BUFFER[0] = 0x00;
    gI2C_SEND_BUFFER[1] = command_byte;
    R_IIC00_Master_Send( AQM1602A_I2C_TARGET_ADDRESS << 1, gI2C_SEND_BUFFER, I2C_SEND_BUFFER_SIZE);
    delay(10);
    R_IIC00_StopCondition();
}

// I2C LCD (AE-AQM1602A)に1文字送信する
void AQM1602A_send_data(const uint8_t byte) {
    gI2C_SEND_BUFFER[0] = 0x40;
    gI2C_SEND_BUFFER[1] = byte;
    R_IIC00_Master_Send( AQM1602A_I2C_TARGET_ADDRESS << 1, gI2C_SEND_BUFFER, I2C_SEND_BUFFER_SIZE);
    delay(1);
    R_IIC00_StopCondition();
}

// I2C LCD (AE-AQM1602A)に文字列を送信する
void AQM1602A_puts(const char *p) {
    while (*p) {
        AQM1602A_send_data(*p++);
    }
}

// I2C LCD (AE-AQM1602A) クリアディスプレイ
void AQM1602A_clear_display(void) {
    AQM1602A_send_command(0x01);    // clear display
    delay(10);
}

// I2C LCD (AE-AQM1602A) ホーム(左上)に移動する
void AQM1602A_return_home(void) {
    AQM1602A_send_command(0x02);    // return home
    delay(10);
}

// I2C LCD (AE-AQM1602A)の初期化
void AQM1602A_init(void) {
    AQM1602A_send_command(0x38);    // function set
    delay(20);
    AQM1602A_send_command(0x39);    // function set
    delay(20);
    AQM1602A_send_command(0x14);    // internal osc frequency
    delay(20);
    AQM1602A_send_command(0x7A);    // contrast lower
    delay(20);
    AQM1602A_send_command(0x54);    // contrast higher / icon / power
    delay(20);
    AQM1602A_send_command(0x6C);    // follower control
    delay(20);
    //
    AQM1602A_send_command(0x38);    // function set
    delay(20);
    AQM1602A_send_command(0x01);    // clear display
    delay(20);
    AQM1602A_send_command(0x0C);    // display on
    delay(20);
}
/* End user code. Do not edit comment generated here */

static void R_MAIN_UserInit(void);
/***********************************************************************************************************************
* Function Name: main
* Description  : This function implements main function.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
void main(void)
{
    R_MAIN_UserInit();
    /* Start user code. Do not edit comment generated here */
    // 100ms待つ
    delay(100);
    //
    const char messages[2][17] = { "RL78 R5F10Y16ASP", "HELLO, WORLD    ", };
    // LCDの初期化
    AQM1602A_init();
    // 1行目
    AQM1602A_puts(messages[0]);
    // 2行目
    AQM1602A_send_command(0x80 | 0x40); // アドレス設定
    AQM1602A_puts(messages[1]);
    //
    while (1U) {
        delay(3000);
        AQM1602A_clear_display();
        for (uint8_t i = 0; i < 16; ++i) {
            AQM1602A_send_data(messages[0][i]);
            delay(100);
        }
        AQM1602A_send_command(0x80 | 0x40); // アドレス設定
        for (uint8_t i = 0; i < 16; ++i) {
            AQM1602A_send_data(messages[1][i]);
            delay(100);
        }
    }
    /* End user code. Do not edit comment generated here */
}
/***********************************************************************************************************************
* Function Name: R_MAIN_UserInit
* Description  : This function adds user code before implementing main function.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
static void R_MAIN_UserInit(void)
{
    /* Start user code. Do not edit comment generated here */
    R_TAU0_Channel0_Start();
    EI();
    /* End user code. Do not edit comment generated here */
}

/* Start user code for adding. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */
クリックして展開し、詳細を表示

何が違うかって?
R_IIC00_Master_Send 関数呼び出し後に StopCondition 関数呼び出しの部分。

ビルド

e2studio14

マイコンと LCD モジュールを接続する

端子配置図

に接続する。I2C バスのプルアップは液晶モジュールの変換基盤に載っているプルアップを使った。

Renesas Flash Programmer で書き込む

書き込む

実行

R5F10Y47ASP と R5F10Y16ASP は同じ RL78/G10 シリーズなのでやり方はほぼ同じですよね。

著作権表示

著者: Akihiro Yamamoto

リンク: https://ak1211.com/posts/7738/

ライセンス: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

コメント

検索を開始

キーワードを入力して記事を検索

↑↓
ESC
⌘K ショートカット