フォト
無料ブログはココログ

« 2011年8月 | トップページ | 2011年10月 »

2011年9月

2011年9月28日 (水)

TIとナショセミ

 TIがナショセミを買収したらしいことを、TIのメールマガジンで知った。
「極めて良好な相互補完関係」なのだそうだ。

 がんばれ R = H + M      + N

2011年9月27日 (火)

OpenOCD

 JTAGに関するプレゼンの機会があってその中でOpenOCDのデモをやったら、見事にしくじった。(;_; 午前中に、ちゃんと動くことを確認していたのですよっ。(言い訳だな)

 帰ってからもう一度やってみた。
こんなことがやりたかった。
Img_2896
左:InterfaceのおまけARM(ADuC7026)ボード
右:Jtagkeyそっくりさん

 左下のLEDが点灯している。 本番ではこのLEDが点灯していなかったんだよな(?_?
ここから

  1. OpenOCDを起動する
    openocd.cfg : Jtagkeyそっくりさん用コンフィグファイル
    aduc702x.cfg: ADuC702x用コンフィグファイル
    Openocdstart
    起動すると、TCP:4444で接続できるようになる。
  2. telnetでlocalhost:4444に接続する
    Openocdtelnet
    gdbで接続する場合にはTCP:3333
  3. メモリを読む
    Openocdmdw
    メモリ上のデータ(DWORD)をアドレス0x10000から0x100個読む
    ちゃんと読めないときには全て0xFFFFFFFFが読み出される。(^^;
  4. メモリに書く
    Openocddeadbeef_2  

    アドレス0x10000にデータ0xDeadBeefを書く
    ちゃんと書けてる

 本当はこの後、メモリをシリアルに出力するプログラムをRAMにロードして動作させるのだが...(来年も依頼があったらやろう)



2011年9月24日 (土)

共立電子のキット KBC1-001

 昔 1985,6年あたりだったか共立電子がMCS48のSBCキットを売っていた。
あるアイディアがあって、その装置の制御用に買ったと思う。

KBC1-001

 当時,Z80のSBCは結構高かったけどこのキットは

  • 部品  (8035,7216,LS373 ソケット, CR, セラロkック)
  • KBC1-001

  • 基板
  • KBC1-001 SBC

  • 説明書(共立製:回路図,サンプル,マニュアルの抜粋)

  • uCOM-84ユーザズ・マニュアル(NEC)

が入って確か2000円くらいだった。

 当時アセンブラを持っていなくて、トラ技スペシャルにM80のマクロで8048のアセンブラを作る記事があったので、これを使おうと思っていた。
 また,ROMエミュレータも持っていなかったので、このキットでプログラムを作ろとするとEPROMを消して書いてしなけばならなかった。
 さらに、MCS48のアセンブラは全く書いたことがなかった!(^^;

 マニュアルとトラ技の紹介記事だけでプログラムを作ろとしていたわけで今考えると、結構無謀だったと思う。

 結局別の方法で制御したので、このキットは使わずお蔵入りになっていて、死蔵品箱で見つける度にいつか動かそうと思っている。

 最近uPD8749を入手したのでやっぱり使わないかもしれない。

2011年9月20日 (火)

D7849

久しぶりに日米商事 を覗いてみた. 定休日は月曜と雨の日 (^^;

UVEPROMに混じってuPD7849があったので買ってみた.
uPD7849x5


5ケ525円なので1ケ100円だが,5ケも使わないと思う...
消えているのだろうか?

uPD7849

'91年31週かな?

ダイのアップ
uPD7849 Die

1985,6年くらいだったか共立が売っていた8035を使ったキットを持っている.
これもいつか動かそうと思っているのだが,8035(8048のROM無)より今回入手した8749(8049のEPROM版)の方が内臓RAMが多いので良いかもしれない.

2011年9月15日 (木)

8Queen

 8Queen問題のプログラムを書いてみた.
 8Queen問題といえば,再帰プログラムということで再帰で書いたのだが8051/31は内臓RAMが少ないので関数のネストが深くなる再帰プログラムには厳しい.

DATAとSTACKをXRAMに移したのだがスタックが足りない.ようだ


--- 8queen.mem --
Internal RAM layout:
      0 1 2 3 4 5 6 7 8 9 A B C D E F
0x00:|0|0|0|0|0|0|0|0|a|b|c|c|c|c|c|c|
0x10:|c|c|d|e|e| | | | | | | | | | | |
0x20:|B|T|I|I|I|I|I|I|I|I|I|I|I|I|S|S|
0x30:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x40:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x50:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x60:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x70:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x80:| | | | | | | | | | | | | | | | |
0x90:| | | | | | | | | | | | | | | | |
0xa0:| | | | | | | | | | | | | | | | |
0xb0:| | | | | | | | | | | | | | | | |
0xc0:| | | | | | | | | | | | | | | | |
0xd0:| | | | | | | | | | | | | | | | |
0xe0:| | | | | | | | | | | | | | | | |
0xf0:| | | | | | | | | | | | | | | | |
0-3:Reg Banks, T:Bit regs, a-z:Data, B:Bits, Q:Overlay, I:iData, S:Stack, A:Absolute

 よく見てみると,使った覚えはないiDataやBitsが使われている.(20h-2Dh)
 調べたところ,ライブラリで使われているようで,printf_small()をprintf()に変えると95byte使えるようになった.
 できたバイナリはかなり大きいが,CODEにSTACKは代えられない.

-- 8queen.c ---
Internal RAM layout:
      0 1 2 3 4 5 6 7 8 9 A B C D E F
0x00:|0|0|0|0|0|0|0|0|a|b|b|c|d|e|e| |
0x10:| | | | | | | | | | | | | | | | |
0x20:|T|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x30:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x40:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x50:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x60:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x70:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x80:| | | | | | | | | | | | | | | | |
0x90:| | | | | | | | | | | | | | | | |
0xa0:| | | | | | | | | | | | | | | | |
0xb0:| | | | | | | | | | | | | | | | |
0xc0:| | | | | | | | | | | | | | | | |
0xd0:| | | | | | | | | | | | | | | | |
0xe0:| | | | | | | | | | | | | | | | |
0xf0:| | | | | | | | | | | | | | | | |
0-3:Reg Banks, T:Bit regs, a-z:Data, B:Bits, Q:Overlay, I:iData, S:Stack, A:Absolute


ようやく通った
8queen

再帰呼び出しする関数は次のとおりである. が...

char place(char x, char y) __reentrant {
    static char n = 1;

    if (check(x,y)) {
        table[y] = x;
        if (y==7) {
            printtb(n++);
            return FALSE;
        } else {
            if (place(0, y+1)) {
                return TRUE;
            } else {
                table[y] = 0xff;
                if (x==7)
                        return FALSE;
                else    return place(x+1,y);
                }
            }
    } else {
        if (x==7)
                return FALSE;
        else    return place(x+1, y);
    }
}

ほんとうはこうしたいのだが, 再帰レベルが増えるのでスタックが足りなくなる.

char place(char x, char y) __reentrant {
    static char n = 1;

    if (7<=y) {  /* 解 */
        printtb(n++);
        return FALSE;
    }
    if (7<=x) {  /* 見つからない */
        return FALSE;
    }

    if (check(x,y)) {         table[y] = x;
        place(0, y+1);         table[y] = (u_char)-1;     }
    return place(x+1, y); }

2011年9月 8日 (木)

「知っていること」と「できること」

ずいぶん前に書いた「CPUの創りかた」 をUPしていて考えた.

書籍から得られるのは理論であり技能は実際に作業を体験することで習得しなければならなず,「理論」と「技能」を習得することで「技術」となる. ということで「創ってみたら」と勧めたわけだが,勧めるるからには自分も創ってみなければならないだろう. ということで実際に作ってみた.

と書いている.
 「知っていること」と「できること」にはかなり隔たりがある.さらに「知っていること」は「知っているつもり」だったりする.

 本を読んだり,調べたりした事柄は知識「知っている」になるのだが,これを自分が「できること」と勘違いしてしまう.
「できるようになる」ことを100%とすると,知識を得ると95%くらい達成したように思ってしまう(今まで「知らなかった」ことを「知る」のだから当然なのだが). ところが実際は「できるようになる」ことに要する労力が95%くらい必要である.

 最近は,デジタル回路はHDLで記述してシミュレーションするし,アナログ回路はspiceでシミュレーションして試行錯誤を減らしている.
問題は,シミュレーションが終わったところで実物を作ったような気分になることである.
やはり手を動かして,実物を作ってナンボだと思う.

 子供たちを見ていて感じるのは,
  ×すぐに正解を求める.
  ×失敗すること・間違うことを嫌う

ことである.
経験からいえば,知ることより
  ○間違えたり
  ○失敗したり
することの方が実力が付く.
ところが,今の日本では,頻繁に間違えたり失敗したりする子供は,"落ちこぼれ"と評価されるので正解を知識として記憶せざるをえない.

だからといって,子供たちを責めるのは酷というものだ,大人が作った社会に適応しているだけだから.

 問題は,社会に出たからといってこの習慣が容易に矯正できないことである.
最近は,成果主義とやらでセチガライ世の中なので,誰かが成功した方法をパクる教えてもらうと効率が良いというのも一つの理由である.
 ところがこの方法ではトップになれない.トップになるには誰も成功していない問題を解決しなければならないのだが,誰も成功していないのでパクる教えてもらうことができない.

ということで
 他人の失敗や間違いに寛容になろうと思う. 自分の失敗・間違いには十分に寛容なので. (^^;

2011年9月 7日 (水)

TD4

「CPUの創りかた」のTD4を作ったときの記録

2011年9月 6日 (火)

sdcc

SDCCでテストプログラムを書いてみる.
まずは Hello World


/*
 * hello world
 * Sep.2011 / Yoshi
 */
#include <stdio.h>
#include <mcs51>

#include "io.h"
#define printf printf_fast

void main(void) {
        printf("Hello world!\n");
        exit(0);
}

io.c


#include <stdio.h>
#include <mcs51/8051.h>
#include "e;paulmon2.h"e
#include "io.h"

char getchar(void) {
        return pm2_cin();
}

void putchar(char c) {
        if (c=='\n') pm2_cout('\r');
        pm2_cout(c);
}

void exit(char c) __naked {
        c;
        __asm
        ljmp 0x0000
        __endasm;
}

pm2_cin(),pm2_cout()はPaulmon2への入出力サブルーチンへのインタフェースが記述されたpaulmon2.cで定義されている.
paulmon2.c, paulmon2.h は親切な人が公開しているのでぐぐると見つかる

コンパイル

#sdcc -mmcs51 --model-small --code-loc 0x8000 hello.c io.rel paulmon2.rel

実行結果

Helloworld

九九の表

9x9

printf_fast() は %3d のように出力幅を指定できるが %02x のように0で埋めることができない. printf_small() はその逆らしい.「帯に短したすきに長し」

 EZ-USBで遊んでいたころにsdccを使っていた.    EZ-USBはCODE領域が2kしかないので,printf_tiny()しか使えずソースコードに手を入れて %02x がちゃんと出力されるようにして使っていた.
8031SBCはcode領域が32kとれるのでとっても楽である.

2011年9月 2日 (金)

モニタ(2)

このモニタはかなり高機能である.

プログラムのロード,メモリダンプ,メモリ書き込み等基本機能に加え,
逆アセンブルやシングルステップ動作もできる.

できないのはアセンブルくらいか. いずれにしても,このSBCには十分
過ぎるモニタである.

モニタの起動画面
Paulmon2

HELP画面
Paulmon2_help

LIST画面
逆アセンブルもできる.すばらしい!!.
Paulmon2_list

モニタ

 プログラムはCで書いて,RAMにロードしで動かすことにしよう.

昔は,高級言語といえはBASICくらいしかなかったので,夢のようだ. 

EZ-USBで遊んだ時にもSDCCを使っていたのだが,EZ-USBはUSB経由で
プログラムをダウンロードできる仕掛けがあるので問題にはならなかったが
8031SBCでは,プログラムをRAMにロードするためにモニタをROMに焼いて
おかなければならない.

 モニタに必要な機能は

  • プログラムロード
  • メモリダンプ
  • メモリ書き込み

とりあえずこれくらいあれば使えるだろう.
8051のアセンブラは書いたことがないけど,Cで書けるので,そう難しくない.

 問題はどうやってモニタをデバッグするかである.
EPROMは焼けるけどROMイレーサがないのでEPROMを使った試行錯誤は
とっても大変である.
ここは,巨人の肩に乗ることにしよう.

 ということで,8031のモニタをネットで探してみるといくつか見つかった.
Paulmon2 が良さそうである.

« 2011年8月 | トップページ | 2011年10月 »