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

前回に続けて R5F10Y16ASP で Hello,World してみようとしたが、 10 ピン版はシリアル・アレイ・ユニットを使った簡易 I2C 機能なので、今回はシリアル・インタフェース IICA がある 16 ピン版の ルネサスエレクトロニクス製の秋月電子価格 130 円マイコンRL78/G10 シリーズ R5F10Y47ASPを使ってみる。

前回と同じくブレッドボードに挿すので210 円のR5F10Y47ASP使用 RL78マイコンモジュールの方を選ぶ。

AE-R5F10Y47ASP

LCD モジュールは秋月電子の I2C接続小型キャラクタLCDモジュール(16 × 2行・3.3V/5V)ピッチ変換キット を使う。

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

回路を作るのは後回しにして、e2 studio を起動して新規プロジェクトを作る。

新規 -> Renesas C/C++ Project -> Renesas RL78 から
Renesas CC-RL C/C++ Executable Project を選択して
ターゲット・デバイス: R5F10Y47 を選択して
Use 周辺コード作成にチェックを入れてプロジェクトを作る。

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

端子配置図

に接続する。(SCL/SDA は液晶モジュールの変換基盤に載っているプルアップか外部抵抗器でプルアップしておく)

プロジェクト設定

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

インターバルタイマー

delay 関数を用意するためにインターバルタイマーを使う。

src/cg_src/r_cg_tau_user.c

C
/* Start user code for include. Do not edit comment generated here */
#include <stdbool.h>
/* End user code. Do not edit comment generated here */
クリックして展開し、詳細を表示

gMILLISECONDS_TIMER_EVENT_OCCURRED_FLAG グローバル変数を用意
この変数はタイマー割り込み関数で触るので volatile で宣言する。

C
/* Start user code for global. Do not edit comment generated here */
volatile bool gMILLISECONDS_TIMER_EVENT_OCCURRED_FLAG = false;
/* End user code. Do not edit comment generated here */
クリックして展開し、詳細を表示

タイマー割り込みは 1ms 周期で発生するので割り込みハンドラで gMILLISECONDS_TIMER_EVENT_OCCURRED_FLAG 変数を true にする。

C
static void __near r_tau0_channel0_interrupt(void)
{
    /* Start user code. Do not edit comment generated here */
    gMILLISECONDS_TIMER_EVENT_OCCURRED_FLAG = true;
    /* End user code. Do not edit comment generated here */
}
クリックして展開し、詳細を表示

src/cg_src/r_cg_userdefine.h

src/cg_src/r_cg_tau_user.c ファイルで定義した変数を extern 宣言する。

C
/* Start user code for function. Do not edit comment generated here */
#include <stdbool.h>
extern volatile bool gMILLISECONDS_TIMER_EVENT_OCCURRED_FLAG;
/* End user code. Do not edit comment generated here */
クリックして展開し、詳細を表示

delay 関数を作る

タイマー割り込みを使って delay 関数を作る

C
// 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();
    }
}
クリックして展開し、詳細を表示

Hello, World プログラム

この後は液晶モジュールのマニュアルを見ながら実装していくだけ。

src/cg_src/r_cg_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)    : R5F10Y47
 * Tool-Chain   : CCRL
 * Description  : This file implements main function.
 * Creation Date: 2023/10/25
 ***********************************************************************************************************************/

/***********************************************************************************************************************
 Includes
 ***********************************************************************************************************************/
#include "r_cg_macrodriver.h"
#include "r_cg_cgc.h"
#include "r_cg_port.h"
#include "r_cg_tau.h"
#include "r_cg_wdt.h"
#include "r_cg_iica.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_IICA0_Master_Send(AQM1602A_I2C_TARGET_ADDRESS << 1, gI2C_SEND_BUFFER,
    I2C_SEND_BUFFER_SIZE, 128U);
    delay(10);
}

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

// 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 R5F10Y47ASP", "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 */
クリックして展開し、詳細を表示

液晶モジュールの初期化して表示までをマニュアル通りに書いたつもり。

Renesas Flash Programmer で書き込む

実行

AVR でも stm32 でも同じことをしたことがあるのですんなりできた。

著作権表示

著者: Akihiro Yamamoto

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

ライセンス: 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 ショートカット