スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ちょっと便利: LPC系のUARTの分数分周器の設定を出すスクリプト

LPCのUARTには半端なボーレートを扱える様にFDR(Fractional Divider Register)という
便利な機能がくっついてます。
んでも、これ使いどころが難しいので
PCLKと目標ボーレートを入れると
自動的にヨサゲな候補値を探してくるスクリプトを去年ぐらいに書きました。
自分で使うハメになったのでせっかくなので公開します。

さあつかえ



#copyright 2012 inanzu / Z product
#licensed by CC-BY http://creativecommons.org/licenses/by/2.1/jp/legalcode

from math import *
PCLK = float(raw_input('PCLK[Hz]:'))
BAUDRATE = float(raw_input('Desired baudrate[bps]:'))
divrate = PCLK/(16.0*BAUDRATE)
baudset = []
for frac in range(1,15,1):
for div in range(frac):
dl = (divrate * float(frac))/(float(frac+div))
dl_int = floor(dl)
# print "frac %d div%d DL %f6 DLint %d \n" % (frac, div, dl, dl_int)
clk = PCLK/(16.0*dl_int*(1.0+float(div)/float(frac)))
errRate = 100*(clk-BAUDRATE)/BAUDRATE
# print "Clock:%f error:%f \n" % (clk,errRate)
baudset.append((clk, int(dl_int),frac,div,errRate))
baudlist = sorted(baudset, key=lambda x:fabs(x[4]), reverse=False)
print
print "freq:%f2 DL:%d frac:%d div:%d ErrorRate(%%):%f6" % baudlist[0]
DL = baudlist[0][1]
DLM = DL / 256
DLL = DL % 256
FDR = baudlist[0][2] << 4 | baudlist[0][3]
print "DLM %s DLL %s FDR %s" % (hex(DLM),hex(DLL),hex(FDR))
print "freq:%f2 DL:%d frac:%d div:%d ErrorRate(%%):%f6" % baudlist[1]
print "freq:%f2 DL:%d frac:%d div:%d ErrorRate(%%):%f6" % baudlist[2]
スポンサーサイト

