H8
>>1
↓ _人
∩ ∧_∧ ノ⌒ 丿
\ヽ_( ) _/ ::(
\_ ノ / :::::::\
∩_ _/ / ( :::::::;;;;;;;)
L_ `ー / / / \_―― ̄ ̄::::::::::\
ヽ | |__/ | ノ ̄ ::::::::::::::::::::::)
| ̄ ̄ ̄\ ノ こんな ( ::::::::::::::;;;;;;;;;;;;ノ
| | ̄「~| ̄( 、 A , )クソスレ / ̄――――― ̄ ̄::::::::\
| | | | ∨ ̄∨ ( :::::::::::::::::::::::::::::::::)
し' し' \__::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;ノ
__
>>1 l ̄/. ___
↓ / /. / ___ノ
__/ /_/ /
たてんじゃねー! Y人, ' ',人⌒ヽ、, '
Y⌒ヽ)⌒ヽ、 人,ヽ)人'、, '
へ, --- 、 ノ ̄ ::::::::::::::::::::::)
/ ̄ ̄ ̄ 、____\ ( ::::::::::::::;;;;;;;;;;;;ノ
/ _/ ̄「~|\ __ \ / ̄――――― ̄ ̄::::::::\
| | | | ( 、 A , \ミソ ( :::::::::::::::::::::::::::::::::)
し' し' と∨ ̄∨ \__::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;ノ また建てたのか今更だろ
みんなでルネの代替にどのマイコン使うか決めようぜ 今の新卒はphpできるだけで年収1000万円で採用されるよ
h8なんて使ってる場合じゃないな
みんなでphp使えるようになって年収増やそう まじですか
pythonじゃだめですか?
rubyならいくらになりますか? 旧日立系って会社とかで孤立してんのかって心配に成るなw
教育様で始めて触ったマイコンがh8で重いレアルってのは理解出来る
おいらは8086とミップスだったからなあ >>12
自分は応用利かない人間ですよと言ってるも同然だけど、いまどきそんな人材飼ってる会社が
実際にあるんならすげえなあ。 経営統合された会社に速度なんて在るわけがない。
弱い方の会社人員を全部退職させて、ようやく普通の会社の速度になります。 ttp://news.mynavi.jp/series/volt/005/index.html
コレ見てから、
秋月3694+秋月テラ基板でニキシー管やってみようと考えてるんだけど、
3694って 100回以上 ROMに書き込みしたらワンタイム状態になっちゃうの?
誰か過剰に書き込みした経験あるヒトいる? 書き込み制限回数を超えたら書き込めなくなるわけじゃなく
データの保持時間が短くなる。
10年持つはずのものが2〜3年で消えてしまうかもしれないってこと。
だからデバッグ用と最終製品用と2つ買っておくのが吉
どうせ趣味だから2〜3年で消えてもいいや、と1つしか買わないのも
本人が割り切ってるならそれもよし。 何度もフラッシュ書き換えたくないなら、モニタ使えば良いんじゃない?
一度モニタ書き込んだら、ターミナル経由でRAMにプログラム流し込んで実効出来る 10万回超えですぐ同時に劣化が始まる訳でもなく
徐々に消えやすくなっていくだけだし
趣味と割り切れば消えたらまた書き込めば良いんだし おいおい10万回とは何の寿命だ
>>15 は100回以上・・・ っていってるのに でもいちいち書き込むの面倒だな
iplでテープ読み込みして起動してたシステムを思い出した
起動するだけで数時間単位www ** MONITOR SP-1002 **
*LOAD
↓PLAY
LOADING BASIC SP-5030
* SHARP BASIC SP-5030
34680 BYTES
READY
■ 私はこの本を読んで、まだ日本について良く理解していないと思いました。
これを機会に、良く調べてもっと日本を知りたいです。
このメタンハイドレートは、本当に日本の希望になると思います。
まだメタンハイドレートについて知らない人も多いので、
これから広めていきたいです。
メタンハイドレートについて知る人が増えると良いと思います。
これから日本が良い方向にいってほしいと思います。 何 このスレ?
殿堂入りしたチップで何を話すというの? 真空管や鉱石ラヂヲの序列だよ。 >>15
秋月に聞いたら今のロットは1000回書き込み保証とのこと。 H8に慣れ過ぎてしまってほかに移れない。PICもAVRもデータシート読んでも
使い方のイメージが湧かない。 >>15
書き込み回数は、書き込んでから10年ぐらいデータ保持を保証するものだから、
超えたからといって即座に異常が出るわけじゃない。
書き込み異常が出るほどになるにはウン万回書き込む必要があると思う。
>>39
SH と言いたかったのかな?あんまり SH もすすめられないような気もするけど。 元の担当者からの引継ぎもソースコードも失われてるなら必要な場合もあるかもね
> h8のコードをハードエミュするマイコン CPUコアだけならどっかでVHDLだかVerilogだかになってたような気もするけど
H8ってCPUコアだけじゃないんだよな。
ITUとかSCIとかの周辺も無いと。
もう俺の頭の中ではそのへんの周辺まで全部ひっくるめたものが「H8」という認識。 秋月でH8/3694Fのマイコンボード7個買った。
会社で使う。もうこれで最後だと思う。 >>47
うちも買いだめした。Aマークでもうすぐなくなるからね。 機能コストで考えるとものすごくハイパフォーマンスなんだよな。 えらい曖昧な質問だな
WAVフォーマット的にも
再生方法的にも >>52
曖昧ですみませんでした。
WAVはモノラルのPCMで、PWM出力で実現できるでしょうか? 3069ってD/A付いてるからPWMなんかやらんでもいいのでは 10 774ワット発電中さん 2013/10/28(月) 07:17:32.25 p+yIU5A
秋月電子社長のインタビュー
http://president.jp/articles/-/10921
この本文中に
|私が仕入れた日立のある部品なんて、1ヶ月に5000個も6000個も売れたので、
|思い切って3万個仕入れたら、1ヶ月に10個しか売れない。
|これは申し訳なかったですね。でもね、それが震災後に昔のICが必要だということで、
|ある業者さんが全部買ってくれたんですよ。
とあるが、もしやH8か 復興予算でh8互換の新しいマイコン作れば良かったのにな
秋月に在庫があったばかりに
東日本大震災の復旧・復興について重点的に検査が行われ、このうち昨年度までの2年間に計上された19兆円余りの復興予算について、ことし3月末の時点で基金に支払われた補助金を含め、およそ6兆5000億円が次の年に繰り越されるなどして使われていなかったと指摘 プログラミングは H8 > R8C > RL78 で楽だが。
回路規模もおそらく H8 > R8C > RL78 だろう。
H8はレジスタも32ビットで汎用性が高い。回路規模も大きいだろうし
配線もかなり多いはず。レジスタが多いのはタスク切り替えでは
不利になるが、H8-300Hにはレジスタバンクもない。
H8のuCLinuxまで動作させられる汎用性は中途半端な性能と高価格を招いている。
組込み用途で負け組になったのはしかたがないだろう。 組み込みといえども最近は全部ネットに繋がるからフルスペックのリナックスが必要
ちゃんと枯れたbsd tcp stackでもいいけどさ
h8にはmmuが無かったのが致命的
mc68000みたいに外部mmuでもあれば流れは変わっていたかもね >>64
なんでもかんでもネットに繋げなくていいだろ >>64
そういうのはSHの守備範囲、RZに置き換えられることになったが。
推測だがH8の守備範囲が大きくなったのはH16がだめになったから
なんだろうな。
ローエンドは安いことが一番、RL78が採用されたのはそのためだろう。
パイプラインがあるので単純に比較できないが、汎用レジスタは 8ビットの
レジスタが8本しかない。回路規模は小さいんだろう。 >>66
>汎用レジスタは 8ビットの
>レジスタが8本しかない。
32個あるよう >>67
前後関係からRL78のことを言っていると分かると思ったが、君のために訂正すると
>汎用レジスタは8ビットの --> RL78の汎用レジスタは8ビットの
RL78はH8よりレジスタ数も少ないので価格が安いと言いたかったのだが。 >>68
>RL78の汎用レジスタは8ビットの
32個あるよう >>69
レジスタバンクのことを言っているのか。
それを汎用レジスタが32個あるとは言わないだろう。
カタログに32個の8ビット汎用レジスタがありますって書いたら詐欺だろう。 なんだ、レジスタバンクとしてもフラットな32個のレジスタとしても使えるのを知らないのか。 >>72
知らないが残りの24個のレジスタは"汎用"レジスタとして使えるのか?
単にデータを保持するだけのレジスタを"汎用"レジスタとは呼ばないぞ。 >>73
>単にデータを保持するだけのレジスタを"汎用"レジスタとは呼ばないぞ。
直値との演算やインクリメント/デクリメントとかできるよ。 >>74
メモリに対しても出来る程度のこと。つまりメモリでしかない。
そんなのを汎用レジスタとは呼ばない。
つまりレジスタバンクで裏のレジスタをアクセスできるようにしただけ、違うかな。 >>75
>そんなのを汎用レジスタとは呼ばない。
ソフトウェアマニュアルの表記が “汎用レジスタ” なのだからお前が何言っても意味がない。 >>76
マニュアル見て調べる気もしないが、32個の汎用レジスタの正体は理解できたようだな。
これで32個の汎用レジスタがありますなんて書いたら詐欺と言われてもしかたがないと
言った理由も理解できたかな。 >>77
>マニュアル見て調べる気もしないが、32個の汎用レジスタの正体は理解できたようだな。
理解も何も、前から asm でバリバリ書いてるけど、RL78 のプログラムの効率化は汎用レジスタの
使いこなしがキモだよ。 >>78
それは失礼した。もし自分がそこまでの知識があったなら、汎用レジスタが32個なんて
恥ずかしい発言はできなかっただろうな。ルネサスがどう呼ぼうと汎用レジスタが
どいうものかぐらいは分かっているだろう? >>79
お前が “汎用レジスタ” をどのように捉えてるかなんて知るかよ。
RL78 は演算命令は a レジスタに集中してるアーキテクチャだし、mov a,b や mov c,a はできるが
mov c,b はできない程度に直行性の低いアーキテクチャで、H8 の知識を基に “汎用レジスタ” とは
何であるか等語ったところで意味などない。 >>80
汎用レジスタがどういうものかは別として、レジスタとメモリの区別くらいつくんじゃないの。
繰り返すことになるが、バンクの裏になっているのは単にメモリでしかない。
それくらいは分かっているだろう。
それを分かっていて32個の汎用レジスタがあるという主張ができるのは逆にすごい。
せいぜいRL78の汎用レジスタは32個ありますと啓蒙してくれ。 >>81
>汎用レジスタがどういうものかは別として、レジスタとメモリの区別くらいつくんじゃないの。
PC 以外のレジスタはメモリに割り付けられてる RL78 で何言ってんの? 8051(8bitレジスタが32本あるフリの元祖)の5番煎じくらいのアーキで喧嘩しちゃだめ。 H8マイコン活用記事全集 2013年 12月号 [雑誌]
価格:¥3,990
出版社: CQ出版; 不定版 (2013/11/25)
発売日:2013/11/25
さよならH8思い出編みたいな H8は終了でもネタ集としては有用かもしれん。買っとくかな。 >>90
10年分の記事のCD-ROMだから気に入らないと?
http://www.cqpub.co.jp/hanbai/books/MSP/MSPZ201312.htm
> 「トランジスタ技術」に2001年1月号から2010年12月号までの10年間に掲載された
> 多数の記事の中から,H8マイコンを集め,PDFファイルでCD-ROMに収録します. H8は8Sや8SXなど互換性持つラインもあるし地味に使われても良い気もする。
PICや8051は息の長い製品だよ。 >>98
デカイのになると、40桁×8行というのもあるよ。 >>95
PICや8051が伸びてるのはそれなりに理由がある。
今時、H8なんか使う理由が見当たらないんだが。 8051は今のARMみたいに、あちこちに使われてた時期がありましたね。
さすがにもう伸びしろはほとんど残っていないというか、ARMに役割を譲りつつあると思いますが。 >>101
1年前のレスにレスしても
読まれるかどうかわからんしな R0参照のtvゲーム用のくろさわ乱数器作ったからもりあがりつつ使え
_main_この木何の木木になる木:
jsr @_kuroini
jsr @_kuro16
jmp @_main_この木何の木木になる木
;
_kuroini:
mov.w #6502,R0
mov.w #h'4b18,R1
mov.w #h'32a9,R2
rts
_kuro16:
xor.w R1,R0
sub.w R2,R0
rotl.w R0
rotl.w R0
rts ローテクロジックデバイス下請けさんとして働くH8コード3664F用だからありがたく焼きなさい
(PLD風なソフトロジック実装なため遅い.論理回路の実験用)
;P1=IN,P2=OUTの7400と等価
loop:
mov.b @H'FFD4,R0L ;port1 read
cmp.b #3,R0L ;P0,P1が同時にHのとき3なので比較
bne j1
mov.b #1,R0H ;3のときにP2_0をHにする
jmp @j2
j1:
mov.b #0,R0H ;P1_0,P1_1が双方とも1でないときはP2_0=L
j2:
mov.b R0H,@H'FFD5 ;port2 write
jmp @loop 74HC04のインバータ(P1=IN,P2=OUT)もソフトPLD実装したのでLEDチカチカしなさい
loop:
mov.b @H'FFD4,R0L
not.b R0L
mov.b R0L,@H'FFD5
jmp @loop LED調光ノイズ酷いので3664F用PWMClock拡散コードを作ったのでノイズ抑制しなさい
_pwmnoize:
;PWMノイズ吐き気するほどヤバイので適当なタイミングで呼びノイズ拡散すべし諸氏死
mov.b @H'FF80,R0L ;TMRWstop
bclr #7,R0L
mov.b R0L,@H'FF80
mov.w @H'FF88,R1 ;TGRAToggle
xor.w #3,R1
mov.w R1,@H'FF88
mov.b @H'FF80,R0L ;TMRWstart
bset #7,R0L
mov.b R0L,@H'FF80
rts 家で不労所得的に稼げる方法など
参考までに、
⇒ 『武藤のムロイエウレ』 というHPで見ることができるらしいです。
グーグル検索⇒『武藤のムロイエウレ』"
3CIA0WWVZN ユニークで個性的な確実稼げるガイダンス
暇な人は見てみるといいかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
6M4KJ IO.PDR8.BYTE(ポート8のデータ・レジスター) の下位4ビットのみを書き換えるにはどうすればいいでしょう。 >>113
unsigned char TEMP;
TEMP = IO.PDR8.BYTE & 0xF0;
IO.PDR8.BYTE = TEMP | (0x0F & WRITE_DATA);
こんな感じですか。C はビット操作が面倒ですね。 あるけど、結局取り回しがうざいからバイト操作の式でやってしまうな 上位4ビットが出力ポートなら、前に書き込んだバイトデータとミックスして書き込む
上位4ビットが入力ポートか外に出ていないなら、バイトをそのまま書き込む >>118
今回は他人の書いた関数の修正なので見送りますが、高速化の手法として有益なので覚えておきます。 .export _delay
;ディレイループ[extern void delay()で定義]
_delay:
push R0 ;レジスタ退避
mov.w #0,R0 ;ループカウンタ定数初期化
_delay_loop:
inc.w #1,R0
cmp.w #10,R0 ;delay回数で比較する
bne _delay_loop
pop R0 ;復帰
rts ;これは単純なトグルをする。Cより速いかもしれない。
PCR8 .equ H'00FFEB ;I/Oレジスタ定義
PDR8 .equ H'00FFDB ;3694は64K範囲のみ
_gpio1:
push R0
mov.b #0,R0L ;初期化
mov.b #0,R0H
mov.b #B'11,R0L ;ポート出力設定
mov.b R0L,@PCR8
mov.b #B'11,R0L ;データ出力
mov.b R0L,@PDR8
?_gpio_loop: ;ループしてトグルする
mov.b R0L,@PDR8 ;GPIO ON
nop
mov.b R0H,@PDR8 ;GPIO OFF
jmp @?_gpio_loop:8
pop R0
rts ;一文字だけの16進変換
;extern char itox1(char)
; .export _itox1
_itox1:
and.b #15,R0L ;16進1文字の範囲でマスク
cmp.b #10,R0L ;数値判定
blt ?_itox1_num ;10以下の場合分岐
add.b #7,R0L ;英字の場合の処理
?_itox1_num:
add.b #48,R0L ;文字記号へ変換
rts ;itoa1;一文字の整数から文字への変換
;extern char itoa1(char)
; .export _itoa1
_itoa1:
cmp.b #9,R0L
bgt ?_itoa1_end ;整数が数値範囲外か判定
add.b #48,R0L
rts
?_itoa1_end:
mov.b #45,R0L ;数値以外は文字"-"で返す
rts ;ソフトシリアル出力(P80-81,P81は反転,bps速度はディレイで任意設定)
;extern void ser01(char)
; .export _ser01
PCR8 .equ H'00FFEB ;I/Oレジスタ定義
PDR8 .equ H'00FFDB ;3694は64K範囲のみ
_ser01:
push R1 ;作業用退避
mov.b R0L,R0H ;引数R0Lをコピー
mov.w #0,E0
mov.b #1,R0H ;stopbit作成
shll.w R0 ;下位ビットゼロクリアしてstartbit作成
mov.b #B'11,R1L ;ポート出力設定
mov.b R1L,@PCR8
mov.b #B'10,R1L ;データ出力
mov.b R1L,@PDR8 ?_loop:
nop ;delay作成
nop
shlr.w R0 ;1bit取り出してCYへ
bst #0,@PDR8 ;CYからgpioへ通常出力
bist #1,@PDR8 ;反転シリアル出力
cmp #0,R0 ;比較
bne ?_loop ;送信データ空でない時ループ
pop R1 ;復帰
rts ;TimerAの設定処理をアセンブラで書く ;extern void init_timer_a(void)
; .export _init_timer_a
TMA .equ H'00FFA6 ;TMAタイマー設定
IRR1 .equ H'00FFF6 ;TRR1割り込みフラグ
IENR1 .equ H'00FFF4 ;割り込み設定
_init_timer_a:
mov.b #B'00001000,R1L ;TimerA設定 φw(32khz),psc=1s
mov.b R1L,@TMA
bclr #6,@IRR1 ;TimerA割り込みフラグクリア
bset #6,@IENR1 ;割り込み有効
rts
これで時計用1秒TimerA割り込みが有効となる。割り込み期間中に毎回フラグクリアするため
bclr #6,@IRR1等ハンドラに書くこと。通常はINT_TimerA()内に IRR1.BIT.IRRTA=0 でよい ;cpuclock速度変更ルーチン3664/3694(TimerA割り込みを動作させておく事)
;extern void _chgclk(void)
; .export _chgclk
IRR1 .equ H'00FFF6 ;TRR1割り込みフラグ
IENR1 .equ H'00FFF4 ;割り込み設定
SYSCR2 .equ H'00FFF1 ;
_chgclk:
jsr @_init_timer_a ;TimerA初期化
mov.b #B'00110100,R1L ;Clock設定 φ=20Mhz/16=1.25Mhz,DTON=1
mov.b R1L,@SYSCR2
bclr #7,@IRR1 ;直接遷移割り込みフラグクリア
bclr #7,@IENR1;直接遷移割り込みbit有効,0=有効/1=無効、(マニュアルは誤記あり)
sleep ;Sleep実行後TimerA割り込みでクロック切替再始動
rts H8用クロサワ式乱数生成器32bit版を作ったので書いとく。乱数生成器としては非常に
優秀でアセンブラで書いているので高速なので広帯域のノイズ生成器として最適。
オーディオ用LCフィルタ,RFシグナルテストなど様々なノイズソースとして利用可能。 ;クロサワ式 PN生成器(32bit改良版)H8/3664,3694用
;GPIOのP80に出力。Cからはextern void kuro32(void)で参照
.export _kuro32
_kuro32:
mov.l #65816,ER0 ;初期値設定
mov.l #h'4b18b4e7,ER1
mov.l #h'32a9cd56,ER2
mov.b #B'11,R1L ;ポートP8出力設定
mov.b R1L,@PCR8
mov.b #B'11,R1L ;P8データ出力
mov.b R1L,@PDR8
?_inspire_the_next:
xor.l ER1,ER0
sub.l ER2,ER0
rotl.l ER0
rotl.l ER0
mov.b R0L,R3L ;bit0の抽出
and.b #1,R3L
mov.b R3L,@PDR8 ;GPIO(P80)出力
jsr @_delay ;ディレイ(動作が速すぎるためI/O用遅延)
jmp @?_inspire_the_next 通信用に必要なパリティ検出は簡単なので関数を書いてみる。
エラー検出用なので送信時にパリティを求めてデータと一緒に送信後、受信側でパリティを
求めて一致するかチェックする。一致しない場合はエラー処理再送などを要求する。
//パリティビットを返す
unsigned char parity(unsigned char i){
return(i & 1);
}
これをアセンブラで書くとこんな感じ
mov.b #123,R0L
and #1,R0L
単純なので関数化してもよい。 続いてチェックサムを求める関数。引数は配列と要素数の二つ。戻り値は1byteで返す。
エラーチェックとしては古典的で処理も簡単。送信側で求めてフレームに追加して受信側で
データを計算して値が同じか異なるかでチェックする。Sレコードなどのチェックサムでも利用する。
char checksum(char dat[], int len){
int i;
unsigned int sum=0;
for(i=0; i<len; i++){
sum=sum+dat[i];
}
return(sum & 0xff);
} 最後にCRC8を求める。char配列を渡すと8bitのCRC値(標準CRC8)が求まる。
char crc8_4(char data[],int len){
int i,j,crc;
for(j=0; j<len; j++){
crc=crc^data[j];
for(i=0; i<8; i++){crc=crc & 0x80 ? (crc<<1) ^0x7 : crc<<1;}
}
return(crc&0xff);
}
ここで得られた標準CRC値に0x55をXORするとCRC8/ITU仕様の結果となる。 配列要素間のswapをアセンブラで書いてみる
.export _swap
;二箇所のbyte配列の中身を入れ替える。引数swap(char[], int a, int b)
;呼び出し側の引数はR0,E0,R1に割り当てられる。配列はスタックフレーム上にある
_swap:
push.l ER2 ;保存
push.l ER3
mov.w R0,R2 ;配列アドレス計算(a,ポインタとしてR2を使用)
add.w E0,R2
mov.w R2,E2 ;aのアドレス保存
mov.b @(R2),R3L ;データをtempとしてR3Lへ保存
mov.w R0,R2 ;配列アドレス計算(b)
add.w R1,R2
mov.w R2,E3 ;bのアドレス保存
mov.b @(R2),R3H ;bの内容を保存
mov.w E2,R2 ;aアドレス設定
mov.b R3H,@(R2) ;b->aへコピー
mov.w E3,R2 ;bアドレス設定
mov.b R3L,@(R2) ;temp->bへコピー
pop.l ER3
pop.l ER2 ;復帰
rts
Cから利用する場合は,extern void swap(char[], int, int);でプロトタイプし
配列と指定インデクス2つを引数に与える >>133のswap()を利用して選択ソートを実装する。
extern void swap(char[],int,int);
uchar a[]={9,8,7,6,1,2,3,4};
int i,j,len,min;
len=8;
for(j=0; j<len; j++){
min=j;
for(i=j; i<len; i++){ min=(a[i]<a[min])?i:min; }
swap(a,j,min);
} Byte配列の指定インデクスを一つだけ右に移動させる(ビット列のシフトではない)
インデクスは配列のポインタで指定
.export _rightsft
;引数の配列アドレスはR0に入る
;配列の添え字を指定して隣接する配列の一要素のみ一つだけ移動
_rightsft:
push R2 ;保存
mov.b @(-1:16,ER0),R2L ;隣と要素の入れ替え
mov.b R2L,@(ER0)
pop R2 ;復帰
rts >>135をCから利用する例。Byte配列の右移動(右ローテート)。配列の他に画像で使うと面白い
extern void rightsft(char[]);
uchar a[]={9,8,7,6,1,2,3,4};
int i,j;
j=a[7];
for(i=7; i; i--){ rightsft(a+i); }
a[0]=j; TimerWを用いた任意周波数発生器(矩形波)例。H8/3694版
周波数はTimerWのTGRAを用いて周期を設定。デューティは50%。タイマーを流用
した簡易機能のため高周波数になると分解能は低下する。利用例はAM用IFT調整用455khz
調整用マーカー発振。出力端子はP81/FTIOA。正確な455khz可能。
(おまけとしてP82/FTIOBは直交変換用に90度位相のIQ信号を出力する)
IO.PCR8=7;//Port8_0/8_1/8_2を出力端子に設定
// 周期計算式 f=20(Mhz)/psc/(2*(1+n))
// psc=メインクロック分周比(SYSCR2.MA),n=タイマーGRA値
TW.GRA=21;
TW.GRB=11;//P82_FTIOBは P81_FTIOAに対して位相が90度のIQ信号
TW.TIOR0.BIT.IOA=3;//出力端子設定,トグル設定
TW.TIOR0.BIT.IOB=3;
TW.TCRW.BIT.CCLR=1;//クリア条件設定
TW.TCRW.BIT.CKS=0;//クロック分周
MSTCR1.BYTE=123;//TimerW以外停止
TW.TMRW.BIT.CTS=1;//TimerWカウンタスタート
sleep();while(1); ハードウエアタイマーが足りない場合のソフトPWMを実装する。
通常のPWM機能と同等のマークスペース法のSoftPWM。H8内部のカウンタ・タイマーの
PWMと同等の機能を実現する。マークスペース法はサーボ制御用などに利用されている方式。
ソフト処理のためにPWM周期クロックは低くなる。ハードウエアタイマーに依存しないので
任意のGPIOポートで使用可能。(割り込みハンドラ内で実装する方法はループを工夫すること)
unsigned int d,cnt,m;
IO.PCR8=7;//H8のPort8_0/8_1/8_2を出力端子に設定,P8_0を使用
d=100;//初期値
cnt=1;
while(1){
while(cnt<1024){ //pwm分解能1024
if (cnt==d) IO.PDR8.BIT.B0=0; //もしpwm周期dが過ぎたらGPIO=Lとする
cnt++;
}
cnt=1; //ループ内初期化
IO.PDR8.BIT.B0=1;
} 次の方法はマークスーペース法を若干修正したSoftPWM実装。マークスペース法は固定
周期のPWMクロックの為にノイズが強く出る。このSoftPWMはキャリア変調型PWM方式で
LED調光時のノイズ低減のためにアルゴリズムにデューティ可変時にPWMクロック周期を
約20%偏移させる方法を実装。周波数偏移により調光時のデューティサイクル可変時スペクト
ラム拡散と同等のEMC対策を期待できる。
unsigned int d,cnt,m;
IO.PCR8=7;//H8のPort8_0/8_1/8_2を出力端子に設定,P8_0を使用
d=100;//初期値
cnt=1;
while(1){
m=640-(d>>2);//d=0〜512までの分解能。ループ定数は512+(512>>2)=640
while( cnt<m ){
if(cnt==d) IO.PDR8.BIT.B0=0;
cnt++;
}
cnt=1;
IO.PDR8.BIT.B0=1;
} 次は0/1のビットパターン列で出力制御するパルス列制御型のSoftPWM方式。
ビットパターンはメモリか変数にあらかじめ配置しておく。
PWMの出力を可変する場合は必要な数だけビットパターンを用意する。
unsigned int cnt;
unsigned char m;
unsigned long bp=0xAAAAAA00; //ビットパターン(32bit)
IO.PCR8=7;//Port8_0/8_1/8_2を出力端子に設定,P8_1を使用
while(1){
while(cnt<1024){
m=(bp >> (cnt % 32)) & 1; //ビットスライス処理
IO.PDR8.BIT.B1=m;//ポート出力
cnt++;
}
cnt=0;
} >>124辺りでアセンブラによるソフトシリアル出力(ser_putcharと等価)を書いたので
今度はシリアル入力を書いてみる。
;シリアル受信 extern char ser_getchar(void)
;PCR8 .equ H'00FFEB ;I/Oレジスタ定義
;PDR8 .equ H'00FFDB ;3694は64K範囲のみ
_ser_getchar:
mov.w #0,R0 ;初期化
mov.w #0,R1
?_getchar_start:
mov.b @PDR8,R0H ;シリアルデータ入力(P80)
btst #0,R0H ;スタートビット(L)を検出,P80=0のときZ=1
bne ?_getchar_start ;スタートビット(L)検出するまでポーリング
;
bset #1,@PDR8 ;debug用serialパルス出力(P81端子をオシロ測定してbps推定する)
jsr @_delay ;スタートビット用bps速度調整ディレイ
bclr #1,@PDR8
;
;シリアルデータ読み取りルーチン開始
mov.b #8,R1L ;8bitデータ取得用カウンタ設定
?_getchar_get:
bld.b #0,@PDR8 ;ポートから1bitシリアル入力し指定ビットの状態をCYに得る
rotxr.b R0L ;シリアルのビット情報を保存しレジスタに並べる
;
bset #1,@PDR8 ;debug用serialパルス出力(P81)
jsr @_delay ;データビット用bps速度調整ディレイ
bclr #1,@PDR8
;
dec.b R1L ;シリアル受信用カウンタ-1
bne ?_getchar_get ;残りビットあればループ
rts >>141の続き
;ループカウンタを用いたディレイ(ser_getchar用) クロック20Mhz,ループ定数46で約38.4kbps
_delay:
push R0 ;レジスタ退避
mov.w #0,R0 ;ループカウンタ定数初期化
_delay_loop:
inc.w #1,R0
cmp.w #46,R0 ;比較する
bne _delay_loop ;bccの時はロングジャンプではないのでラベルの@を記載しない
;
pop R0 ;復帰
rts
;
;kbhitの実装 extern char kbhit(void);
_kbhit:
mov.b @PDR8,R0H ;シリアルデータ入力(P80)
btst #0,R0H ;P80のスタートビット(L)を検出
bne ?_kbhit_end ;ポートがHかLか判定する
;ポートLのときにキー入力有り
?_kbhit_wait:
mov.b #1,R0L ;リターンコード=1
rts
;ポートH状態のときキー入力なしとして抜ける
?_kbhit_end:
mov.b #0,R0L ;リターンコード=0
rts 上記ソフトシリアル入力関数の利用例)
extern void ser_putchar(char); //ここは>>124のプロトタイプ変えただけ(要delay調整)
extern char ser_getchar(void);
extern char kbhit(void);
main(){
char rtn;
IO.PCR8=0x02; //Port8_0をRxD入力、8_1をdebug用出力端子に設定
while(1){
while(kbhit()); //キー入力待ちポーリング
rtn=ser_getchar();
/*何らかの処理*/
}
} 次はH8/3694FのTimerWを制御してFMラジオから音を出すワイヤレス実験。
TimerWの出力端子P81/FTIOAに約2Mほどの電線アンテナを繋げてFMラジオに送信する
FMラジオで音が発生する仕組みはTimerW出力の矩形波成分833*100倍高調波と910*92倍
高調波がそれぞれ83.33Mhz,83.720Mhz近傍に発生し近い周波数で電波が生じる。
信号がFMラジオ占有帯域である約200-300khz帯域に入るので、833k,910kの高調波が適切な時間で
切り替えればシンプルな二値のFM変調動作となりFMラジオのFM検波回路で再生され音として
聞こえる。83Mhzに適切に同調したアンテナやLC回路がTimerW出力側にあると周辺帯域のノイズは
さらに小さくなる。音として確認することができ、FMラジオ経由のASKとしてシリアル
データを送信する事も可。 //FMラジオ送信実験 H8/3694F 20Mhz
main(){
volatile unsigned int i,w;
IO.PCR8=7; //8_0/1/2を出力端子に設定
MSTCR1.BYTE=123; //スタンバイ設定,TimerW
TW.GRA=11;
TW.TIOR0.BIT.IOA=3; //出力端子設定,トグル設定
TW.TCRW.BIT.CCLR=1; //クリア条件設定
TW.TCRW.BIT.CKS=0; //クロック分周 内部クロック動作
TW.TMRW.BIT.CTS=1; //TimerWカウンタスタート
while(1){
//FM変調出力ループ(Freq1,Freq2のFSK切り替え) Freq1=833k ,Freq2=909k
for(i=0; i<10000; i++){
TW.TCNT=0; //レジスタGRA更新前にTWカウンタクリア
TW.GRA=11;
for(w=0; w<300; w++); //wait タイミング調整でFMラジオの音声周波数を変える
TW.TCNT=0;
TW.GRA=10;
for(w=0; w<300; w++); //wait
}
//数秒間停止
for(i=0; i<100; i++){ for(w=0; w<50000; w++);} //delay
}
} もちろん手マンじゃなくて本人の自由だし
いろんなパパと行けばネタ切れもしなさそう 8月優待欲しいけど買うと半年は含みそうだな
次長課長が出て全体的にもええなそれ 俺が亜熱帯雨林やらさんぴんやら行ってらっしゃい帰ってくるんじゃね