2019年03月16日

(動画 2019/03):WAVE/PCM再生: @70円のPIC16Fで8bit PWM player 音楽再生 2017

(動画 2019/03):WAVE/PCM再生: @70円のPIC16Fで8bit PWM player 音楽再生 2017
このページで作ったWave Plyaerの音を動画にしてみました。
WAVE/PCM再生: @70円のPIC16Fで8bit PWM player 音楽再生 2017

実際の音(動画) (2019/03) up!

背景で流れている音楽が、実際にPICで再生してPCで録音した音です。

posted by Copyright (C) avrin All Rights Reserved. at 15:20| Comment(0) | PCM/WAVE | このブログの読者になる | 更新情報をチェックする

2019年02月24日

nim言語:Lubuntu bionic 18.04用 i386のnim-0.19.4のdebパッケージを作ったメモ 2019/02

nim言語:Lubuntu bionic 18.04用 i386のnim-0.19.4のdebパッケージを作ったメモ 2019/02
nim言語でUbuntu/Lubuntuのi386用の*.debパッケージは、
nim_0.19.4-1_i386.debというのが存在するが、これは詳細不明なんだけど、
おそらく「Lubuntu i386 18.10 cosmic」用のもので、
自分が使用している「Lubuntu i386 18.04 bionic」だとlibc6のバージョン不整合でインストールできない。
orz
同じ場所にあるnim_0.19.0-1_i386.debはインストール可能だが、せっかくなので現在最新版の
0.19.4をインストールしたいのだった。

以下、
nim言語:Lubuntu bionic 18.04用 i386のnim-0.19.4のdebパッケージを自分で作った時のメモ 2019/02

参考ページ:
    debパッケージ作成の解説ページ
    第152回 パッケージをビルドしてみる
        http://gihyo.jp/admin/serial/01/ubuntu-recipe/0152

    Ubuntuの*.debとソースパッケージがあるフォルダ
        https://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives/pool/universe/n/nim

参考ページに従って以下のコマンドを実行した。
$ pwd /home/username
$ sudo apt-get install build-essential devscripts
$ dget -u https://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives/pool/universe/n/nim/nim_0.19.4-1.dsc
$ sudo apt-get build-dep nim
$ sudo apt install help2man
$ cd nim -0.19.4
$ time dpkg-buildpackage -r -uc -b -d
...
...
dpkg-deb: building package 'nim' in '../nim_0.19.4-1_i386.deb'.
	install -d debian/.debhelper/scratch-space/build-nim
	dpkg-deb --build debian/.debhelper/nim/dbgsym-root debian/.debhelper/scratch-space/build-nim
dpkg-deb: building package 'nim-dbgsym' in 'debian/.debhelper/scratch-space/build-nim/nim-dbgsym_0.19.4-1_i386.deb'.
	Renaming nim-dbgsym_0.19.4-1_i386.deb to nim-dbgsym_0.19.4-1_i386.ddeb
	mv debian/.debhelper/scratch-space/build-nim/nim-dbgsym_0.19.4-1_i386.deb ../nim-dbgsym_0.19.4-1_i386.ddeb
	dpkg-deb --build debian/nim-doc ..
dpkg-deb: building package 'nim-doc' in '../nim-doc_0.19.4-1_all.deb'.
 dpkg-genbuildinfo --build=binary
 dpkg-genchanges --build=binary >../nim_0.19.4-1_i386.changes
dpkg-genchanges: info: binary-only upload (no source code included)
 dpkg-source --after-build nim-0.19.4
dpkg-source: warning: Testsuite field contains value autopkgtest, but no tests control file debian/tests/control
dpkg-buildpackage: info: binary-only upload (no source included)

real	29m8.233s
user	22m43.114s
sys	2m12.617s

$ cd ..
$ cp nim_0.19.4-1_i386.deb nim_0.19.4-1_i386_bionic_18.04.deb
$ sudo apt install ./nim_0.19.4-1_i386_bionic_18.04.deb
$ nim -v
Nim Compiler Version 0.19.4 [Linux: i386]
Compiled at 2019-03-05
Copyright (c) 2006-2018 by Andreas Rumpf

active boot switches: -d:release
完成したdebパッケージはこれ。 nim_0.19.4-1_i386_bionic_18.04.deb ファイル名は混乱を避けるため[bionic,18.04]を明示してあります。 i386用なので需要はないと思うものの。。。 インストールは上にもあるように、 $ sudo apt install ./nim_0.19.4-1_i386_bionic_18.04.deb でOK. なぜか日付が未来になっている。。。 :-)
posted by Copyright (C) avrin All Rights Reserved. at 11:21| Comment(0) | nim言語 | このブログの読者になる | 更新情報をチェックする