LPCwareのPinMuxToolが出すIncludeをLPCxpresso用に変換するプ(以下略

要Python2.7。
というか存在を忘れていた。動作の保証はしません。AS ISは世界の掟。


#! /usr/bin/python

# WARNING
# ARRAY WAS HARDCODED TO MATCH IOCONs OF LPC17xx/LPC18XX
portArray = [[-1]*32,[-1]*32,[-1]*32,[-1]*32,[-1]*32,[-1]*5]

import re
query = re.compile(r'(?:\s*PINMUX\(P)?(\d)(?:\[)(\d+)(?:\]\s*,\s*)(\d+)')

for line in open('Ioconf.h', 'r'):
result = query.match(line)
if result:
Port, Pin, Value = map((lambda x:int(x)),result.groups())
portArray[Port][Pin] = Value
for port in portArray:
for pin in port:
if pin <0:
print "ERROR: undefined pin detected."
quit()

outFile = file('ioConf.c', 'w')
outFile.write("""/*
* ioConf.c
* This file was written by ioconvert.py
* You shouldn't touch this file unless debugging...
*/

#include "LPC177x_8x.h"

void ioConf(void){
""")
funcTemplate = " LPC_IOCON->P{PORT}_{PIN} &= ~0x7;\n LPC_IOCON->P{PORT}_{PIN} |= {VALUE};\n"
pin = 0
port = 0
for pinArray in portArray:
for value in pinArray:
outFile.write(funcTemplate.format(PORT=port,PIN=pin,VALUE=value))
pin = pin+1
pin = 0
port = port+1
outFile.write("}\n")
outFile.flush
outFile.close

ubuntu類のamd64環境でLPC-Linkを動かす方法

LPC-Linkを認識しない!
no emurator

てな画面を見てしまったそこなあなた。
LPC-Linkはlibusbが必須なのだけど、32bitアプリなのでシステムに入ってるlibusbではちゃんと動かないのが原因。
だけど、LPCxpressoにはちゃんと必須ライブラリも同梱されてます。
$ ls /usr/local/lpcxpresso_4.2.3_255/lpcxpresso/bin/lib*
/usr/local/lpcxpresso_4.2.3_255/lpcxpresso/bin/libLPC_Link.so
/usr/local/lpcxpresso_4.2.3_255/lpcxpresso/bin/libRDB_Link.so
/usr/local/lpcxpresso_4.2.3_255/lpcxpresso/bin/libftd2xx.so
/usr/local/lpcxpresso_4.2.3_255/lpcxpresso/bin/libftd2xx.so.1.0.4
/usr/local/lpcxpresso_4.2.3_255/lpcxpresso/bin/libusb-1.0.so.0

ただ、ここにライブラリパスが通っていないのでlibusb-1.0.so.0が読み込まれないだけの模様。
libusb-1.0を用意すれば良いのかというと、ubuntu系列ではi386版のlibusbは0.1.4までしか用意されてない。
ではどうすれば良いのかというと、しかるべき場所にシンボリックリンクを置けばよしと言う事。
具体的には、LPCxpresso 4.2.3を普通にインストールしたら下記の通りになります。

$ sudo ln -s /usr/local/lpcxpresso_4.2.3_255/lpcxpresso/bin/libusb-1.0.so.0 \
/lib/i386-linux-gnu/libusb-1.0.so.0


※\マークは改行を1行につなげるために入ってます。一行を一発で打ち込んじゃってもOK
これでOK。
ためしてみてね!

Eagle6.2.0をUbuntu 12.04 LTS(x86_64)に入れる方法


みんな大好きUbuntu x64_86
なわけないか。そうでもないか?

今回はUbuntu 12.04 LTS x64_86にかの有名な基板CAD Cadsoft Eagle 6.2.0を入れます。ちなみにEagle5.12は

$ sudo apt-get install eagle:i386 eagle-data


とやればあっさり入るので頑張ってください。

まず第一に大事な事。上を見ればわかるとおり、Eagleって32bitバイナリ配布のアプリです。64bit環境に入れた場合、ライブラリが不足します。
具体的にはEagleは32bit版ライブラリで下記の
  • libpng14.so.14
  • libssl.so.1.0.0
  • libcrypto.so.1.0.0
  • libjpeg.so.8
を必要とします。
libcrypto.so.1.0.0とlibssl.so.1.0.0は両方共libssl.so.1.0.0:i386パッケージに含まれています。libjpeg.so.8はlibjpeg8-turbo8:i386パッケージに含まれています。よって・・

$ sudo apt-get install libssl.so.1.0.0:i386 libjpeg8-turbo8:i386


2012/7/18 訂正

$ sudo apt-get install libssl1.0.0:i386 libjpeg8:i386



これで3つまではクリア。残りのlibpng14.so.14だけです。だけど、これは標準パッケージがありません。

じゃライブラリ作りますか。
先にビルドに必要なパッケージをインストールしておきます。
(※多分足りてると思うけど足りなかったり余ってたら報告お願いします)

$ sudo apt-get install build-essential flex bison guile m4 libtool gcc-multilib libc6-i386-dev lib32z1-dev


2012/7/18 訂正

$ sudo apt-get install build-essential flex bison libtool gcc-multilib libc6-dev-i386 lib32z1-dev

不足しているlibpngはここで開発されています。libpng14.so.14の"14"はバージョンのことで、この場合は1.4.xxxを指します。

今回は自分のホームディレクトリの下にopt32というディレクトリを作って
そこへ追加ライブラリをインストールします。コマンド内に出てくるopt32という文字は適当に置き換えちゃって平気です。
こちらから、libpng-1.4.11.tar.bz2を適当な作業ディレクトリにDownloadしておきます。

$ tar xvf libpng-1.4.11.tar.bz2
$ cd libpng-1.4.11
$ ./configure --prefix=$HOME/opt32 CFLAGS=-m32
$ make; make install

これでライブラリは作成終了です。次にeagleをインストールします。先にeagleのバイナリ(eagle-lin-6.2.0.run)はダウンロードしてあるものとして

$ chmod +x eagle-lin-6.2.0.run
$ LD_LIBRARY_PATH=$HOME/opt32/lib ./eagle-lin-6.2.0

これでインストーラーが動きます。
最後に、eagleの実行バイナリにLD_LIBRARY_PATHを通すように設定します。

$ alias eagle 'LD_LIBRARY_PATH=$HOME/opt32/lib eagle'


とりあえずこんなところでOKなはず。(※うちではaliasではなくてbash scriptで起動してます。中身はこんな感じ)

#!/bin/bash
LD_LIBRARY_PATH=$HOME/opt32/lib $HOME/opt32/eagle


嵌りやすいところ
  • libpng作る段で割と32bitバイナリを作るときにありがちな
    CC="gcc -m32" LD="gcc -m32" AS="gcc -c -m32" ./configure
    とやるとsoファイルできません。よく考えれば当たり前ですがorz
  • ubuntuではLD_LIBRARY_PATHをシェル起動時に必ず消去してくれる機能が付いているので.profileに書くのは諦めろ
  • 存在感の薄いlib32z1-devに注意


追記:libXrender.so.1が不足する場合


libXrender.so.1が不足する場合(おそらくxubuntuやkubuntuの場合)libXrender.soとその仲間をたす必要が出てきます。この場合下記の通りapt-getを行います。

$ sudo apt-get install libxrender1:i386 libxrandr2:i386 libxcursor1:i386 libfreetype6:i386 libfontconfig1:i386 libxi6:386

テーマ : パソコン関連お役立ち情報
ジャンル : コンピュータ

テストデーターの公開?

実際作図したのは良いんだけど、さて・・・なんてタイトルをつけりゃ良いのか。
出来上がりはこうなんですが
出来上がり
こう動く。

で、
データーなんですが、
http://dl.dropbox.com/u/801144/inanzu.tar.gz
カオスデス。実際に切削したデーターを本人が把握していないという。
幾つか注意点。

  • 組立の時にベアリングをアクリルに締バメで入れてます。コレは切断の都度調節してください。

  • 実際に使った部品はFPGA-Cafeにおいてある実物を見ながら確認してください。って無茶苦茶だけどしゃーない!

  • inkscapeのPreferenceのTools->Bounding box to use: -> Geometric bounding boxを選択してTransforms -> Scale Stroke Widthは外しとくといいですよ


Geometric Bounding boxも変な誤差があるのでびみょー何ですけどね・・・

続きを読む

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。