├── .gitattributes ├── M12A11A.jpg ├── R8C_Writer.png ├── M120AN ├── base │ ├── base.kicad_pcb │ └── base.pro ├── comp.hpp ├── watchdog.hpp ├── vdetect.hpp ├── timer_rj.hpp ├── flash.hpp └── adc.hpp ├── SerialModule.png ├── .gitignore ├── USB_CHECKER ├── KiCAD │ ├── usb_checker.kicad_pcb │ ├── usb_checker.pdf │ └── usb_checker.pro ├── .gitignore ├── USB_Checker.jpg ├── usb_checker.png ├── README.md └── main.cpp ├── RC_SERVO_tester └── KiCAD │ ├── rc_servo_tester.kicad_pcb │ ├── rc_servo_tester.pdf │ └── rc_servo_tester.pro ├── r8cprog ├── R8C_Programmer.jpg ├── KiCAD │ ├── WriterModule.pro │ ├── renesas.dcm │ ├── SerialModule.pro │ ├── akizuki.dcm │ └── ftdi.dcm ├── area.hpp ├── sjis_utf16.hpp ├── README.md └── r8c_prog.conf ├── PLUSE_OUT_LCD └── bitmap │ ├── font12.png │ ├── font32.png │ ├── ascii6x12.png │ └── Makefile ├── KiCAD_lib ├── renesas.dcm ├── akizuki.dcm └── ftdi.dcm ├── common ├── init.h ├── intr_utils.hpp ├── start.s ├── renesas.hpp ├── delay.hpp ├── init.c ├── bitset.hpp ├── font6x12.hpp ├── fifo.hpp └── comp_io.hpp ├── pfatfs └── src │ ├── integer.h │ ├── diskio.h │ ├── 00readme.txt │ └── pffconf.h ├── .github └── FUNDING.yml ├── .vscode ├── launch.json ├── c_cpp_properties.json └── settings.json ├── all_project_build.sh ├── SD_sample └── KiCAD │ ├── sd_card_base.sch │ └── sd_card_base.pro ├── chip ├── HX711.hpp ├── nRF905.hpp ├── ADNS2051.hpp ├── RX_MOD.hpp ├── MAX6675.hpp ├── DS1371.hpp ├── NTCTH.hpp ├── ENCODER.hpp ├── AD985X.hpp ├── UC1701.hpp ├── TX_MOD.hpp └── DS3231.hpp ├── FIRST_sample └── main.cpp ├── LICENSE ├── TIMER_sample └── main.cpp ├── COMP_sample └── main.cpp ├── CANON_IR └── main.cpp ├── ARITH_sample └── main.cpp ├── PLUSE_SINGLE_sample └── main.cpp ├── SD_WAV_play └── wav_in.hpp ├── PLUSE_INP_sample └── main.cpp ├── MAX6675_sample └── main.cpp ├── L3G4200D_sample └── main.cpp ├── RF433_sample └── main.cpp ├── MAX7219_sample └── main.cpp ├── ENCODER_sample └── main.cpp ├── PWM_sample └── main.cpp ├── TOUCH_sample └── main.cpp ├── ADC_sample └── main.cpp ├── THERMISTOR_sample └── main.cpp ├── FAMIPAD_sample └── main.cpp ├── RC_SERVO_sample └── main.cpp ├── SWITCH_sample └── main.cpp ├── UART_sample └── main.cpp ├── MPU6050_sample └── main.cpp ├── PLUSE_OUT_sample └── main.cpp ├── VL53L0X_sample └── main.cpp └── BMP180_sample └── main.cpp /.gitattributes: -------------------------------------------------------------------------------- 1 | pfatfs/* linguist-vendored 2 | 3 | -------------------------------------------------------------------------------- /M12A11A.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirakuni45/R8C/HEAD/M12A11A.jpg -------------------------------------------------------------------------------- /R8C_Writer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirakuni45/R8C/HEAD/R8C_Writer.png -------------------------------------------------------------------------------- /M120AN/base/base.kicad_pcb: -------------------------------------------------------------------------------- 1 | (kicad_pcb (version 4) (host kicad "dummy file") ) 2 | -------------------------------------------------------------------------------- /SerialModule.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirakuni45/R8C/HEAD/SerialModule.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | *.[ao] 3 | *.map 4 | *.lst 5 | *.elf 6 | *.mot 7 | *.exe 8 | release/ 9 | -------------------------------------------------------------------------------- /USB_CHECKER/KiCAD/usb_checker.kicad_pcb: -------------------------------------------------------------------------------- 1 | (kicad_pcb (version 4) (host kicad "dummy file") ) 2 | -------------------------------------------------------------------------------- /RC_SERVO_tester/KiCAD/rc_servo_tester.kicad_pcb: -------------------------------------------------------------------------------- 1 | (kicad_pcb (version 4) (host kicad "dummy file") ) 2 | -------------------------------------------------------------------------------- /r8cprog/R8C_Programmer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirakuni45/R8C/HEAD/r8cprog/R8C_Programmer.jpg -------------------------------------------------------------------------------- /USB_CHECKER/.gitignore: -------------------------------------------------------------------------------- 1 | !usb_checker.elf 2 | !usb_checker.map 3 | !usb_checker.lst 4 | !usb_checker.mot 5 | -------------------------------------------------------------------------------- /USB_CHECKER/USB_Checker.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirakuni45/R8C/HEAD/USB_CHECKER/USB_Checker.jpg -------------------------------------------------------------------------------- /USB_CHECKER/usb_checker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirakuni45/R8C/HEAD/USB_CHECKER/usb_checker.png -------------------------------------------------------------------------------- /PLUSE_OUT_LCD/bitmap/font12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirakuni45/R8C/HEAD/PLUSE_OUT_LCD/bitmap/font12.png -------------------------------------------------------------------------------- /PLUSE_OUT_LCD/bitmap/font32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirakuni45/R8C/HEAD/PLUSE_OUT_LCD/bitmap/font32.png -------------------------------------------------------------------------------- /PLUSE_OUT_LCD/bitmap/ascii6x12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirakuni45/R8C/HEAD/PLUSE_OUT_LCD/bitmap/ascii6x12.png -------------------------------------------------------------------------------- /USB_CHECKER/KiCAD/usb_checker.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirakuni45/R8C/HEAD/USB_CHECKER/KiCAD/usb_checker.pdf -------------------------------------------------------------------------------- /RC_SERVO_tester/KiCAD/rc_servo_tester.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hirakuni45/R8C/HEAD/RC_SERVO_tester/KiCAD/rc_servo_tester.pdf -------------------------------------------------------------------------------- /r8cprog/KiCAD/WriterModule.pro: -------------------------------------------------------------------------------- 1 | update=2021/10/16 23:14:43 2 | last_client=kicad 3 | [eeschema] 4 | version=1 5 | LibDir= 6 | -------------------------------------------------------------------------------- /KiCAD_lib/renesas.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 Date: 2015/06/07 9:43:40 2 | # 3 | $CMP R8C/M110AN 4 | D Renesas R8C/M110AN 5 | K R8C 6 | $ENDCMP 7 | # 8 | $CMP R8C/M120AN 9 | D Renesas R8C/M110AN 10 | K R8C 11 | $ENDCMP 12 | # 13 | $CMP RX63T-64 14 | D Renesas RX63T 32bits 100MHz RX Micro Controler 64Pin(64K Flash,8K RAM) 15 | K RX RX63T Renesas RX600 64PIN 16 | $ENDCMP 17 | # 18 | #End Doc Library 19 | -------------------------------------------------------------------------------- /r8cprog/KiCAD/renesas.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 Date: 2015/06/07 9:43:40 2 | # 3 | $CMP R8C/M110AN 4 | D Renesas R8C/M110AN 5 | K R8C 6 | $ENDCMP 7 | # 8 | $CMP R8C/M120AN 9 | D Renesas R8C/M110AN 10 | K R8C 11 | $ENDCMP 12 | # 13 | $CMP RX63T-64 14 | D Renesas RX63T 32bits 100MHz RX Micro Controler 64Pin(64K Flash,8K RAM) 15 | K RX RX63T Renesas RX600 64PIN 16 | $ENDCMP 17 | # 18 | #End Doc Library 19 | -------------------------------------------------------------------------------- /common/init.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief R8C 起動前初期化 5 | @author 平松邦仁 (hira@rvf-rc45.net) 6 | @copyright Copyright (C) 2015, 2017 Kunihito Hiramatsu @n 7 | Released under the MIT license @n 8 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 9 | */ 10 | //=====================================================================// 11 | 12 | #ifdef __cplusplus 13 | extern "C" { 14 | #endif 15 | //-----------------------------------------------------------------// 16 | /*! 17 | @brief メイン関数起動前初期化 18 | */ 19 | //-----------------------------------------------------------------// 20 | void _init(void); 21 | #ifdef __cplusplus 22 | }; 23 | #endif 24 | -------------------------------------------------------------------------------- /r8cprog/area.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief 領域クラス 5 | @author 平松邦仁 (hira@rvf-rc45.net) 6 | @copyright Copyright (C) 2017 Kunihito Hiramatsu @n 7 | Released under the MIT license @n 8 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 9 | */ 10 | //=====================================================================// 11 | #include 12 | 13 | namespace utils { 14 | 15 | struct area_t { 16 | uint32_t org_; 17 | uint32_t end_; 18 | area_t(uint32_t o = 0, uint32_t e = 0) : org_(o), end_(e) { } 19 | 20 | bool is_in(uint32_t adr) const { 21 | if(org_ <= adr && adr <= end_) return true; 22 | else return false; 23 | } 24 | }; 25 | 26 | typedef std::vector areas; 27 | } 28 | -------------------------------------------------------------------------------- /pfatfs/src/integer.h: -------------------------------------------------------------------------------- 1 | /*-------------------------------------------*/ 2 | /* Integer type definitions for FatFs module */ 3 | /*-------------------------------------------*/ 4 | 5 | #ifndef _FF_INTEGER 6 | #define _FF_INTEGER 7 | 8 | #ifdef WIN32 /* FatFs development platform */ 9 | 10 | #include 11 | #include 12 | 13 | #else /* Embedded platform */ 14 | 15 | /* This type MUST be 8 bit */ 16 | typedef unsigned char BYTE; 17 | 18 | /* These types MUST be 16 bit */ 19 | typedef short SHORT; 20 | typedef unsigned short WORD; 21 | typedef unsigned short WCHAR; 22 | 23 | /* These types MUST be 16 bit or 32 bit */ 24 | typedef int INT; 25 | typedef unsigned int UINT; 26 | 27 | /* These types MUST be 32 bit */ 28 | typedef long LONG; 29 | typedef unsigned long DWORD; 30 | 31 | #endif 32 | 33 | #endif 34 | -------------------------------------------------------------------------------- /M120AN/base/base.pro: -------------------------------------------------------------------------------- 1 | update=22/05/2015 07:44:53 2 | version=1 3 | last_client=kicad 4 | [general] 5 | version=1 6 | RootSch= 7 | BoardNm= 8 | [pcbnew] 9 | version=1 10 | LastNetListRead= 11 | UseCmpFile=1 12 | PadDrill=0.600000000000 13 | PadDrillOvalY=0.600000000000 14 | PadSizeH=1.500000000000 15 | PadSizeV=1.500000000000 16 | PcbTextSizeV=1.500000000000 17 | PcbTextSizeH=1.500000000000 18 | PcbTextThickness=0.300000000000 19 | ModuleTextSizeV=1.000000000000 20 | ModuleTextSizeH=1.000000000000 21 | ModuleTextSizeThickness=0.150000000000 22 | SolderMaskClearance=0.000000000000 23 | SolderMaskMinWidth=0.000000000000 24 | DrawSegmentWidth=0.200000000000 25 | BoardOutlineThickness=0.100000000000 26 | ModuleOutlineThickness=0.150000000000 27 | [cvpcb] 28 | version=1 29 | NetIExt=net 30 | [eeschema] 31 | version=1 32 | LibDir= 33 | [eeschema/libraries] 34 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [hirakuni45] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 14 | -------------------------------------------------------------------------------- /common/intr_utils.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief 割り込み・ユーティリティー 5 | @author 平松邦仁 (hira@rvf-rc45.net) 6 | @copyright Copyright (C) 2015, 2017 Kunihito Hiramatsu @n 7 | Released under the MIT license @n 8 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 9 | */ 10 | //=====================================================================// 11 | #include 12 | 13 | namespace utils { 14 | 15 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 16 | /*! 17 | @brief null タスク 18 | */ 19 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 20 | class null_task { 21 | public: 22 | 23 | //-----------------------------------------------------------------// 24 | /*! 25 | @brief 何もしない 26 | */ 27 | //-----------------------------------------------------------------// 28 | void operator () () { 29 | } 30 | }; 31 | 32 | } 33 | 34 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // IntelliSense を使用して利用可能な属性を学べます。 3 | // 既存の属性の説明をホバーして表示します。 4 | // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "(gdb) 起動", 9 | "type": "cppdbg", 10 | "request": "launch", 11 | "program": "プログラム名を入力してください (例: ${workspaceFolder}/a.exe)", 12 | "args": [], 13 | "stopAtEntry": false, 14 | "cwd": "${workspaceFolder}", 15 | "environment": [], 16 | "externalConsole": false, 17 | "MIMode": "gdb", 18 | "miDebuggerPath": "/path/to/gdb", 19 | "setupCommands": [ 20 | { 21 | "description": "gdb の再フォーマットを有効にする", 22 | "text": "-enable-pretty-printing", 23 | "ignoreFailures": true 24 | } 25 | ] 26 | } 27 | ] 28 | } -------------------------------------------------------------------------------- /common/start.s: -------------------------------------------------------------------------------- 1 | # =============================================================== 2 | /*! @file 3 | @brief R8C スタート・アップ 4 | @author 平松邦仁 (hira@rvf-rc45.net) 5 | @copyright Copyright (C) 2014, 2017 Kunihito Hiramatsu @n 6 | Released under the MIT license @n 7 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 8 | */ 9 | # =============================================================== 10 | .text 11 | .global _reset_start 12 | _reset_start: 13 | .global _start 14 | _start: 15 | /* 割り込みスタック設定 */ 16 | .extern _isp_init 17 | ldc #_isp_init,isp 18 | 19 | /* ユーザースタック設定 */ 20 | .extern _usp_init 21 | fset u 22 | ldc #_usp_init,sp 23 | 24 | /* 可変ベクターテーブルアドレス設定 */ 25 | .extern _variable_vectors_ 26 | ldc #_variable_vectors_,intbl 27 | 28 | /* 割り込み許可 */ 29 | ldipl #0 30 | nop 31 | nop 32 | fset i 33 | 34 | .extern __init 35 | jmp.w __init 36 | 37 | .global _exit 38 | _exit: 39 | jmp.w _exit 40 | 41 | .section .data 42 | .global ___dso_handle 43 | .weak ___dso_handle 44 | ___dso_handle: 45 | .long 0 46 | -------------------------------------------------------------------------------- /RC_SERVO_tester/KiCAD/rc_servo_tester.pro: -------------------------------------------------------------------------------- 1 | update=2021/10/15 14:16:34 2 | version=1 3 | last_client=kicad 4 | [pcbnew] 5 | version=1 6 | LastNetListRead= 7 | UseCmpFile=1 8 | PadDrill=0.600000000000 9 | PadDrillOvalY=0.600000000000 10 | PadSizeH=1.500000000000 11 | PadSizeV=1.500000000000 12 | PcbTextSizeV=1.500000000000 13 | PcbTextSizeH=1.500000000000 14 | PcbTextThickness=0.300000000000 15 | ModuleTextSizeV=1.000000000000 16 | ModuleTextSizeH=1.000000000000 17 | ModuleTextSizeThickness=0.150000000000 18 | SolderMaskClearance=0.000000000000 19 | SolderMaskMinWidth=0.000000000000 20 | DrawSegmentWidth=0.200000000000 21 | BoardOutlineThickness=0.100000000000 22 | ModuleOutlineThickness=0.150000000000 23 | [cvpcb] 24 | version=1 25 | NetIExt=net 26 | [general] 27 | version=1 28 | [schematic_editor] 29 | version=1 30 | PageLayoutDescrFile= 31 | PlotDirectoryName= 32 | SubpartIdSeparator=0 33 | SubpartFirstId=65 34 | NetFmtName= 35 | SpiceForceRefPrefix=0 36 | SpiceUseNetNumbers=0 37 | LabSize=60 38 | [eeschema] 39 | version=1 40 | LibDir= 41 | -------------------------------------------------------------------------------- /all_project_build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | CMDNAME=`basename $0` 3 | if [[ $1 = "help" ]]; then 4 | echo "Usage: $CMDNAME [clean]" 5 | echo "" 6 | exit 7 | fi 8 | 9 | RED=`tput setaf 1` 10 | GREEN=`tput setaf 2` 11 | PINK=`tput setaf 5` 12 | LIGHTBLUE=`tput setaf 6` 13 | NOCOLOR=`tput sgr0` 14 | 15 | # make clean 16 | if [[ $1 = "clean" ]]; then 17 | for file in `ls -d *` 18 | do 19 | if [ -e "${file}/Makefile" ]; then 20 | cd "${file}" 21 | echo "${GREEN}Clean project: " ${file} "${NOCOLOR}" 22 | make clean >& /dev/null 23 | if [ $? -ne 0 ]; then 24 | echo "${RED}Error: " ${file} "${NOCOLOR}" 25 | echo "" 26 | break; 27 | fi 28 | cd .. 29 | fi 30 | done 31 | fi 32 | 33 | # make 34 | for file in `ls -d *` 35 | do 36 | if [ -e "${file}/Makefile" ]; then 37 | echo "${PINK}Start project: " ${file} "${NOCOLOR}" 38 | cd "${file}" 39 | make > /dev/null 40 | if [ $? -ne 0 ]; then 41 | echo "${RED}Compile error: " ${file} "${NOCOLOR}" 42 | echo "" 43 | break; 44 | fi 45 | cd .. 46 | echo "${LIGHTBLUE}Build project: " ${file} "${NOCOLOR}" 47 | fi 48 | done 49 | -------------------------------------------------------------------------------- /PLUSE_OUT_LCD/bitmap/Makefile: -------------------------------------------------------------------------------- 1 | font32: 2 | bmc -offset 0*20,0*32 -size 18,32 -header 8 -text -c_style nmb_0 font32.png font32.h 3 | bmc -offset 1*20,0*32 -size 18,32 -header 8 -text -c_style nmb_1 font32.png -append font32.h 4 | bmc -offset 2*20,0*32 -size 18,32 -header 8 -text -c_style nmb_2 font32.png -append font32.h 5 | bmc -offset 3*20,0*32 -size 18,32 -header 8 -text -c_style nmb_3 font32.png -append font32.h 6 | bmc -offset 4*20,0*32 -size 18,32 -header 8 -text -c_style nmb_4 font32.png -append font32.h 7 | bmc -offset 5*20,0*32 -size 18,32 -header 8 -text -c_style nmb_5 font32.png -append font32.h 8 | bmc -offset 6*20,0*32 -size 18,32 -header 8 -text -c_style nmb_6 font32.png -append font32.h 9 | bmc -offset 7*20,0*32 -size 18,32 -header 8 -text -c_style nmb_7 font32.png -append font32.h 10 | bmc -offset 8*20,0*32 -size 18,32 -header 8 -text -c_style nmb_8 font32.png -append font32.h 11 | bmc -offset 9*20,0*32 -size 18,32 -header 8 -text -c_style nmb_9 font32.png -append font32.h 12 | bmc -offset 3*20,1*32 -size 19,32 -header 8 -text -c_style txt_hz font32.png -append font32.h 13 | bmc -offset 2*20+9,1*32 -size 9,32 -header 8 -text -c_style txt_k font32.png -append font32.h 14 | -------------------------------------------------------------------------------- /SD_sample/KiCAD/sd_card_base.sch: -------------------------------------------------------------------------------- 1 | EESchema Schematic File Version 2 2 | LIBS:power 3 | LIBS:device 4 | LIBS:transistors 5 | LIBS:conn 6 | LIBS:linear 7 | LIBS:regul 8 | LIBS:74xx 9 | LIBS:cmos4000 10 | LIBS:adc-dac 11 | LIBS:memory 12 | LIBS:xilinx 13 | LIBS:special 14 | LIBS:microcontrollers 15 | LIBS:dsp 16 | LIBS:microchip 17 | LIBS:analog_switches 18 | LIBS:motorola 19 | LIBS:texas 20 | LIBS:intel 21 | LIBS:audio 22 | LIBS:interface 23 | LIBS:digital-audio 24 | LIBS:philips 25 | LIBS:display 26 | LIBS:cypress 27 | LIBS:siliconi 28 | LIBS:opto 29 | LIBS:atmel 30 | LIBS:contrib 31 | LIBS:valves 32 | LIBS:akizuki 33 | LIBS:ftdi 34 | LIBS:renesas 35 | EELAYER 27 0 36 | EELAYER END 37 | $Descr A4 11693 8268 38 | encoding utf-8 39 | Sheet 1 1 40 | Title "" 41 | Date "22 jun 2015" 42 | Rev "" 43 | Comp "" 44 | Comment1 "" 45 | Comment2 "" 46 | Comment3 "" 47 | Comment4 "" 48 | $EndDescr 49 | $Comp 50 | L R8C/M120AN U? 51 | U 1 1 55880D8E 52 | P 4800 3200 53 | F 0 "U?" H 3250 4350 60 0000 C CNN 54 | F 1 "R8C/M120AN" H 3500 2050 60 0000 C CNN 55 | F 2 "~" H 4800 3200 60 0000 C CNN 56 | F 3 "~" H 4800 3200 60 0000 C CNN 57 | 1 4800 3200 58 | 1 0 0 -1 59 | $EndComp 60 | $EndSCHEMATC 61 | -------------------------------------------------------------------------------- /pfatfs/src/diskio.h: -------------------------------------------------------------------------------- 1 | /*----------------------------------------------------------------------- 2 | / PFF - Low level disk interface modlue include file (C)ChaN, 2014 3 | /-----------------------------------------------------------------------*/ 4 | 5 | #ifndef _DISKIO_DEFINED 6 | #define _DISKIO_DEFINED 7 | 8 | #ifdef __cplusplus 9 | extern "C" { 10 | #endif 11 | 12 | #include "pfatfs/src/integer.h" 13 | 14 | 15 | /* Status of Disk Functions */ 16 | typedef BYTE DSTATUS; 17 | 18 | 19 | /* Results of Disk Functions */ 20 | typedef enum { 21 | RES_OK = 0, /* 0: Function succeeded */ 22 | RES_ERROR, /* 1: Disk error */ 23 | RES_NOTRDY, /* 2: Not ready */ 24 | RES_PARERR /* 3: Invalid parameter */ 25 | } DRESULT; 26 | 27 | 28 | /*---------------------------------------*/ 29 | /* Prototypes for disk control functions */ 30 | 31 | DSTATUS disk_initialize (void); 32 | DRESULT disk_readp (BYTE* buff, DWORD sector, UINT offser, UINT count); 33 | DRESULT disk_writep (const BYTE* buff, DWORD sc); 34 | 35 | #define STA_NOINIT 0x01 /* Drive not initialized */ 36 | #define STA_NODISK 0x02 /* No medium in the drive */ 37 | 38 | #ifdef __cplusplus 39 | } 40 | #endif 41 | 42 | #endif /* _DISKIO_DEFINED */ 43 | -------------------------------------------------------------------------------- /chip/HX711.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief HX711 ドライバー @n 5 | ※ロードセル用24ビットA/Dコンバーター 6 | @author 平松邦仁 (hira@rvf-rc45.net) 7 | @copyright Copyright (C) 2017 Kunihito Hiramatsu @n 8 | Released under the MIT license @n 9 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 10 | */ 11 | //=====================================================================// 12 | #include 13 | #include 14 | #include "common/delay.hpp" 15 | 16 | namespace chip { 17 | 18 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 19 | /*! 20 | @brief HX711 テンプレートクラス 21 | @param[in] SCK クロック・ポート 22 | @param[in] DAT データ・ポート 23 | */ 24 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 25 | template 26 | class HX711 { 27 | 28 | 29 | public: 30 | //-----------------------------------------------------------------// 31 | /*! 32 | @brief コンストラクター 33 | */ 34 | //-----------------------------------------------------------------// 35 | HX711() noexcept { } 36 | 37 | 38 | 39 | 40 | }; 41 | } 42 | -------------------------------------------------------------------------------- /common/renesas.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief R8C/M110AN, R8C/M120AN グループ定義 5 | @author 平松邦仁 (hira@rvf-rc45.net) 6 | @copyright Copyright (C) 2021 Kunihito Hiramatsu @n 7 | Released under the MIT license @n 8 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 9 | */ 10 | //=====================================================================// 11 | #ifdef VSC_INTELL_SENSE 12 | typedef char int8_t; 13 | typedef unsigned char uint8_t; 14 | typedef short int16_t; 15 | typedef unsigned short uint16_t; 16 | typedef long int32_t; 17 | typedef unsigned long uint32_t; 18 | #endif 19 | 20 | #include 21 | 22 | #include "common/vect.h" 23 | #include "M120AN/system.hpp" 24 | #include "M120AN/clock.hpp" 25 | #include "M120AN/port.hpp" 26 | #include "M120AN/intr.hpp" 27 | #include "M120AN/adc.hpp" 28 | #include "M120AN/flash.hpp" 29 | #include "M120AN/timer_rb.hpp" 30 | #include "M120AN/timer_rc.hpp" 31 | #include "M120AN/timer_rj.hpp" 32 | #include "M120AN/uart.hpp" 33 | #include "M120AN/vdetect.hpp" 34 | #include "M120AN/watchdog.hpp" 35 | 36 | #include "common/delay.hpp" 37 | #include "common/port_map.hpp" 38 | #include "common/intr_utils.hpp" 39 | -------------------------------------------------------------------------------- /.vscode/c_cpp_properties.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurations": [ 3 | { 4 | "name": "Win32", 5 | "compilerPath": "", 6 | "intelliSenseMode": "linux-gcc-x86", 7 | "includePath": [ 8 | "C:/msys64/usr/local/m32c-elf/m32c-elf/include", 9 | "C:/msys64/usr/local/m32c-elf/lib/gcc/m32c-elf/4.9.4/include-fixed", 10 | "C:/msys64/usr/local/m32c-elf/lib/gcc/m32c-elf/4.9.4/include", 11 | "C:/msys64/usr/local/m32c-elf/m32c-elf/include/c++/4.9.4/backward", 12 | "C:/msys64/usr/local/m32c-elf/m32c-elf/include/c++/4.9.4/m32c-elf", 13 | "C:/msys64/usr/local/m32c-elf/m32c-elf/include/c++/4.9.4", 14 | "D:/Git/R8C", 15 | "C:/msys64/mingw64/include", 16 | "${workspaceFolder}" 17 | ], 18 | "defines": [ 19 | "__GNUC__", "__BYTE_ORDER__=__ORDER_LITTLE_ENDIAN__", 20 | "VSC_INTELL_SENSE", "F_CLK=20000000", 21 | "_DEBUG", 22 | "UNICODE", 23 | "_UNICODE" 24 | ], 25 | "windowsSdkVersion": "8.1", 26 | "cStandard": "c11", 27 | "cppStandard": "c++14", 28 | } 29 | ], 30 | "version": 4 31 | } -------------------------------------------------------------------------------- /r8cprog/sjis_utf16.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief SJIS, UTF16 変換 5 | @author 平松邦仁 (hira@rvf-rc45.net) 6 | @copyright Copyright (C) 2017 Kunihito Hiramatsu @n 7 | Released under the MIT license @n 8 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 9 | */ 10 | //=====================================================================// 11 | #include 12 | 13 | namespace utils { 14 | 15 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 16 | /*! 17 | @brief UTF-16 から SJIS コードを求めるマップの生成 18 | */ 19 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 20 | void init_utf16_to_sjis(); 21 | 22 | 23 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 24 | /*! 25 | @brief SJIS から UTF-16 コードを求める 26 | @param[in] sjis SJIS コード 27 | @return UTF16 コード 28 | */ 29 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 30 | uint16_t sjis_to_utf16(uint16_t sjis); 31 | 32 | 33 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 34 | /*! 35 | @brief UTF-16 から SJIS コードを求める 36 | @param[in] utf16 UTF-16 コード 37 | @return SJIS コード 38 | */ 39 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 40 | uint16_t utf16_to_sjis(uint16_t utf16); 41 | 42 | }; 43 | -------------------------------------------------------------------------------- /FIRST_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C LED 点滅 @n 4 | LED は、P1_0(20)、P1_1(19)に接続(吸い込み点灯)@n 5 | ※M120AN(20) 6 | @author 平松邦仁 (hira@rvf-rc45.net) 7 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 8 | Released under the MIT license @n 9 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 10 | */ 11 | //=====================================================================// 12 | #include "common/renesas.hpp" 13 | 14 | namespace { 15 | 16 | // LED は '0' で点灯、'1' で消灯するように接続するので、LED クラスの論理を反転して定義する 17 | typedef device::PORT LED0; 18 | typedef device::PORT LED1; 19 | 20 | } 21 | 22 | int main(int argc, char *argv[]) 23 | { 24 | using namespace device; 25 | 26 | // クロック関係レジスタ・プロテクト解除 27 | PRCR.PRC0 = 1; 28 | 29 | // 高速オンチップオシレーターへ切り替え 30 | OCOCR.HOCOE = 1; 31 | utils::delay::micro_second(1); // >=30us(125KHz) 32 | SCKCR.HSCKSEL = 1; 33 | CKSTPR.SCKSEL = 1; 34 | 35 | // LED 設定 36 | { 37 | LED0::DIR = 1; 38 | LED1::DIR = 1; 39 | } 40 | 41 | // LED 点滅メイン 42 | while(1) { 43 | LED0::P = 0; 44 | LED1::P = 1; 45 | // 250ms (0.25s) 46 | utils::delay::milli_second(250); 47 | LED0::P = 1; 48 | LED1::P = 0; 49 | // 250ms (0.25s) 50 | utils::delay::milli_second(250); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "terminal.integrated.profiles.windows": { 3 | "MSYS2": { 4 | "path": "C:\\msys64\\usr\\bin\\bash.exe", 5 | // "sourse": "PowerShell" または "Git Bush", // windows限定? pathはパスを直接指定し、こちらは既定のターミナルを選ぶという形? 6 | "args": [ 7 | // 起動オプション。これまでterminal.integrated.shellArgs.windowsで設定したいたもの。 8 | "--login" 9 | ], 10 | "overrideName": true, // trueじゃないと、ターミナルの一覧(tabs)に名前が反映されない。falseの場合表示がcmdとかになる。 11 | "env": { 12 | "MSYSTEM": "MINGW64", 13 | "MSYS2_PATH_TYPE": "inherit", 14 | "CHERE_INVOKING": "1" 15 | // "JAVA_HOME": "C:\\Program Files\\Java\\jdk-13.0.1" など 16 | }, 17 | "icon": "terminal" // アイコンID。色々ある。後述。 18 | } 19 | }, 20 | "files.associations": { 21 | "functional": "cpp", 22 | "array": "cpp" 23 | }, 24 | "editor.insertSpaces": false 25 | // "terminal.integrated.cursorStyle": "line", 26 | // "C_Cpp.updateChannel": "Insiders", 27 | // "C_Cpp.default.intelliSenseMode": "clang-x64", 28 | // "C_Cpp.default.compileCommands": "clang", 29 | // "C_Cpp.default.compilerPath": "C:\\msys64\\usr\\bin", 30 | // Gitのパスの設定(先ほど作ったバッチファイルを読み込むように) 31 | // "git.path": "C:/msys64/usr/local/bin/git-wrap.bat", 32 | // "tabnine.experimentalAutoImports": true, 33 | } -------------------------------------------------------------------------------- /chip/nRF905.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief NRF905 Single chip 433/868/915MHz Transceiver ドライバー @n 5 | NORDIC SEMICONDUCTOR @n 6 | https://infocenter.nordicsemi.com/pdf/nRF905_PS_v1.5.pdf @n 7 | Copyright 2020 Kunihito Hiramatsu 8 | @author 平松邦仁 (hira@rvf-rc45.net) 9 | */ 10 | //=====================================================================// 11 | #include 12 | 13 | namespace chip { 14 | 15 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 16 | /*! 17 | @brief nRF905 テンプレートクラス 18 | @param[in] SPI SPI クラス (MISO, MOSI, SCLK) 19 | @param[in] SS SPI/SS クラス 20 | */ 21 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 22 | template 23 | class nRF905 { 24 | 25 | SPI& spi_; 26 | 27 | public: 28 | //-----------------------------------------------------------------// 29 | /*! 30 | @brief コンストラクター 31 | @param[in] spi spi クラスを参照で渡す 32 | */ 33 | //-----------------------------------------------------------------// 34 | nRF905(SPI& spi) : spi_(spi) 35 | { } 36 | 37 | 38 | //-----------------------------------------------------------------// 39 | /*! 40 | @brief 開始 41 | */ 42 | //-----------------------------------------------------------------// 43 | void start() noexcept 44 | { 45 | } 46 | 47 | 48 | 49 | }; 50 | } 51 | 52 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015, Hiramatsu Kunihito 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | * Redistributions of source code must retain the above copyright notice, 7 | this list of conditions and the following disclaimer. 8 | * Redistributions in binary form must reproduce the above copyright notice, 9 | this list of conditions and the following disclaimer in the documentation 10 | and/or other materials provided with the distribution. 11 | * Neither the name of the nor the names of its contributors 12 | may be used to endorse or promote products derived from this software 13 | without specific prior written permission. 14 | 15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 16 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 | DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY 19 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 22 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 24 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | -------------------------------------------------------------------------------- /USB_CHECKER/KiCAD/usb_checker.pro: -------------------------------------------------------------------------------- 1 | update=2017/03/17 14:19:28 2 | version=1 3 | last_client=kicad 4 | [pcbnew] 5 | version=1 6 | LastNetListRead= 7 | UseCmpFile=1 8 | PadDrill=0.600000000000 9 | PadDrillOvalY=0.600000000000 10 | PadSizeH=1.500000000000 11 | PadSizeV=1.500000000000 12 | PcbTextSizeV=1.500000000000 13 | PcbTextSizeH=1.500000000000 14 | PcbTextThickness=0.300000000000 15 | ModuleTextSizeV=1.000000000000 16 | ModuleTextSizeH=1.000000000000 17 | ModuleTextSizeThickness=0.150000000000 18 | SolderMaskClearance=0.000000000000 19 | SolderMaskMinWidth=0.000000000000 20 | DrawSegmentWidth=0.200000000000 21 | BoardOutlineThickness=0.100000000000 22 | ModuleOutlineThickness=0.150000000000 23 | [cvpcb] 24 | version=1 25 | NetIExt=net 26 | [general] 27 | version=1 28 | [eeschema] 29 | version=1 30 | LibDir=../../KiCAD_lib 31 | [eeschema/libraries] 32 | LibName1=power 33 | LibName2=device 34 | LibName3=transistors 35 | LibName4=conn 36 | LibName5=linear 37 | LibName6=regul 38 | LibName7=74xx 39 | LibName8=cmos4000 40 | LibName9=adc-dac 41 | LibName10=memory 42 | LibName11=xilinx 43 | LibName12=microcontrollers 44 | LibName13=dsp 45 | LibName14=microchip 46 | LibName15=analog_switches 47 | LibName16=motorola 48 | LibName17=texas 49 | LibName18=intel 50 | LibName19=audio 51 | LibName20=interface 52 | LibName21=digital-audio 53 | LibName22=philips 54 | LibName23=display 55 | LibName24=cypress 56 | LibName25=siliconi 57 | LibName26=opto 58 | LibName27=atmel 59 | LibName28=contrib 60 | LibName29=valves 61 | LibName30=akizuki 62 | LibName31=renesas 63 | -------------------------------------------------------------------------------- /KiCAD_lib/akizuki.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | $CMP 2N7002K 4 | D Nch MOSFET 5 | $ENDCMP 6 | # 7 | $CMP 6P-SW 8 | D 6P Switch 9 | $ENDCMP 10 | # 11 | $CMP A3967 12 | D Microstepping Driver with Translator (Allego Micro Systems, LLC) 13 | $ENDCMP 14 | # 15 | $CMP CAT4238 16 | D High Efficiency 10 LED Boost Converter 17 | K LED Boost Driver 18 | F https://www.onsemi.jp/pub/Collateral/CAT4238-D.PDF 19 | $ENDCMP 20 | # 21 | $CMP CRYSTAL 22 | D HC49 SMD Hand 23 | $ENDCMP 24 | # 25 | $CMP CRYSTAL4 26 | D Miniature Size Low Profile SMD 27 | K SMD CRYSTAL 28 | $ENDCMP 29 | # 30 | $CMP DMG3415U 31 | D Pch MOSFET 32 | $ENDCMP 33 | # 34 | $CMP LCD_480_272 35 | D MDK43WQV118-WCT 36 | $ENDCMP 37 | # 38 | $CMP MAU106 39 | D 1W級絶縁型DC-DCコンバーター(±5V100mA) 40 | $ENDCMP 41 | # 42 | $CMP MAX3485 43 | D 3.3V, 10Mbps Half-Duplex RS-485/RS-422 Transceivers 44 | K RS-485 RS-422 Half 45 | $ENDCMP 46 | # 47 | $CMP MR 48 | D Flat Chip Resistors 49 | $ENDCMP 50 | # 51 | $CMP NJU7223DL1-33 52 | D JRC 3.3V/500mA Regulator 53 | F http://akizukidenshi.com/download/ds/njr/NJU7223_j.pdf 54 | $ENDCMP 55 | # 56 | $CMP NON-POL 57 | D Non polarity capacitor 58 | $ENDCMP 59 | # 60 | $CMP PS7200K 61 | D 光MOSFET 62 | $ENDCMP 63 | # 64 | $CMP R 65 | D Resistor 66 | K R DEV 67 | $ENDCMP 68 | # 69 | $CMP R-78E5 70 | D Low Cost Switching Regulator 71 | K RECOM Electronic GmbH. 72 | $ENDCMP 73 | # 74 | $CMP STEREO 75 | D Stereo conector 76 | $ENDCMP 77 | # 78 | $CMP TCM809R 79 | D Microcontroller Reset Monitors (3.3V) 80 | $ENDCMP 81 | # 82 | $CMP VS1053 83 | D Audio Decoder 84 | $ENDCMP 85 | # 86 | #End Doc Library 87 | -------------------------------------------------------------------------------- /r8cprog/README.md: -------------------------------------------------------------------------------- 1 | R8C Programmer 2 | ========= 3 | ![R8C/Programmer](R8C_Programmer.jpg) 4 | 5 | ## R8C プログラマーの概要など 6 | 7 | 「r8c_prog」は、R8C 全般のフラッシュメモリーを書き換える為のプログラムです。 8 | 通常は、シリアル通信を使ってデバイスと通信を行います。 9 | ※1本の通信線を使って、デバイスと通信するプロトコルはサポートしていま 10 | せんが、ハードウェアーを追加する事により、サポートできる場合があります。 11 | 12 | 以下は、コマンドライン上で表示される簡単なヘルプ機能です。 13 | ``` 14 | Renesas R8C Series Programmer Version 0.82b 15 | Copyright (C) 2015, Hiramatsu Kunihito (hira@rvf-rc45.net) 16 | usage: 17 | r8c_prog[options] [mot file] ... 18 | 19 | Options : 20 | -d, --device=DEVICE Specify device name 21 | -e, --erase Perform a device erase to a minimum 22 | --erase-all, --erase-chip Perform rom and data flash erase 23 | --erase-rom Perform rom flash erase 24 | --erase-data Perform data flash erase 25 | -i, --id=xx:xx:xx:xx:xx:xx:xx Specify protect ID 26 | -P, --port=PORT Specify serial port 27 | -a, --area=ORG,END Specify read area 28 | -r, --read Perform data read 29 | -s, --speed=SPEED Specify serial speed 30 | -v, --verify Perform data verify 31 | --device-list Display device list 32 | -V, --verbose Verbose output 33 | -w, --write Perform data write 34 | --progress display Progress output 35 | -h, --help Display this 36 | ``` 37 | R8C フラッシュメモリーのほぼ全ての機能を設定する事ができます。 38 | 39 | また、「r8c_prog.conf」ファイルを読み込む事で、標準的な設定や、デバイス 40 | 固有の設定を拡張して、色々なデバイスに対応可能です。 41 | 42 | --- 43 | ## オプションの詳細 44 | 45 | - --device 46 | 47 | 48 | --- 49 | 50 | License 51 | --- 52 | 53 | MIT 54 | -------------------------------------------------------------------------------- /TIMER_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C タイマー・メイン @n 4 | P1_0: LED @n 5 | P1_1: LED 6 | @author 平松邦仁 (hira@rvf-rc45.net) 7 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 8 | Released under the MIT license @n 9 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 10 | */ 11 | //=====================================================================// 12 | #include "common/renesas.hpp" 13 | 14 | #include "common/trb_io.hpp" 15 | 16 | namespace { 17 | 18 | typedef device::PORT LED0; 19 | typedef device::PORT LED1; 20 | 21 | volatile uint16_t trb_count_; 22 | 23 | /// タイマー割り込みで実行する動作の定義 24 | class trb_intr_task { 25 | public: 26 | void operator() () { 27 | ++trb_count_; 28 | } 29 | }; 30 | 31 | typedef device::trb_io TIMER_B; 32 | TIMER_B timer_b_; 33 | 34 | } 35 | 36 | 37 | extern "C" { 38 | 39 | void TIMER_RB_intr() 40 | { 41 | timer_b_.itask(); 42 | } 43 | 44 | } 45 | 46 | int main(int argc, char *argv[]) 47 | { 48 | using namespace device; 49 | 50 | // クロック関係レジスタ・プロテクト解除 51 | PRCR.PRC0 = 1; 52 | 53 | // 高速オンチップオシレーターへ切り替え(20MHz) 54 | // ※ F_CLK を設定する事(Makefile内) 55 | OCOCR.HOCOE = 1; 56 | utils::delay::micro_second(1); // >=30us(125KHz) 57 | SCKCR.HSCKSEL = 1; 58 | CKSTPR.SCKSEL = 1; 59 | 60 | // タイマーの設定 61 | { 62 | uint8_t intr_level = 1; 63 | uint16_t freq = 60; // 60Hz 64 | timer_b_.start(freq, intr_level); 65 | } 66 | 67 | // LED 設定 68 | { 69 | LED0::DIR = 1; 70 | LED1::DIR = 1; 71 | LED0::P = 0; 72 | LED1::P = 0; 73 | } 74 | 75 | // タイマー・メイン 76 | uint8_t cnt = 0; 77 | while(1) { 78 | timer_b_.sync(); 79 | if(cnt < 20) { 80 | LED0::P = 0; 81 | LED1::P = 1; 82 | } else { 83 | LED0::P = 1; 84 | LED1::P = 0; 85 | } 86 | ++cnt; 87 | if(cnt >= 60) cnt = 0; 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /COMP_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C メイン 4 | @author 平松邦仁 (hira@rvf-rc45.net) 5 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 6 | Released under the MIT license @n 7 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 8 | */ 9 | //=====================================================================// 10 | #include "common/renesas.hpp" 11 | 12 | #include "common/trb_io.hpp" 13 | #include "common/comp_io.hpp" 14 | 15 | namespace { 16 | 17 | typedef device::trb_io TIMER_B; 18 | TIMER_B timer_b_; 19 | 20 | typedef device::comp_io COMP; 21 | COMP comp_; 22 | 23 | } 24 | 25 | extern "C" { 26 | 27 | void COMP_B1_intr(void) 28 | { 29 | comp_.itask1(); 30 | } 31 | 32 | 33 | void COMP_B3_intr(void) 34 | { 35 | comp_.itask3(); 36 | } 37 | 38 | 39 | void TIMER_RB_intr(void) 40 | { 41 | timer_b_.itask(); 42 | } 43 | 44 | } 45 | 46 | int main(int argc, char *argv[]) 47 | { 48 | using namespace device; 49 | 50 | // クロック関係レジスタ・プロテクト解除 51 | PRCR.PRC0 = 1; 52 | 53 | // 高速オンチップオシレーターへ切り替え(20MHz) 54 | // ※ F_CLK を設定する事(Makefile内) 55 | OCOCR.HOCOE = 1; 56 | utils::delay::micro_second(1); // >=30us(125KHz) 57 | SCKCR.HSCKSEL = 1; 58 | CKSTPR.SCKSEL = 1; 59 | 60 | // 外部に出力 61 | // EXCKCR.CKPT = 2; 62 | 63 | // タイマー割り込み設定 64 | { 65 | uint8_t ir_lvl = 1; 66 | timer_b_.start(60, ir_lvl); 67 | } 68 | 69 | // コンパレーター3設定 70 | { 71 | comp_.start3(); 72 | utils::PORT_MAP(utils::port_map::P33::IVCMP3); 73 | utils::PORT_MAP(utils::port_map::P34::IVREF3); 74 | } 75 | 76 | // メイン 77 | PD1.B0 = 1; 78 | 79 | uint8_t n = 0; 80 | uint8_t c = 60; 81 | while(1) { 82 | timer_b_.sync(); 83 | if(n < (c / 3)) P1.B0 = 0; 84 | else P1.B0 = 1; 85 | if(comp_.get_value3()) { 86 | c = 60; 87 | } else { 88 | c = 30; 89 | } 90 | ++n; 91 | if(n >= c) n = 0; 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /pfatfs/src/00readme.txt: -------------------------------------------------------------------------------- 1 | Petit FatFs Module Source Files R0.03 (C)ChaN, 2014 2 | 3 | 4 | FILES 5 | 6 | pff.h Common include file for Petit FatFs and application module. 7 | pff.c Petit FatFs module. 8 | diskio.h Common include file for Petit FatFs and disk I/O module. 9 | diskio.c Skeleton of low level disk I/O module. 10 | integer.h Alternative type definitions for integer variables. 11 | 12 | Low level disk I/O module is not included in this archive because the Petit 13 | FatFs module is only a generic file system layer and not depend on any 14 | specific storage device. You have to provide a low level disk I/O module that 15 | written to control your storage device. 16 | 17 | 18 | 19 | AGREEMENTS 20 | 21 | Petit FatFs module is an open source software to implement FAT file system to 22 | small embedded systems. This is a free software and is opened for education, 23 | research and commercial developments under license policy of following trems. 24 | 25 | Copyright (C) 2014, ChaN, all right reserved. 26 | 27 | * The Petit FatFs module is a free software and there is NO WARRANTY. 28 | * No restriction on use. You can use, modify and redistribute it for 29 | personal, non-profit or commercial use UNDER YOUR RESPONSIBILITY. 30 | * Redistributions of source code must retain the above copyright notice. 31 | 32 | 33 | 34 | REVISION HISTORY 35 | 36 | Jun 15, 2009 R0.01a First release (Branched from FatFs R0.07b) 37 | 38 | Dec 14, 2009 R0.02 Added multiple code page support. 39 | Added write funciton. 40 | Changed stream read mode interface. 41 | Dec 07,'2010 R0.02a Added some configuration options. 42 | Fixed fails to open objects with DBCS character. 43 | 44 | Jun 10, 2014 R0.03 Separated out configuration options to pffconf.h. 45 | Added _USE_LCC option. 46 | Added _FS_FAT16 option. 47 | -------------------------------------------------------------------------------- /common/delay.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief delay ユーティリティー 5 | @author 平松邦仁 (hira@rvf-rc45.net) 6 | @copyright Copyright (C) 2015, 2017 Kunihito Hiramatsu @n 7 | Released under the MIT license @n 8 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 9 | */ 10 | //=====================================================================// 11 | #include 12 | 13 | namespace utils { 14 | 15 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 16 | /*! 17 | @brief 基準クロック20MHzの待ち 18 | */ 19 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 20 | struct delay { 21 | 22 | //-----------------------------------------------------------------// 23 | /*! 24 | @brief ナノ秒単位の待ち 25 | @param[in] ns 待ち時間(ナノ秒) 26 | */ 27 | //-----------------------------------------------------------------// 28 | static void nano_second(uint16_t ns) { 29 | ns /= 50; ///< 20MHz clock base 30 | while(ns > 0) { 31 | asm("nop"); 32 | --ns; 33 | } 34 | } 35 | 36 | 37 | //-----------------------------------------------------------------// 38 | /*! 39 | @brief マイクロ秒単位の待ち 40 | @param[in] us 待ち時間(マイクロ秒) 41 | */ 42 | //-----------------------------------------------------------------// 43 | static void micro_second(uint16_t us) { 44 | while(us > 0) { 45 | asm("nop"); 46 | asm("nop"); 47 | asm("nop"); 48 | asm("nop"); 49 | asm("nop"); 50 | asm("nop"); 51 | asm("nop"); 52 | asm("nop"); 53 | asm("nop"); 54 | asm("nop"); 55 | --us; 56 | } 57 | } 58 | 59 | 60 | //-----------------------------------------------------------------// 61 | /*! 62 | @brief ミリ秒単位の待ち 63 | @param[in] ms 待ち時間(ミリ秒) 64 | */ 65 | //-----------------------------------------------------------------// 66 | static void milli_second(uint16_t ms) { 67 | for(uint16_t i = 0; i < ms; ++i) { 68 | micro_second(1000); 69 | } 70 | } 71 | }; 72 | } 73 | -------------------------------------------------------------------------------- /USB_CHECKER/README.md: -------------------------------------------------------------------------------- 1 | USB 電流、電圧チェッカー 2 | ========= 3 | ![USB_Checker](USB_Checker.jpg) 4 | 5 | ## 概要、特徴 6 | 7 | ・100円マイコン、R8C/M120ANを使った、USB電圧、電流測定のガジェット 8 | ・回路的には、最大電圧20V程度まで対応可能 9 | ・ハードウェアー、ソフトウェアーを全て公開しているので、自分の欲しい機能を追加可能 10 | ※ケースに入れる為、フラッシュプログラム時の機能を別基板にしている 11 | 12 | ## R8C/M120AN について 13 | 14 | ・このマイコンは、メーカー発表とは異なる仕様になっており、非常に高機能です 15 | ※メーカー発表では、フラッシュ2Kバイト、ワークRAM256バイト 16 | ・実際には、*フラッシュ64Kバイト、ワークRAM1366バイト*を利用可能 17 | ・独自実装したフラッシュプログラマーで書き込む事で、隠し領域をプログラムできます 18 | ※「独自実装」と言っても、単に領域に制限を設けないだけで、プロトコルは、標準的なものを使っています 19 | ※「rxprog」を参照、Windows、OS-X、Linux で利用可能 20 | 21 | ## 標準的部品リスト 22 | 23 | (1) R8C/M120AN 24 | (2) LT6106(ハイサイド電流検出) 25 | (3) XC6202(3.3Vリニアレギュレーター) 26 | (4) 40ミリオーム抵抗(電流検出用) 27 | (5) AQM1248A-RN(128×48ピクセル、グラフィックス液晶) 28 | (6) NJU7032D(オペアンプ) 29 | (7) プッシュ・スイッチ2個 30 | (8) コンデンサ、抵抗など 31 | (9) CS75N(タカチ電機工業) 32 | ※ケースを除いて、秋月電子通商で入手可能、詳細は KiCAD ディレクトリー内の回路を参照の事。 33 | 34 | ## R8C/M120AN ポート利用表 35 | ・P4_2(1): LCD_SCK(SCL) 36 | ・P3_7(2): LCD_/CS 37 | ・/RES(3): (System reset) 38 | ・P4_7(4): LCD_/RES 39 | ・VSS:(5) (Power GND) 40 | ・P4_6(6): 41 | ・VCC(7): (Power +3.3V) 42 | ・MODE(8): (System mode) Flash program for 'L' 43 | ・P3_5(9): SW-A 44 | ・P3_4(10): SW-B 45 | ・P3_3(11): LCD_A0 46 | ・P4_5(12): LCD_SDA 47 | ・P1_7(13): 48 | ・P1_6(14): (System RXD) Flash program for 'RXD' 49 | ・P1_5(15): RXD0 50 | ・P1_4(16): TXD0 51 | ・P1_3(17): AN3 USB D+(+信号電圧測定) 52 | ・P1_2(18): AN2 USB D-(-信号電圧測定) 53 | ・P1_1(19): AN1 voltage sense (19.8V max) 54 | ・P1_0(20): AN0 current sense (1.2 V/A) 55 | 56 | ## 回路図 57 | 58 | ![USB_Checker](usb_checker.png) 59 | ※回路図プロジェクトは「KiCAD」ディレクトリーを参照 60 | 61 | ## 主な機能 62 | 63 | ・電流、電圧表示 64 | ・経過時間、積算電力表示(リセット可能) 65 | ・グラフ表示 66 | ・USB差動信号電圧の測定 67 | 68 | ## コンパイル済みバイナリーなど 69 | 70 | [ELF-file](usb_checker.elf) 71 | [MAP-file](usb_checker.map) 72 | [LIST-file](usb_checker.lst) 73 | [MOTOROLAR-file](usb_checker.mot) 74 | 75 | --- 76 | License 77 | 78 | MIT 79 | -------------------------------------------------------------------------------- /r8cprog/KiCAD/SerialModule.pro: -------------------------------------------------------------------------------- 1 | update=2015/06/07 4:09:05 2 | version=1 3 | last_client=eeschema 4 | [cvpcb] 5 | version=1 6 | NetIExt=net 7 | [cvpcb/libraries] 8 | EquName1=devcms 9 | [pcbnew] 10 | version=1 11 | LastNetListRead= 12 | UseCmpFile=1 13 | PadDrill=0.600000000000 14 | PadDrillOvalY=0.600000000000 15 | PadSizeH=1.500000000000 16 | PadSizeV=1.500000000000 17 | PcbTextSizeV=1.500000000000 18 | PcbTextSizeH=1.500000000000 19 | PcbTextThickness=0.300000000000 20 | ModuleTextSizeV=1.000000000000 21 | ModuleTextSizeH=1.000000000000 22 | ModuleTextSizeThickness=0.150000000000 23 | SolderMaskClearance=0.000000000000 24 | SolderMaskMinWidth=0.000000000000 25 | DrawSegmentWidth=0.200000000000 26 | BoardOutlineThickness=0.100000000000 27 | ModuleOutlineThickness=0.150000000000 28 | [pcbnew/libraries] 29 | LibDir= 30 | LibName1=sockets 31 | LibName2=connect 32 | LibName3=discret 33 | LibName4=pin_array 34 | LibName5=divers 35 | LibName6=smd_capacitors 36 | LibName7=smd_resistors 37 | LibName8=smd_crystal&oscillator 38 | LibName9=smd_dil 39 | LibName10=smd_transistors 40 | LibName11=libcms 41 | LibName12=display 42 | LibName13=led 43 | LibName14=dip_sockets 44 | LibName15=pga_sockets 45 | LibName16=valves 46 | [general] 47 | version=1 48 | [eeschema] 49 | version=1 50 | LibDir= 51 | NetFmtName= 52 | RptD_X=0 53 | RptD_Y=100 54 | RptLab=1 55 | LabSize=60 56 | [eeschema/libraries] 57 | LibName1=power 58 | LibName2=akizuki 59 | LibName3=device 60 | LibName4=transistors 61 | LibName5=conn 62 | LibName6=linear 63 | LibName7=regul 64 | LibName8=74xx 65 | LibName9=cmos4000 66 | LibName10=adc-dac 67 | LibName11=memory 68 | LibName12=xilinx 69 | LibName13=special 70 | LibName14=microcontrollers 71 | LibName15=dsp 72 | LibName16=microchip 73 | LibName17=analog_switches 74 | LibName18=motorola 75 | LibName19=texas 76 | LibName20=intel 77 | LibName21=audio 78 | LibName22=interface 79 | LibName23=digital-audio 80 | LibName24=philips 81 | LibName25=display 82 | LibName26=cypress 83 | LibName27=siliconi 84 | LibName28=opto 85 | LibName29=atmel 86 | LibName30=contrib 87 | LibName31=valves 88 | LibName32=ftdi 89 | LibName33=renesas 90 | -------------------------------------------------------------------------------- /SD_sample/KiCAD/sd_card_base.pro: -------------------------------------------------------------------------------- 1 | update=2015/06/22 22:28:16 2 | version=1 3 | last_client=eeschema 4 | [cvpcb] 5 | version=1 6 | NetIExt=net 7 | [cvpcb/libraries] 8 | EquName1=devcms 9 | [pcbnew] 10 | version=1 11 | LastNetListRead= 12 | UseCmpFile=1 13 | PadDrill=0.600000000000 14 | PadDrillOvalY=0.600000000000 15 | PadSizeH=1.500000000000 16 | PadSizeV=1.500000000000 17 | PcbTextSizeV=1.500000000000 18 | PcbTextSizeH=1.500000000000 19 | PcbTextThickness=0.300000000000 20 | ModuleTextSizeV=1.000000000000 21 | ModuleTextSizeH=1.000000000000 22 | ModuleTextSizeThickness=0.150000000000 23 | SolderMaskClearance=0.000000000000 24 | SolderMaskMinWidth=0.000000000000 25 | DrawSegmentWidth=0.200000000000 26 | BoardOutlineThickness=0.100000000000 27 | ModuleOutlineThickness=0.150000000000 28 | [pcbnew/libraries] 29 | LibDir= 30 | LibName1=sockets 31 | LibName2=connect 32 | LibName3=discret 33 | LibName4=pin_array 34 | LibName5=divers 35 | LibName6=smd_capacitors 36 | LibName7=smd_resistors 37 | LibName8=smd_crystal&oscillator 38 | LibName9=smd_dil 39 | LibName10=smd_transistors 40 | LibName11=libcms 41 | LibName12=display 42 | LibName13=led 43 | LibName14=dip_sockets 44 | LibName15=pga_sockets 45 | LibName16=valves 46 | [general] 47 | version=1 48 | [eeschema] 49 | version=1 50 | LibDir=../../KiCAD_lib 51 | NetFmtName= 52 | RptD_X=0 53 | RptD_Y=100 54 | RptLab=1 55 | LabSize=60 56 | [eeschema/libraries] 57 | LibName1=power 58 | LibName2=device 59 | LibName3=transistors 60 | LibName4=conn 61 | LibName5=linear 62 | LibName6=regul 63 | LibName7=74xx 64 | LibName8=cmos4000 65 | LibName9=adc-dac 66 | LibName10=memory 67 | LibName11=xilinx 68 | LibName12=special 69 | LibName13=microcontrollers 70 | LibName14=dsp 71 | LibName15=microchip 72 | LibName16=analog_switches 73 | LibName17=motorola 74 | LibName18=texas 75 | LibName19=intel 76 | LibName20=audio 77 | LibName21=interface 78 | LibName22=digital-audio 79 | LibName23=philips 80 | LibName24=display 81 | LibName25=cypress 82 | LibName26=siliconi 83 | LibName27=opto 84 | LibName28=atmel 85 | LibName29=contrib 86 | LibName30=valves 87 | LibName31=akizuki 88 | LibName32=ftdi 89 | LibName33=renesas 90 | -------------------------------------------------------------------------------- /common/init.c: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C 起動前初期化 4 | @author 平松邦仁 (hira@rvf-rc45.net) 5 | @copyright Copyright (C) 2015, 2017 Kunihito Hiramatsu @n 6 | Released under the MIT license @n 7 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 8 | */ 9 | //=====================================================================// 10 | #include 11 | #include "common/init.h" 12 | 13 | int main(int argc, char**argv); 14 | 15 | extern short _datainternal; 16 | extern short _datastart; 17 | extern short _dataend; 18 | 19 | extern short _bssstart; 20 | extern short _bssend; 21 | 22 | extern short _preinit_array_start; 23 | extern short _preinit_array_end; 24 | extern short _init_array_start; 25 | extern short _init_array_end; 26 | extern short _fini_array_start; 27 | extern short _fini_array_end; 28 | 29 | //-----------------------------------------------------------------// 30 | /*! 31 | @brief メイン関数起動前初期化 32 | */ 33 | //-----------------------------------------------------------------// 34 | void _init(void) 35 | { 36 | { // R/W-data セクションのコピー 37 | short *src = &_datainternal; 38 | short *dst = &_datastart; 39 | while(dst < &_dataend) { 40 | *dst++ = *src++; 41 | } 42 | } 43 | 44 | { // bss セクションのクリア 45 | short *dst = &_bssstart; 46 | while(dst < &_bssend) { 47 | *dst++ = 0; 48 | } 49 | } 50 | 51 | { // C++ 静的コンストラクターの実行 52 | short *p = &_fini_array_start; 53 | while(p < &_fini_array_end) { 54 | void (*prog)(void) = (void *)*p++; 55 | (*prog)(); 56 | } 57 | } 58 | 59 | { // C++ 事前静的コンストラクターの実行 60 | short *p = &_preinit_array_start; 61 | while(p < &_preinit_array_end) { 62 | void (*prog)(void) = (void *)*p++; 63 | (*prog)(); 64 | } 65 | } 66 | 67 | { // C++ 静的コンストラクターの実行 68 | short *p = &_init_array_start; 69 | while(p < &_init_array_end) { 70 | void (*prog)(void) = (void *)*p++; 71 | (*prog)(); 72 | } 73 | } 74 | 75 | // main の起動 76 | static int argc = 0; 77 | static char **argv = 0; 78 | int ret = main(argc, argv); 79 | exit(0); 80 | } 81 | 82 | // EOF 83 | -------------------------------------------------------------------------------- /chip/ADNS2051.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief ADNS2051 class @n 5 | Agilent ADNS-2051 @n 6 | Optical Mouse Sensor @n 7 | Interface: Maybe SPI, Vcc: 5V @n 8 | @author 平松邦仁 (hira@rvf-rc45.net) 9 | @copyright Copyright (C) 2019 Kunihito Hiramatsu @n 10 | Released under the MIT license @n 11 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 12 | */ 13 | //=====================================================================// 14 | #include 15 | #include "common/delay.hpp" 16 | 17 | namespace chip { 18 | 19 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 20 | /*! 21 | @brief ADNS2051 テンプレートクラス 22 | @param[in] SDIO ポート・クラス 23 | @param[in] SCLK ポート・クラス 24 | @param[in] PD ポート・クラス 25 | */ 26 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 27 | template 28 | class ADNS2051 { 29 | 30 | #if 0 31 | void write_byte_(uint8_t d) { 32 | for(uint8_t i = 0; i < 8; ++i) { 33 | D7::P = d & 1; 34 | d >>= 1; 35 | W_CLK::P = 1; 36 | utils::delay::micro_second(1); 37 | W_CLK::P = 0; 38 | utils::delay::micro_second(1); 39 | } 40 | } 41 | #endif 42 | 43 | public: 44 | //-----------------------------------------------------------------// 45 | /*! 46 | @brief コンストラクタ 47 | */ 48 | //-----------------------------------------------------------------// 49 | ADNS2051() noexcept 50 | { } 51 | 52 | 53 | //-----------------------------------------------------------------// 54 | /*! 55 | @brief 開始 56 | */ 57 | //-----------------------------------------------------------------// 58 | void start() 59 | { 60 | SDIO::DIR = 0; 61 | SCLK::DIR = 1; 62 | PD::DIR = 1; 63 | } 64 | 65 | 66 | //-----------------------------------------------------------------// 67 | /*! 68 | @brief 変化量を取得 69 | */ 70 | //-----------------------------------------------------------------// 71 | void get() noexcept 72 | { 73 | 74 | } 75 | }; 76 | } 77 | -------------------------------------------------------------------------------- /chip/RX_MOD.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief RX_MOD ドライバー @n 5 | ※「TX_MOD.hpp」とペア 6 | @author 平松邦仁 (hira@rvf-rc45.net) 7 | @copyright Copyright (C) 2017 Kunihito Hiramatsu @n 8 | Released under the MIT license @n 9 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 10 | */ 11 | //=====================================================================// 12 | #include 13 | 14 | namespace chip { 15 | 16 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 17 | /*! 18 | @brief 受信データ変調 テンプレートクラス 19 | @param[in] PORT 受信ポートクラス 20 | @param[in] HNUM ヘッダー・フレーム数(標準4) 21 | @param[in] SNUM 転送最大数 22 | */ 23 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 24 | template 25 | class RX_MOD { 26 | 27 | volatile uint8_t head_; 28 | volatile uint8_t sync_; 29 | volatile uint8_t len_; 30 | uint8_t dat_; 31 | volatile uint8_t bit_pos_; 32 | 33 | uint8_t buff_[SNUM]; 34 | 35 | public: 36 | //-----------------------------------------------------------------// 37 | /*! 38 | @brief コンストラクター 39 | */ 40 | //-----------------------------------------------------------------// 41 | RX_MOD() noexcept : head_(0), sync_(0), len_(0), dat_(0), bit_pos_(0) { } 42 | 43 | 44 | //-----------------------------------------------------------------// 45 | /*! 46 | @brief 開始 47 | */ 48 | //-----------------------------------------------------------------// 49 | void start() noexcept 50 | { 51 | PORT::DIR = 0; // input 52 | len_ = 0; 53 | head_ = 0; 54 | sync_ = 0; 55 | bit_pos_ = 0; 56 | } 57 | 58 | 59 | //-----------------------------------------------------------------// 60 | /*! 61 | @brief 転送状態を取得 62 | @return 転送中なら「true」 63 | */ 64 | //-----------------------------------------------------------------// 65 | bool probe() const noexcept { return len_ > 0; } 66 | 67 | 68 | //-----------------------------------------------------------------// 69 | /*! 70 | @brief サービス @n 71 | 正確なタイマー割り込みで起動されるタスク 72 | */ 73 | //-----------------------------------------------------------------// 74 | void service() noexcept 75 | { 76 | 77 | 78 | 79 | } 80 | }; 81 | } 82 | -------------------------------------------------------------------------------- /M120AN/comp.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief R8C/M110AN, R8C/M120AN グループ・コンパレーターレジスタ定義 5 | @author 平松邦仁 (hira@rvf-rc45.net) 6 | @copyright Copyright (C) 2015, 2017 Kunihito Hiramatsu @n 7 | Released under the MIT license @n 8 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 9 | */ 10 | //=====================================================================// 11 | #include "common/io_utils.hpp" 12 | 13 | namespace device { 14 | 15 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 16 | /*! 17 | @brief コンパレーター制御レジスタ WCMPR 18 | */ 19 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 20 | struct wcmpr_t : public rw8_t<0x0180> { 21 | typedef rw8_t<0x0180> io_; 22 | using io_::operator =; 23 | using io_::operator (); 24 | using io_::operator |=; 25 | using io_::operator &=; 26 | 27 | bit_rw_t WCB1M0; 28 | bit_rw_t WCB1OUT; 29 | bit_rw_t WCB3M0; 30 | bit_rw_t WCB3OUT; 31 | }; 32 | static wcmpr_t WCMPR; 33 | 34 | 35 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 36 | /*! 37 | @brief コンパレーター B1 割り込み制御レジスタ WCB1INTR 38 | */ 39 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 40 | struct wcb1intr_t : public rw8_t<0x0181> { 41 | typedef rw8_t<0x0181> io_; 42 | using io_::operator =; 43 | using io_::operator (); 44 | using io_::operator |=; 45 | using io_::operator &=; 46 | 47 | bits_rw_t WCB1FL; 48 | bits_rw_t WCB1S; 49 | bit_rw_t WCB1INTEN; 50 | bit_rw_t WCB1F; 51 | }; 52 | static wcb1intr_t WCB1INTR; 53 | 54 | 55 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 56 | /*! 57 | @brief コンパレーター B3 割り込み制御レジスタ WCB3INTR 58 | */ 59 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 60 | struct wcb3intr_t : public rw8_t<0x0182> { 61 | typedef rw8_t<0x0182> io_; 62 | using io_::operator =; 63 | using io_::operator (); 64 | using io_::operator |=; 65 | using io_::operator &=; 66 | 67 | bits_rw_t WCB3FL; 68 | bits_rw_t WCB3S; 69 | bit_rw_t WCB3INTEN; 70 | bit_rw_t WCB3F; 71 | }; 72 | static wcb3intr_t WCB3INTR; 73 | 74 | } 75 | -------------------------------------------------------------------------------- /common/bitset.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief 縮小ビットセット・テンプレート 5 | @author 平松邦仁 (hira@rvf-rc45.net) 6 | */ 7 | //=====================================================================// 8 | #include 9 | 10 | namespace utils { 11 | 12 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 13 | /*! 14 | @brief 縮小ビットセット・テンプレート 15 | @param[in] T 基本型 16 | @param[in] R ビット位置型(enum class) 17 | */ 18 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 19 | template 20 | class bitset { 21 | T bits_; 22 | 23 | public: 24 | typedef T value_type; ///< 基本型 25 | typedef R index_type; ///< ビット位置型 26 | 27 | //-----------------------------------------------------------------// 28 | /*! 29 | @brief コンストラクター 30 | */ 31 | //-----------------------------------------------------------------// 32 | bitset() : bits_(0) { } 33 | 34 | 35 | //-----------------------------------------------------------------// 36 | /*! 37 | @brief 全てクリア(リセット) 38 | */ 39 | //-----------------------------------------------------------------// 40 | void clear() { bits_ = 0; } 41 | 42 | 43 | //-----------------------------------------------------------------// 44 | /*! 45 | @brief セット 46 | @param[in] type ビット位置 47 | */ 48 | //-----------------------------------------------------------------// 49 | void set(R type) { bits_ |= 1 << static_cast(type); } 50 | 51 | 52 | //-----------------------------------------------------------------// 53 | /*! 54 | @brief リセット 55 | @param[in] type ビット位置 56 | */ 57 | //-----------------------------------------------------------------// 58 | void reset(R type) { bits_ &= ~(1 << static_cast(type)); } 59 | 60 | 61 | //-----------------------------------------------------------------// 62 | /*! 63 | @brief 取得 64 | @param[in] type ビット位置 65 | @return ビット位置の値 66 | */ 67 | //-----------------------------------------------------------------// 68 | bool get(R type) const { 69 | return (bits_ & (1 << static_cast(type))) != 0 ? true : false; 70 | } 71 | 72 | 73 | //-----------------------------------------------------------------// 74 | /*! 75 | @brief 全体を取得 76 | @return 全体値 77 | */ 78 | //-----------------------------------------------------------------// 79 | T operator() () const { return bits_; } 80 | }; 81 | } 82 | -------------------------------------------------------------------------------- /USB_CHECKER/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C USB チェッカー・メイン @n 4 | for ST7567 SPI @n 5 | LCD: AQM1284A-RN (128x48) Akizuki 6 | @author 平松邦仁 (hira@rvf-rc45.net) 7 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 8 | Released under the MIT license @n 9 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 10 | */ 11 | //=====================================================================// 12 | #include "common/renesas.hpp" 13 | 14 | // #include "bitmap/font32.h" 15 | 16 | #include "checker.hpp" 17 | 18 | // ポートの配置 19 | // P4_2(1): LCD_SCK(SCL) 20 | // P3_7(2): LCD_/CS 21 | // /RES(3): (System reset) 22 | // P4_7(4): LCD_/RES 23 | // VSS:(5) (Power GND) 24 | // P4_6(6): 25 | // VCC(7): (Power +3.3V) 26 | // MODE(8): (System mode) Flash program for 'L' 27 | // P3_5(9): SW-A 28 | // P3_4(10): SW-B 29 | // P3_3(11): LCD_A0 30 | // P4_5(12): LCD_SDA 31 | // P1_7(13): 32 | // P1_6(14): (System RXD) Flash program for 'RXD' 33 | // P1_5(15): RXD0 34 | // P1_4(16): TXD0 35 | // P1_3(17): AN3 36 | // P1_2(18): AN2 37 | // P1_1(19): AN1 voltage sense (19.8V max) 38 | // P1_0(20): AN0 current sense (1.2 V/A) 39 | 40 | namespace { 41 | app::checker checker_; 42 | } 43 | 44 | extern "C" { 45 | 46 | void sci_putch(char ch) { 47 | #ifdef UART 48 | checker_.uart_.putch(ch); 49 | #endif 50 | } 51 | 52 | 53 | char sci_getch(void) { 54 | #ifdef UART 55 | return checker_.uart_.getch(); 56 | #else 57 | return 0; 58 | #endif 59 | } 60 | 61 | 62 | #if 0 63 | uint16_t sci_length() { 64 | return checker_.uart_.length(); 65 | } 66 | 67 | void sci_puts(const char* str) { 68 | checker_.uart_.puts(str); 69 | } 70 | #endif 71 | 72 | 73 | void TIMER_RB_intr(void) { 74 | checker_.timer_b_.itask(); 75 | } 76 | 77 | 78 | #ifdef UART 79 | void UART0_TX_intr(void) { 80 | checker_.uart_.isend(); 81 | } 82 | 83 | 84 | void UART0_RX_intr(void) { 85 | checker_.uart_.irecv(); 86 | } 87 | #endif 88 | } 89 | 90 | // __attribute__ ((section (".exttext"))) 91 | int main(int argc, char *argv[]) 92 | { 93 | using namespace device; 94 | 95 | // クロック関係レジスタ・プロテクト解除 96 | PRCR.PRC0 = 1; 97 | 98 | // 高速オンチップオシレーターへ切り替え(20MHz) 99 | // ※ F_CLK を設定する事(Makefile内) 100 | OCOCR.HOCOE = 1; 101 | utils::delay::micro_second(1); // >=30uS(125KHz) 102 | SCKCR.HSCKSEL = 1; 103 | CKSTPR.SCKSEL = 1; 104 | 105 | PRCR.PRC0 = 0; 106 | 107 | checker_.init(); 108 | 109 | while(1) { 110 | checker_.service(); 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /common/font6x12.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief 6×12フォント・クラス 5 | @author 平松邦仁 (hira@rvf-rc45.net) 6 | @copyright Copyright (C) 2016, 2017 Kunihito Hiramatsu @n 7 | Released under the MIT license @n 8 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 9 | */ 10 | //=====================================================================// 11 | #include 12 | 13 | namespace graphics { 14 | 15 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 16 | /*! 17 | @brief フォント・クラス 18 | */ 19 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 20 | class font6x12 { 21 | static const uint8_t bitmap_[]; 22 | static const int8_t width_tbl_[]; 23 | 24 | public: 25 | //-----------------------------------------------------------------// 26 | /*! 27 | @brief 文字の横幅 28 | */ 29 | //-----------------------------------------------------------------// 30 | static const int8_t WIDTH = 6; 31 | 32 | 33 | //-----------------------------------------------------------------// 34 | /*! 35 | @brief 文字の高さ 36 | */ 37 | //-----------------------------------------------------------------// 38 | static const int8_t HEIGHT = 12; 39 | 40 | 41 | //-----------------------------------------------------------------// 42 | /*! 43 | @brief 文字のビットマップを取得 44 | @param[in] code 文字コード 45 | @return 文字のビットマップ 46 | */ 47 | //-----------------------------------------------------------------// 48 | static const uint8_t* get(uint8_t code) 49 | { 50 | return &bitmap_[(static_cast(code) << 3) + static_cast(code)]; 51 | } 52 | 53 | 54 | //-----------------------------------------------------------------// 55 | /*! 56 | @brief プロポーショナル・フォント幅を取得 57 | @param[in] code 文字コード 58 | @return 文字幅 59 | */ 60 | //-----------------------------------------------------------------// 61 | static int8_t get_width(uint8_t code) 62 | { 63 | if(code < 32 || code >= 128) return WIDTH; 64 | else return width_tbl_[code - 32]; 65 | } 66 | 67 | 68 | //-----------------------------------------------------------------// 69 | /*! 70 | @brief カーニングを取得 71 | @param[in] code 文字コード 72 | @return 文字幅 73 | */ 74 | //-----------------------------------------------------------------// 75 | static int8_t get_kern(uint8_t code) 76 | { 77 | switch(code) { 78 | case '!': 79 | case '|': 80 | case 'i': 81 | case 'l': 82 | return -1; 83 | } 84 | return 0; 85 | } 86 | }; 87 | } 88 | -------------------------------------------------------------------------------- /r8cprog/KiCAD/akizuki.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 Date: 2015/06/11 8:30:45 2 | # 3 | $CMP 2N7002K 4 | D N Channel MOSFET 5 | K MOSFET 6 | $ENDCMP 7 | # 8 | $CMP 2P-SW 9 | D Single, 2P Push Switch 10 | $ENDCMP 11 | # 12 | $CMP 3P-SW 13 | D Single, 3P Slide Switch 14 | $ENDCMP 15 | # 16 | $CMP ADM3202 17 | D ANALOG DEVICES +3.3 to 5.5V Line Driver Reciver 18 | K ADM3202 19 | $ENDCMP 20 | # 21 | $CMP C 22 | D Capcitor 23 | K C CAP 24 | $ENDCMP 25 | # 26 | $CMP C-POL 27 | D 無極性コンデンサ 28 | K C CAP POL 29 | $ENDCMP 30 | # 31 | $CMP CAP 32 | D 無極性コンデンサ 33 | K C CAP 34 | $ENDCMP 35 | # 36 | $CMP CP 37 | D Polymer Capacitor 38 | K C CAP POL 39 | $ENDCMP 40 | # 41 | $CMP CRYSTAL 42 | D Crystal 43 | K XTAL 44 | $ENDCMP 45 | # 46 | $CMP DIODE 47 | D Diode 48 | K D 49 | $ENDCMP 50 | # 51 | $CMP FDS4675 52 | D FAIRCHILD 40V P-Chanel PowerTrench MOSFET (-11A) 53 | K FDS4675 54 | $ENDCMP 55 | # 56 | $CMP FDS5680 57 | D FAIRCHILD 60V N-Chanle Power Trench MOSFET (8A) 58 | K FDS5680 59 | $ENDCMP 60 | # 61 | $CMP FDS6612A 62 | D FAIRCHILD N-Chanle Power Trench MOSFET (8.4A, 30V) 63 | K FDS5612 64 | $ENDCMP 65 | # 66 | $CMP HT7750A 67 | D HOLTEC PFM Step-up DC/DC Converter 68 | K HT7750A HT7733A 69 | $ENDCMP 70 | # 71 | $CMP IR2104 72 | D HALF-BRIDGE DRIVER (600V, IO+-130mA/270mA, 10 to 20V) 73 | K IR 74 | $ENDCMP 75 | # 76 | $CMP L 77 | D Register 78 | K R 79 | $ENDCMP 80 | # 81 | $CMP LM336 82 | D Reference Diode 83 | $ENDCMP 84 | # 85 | $CMP MCP3204 86 | D MICROCHIP 12bit 4Chanel A/D Converter (2.7V to 5.5V) 87 | K MCP3204 88 | $ENDCMP 89 | # 90 | $CMP MCP3208 91 | D Microchip Tecnorogy 2.7V to 5.5V 8chanels 12bits A/D Converter 92 | K MCP3208 93 | $ENDCMP 94 | # 95 | $CMP MCP4922 96 | D MICROCHIP 12-Bit DAC with SPI Interface (2.7V to 5.5V) 97 | K MCP4922 98 | $ENDCMP 99 | # 100 | $CMP NJU7223DL1-33 101 | D JRC Regulator 3.3V 500mA 102 | K NJU7223 103 | $ENDCMP 104 | # 105 | $CMP R 106 | D Register 107 | K R 108 | $ENDCMP 109 | # 110 | $CMP RS 111 | D Register 112 | K R 113 | $ENDCMP 114 | # 115 | $CMP RSS100N03 116 | D ROHM N-Chanle Power MOSFET (10A, 30V) 117 | K ROHM,MOSFET 118 | $ENDCMP 119 | # 120 | $CMP RTC4543SA 121 | D SEIKO Real Time Clock, 2.5V to 5.5V, With 32.768KHz XTAL and OSC 122 | K RTC 123 | $ENDCMP 124 | # 125 | $CMP SG12864A 126 | D 128 dots by 64 dots monocolor graphics LCD 127 | K SG12864A 128 | $ENDCMP 129 | # 130 | $CMP SHOTKEY 131 | D Shotkey Diode 132 | K D 133 | $ENDCMP 134 | # 135 | $CMP TLP222A 136 | D TOSHIBA Photocoupler Photorelay 137 | K TLP 138 | $ENDCMP 139 | # 140 | $CMP VS1011E-SO 141 | D VLSI SOLUTION Decoder MPEG 1.0 & 2.0 audio layer I,II,III,WAV,ADPCM 142 | K VS1011e 143 | $ENDCMP 144 | # 145 | #End Doc Library 146 | -------------------------------------------------------------------------------- /chip/MAX6675.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief MAX6675 クラス @n 5 | Cold-Junction-Compensated @n 6 | K-Thermocouple to Digital Converter 0℃ to 1024℃ @n 7 | Vcc: 3.3V、5.0V 8 | @author 平松邦仁 (hira@rvf-rc45.net) 9 | @copyright Copyright (C) 2017 Kunihito Hiramatsu @n 10 | Released under the MIT license @n 11 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 12 | */ 13 | //=====================================================================// 14 | #include 15 | 16 | namespace chip { 17 | 18 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 19 | /*! 20 | @brief MAX6675 テンプレートクラス 21 | @param[in] SPI spi クラス 22 | @param[in] SEL デバイス・セレクト 23 | */ 24 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 25 | template 26 | class MAX6675 { 27 | 28 | SPI& spi_; 29 | 30 | public: 31 | //-----------------------------------------------------------------// 32 | /*! 33 | @brief コンストラクタ 34 | */ 35 | //-----------------------------------------------------------------// 36 | MAX6675(SPI& spi) noexcept : spi_(spi) { } 37 | 38 | 39 | //-----------------------------------------------------------------// 40 | /*! 41 | @brief 開始 42 | */ 43 | //-----------------------------------------------------------------// 44 | void start() noexcept 45 | { 46 | SEL::DIR = 1; 47 | SEL::P = 1; 48 | } 49 | 50 | 51 | //-----------------------------------------------------------------// 52 | /*! 53 | @brief 値取得 54 | @return 値、変換温度 (0 to 4095) 0.25℃ (0℃ to 1024℃) 55 | */ 56 | //-----------------------------------------------------------------// 57 | uint16_t get() noexcept 58 | { 59 | SEL::P = 0; 60 | // delay 100ns 61 | utils::delay::nano_second(100); 62 | uint8_t tmp[2]; 63 | spi_.recv(tmp, 2); 64 | uint16_t v = (static_cast(tmp[0]) << 5) | (static_cast(tmp[1]) >> 3); 65 | SEL::P = 1; 66 | return v; 67 | } 68 | 69 | 70 | //-----------------------------------------------------------------// 71 | /*! 72 | @brief 温度取得 73 | @return 温度 74 | */ 75 | //-----------------------------------------------------------------// 76 | float get_temp() noexcept 77 | { 78 | return static_cast(get()) * 0.25f; 79 | } 80 | 81 | 82 | //-----------------------------------------------------------------// 83 | /*! 84 | @brief () オペレーター 85 | @return 変換温度 (0 to 4095) 0.25℃ (0℃ to 1024℃) 86 | */ 87 | //-----------------------------------------------------------------// 88 | uint16_t operator () () 89 | { 90 | return get(); 91 | } 92 | }; 93 | } 94 | -------------------------------------------------------------------------------- /CANON_IR/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C Canon IR remocon 4 | @author 平松邦仁 (hira@rvf-rc45.net) 5 | @copyright Copyright (C) 2018, 2021 Kunihito Hiramatsu @n 6 | Released under the MIT license @n 7 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 8 | */ 9 | //=====================================================================// 10 | #include "common/renesas.hpp" 11 | 12 | #include "common/fifo.hpp" 13 | #include "common/uart_io.hpp" 14 | #include "common/trb_io.hpp" 15 | #include "common/command.hpp" 16 | #include "common/format.hpp" 17 | 18 | namespace { 19 | 20 | typedef device::trb_io timer_b; 21 | timer_b timer_b_; 22 | 23 | typedef utils::fifo buffer; 24 | typedef device::uart_io uart; 25 | uart uart_; 26 | 27 | utils::command<64> command_; 28 | } 29 | 30 | extern "C" { 31 | 32 | void sci_putch(char ch) { 33 | uart_.putch(ch); 34 | } 35 | 36 | 37 | char sci_getch(void) { 38 | return uart_.getch(); 39 | } 40 | 41 | 42 | uint16_t sci_length() { 43 | return uart_.length(); 44 | } 45 | 46 | 47 | void sci_puts(const char* str) { 48 | uart_.puts(str); 49 | } 50 | 51 | 52 | void TIMER_RB_intr(void) { 53 | timer_b_.itask(); 54 | } 55 | 56 | 57 | void UART0_TX_intr(void) { 58 | uart_.isend(); 59 | } 60 | 61 | 62 | void UART0_RX_intr(void) { 63 | uart_.irecv(); 64 | } 65 | } 66 | 67 | 68 | //__attribute__ ((section (".exttext"))) 69 | int main(int argc, char *argv[]) 70 | { 71 | using namespace device; 72 | 73 | // クロック関係レジスタ・プロテクト解除 74 | PRCR.PRC0 = 1; 75 | 76 | // 高速オンチップオシレーターへ切り替え(20MHz) 77 | // ※ F_CLK を設定する事(Makefile内) 78 | OCOCR.HOCOE = 1; 79 | utils::delay::micro_second(1); // >=30us(125KHz) 80 | SCKCR.HSCKSEL = 1; 81 | CKSTPR.SCKSEL = 1; 82 | 83 | // タイマーB初期化 84 | { 85 | uint8_t ir_level = 2; 86 | timer_b_.start(60, ir_level); 87 | } 88 | 89 | // UART の設定 (P1_4: TXD0[out], P1_5: RXD0[in]) 90 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 91 | { 92 | utils::PORT_MAP(utils::port_map::P14::TXD0); 93 | utils::PORT_MAP(utils::port_map::P15::RXD0); 94 | uint8_t ir_level = 1; 95 | uart_.start(57600, ir_level); 96 | } 97 | 98 | utils::format("Start R8C Canon IR\n"); 99 | command_.set_prompt("# "); 100 | 101 | while(1) { 102 | timer_b_.sync(); 103 | 104 | // コマンド入力と、コマンド解析 105 | if(command_.service()) { 106 | bool error = false; 107 | char emsg[16]; 108 | emsg[0] = 0; 109 | uint8_t cmdn = command_.get_words(); 110 | if(cmdn >= 1) { 111 | if(command_.cmp_word(0, "help")) { 112 | 113 | } else { 114 | command_.get_word(0, sizeof(emsg), emsg); 115 | error = true; 116 | } 117 | if(error) { 118 | utils::format("Command error: '%s'\n") % emsg; 119 | } 120 | } 121 | } 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /M120AN/watchdog.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief R8C/M110AN, R8C/M120AN グループ・ウォッチドッグ・レジスター定義 5 | @author 平松邦仁 (hira@rvf-rc45.net) 6 | @copyright Copyright (C) 2014, 2017 Kunihito Hiramatsu @n 7 | Released under the MIT license @n 8 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 9 | */ 10 | //=====================================================================// 11 | #include "common/io_utils.hpp" 12 | 13 | namespace device { 14 | 15 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 16 | /*! 17 | @brief ウォッチドッグタイマ機能レジスタ RISR 18 | */ 19 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 20 | struct risr_t : public rw8_t<0x0030> { 21 | typedef rw8_t<0x0030> io_; 22 | using io_::operator =; 23 | using io_::operator (); 24 | using io_::operator |=; 25 | using io_::operator &=; 26 | 27 | bit_rw_t UFIF; 28 | bit_rw_t RIS; 29 | }; 30 | static risr_t RISR; 31 | 32 | 33 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 34 | /*! 35 | @brief ウォッチドッグタイマリセットレジスタ WDTR 36 | */ 37 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 38 | static wo8_t<0x0031> WDTR; 39 | 40 | 41 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 42 | /*! 43 | @brief ウォッチドッグタイマスタートレジスタ WDTS 44 | */ 45 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 46 | static wo8_t<0x0032> WDTS; 47 | 48 | 49 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 50 | /*! 51 | @brief ウォッチドッグタイマ制御レジスタ WDTC 52 | */ 53 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 54 | struct wdtc_t : public rw8_t<0x0033> { 55 | typedef rw8_t<0x0033> io_; 56 | using io_::operator =; 57 | using io_::operator (); 58 | using io_::operator |=; 59 | using io_::operator &=; 60 | 61 | bit_rw_t WDTC6; 62 | bit_rw_t WDTC7; 63 | }; 64 | static wdtc_t WDTC; 65 | 66 | 67 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 68 | /*! 69 | @brief カウントソース保護モードレジスタ CSPR 70 | */ 71 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 72 | struct cspr_t : public rw8_t<0x0034> { 73 | typedef rw8_t<0x0034> io_; 74 | using io_::operator =; 75 | using io_::operator (); 76 | using io_::operator |=; 77 | using io_::operator &=; 78 | 79 | bit_rw_t CSPRO; 80 | }; 81 | static cspr_t CSPR; 82 | 83 | 84 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 85 | /*! 86 | @brief 周期タイマ割り込み制御レジスタ WDTIR 87 | */ 88 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 89 | struct wdtir_t : public rw8_t<0x0035> { 90 | typedef rw8_t<0x0035> io_; 91 | using io_::operator =; 92 | using io_::operator (); 93 | using io_::operator |=; 94 | using io_::operator &=; 95 | 96 | bit_rw_t WDTIF; 97 | bit_rw_t WDTIE; 98 | }; 99 | static wdtir_t WDTIR; 100 | 101 | } 102 | -------------------------------------------------------------------------------- /chip/DS1371.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief DS1371 RTC ドライバー 5 | @author 平松邦仁 (hira@rvf-rc45.net) 6 | */ 7 | //=====================================================================// 8 | #include 9 | #include "common/iica_io.hpp" 10 | #include "common/time.h" 11 | 12 | namespace chip { 13 | 14 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 15 | /*! 16 | @brief DS1371 テンプレートクラス 17 | @param[in] I2C_IO I2C クラス 18 | */ 19 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 20 | template 21 | class DS1371 { 22 | 23 | static const uint8_t DS1371_ADR_ = 0x68; 24 | 25 | I2C_IO& i2c_; 26 | 27 | bool get_time_(time_t& tp) const { 28 | uint8_t reg[4]; 29 | reg[0] = 0x00; // address 30 | if(!i2c_.send(DS1371_ADR_, reg, 1)) { 31 | return false; 32 | } 33 | if(!i2c_.recv(DS1371_ADR_, ®[0], 4)) { 34 | return false; 35 | } 36 | 37 | tp = (static_cast(reg[3]) << 24) | (static_cast(reg[2]) << 16) | 38 | (static_cast(reg[1]) << 8) | static_cast(reg[0]); 39 | return true; 40 | } 41 | 42 | public: 43 | //-----------------------------------------------------------------// 44 | /*! 45 | @brief コンストラクター 46 | @param[in] i2c i2c_io クラスを参照で渡す 47 | */ 48 | //-----------------------------------------------------------------// 49 | DS1371(I2C_IO& i2c) : i2c_(i2c) { } 50 | 51 | 52 | //-----------------------------------------------------------------// 53 | /*! 54 | @brief 開始 55 | @return 成功なら「true」 56 | */ 57 | //-----------------------------------------------------------------// 58 | bool start() { 59 | uint8_t reg[3]; 60 | reg[0] = 0x07; /// address 61 | reg[1] = 0x00; 62 | reg[2] = 0x00; 63 | return i2c_.send(DS1371_ADR_, reg, 3); 64 | } 65 | 66 | 67 | //-----------------------------------------------------------------// 68 | /*! 69 | @brief DS1371 時間設定 70 | @param[in] t 時間 71 | @return 成功なら「true」 72 | */ 73 | //-----------------------------------------------------------------// 74 | bool set_time(time_t t) const { 75 | uint8_t reg[5]; 76 | reg[0] = 0x00; /// address 77 | reg[1] = t; 78 | reg[2] = t >> 8; 79 | reg[3] = t >> 16; 80 | reg[4] = t >> 24; 81 | return i2c_.send(DS1371_ADR_, reg, 5); 82 | } 83 | 84 | 85 | //-----------------------------------------------------------------// 86 | /*! 87 | @brief DS1371 時間呼び出し 88 | @param[in] tp 取得時間 89 | @return 成功なら「true」 90 | */ 91 | //-----------------------------------------------------------------// 92 | bool get_time(time_t& tp) const { 93 | time_t t = 0; 94 | time_t tmp = 0; 95 | // 二度読んで、同じだったら正しい時間とする 96 | uint8_t n = 4; // 4回ループして正常に読めなかったら、エラーとする 97 | do { 98 | if(!get_time_(t)) return false; 99 | if(!get_time_(tmp)) return false; 100 | --n; 101 | if(n == 0) { 102 | return false; 103 | } 104 | } while(t != tmp) ; 105 | 106 | tp = t; 107 | return true; 108 | } 109 | }; 110 | } 111 | -------------------------------------------------------------------------------- /ARITH_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C Arith サンプル 4 | @author 平松邦仁 (hira@rvf-rc45.net) 5 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 6 | Released under the MIT license @n 7 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 8 | */ 9 | //=====================================================================// 10 | #include "common/renesas.hpp" 11 | 12 | #include "common/fifo.hpp" 13 | #include "common/uart_io.hpp" 14 | #include "common/trb_io.hpp" 15 | #include "common/command.hpp" 16 | #include "common/format.hpp" 17 | #include "common/basic_arith.hpp" 18 | 19 | namespace { 20 | 21 | typedef device::trb_io TIMER_B; 22 | TIMER_B timer_b_; 23 | 24 | typedef utils::fifo TX_BUFF; // 送信バッファ 25 | typedef utils::fifo RX_BUFF; // 受信バッファ 26 | typedef device::uart_io UART; 27 | UART uart_; 28 | 29 | typedef utils::command<64> COMMAND; 30 | COMMAND command_; 31 | 32 | typedef utils::basic_arith ARITH; 33 | ARITH arith_; 34 | } 35 | 36 | extern "C" { 37 | 38 | void sci_putch(char ch) { 39 | uart_.putch(ch); 40 | } 41 | 42 | char sci_getch(void) { 43 | return uart_.getch(); 44 | } 45 | 46 | uint16_t sci_length() { 47 | return uart_.length(); 48 | } 49 | 50 | void sci_puts(const char* str) { 51 | uart_.puts(str); 52 | } 53 | 54 | 55 | void TIMER_RB_intr(void) { 56 | timer_b_.itask(); 57 | } 58 | 59 | 60 | void UART0_TX_intr(void) { 61 | uart_.isend(); 62 | } 63 | 64 | 65 | void UART0_RX_intr(void) { 66 | uart_.irecv(); 67 | } 68 | } 69 | 70 | 71 | // __attribute__ ((section (".exttext"))) 72 | int main(int argc, char *argv[]) 73 | { 74 | using namespace device; 75 | 76 | // クロック関係レジスタ・プロテクト解除 77 | PRCR.PRC0 = 1; 78 | 79 | // 高速オンチップオシレーターへ切り替え(20MHz) 80 | // ※ F_CLK を設定する事(Makefile内) 81 | OCOCR.HOCOE = 1; 82 | utils::delay::micro_second(1); // >=30us(125KHz) 83 | SCKCR.HSCKSEL = 1; 84 | CKSTPR.SCKSEL = 1; 85 | 86 | // タイマーB初期化 87 | { 88 | uint8_t ir_level = 2; 89 | timer_b_.start(60, ir_level); 90 | } 91 | 92 | // UART の設定 (P1_4: TXD0[out], P1_5: RXD0[in]) 93 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 94 | { 95 | utils::PORT_MAP(utils::port_map::P14::TXD0); 96 | utils::PORT_MAP(utils::port_map::P15::RXD0); 97 | uint8_t ir_level = 1; 98 | uart_.start(57600, ir_level); 99 | } 100 | 101 | sci_puts("Start R8C arith sample\n"); 102 | command_.set_prompt("# "); 103 | 104 | // LED シグナル用ポートを出力 105 | PD1.B0 = 1; 106 | 107 | uint8_t cnt = 0; 108 | while(1) { 109 | timer_b_.sync(); 110 | 111 | if(cnt >= 20) { 112 | cnt = 0; 113 | } 114 | if(cnt < 10) P1.B0 = 1; 115 | else P1.B0 = 0; 116 | ++cnt; 117 | 118 | // コマンド入力と、コマンド解析 119 | if(command_.service()) { 120 | if(!arith_.analize(command_.get_command())) { 121 | auto err = arith_.get_error(); 122 | utils::format("Error: %04X\n") % static_cast(err()); 123 | } else { 124 | auto v = arith_.get(); 125 | utils::format("Ans: %d\n") % v; 126 | } 127 | } 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /chip/NTCTH.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief NTC サーミスタ 温度計算 クラス @n 5 | Copyright 2017 Kunihito Hiramatsu 6 | @copyright Copyright (C) 2017 Kunihito Hiramatsu @n 7 | Released under the MIT license @n 8 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 9 | */ 10 | //=====================================================================// 11 | #include 12 | 13 | namespace chip { 14 | 15 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 16 | /*! 17 | @brief サーミスタ型 18 | */ 19 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 20 | enum class thermistor { 21 | NT103_34G, ///< THB:3435, TR25:10K 22 | NT103_41G, ///< THB:4126, TR25:10K 23 | HX103_3380, ///< THB:3380, TR25:10K (25C to 50C) 24 | }; 25 | 26 | 27 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 28 | /*! 29 | @brief NTCTH テンプレートクラス 30 | @param[in] ADNUM A/D 変換値の量子化最大値(12ビットの場合4095 @n 31 | 10ビットの場合、1023) 32 | @param[in] THM サーミスタの型 33 | @param[in] REFR 分圧抵抗値(単位オーム) 34 | @param[in] thup サーミスタが VCC 側の場合「true」、GND 側の場合「false」 35 | */ 36 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 37 | template 38 | class NTCTH { 39 | 40 | // サーミスタの型に応じたパラメーター 41 | // THB: B 定数 42 | // TR25: 25度における基準抵抗値 43 | static void get_para_(float& THB, float& TR25) 44 | { 45 | switch(THM) { 46 | case thermistor::NT103_34G: 47 | THB = 3435.0f; ///< サーミスタB定数 48 | TR25 = 10e3; ///< R25 サーミスタ25℃基準抵抗値 49 | break; 50 | case thermistor::NT103_41G: 51 | THB = 4126.0f; ///< サーミスタB定数 52 | TR25 = 10e3; ///< R25 サーミスタ25℃基準抵抗値 53 | break; 54 | case thermistor::HX103_3380: 55 | THB = 3380.0f; ///< サーミスタB定数 56 | TR25 = 10e3; ///< R25 サーミスタ25℃基準抵抗値 57 | break; 58 | default: 59 | break; 60 | } 61 | } 62 | 63 | // サーミスターが VCC 側 64 | static float thermistor_upper_(uint32_t raw) 65 | { 66 | if(raw == 0) return 0.0f; // 零除算を避ける 67 | float thr = (static_cast(REFR * ADNUM) / static_cast(raw)) - static_cast(REFR); 68 | return thr; 69 | } 70 | 71 | // サーミスターが GND 側 72 | static float thermistor_lower_(uint32_t raw) 73 | { 74 | float thr = static_cast(REFR * raw) / static_cast(ADNUM - raw); 75 | return thr; 76 | } 77 | 78 | public: 79 | //-----------------------------------------------------------------// 80 | /*! 81 | @brief () オペレーター 82 | @param[in] adn A/D 変換値 83 | */ 84 | //-----------------------------------------------------------------// 85 | float operator () (uint16_t adn) const 86 | { 87 | float thr; 88 | if(thup) { 89 | thr = thermistor_upper_(adn); 90 | } else { 91 | thr = thermistor_lower_(adn); 92 | } 93 | float THB; 94 | float TR25; 95 | get_para_(THB, TR25); 96 | static const float T0 = 298.15f; ///< 絶対温度 97 | float t = 1.0f / (std::log(thr / TR25) / THB + (1.0f / T0)); 98 | return t - 273.15f; 99 | } 100 | }; 101 | } 102 | -------------------------------------------------------------------------------- /PLUSE_SINGLE_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C タイマーJ、パルス出力サンプル @n 4 | P17(13) からパルス出力。@n 5 | コンソールから、任意の周波数を設定(有限な設定範囲) 6 | @author 平松邦仁 (hira@rvf-rc45.net) 7 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 8 | Released under the MIT license @n 9 | https://github.com/hirakuni45/RX/blob/master/LICENSE 10 | */ 11 | //=====================================================================// 12 | #include "common/renesas.hpp" 13 | 14 | #include "common/fifo.hpp" 15 | #include "common/uart_io.hpp" 16 | #include "common/trb_io.hpp" 17 | #include "common/trj_io.hpp" 18 | #include "common/command.hpp" 19 | 20 | namespace { 21 | 22 | typedef utils::fifo BUFFER; 23 | typedef device::uart_io UART; 24 | UART uart_; 25 | 26 | typedef device::trb_io TIMER_B; 27 | TIMER_B timer_b_; 28 | 29 | // P1_B0 (20) 30 | typedef device::PORT OUT; 31 | 32 | // P1_B1 (19) 33 | typedef device::PORT SIG; 34 | } 35 | 36 | extern "C" { 37 | 38 | void sci_putch(char ch) { 39 | uart_.putch(ch); 40 | } 41 | 42 | 43 | char sci_getch(void) { 44 | return uart_.getch(); 45 | } 46 | 47 | 48 | uint16_t sci_length() { 49 | return uart_.length(); 50 | } 51 | 52 | 53 | void sci_puts(const char* str) { 54 | uart_.puts(str); 55 | } 56 | 57 | 58 | void TIMER_RB_intr(void) { 59 | timer_b_.itask(); 60 | } 61 | 62 | 63 | void UART0_TX_intr(void) { 64 | uart_.isend(); 65 | } 66 | 67 | 68 | void UART0_RX_intr(void) { 69 | uart_.irecv(); 70 | } 71 | 72 | #if 0 73 | void TIMER_RJ_intr(void) { 74 | timer_j_.iout(); 75 | } 76 | #endif 77 | } 78 | 79 | 80 | int main(int argc, char *argv[]) 81 | { 82 | using namespace device; 83 | 84 | // クロック関係レジスタ・プロテクト解除 85 | PRCR.PRC0 = 1; 86 | 87 | // 高速オンチップオシレーターへ切り替え(20MHz) 88 | // ※ F_CLK を設定する事(Makefile内) 89 | OCOCR.HOCOE = 1; 90 | utils::delay::micro_second(1); // >=30uS(125KHz) 91 | SCKCR.HSCKSEL = 1; 92 | CKSTPR.SCKSEL = 1; 93 | 94 | // タイマーB初期化 95 | { 96 | uint8_t ir_level = 2; 97 | timer_b_.start(100, ir_level); 98 | } 99 | 100 | // UART の設定 (P1_4: TXD0[in], P1_5: RXD0[in]) 101 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 102 | { 103 | utils::PORT_MAP(utils::port_map::P14::TXD0); 104 | utils::PORT_MAP(utils::port_map::P15::RXD0); 105 | uint8_t ir_level = 1; 106 | uart_.start(57600, ir_level); 107 | } 108 | 109 | sci_puts("Start R8C PLUSE single output sample\n"); 110 | 111 | OUT::DIR = 1; 112 | OUT::P = 0; 113 | 114 | SIG::DIR = 1; 115 | OUT::P = 0; 116 | 117 | uint8_t cnt = 0; 118 | 119 | while(1) { 120 | timer_b_.sync(); 121 | ++cnt; 122 | if(cnt >= 5) { 123 | cnt = 0; 124 | } 125 | if(cnt < 2) { 126 | OUT::P = 1; 127 | utils::delay::micro_second(30); 128 | SIG::P = 1; 129 | utils::delay::micro_second(30); 130 | SIG::P = 0; 131 | utils::delay::micro_second(30); 132 | SIG::P = 1; 133 | 134 | } else { 135 | OUT::P = 0; 136 | utils::delay::micro_second(60); 137 | SIG::P = 0; 138 | utils::delay::micro_second(60); 139 | SIG::P = 1; 140 | utils::delay::micro_second(60); 141 | SIG::P = 0; 142 | } 143 | } 144 | } 145 | -------------------------------------------------------------------------------- /SD_WAV_play/wav_in.hpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief WAV 音声ファイルを扱うクラス 4 | @author 平松邦仁 (hira@rvf-rc45.net) 5 | */ 6 | //=====================================================================// 7 | #include 8 | #include "pfatfs/src/pff.h" 9 | 10 | namespace audio { 11 | 12 | //-----------------------------------------------------------------// 13 | /*! 14 | @brief WAV 形式ファイルクラス 15 | */ 16 | //-----------------------------------------------------------------// 17 | class wav_in { 18 | 19 | struct WAVEFILEHEADER { 20 | char szRIFF[4]; 21 | uint32_t ulRIFFSize; 22 | char szWAVE[4]; 23 | }; 24 | 25 | struct RIFFCHUNK { 26 | char szChunkName[4]; 27 | uint32_t ulChunkSize; 28 | }; 29 | 30 | struct WAVEFMT { 31 | uint16_t usFormatTag; 32 | uint16_t usChannels; 33 | uint32_t ulSamplesPerSec; 34 | uint32_t ulAvgBytesPerSec; 35 | uint16_t usBlockAlign; 36 | uint16_t usBitsPerSample; 37 | uint16_t usSize; 38 | uint16_t usReserved; 39 | uint32_t ulChannelMask; 40 | uint32_t guidSubFormat; 41 | }; 42 | 43 | uint32_t data_size_; 44 | 45 | uint32_t rate_; 46 | uint8_t chanel_; 47 | uint8_t bits_; 48 | 49 | public: 50 | //-----------------------------------------------------------------// 51 | /*! 52 | @brief コンストラクター 53 | */ 54 | //-----------------------------------------------------------------// 55 | wav_in() : data_size_(0), rate_(0), chanel_(0), bits_(0) { } 56 | 57 | 58 | //-----------------------------------------------------------------// 59 | /*! 60 | @brief ヘッダーをロードして、フォーマット、サイズを取得する 61 | */ 62 | //-----------------------------------------------------------------// 63 | bool load_header() { 64 | uint32_t ofs = 0; 65 | { 66 | WAVEFILEHEADER wh; 67 | UINT br; 68 | if(pf_read(&wh, sizeof(wh), &br) != FR_OK) { 69 | return false; 70 | } 71 | if(br != sizeof(wh)) return false; 72 | if(strncmp(wh.szRIFF, "RIFF", 4) == 0 && strncmp(wh.szWAVE, "WAVE", 4) == 0) ; 73 | else return false; 74 | ofs += sizeof(wh); 75 | } 76 | 77 | while(1) { 78 | RIFFCHUNK rc; 79 | UINT br; 80 | if(pf_read(&rc, sizeof(rc), &br) != FR_OK) { 81 | return false; 82 | } 83 | if(br != sizeof(rc)) return false; 84 | ofs += sizeof(rc); 85 | 86 | if(strncmp(rc.szChunkName, "fmt ", 4) == 0) { 87 | WAVEFMT wf; 88 | if(pf_read(&wf, sizeof(wf), &br) != FR_OK) { 89 | return false; 90 | } 91 | if(br != sizeof(wf)) return false; 92 | rate_ = wf.ulSamplesPerSec; 93 | chanel_ = wf.usChannels; 94 | bits_ = wf.usBitsPerSample; 95 | } else if(strncmp(rc.szChunkName, "data", 4) == 0) { 96 | data_size_ = rc.ulChunkSize; 97 | break; 98 | } 99 | ofs += rc.ulChunkSize; 100 | pf_lseek(ofs); 101 | } 102 | return true; 103 | } 104 | 105 | 106 | //-----------------------------------------------------------------// 107 | /*! 108 | @brief データサイズを取得 109 | */ 110 | //-----------------------------------------------------------------// 111 | uint32_t get_size() const { return data_size_; } 112 | 113 | uint32_t get_rate() const { return rate_; } 114 | uint8_t get_chanel() const { return chanel_; } 115 | uint8_t get_bits() const { return bits_; } 116 | 117 | }; 118 | } 119 | -------------------------------------------------------------------------------- /M120AN/vdetect.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief R8C/M110AN, R8C/M120AN グループ・電圧検出・レジスター定義 5 | @author 平松邦仁 (hira@rvf-rc45.net) 6 | @copyright Copyright (C) 2014, 2017 Kunihito Hiramatsu @n 7 | Released under the MIT license @n 8 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 9 | */ 10 | //=====================================================================// 11 | #include "common/io_utils.hpp" 12 | 13 | namespace device { 14 | 15 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 16 | /*! 17 | @brief 電圧監視回路エッジ選択レジスタ VCAC 18 | */ 19 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 20 | struct vcac_t : public rw8_t<0x0058> { 21 | typedef rw8_t<0x0058> io_; 22 | using io_::operator =; 23 | using io_::operator (); 24 | using io_::operator |=; 25 | using io_::operator &=; 26 | 27 | bit_rw_t VCAC1; 28 | }; 29 | static vcac_t VCAC; 30 | 31 | 32 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 33 | /*! 34 | @brief 電圧検出レジスタ2 VCA2 35 | */ 36 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 37 | struct vca2_t : public rw8_t<0x005A> { 38 | typedef rw8_t<0x005A> io_; 39 | using io_::operator =; 40 | using io_::operator (); 41 | using io_::operator |=; 42 | using io_::operator &=; 43 | 44 | bit_rw_t LPE; 45 | bit_rw_t VC0E; 46 | bit_rw_t VC1E; 47 | }; 48 | static vca2_t VCA2; 49 | 50 | 51 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 52 | /*! 53 | @brief 電圧検出1レベル選択レジスタ VD1LS 54 | */ 55 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 56 | struct vd1ls_t : public rw8_t<0x005B> { 57 | typedef rw8_t<0x005B> io_; 58 | using io_::operator =; 59 | using io_::operator (); 60 | using io_::operator |=; 61 | using io_::operator &=; 62 | 63 | bits_rw_t VD1S; 64 | }; 65 | static vd1ls_t VD1LS; 66 | 67 | 68 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 69 | /*! 70 | @brief 電圧監視0回路制御レジスタ VW0C 71 | */ 72 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 73 | struct vw0c_t : public rw8_t<0x005C> { 74 | typedef rw8_t<0x005C> io_; 75 | using io_::operator =; 76 | using io_::operator (); 77 | using io_::operator |=; 78 | using io_::operator &=; 79 | 80 | bit_rw_t VW0C0; 81 | bit_rw_t VW0C1; 82 | bits_rw_t VW0F; 83 | }; 84 | static vw0c_t VW0C; 85 | 86 | 87 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 88 | /*! 89 | @brief 電圧監視1回路制御レジスタ VW1C 90 | */ 91 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 92 | struct vw1c_t : public rw8_t<0x005D> { 93 | typedef rw8_t<0x005D> io_; 94 | using io_::operator =; 95 | using io_::operator (); 96 | using io_::operator |=; 97 | using io_::operator &=; 98 | 99 | bit_rw_t VW1C0; 100 | bit_rw_t VW1C1; 101 | bit_rw_t VW1C2; 102 | bit_rw_t VW1C3; 103 | bits_rw_t VW1F; 104 | bit_rw_t VW1C7; 105 | }; 106 | static vw1c_t VW1C; 107 | 108 | } 109 | -------------------------------------------------------------------------------- /PLUSE_INP_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C タイマーJ、パルス計測サンプル 4 | @author 平松邦仁 (hira@rvf-rc45.net) 5 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 6 | Released under the MIT license @n 7 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 8 | */ 9 | //=====================================================================// 10 | #include "common/renesas.hpp" 11 | 12 | #include "common/fifo.hpp" 13 | #include "common/uart_io.hpp" 14 | #include "common/trb_io.hpp" 15 | #include "common/trj_io.hpp" 16 | #include "common/format.hpp" 17 | 18 | namespace { 19 | 20 | typedef utils::fifo BUFFER; 21 | typedef device::uart_io UART; 22 | UART uart_; 23 | 24 | typedef device::trj_io TIMER_J; 25 | TIMER_J timer_j_; 26 | 27 | typedef device::trb_io TIMER_B; 28 | TIMER_B timer_b_; 29 | 30 | } 31 | 32 | extern "C" { 33 | 34 | void sci_putch(char ch) { 35 | uart_.putch(ch); 36 | } 37 | 38 | 39 | char sci_getch(void) { 40 | return uart_.getch(); 41 | } 42 | 43 | 44 | uint16_t sci_length() { 45 | return uart_.length(); 46 | } 47 | 48 | 49 | void sci_puts(const char* str) { 50 | uart_.puts(str); 51 | } 52 | 53 | 54 | void TIMER_RB_intr(void) { 55 | timer_b_.itask(); 56 | } 57 | 58 | 59 | void UART0_TX_intr(void) { 60 | uart_.isend(); 61 | } 62 | 63 | 64 | void UART0_RX_intr(void) { 65 | uart_.irecv(); 66 | } 67 | 68 | 69 | void TIMER_RJ_intr(void) { 70 | timer_j_.iinp(); 71 | } 72 | 73 | } 74 | 75 | 76 | int main(int argc, char *argv[]) 77 | { 78 | using namespace device; 79 | 80 | // クロック関係レジスタ・プロテクト解除 81 | PRCR.PRC0 = 1; 82 | 83 | // 高速オンチップオシレーターへ切り替え(20MHz) 84 | // ※ F_CLK を設定する事(Makefile内) 85 | OCOCR.HOCOE = 1; 86 | utils::delay::micro_second(1); // >=30uS(125KHz) 87 | SCKCR.HSCKSEL = 1; 88 | CKSTPR.SCKSEL = 1; 89 | 90 | const uint8_t interval = 100; 91 | // タイマーB初期化 92 | { 93 | uint8_t ir_level = 2; 94 | timer_b_.start(interval, ir_level); 95 | } 96 | 97 | // UART の設定 (P1_4: TXD0[in], P1_5: RXD0[in]) 98 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 99 | { 100 | utils::PORT_MAP(utils::port_map::P14::TXD0); 101 | utils::PORT_MAP(utils::port_map::P15::RXD0); 102 | uint8_t ir_level = 1; 103 | uart_.start(57600, ir_level); 104 | } 105 | 106 | // TRJ のパルス周期測定 107 | auto srcclk = TIMER_J::source::f1; 108 | uint32_t master = F_CLK; 109 | { 110 | utils::PORT_MAP(utils::port_map::P17::TRJIO); 111 | device::PINSR.TRJIOSEL = 0; // TRJIO を選択 112 | // uint8_t ir_level = 2; 113 | timer_j_.pluse_inp(TIMER_J::measurement::freq, srcclk); 114 | } 115 | 116 | sci_puts("Start R8C PLUSE input sample\n"); 117 | 118 | uint8_t n = 0; 119 | while(1) { 120 | timer_b_.sync(); 121 | ++n; 122 | if(n >= interval) { 123 | uint16_t cnt; 124 | bool f = timer_j_.get_count(cnt); 125 | if(!f) { 126 | utils::format("Range error.\n"); 127 | } else if(cnt == 0) { 128 | utils::format("Terminate error.\n"); 129 | } else { 130 | uint32_t frq = master / static_cast(cnt + 1); 131 | utils::format("Freq: %d Hz (%d, %d)\n") % frq % 132 | static_cast(cnt) % static_cast(master); 133 | } 134 | timer_j_.restart_inp(srcclk); 135 | n = 0; 136 | } 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /MAX6675_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C MAX6675・メイン 4 | @author 平松邦仁 (hira@rvf-rc45.net) 5 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 6 | Released under the MIT license @n 7 | https://github.com/hirakuni45/RX/blob/master/LICENSE 8 | */ 9 | //=====================================================================// 10 | #include "common/renesas.hpp" 11 | 12 | #include "common/format.hpp" 13 | #include "common/fifo.hpp" 14 | #include "common/uart_io.hpp" 15 | #include "common/adc_io.hpp" 16 | #include "common/trb_io.hpp" 17 | #include "common/spi_io.hpp" 18 | #include "chip/MAX6675.hpp" 19 | 20 | namespace { 21 | 22 | typedef device::trb_io timer_b; 23 | timer_b timer_b_; 24 | 25 | typedef utils::fifo buffer; 26 | typedef device::uart_io uart; 27 | uart uart_; 28 | 29 | typedef device::adc_io adc; 30 | adc adc_; 31 | 32 | // P1_0(20): 33 | typedef device::PORT SPI_SCK; 34 | // P1_1(19): 35 | typedef device::PORT MAX_CS; 36 | // P1_2(18): 37 | typedef device::PORT SPI_SDI; 38 | 39 | // MISO, MOSI, SCK 40 | typedef device::spi_io SPI; 41 | SPI spi_; 42 | 43 | typedef chip::MAX6675 MAX6675; 44 | MAX6675 max6675_(spi_); 45 | } 46 | 47 | extern "C" { 48 | 49 | void sci_putch(char ch) { 50 | uart_.putch(ch); 51 | } 52 | 53 | 54 | char sci_getch(void) { 55 | return uart_.getch(); 56 | } 57 | 58 | 59 | uint16_t sci_length() { 60 | return uart_.length(); 61 | } 62 | 63 | 64 | void sci_puts(const char* str) { 65 | uart_.puts(str); 66 | } 67 | 68 | 69 | void TIMER_RB_intr(void) { 70 | timer_b_.itask(); 71 | } 72 | 73 | 74 | void UART0_TX_intr(void) { 75 | uart_.isend(); 76 | } 77 | 78 | 79 | void UART0_RX_intr(void) { 80 | uart_.irecv(); 81 | } 82 | 83 | } 84 | 85 | 86 | // __attribute__ ((section (".exttext"))) 87 | int main(int argc, char *argv[]) 88 | { 89 | using namespace device; 90 | 91 | // クロック関係レジスタ・プロテクト解除 92 | PRCR.PRC0 = 1; 93 | 94 | // 高速オンチップオシレーターへ切り替え(20MHz) 95 | // ※ F_CLK を設定する事(Makefile内) 96 | OCOCR.HOCOE = 1; 97 | utils::delay::micro_second(1); // >=30us(125KHz) 98 | SCKCR.HSCKSEL = 1; 99 | CKSTPR.SCKSEL = 1; 100 | 101 | // タイマーB初期化 102 | { 103 | uint8_t ir_level = 2; 104 | timer_b_.start(60, ir_level); 105 | } 106 | 107 | // UART の設定 (P1_4: TXD0[out], P1_5: RXD0[in]) 108 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 109 | { 110 | utils::PORT_MAP(utils::port_map::P14::TXD0); 111 | utils::PORT_MAP(utils::port_map::P15::RXD0); 112 | uint8_t intr_level = 1; 113 | uart_.start(57600, intr_level); 114 | } 115 | 116 | uart_.puts("Start R8C MAX6675 sample\n"); 117 | 118 | // SPI 開始 119 | spi_.start(10); 120 | 121 | // MAX6675 開始 122 | max6675_.start(); 123 | 124 | using namespace utils; 125 | 126 | uint8_t cnt = 0; 127 | while(1) { 128 | timer_b_.sync(); 129 | 130 | ++cnt; 131 | if(cnt >= 30) { 132 | cnt = 0; 133 | 134 | auto v = max6675_.get_temp(); 135 | utils::format("%6.3f\n") % v; 136 | } 137 | 138 | if(uart_.length()) { // UART のレシーブデータがあるか? 139 | auto ch = uart_.getch(); 140 | uart_.putch(ch); 141 | } 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /L3G4200D_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C/L3G4200D サンプル 4 | @author 平松邦仁 (hira@rvf-rc45.net) 5 | @copyright Copyright (C) 2018, 2021 Kunihito Hiramatsu @n 6 | Released under the MIT license @n 7 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 8 | */ 9 | //=====================================================================// 10 | #include "common/renesas.hpp" 11 | 12 | #include "common/fifo.hpp" 13 | #include "common/uart_io.hpp" 14 | #include "common/trb_io.hpp" 15 | #include "common/iica_io.hpp" 16 | #include "chip/L3G4200D.hpp" 17 | #include "common/command.hpp" 18 | #include "common/format.hpp" 19 | 20 | namespace { 21 | 22 | typedef device::trb_io timer_b; 23 | timer_b timer_b_; 24 | 25 | typedef utils::fifo buffer; 26 | typedef device::uart_io uart; 27 | uart uart_; 28 | 29 | // I2C ポートの定義クラス 30 | // P4_B5(12): SDA 31 | typedef device::PORT sda_port; 32 | // P1_B7(13): SCL 33 | typedef device::PORT scl_port; 34 | 35 | typedef device::iica_io iica; 36 | iica i2c_; 37 | chip::L3G4200D l3g_(i2c_); 38 | 39 | utils::command<64> command_; 40 | } 41 | 42 | extern "C" { 43 | 44 | void sci_putch(char ch) { 45 | uart_.putch(ch); 46 | } 47 | 48 | 49 | char sci_getch(void) { 50 | return uart_.getch(); 51 | } 52 | 53 | 54 | uint16_t sci_length() { 55 | return uart_.length(); 56 | } 57 | 58 | 59 | void sci_puts(const char* str) { 60 | uart_.puts(str); 61 | } 62 | 63 | 64 | void TIMER_RB_intr(void) { 65 | timer_b_.itask(); 66 | } 67 | 68 | 69 | void UART0_TX_intr(void) { 70 | uart_.isend(); 71 | } 72 | 73 | 74 | void UART0_RX_intr(void) { 75 | uart_.irecv(); 76 | } 77 | 78 | } 79 | 80 | 81 | // __attribute__ ((section (".exttext"))) 82 | int main(int argc, char *argv[]) 83 | { 84 | using namespace device; 85 | 86 | // クロック関係レジスタ・プロテクト解除 87 | PRCR.PRC0 = 1; 88 | 89 | // 高速オンチップオシレーターへ切り替え(20MHz) 90 | // ※ F_CLK を設定する事(Makefile内) 91 | OCOCR.HOCOE = 1; 92 | utils::delay::micro_second(1); // >=30us(125KHz) 93 | SCKCR.HSCKSEL = 1; 94 | CKSTPR.SCKSEL = 1; 95 | 96 | // タイマーB初期化 97 | { 98 | uint8_t ir_level = 2; 99 | timer_b_.start(100, ir_level); 100 | } 101 | 102 | // UART の設定 (P1_4: TXD0[out], P1_5: RXD0[in]) 103 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 104 | { 105 | utils::PORT_MAP(utils::port_map::P14::TXD0); 106 | utils::PORT_MAP(utils::port_map::P15::RXD0); 107 | uint8_t ir_level = 1; 108 | uart_.start(57600, ir_level); 109 | } 110 | 111 | // I2C クラスの初期化 112 | { 113 | i2c_.start(iica::speed::fast); 114 | } 115 | 116 | sci_puts("Start R8C/L3G4200D sample\n"); 117 | command_.set_prompt("# "); 118 | 119 | // L3G4200D を開始 120 | { 121 | if(!l3g_.start()) { 122 | utils::format("Stall L3G4200D start\n"); 123 | } 124 | l3g_.calibrate(); 125 | } 126 | 127 | // LED シグナル用ポートを出力 128 | PD1.B0 = 1; 129 | 130 | uint8_t itv = 0; 131 | uint8_t cnt = 0; 132 | while(1) { 133 | timer_b_.sync(); 134 | 135 | if(cnt >= 20) { 136 | cnt = 0; 137 | } 138 | if(cnt < 10) P1.B0 = 1; 139 | else P1.B0 = 0; 140 | ++cnt; 141 | 142 | auto raw = l3g_.get_raw(); 143 | utils::format("%d,%d,%d\n") % raw.x % raw.y % raw.z; 144 | 145 | // コマンド入力と、コマンド解析 146 | if(command_.service()) { 147 | uint8_t cmdn = command_.get_words(); 148 | if(cmdn >= 1) { 149 | } 150 | } 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /RF433_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C RF433 メイン @n 4 | 433MHz TX/RX Module @n 5 | RF_TX (out) ---> (P1_0:20) @n 6 | RF_RX (inp) ---> (P1_1:19) 7 | @author 平松邦仁 (hira@rvf-rc45.net) 8 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 9 | Released under the MIT license @n 10 | https://github.com/hirakuni45/RX/blob/master/LICENSE 11 | */ 12 | //=====================================================================// 13 | #include "common/renesas.hpp" 14 | 15 | #include "common/format.hpp" 16 | #include "common/fifo.hpp" 17 | #include "common/uart_io.hpp" 18 | #include "common/trb_io.hpp" 19 | #include "chip/TX_MOD.hpp" 20 | #include "chip/RX_MOD.hpp" 21 | 22 | namespace { 23 | 24 | // ポートの定義と接続 25 | // P1_0(20): 26 | typedef device::PORT RF_TX; 27 | // P1_1(19): 28 | typedef device::PORT RF_RX; 29 | 30 | typedef chip::TX_MOD TX; 31 | typedef chip::RX_MOD RX; 32 | 33 | class rf_task { 34 | 35 | TX tx_; 36 | RX rx_; 37 | 38 | bool flag_; 39 | 40 | volatile uint8_t recv_; 41 | 42 | public: 43 | rf_task() : flag_(0), recv_(0) { 44 | RF_TX::DIR = 1; // out 45 | RF_RX::DIR = 0; // inp 46 | } 47 | 48 | void task() { 49 | RF_TX::P = flag_; 50 | flag_ = !flag_; 51 | 52 | recv_ <<= 1; 53 | if(RF_RX::P()) ++recv_; 54 | } 55 | 56 | uint8_t get() const { return recv_; } 57 | 58 | void operator() () { 59 | task(); 60 | } 61 | }; 62 | 63 | typedef device::trb_io TRB; 64 | TRB trb_; 65 | 66 | typedef utils::fifo BUFFER; 67 | typedef device::uart_io UART; 68 | UART uart_; 69 | 70 | } 71 | 72 | extern "C" { 73 | 74 | void sci_putch(char ch) { 75 | uart_.putch(ch); 76 | } 77 | 78 | 79 | char sci_getch(void) { 80 | return uart_.getch(); 81 | } 82 | 83 | 84 | uint16_t sci_length() { 85 | return uart_.length(); 86 | } 87 | 88 | 89 | void sci_puts(const char* str) { 90 | uart_.puts(str); 91 | } 92 | 93 | 94 | void TIMER_RB_intr(void) { 95 | trb_.itask(); 96 | } 97 | 98 | 99 | void UART0_TX_intr(void) { 100 | uart_.isend(); 101 | } 102 | 103 | 104 | void UART0_RX_intr(void) { 105 | uart_.irecv(); 106 | } 107 | 108 | } 109 | 110 | 111 | // __attribute__ ((section (".exttext"))) 112 | int main(int argc, char *argv[]) 113 | { 114 | using namespace device; 115 | 116 | // クロック関係レジスタ・プロテクト解除 117 | PRCR.PRC0 = 1; 118 | 119 | // 高速オンチップオシレーターへ切り替え(20MHz) 120 | // ※ F_CLK を設定する事(Makefile内) 121 | OCOCR.HOCOE = 1; 122 | utils::delay::micro_second(1); // >=30us(125KHz) 123 | SCKCR.HSCKSEL = 1; 124 | CKSTPR.SCKSEL = 1; 125 | 126 | // タイマーB初期化 127 | // ※無線データ変調で利用するので、優先順位は最大にする。 128 | { 129 | uint8_t ir_level = 2; 130 | trb_.start(2000, ir_level); 131 | } 132 | 133 | // UART の設定 (P1_4: TXD0[out], P1_5: RXD0[in]) 134 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 135 | { 136 | utils::PORT_MAP(utils::port_map::P14::TXD0); 137 | utils::PORT_MAP(utils::port_map::P15::RXD0); 138 | uint8_t intr_level = 1; 139 | uart_.start(57600, intr_level); 140 | } 141 | 142 | uart_.puts("Start R8C RF433 TX/RX sample\n"); 143 | 144 | using namespace utils; 145 | 146 | uint16_t cnt = 0; 147 | 148 | while(1) { 149 | trb_.sync(); 150 | 151 | ++cnt; 152 | if(cnt >= 500) { 153 | uint8_t d = TRB::task_.get(); 154 | utils::format("%02X\n") % static_cast(d); 155 | cnt = 0; 156 | } 157 | } 158 | } 159 | -------------------------------------------------------------------------------- /MAX7219_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C MAX7219 メイン @n 4 | P1_0: DIN @n 5 | P1_1: /CS @n 6 | P1_2: CLK 7 | @author 平松邦仁 (hira@rvf-rc45.net) 8 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 9 | Released under the MIT license @n 10 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 11 | */ 12 | //=====================================================================// 13 | #include "common/renesas.hpp" 14 | 15 | #include 16 | 17 | #include "common/fifo.hpp" 18 | #include "common/uart_io.hpp" 19 | #include "common/format.hpp" 20 | #include "common/trb_io.hpp" 21 | #include "common/spi_io.hpp" 22 | #include "chip/MAX7219.hpp" 23 | 24 | // Dot Matrix LED 25 | #define DOT_MATRIX 26 | 27 | namespace { 28 | 29 | device::trb_io timer_b_; 30 | 31 | typedef utils::fifo buffer; 32 | typedef device::uart_io uart; 33 | uart uart_; 34 | 35 | typedef device::PORT SPI_SDA; 36 | typedef device::PORT SPI_SCL; 37 | 38 | typedef device::spi_io SPI; 39 | SPI spi_; 40 | 41 | typedef device::PORT SELECT; 42 | chip::MAX7219 max7219_(spi_); 43 | } 44 | 45 | extern "C" { 46 | 47 | void sci_putch(char ch) { 48 | uart_.putch(ch); 49 | } 50 | 51 | 52 | char sci_getch(void) { 53 | return uart_.getch(); 54 | } 55 | 56 | 57 | uint16_t sci_length() { 58 | return uart_.length(); 59 | } 60 | 61 | 62 | void sci_puts(const char* str) { 63 | uart_.puts(str); 64 | } 65 | 66 | 67 | void TIMER_RB_intr(void) { 68 | timer_b_.itask(); 69 | } 70 | 71 | 72 | void UART0_TX_intr(void) { 73 | uart_.isend(); 74 | } 75 | 76 | 77 | void UART0_RX_intr(void) { 78 | uart_.irecv(); 79 | } 80 | } 81 | 82 | 83 | // __attribute__ ((section (".exttext"))) 84 | int main(int argc, char *argv[]) 85 | { 86 | using namespace device; 87 | 88 | // クロック関係レジスタ・プロテクト解除 89 | PRCR.PRC0 = 1; 90 | 91 | // 高速オンチップオシレーターへ切り替え(20MHz) 92 | // ※ F_CLK を設定する事(Makefile内) 93 | OCOCR.HOCOE = 1; 94 | utils::delay::micro_second(1); // >=30us(125KHz) 95 | SCKCR.HSCKSEL = 1; 96 | CKSTPR.SCKSEL = 1; 97 | 98 | // タイマーB初期化 99 | { 100 | uint8_t ir_level = 2; 101 | timer_b_.start(60, ir_level); 102 | } 103 | 104 | // UART の設定 (P1_4: TXD0[out], P1_5: RXD0[in]) 105 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 106 | { 107 | utils::PORT_MAP(utils::port_map::P14::TXD0); 108 | utils::PORT_MAP(utils::port_map::P15::RXD0); 109 | uint8_t ir_level = 1; 110 | uart_.start(57600, ir_level); 111 | } 112 | 113 | // SPI を開始 114 | { 115 | spi_.start(10); 116 | } 117 | 118 | // MAX7219 を開始 119 | { 120 | max7219_.start(); 121 | } 122 | 123 | sci_puts("Start R8C MAX7219 sample\n"); 124 | 125 | for(uint8_t i = 0; i < 8; ++i) { 126 | #ifdef DOT_MATRIX 127 | max7219_.set(i, rand() & 0xff); 128 | #else 129 | max7219_.set_cha(i, '-'); 130 | #endif 131 | } 132 | 133 | uint8_t idx = 0; 134 | while(1) { 135 | timer_b_.sync(); 136 | max7219_.service(); 137 | max7219_.set_intensity(0); 138 | 139 | if(sci_length()) { 140 | if(idx > 7) { 141 | max7219_.shift_top(); 142 | idx = 7; 143 | } 144 | #ifdef DOT_MATRIX 145 | sci_getch(); 146 | auto ch = rand() & 0xff; 147 | max7219_.set(idx ^ 7, ch); 148 | #else 149 | auto ch = sci_getch(); 150 | sci_putch(ch); 151 | max7219_.set_cha(idx ^ 7, ch); 152 | #endif 153 | ++idx; 154 | } 155 | } 156 | } 157 | -------------------------------------------------------------------------------- /KiCAD_lib/ftdi.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | $CMP FT200XD 4 | D FT200XD, Full Speed USB to I2C Bridge, DFN-10 5 | K FTDI USB I2C Interface Converter 6 | F http://www.ftdichip.com/Products/ICs/FT200XD.html 7 | $ENDCMP 8 | # 9 | $CMP FT201XQ 10 | D FT201XQ, Full Speed USB to I2C Bridge, QFN-10 11 | K FTDI USB I2C interface Converter 12 | F http://www.ftdichip.com/Products/ICs/FT201X.html 13 | $ENDCMP 14 | # 15 | $CMP FT201XS 16 | D FT201XS, Full Speed USB to I2C Bridge, SSOP-16 17 | K FTDI USB I2C Interface Converter 18 | F http://www.ftdichip.com/Products/ICs/FT201X.html 19 | $ENDCMP 20 | # 21 | $CMP FT220XQ 22 | D FT220XQ, Full Speed USB to 4-Bit SPI / FT1248 Bridge, QFN-16 23 | K FTDI USB SPI FT1248 Interface Converter 24 | F http://www.ftdichip.com/Products/ICs/FT220X.html 25 | $ENDCMP 26 | # 27 | $CMP FT220XS 28 | D FT220XS, Full Speed USB to 4-Bit SPI / FT1248 Bridge, SSOP-16 29 | K FTDI USB SPI FT1248 Interface Converter 30 | F http://www.ftdichip.com/Products/ICs/FT220X.html 31 | $ENDCMP 32 | # 33 | $CMP FT221XQ 34 | D FT221XQ, Full Speed USB to 8-Bit SPI / FT1248 Bridge, QFN-20 35 | K FTDI USB SPI FT1248 interface converter 36 | F http://www.ftdichip.com/Products/ICs/FT221X.html 37 | $ENDCMP 38 | # 39 | $CMP FT221XS 40 | D FT221XS, Full Speed USB to 8-Bit SPI / FT1248 Bridge, SSOP-20 41 | K FTDI USB SPI FT1248 interface converter 42 | F http://www.ftdichip.com/Products/ICs/FT221X.html 43 | $ENDCMP 44 | # 45 | $CMP FT2232H 46 | D FT2232Hx, Hi Speed Double Channel USB UART/FIFO, LQFP/QFN-64 47 | K USB Double UART FIFO 48 | F http://www.ftdichip.com/Products/ICs/FT2232H.html 49 | $ENDCMP 50 | # 51 | $CMP FT230XQ 52 | D FT230XQ, Full Speed USB to Basic UART, QFN-16 53 | K FTDI USB UART interface converter 54 | F http://www.ftdichip.com/Products/ICs/FT230X.html 55 | $ENDCMP 56 | # 57 | $CMP FT230XS 58 | D FT230XS, Full Speed USB to Basic UART, SSOP-16 59 | K FTDI USB UART interface converter 60 | F http://www.ftdichip.com/Products/ICs/FT230X.html 61 | $ENDCMP 62 | # 63 | $CMP FT231XQ 64 | D FT231XQ, Full Speed USB to Full Handshake UART, QFN-20 65 | K FTDI USB UART interface converter 66 | F http://www.ftdichip.com/Products/ICs/FT231X.html 67 | $ENDCMP 68 | # 69 | $CMP FT231XS 70 | D FT231XS, Full Speed USB to Full Handshake UART, SSOP-20 71 | K FTDI USB UART interface converter 72 | F http://www.ftdichip.com/Products/ICs/FT231X.html 73 | $ENDCMP 74 | # 75 | $CMP FT232BM 76 | D FT232BM, Hi Speed Single Channel USB UART/FIFO, LQFP-32 77 | K USB Single UART FIFO 78 | F http://www.ftdichip.com/Products/ICs/FT232BM.htm 79 | $ENDCMP 80 | # 81 | $CMP FT232H 82 | D FT232Hx, Hi Speed Single Channel USB UART/FIFO, LQFP/QFN-48 83 | K USB Single UART FIFO 84 | F http://www.ftdichip.com/Products/ICs/FT232H.htm 85 | $ENDCMP 86 | # 87 | $CMP FT232RL 88 | D FT232RL, USB to Serial Interface, SSOP-28 89 | K USB Serial 90 | F http://www.ftdichip.com/Products/ICs/FT232RL.htm 91 | $ENDCMP 92 | # 93 | $CMP FT240XQ 94 | D FT240XQ, Full Speed USB to 8-Bit FIFO, QFN-24 95 | K FTDI USB FIFO interface converter 96 | F http://www.ftdichip.com/Products/ICs/FT240X.html 97 | $ENDCMP 98 | # 99 | $CMP FT240XS 100 | D FT240XS, Full Speed USB to 8-Bit FIFO, SSOP-24 101 | K FTDI USB FIFO interface converter 102 | F http://www.ftdichip.com/Products/ICs/FT240X.html 103 | $ENDCMP 104 | # 105 | $CMP FT245BM 106 | D FT245BM, Full Speed USB to 8-Bit FIFO, LQFP-32 107 | K FTDI USB FIFO Interface Converter 108 | F http://www.ftdichip.com/Products/ICs/FT245B.html 109 | $ENDCMP 110 | # 111 | $CMP FT4232H 112 | D FT4232H, Hi Speed Quad Channel USB UART/FIFO, LQFP/QFN-64 113 | K USB Quad UART FIFO 114 | F http://www.ftdichip.com/Products/ICs/FT4232H.htm 115 | $ENDCMP 116 | # 117 | #End Doc Library 118 | -------------------------------------------------------------------------------- /r8cprog/KiCAD/ftdi.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | $CMP FT200XD 4 | D FT200XD, Full Speed USB to I2C Bridge, DFN-10 5 | K FTDI USB I2C Interface Converter 6 | F http://www.ftdichip.com/Products/ICs/FT200XD.html 7 | $ENDCMP 8 | # 9 | $CMP FT201XQ 10 | D FT201XQ, Full Speed USB to I2C Bridge, QFN-10 11 | K FTDI USB I2C interface Converter 12 | F http://www.ftdichip.com/Products/ICs/FT201X.html 13 | $ENDCMP 14 | # 15 | $CMP FT201XS 16 | D FT201XS, Full Speed USB to I2C Bridge, SSOP-16 17 | K FTDI USB I2C Interface Converter 18 | F http://www.ftdichip.com/Products/ICs/FT201X.html 19 | $ENDCMP 20 | # 21 | $CMP FT220XQ 22 | D FT220XQ, Full Speed USB to 4-Bit SPI / FT1248 Bridge, QFN-16 23 | K FTDI USB SPI FT1248 Interface Converter 24 | F http://www.ftdichip.com/Products/ICs/FT220X.html 25 | $ENDCMP 26 | # 27 | $CMP FT220XS 28 | D FT220XS, Full Speed USB to 4-Bit SPI / FT1248 Bridge, SSOP-16 29 | K FTDI USB SPI FT1248 Interface Converter 30 | F http://www.ftdichip.com/Products/ICs/FT220X.html 31 | $ENDCMP 32 | # 33 | $CMP FT221XQ 34 | D FT221XQ, Full Speed USB to 8-Bit SPI / FT1248 Bridge, QFN-20 35 | K FTDI USB SPI FT1248 interface converter 36 | F http://www.ftdichip.com/Products/ICs/FT221X.html 37 | $ENDCMP 38 | # 39 | $CMP FT221XS 40 | D FT221XS, Full Speed USB to 8-Bit SPI / FT1248 Bridge, SSOP-20 41 | K FTDI USB SPI FT1248 interface converter 42 | F http://www.ftdichip.com/Products/ICs/FT221X.html 43 | $ENDCMP 44 | # 45 | $CMP FT2232H 46 | D FT2232Hx, Hi Speed Double Channel USB UART/FIFO, LQFP/QFN-64 47 | K USB Double UART FIFO 48 | F http://www.ftdichip.com/Products/ICs/FT2232H.html 49 | $ENDCMP 50 | # 51 | $CMP FT230XQ 52 | D FT230XQ, Full Speed USB to Basic UART, QFN-16 53 | K FTDI USB UART interface converter 54 | F http://www.ftdichip.com/Products/ICs/FT230X.html 55 | $ENDCMP 56 | # 57 | $CMP FT230XS 58 | D FT230XS, Full Speed USB to Basic UART, SSOP-16 59 | K FTDI USB UART interface converter 60 | F http://www.ftdichip.com/Products/ICs/FT230X.html 61 | $ENDCMP 62 | # 63 | $CMP FT231XQ 64 | D FT231XQ, Full Speed USB to Full Handshake UART, QFN-20 65 | K FTDI USB UART interface converter 66 | F http://www.ftdichip.com/Products/ICs/FT231X.html 67 | $ENDCMP 68 | # 69 | $CMP FT231XS 70 | D FT231XS, Full Speed USB to Full Handshake UART, SSOP-20 71 | K FTDI USB UART interface converter 72 | F http://www.ftdichip.com/Products/ICs/FT231X.html 73 | $ENDCMP 74 | # 75 | $CMP FT232BM 76 | D FT232BM, Hi Speed Single Channel USB UART/FIFO, LQFP-32 77 | K USB Single UART FIFO 78 | F http://www.ftdichip.com/Products/ICs/FT232BM.htm 79 | $ENDCMP 80 | # 81 | $CMP FT232H 82 | D FT232Hx, Hi Speed Single Channel USB UART/FIFO, LQFP/QFN-48 83 | K USB Single UART FIFO 84 | F http://www.ftdichip.com/Products/ICs/FT232H.htm 85 | $ENDCMP 86 | # 87 | $CMP FT232RL 88 | D FT232RL, USB to Serial Interface, SSOP-28 89 | K USB Serial 90 | F http://www.ftdichip.com/Products/ICs/FT232RL.htm 91 | $ENDCMP 92 | # 93 | $CMP FT240XQ 94 | D FT240XQ, Full Speed USB to 8-Bit FIFO, QFN-24 95 | K FTDI USB FIFO interface converter 96 | F http://www.ftdichip.com/Products/ICs/FT240X.html 97 | $ENDCMP 98 | # 99 | $CMP FT240XS 100 | D FT240XS, Full Speed USB to 8-Bit FIFO, SSOP-24 101 | K FTDI USB FIFO interface converter 102 | F http://www.ftdichip.com/Products/ICs/FT240X.html 103 | $ENDCMP 104 | # 105 | $CMP FT245BM 106 | D FT245BM, Full Speed USB to 8-Bit FIFO, LQFP-32 107 | K FTDI USB FIFO Interface Converter 108 | F http://www.ftdichip.com/Products/ICs/FT245B.html 109 | $ENDCMP 110 | # 111 | $CMP FT4232H 112 | D FT4232H, Hi Speed Quad Channel USB UART/FIFO, LQFP/QFN-64 113 | K USB Quad UART FIFO 114 | F http://www.ftdichip.com/Products/ICs/FT4232H.htm 115 | $ENDCMP 116 | # 117 | #End Doc Library 118 | -------------------------------------------------------------------------------- /ENCODER_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C エンコーダー・サンプル @n 4 | ・ポート P1_0: A 相 @n 5 | ・ポート P1_1: B 相 @n 6 | ・各プルアップは 5K ~ 10K オーム(ロータリーエンコーダーの仕様を参照) @n 7 | ・エンコーダーのチャタリングは 2ms~3ms 程度なので、周期は 360Hz としている。 @n 8 | ※プルアップ抵抗の値、電源電圧などにより異なるので仕様を確認 9 | @author 平松邦仁 (hira@rvf-rc45.net) 10 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 11 | Released under the MIT license @n 12 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 13 | */ 14 | //=====================================================================// 15 | #include "common/renesas.hpp" 16 | 17 | #include "common/format.hpp" 18 | #include "common/fifo.hpp" 19 | #include "common/uart_io.hpp" 20 | #include "common/trb_io.hpp" 21 | 22 | #include "chip/ENCODER.hpp" 23 | 24 | namespace { 25 | 26 | typedef utils::fifo TX_BUFF; // 送信バッファ 27 | typedef utils::fifo RX_BUFF; // 受信バッファ 28 | typedef device::uart_io UART; 29 | UART uart_; 30 | 31 | // エンコーダー入力の定義 32 | static const uint8_t TIMER_MULTI_NUM = 6; 33 | typedef device::PORT PHA; 34 | typedef device::PORT PHB; 35 | // パラメーターを指定しない場合、DECODE::PHA_POS: A 相の立ち上がりのみでカウントとなる。 36 | typedef chip::ENCODER ENCODER; 37 | ENCODER encoder_; 38 | 39 | class timer_t { 40 | uint8_t multi_; 41 | volatile uint8_t count_; 42 | public: 43 | timer_t() : multi_(0), count_(0) { } 44 | 45 | void sync60() 46 | { 47 | auto tmp = count_; 48 | while(tmp == count_) ; 49 | } 50 | 51 | void operator () () 52 | { 53 | encoder_(); 54 | 55 | ++multi_; 56 | if(multi_ >= TIMER_MULTI_NUM) { 57 | ++count_; 58 | multi_ = 0; 59 | } 60 | } 61 | }; 62 | 63 | typedef device::trb_io TIMER_B; 64 | TIMER_B timer_b_; 65 | } 66 | 67 | extern "C" { 68 | 69 | void sci_putch(char ch) { 70 | uart_.putch(ch); 71 | } 72 | 73 | 74 | char sci_getch(void) { 75 | return uart_.getch(); 76 | } 77 | 78 | 79 | uint16_t sci_length() { 80 | return uart_.length(); 81 | } 82 | 83 | 84 | void sci_puts(const char* str) { 85 | uart_.puts(str); 86 | } 87 | 88 | 89 | void TIMER_RB_intr(void) { 90 | timer_b_.itask(); 91 | } 92 | 93 | 94 | void UART0_TX_intr(void) { 95 | uart_.isend(); 96 | } 97 | 98 | 99 | void UART0_RX_intr(void) { 100 | uart_.irecv(); 101 | } 102 | 103 | } 104 | 105 | int main(int argc, char *argv[]) 106 | { 107 | using namespace device; 108 | 109 | // クロック関係レジスタ・プロテクト解除 110 | PRCR.PRC0 = 1; 111 | 112 | // 高速オンチップオシレーターへ切り替え(20MHz) 113 | // ※ F_CLK を設定する事(Makefile内) 114 | OCOCR.HOCOE = 1; 115 | utils::delay::micro_second(1); // >=30uS(125KHz) 116 | SCKCR.HSCKSEL = 1; 117 | CKSTPR.SCKSEL = 1; 118 | 119 | // エンコーダー関係の初期化 120 | { 121 | encoder_.start(); 122 | } 123 | 124 | // タイマーB初期化 125 | { 126 | uint8_t ir_level = 2; 127 | timer_b_.start(60 * TIMER_MULTI_NUM, ir_level); 128 | } 129 | 130 | // UART の設定 (P1_4: TXD0[in], P1_5: RXD0[in]) 131 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 132 | { 133 | utils::PORT_MAP(utils::port_map::P14::TXD0); 134 | utils::PORT_MAP(utils::port_map::P15::RXD0); 135 | uint8_t ir_level = 1; 136 | uart_.start(57600, ir_level); 137 | } 138 | 139 | sci_puts("Start R8C ENCODER sample\n"); 140 | 141 | uint16_t value = encoder_.get_count(); 142 | while(1) { 143 | // メインループは 60Hz で動かす 144 | timer_b_.task_.sync60(); 145 | 146 | auto count = encoder_.get_count(); 147 | if(count != value) { 148 | value = count; 149 | utils::format("%05d\n") % value; 150 | } 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /PWM_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C PWM メイン @n 4 | PWM 出力 B:P12(TRCIOB) 18 pin @n 5 | PWM 出力 C: P13(TRCIOC) 17 pin @n 6 | PWM 出力 D: P10(TRCIOD) 20 pin 7 | @author 平松邦仁 (hira@rvf-rc45.net) 8 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 9 | Released under the MIT license @n 10 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 11 | */ 12 | //=====================================================================// 13 | #include "common/renesas.hpp" 14 | 15 | #include "common/fifo.hpp" 16 | #include "common/uart_io.hpp" 17 | #include "common/trb_io.hpp" 18 | #include "common/trc_io.hpp" 19 | #include "common/adc_io.hpp" 20 | 21 | namespace { 22 | 23 | typedef device::trb_io TIMER_B; 24 | TIMER_B timer_b_; 25 | 26 | typedef utils::fifo BUFFER; 27 | typedef device::uart_io UART; 28 | UART uart_; 29 | 30 | typedef device::adc_io ADC; 31 | ADC adc_; 32 | 33 | typedef device::trc_io TIMER_C; 34 | TIMER_C timer_c_; 35 | } 36 | 37 | extern "C" { 38 | 39 | void sci_putch(char ch) { 40 | uart_.putch(ch); 41 | } 42 | 43 | 44 | char sci_getch(void) { 45 | return uart_.getch(); 46 | } 47 | 48 | 49 | uint16_t sci_length() { 50 | return uart_.length(); 51 | } 52 | 53 | 54 | void sci_puts(const char* str) { 55 | uart_.puts(str); 56 | } 57 | 58 | 59 | void TIMER_RB_intr(void) { 60 | timer_b_.itask(); 61 | } 62 | 63 | 64 | void UART0_TX_intr(void) { 65 | uart_.isend(); 66 | } 67 | 68 | 69 | void UART0_RX_intr(void) { 70 | uart_.irecv(); 71 | } 72 | 73 | 74 | // このプロジェクトでは、割り込みを使っていない 75 | // void TIMER_RC_intr(void) { 76 | // timer_c_.itask(); 77 | // } 78 | 79 | } 80 | 81 | 82 | int main(int argc, char *argv[]) 83 | { 84 | using namespace device; 85 | 86 | // クロック関係レジスタ・プロテクト解除 87 | PRCR.PRC0 = 1; 88 | 89 | // 高速オンチップオシレーターへ切り替え(20MHz) 90 | // ※ F_CLK を設定する事(Makefile内) 91 | OCOCR.HOCOE = 1; 92 | utils::delay::micro_second(1); // >=30us(125KHz) 93 | SCKCR.HSCKSEL = 1; 94 | CKSTPR.SCKSEL = 1; 95 | 96 | // タイマーB初期化 97 | { 98 | uint8_t ir_level = 2; 99 | timer_b_.start(60, ir_level); 100 | } 101 | 102 | // UART の設定 (P1_4: TXD0[in], P1_5: RXD0[in]) 103 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 104 | { 105 | utils::PORT_MAP(utils::port_map::P14::TXD0); 106 | utils::PORT_MAP(utils::port_map::P15::RXD0); 107 | uint8_t ir_level = 1; 108 | uart_.start(57600, ir_level); 109 | } 110 | 111 | // ADC の設定(CH1のサイクルモード) 112 | { 113 | utils::PORT_MAP(utils::port_map::P11::AN1); 114 | adc_.start(ADC::CH_TYPE::CH1, ADC::CH_GROUP::AN0_AN1, true); 115 | } 116 | 117 | // PWMモード設定 118 | { 119 | utils::PORT_MAP(utils::port_map::P12::TRCIOB); 120 | utils::PORT_MAP(utils::port_map::P13::TRCIOC); 121 | utils::PORT_MAP(utils::port_map::P10::TRCIOD); 122 | bool pfl = 0; // 0->1 123 | timer_c_.start(10000, pfl); 124 | uint16_t n = timer_c_.get_pwm_limit(); 125 | timer_c_.set_pwm_b(n >> 2); // 25% 126 | timer_c_.set_pwm_c(n - (n >> 2)); // 75% 127 | } 128 | 129 | sci_puts("Start R8C PWM monitor\n"); 130 | 131 | adc_.scan(); 132 | // LED シグナル用ポートを出力 133 | // PD1.B0 = 1; 134 | 135 | // uint8_t cnt = 0; 136 | while(1) { 137 | timer_b_.sync(); 138 | if(adc_.get_state()) { 139 | uint32_t v = adc_.get_value(1); 140 | v *= timer_c_.get_pwm_limit(); 141 | timer_c_.set_pwm_d(v >> 10); 142 | adc_.scan(); 143 | } 144 | 145 | // ++cnt; 146 | // if(cnt >= 30) { 147 | // cnt = 0; 148 | // } 149 | 150 | // if(cnt < 10) P1.B0 = 1; 151 | // else P1.B0 = 0; 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /common/fifo.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief FIFO (first in first out) 5 | @author 平松邦仁 (hira@rvf-rc45.net) 6 | @copyright Copyright (C) 2016, 2017 Kunihito Hiramatsu @n 7 | Released under the MIT license @n 8 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 9 | */ 10 | //=====================================================================// 11 | #include 12 | 13 | namespace utils { 14 | 15 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 16 | /*! 17 | @brief fifo クラス 18 | @param[in] SIZE バッファサイズ 19 | */ 20 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 21 | template 22 | class fifo { 23 | 24 | typedef char DT; 25 | typedef T PTS; 26 | 27 | volatile PTS get_ = 0; 28 | volatile PTS put_ = 0; 29 | 30 | DT buff_[SIZE]; 31 | 32 | public: 33 | //-----------------------------------------------------------------// 34 | /*! 35 | @brief クリア 36 | */ 37 | //-----------------------------------------------------------------// 38 | void clear() { get_ = put_ = 0; } 39 | 40 | 41 | //-----------------------------------------------------------------// 42 | /*! 43 | @brief 値の格納 44 | @param[in] v 値 45 | */ 46 | //-----------------------------------------------------------------// 47 | void put(DT v) { 48 | buff_[put_] = v; 49 | ++put_; 50 | if(SIZE == 8 || SIZE == 16 || SIZE == 32 || SIZE == 64 || SIZE == 128) { 51 | put_ &= SIZE - 1; 52 | } else if(SIZE == 256) { 53 | } else { 54 | if(put_ >= SIZE) { 55 | put_ = 0; 56 | } 57 | } 58 | } 59 | 60 | 61 | //-----------------------------------------------------------------// 62 | /*! 63 | @brief 値の取得 64 | @return 値 65 | */ 66 | //-----------------------------------------------------------------// 67 | DT get() { 68 | DT data = buff_[get_]; 69 | ++get_; 70 | if(SIZE == 8 || SIZE == 16 || SIZE == 32 || SIZE == 64 || SIZE == 128) { 71 | get_ &= SIZE - 1; 72 | } else if(SIZE == 256) { 73 | } else { 74 | if(get_ >= SIZE) { 75 | get_ = 0; 76 | } 77 | } 78 | return data; 79 | } 80 | 81 | 82 | //-----------------------------------------------------------------// 83 | /*! 84 | @brief 長さを返す 85 | @return 長さ 86 | */ 87 | //-----------------------------------------------------------------// 88 | PTS length() const { 89 | if(put_ >= get_) return (put_ - get_); 90 | else return (SIZE + put_ - get_); 91 | } 92 | 93 | 94 | //-----------------------------------------------------------------// 95 | /*! 96 | @brief get 位置を返す 97 | @return 位置 98 | */ 99 | //-----------------------------------------------------------------// 100 | PTS pos_get() const { return get_; } 101 | 102 | 103 | //-----------------------------------------------------------------// 104 | /*! 105 | @brief put 位置を返す 106 | @return 位置 107 | */ 108 | //-----------------------------------------------------------------// 109 | PTS pos_put() const { return put_; } 110 | 111 | 112 | //-----------------------------------------------------------------// 113 | /*! 114 | @brief バッファのサイズを返す 115 | @return バッファのサイズ 116 | */ 117 | //-----------------------------------------------------------------// 118 | PTS size() const { return SIZE; } 119 | }; 120 | 121 | } 122 | -------------------------------------------------------------------------------- /TOUCH_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C タッチ。スイッチ・メイン @n 4 | このサンプルは、ポート入力が高インピーダンスである事を利用 @n 5 | して、タッチスイッチに等価的に含まれる微小な静電容量を計測 @n 6 | する事で、タッチされている事を判断するものです。@n 7 | ・プルアップ抵抗は1Mオーム @n 8 | ・タッチパッドは銅版で10mm四方 @n 9 | ・タッチパッドは、ポリイミドテープなどで絶縁する @n 10 | 「ref_level_」は、実験的に求めている値で、平常時の値から決定 @n 11 | します。@n 12 | ※この値を表示したい場合は、「DISP_REF」を有効にします。@n 13 | ・ON/OFF の判定は簡易的なものなので、実用的にするには、積分 @n 14 | するなど、工夫が必要です。 15 | @author 平松邦仁 (hira@rvf-rc45.net) 16 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 17 | Released under the MIT license @n 18 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 19 | */ 20 | //=====================================================================// 21 | #include "common/renesas.hpp" 22 | 23 | #include "common/format.hpp" 24 | #include "common/fifo.hpp" 25 | #include "common/uart_io.hpp" 26 | #include "common/trb_io.hpp" 27 | 28 | // #define DISP_REF 29 | 30 | namespace { 31 | 32 | typedef device::trb_io TIMER_B; 33 | TIMER_B timer_b_; 34 | 35 | typedef utils::fifo BUFFER; 36 | typedef device::uart_io UART; 37 | UART uart_; 38 | 39 | // P1_0(20): 40 | typedef device::PORT INPUT; 41 | 42 | static const uint16_t ref_level_ = 16; 43 | 44 | uint16_t count_input_() 45 | { 46 | uint16_t n = 0; 47 | INPUT::DIR = 0; // 検出する場合だけ、「入力」にする。 48 | do { 49 | ++n; 50 | } while(INPUT::P() == 0) ; 51 | INPUT::DIR = 1; // 出力 52 | INPUT::P = 0; // 仮想コンデンサをショートしてリセット 53 | return n; 54 | } 55 | 56 | } 57 | 58 | extern "C" { 59 | 60 | void sci_putch(char ch) { 61 | uart_.putch(ch); 62 | } 63 | 64 | 65 | char sci_getch(void) { 66 | return uart_.getch(); 67 | } 68 | 69 | 70 | uint16_t sci_length() { 71 | return uart_.length(); 72 | } 73 | 74 | 75 | void sci_puts(const char* str) { 76 | uart_.puts(str); 77 | } 78 | 79 | 80 | void TIMER_RB_intr(void) { 81 | timer_b_.itask(); 82 | } 83 | 84 | 85 | void UART0_TX_intr(void) { 86 | uart_.isend(); 87 | } 88 | 89 | 90 | void UART0_RX_intr(void) { 91 | uart_.irecv(); 92 | } 93 | 94 | } 95 | 96 | 97 | // __attribute__ ((section (".exttext"))) 98 | int main(int argc, char *argv[]) 99 | { 100 | using namespace device; 101 | 102 | // クロック関係レジスタ・プロテクト解除 103 | PRCR.PRC0 = 1; 104 | 105 | // 高速オンチップオシレーターへ切り替え(20MHz) 106 | // ※ F_CLK を設定する事(Makefile内) 107 | OCOCR.HOCOE = 1; 108 | utils::delay::micro_second(1); // >=30us(125KHz) 109 | SCKCR.HSCKSEL = 1; 110 | CKSTPR.SCKSEL = 1; 111 | 112 | // タイマーB初期化 113 | { 114 | uint8_t ir_level = 2; 115 | timer_b_.start(60, ir_level); 116 | } 117 | 118 | // UART の設定 (P1_4: TXD0[out], P1_5: RXD0[in]) 119 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 120 | { 121 | utils::PORT_MAP(utils::port_map::P14::TXD0); 122 | utils::PORT_MAP(utils::port_map::P15::RXD0); 123 | uint8_t intr_level = 1; 124 | uart_.start(57600, intr_level); 125 | } 126 | 127 | uart_.puts("Start R8C Touch switch sample\n"); 128 | 129 | #ifdef DISP_REF 130 | uint8_t cnt = 0; 131 | #endif 132 | bool level = false; 133 | while(1) { 134 | timer_b_.sync(); 135 | 136 | auto n = count_input_(); 137 | 138 | #ifdef DISP_REF 139 | ++cnt; 140 | if(cnt >= 30) { 141 | cnt = 0; 142 | utils::format("Touch count: %d\n") % n; 143 | } 144 | #endif 145 | 146 | bool lvl = false; 147 | if(n > ref_level_) { 148 | lvl = true; 149 | } 150 | 151 | if(!level && lvl) { // 押した瞬間を判定 152 | utils::format("ON\n"); 153 | } 154 | if(level && !lvl) { // 離した瞬間を判定 155 | utils::format("OFF\n"); 156 | } 157 | level = lvl; 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /M120AN/timer_rj.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief R8C/M110AN, R8C/M120AN グループ・タイマーRJレジスター定義 5 | @author 平松邦仁 (hira@rvf-rc45.net) 6 | @copyright Copyright (C) 2014, 2017 Kunihito Hiramatsu @n 7 | Released under the MIT license @n 8 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 9 | */ 10 | //=====================================================================// 11 | #include "common/io_utils.hpp" 12 | 13 | namespace device { 14 | 15 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 16 | /*! 17 | @brief タイマRJカウンタレジスタ TRJ 18 | */ 19 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 20 | static rw16_t<0x00D8> TRJ; 21 | 22 | 23 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 24 | /*! 25 | @brief タイマRJ制御レジスタ TRJCR 26 | */ 27 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 28 | struct trjcr_t : public rw8_t<0x00DA> { 29 | typedef rw8_t<0x00DA> io_; 30 | using io_::operator =; 31 | using io_::operator (); 32 | using io_::operator |=; 33 | using io_::operator &=; 34 | 35 | bit_rw_t TSTART; 36 | bit_rw_t TCSTF; 37 | bit_rw_t TSTOP; 38 | bit_rw_t TEDGF; 39 | bit_rw_t TUNDF; 40 | }; 41 | static trjcr_t TRJCR; 42 | 43 | 44 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 45 | /*! 46 | @brief タイマRJ I/O 制御レジスタ TRJIOC 47 | */ 48 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 49 | struct trjioc_t : public rw8_t<0x00DB> { 50 | typedef rw8_t<0x00DB> io_; 51 | using io_::operator =; 52 | using io_::operator (); 53 | using io_::operator |=; 54 | using io_::operator &=; 55 | 56 | bit_rw_t TEDGSEL; 57 | bit_rw_t TOPCR; 58 | bits_rw_t TIPF; 59 | bits_rw_t TIOGT; 60 | }; 61 | static trjioc_t TRJIOC; 62 | 63 | 64 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 65 | /*! 66 | @brief タイマRJモードレジスタ TRJMR 67 | */ 68 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 69 | struct trjmr_t : public rw8_t<0x00DC> { 70 | typedef rw8_t<0x00DC> io_; 71 | using io_::operator =; 72 | using io_::operator (); 73 | using io_::operator |=; 74 | using io_::operator &=; 75 | 76 | bits_rw_t TMOD; 77 | bit_rw_t TEDGPL; 78 | bits_rw_t TCK; 79 | bit_rw_t TCKCUT; 80 | }; 81 | static trjmr_t TRJMR; 82 | 83 | 84 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 85 | /*! 86 | @brief タイマRJイベント選択レジスタ TRJISR 87 | */ 88 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 89 | struct trjisr_t : public rw8_t<0x00DD> { 90 | typedef rw8_t<0x00DD> io_; 91 | using io_::operator =; 92 | using io_::operator (); 93 | using io_::operator |=; 94 | using io_::operator &=; 95 | 96 | bits_rw_t RCCPSEL; 97 | bit_rw_t RCCPSEL2; 98 | }; 99 | static trjisr_t TRJISR; 100 | 101 | 102 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 103 | /*! 104 | @brief タイマRJ割り込み制御レジスタ TRJIR 105 | */ 106 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 107 | struct trjir_t : public rw8_t<0x00DE> { 108 | typedef rw8_t<0x00DE> io_; 109 | using io_::operator =; 110 | using io_::operator (); 111 | using io_::operator |=; 112 | using io_::operator &=; 113 | 114 | bit_rw_t TRJIF; 115 | bit_rw_t TRJIE; 116 | }; 117 | static trjir_t TRJIR; 118 | 119 | } 120 | -------------------------------------------------------------------------------- /pfatfs/src/pffconf.h: -------------------------------------------------------------------------------- 1 | /*---------------------------------------------------------------------------/ 2 | / Petit FatFs - Configuration file R0.03 (C)ChaN, 2014 3 | /---------------------------------------------------------------------------*/ 4 | 5 | #ifndef _PFFCONF 6 | #define _PFFCONF 4004 /* Revision ID */ 7 | 8 | /*---------------------------------------------------------------------------/ 9 | / Function Configurations 10 | /---------------------------------------------------------------------------*/ 11 | 12 | #define _USE_READ 1 /* Enable pf_read() function */ 13 | #define _USE_DIR 1 /* Enable pf_opendir() and pf_readdir() function */ 14 | #define _USE_LSEEK 1 /* Enable pf_lseek() function */ 15 | #define _USE_WRITE 1 /* Enable pf_write() function */ 16 | 17 | #define _FS_FAT12 1 /* Enable FAT12 */ 18 | #define _FS_FAT16 1 /* Enable FAT16 */ 19 | #define _FS_FAT32 1 /* Enable FAT32 */ 20 | 21 | 22 | /*---------------------------------------------------------------------------/ 23 | / Locale and Namespace Configurations 24 | /---------------------------------------------------------------------------*/ 25 | 26 | #define _USE_LCC 1 /* Allow lower case characters for path name */ 27 | 28 | #define _CODE_PAGE 932 29 | /* The _CODE_PAGE specifies the code page to be used on the target system. 30 | / SBCS code pages with _USE_LCC == 1 requiers a 128 byte of case conversion 31 | / table. This might occupy RAM on some platforms, e.g. avr-gcc. 32 | / When _USE_LCC == 0, _CODE_PAGE has no effect. 33 | / 34 | / 932 - Japanese Shift_JIS (DBCS, OEM, Windows) 35 | / 936 - Simplified Chinese GBK (DBCS, OEM, Windows) 36 | / 949 - Korean (DBCS, OEM, Windows) 37 | / 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) 38 | / 1250 - Central Europe (Windows) 39 | / 1251 - Cyrillic (Windows) 40 | / 1252 - Latin 1 (Windows) 41 | / 1253 - Greek (Windows) 42 | / 1254 - Turkish (Windows) 43 | / 1255 - Hebrew (Windows) 44 | / 1256 - Arabic (Windows) 45 | / 1257 - Baltic (Windows) 46 | / 1258 - Vietnam (OEM, Windows) 47 | / 437 - U.S. (OEM) 48 | / 720 - Arabic (OEM) 49 | / 737 - Greek (OEM) 50 | / 775 - Baltic (OEM) 51 | / 850 - Multilingual Latin 1 (OEM) 52 | / 858 - Multilingual Latin 1 + Euro (OEM) 53 | / 852 - Latin 2 (OEM) 54 | / 855 - Cyrillic (OEM) 55 | / 866 - Russian (OEM) 56 | / 857 - Turkish (OEM) 57 | / 862 - Hebrew (OEM) 58 | / 874 - Thai (OEM, Windows) 59 | */ 60 | 61 | 62 | /*---------------------------------------------------------------------------/ 63 | / System Configurations 64 | /---------------------------------------------------------------------------*/ 65 | 66 | #define _WORD_ACCESS 0 67 | /* The _WORD_ACCESS option is an only platform dependent option. It defines 68 | / which access method is used to the word data on the FAT volume. 69 | / 70 | / 0: Byte-by-byte access. Always compatible with all platforms. 71 | / 1: Word access. Do not choose this unless under both the following conditions. 72 | / 73 | / * Address misaligned memory access is always allowed for ALL instructions. 74 | / * Byte order on the memory is little-endian. 75 | / 76 | / If it is the case, _WORD_ACCESS can also be set to 1 to improve performance and 77 | / reduce code size. Following table shows an example of some processor types. 78 | / 79 | / ARM7TDMI 0 ColdFire 0 V850E 0 80 | / Cortex-M3 0 Z80 0/1 V850ES 0/1 81 | / Cortex-M0 0 RX600(LE) 0/1 TLCS-870 0/1 82 | / AVR 0/1 RX600(BE) 0 TLCS-900 0/1 83 | / AVR32 0 RL78 0 R32C 0 84 | / PIC18 0/1 SH-2 0 M16C 0/1 85 | / PIC24 0 H8S 0 MSP430 0 86 | / PIC32 0 H8/300H 0 x86 0/1 87 | */ 88 | 89 | #endif /* _PFFCONF */ 90 | -------------------------------------------------------------------------------- /ADC_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C ADC メイン (5V 動作) @n 4 | アナログ入力0:P10_AN0 (20) @n 5 | アナログ入力1:P11_AN1 (19) 6 | @author 平松邦仁 (hira@rvf-rc45.net) 7 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 8 | Released under the MIT license @n 9 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 10 | */ 11 | //=====================================================================// 12 | #include "common/renesas.hpp" 13 | 14 | #include "common/format.hpp" 15 | #include "common/fifo.hpp" 16 | #include "common/uart_io.hpp" 17 | #include "common/adc_io.hpp" 18 | #include "common/trb_io.hpp" 19 | 20 | namespace { 21 | 22 | typedef device::trb_io TIMER_B; 23 | TIMER_B timer_b_; 24 | 25 | typedef utils::fifo TX_BUFF; // 送信バッファ 26 | typedef utils::fifo RX_BUFF; // 受信バッファ 27 | typedef device::uart_io UART; 28 | UART uart_; 29 | 30 | // 電源電圧を10倍した整数を設定 31 | // constexpr int16_t VCC = 50; ///< 5.0V (1.25) 32 | constexpr int16_t VCC = 33; ///< 3.3V (0.825) 33 | 34 | typedef device::adc_io ADC; 35 | ADC adc_; 36 | } 37 | 38 | extern "C" { 39 | 40 | void sci_putch(char ch) { 41 | uart_.putch(ch); 42 | } 43 | 44 | 45 | char sci_getch(void) { 46 | return uart_.getch(); 47 | } 48 | 49 | 50 | uint16_t sci_length() { 51 | return uart_.length(); 52 | } 53 | 54 | 55 | void sci_puts(const char* str) { 56 | uart_.puts(str); 57 | } 58 | 59 | 60 | void TIMER_RB_intr(void) { 61 | timer_b_.itask(); 62 | } 63 | 64 | 65 | void UART0_TX_intr(void) { 66 | uart_.isend(); 67 | } 68 | 69 | 70 | void UART0_RX_intr(void) { 71 | uart_.irecv(); 72 | } 73 | 74 | } 75 | 76 | 77 | // __attribute__ ((section (".exttext"))) 78 | int main(int argc, char *argv[]) 79 | { 80 | using namespace device; 81 | 82 | // クロック関係レジスタ・プロテクト解除 83 | PRCR.PRC0 = 1; 84 | 85 | // 高速オンチップオシレーターへ切り替え(20MHz) 86 | // ※ F_CLK を設定する事(Makefile内) 87 | OCOCR.HOCOE = 1; 88 | utils::delay::micro_second(1); // >=30us(125KHz) 89 | SCKCR.HSCKSEL = 1; 90 | CKSTPR.SCKSEL = 1; 91 | 92 | // インターバルタイマー開始(タイマーB) 93 | { 94 | uint8_t ir_level = 2; 95 | timer_b_.start(60, ir_level); 96 | } 97 | 98 | // UART の設定 (P1_4: TXD0[out], P1_5: RXD0[in]) 99 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 100 | { 101 | utils::PORT_MAP(utils::port_map::P14::TXD0); 102 | utils::PORT_MAP(utils::port_map::P15::RXD0); 103 | uint8_t intr_level = 1; 104 | uart_.start(57600, intr_level); 105 | } 106 | 107 | uart_.puts("Start R8C ADC sample\n"); 108 | 109 | // ADC の設定 110 | { 111 | utils::PORT_MAP(utils::port_map::P10::AN0); 112 | utils::PORT_MAP(utils::port_map::P11::AN1); 113 | adc_.start(ADC::CH_TYPE::CH0_CH1, ADC::CH_GROUP::AN0_AN1, true); 114 | } 115 | 116 | uint8_t cnt = 0; 117 | uint16_t nnn = 0; 118 | while(1) { 119 | timer_b_.sync(); 120 | 121 | ++cnt; 122 | if(cnt >= 30) { 123 | cnt = 0; 124 | adc_.scan(); 125 | adc_.sync(); 126 | // 「%3.2:8y」は小数点以下 8 ビットの固定小数点を 3 桁、小数点以下 2 桁表示 127 | // 5V の場合 1.25 倍して、小数点以下 8 ビットで、1023 で 5V 表示となる。 128 | // 3.3V の場合 0.825 倍して、小数点以下 8 ビットで、1023 で 3.3V 表示となる。 129 | { 130 | auto v = adc_.get_value(0); 131 | utils::format("(%5d) CH0: %3.2:8y[V], %d\n") 132 | % nnn 133 | % static_cast(((v + 1) * VCC) / (1024 * 10 / 256)) 134 | % v; 135 | } 136 | 137 | { 138 | auto v = adc_.get_value(1); 139 | utils::format(" CH1: %3.2:8y[V], %d\n") 140 | % static_cast(((v + 1) * VCC) / (1024 * 10 / 256)) 141 | % v; 142 | } 143 | ++nnn; 144 | } 145 | 146 | if(uart_.length() != 0) { // UART のレシーブデータがあるか? 147 | auto ch = uart_.getch(); 148 | uart_.putch(ch); 149 | } 150 | } 151 | } 152 | -------------------------------------------------------------------------------- /chip/ENCODER.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief ロータリー・エンコーダーデコード クラス @n 5 | ※入力のプルアップ抵抗は外部に取り付ける(マイコン内蔵プルアップは、抵抗値が大きいので適さない) @n 6 | ※外部接続の抵抗は、通常5K~10K、ロータリーエンコーダーのマニュアルを参照 7 | @copyright Copyright (C) 2021 Kunihito Hiramatsu @n 8 | Released under the MIT license @n 9 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 10 | */ 11 | //=====================================================================// 12 | #include 13 | 14 | namespace chip { 15 | 16 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 17 | /*! 18 | @brief ロータリー・エンコーダー ベースクラス 19 | */ 20 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 21 | class ENCODER_BASE { 22 | public: 23 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 24 | /*! 25 | @brief デコード型 26 | */ 27 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 28 | enum class DECODE { 29 | PHA_POS, ///< PHA の立ち上がりエッジで評価する 30 | PHA_POS_NEG, ///< PHA の立ち上がり、立下りエッジで評価する 31 | ALL, ///< PHA, PHB 全てのエッジで評価する 32 | }; 33 | }; 34 | 35 | 36 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 37 | /*! 38 | @brief ロータリー・エンコーダー テンプレートクラス 39 | @param[in] PHA A相入力 40 | @param[in] PHB B相入力 41 | @param[in] VTYPE カウンターの型 42 | @param[in] decode デコードの仕様 43 | */ 44 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 45 | template 46 | class ENCODER : public ENCODER_BASE { 47 | 48 | volatile VTYPE count_; 49 | uint8_t lvl_; 50 | 51 | uint8_t input_() { return static_cast(PHA::P()) | (static_cast(PHB::P()) << 1); } 52 | 53 | public: 54 | //-----------------------------------------------------------------// 55 | /*! 56 | @brief 開始 57 | */ 58 | //-----------------------------------------------------------------// 59 | void start() noexcept 60 | { 61 | PHA::DIR = 0; 62 | PHB::DIR = 0; 63 | count_ = 0; 64 | lvl_ = input_(); 65 | } 66 | 67 | 68 | //-----------------------------------------------------------------// 69 | /*! 70 | @brief サービス @n 71 | ※通常割り込みから呼ばれる。 @n 72 | ロータリーエンコーダーのチャタリング仕様により、呼び出す周期を調整する。 73 | */ 74 | //-----------------------------------------------------------------// 75 | void service() noexcept 76 | { 77 | uint8_t lvl = input_(); 78 | uint8_t pos = ~lvl_ & lvl; 79 | uint8_t neg = lvl_ & ~lvl; 80 | lvl_ = lvl; 81 | 82 | if((pos & 0b01) != 0) { // A 相の立ち上がり 83 | if((lvl & 0b10) != 0) count_--; 84 | else count_++; 85 | } 86 | if(decode == DECODE::PHA_POS_NEG || decode == DECODE::ALL) { 87 | if((neg & 0b01) != 0) { // A 相の立ち下がり 88 | if((lvl & 0b10) != 0) count_++; 89 | else count_--; 90 | } 91 | } 92 | if(decode == DECODE::ALL) { 93 | if((pos & 0b10) != 0) { // B 相の立ち上がり 94 | if((lvl & 0b01) != 0) count_++; 95 | else count_--; 96 | } 97 | if((neg & 0b10) != 0) { // B 相の立ち下がり 98 | if((lvl & 0b01) != 0) count_--; 99 | else count_++; 100 | } 101 | } 102 | } 103 | 104 | 105 | //-----------------------------------------------------------------// 106 | /*! 107 | @brief カウンターの取得 108 | @return カウンター 109 | */ 110 | //-----------------------------------------------------------------// 111 | auto get_count() const noexcept { return count_; } 112 | 113 | 114 | //-----------------------------------------------------------------// 115 | /*! 116 | @brief () オペレーター 117 | */ 118 | //-----------------------------------------------------------------// 119 | void operator () () { 120 | service(); 121 | } 122 | }; 123 | } 124 | -------------------------------------------------------------------------------- /THERMISTOR_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C サーミスタ・メイン (5V 動作) @n 4 | ※ADC_sample を参考 @n 5 | サーミスター接続:P10_AN0 (20) @n 6 | サーミスター: NT103_41G, VCC 側 @n 7 | 分圧抵抗:10K, GND 側 @n 8 | P10 -+-TH---VCC @n 9 | | @n 10 | +-10K---GND 11 | @author 平松邦仁 (hira@rvf-rc45.net) 12 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 13 | Released under the MIT license @n 14 | https://github.com/hirakuni45/RX/blob/master/LICENSE 15 | */ 16 | //=====================================================================// 17 | #include "common/renesas.hpp" 18 | 19 | #include "common/format.hpp" 20 | #include "common/fifo.hpp" 21 | #include "common/uart_io.hpp" 22 | #include "common/adc_io.hpp" 23 | #include "common/trb_io.hpp" 24 | 25 | // サーミスター、温度変換テンプレートクラス 26 | #include "chip/NTCTH.hpp" 27 | 28 | namespace { 29 | 30 | typedef device::trb_io TIMER_B; 31 | TIMER_B timer_b_; 32 | 33 | typedef utils::fifo TX_BUFF; // 送信バッファ 34 | typedef utils::fifo RX_BUFF; // 受信バッファ 35 | typedef device::uart_io UART; 36 | UART uart_; 37 | 38 | // 電源電圧を10倍した整数を設定 39 | // constexpr int16_t VCC = 50; ///< 5.0V (1.25) 40 | constexpr int16_t VCC = 33; ///< 3.3V (0.825) 41 | typedef device::adc_io ADC; 42 | ADC adc_; 43 | 44 | // サーミスタ定義: 45 | // A/D: 10 bits (1023), HX103_3380, 分圧抵抗: 10K (10000) オーム、サーミスタ: VCC側 46 | typedef chip::NTCTH<1023, chip::thermistor::HX103_3380, 10000, true> THMISTER; 47 | THMISTER thmister_; 48 | 49 | } 50 | 51 | extern "C" { 52 | 53 | void sci_putch(char ch) { 54 | uart_.putch(ch); 55 | } 56 | 57 | 58 | char sci_getch(void) { 59 | return uart_.getch(); 60 | } 61 | 62 | 63 | uint16_t sci_length() { 64 | return uart_.length(); 65 | } 66 | 67 | 68 | void sci_puts(const char* str) { 69 | uart_.puts(str); 70 | } 71 | 72 | 73 | void TIMER_RB_intr(void) { 74 | timer_b_.itask(); 75 | } 76 | 77 | 78 | void UART0_TX_intr(void) { 79 | uart_.isend(); 80 | } 81 | 82 | 83 | void UART0_RX_intr(void) { 84 | uart_.irecv(); 85 | } 86 | 87 | } 88 | 89 | 90 | // __attribute__ ((section (".exttext"))) 91 | int main(int argc, char *argv[]) 92 | { 93 | using namespace device; 94 | 95 | // クロック関係レジスタ・プロテクト解除 96 | PRCR.PRC0 = 1; 97 | 98 | // 高速オンチップオシレーターへ切り替え(20MHz) 99 | // ※ F_CLK を設定する事(Makefile内) 100 | OCOCR.HOCOE = 1; 101 | utils::delay::micro_second(1); // >=30us(125KHz) 102 | SCKCR.HSCKSEL = 1; 103 | CKSTPR.SCKSEL = 1; 104 | 105 | // インターバルタイマー開始(タイマーB) 106 | { 107 | uint8_t ir_level = 2; 108 | timer_b_.start(60, ir_level); 109 | } 110 | 111 | // UART の設定 (P1_4: TXD0[out], P1_5: RXD0[in]) 112 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 113 | { 114 | utils::PORT_MAP(utils::port_map::P14::TXD0); 115 | utils::PORT_MAP(utils::port_map::P15::RXD0); 116 | uint8_t intr_level = 1; 117 | uart_.start(57600, intr_level); 118 | } 119 | 120 | uart_.puts("Start R8C THERMISTOR sample\n"); 121 | 122 | // ADC の設定 123 | { 124 | utils::PORT_MAP(utils::port_map::P10::AN0); 125 | adc_.start(ADC::CH_TYPE::CH0, ADC::CH_GROUP::AN0_AN1, true); 126 | } 127 | 128 | uint8_t cnt = 0; 129 | uint16_t nnn = 0; 130 | while(1) { 131 | timer_b_.sync(); 132 | 133 | ++cnt; 134 | if(cnt >= 30) { 135 | cnt = 0; 136 | adc_.scan(); 137 | adc_.sync(); 138 | { 139 | auto v = adc_.get_value(0); 140 | utils::format("(%5d) CH0: %3.2:8y[V], %d\n") 141 | % nnn 142 | % static_cast(((v + 1) * VCC) / (1024 * 10 / 256)) 143 | % v; 144 | 145 | utils::format("温度: %5.2f [度]\n") % thmister_(v); 146 | } 147 | 148 | ++nnn; 149 | } 150 | 151 | if(uart_.length() !=0) { // UART のレシーブデータがあるか? 152 | auto ch = uart_.getch(); 153 | uart_.putch(ch); 154 | } 155 | } 156 | } 157 | -------------------------------------------------------------------------------- /chip/AD985X.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief AD985X class @n 5 | ANALOG DEVICES @n 6 | Interface: SPI, Vcc: 2.7V to 5V @n 7 | Vcc: 2.7V ---> MAX 100MHz @n 8 | Vcc: 3.3V ---> MAX 125MHz @n 9 | Vcc: 5.0V ---> MAX 180MHz @n 10 | AD9850: Up to 125MHz @n 11 | AD9851: Up to 180MHz 12 | @author 平松邦仁 (hira@rvf-rc45.net) 13 | @copyright Copyright (C) 2019 Kunihito Hiramatsu @n 14 | Released under the MIT license @n 15 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 16 | */ 17 | //=====================================================================// 18 | #include 19 | #include "common/delay.hpp" 20 | 21 | namespace chip { 22 | 23 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 24 | /*! 25 | @brief AD985X テンプレートクラス 26 | @param[in] D7 ポート・クラス 27 | @param[in] W_CLK ポート・クラス 28 | @param[in] FQ_UD ポート・クラス(FQ_UpdDate) 29 | @param[in] RESET ポート・クラス 30 | @param[in] BASEC ベースクロック(AD9850:125, AD9851:180) 31 | */ 32 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 33 | template 34 | class AD985X { 35 | 36 | void write_byte_(uint8_t d) { 37 | for(uint8_t i = 0; i < 8; ++i) { 38 | D7::P = d & 1; 39 | d >>= 1; 40 | W_CLK::P = 1; 41 | utils::delay::micro_second(1); 42 | W_CLK::P = 0; 43 | utils::delay::micro_second(1); 44 | } 45 | } 46 | 47 | public: 48 | //-----------------------------------------------------------------// 49 | /*! 50 | @brief コンストラクタ 51 | */ 52 | //-----------------------------------------------------------------// 53 | AD985X() noexcept 54 | { } 55 | 56 | 57 | //-----------------------------------------------------------------// 58 | /*! 59 | @brief 開始 60 | */ 61 | //-----------------------------------------------------------------// 62 | void start() 63 | { 64 | RESET::DIR = 1; 65 | RESET::P = 0; 66 | W_CLK::DIR = 1; 67 | W_CLK::P = 0; 68 | FQ_UD::DIR = 1; 69 | FQ_UD::P = 0; 70 | D7::DIR = 1; 71 | D7::P = 0; 72 | } 73 | 74 | 75 | //-----------------------------------------------------------------// 76 | /*! 77 | @brief リセット 78 | */ 79 | //-----------------------------------------------------------------// 80 | void reset() 81 | { 82 | W_CLK::P = 0; 83 | FQ_UD::P = 0; 84 | 85 | // RESET signal 86 | RESET::P = 0; 87 | utils::delay::micro_second(1); 88 | RESET::P = 1; 89 | utils::delay::micro_second(1); 90 | RESET::P = 0; 91 | // W_CLK signal 92 | W_CLK::P = 0; 93 | utils::delay::micro_second(1); 94 | W_CLK::P = 1; 95 | utils::delay::micro_second(1); 96 | W_CLK::P = 0; 97 | // FQ_UD signal 98 | FQ_UD::P = 0; 99 | utils::delay::micro_second(1); 100 | FQ_UD::P = 1; 101 | utils::delay::micro_second(1); 102 | FQ_UD::P = 0; 103 | } 104 | 105 | 106 | //-----------------------------------------------------------------// 107 | /*! 108 | @brief レジスターを設定 109 | @param[in] w0 W0 レジスター値 110 | @param[in] freq 周波数 111 | */ 112 | //-----------------------------------------------------------------// 113 | void set_reg(uint8_t w0, float freq) 114 | { 115 | double x = 4294967295.0 / static_cast(BASEC); 116 | double frequence = static_cast(freq) / 1000000.0; 117 | uint32_t y = static_cast(frequence * x); 118 | 119 | write_byte_(y); 120 | y >>= 8; 121 | write_byte_(y); 122 | y >>= 8; 123 | write_byte_(y); 124 | y >>= 8; 125 | write_byte_(y); 126 | write_byte_(w0); 127 | 128 | FQ_UD::P = 1; 129 | utils::delay::micro_second(1); 130 | FQ_UD::P = 0; 131 | } 132 | }; 133 | } 134 | -------------------------------------------------------------------------------- /FAMIPAD_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C ファミコン互換パッド入力、サンプル @n 4 | Maybe (4021B) 8-Stage Static Shift Register @n 5 | B0: DIR-Right @n 6 | B1: DIR-Left @n 7 | B2: DIR-Down @n 8 | B3: DIR-Up @n 9 | B4: START @n 10 | B5: SELECT @n 11 | B6: B @n 12 | B7: A 13 | @author 平松邦仁 (hira@rvf-rc45.net) 14 | @copyright Copyright (C) 2018 Kunihito Hiramatsu @n 15 | Released under the MIT license @n 16 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 17 | */ 18 | //=====================================================================// 19 | #include "common/renesas.hpp" 20 | 21 | #include "common/format.hpp" 22 | #include "common/fifo.hpp" 23 | #include "common/uart_io.hpp" 24 | #include "common/trb_io.hpp" 25 | 26 | namespace { 27 | typedef utils::fifo buffer; 28 | typedef device::uart_io uart; 29 | uart uart_; 30 | 31 | typedef device::trb_io timer_b; 32 | timer_b timer_b_; 33 | 34 | // RED: +V, YELOW: GND, BLUE: P/S, BROWN: CLK, WHITE: OUT 35 | typedef device::PORT PAD_PS; 36 | typedef device::PORT PAD_CLK; 37 | typedef device::PORT PAD_OUT; 38 | } 39 | 40 | extern "C" { 41 | 42 | void sci_putch(char ch) { 43 | uart_.putch(ch); 44 | } 45 | 46 | 47 | char sci_getch(void) { 48 | return uart_.getch(); 49 | } 50 | 51 | 52 | uint16_t sci_length() { 53 | return uart_.length(); 54 | } 55 | 56 | 57 | void sci_puts(const char* str) { 58 | uart_.puts(str); 59 | } 60 | 61 | 62 | void TIMER_RB_intr(void) { 63 | timer_b_.itask(); 64 | } 65 | 66 | 67 | void UART0_TX_intr(void) { 68 | uart_.isend(); 69 | } 70 | 71 | 72 | void UART0_RX_intr(void) { 73 | uart_.irecv(); 74 | } 75 | 76 | } 77 | 78 | namespace { 79 | 80 | uint8_t inp_lvl_ = 0; 81 | uint8_t inp_pos_ = 0; 82 | uint8_t inp_neg_ = 0; 83 | 84 | void switch_service_() 85 | { 86 | uint8_t lvl = ~device::P1(); ///< 状態の取得 87 | inp_pos_ = ~inp_lvl_ & lvl; ///< 立ち上がりエッジ検出 88 | inp_neg_ = inp_lvl_ & ~lvl; ///< 立ち下がりエッジ検出 89 | inp_lvl_ = lvl; ///< 状態のセーブ 90 | } 91 | } 92 | 93 | int main(int argc, char *argv[]) 94 | { 95 | using namespace device; 96 | 97 | // クロック関係レジスタ・プロテクト解除 98 | PRCR.PRC0 = 1; 99 | 100 | // 高速オンチップオシレーターへ切り替え(20MHz) 101 | // ※ F_CLK を設定する事(Makefile内) 102 | OCOCR.HOCOE = 1; 103 | utils::delay::micro_second(1); // >=30uS(125KHz) 104 | SCKCR.HSCKSEL = 1; 105 | CKSTPR.SCKSEL = 1; 106 | 107 | // タイマーB初期化 108 | { 109 | uint8_t ir_level = 2; 110 | timer_b_.start(60, ir_level); 111 | } 112 | 113 | // UART の設定 (P1_4: TXD0[in], P1_5: RXD0[in]) 114 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 115 | { 116 | utils::PORT_MAP(utils::port_map::P14::TXD0); 117 | utils::PORT_MAP(utils::port_map::P15::RXD0); 118 | uint8_t ir_level = 1; 119 | uart_.start(57600, ir_level); 120 | } 121 | 122 | { 123 | utils::PORT_MAP(utils::port_map::P10::PORT); 124 | utils::PORT_MAP(utils::port_map::P11::PORT); 125 | utils::PORT_MAP(utils::port_map::P12::PORT); 126 | PAD_PS::DIR = 1; 127 | PAD_CLK::DIR = 1; 128 | PAD_OUT::DIR = 0; 129 | } 130 | 131 | sci_puts("Start R8C FAMI-PAD sample\n"); 132 | 133 | uint8_t cnt = 0; 134 | uint8_t data = 0; 135 | while(1) { 136 | timer_b_.sync(); 137 | 138 | PAD_PS::P = 0; // seirial 139 | uint8_t d = 0; 140 | for(uint8_t i = 0; i < 8; ++i) { 141 | d <<= 1; 142 | if(!PAD_OUT::P()) ++d; 143 | PAD_CLK::P = 1; 144 | utils::delay::micro_second(1); 145 | PAD_CLK::P = 0; 146 | utils::delay::micro_second(1); 147 | } 148 | PAD_PS::P = 1; // parallel 149 | 150 | if(data != d) { 151 | data = d; 152 | utils::format("%08b\n") % static_cast(data); 153 | } 154 | 155 | ++cnt; 156 | if(cnt >= 60) cnt = 0; 157 | } 158 | } 159 | -------------------------------------------------------------------------------- /chip/UC1701.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief UC1701 LCD ドライバー @n 5 | Copyright 2016 Kunihito Hiramatsu 6 | @author 平松邦仁 (hira@rvf-rc45.net) 7 | */ 8 | //=====================================================================// 9 | #include 10 | #include "common/delay.hpp" 11 | 12 | namespace chip { 13 | 14 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 15 | /*! 16 | @brief UC1701 テンプレートクラス 17 | @param[in] CSI_IO CSI(SPI) 制御クラス 18 | @param[in] CS デバイス選択、レジスター選択、制御クラス 19 | @param[in] A0 制御切り替え、レジスター選択、制御クラス 20 | */ 21 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 22 | template 23 | class UC1701 { 24 | 25 | CSI_IO& csi_; 26 | 27 | inline void write_(uint8_t cmd) { 28 | csi_.xchg(cmd); 29 | } 30 | 31 | inline void chip_enable_(bool f = true) const { 32 | CS::P = !f; 33 | } 34 | 35 | inline void reg_select_(bool f) const { 36 | A0::P = f; 37 | } 38 | 39 | 40 | void init_() { 41 | reg_select_(0); 42 | chip_enable_(); 43 | 44 | // Set the LCD parameters... 45 | write_(0xE2); // System Reset 46 | write_(0x40); // Set display start line to 0 47 | write_(0xA1); // Set SEG Direction 48 | write_(0xC0); // Set COM Direction 49 | write_(0xA2); // Set Bias = 1/9 50 | write_(0x2C); // Boost ON 51 | write_(0x2E); // Voltage Regular On 52 | write_(0x2F); // Voltage Follower On 53 | write_(0xF8); // Set booster ratio to 54 | write_(0x00); // 4x 55 | write_(0x23); // Set Resistor Ratio = 3 56 | write_(0x81); 57 | write_(0x28); // Set Electronic Volume = 40 58 | write_(0xAC); // Set Static indicator off 59 | write_(0x00); 60 | // write_(0xA6); // Disable inverse 61 | 62 | write_(0xAF); // Set Display Enable 63 | utils::delay::milli_second(100); 64 | write_(0xA5); // display all points 65 | utils::delay::milli_second(200); 66 | write_(0xA4); // normal display 67 | } 68 | 69 | void set_pointer_(uint8_t x, uint8_t y) 70 | { 71 | x += 4; 72 | 73 | uint8_t i = (x & 0xF0)>>4; 74 | uint8_t j = x & 0x0F; 75 | // digitalWrite(this->pin_cs1, LOW); 76 | write_(0xB0 + y); // 0 to 7 77 | write_(0x10 + i); 78 | write_(j); 79 | } 80 | 81 | public: 82 | //-----------------------------------------------------------------// 83 | /*! 84 | @brief コンストラクター 85 | */ 86 | //-----------------------------------------------------------------// 87 | UC1701(CSI_IO& csi) : csi_(csi) { } 88 | 89 | 90 | //-----------------------------------------------------------------// 91 | /*! 92 | @brief 開始 93 | @param[in] contrast コントラスト 94 | @param[in] comrvs コモンライン・リバースの場合:true 95 | */ 96 | //-----------------------------------------------------------------// 97 | void start(uint8_t contrast, bool comrvs = false) 98 | { 99 | CS::DIR = 1; // (/CS) output 100 | A0::DIR = 1; // (A0) output 101 | 102 | reg_select_(0); 103 | chip_enable_(false); 104 | 105 | utils::delay::milli_second(100); 106 | 107 | init_(); 108 | 109 | chip_enable_(false); 110 | } 111 | 112 | 113 | //-----------------------------------------------------------------// 114 | /*! 115 | @brief コピー 116 | @param[in] src フレームバッファソース 117 | @param[in] num 転送ページ数 118 | @param[in] ofs 転送オフセット 119 | */ 120 | //-----------------------------------------------------------------// 121 | void copy(const uint8_t* src, uint8_t num, uint8_t ofs = 0) { 122 | chip_enable_(); 123 | uint8_t ox = 0x00; 124 | for(uint8_t page = ofs; page < (ofs + num); ++page) { 125 | reg_select_(0); 126 | set_pointer_(ox, page); 127 | reg_select_(1); 128 | csi_.send(src, 128); 129 | src += 128; 130 | } 131 | reg_select_(0); 132 | chip_enable_(false); 133 | } 134 | 135 | }; 136 | } 137 | -------------------------------------------------------------------------------- /M120AN/flash.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief R8C/M110AN, R8C/M120AN グループ・フラッシュ・レジスター定義 5 | @author 平松邦仁 (hira@rvf-rc45.net) 6 | @copyright Copyright (C) 2014, 2017 Kunihito Hiramatsu @n 7 | Released under the MIT license @n 8 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 9 | */ 10 | //=====================================================================// 11 | #include "common/io_utils.hpp" 12 | 13 | namespace device { 14 | 15 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 16 | /*! 17 | @brief フラッシュメモリステータスレジスタ FST 18 | */ 19 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 20 | struct fst_t : public rw8_t<0x01A9> { 21 | typedef rw8_t<0x01A9> io_; 22 | using io_::operator =; 23 | using io_::operator (); 24 | using io_::operator |=; 25 | using io_::operator &=; 26 | 27 | bit_rw_t RDYSTI; 28 | bit_rw_t BSYAEI; 29 | bit_rw_t FST2; 30 | bit_rw_t FST3; 31 | bit_rw_t FST4; 32 | bit_rw_t FST5; 33 | bit_rw_t FST6; 34 | bit_rw_t FST7; 35 | }; 36 | static fst_t FST; 37 | 38 | 39 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 40 | /*! 41 | @brief フラッシュメモリ制御レジスタ0 FMR0 42 | */ 43 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 44 | struct fmr0_t : public rw8_t<0x01AA> { 45 | typedef rw8_t<0x01AA> io_; 46 | using io_::operator =; 47 | using io_::operator (); 48 | using io_::operator |=; 49 | using io_::operator &=; 50 | 51 | bit_rw_t FMR01; 52 | bit_rw_t FMR02; 53 | bit_rw_t FMSTP; 54 | bit_rw_t CMDRST; 55 | bit_rw_t CMDERIE; 56 | bit_rw_t BSYAEIE; 57 | bit_rw_t RDYSTIE; 58 | }; 59 | static fmr0_t FMR0; 60 | 61 | 62 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 63 | /*! 64 | @brief フラッシュメモリ制御レジスタ1 FMR1 65 | */ 66 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 67 | struct fmr1_t : public rw8_t<0x01AB> { 68 | typedef rw8_t<0x01AB> io_; 69 | using io_::operator =; 70 | using io_::operator (); 71 | using io_::operator |=; 72 | using io_::operator &=; 73 | 74 | bit_rw_t WTFMSTP; 75 | bit_rw_t FMR13; 76 | bit_rw_t FMR16; 77 | bit_rw_t FMR17; 78 | }; 79 | static fmr1_t FMR1; 80 | 81 | 82 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 83 | /*! 84 | @brief フラッシュメモリ制御レジスタ2 FMR2 85 | */ 86 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 87 | struct fmr2_t : public rw8_t<0x01AC> { 88 | typedef rw8_t<0x01AC> io_; 89 | using io_::operator =; 90 | using io_::operator (); 91 | using io_::operator |=; 92 | using io_::operator &=; 93 | 94 | bit_rw_t FMR20; 95 | bit_rw_t FMR21; 96 | bit_rw_t FMR22; 97 | bit_rw_t FMR27; 98 | }; 99 | static fmr2_t FMR2; 100 | 101 | 102 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 103 | /*! 104 | @brief フラッシュメモリリフレッシュ制御レジスタ FREFR 105 | */ 106 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 107 | struct frefr_t : public rw8_t<0x01AD> { 108 | typedef rw8_t<0x01AD> io_; 109 | using io_::operator =; 110 | using io_::operator (); 111 | using io_::operator |=; 112 | using io_::operator &=; 113 | 114 | bit_rw_t REF0; 115 | bit_rw_t REF1; 116 | bit_rw_t REF2; 117 | bit_rw_t REF3; 118 | bit_rw_t REF4; 119 | bit_rw_t REF5; 120 | }; 121 | static frefr_t FREFR; 122 | 123 | } 124 | -------------------------------------------------------------------------------- /chip/TX_MOD.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief TX_MOD ドライバー @n 5 | ※「RX_MOD.hpp」とペア 6 | @author 平松邦仁 (hira@rvf-rc45.net) 7 | @copyright Copyright (C) 2017 Kunihito Hiramatsu @n 8 | Released under the MIT license @n 9 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 10 | */ 11 | //=====================================================================// 12 | #include 13 | #include 14 | 15 | namespace chip { 16 | 17 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 18 | /*! 19 | @brief 送信データ変調 テンプレートクラス 20 | @param[in] PORT 送信ポートクラス(標準4)※必ず偶数 21 | @param[in] HNUM ヘッダー・フレーム数(標準4) 22 | @param[in] SNUM 転送最大数 23 | */ 24 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 25 | template 26 | class TX_MOD { 27 | 28 | volatile uint8_t head_; 29 | volatile uint8_t sync_; 30 | volatile uint8_t len_; 31 | uint8_t dat_; 32 | volatile uint8_t bit_pos_; 33 | 34 | uint8_t buff_[SNUM]; 35 | 36 | public: 37 | //-----------------------------------------------------------------// 38 | /*! 39 | @brief コンストラクター 40 | */ 41 | //-----------------------------------------------------------------// 42 | TX_MOD() noexcept : head_(0), sync_(0), len_(0), dat_(0), bit_pos_(0) { } 43 | 44 | 45 | //-----------------------------------------------------------------// 46 | /*! 47 | @brief 開始 48 | */ 49 | //-----------------------------------------------------------------// 50 | void start() noexcept 51 | { 52 | PORT::DIR = 1; // output 53 | PORT::P = 0; // 初期ポート値 54 | len_ = 0; 55 | head_ = 0; 56 | sync_ = 0; 57 | bit_pos_ = 0; 58 | } 59 | 60 | 61 | //-----------------------------------------------------------------// 62 | /*! 63 | @brief 転送状態を取得 64 | @return 転送中なら「true」 65 | */ 66 | //-----------------------------------------------------------------// 67 | bool probe() const noexcept { return len_ > 0; } 68 | 69 | 70 | //-----------------------------------------------------------------// 71 | /*! 72 | @brief 転送バイトを取得 73 | @return 転送バイト 74 | */ 75 | //-----------------------------------------------------------------// 76 | uint8_t get_send_pos() const noexcept { 77 | return bit_pos_ >> 3; 78 | } 79 | 80 | 81 | //-----------------------------------------------------------------// 82 | /*! 83 | @brief 送信要求 84 | @param[in] src 送信ソース 85 | @param[in] len 送信バイト数 86 | @return 送信開始なら「true」 87 | */ 88 | //-----------------------------------------------------------------// 89 | bool send(const void* src, uint8_t len) noexcept 90 | { 91 | if(len > SNUM ) return false; 92 | 93 | std::memcpy(buff_, src, len); 94 | head_ = 0; 95 | sync_ = 0; 96 | bit_pos_ = 0; 97 | len_ = len; 98 | return true; 99 | } 100 | 101 | 102 | //-----------------------------------------------------------------// 103 | /*! 104 | @brief サービス @n 105 | 正確なタイマー割り込みで起動されるタスク 106 | */ 107 | //-----------------------------------------------------------------// 108 | void service() noexcept 109 | { 110 | if(len_ == 0) return; 111 | 112 | if(head_ < HNUM) { 113 | PORT::P = head_ & 1; 114 | ++head_; 115 | } else if(sync_ < 2) { 116 | PORT::P = 0; 117 | ++sync_; 118 | dat_ = 2; 119 | } else if((bit_pos_ >> 3) < len_) { 120 | static const uint8_t mask[8] = { 121 | 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 122 | }; 123 | if(buff_[bit_pos_ >> 3] & mask[bit_pos_ & 7]) { 124 | PORT::P = !PORT::P(); 125 | } 126 | ++dat_; 127 | if(dat_ >= 2) { 128 | ++bit_pos_; 129 | dat_ = 0; 130 | } 131 | } else { 132 | len_ = 0; 133 | } 134 | } 135 | }; 136 | } 137 | -------------------------------------------------------------------------------- /RC_SERVO_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C RC-Servo メイン 4 | @author 平松邦仁 (hira@rvf-rc45.net) 5 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 6 | Released under the MIT license @n 7 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 8 | */ 9 | //=====================================================================// 10 | #include "common/renesas.hpp" 11 | 12 | #include "common/adc_io.hpp" 13 | #include "common/trc_io.hpp" 14 | #include "common/fifo.hpp" 15 | #include "common/uart_io.hpp" 16 | 17 | // どちらか片方を有効にする 18 | #define JR_TYPE_SERVO 19 | // #define FUTABA_TYPE_SERVO 20 | 21 | namespace { 22 | 23 | #ifdef JR_TYPE_SERVO 24 | static const uint16_t rcs_n_ = 3750; // ニュートラル(JR): 1500uS --> 3750 25 | static const uint16_t rcs_d_ = 1500; // 可動範囲(JR):+-600uS --> +-1500 26 | #endif 27 | 28 | #ifdef FUTABA_TYPE_SERVO 29 | static const uint16_t rcs_n_ = 3800; // ニュートラル(FUTABA): 1520uS --> 3800 30 | static const uint16_t rcs_d_ = 1500; // 可動範囲(JR):+-600uS --> +-1500 31 | #endif 32 | 33 | class timer_intr { 34 | static volatile uint8_t trc_sync_; 35 | 36 | public: 37 | void operator() () { 38 | ++trc_sync_; 39 | } 40 | 41 | void sync() const { 42 | volatile uint8_t v = trc_sync_; 43 | while(v == trc_sync_) { 44 | } 45 | } 46 | }; 47 | volatile uint8_t timer_intr::trc_sync_ = 0; 48 | 49 | typedef device::trc_io TRC; 50 | TRC timer_c_; 51 | 52 | typedef utils::fifo BUFFER; 53 | typedef device::uart_io UART; 54 | UART uart_; 55 | 56 | typedef device::adc_io ADC; 57 | ADC adc_; 58 | 59 | uint16_t calc_pwm_(uint16_t adc_value) 60 | { 61 | auto v = (static_cast(adc_value) * (rcs_d_ * 2)) >> 10; 62 | return v - rcs_d_ + rcs_n_; 63 | } 64 | } 65 | 66 | extern "C" { 67 | 68 | void sci_putch(char ch) { 69 | uart_.putch(ch); 70 | } 71 | 72 | 73 | char sci_getch(void) { 74 | return uart_.getch(); 75 | } 76 | 77 | 78 | uint16_t sci_length() { 79 | return uart_.length(); 80 | } 81 | 82 | 83 | void sci_puts(const char* str) { 84 | uart_.puts(str); 85 | } 86 | 87 | 88 | void UART0_TX_intr(void) { 89 | uart_.isend(); 90 | } 91 | 92 | 93 | void UART0_RX_intr(void) { 94 | uart_.irecv(); 95 | } 96 | 97 | 98 | void TIMER_RC_intr(void) { 99 | timer_c_.itask(); 100 | } 101 | 102 | } 103 | 104 | 105 | int main(int argc, char *argv[]) 106 | { 107 | using namespace device; 108 | 109 | // クロック関係レジスタ・プロテクト解除 110 | PRCR.PRC0 = 1; 111 | 112 | // 高速オンチップオシレーターへ切り替え(20MHz) 113 | // ※ F_CLK を設定する事(Makefile内) 114 | OCOCR.HOCOE = 1; 115 | utils::delay::micro_second(1); // >=30uS(125KHz) 116 | SCKCR.HSCKSEL = 1; 117 | CKSTPR.SCKSEL = 1; 118 | 119 | // UART の設定 (P1_4: TXD0[in], P1_5: RXD0[in]) 120 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 121 | { 122 | utils::PORT_MAP(utils::port_map::P14::TXD0); 123 | utils::PORT_MAP(utils::port_map::P15::RXD0); 124 | uint8_t ir_level = 1; 125 | uart_.start(57600, ir_level); 126 | } 127 | 128 | // ADC の設定(CH1のサイクルモード) 129 | // P10, P11 の A/D 変換 130 | { 131 | utils::PORT_MAP(utils::port_map::P10::AN0); 132 | utils::PORT_MAP(utils::port_map::P11::AN1); 133 | adc_.start(ADC::CH_TYPE::CH0_CH1, ADC::CH_GROUP::AN0_AN1, true); 134 | } 135 | 136 | // PWMモード設定 137 | { 138 | utils::PORT_MAP(utils::port_map::P12::TRCIOB); 139 | utils::PORT_MAP(utils::port_map::P13::TRCIOC); 140 | bool pfl = 0; // 0->1 141 | uint8_t ir_level = 2; 142 | timer_c_.start(50000, TRC::DIVIDE::F8, pfl, ir_level); 143 | timer_c_.set_pwm_b(rcs_n_); 144 | timer_c_.set_pwm_c(rcs_n_); 145 | } 146 | 147 | sci_puts("Start R8C RC-Servo monitor\n"); 148 | 149 | while(1) { 150 | timer_c_.task_.sync(); 151 | adc_.scan(); 152 | adc_.sync(); 153 | auto ch_a = calc_pwm_(adc_.get_value(0)); 154 | timer_c_.set_pwm_b(ch_a); 155 | auto ch_b = calc_pwm_(adc_.get_value(1)); 156 | timer_c_.set_pwm_c(ch_b); 157 | } 158 | } 159 | -------------------------------------------------------------------------------- /SWITCH_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C スイッチ入力、サンプル @n 4 | P1_0: SW0 (ON した場合に GND に接続、通常は抵抗でプルアップ) @n 5 | P1_1: SW1 (ON した場合に GND に接続、通常は抵抗でプルアップ) @n 6 | ※マイコン内蔵プルアップ抵抗を利用しているので、外部プルアップは省略出来る。 7 | @author 平松邦仁 (hira@rvf-rc45.net) 8 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 9 | Released under the MIT license @n 10 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 11 | */ 12 | //=====================================================================// 13 | #include "common/renesas.hpp" 14 | 15 | #include "common/format.hpp" 16 | #include "common/intr_utils.hpp" 17 | #include "common/fifo.hpp" 18 | #include "common/uart_io.hpp" 19 | #include "common/trb_io.hpp" 20 | 21 | namespace { 22 | 23 | typedef utils::fifo TX_BUFF; // 送信バッファ 24 | typedef utils::fifo RX_BUFF; // 受信バッファ 25 | typedef device::uart_io UART; 26 | UART uart_; 27 | 28 | // スイッチの定義 29 | // 解放で(1)、ON したら、(0) なので、論理を反転している。 30 | typedef device::PORT SW0; 31 | typedef device::PORT SW1; 32 | 33 | typedef device::trb_io TIMER_B; 34 | TIMER_B timer_b_; 35 | 36 | } 37 | 38 | extern "C" { 39 | 40 | void sci_putch(char ch) { 41 | uart_.putch(ch); 42 | } 43 | 44 | 45 | char sci_getch(void) { 46 | return uart_.getch(); 47 | } 48 | 49 | 50 | uint16_t sci_length() { 51 | return uart_.length(); 52 | } 53 | 54 | 55 | void sci_puts(const char* str) { 56 | uart_.puts(str); 57 | } 58 | 59 | 60 | void TIMER_RB_intr(void) { 61 | timer_b_.itask(); 62 | } 63 | 64 | 65 | void UART0_TX_intr(void) { 66 | uart_.isend(); 67 | } 68 | 69 | 70 | void UART0_RX_intr(void) { 71 | uart_.irecv(); 72 | } 73 | 74 | } 75 | 76 | namespace { 77 | 78 | uint8_t inp_lvl_ = 0; 79 | uint8_t inp_pos_ = 0; 80 | uint8_t inp_neg_ = 0; 81 | 82 | void switch_service_() 83 | { 84 | uint8_t lvl = SW0::P() | (SW1::P() << 1); ///< 状態の取得 85 | inp_pos_ = ~inp_lvl_ & lvl; ///< 立ち上がりエッジ検出(押した瞬間) 86 | inp_neg_ = inp_lvl_ & ~lvl; ///< 立ち下がりエッジ検出(離した瞬間) 87 | inp_lvl_ = lvl; ///< 状態のセーブ 88 | } 89 | } 90 | 91 | int main(int argc, char *argv[]) 92 | { 93 | using namespace device; 94 | 95 | // クロック関係レジスタ・プロテクト解除 96 | PRCR.PRC0 = 1; 97 | 98 | // 高速オンチップオシレーターへ切り替え(20MHz) 99 | // ※ F_CLK を設定する事(Makefile内) 100 | OCOCR.HOCOE = 1; 101 | utils::delay::micro_second(1); // >=30uS(125KHz) 102 | SCKCR.HSCKSEL = 1; 103 | CKSTPR.SCKSEL = 1; 104 | 105 | // タイマーB初期化 106 | { 107 | uint8_t ir_level = 2; 108 | timer_b_.start(60, ir_level); 109 | } 110 | 111 | // UART の設定 (P1_4: TXD0[in], P1_5: RXD0[in]) 112 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 113 | { 114 | utils::PORT_MAP(utils::port_map::P14::TXD0); 115 | utils::PORT_MAP(utils::port_map::P15::RXD0); 116 | uint8_t ir_level = 1; 117 | uart_.start(57600, ir_level); 118 | } 119 | 120 | // スイッチ入力の設定 P10、P11、COM:Vss 121 | { 122 | SW0::DIR = 0; 123 | SW1::DIR = 0; 124 | SW0::PU = 1; // 内蔵プルアップを有効 125 | SW1::PU = 1; // 内蔵プルアップを有効 126 | } 127 | 128 | sci_puts("Start R8C SWITCH sample\n"); 129 | 130 | uint8_t cnt = 0; 131 | while(1) { 132 | timer_b_.sync(); 133 | 134 | switch_service_(); 135 | 136 | if((inp_pos_ & 0b01) != 0) { // SW0 の押した瞬間 137 | sci_puts("SW0 - positive\n"); 138 | } 139 | if((inp_pos_ & 0b10) != 0) { // SW1 の押した瞬間 140 | sci_puts("SW1 - positive\n"); 141 | } 142 | 143 | if((inp_neg_ & 0b01) != 0) { // SW0 の離した瞬間 144 | sci_puts("SW0 - negative\n"); 145 | } 146 | if((inp_neg_ & 0b10) != 0) { // SW1 の離した瞬間 147 | sci_puts("SW1 - negative\n"); 148 | } 149 | 150 | if((inp_lvl_ & 0b01) != 0) { // SW0 の押している状態 151 | if((cnt % 30) == 0) { 152 | sci_puts("SW0 - ON\n"); 153 | } 154 | } 155 | if((inp_lvl_ & 0b10) != 0) { // SW1 の押している状態 156 | if((cnt % 30) == 0) { 157 | sci_puts("SW1 - ON\n"); 158 | } 159 | } 160 | 161 | ++cnt; 162 | if(cnt >= 60) cnt = 0; 163 | } 164 | } 165 | -------------------------------------------------------------------------------- /common/comp_io.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief R8C グループ・コンパレーター I/O 制御 5 | @author 平松邦仁 (hira@rvf-rc45.net) 6 | @copyright Copyright (C) 2015, 2017 Kunihito Hiramatsu @n 7 | Released under the MIT license @n 8 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 9 | */ 10 | //=====================================================================// 11 | #include "common/vect.h" 12 | #include "M120AN/system.hpp" 13 | #include "M120AN/intr.hpp" 14 | #include "M120AN/comp.hpp" 15 | 16 | namespace device { 17 | 18 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 19 | /*! 20 | @brief コンパレーター・フィルター 21 | */ 22 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 23 | enum class comp_filter { 24 | none, ///< 無し 25 | f1, 26 | f8, 27 | f32 28 | }; 29 | 30 | 31 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 32 | /*! 33 | @brief コンパレーター・エッジ 34 | */ 35 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 36 | enum class comp_edge { 37 | a_lt_r, ///< アナログ入力が基準入力より低い時 38 | a_gt_r, ///< アナログ入力が基準入力より高い時 39 | ltgt = 3, ///< 低いおよび高い時 40 | }; 41 | 42 | 43 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 44 | /*! 45 | @brief コンパレーター I/O 制御クラス 46 | @param[in] TASK1 コンパレーター1割り込み処理 47 | @param[in] TASK3 コンパレーター3割り込み処理 48 | */ 49 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 50 | template 51 | class comp_io { 52 | 53 | static TASK1 task1_; 54 | static TASK3 task3_; 55 | 56 | public: 57 | 58 | static inline void itask1() { 59 | task1_(); 60 | WCB1INTR.WCB1F = 0; 61 | } 62 | 63 | static inline void itask3() { 64 | task3_(); 65 | WCB3INTR.WCB3F = 0; 66 | } 67 | 68 | public: 69 | //-----------------------------------------------------------------// 70 | /*! 71 | @brief コンストラクター 72 | */ 73 | //-----------------------------------------------------------------// 74 | comp_io() { } 75 | 76 | 77 | //-----------------------------------------------------------------// 78 | /*! 79 | @brief チャネル1開始 80 | @param[in] et 比較モード 81 | @para,[in] fl フィルター 82 | */ 83 | //-----------------------------------------------------------------// 84 | void start1(comp_edge eg = comp_edge::ltgt, comp_filter fl = comp_filter::none, uint8_t ir_lvl = 0) const { 85 | WCMPR.WCB1M0 = 1; 86 | 87 | ILVL2.B01 = ir_lvl; 88 | if(ir_lvl) { 89 | WCB1INTR.WCB1FL = static_cast(fl); 90 | WCB1INTR.WCB1S = static_cast(eg); 91 | WCB1INTR.WCB1INTEN = 1; 92 | } else { 93 | WCB1INTR.WCB1INTEN = 0; 94 | } 95 | } 96 | 97 | 98 | //-----------------------------------------------------------------// 99 | /*! 100 | @brief チャネル3開始 101 | @param[in] et 比較モード 102 | @para,[in] fl フィルター 103 | */ 104 | //-----------------------------------------------------------------// 105 | void start3(comp_edge eg = comp_edge::ltgt, comp_filter fl = comp_filter::none, uint8_t ir_lvl = 0) const { 106 | WCMPR.WCB3M0 = 1; 107 | 108 | ILVL2.B45 = ir_lvl; 109 | if(ir_lvl) { 110 | WCB3INTR.WCB3FL = static_cast(fl); 111 | WCB3INTR.WCB3S = static_cast(eg); 112 | WCB3INTR.WCB3INTEN = 1; 113 | } else { 114 | WCB3INTR.WCB3INTEN = 0; 115 | } 116 | } 117 | 118 | 119 | //-----------------------------------------------------------------// 120 | /*! 121 | @brief チャネル1出力を取得 122 | @return チャネル1出力 123 | */ 124 | //-----------------------------------------------------------------// 125 | bool get_value1() const { 126 | return WCMPR.WCB1OUT(); 127 | } 128 | 129 | 130 | //-----------------------------------------------------------------// 131 | /*! 132 | @brief チャネル3出力を取得 133 | @return チャネル3出力 134 | */ 135 | //-----------------------------------------------------------------// 136 | bool get_value3() const { 137 | return WCMPR.WCB3OUT(); 138 | } 139 | }; 140 | 141 | } 142 | -------------------------------------------------------------------------------- /UART_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C UART サンプル @n 4 | ・8ビット1ストップ・ビット 5 | P1_0: LED1 @n 6 | P1_1: LED2 @n 7 | P1_4: TXD(output) @n 8 | P1_5: RXD(input) 9 | @author 平松邦仁 (hira@rvf-rc45.net) 10 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 11 | Released under the MIT license @n 12 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 13 | */ 14 | //=====================================================================// 15 | #include "common/renesas.hpp" 16 | 17 | #include "common/uart_io.hpp" 18 | #include "common/fifo.hpp" 19 | 20 | #include "common/command.hpp" 21 | 22 | #include "common/format.hpp" 23 | #include "common/input.hpp" 24 | 25 | namespace { 26 | 27 | // 指定ポートに「吸い込み」でLEDを接続 28 | typedef device::PORT LED0; 29 | typedef device::PORT LED1; 30 | 31 | typedef utils::fifo TX_BUFF; // 送信バッファ 32 | typedef utils::fifo RX_BUFF; // 受信バッファ 33 | typedef device::uart_io UART; 34 | UART uart_; 35 | 36 | utils::command<64> command_; 37 | 38 | } 39 | 40 | extern "C" { 41 | 42 | void sci_putch(char ch) { 43 | uart_.putch(ch); 44 | } 45 | 46 | 47 | char sci_getch(void) { 48 | return uart_.getch(); 49 | } 50 | 51 | 52 | uint16_t sci_length() { 53 | return uart_.length(); 54 | } 55 | 56 | 57 | void sci_puts(const char* str) { 58 | uart_.puts(str); 59 | } 60 | 61 | 62 | // 割り込み関数(プロトタイプは common/vect.h を参照) 63 | // ※ヘッダーで宣言している名称と正確に一致させる必要がある点に注意。 64 | void UART0_TX_intr(void) { 65 | uart_.isend(); 66 | } 67 | 68 | 69 | // 割り込み関数(プロトタイプは common/vect.h を参照) 70 | // ※ヘッダーで宣言している名称と正確に一致させる必要がある点に注意。 71 | void UART0_RX_intr(void) { 72 | uart_.irecv(); 73 | } 74 | 75 | }; 76 | 77 | 78 | int main(int argc, char *argv[]) 79 | { 80 | using namespace device; 81 | 82 | // クロック関係レジスタ・プロテクト解除 83 | PRCR.PRC0 = 1; 84 | 85 | // 高速オンチップオシレーターへ切り替え(20MHz) 86 | // ※ F_CLK を設定する事(Makefile内) 87 | OCOCR.HOCOE = 1; 88 | utils::delay::micro_second(1); // >=30us(125KHz) 89 | SCKCR.HSCKSEL = 1; 90 | CKSTPR.SCKSEL = 1; 91 | 92 | // UART の設定 (P1_4: TXD0[out], P1_5: RXD0[in]) 93 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 94 | { 95 | utils::PORT_MAP(utils::port_map::P14::TXD0); 96 | utils::PORT_MAP(utils::port_map::P15::RXD0); 97 | 98 | // ※「0」を設定するとポーリングとなる。 99 | uint8_t intr_level = 1; 100 | uart_.start(57600, intr_level); 101 | } 102 | 103 | // LED ポート設定 104 | { 105 | LED0::DIR = 1; 106 | LED1::DIR = 1; 107 | LED0::P = 0; 108 | LED1::P = 0; 109 | } 110 | 111 | uart_.puts("Start R8C UART sample\n"); 112 | 113 | utils::format("Real baud rate: %u\n") % uart_.get_real_baud_rate(); 114 | 115 | command_.set_prompt("# "); 116 | 117 | uint8_t cnt = 0; 118 | /// float a = 0.754; 119 | while(1) { 120 | 121 | if(command_.service()) { 122 | auto cmdn = command_.get_words(); 123 | if(cmdn >= 1) { 124 | char tmp[32]; 125 | if(command_.get_word(0, sizeof(tmp), tmp)) { 126 | int32_t a = 0; 127 | auto n = (utils::input("%d", tmp) % a).num(); 128 | if(n == 1) { 129 | utils::format("Value: %d, 0x%X\n") % a % a; 130 | } else { 131 | utils::format("Input only decimal: '%s'\n") % tmp; 132 | } 133 | } 134 | } 135 | } 136 | 137 | /// a += 0.12f; 138 | /// utils::format("%5.4f\n") % a; /// 15760 139 | /// printf("%5.4f\n", a); /// overflow by 42764 140 | 141 | 142 | #if 0 143 | if(uart_.length()) { // UART のレシーブデータがあるか? 144 | char ch = uart_.getch(); 145 | uart_.putch(ch); 146 | } 147 | #endif 148 | 149 | #if 0 150 | // 文字の出力 151 | for(char ch = 0x20; ch < 0x7f; ++ch) { 152 | uart_.putch(ch); 153 | } 154 | uart_.putch('\n'); 155 | #endif 156 | 157 | // 10ms ソフトタイマー 158 | utils::delay::milli_second(10); 159 | 160 | // LED の点滅 161 | ++cnt; 162 | if(cnt < 25) { 163 | LED0::P = 0; 164 | LED1::P = 1; 165 | } else { 166 | LED0::P = 1; 167 | LED1::P = 0; 168 | } 169 | if(cnt >= 50) cnt = 0; 170 | } 171 | } 172 | -------------------------------------------------------------------------------- /r8cprog/r8c_prog.conf: -------------------------------------------------------------------------------- 1 | ################################################################ 2 | # r8c_prog configuration 3 | # 4 | # 2010.3.21 KAWAKAMI Yukio 5 | # 2015.5.14 HIRAMATSU Kunihito 6 | ################################################################ 7 | 8 | [DEFAULT] 9 | 10 | programmer = Generic 11 | 12 | device=R5F2M120 13 | 14 | # 標準のシリアルポート、機器依存ポート名 15 | # port_win, port_osx, port_linux は、起動しているシステム用に認識し、port より優先されます。 16 | port_win = COM7 17 | port_osx = /dev/tty.usbserial-DA00X2QP 18 | port_linux = /dev/ttyUSB0 19 | #port = /dev/ttyS8 20 | #port = COM11 21 | 22 | speed = 115200 23 | #speed = 57600 24 | #speed = 38400 25 | #speed = 19200 26 | 27 | #file = TEST.mot 28 | 29 | #id-file = 30 | #id = FF:FF:FF:FF:FF:FF:FF 31 | 32 | 33 | [PROGRAMMER] 34 | 35 | Generic { 36 | comment = "Generic Serial I/F or USB-Serial" 37 | } 38 | 39 | R8Cprog162 { 40 | comment = "r8c_prog programmer by Yuki/Hira" 41 | } 42 | 43 | 44 | [DEVICE] 45 | 46 | R5F21246 { 47 | group = "R8C/24" 48 | rom = 32k 49 | ram = 2k 50 | comment = "; R5F21246" 51 | rom-area = 8000,BFFF, 52 | C000,FFFF 53 | } 54 | 55 | R5F21256 { 56 | group = "R8C/25" 57 | rom = 32k 58 | data = 2k 59 | ram = 2k 60 | comment = "; R5F21256" 61 | rom-area = 8000,BFFF, 62 | C000,FFFF 63 | data-area = 2400,27FF, 64 | 2800,2BFF 65 | } 66 | 67 | R5F21262 { 68 | group = "R8C/26" 69 | rom = 8k 70 | ram = 512 71 | comment = "; R5F21262" 72 | rom-area = E000,FFFF 73 | } 74 | 75 | R5F21266 { 76 | group = "R8C/26" 77 | rom = 32k 78 | ram = 1.5k 79 | comment = "; R5F21266" 80 | rom-area = 8000,BFFF, 81 | C000,FFFF 82 | } 83 | 84 | R5F21276 { 85 | group = "R8C/27" 86 | rom = 32k 87 | data = 2k 88 | ram = 1.5k 89 | comment = "; R5F21276" 90 | rom-area = 8000,BFFF, 91 | C000,FFFF 92 | data-area = 2400,27FF, 93 | 2800,2BFF 94 | } 95 | 96 | R5F21294 { 97 | group = "R8C/29" 98 | rom = 16k 99 | data = 2k 100 | ram = 1k 101 | comment = "; R5F21294" 102 | rom-area = C000,FFFF 103 | data-area = 2400,27FF, 104 | 2800,2BFF 105 | } 106 | 107 | R5F212AA { 108 | group = "R8C/2A" 109 | rom = 96k 110 | ram = 7k 111 | comment = "; R5F212AA" 112 | 113 | rom-area = 4000,BFFF, 114 | C000,13FFF, 115 | 14000,1BFFF 116 | } 117 | 118 | R5F212BA { 119 | group = "R8C/2B" 120 | rom = 96k 121 | data = 2k 122 | ram = 7k 123 | comment = "; R5F212BA" 124 | 125 | rom-area = 4000,BFFF, 126 | C000,13FFF, 127 | 14000,1BFFF 128 | 129 | data-area = 2400,27FF, 130 | 2800,2BFF 131 | } 132 | 133 | R5F212DC { 134 | group = "R8C/2D" 135 | rom = 128k 136 | data = 2k 137 | ram = 7.5k 138 | comment = "; R5F212DC" 139 | 140 | rom-area = 4000,BFFF, 141 | C000,13FFF, 142 | 14000,1BFFF, 143 | 1C000,23FFF 144 | 145 | data-area = 2400,27FF, 146 | 2800,2BFF 147 | } 148 | 149 | 150 | R5F21354 { 151 | group = "R8C/35A" 152 | rom = 16k 153 | data = 4k 154 | ram = 1.5k 155 | comment = "; R5F21354ANFP" 156 | 157 | rom-area = C000,FFFF 158 | 159 | data-area = 3000,3FFFF 160 | } 161 | 162 | ################################################################ 163 | 164 | R5F2M110 { 165 | group = "R8C/M11A" 166 | rom = 64k 167 | data = 2k 168 | ram = 1280 169 | comment = "; R5F2M11A" 170 | rom-area = 8000,8FFF, 171 | 9000,9FFF, 172 | A000,AFFF, 173 | B000,BFFF, 174 | C000,CFFF, 175 | D000,DFFF, 176 | E000,EFFF, 177 | F000,FFFF, 178 | 10000,10FFF, 179 | 11000,11FFF, 180 | 12000,12FFF, 181 | 13000,13FFF, 182 | 14000,14FFF, 183 | 15000,15FFF, 184 | 16000,16FFF, 185 | 17000,17FFF 186 | 187 | data-area = 3000,33FF, 188 | 3400,37FF 189 | } 190 | 191 | R5F2M120 { 192 | group = "R8C/M12A" 193 | rom = 64k 194 | data = 2k 195 | ram = 1280 196 | comment = "; R5F2M12A" 197 | rom-area = 8000,8FFF, 198 | 9000,9FFF, 199 | A000,AFFF, 200 | B000,BFFF, 201 | C000,CFFF, 202 | D000,DFFF, 203 | E000,EFFF, 204 | F000,FFFF, 205 | 10000,10FFF, 206 | 11000,11FFF, 207 | 12000,12FFF, 208 | 13000,13FFF, 209 | 14000,14FFF, 210 | 15000,15FFF, 211 | 16000,16FFF, 212 | 17000,17FFF 213 | 214 | data-area = 3000,33FF, 215 | 3400,37FF 216 | } 217 | 218 | -------------------------------------------------------------------------------- /M120AN/adc.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief R8C/M110AN, R8C/M120AN グループ・A/D変換レジスター定義 5 | @author 平松邦仁 (hira@rvf-rc45.net) 6 | @copyright Copyright (C) 2015, 2017 Kunihito Hiramatsu @n 7 | Released under the MIT license @n 8 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 9 | */ 10 | //=====================================================================// 11 | #include "common/io_utils.hpp" 12 | 13 | namespace device { 14 | 15 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 16 | /*! 17 | @brief A/D レジスタ AD0 18 | */ 19 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 20 | static ro16_t<0x0098> AD0; 21 | 22 | 23 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 24 | /*! 25 | @brief A/D レジスタ AD0L 26 | */ 27 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 28 | static ro8_t<0x0098> AD0L; 29 | 30 | 31 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 32 | /*! 33 | @brief A/D レジスタ AD0H 34 | */ 35 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 36 | static ro8_t<0x0099> AD0H; 37 | 38 | 39 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 40 | /*! 41 | @brief A/D レジスタ AD1 42 | */ 43 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 44 | static ro16_t<0x009A> AD1; 45 | 46 | 47 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 48 | /*! 49 | @brief A/D レジスタ AD1L 50 | */ 51 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 52 | static ro8_t<0x009A> AD1L; 53 | 54 | 55 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 56 | /*! 57 | @brief A/D レジスタ AD1H 58 | */ 59 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 60 | static ro8_t<0x009B> AD1H; 61 | 62 | 63 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 64 | /*! 65 | @brief A/D モードレジスタ ADMOD 66 | */ 67 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 68 | struct admod_t : public rw8_t<0x009C> { 69 | typedef rw8_t<0x009C> io_; 70 | using io_::operator =; 71 | using io_::operator (); 72 | using io_::operator |=; 73 | using io_::operator &=; 74 | 75 | bits_rw_t CKS; 76 | bits_rw_t MD; 77 | bits_rw_t ADCAP; 78 | }; 79 | static admod_t ADMOD; 80 | 81 | 82 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 83 | /*! 84 | @brief A/D 入力選択レジスタ ADINSEL 85 | */ 86 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 87 | struct adinsel_t : public rw8_t<0x009D> { 88 | typedef rw8_t<0x009D> io_; 89 | using io_::operator =; 90 | using io_::operator (); 91 | using io_::operator |=; 92 | using io_::operator &=; 93 | 94 | bit_rw_t CH0; 95 | bits_rw_t ADGSEL; 96 | }; 97 | static adinsel_t ADINSEL; 98 | 99 | 100 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 101 | /*! 102 | @brief A/D 制御レジスタ0 ADCON0 103 | */ 104 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 105 | struct adcon0_t : public rw8_t<0x009E> { 106 | typedef rw8_t<0x009E> io_; 107 | using io_::operator =; 108 | using io_::operator (); 109 | using io_::operator |=; 110 | using io_::operator &=; 111 | 112 | bit_rw_t ADST; 113 | }; 114 | static adcon0_t ADCON0; 115 | 116 | 117 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 118 | /*! 119 | @brief A/D 割り込み制御レジスタ ADICSR 120 | */ 121 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 122 | struct adicsr_t : public rw8_t<0x009F> { 123 | typedef rw8_t<0x009F> io_; 124 | using io_::operator =; 125 | using io_::operator (); 126 | using io_::operator |=; 127 | using io_::operator &=; 128 | 129 | bit_rw_t ADIE; 130 | bit_rw_t ADF; 131 | }; 132 | static adicsr_t ADICSR; 133 | } 134 | -------------------------------------------------------------------------------- /MPU6050_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C MPU6050 サンプル 4 | @author 平松邦仁 (hira@rvf-rc45.net) 5 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 6 | Released under the MIT license @n 7 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 8 | */ 9 | //=====================================================================// 10 | #include "common/renesas.hpp" 11 | 12 | #include "common/fifo.hpp" 13 | #include "common/uart_io.hpp" 14 | #include "common/trb_io.hpp" 15 | #include "chip/MPU6050.hpp" 16 | #include "common/command.hpp" 17 | #include "common/format.hpp" 18 | 19 | namespace { 20 | 21 | typedef device::trb_io timer_b; 22 | timer_b timer_b_; 23 | 24 | typedef utils::fifo buffer; 25 | typedef device::uart_io uart; 26 | uart uart_; 27 | 28 | // I2C ポートの定義クラス 29 | // P4_B5: SDA 30 | typedef device::PORT sda_port; 31 | // P1_B7: SCL 32 | typedef device::PORT scl_port; 33 | 34 | typedef device::iica_io iica; 35 | iica i2c_; 36 | chip::MPU6050 mpu6050_(i2c_); 37 | 38 | utils::command<64> command_; 39 | } 40 | 41 | extern "C" { 42 | 43 | void sci_putch(char ch) { 44 | uart_.putch(ch); 45 | } 46 | 47 | 48 | char sci_getch(void) { 49 | return uart_.getch(); 50 | } 51 | 52 | 53 | uint16_t sci_length() { 54 | return uart_.length(); 55 | } 56 | 57 | 58 | void sci_puts(const char* str) { 59 | uart_.puts(str); 60 | } 61 | 62 | 63 | void TIMER_RB_intr(void) { 64 | timer_b_.itask(); 65 | } 66 | 67 | 68 | void UART0_TX_intr(void) { 69 | uart_.isend(); 70 | } 71 | 72 | 73 | void UART0_RX_intr(void) { 74 | uart_.irecv(); 75 | } 76 | 77 | } 78 | 79 | 80 | // __attribute__ ((section (".exttext"))) 81 | int main(int argc, char *argv[]) 82 | { 83 | using namespace device; 84 | 85 | // クロック関係レジスタ・プロテクト解除 86 | PRCR.PRC0 = 1; 87 | 88 | // 高速オンチップオシレーターへ切り替え(20MHz) 89 | // ※ F_CLK を設定する事(Makefile内) 90 | OCOCR.HOCOE = 1; 91 | utils::delay::micro_second(1); // >=30us(125KHz) 92 | SCKCR.HSCKSEL = 1; 93 | CKSTPR.SCKSEL = 1; 94 | 95 | // タイマーB初期化 96 | { 97 | uint8_t ir_level = 2; 98 | timer_b_.start(60, ir_level); 99 | } 100 | 101 | // UART の設定 (P1_4: TXD0[out], P1_5: RXD0[in]) 102 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 103 | { 104 | utils::PORT_MAP(utils::port_map::P14::TXD0); 105 | utils::PORT_MAP(utils::port_map::P15::RXD0); 106 | uint8_t ir_level = 1; 107 | uart_.start(57600, ir_level); 108 | } 109 | 110 | // I2C クラスの初期化 111 | { 112 | i2c_.start(iica::speed::fast); 113 | } 114 | 115 | // MPU6050 を開始 116 | { 117 | if(!mpu6050_.start()) { 118 | utils::format("Stall MPU6050 start (%d)\n") % static_cast(i2c_.get_last_error()); 119 | } 120 | } 121 | 122 | sci_puts("Start R8C MPU6050 sample\n"); 123 | command_.set_prompt("# "); 124 | 125 | // LED シグナル用ポートを出力 126 | PD1.B0 = 1; 127 | 128 | uint8_t n = 0; 129 | uint8_t cnt = 0; 130 | while(1) { 131 | timer_b_.sync(); 132 | 133 | if(cnt >= 20) { 134 | cnt = 0; 135 | } 136 | if(cnt < 10) P1.B0 = 1; 137 | else P1.B0 = 0; 138 | ++cnt; 139 | 140 | ++n; 141 | if(n >= 60) { 142 | n = 0; 143 | 144 | auto a = mpu6050_.get_accel(); 145 | utils::format("ACCEL: %d, %d, %d\n") % a.x % a.y % a.z; 146 | 147 | auto t = mpu6050_.get_temp(); 148 | utils::format("TEMP: %d.%1d\n") % (t / 10) % (t % 10); 149 | 150 | auto g = mpu6050_.get_gyro(); 151 | utils::format("GYRO: %d, %d, %d\n") % g.x % g.y % g.z; 152 | } 153 | 154 | // コマンド入力と、コマンド解析 155 | if(command_.service()) { 156 | uint8_t cmdn = command_.get_words(); 157 | if(cmdn >= 1) { 158 | // if(command_.cmp_word(0, "date")) { 159 | // } else if(command_.cmp_word(0, "help")) { 160 | // sci_puts("date\n"); 161 | // sci_puts("date yyyy/mm/dd hh:mm[:ss]\n"); 162 | // } else { 163 | // char buff[12]; 164 | // if(command_.get_word(0, sizeof(buff), buff)) { 165 | // sci_puts("Command error: "); 166 | // sci_puts(buff); 167 | // sci_putch('\n'); 168 | // } 169 | // } 170 | } 171 | } 172 | } 173 | } 174 | -------------------------------------------------------------------------------- /PLUSE_OUT_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C タイマーJ、パルス出力サンプル @n 4 | P17(13) からパルス出力。@n 5 | コンソールから、任意の周波数を設定(有限な設定範囲) 6 | @author 平松邦仁 (hira@rvf-rc45.net) 7 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 8 | Released under the MIT license @n 9 | https://github.com/hirakuni45/RX/blob/master/LICENSE 10 | */ 11 | //=====================================================================// 12 | #include "common/renesas.hpp" 13 | 14 | #include "common/fifo.hpp" 15 | #include "common/uart_io.hpp" 16 | #include "common/trb_io.hpp" 17 | #include "common/trj_io.hpp" 18 | #include "common/command.hpp" 19 | 20 | namespace { 21 | 22 | typedef utils::fifo BUFFER; 23 | typedef device::uart_io UART; 24 | UART uart_; 25 | 26 | typedef device::trb_io TIMER_B; 27 | TIMER_B timer_b_; 28 | 29 | typedef device::trj_io TIMER_J; 30 | TIMER_J timer_j_; 31 | 32 | utils::command<64> command_; 33 | 34 | } 35 | 36 | extern "C" { 37 | 38 | void sci_putch(char ch) { 39 | uart_.putch(ch); 40 | } 41 | 42 | 43 | char sci_getch(void) { 44 | return uart_.getch(); 45 | } 46 | 47 | 48 | uint16_t sci_length() { 49 | return uart_.length(); 50 | } 51 | 52 | 53 | void sci_puts(const char* str) { 54 | uart_.puts(str); 55 | } 56 | 57 | 58 | void TIMER_RB_intr(void) { 59 | timer_b_.itask(); 60 | } 61 | 62 | 63 | void UART0_TX_intr(void) { 64 | uart_.isend(); 65 | } 66 | 67 | 68 | void UART0_RX_intr(void) { 69 | uart_.irecv(); 70 | } 71 | 72 | 73 | void TIMER_RJ_intr(void) { 74 | timer_j_.iout(); 75 | } 76 | } 77 | 78 | 79 | namespace { 80 | 81 | bool get_dec_(const char* text, uint32_t& val) { 82 | val = 0; 83 | char ch; 84 | while((ch = *text++) != 0) { 85 | if(ch >= '0' && ch <= '9') { 86 | ch -= '0'; 87 | } else { 88 | return false; 89 | } 90 | val *= 10; 91 | val += ch; 92 | } 93 | return true; 94 | } 95 | 96 | 97 | bool get_decimal_(uint8_t no, uint32_t& val) { 98 | char buff[9]; 99 | if(command_.get_word(no, sizeof(buff), buff)) { 100 | if(get_dec_(buff, val)) { 101 | return true; 102 | } 103 | } 104 | return false; 105 | } 106 | 107 | 108 | bool help_(uint8_t cmdn) { 109 | if(cmdn >= 1 && command_.cmp_word(0, "help")) { 110 | sci_puts("freq FREQUENCY[Hz]\n"); 111 | return true; 112 | } 113 | return false; 114 | } 115 | 116 | 117 | bool freq_(uint8_t cmdn) { 118 | if(cmdn >= 2) { 119 | uint32_t val; 120 | if(get_decimal_(1, val)) { 121 | if(!timer_j_.set_cycle(val)) { 122 | sci_puts("TRJ out of range.\n"); 123 | } 124 | return true; 125 | } 126 | } 127 | return false; 128 | } 129 | } 130 | 131 | int main(int argc, char *argv[]) 132 | { 133 | using namespace device; 134 | 135 | // クロック関係レジスタ・プロテクト解除 136 | PRCR.PRC0 = 1; 137 | 138 | // 高速オンチップオシレーターへ切り替え(20MHz) 139 | // ※ F_CLK を設定する事(Makefile内) 140 | OCOCR.HOCOE = 1; 141 | utils::delay::micro_second(1); // >=30uS(125KHz) 142 | SCKCR.HSCKSEL = 1; 143 | CKSTPR.SCKSEL = 1; 144 | 145 | // タイマーB初期化 146 | { 147 | uint8_t ir_level = 2; 148 | timer_b_.start(60, ir_level); 149 | } 150 | 151 | // UART の設定 (P1_4: TXD0[in], P1_5: RXD0[in]) 152 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 153 | { 154 | utils::PORT_MAP(utils::port_map::P14::TXD0); 155 | utils::PORT_MAP(utils::port_map::P15::RXD0); 156 | uint8_t ir_level = 1; 157 | uart_.start(57600, ir_level); 158 | } 159 | 160 | // TRJ のパルス出力設定 161 | { 162 | utils::PORT_MAP(utils::port_map::P17::TRJIO); 163 | if(!timer_j_.pluse_out(1000)) { 164 | sci_puts("TRJ out of range.\n"); 165 | } 166 | } 167 | 168 | sci_puts("Start R8C PLUSE output sample\n"); 169 | 170 | command_.set_prompt("# "); 171 | 172 | while(1) { 173 | timer_b_.sync(); 174 | 175 | // コマンド入力と、コマンド解析 176 | if(command_.service()) { 177 | uint8_t cmdn = command_.get_words(); 178 | if(cmdn == 0) ; 179 | else if(help_(cmdn)) ; 180 | else if(freq_(cmdn)) ; 181 | else { 182 | sci_puts("Command error: "); 183 | sci_puts(command_.get_command()); 184 | sci_putch('\n'); 185 | } 186 | } 187 | } 188 | } 189 | -------------------------------------------------------------------------------- /VL53L0X_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief VL53L0X 距離センサー・サンプル 4 | @author 平松邦仁 (hira@rvf-rc45.net) 5 | @copyright Copyright (C) 2017, 2021 Kunihito Hiramatsu @n 6 | Released under the MIT license @n 7 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 8 | */ 9 | //=====================================================================// 10 | #include "common/renesas.hpp" 11 | 12 | #include "common/command.hpp" 13 | #include "common/format.hpp" 14 | #include "common/uart_io.hpp" 15 | #include "common/fifo.hpp" 16 | #include "common/trb_io.hpp" 17 | #include "common/iica_io.hpp" 18 | #include "chip/VL53L0X.hpp" 19 | 20 | namespace { 21 | 22 | typedef device::trb_io timer_b; 23 | timer_b timer_b_; 24 | 25 | typedef utils::fifo buffer; 26 | typedef device::uart_io uart; 27 | uart uart_; 28 | 29 | // I2C ポートの定義クラス 30 | // P4_B5 (12): SDA 31 | typedef device::PORT SDA; 32 | // P1_B7 (13): SCL 33 | typedef device::PORT SCL; 34 | 35 | typedef device::iica_io I2C; 36 | I2C i2c_; 37 | typedef chip::VL53L0X VLX; 38 | VLX vlx_(i2c_); 39 | 40 | utils::command<64> command_; 41 | } 42 | 43 | extern "C" { 44 | 45 | void sci_putch(char ch) { 46 | uart_.putch(ch); 47 | } 48 | 49 | 50 | char sci_getch(void) { 51 | return uart_.getch(); 52 | } 53 | 54 | 55 | uint16_t sci_length() { 56 | return uart_.length(); 57 | } 58 | 59 | 60 | void sci_puts(const char* str) { 61 | uart_.puts(str); 62 | } 63 | 64 | 65 | void TIMER_RB_intr(void) { 66 | timer_b_.itask(); 67 | } 68 | 69 | 70 | void UART0_TX_intr(void) { 71 | uart_.isend(); 72 | } 73 | 74 | 75 | void UART0_RX_intr(void) { 76 | uart_.irecv(); 77 | } 78 | 79 | } 80 | 81 | 82 | namespace { 83 | 84 | 85 | 86 | } 87 | 88 | // __attribute__ ((section (".exttext"))) 89 | int main(int argc, char *argv[]) 90 | { 91 | using namespace device; 92 | 93 | // クロック関係レジスタ・プロテクト解除 94 | PRCR.PRC0 = 1; 95 | 96 | // 高速オンチップオシレーターへ切り替え(20MHz) 97 | // ※ F_CLK を設定する事(Makefile内) 98 | OCOCR.HOCOE = 1; 99 | utils::delay::micro_second(1); // >=30us(125KHz) 100 | SCKCR.HSCKSEL = 1; 101 | CKSTPR.SCKSEL = 1; 102 | 103 | // タイマーB初期化 104 | { 105 | uint8_t ir_level = 2; 106 | timer_b_.start(100, ir_level); 107 | } 108 | 109 | // UART の設定 (P1_4: TXD0[out], P1_5: RXD0[in]) 110 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 111 | { 112 | utils::PORT_MAP(utils::port_map::P14::TXD0); 113 | utils::PORT_MAP(utils::port_map::P15::RXD0); 114 | uint8_t ir_level = 1; 115 | uart_.start(57600, ir_level); 116 | } 117 | 118 | // I2C クラスの初期化 119 | { 120 | i2c_.start(I2C::speed::fast); 121 | } 122 | 123 | // VL53L0X を開始 124 | if(!vlx_.start()) { 125 | utils::format("VL53L0X start fail\n"); 126 | } else { 127 | // 20ms 128 | vlx_.set_measurement_timing_budget(200000); 129 | } 130 | 131 | sci_puts("Start R8C VL53L0X monitor\n"); 132 | command_.set_prompt("# "); 133 | 134 | // LED シグナル用ポートを出力 135 | PD1.B0 = 1; 136 | 137 | uint8_t cnt = 0; 138 | uint8_t itv = 0; 139 | while(1) { 140 | timer_b_.sync(); 141 | 142 | if(cnt >= 20) { 143 | cnt = 0; 144 | } 145 | if(cnt < 10) P1.B0 = 1; 146 | else P1.B0 = 0; 147 | ++cnt; 148 | 149 | ++itv; 150 | if(itv >= 50) { 151 | auto len = vlx_.read_range_single_millimeters(); 152 | if(vlx_.timeout_occurred()) { 153 | utils::format("Length: timeout\n"); 154 | } else { 155 | utils::format("Length: %d [mm]\n") % (len - 50); 156 | } 157 | itv = 0; 158 | } 159 | 160 | #if 0 161 | // コマンド入力と、コマンド解析 162 | if(command_.service()) { 163 | uint8_t cmdn = command_.get_words(); 164 | if(cmdn >= 1) { 165 | if(command_.cmp_word(0, "date")) { 166 | if(cmdn == 1) { 167 | 168 | } else { 169 | 170 | } 171 | } else if(command_.cmp_word(0, "help")) { 172 | // sci_puts("date\n"); 173 | // sci_puts("date yyyy/mm/dd hh:mm[:ss]\n"); 174 | } else { 175 | char buff[12]; 176 | if(command_.get_word(0, sizeof(buff), buff)) { 177 | utils::format("Command error: %s\n") % buff; 178 | } 179 | } 180 | } 181 | } 182 | #endif 183 | } 184 | } 185 | -------------------------------------------------------------------------------- /chip/DS3231.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //=====================================================================// 3 | /*! @file 4 | @brief DS3231 RTC ドライバー 5 | Copyright 2016 Kunihito Hiramatsu 6 | @author 平松邦仁 (hira@rvf-rc45.net) 7 | */ 8 | //=====================================================================// 9 | #include 10 | #include "common/iica_io.hpp" 11 | #include "common/time.h" 12 | 13 | namespace chip { 14 | 15 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 16 | /*! 17 | @brief DS3231 RTC テンプレートクラス 18 | @param[in] I2C_IO i2c I/O クラス 19 | */ 20 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// 21 | template 22 | class DS3231 { 23 | 24 | // R/W ビットを含まない7ビット値 25 | static const uint8_t DS3231_ADR_ = 0x68; 26 | 27 | I2C_IO& i2c_io_; 28 | 29 | bool start_; 30 | 31 | struct reg_t { 32 | uint8_t reg[7]; 33 | bool operator != (const reg_t& t) { 34 | for(uint8_t i = 0; i < 7; ++i) { 35 | if(reg[i] != t.reg[i]) return true; 36 | } 37 | return false; 38 | } 39 | }; 40 | 41 | bool get_time_(reg_t& t) const { 42 | uint8_t reg[1]; 43 | reg[0] = 0x00; // set address 44 | if(!i2c_io_.send(DS3231_ADR_, reg, 1)) { 45 | return false; 46 | } 47 | if(!i2c_io_.recv(DS3231_ADR_, &t.reg[0], 7)) { 48 | return false; 49 | } 50 | return true; 51 | } 52 | 53 | public: 54 | //-----------------------------------------------------------------// 55 | /*! 56 | @brief コンストラクター 57 | @param[in] i2c iica_io クラスを参照で渡す 58 | */ 59 | //-----------------------------------------------------------------// 60 | DS3231(I2C_IO& i2c) : i2c_io_(i2c), start_(false) { } 61 | 62 | 63 | //-----------------------------------------------------------------// 64 | /*! 65 | @brief 開始 66 | @return エラーなら「false」を返す 67 | */ 68 | //-----------------------------------------------------------------// 69 | bool start() { 70 | uint8_t reg[2]; 71 | reg[0] = 0x0e; /// internal register address 72 | reg[1] = 0x00; 73 | start_ = i2c_io_.send(DS3231_ADR_, reg, 2); 74 | return start_; 75 | } 76 | 77 | 78 | //-----------------------------------------------------------------// 79 | /*! 80 | @brief DS3231 時間設定 81 | @param[in] t 時間 82 | @return 成功なら「true」 83 | */ 84 | //-----------------------------------------------------------------// 85 | bool set_time(time_t t) const { 86 | if(!start_) return false; 87 | 88 | const tm* tp = gmtime(&t); 89 | uint8_t reg[7]; 90 | reg[0] = ((tp->tm_sec / 10) << 4) | (tp->tm_sec % 10); // 0 to 59 91 | reg[1] = ((tp->tm_min / 10) << 4) | (tp->tm_min % 10); // 0 to 59 92 | reg[2] = ((tp->tm_hour / 10) << 4) | (tp->tm_hour % 10); // 0 to 23 93 | reg[3] = tp->tm_wday + 1; // 1 to 7 94 | reg[4] = ((tp->tm_mday / 10) << 4) | (tp->tm_mday % 10); // 1 to 31 95 | uint8_t mon = tp->tm_mon + 1; 96 | reg[5] = ((mon / 10) << 4) | (mon % 10); // 1 to 12 97 | uint16_t y = tp->tm_year % 100; 98 | reg[6] = ((y / 10) << 4) | (y % 10); // 0 to 99 99 | return i2c_io_.send(DS3231_ADR_, 0x00, reg, 7); 100 | } 101 | 102 | 103 | //-----------------------------------------------------------------// 104 | /*! 105 | @brief DS3231 時間呼び出し 106 | @param[in] tp 取得時間 107 | @return 成功なら「true」 108 | */ 109 | //-----------------------------------------------------------------// 110 | bool get_time(time_t& tp) const { 111 | if(!start_) return false; 112 | 113 | reg_t t; 114 | reg_t tmp; 115 | tm ts; 116 | // 二度読んで、同じだったら正しい時間とする 117 | uint8_t n = 5; // 5回ループして正常に読めなかったら、エラーとする 118 | do { 119 | tmp = t; 120 | if(!get_time_(t)) return false; 121 | --n; 122 | if(n == 0) { 123 | return false; 124 | } 125 | } while(t != tmp) ; 126 | 127 | ts.tm_sec = ((t.reg[0] >> 4) * 10) + (t.reg[0] & 0xf); 128 | ts.tm_min = ((t.reg[1] >> 4) * 10) + (t.reg[1] & 0xf); 129 | ts.tm_hour = ((t.reg[2] >> 4) * 10) + (t.reg[2] & 0xf); 130 | ts.tm_mday = ((t.reg[4] >> 4) * 10) + (t.reg[4] & 0xf); 131 | ts.tm_mon = ((((t.reg[5] & 0x10) >> 4) * 10) + (t.reg[5] & 0xf)) - 1; 132 | ts.tm_year = ((t.reg[6] >> 4) * 10) + (t.reg[6] & 0xf); 133 | ts.tm_year += 100; 134 | tp = mktime_gmt(&ts); 135 | return true; 136 | } 137 | }; 138 | } 139 | -------------------------------------------------------------------------------- /BMP180_sample/main.cpp: -------------------------------------------------------------------------------- 1 | //=====================================================================// 2 | /*! @file 3 | @brief R8C BMP180/BMP280 サンプル 4 | @author 平松邦仁 (hira@rvf-rc45.net) 5 | @copyright Copyright (C) 2017 Kunihito Hiramatsu @n 6 | Released under the MIT license @n 7 | https://github.com/hirakuni45/R8C/blob/master/LICENSE 8 | */ 9 | //=====================================================================// 10 | #include "common/renesas.hpp" 11 | 12 | #include "common/fifo.hpp" 13 | #include "common/uart_io.hpp" 14 | #include "common/trb_io.hpp" 15 | #include "common/command.hpp" 16 | #include "common/format.hpp" 17 | #include "chip/BMP180.hpp" 18 | #include "chip/BMP280.hpp" 19 | 20 | namespace { 21 | 22 | typedef device::trb_io timer_b; 23 | timer_b timer_b_; 24 | 25 | typedef utils::fifo buffer; 26 | typedef device::uart_io uart; 27 | uart uart_; 28 | 29 | // I2C ポートの定義クラス 30 | // P4_B5: SDA 31 | typedef device::PORT sda_port; 32 | // P1_B7: SCL 33 | typedef device::PORT scl_port; 34 | 35 | typedef device::iica_io iica; 36 | iica i2c_; 37 | // chip::BMP180 bmpx_(i2c_); 38 | chip::BMP280 bmpx_(i2c_); 39 | 40 | utils::command<64> command_; 41 | } 42 | 43 | extern "C" { 44 | 45 | void sci_putch(char ch) { 46 | uart_.putch(ch); 47 | } 48 | 49 | 50 | char sci_getch(void) { 51 | return uart_.getch(); 52 | } 53 | 54 | 55 | uint16_t sci_length() { 56 | return uart_.length(); 57 | } 58 | 59 | 60 | void sci_puts(const char* str) { 61 | uart_.puts(str); 62 | } 63 | 64 | 65 | void TIMER_RB_intr(void) { 66 | timer_b_.itask(); 67 | } 68 | 69 | 70 | void UART0_TX_intr(void) { 71 | uart_.isend(); 72 | } 73 | 74 | 75 | void UART0_RX_intr(void) { 76 | uart_.irecv(); 77 | } 78 | } 79 | 80 | 81 | //__attribute__ ((section (".exttext"))) 82 | int main(int argc, char *argv[]) 83 | { 84 | using namespace device; 85 | 86 | // クロック関係レジスタ・プロテクト解除 87 | PRCR.PRC0 = 1; 88 | 89 | // 高速オンチップオシレーターへ切り替え(20MHz) 90 | // ※ F_CLK を設定する事(Makefile内) 91 | OCOCR.HOCOE = 1; 92 | utils::delay::micro_second(1); // >=30us(125KHz) 93 | SCKCR.HSCKSEL = 1; 94 | CKSTPR.SCKSEL = 1; 95 | 96 | // タイマーB初期化 97 | { 98 | uint8_t ir_level = 2; 99 | timer_b_.start(60, ir_level); 100 | } 101 | 102 | // UART の設定 (P1_4: TXD0[out], P1_5: RXD0[in]) 103 | // ※シリアルライターでは、RXD 端子は、P1_6 となっているので注意! 104 | { 105 | utils::PORT_MAP(utils::port_map::P14::TXD0); 106 | utils::PORT_MAP(utils::port_map::P15::RXD0); 107 | uint8_t ir_level = 1; 108 | uart_.start(57600, ir_level); 109 | } 110 | 111 | // I2C クラスの初期化 112 | { 113 | i2c_.start(iica::speed::fast); 114 | } 115 | 116 | // BMP180/BMP280 を開始 117 | { 118 | if(!bmpx_.start()) { 119 | utils::format("Stall BMP180/BMP280 start (%d)\n") % static_cast(i2c_.get_last_error()); 120 | } 121 | } 122 | 123 | sci_puts("Start R8C BMP180/BMP280 sample\n"); 124 | command_.set_prompt("# "); 125 | 126 | // LED シグナル用ポートを出力 127 | PD1.B0 = 1; 128 | 129 | uint8_t n = 0; 130 | uint8_t cnt = 0; 131 | while(1) { 132 | timer_b_.sync(); 133 | 134 | if(cnt >= 20) { 135 | cnt = 0; 136 | } 137 | if(cnt < 10) P1.B0 = 1; 138 | else P1.B0 = 0; 139 | ++cnt; 140 | 141 | ++n; 142 | if(n >= 60) { 143 | n = 0; 144 | 145 | auto t = bmpx_.get_temperature(); 146 | utils::format("Temperature: %d.%02d C\n") % (t / 100) % (t % 100); 147 | 148 | auto p = bmpx_.get_pressure(); 149 | utils::format("Pressure: %d.%02d hPa\n") % (p / 100) % (p % 100); 150 | 151 | // auto a = bmpx_.get_altitude(); 152 | // utils::format("Altitude: %7.2f m\n") % a; 153 | } 154 | 155 | // コマンド入力と、コマンド解析 156 | if(command_.service()) { 157 | uint8_t cmdn = command_.get_words(); 158 | if(cmdn >= 1) { 159 | // if(command_.cmp_word(0, "date")) { 160 | // } else if(command_.cmp_word(0, "help")) { 161 | // sci_puts("date\n"); 162 | // sci_puts("date yyyy/mm/dd hh:mm[:ss]\n"); 163 | // } else { 164 | // char buff[12]; 165 | // if(command_.get_word(0, sizeof(buff), buff)) { 166 | // sci_puts("Command error: "); 167 | // sci_puts(buff); 168 | // sci_putch('\n'); 169 | // } 170 | // } 171 | } 172 | } 173 | } 174 | } 175 | --------------------------------------------------------------------------------