2019年01月26日

nim言語:AVR:Arduino UNO用にコンパイルしたときのメモ 2019/01

nim言語:AVR:Arduino UNO用にコンパイルしたときのメモ 2019/01
STM32F0マイコンでnim言語のコンパイル実行ができたので、次は
AVR:Arduino UNO 互換機(atmega328p)でもnim言語で動かそうと試みた。

やり方は色々あるけど、
(1) Arduinoライブラリをnim言語から呼び出して使う方法。
     C++ライブラリなのでうまく使えるかは未調査。
        ここの人はarmでArudiunoをやったみたい。(詳細不明)
        Nim wrapper using c2nim for Arduino and MediaTek LinkIt One development
        https://github.com/gokr/ardunimo
(2) Arduinoライブラリは使わずに、ポート設定等を自前でベタ書きして使う方法。

上記(2)のパターンは、nim 0.12.0 の頃の例がここにあった。(今は nim 0.19.2)
Nim on Arduino
https://disconnected.systems/blog/nim-on-adruino/
現在のnim 0.19.2ではコンパイルできないので修正が必要だ。
上の例は、
C言語のサブルーチンを作ってそれをnimから呼び出す方法。
それでもいいけど、それだと、C言語と縁が切れないので (^^;

avr-gccのヘッダファイルをc2nimで変換して、nim言語で全て完結する様にしてみた記録。

結論からいうと、nimコンパイラ側の都合で、 orz
現時点で、AVRで使うのは難しい気がします。
ただし、コンパイルオプション等で制御可能かどうかは未調査。
問題はこう、
 現時点のnimコンパイラ(AVR指定した場合)では、
 int32型は内部でint型に変換されてしまう作りになっている。
バックエンドとなるavr-gccに於いて「int」は「16bit」である。
証明終わり。
orz orz orz

ごく普通の話なので、どこかにスイッチがあるかも。
なければやっぱり終了か。
orz

nim言語ソース側で、int32の数値や型を使わない前提なら動作はするけど。。。。orz
8bit/16bitマイコンは全滅、身近で可能性があるのはARMを除くとPIC32MXだけだ。

コンパイルスイッチとint32の使用を避けることで切り抜けた
いろいろ調査したり試したところ、int32の使用を避ることと、
コンパイルスイッチに以下を追加することで、
--passC:"-DHAVE_STDINT_H" 
なんとか使えそうなことがわかりました。
この場合でも、
int32型は使ってはいけません。 int32はuint32で代用します。
どこまで使えるかはアレだけど。。。

せっかくなので、
以下の挙動を確認しました。
(1) ヘッダファイル
   avr-gccのatmega328p用のヘッダファイル、
   iom328p.h
   sfr_defs.h
   をc2nimで変換して
   iom328p.nim
   sfr_defs.nim
   とした。
   volatileレジスタのアクセスのためにnim/arm/STM32F0で作成した
   reg_utils.incも使用。
(2) Arduino ボード上のLEDを1秒周期で点滅。
   avr-libc:<util/delay.h>内の「_delay_ms()関数を」nim言語側から呼び出すのに成功。
    便利な busy-wait 遅延ループ
    http://cega.jp/avr-libc-jp/group__util__delay.html
    最初は_delay_ms()を使いましたが、今はTIMER0の1msec割り込みでmillis()関数を
    作って対応しています。
(3) UARTを38400bpsで設定、ChaNさんのxprintf()の接続に成功。
    シリアルポートに適当な文字列を1秒ごとに出力する。
(4) PWM出力とPWM周期割り込みを起動
(5) SPI:
    SPI出力テストは、sys.nim内のLED_DEBUG=falseの場合に有効になります。(デフォルトはtrue)
    (LEDポートとSPI クロックが同じポートなので)
    SPI SCK=8MHz でテストデータ出力。 (0xFFを出しているだけ)
    SPIデータはPWM周期割り込み中で出力します。(8バイト分)
    pwm.nim 参照
(6) 割り込み関数: 定義と呼び出し方
    emitプラグマで定義していますが、別途C言語ファイルを作ってコンパイル・リンクする
    方法もあるかと。
    systick.nimを参照。

コンパイル
    avr-gcc(ver.5.4.0)(注2) とnim(ver.0.19.2)に実行パスが通っている必要があります。
    makeとrmコマンドも必要です。
    コマンドラインで
    $ nim c main
    と打つだけでコンパイルが完了してAVR用のelfファイルが出力されますが、
    AVRに書き込むためにHEXファイルが必要なので、結局
    $ make
    でコンパイルするのが無難かと。この場合mapファイルも出力されます。
    Arduino UNOに書き込む時は, guidude等を使います。
        http://mpu.seesaa.net/article/399685603.html
    コンパイルに必要な情報はnim.cfgというファイルに集約されています。

nim.cfg
以下で、"--"で始まるオプションはnimのコマンドライン引数として渡すことも可能。
書き方もいろいろあるみたい。
黄色の部分は結構重要で、不要なオプションが付かない様にしてあります。
これも、どの階層のnim.cfgを無効にするか等、コンパイル時オプションで回避することも可能な様です。
詳細はここ、
Configuration files
https://nim-lang.org/docs/nimc.html#compiler-usage-configuration-files
あとC言語ソースをnimからコンパイルして使う場合、"-std=gnu11"等を指定した方が良い。(注3)
avr.standalone.gcc.exe = "avr-gcc"
avr.standalone.gcc.linkerexe = "avr-gcc"

gcc.options.always = ""
gcc.options.debug =""

--stacktrace:off
--gc:none
--os:standalone
--cpu:avr
--deadCodeElim:on
--passC:"-Os"
--passC:"-DF_CPU=16000000UL"
--passC:"-mmcu=atmega328p"
--passC:"-ffunction-sections -fdata-sections"
--passL:"-mmcu=atmega328p"
--passL:"-Wl,--gc-sections"
-d:release
--opt:size
--nimcache:nimcache
--verbosity:1

# Very important option for 8bit AVR
--passC:"-DHAVE_STDINT_H" 
nimソースコード 以下が、AVRレジスタ定義を直接使ったコード。 import iom328p の定義で、すべてのレジスタ設定ができるのでC言語ファイルなしでもコードを 書くことができる。 (今回はお試しなのでC言語関数の「xprintf()」と「_delay_ms()」を使ってみた) main.nim:
#[
  2019/01 by audin (http://mpu.seesaa.net)
  Nim language test program for [[ Arduino UNO ]] and its compatilbes.
  AVR = atmega328p / 16MHz
  avr-gcc: ver.5.4.0
  nim: 0.19.2
  UART baudrate 38400bps
  This program is under MIT license.

  Note: DON'T USE type of int32. USE uint32 instead of it,
      AND ADD --passC:"-DHAVE_STDINT_H" TO COMPILATION OPTION OF nim.
      ( nim 0.19.2 at this moment )
  Resources mainly used:
      LED    (sys.nim): PB5,D13 ( led_on()/led_off() )
      UART   (uart.nim): 38400bps with xprintf() (by polling out one char).
      TIMER0 (systick.nim): 1msec interval timer for millis() function with interrupt TIMER0_OVF_vect.
      TIMER1 (pwm.nim,systick.nim): Period timer for PWM out,
                                 OC1A: PB1, 15pin, D10
                                 OC1B: PB2, 16pin, D9
                                 TIMER1_OVF_vect is used as PWM period interrupt.
      SPI (spi.nim) : SCK=8MHz with chip select pin,
                                 CS: PB0, 14pin, D8 ( cs_set()/cs_clr() )
      Test pin (sys.nim): Output,PD7, 13pin, D7    ( test_on()/test_off() )
]#

import iom328p
import sys,pwm,systick,spi,uart

{.compile:"xprintf.c".}
proc xprintf(formatstr: cstring){.header: "../xprintf.h", importc: "xprintf", varargs,used.}
###
#proc delay_ms(ms:cdouble){.header:"<util/delay.h>",importc:"_delay_ms",used.}


proc initPort*() =
#/* set pull up to i/o port. */
    PORTB.st 0xFF'u8
    PORTC.st 0xFF'u8
    PORTD.st 0xFF'u8
    DDRB.st 0xEF'u8 #/* in: PB4 */
    DDRD.st 0xFF'u8 # all output port

# main program
proc main() =
    initPort()
    initSystick()
    initUart(mBRate(BAUDRATE)) # 38400bps
    when not LED_DEBUG:
        initSpi() # SCK=8MHz
    # PWM setting
    initPwm()
    setPwmPeriod(44100'u32) # PWM period [Hz]
    pwm1_duty(50)
    pwm2_duty(100)
    pwm_start()

    # enable PWM period interrupt
    enablePwmPeriodIntr()

    # enable all interrupt
    ei()

    var num_ui = 0.uint
    while true:
        when LED_DEBUG:
            led_on()
            wait_ms(500)
            led_off()
            wait_ms(500)
        else:
            wait_ms(1000)
        xprintf("\n Number = %u", num_ui)
        num_ui += 10


# Run main function
main() 
コンパイルに必要なファイル: main.nim 以外に必須なファイルは黄色のもの。 Makefileの中でHEXファイルの生成をしています。
    iom328p.nim   # I/Oレジスタ・アドレス定義ファイル(a)
    main.nim
    Makefile
    nim.cfg
    panicoverride.nim
    reg_utils.inc      # nimのvolatileアクセス用 (b)
    sfr_defs.inc       # avr-gccのvolatileアクセス用 (c)
    xprintf.c
    xprintf.h
    pwm.nim
    systick.nim
    spi.nim
    sys.nim
    uart.nim
    
(a)と(b)があれば(c)をほぼ全部省略可能だが「sfr_defs.inc」になるべく手を入れずに使用した。 Dowonload 準備中 nimallフォルダ: 上記コードとファイル群 nimcフォルダ: 以下のページのコードをnim 0.19.2でコンパイル可能にしたもの。 Nim on Arduino https://disconnected.systems/blog/nim-on-adruino/ 割り込みの禁止許可の定義: インラインアセンブラを使いました。
proc ei*(){.used,inline.} =
    asm """
        "sei" : : : "memory"
    """
proc di*(){.used,inline.} =
    asm """
        "cli" : : : "memory"
    """
割り込み関数の定義 こんな感じ (systick.nim)でemitプラグマを使って、 割り込み関数をC言語でnimに埋め込んで、中身はnim側で記述します。 systick.nim:
{.emit: """
#include <avr/interrupt.h>

static void inline systickIntr(void);
ISR(TIMER0_OVF_vect){
    systickIntr();
}""".}

{.emit:"""
#include <avr/interrupt.h>

static void inline  pwmPeriodIntr(void);
#pragma GCC optimize ("O3")
ISR(TIMER1_OVF_vect){
   pwmPeriodIntr();
}""".}

中身は以下のように記述。
proc systickIntr(){.exportc,inline.} =
   ... some code ...

proc pwmPeriodIntr(){.exportc,inline.} =
   ... some code ...
上記青色の #pragma GCC optimize ("O3") の追加で割り込み関数を高速化することも可能です。 かなり効果ありました。(その代わりコードサイズは増える) ここまでの感想 現時点(2019/01)では世界的に見ても、8bit/16bitマイコンではLEDチカチカ以上のサンプルがなかなか 発見できない中、 int32問題に遭遇し、最初は使えないかと思ったが、なんとか使える様に工夫できたと思います。 (o_o)/ 発見したページ msp430(16bit)マイコン用。割り込みを使っている様だ。 https://gitlab.com/jalexander8717/msp430f5510-nim/tree/master (注1) 使用中のnimコンパイラは32bit版でnim 0.19.2。 (注2) Arduino 1.8.8に付属のavr-gccを使用。 (注3) gnu11はArduinoでC言語ソースのコンパイル時指定されているもの。 gnu+11は同様にC++言語ソースの時指定されている。 avr-gcc 4.x系ではC89がデフォルト、5.x系ではgnu11がデフォルト。 参考: GCC 5系初のリリースとなる「GCC 5.1」登場 https://mag.osdn.jp/15/04/24/152100
posted by Copyright (C) avrin All Rights Reserved. at 22:33| Comment(0) | nim言語 | このブログの読者になる | 更新情報をチェックする

2019年01月14日

Musicメモ 2019/01

Musicメモ 2019/01
* Crazy Glue (2017)
Melanie Ungar

https://www.jamendo.com/track/1480482/crazy-glue
歌声に恵まれてる。テイラー・スイフト風。
どこかで聴いたようなオールディーズっぽい曲。
誰かのカバーなのか? 思い出せない。 orz

* I Love How You Loved Me (2018)
Always the Alibi

https://www.jamendo.com/track/1513477/i-love-how-you-loved-me

* Fire, Fire (2018)
The Devil Music Co.

https://www.jamendo.com/track/1565058/fire-fire

* Constellate (2018)
Fleurie

https://www.jamendo.com/track/1549463/constellate

* Just a Stranger (2018)
MCKOOL

https://www.jamendo.com/track/1567808/just-a-stranger

* By Your Side by Mallz & Deron Alek (2018)
Cartel

https://www.jamendo.com/track/1593685/by-your-side-by-mallz-and-deron-alek

Taylor Swift - Look What You Made Me Do
https://www.youtube.com/watch?v=3tmd-ClpJxA
テイラー・スウィフトのMVに潜むヤバすぎる秘密を完全解説
https://front-row.jp/_ct/17122411
"MV"って何かと思ったらミュージック・ヴィデオのこと。

mvとpv違いとは:どのように捉えるか
https://www.cyring.co.jp/%E6%98%A0%E5%83%8F%E8%B1%86%E7%9F%A5%E8%AD%98/mv%E3%81%A8pv%E9%81%95%E3%81%84%E3%81%A8%E3%81%AF-%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E6%8D%89%E3%81%88%E3%82%8B%E3%81%8B/

アカペラ
https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%BB%E3%82%AB%E3%83%9A%E3%83%A9
posted by Copyright (C) avrin All Rights Reserved. at 21:04| Comment(0) | その他 | このブログの読者になる | 更新情報をチェックする

2018年12月23日

nim言語:STM32のヘッダファイルをc2nimした時のメモ 2018

nim言語:STM32のヘッダファイルをc2nimした時のメモ 2018
c2nimは、c言語のソースとヘッダファイルをnim言語ソースに変換してしまうツール。
$ nimble install c2nim
でインストールできる。

$ c2nim foo.c $ c2nim boo.h $ c2nim --cpp moo.cpp
等で変換できる。 でも、中身がC言語で拡張子が*.cppファイルのソースはうまくいかない感じ。 その場合、拡張子を*.cにするとOKだった。orz 以下は、STM32マイコンのヘッダファイルを変換したときの記録。 STM32CubeMXで生成された「Nucleo-F030R8」用のプロジェクトフォルダ以下にある、 Drivers\CMSIS\Device\ST\STM32F0xx\Include\stm32f030x8.h というヘッダファイル。 5500行くらいあるんだけど、これをc2nimで変換してみました。 そのままではエラーで変換できないので「手動」で修正しました。 以下その時の記録。 誰かが変換スクリプトを作るのを期待したい。 (1) [置換対応] 「__IO」は「volatile」に置換。 (2) c2nimの実行時オプションに --skipincludeを追加。 これは#include文をimport文に変換しないオプション。 手動でやってもたいした違いはない。 (3) [置換対応] 先頭が一つ以上のアンダースコアで始まる名前はアンダースコアをカットする。
例: __FOO_BAR ---> FOO_BAR _FOO_FUZZ ---> FOO_FUZZ
この手のプレフィックスについては、コマンドラインオプションで --prefix:__ --prefix:_を追加で自動カットできそう。(試してないけど) これで「c2nim」が通るはず。 次は変換されたnimファイルを実際にインポートして出たエラーを潰していきます。 (4pre) volatileは結局エラーになるので全部カット。 (1)の時点で__IOをカットしたほうがよかったか。 (4)[置換対応] unin32_t、uint16_t、uint8_tはそれぞれuint32、uint16、uint8に置換 これらはサフィックスをカットする--suffix:_tオプションで 自動カットできるかも。(試してない) (5) キャストエラーを修正する。数カ所。
const CRC_IDR_IDR* = (cast[uint8_t](0x000000FF)) ## !< General-purpose 8-bit data register bits
const CRC_IDR_IDR* = (0x000000FF.uint8) ## !< General-purpose 8-bit data register bits
uint16版のエラーも出るのでそれも同様に修正する。 (6)名前の衝突エラーを修正する。 これはnimが「_」(アンダースコア)を無視して"識別子を認識する"ことに由来している場合と、 c2nimのバグの可能性と2種類ある様ですが、対処します。 例えば以下の行はエラーになるが、なぜエラーなのは不明。
GPIO_MODER_MODER10* = GPIO_MODER_MODER10_Msk
しかたがないので、単にコメントアウトします。(適当なサフィックスを付けて残す手もある)
# GPIO_MODER_MODER10* = GPIO_MODER_MODER10_Msk
これは名前の衝突の例:コメントアウトします。 WWDG_CR_T0* = WWDG_CR_T_0 (7) 未定義の識別子をコメントアウトする。 RCC_AHBENR_TSCEN等々が未定義エラーになるのでコメントにする。 (8) 外部参照の関数名もコメントアウト 今のところ対処法が不明なので全部コメントアウトします。 例えば、ADC1_IRQHandlerは割り込みハンドラーなので外部ファイルに存在するが、 インポート方法がわからないので全部when文でカット。 リネームしているだけなので不要かと。
when false: const ADC1_COMP_IRQHandler* = ADC1_IRQHandler ... ...
実際に使った例 実際には、core_cm0.hを変換したものをインクルードして使っています。 ここで使ったもの。 nim言語でNucleo-F030R8を動かした時のメモ 2018/12
posted by Copyright (C) avrin All Rights Reserved. at 11:55| Comment(0) | nim言語 | このブログの読者になる | 更新情報をチェックする