PIC32にmruby/cでプログラムする（Lチカ）

# はじめに
とりあえず今回はタイマーの実装をしない

#使用部品・回路
・[pickit3](http://akizukidenshi.com/catalog/g/gM-03608/)
・[PIC32MX170F256B-I/SP](https://jp.rs-online.com/web/p/microcontrollers/8290576/)
・抵抗[330](http://akizukidenshi.com/catalog/g/gR-25331/),[10k](http://akizukidenshi.com/catalog/g/gR-25103/)
・コンデンサ[1u](http://akizukidenshi.com/catalog/g/gP-08150/),[10u](http://akizukidenshi.com/catalog/g/gP-08155/)
・[LED](http://akizukidenshi.com/catalog/g/gI-11577/)


電源ラインが1uF
左のソケットがPickit3　左から1ピン

![pic_ブレッドボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195542/e06ce9c9-8483-fe81-8f21-38d2572d6a67.png)

[pic24](https://qiita.com/aikawa_YO/items/68b12689f30ecd67a754)と同じに見えますが、、
同じです。基本的に同じDIPの28pinなので似ています。
気になる方はマイコンのドキュメントを参照してくださいm(_ _"m)

# 手順
基本的にPIC24と同じ手順なので異なるところだけ書いておく。(私は不親切で大雑把)
https://www.s-itoc.jp/activity/research/mrubyc/mrubyc_news/842

・3.開発環境でコンパイラはXC16ではなくXC32を使用する
・4.1の4は[pickit3]を選択
・4.1の5はXC32コンパイラを選択
・MCCは無操作で「Generate」ボタンのみ押す(4.1の8,9はスキップ)
・4.1の12

XC32(GrovalOptions)=>Common include dirs
  →src,src\hal
xc32-ld=>Heap size
  →1024
xc32-ld=>Minimum stack size
  →1024

・main.cとsample1.rbとhal.hは↓を使用
・4.1の17は無修正

#プログラム
Lチカのみ

``` sample1.rb
while true
  led1_write( 1 )
  sleep 1
  led1_write( 0 )
  sleep 1
end
```

``` main.c
#include "mcc_generated_files/mcc.h"
#include "mrubyc.h"
#include <stdio.h>
#include <stdlib.h>

extern const uint8_t sample1[];
#define MEMORY_SIZE (1024*20)
static uint8_t memory_pool[MEMORY_SIZE];

static void c_led1_write(mrb_vm *vm, mrb_value *v, int argc) {
    int set_value = GET_INT_ARG(1);
    PORTBbits.RB5 = set_value;
}

int hal_write(int fd, const void *buf, int nbytes) {
    return 0;
}
int hal_flush(int fd) {
    return 0;
}

int main(void)
{
    SYSTEM_Initialize();
    TRISB = 0x0;

    mrbc_init(memory_pool, MEMORY_SIZE);
    mrbc_define_method(0, mrbc_class_object, "led1_write", c_led1_write);
    mrbc_create_task(sample1, 0);
    mrbc_run();
    return 1;
}
```


```hal.h
#define MRBC_NO_TIMER

#ifndef MRBC_SRC_HAL_H_
#define MRBC_SRC_HAL_H_

#ifdef __cplusplus
extern "C" {
#endif

/***** Feature test switches ************************************************/
/***** System headers *******************************************************/
#include "../mcc_generated_files/mcc.h"
#include "../delay.h"


/***** Local headers ********************************************************/
/***** Constant values ******************************************************/
/***** Macros ***************************************************************/

#ifndef MRBC_NO_TIMER
# define hal_init()        ((void)0)
#define hal_enable_irq()  __builtin_disi(0x0000)
#define hal_disable_irq() __builtin_disi(0x3FFF)
#define hal_idle_cpu()    Idle()

#else // MRBC_NO_TIMER
# define hal_init()        ((void)0)
# define hal_enable_irq()  ((void)0)
# define hal_disable_irq() ((void)0)
# define hal_idle_cpu()    ((delay(1)), mrbc_tick())

#endif



/***** Typedefs *************************************************************/
/***** Global variables *****************************************************/
/***** Function prototypes **************************************************/
int hal_write(int fd, const void *buf, int nbytes);
int hal_flush(int fd);


/***** Inline functions *****************************************************/


#ifdef __cplusplus
}
#endif
#endif // ifndef MRBC_HAL_H_
```


##xc32にはdelayがないので作る

xc16はdelayがありましたが、今回はないので作ります。
ただループをするだけです。
delay(1)でおよそ1ms

それぞれファイルを作ってプロジェクトの
Header Files
Source Files　へ Add Existing item…してください

```delay.h
#ifndef _EXAMPLE_FILE_NAME_H    /* Guard against multiple inclusion */
#define _EXAMPLE_FILE_NAME_H


/* Provide C++ Compatibility */
#ifdef __cplusplus
extern "C" {
#endif

void delay(int);

#ifdef __cplusplus
}
#endif

#endif /* _EXAMPLE_FILE_NAME_H */
```

```delay.c
#include <stdio.h>
#include <stdlib.h>
#include "delay.h"

/*
 * 
 */
void delay(int n){ 
    n = n * 1000;
    while(n>0) {n--;}
}
```