2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

H8

1 :774ワット発電中さん:2013/09/29(日) 17:21:20.91 ID:2ulVA35H.net
前スレ
http://uni.2ch.net/test/read.cgi/denki/1284528838/

96 :774ワット発電中さん:2015/02/15(日) 12:51:14.33 ID:1FIOD/n/.net
H8はじめました。
BASIC懐かしすぎ

97 :97:2015/02/15(日) 18:07:56.77 ID:QsAIoHn1.net
20文字4行液晶つなげてみた。なにこれ楽しいw

98 :774ワット発電中さん:2015/02/25(水) 18:50:02.39 ID:S8YSs7w+.net
AKIのH8は板違い?

99 :774ワット発電中さん:2015/02/26(木) 03:43:37.55 ID:G0zgVFWK.net
>>97
デカイのになると、40桁×8行というのもあるよ。

100 :774ワット発電中さん:2017/01/09(月) 17:51:34.58 ID:TKzS+Ddv.net
過疎り具合がぱねぇっすね
どうしたH8

101 :774ワット発電中さん:2017/01/09(月) 20:39:15.02 ID:guYSVtQH.net
>>95
PICや8051が伸びてるのはそれなりに理由がある。
今時、H8なんか使う理由が見当たらないんだが。

102 :774ワット発電中さん:2017/01/09(月) 21:40:18.20 ID:qgZMJz10.net
8051は今のARMみたいに、あちこちに使われてた時期がありましたね。
さすがにもう伸びしろはほとんど残っていないというか、ARMに役割を譲りつつあると思いますが。

103 :774ワット発電中さん:2017/01/10(火) 15:46:06.81 ID:dPXQ20GH.net
>>100
1年前のレスにレスしても
読まれるかどうかわからんしな

104 :774ワット発電中さん:2017/02/02(木) 21:20:20.47 ID:ZGlZ6Hvf.net
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

105 :774ワット発電中さん:2017/02/02(木) 22:49:27.89 ID:ZGlZ6Hvf.net
ローテクロジックデバイス下請けさんとして働く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

106 :774ワット発電中さん:2017/02/02(木) 22:56:44.42 ID:ZGlZ6Hvf.net
74HC04のインバータ(P1=IN,P2=OUT)もソフトPLD実装したのでLEDチカチカしなさい

loop:
mov.b @H'FFD4,R0L
not.b R0L
mov.b R0L,@H'FFD5
jmp @loop

107 :774ワット発電中さん:2017/02/03(金) 02:44:24.08 ID:dKNiJWEB.net
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

108 :774ワット発電中さん:2017/12/27(水) 14:36:22.07 ID:22mySsTl.net
家で不労所得的に稼げる方法など
参考までに、
⇒ 『武藤のムロイエウレ』 というHPで見ることができるらしいです。

グーグル検索⇒『武藤のムロイエウレ』"

3CIA0WWVZN

109 :774ワット発電中さん:2018/05/21(月) 11:03:28.66 ID:+YPLsCwK.net
ユニークで個性的な確実稼げるガイダンス
暇な人は見てみるといいかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

6M4KJ

110 :774ワット発電中さん:2018/07/03(火) 23:14:14.07 ID:TUeFXinq.net
QAF

111 :774ワット発電中さん:2018/10/12(金) 09:27:25.61 ID:ugsgc0iU.net
IO.PDR8.BYTE(ポート8のデータ・レジスター) の下位4ビットのみを書き換えるにはどうすればいいでしょう。

112 :774ワット発電中さん:2018/10/14(日) 12:44:18.19 ID:xa69Dhfc.net
読んで
AND F0h とマスクして
OR する

113 :774ワット発電中さん:2018/10/14(日) 22:02:55.84 ID:WE0MuwU5.net
>>112
unsigned char TEMP;

TEMP = IO.PDR8.BYTE & 0xF0;
IO.PDR8.BYTE = TEMP | (0x0F & WRITE_DATA);

こんな感じですか。C はビット操作が面倒ですね。

114 :774ワット発電中さん:2018/10/15(月) 04:43:34.54 ID:HR8CJVFJ.net
ビットフィールド型とかあったはず

115 :774ワット発電中さん:2018/10/15(月) 18:54:26.72 ID:bgSDhdMX.net
あるけど、結局取り回しがうざいからバイト操作の式でやってしまうな

116 :774ワット発電中さん:2018/10/16(火) 03:45:53.20 ID:uca8VD7K.net
ぼくにはつかいこなせません

117 :774ワット発電中さん:2018/10/16(火) 06:13:02.39 ID:pWVMDcx0.net
上位4ビットが出力ポートなら、前に書き込んだバイトデータとミックスして書き込む
上位4ビットが入力ポートか外に出ていないなら、バイトをそのまま書き込む

118 :774ワット発電中さん:2018/10/16(火) 20:58:41.27 ID:3iT0a11X.net
>>117
今回は他人の書いた関数の修正なので見送りますが、高速化の手法として有益なので覚えておきます。

119 :774ワット発電中さん:2019/01/03(木) 21:59:26.85 ID:Kd0XUUkX.net
.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

120 :774ワット発電中さん:2019/01/03(木) 22:07:42.82 ID:Kd0XUUkX.net
;これは単純なトグルをする。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

121 :774ワット発電中さん:2019/04/24(水) 08:19:34.91 ID:ZfM5v4b/.net
;一文字だけの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

122 :774ワット発電中さん:2019/04/24(水) 08:22:13.97 ID:ZfM5v4b/.net
;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

123 :774ワット発電中さん:2019/04/24(水) 08:27:06.21 ID:ZfM5v4b/.net
;ソフトシリアル出力(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

124 :774ワット発電中さん:2019/04/24(水) 08:29:34.04 ID:ZfM5v4b/.net
?_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

125 :774ワット発電中さん:2019/04/27(土) 16:38:14.22 ID:5M9Yonpr.net
;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 でよい

126 :774ワット発電中さん:2019/04/27(土) 16:42:23.25 ID:5M9Yonpr.net
;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

127 :774ワット発電中さん:2020/03/09(月) 20:06:33 ID:+ZhReQ9o.net
H8用クロサワ式乱数生成器32bit版を作ったので書いとく。乱数生成器としては非常に
優秀でアセンブラで書いているので高速なので広帯域のノイズ生成器として最適。
オーディオ用LCフィルタ,RFシグナルテストなど様々なノイズソースとして利用可能。

128 :774ワット発電中さん:2020/03/09(月) 20:08:56 ID:+ZhReQ9o.net
;クロサワ式 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

129 :774ワット発電中さん:2020/04/18(土) 07:54:14 ID:yJRHxjeg.net
通信用に必要なパリティ検出は簡単なので関数を書いてみる。
エラー検出用なので送信時にパリティを求めてデータと一緒に送信後、受信側でパリティを
求めて一致するかチェックする。一致しない場合はエラー処理再送などを要求する。

//パリティビットを返す
unsigned char parity(unsigned char i){
return(i & 1);
}

これをアセンブラで書くとこんな感じ
mov.b #123,R0L
and #1,R0L
単純なので関数化してもよい。

130 :774ワット発電中さん:2020/04/19(日) 02:33:31 ID:jRmTaX4f.net
続いてチェックサムを求める関数。引数は配列と要素数の二つ。戻り値は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);
}

131 :774ワット発電中さん:2020/04/19(日) 02:41:36 ID:jRmTaX4f.net
最後に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仕様の結果となる。

132 :774ワット発電中さん:2020/04/28(火) 21:10:45 ID:a56Asx87.net
配列要素間の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 :774ワット発電中さん:2020/04/29(水) 20:12:16 ID:cXGpdj8I.net
>>132の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);
}

134 :774ワット発電中さん:2020/04/29(水) 20:41:29 ID:cXGpdj8I.net
Byte配列の指定インデクスを一つだけ右に移動させる(ビット列のシフトではない)
インデクスは配列のポインタで指定

.export _rightsft

;引数の配列アドレスはR0に入る
;配列の添え字を指定して隣接する配列の一要素のみ一つだけ移動
_rightsft:
push R2 ;保存

mov.b @(-1:16,ER0),R2L ;隣と要素の入れ替え
mov.b R2L,@(ER0)

pop R2 ;復帰
rts

135 :774ワット発電中さん:2020/04/29(水) 20:51:01.30 ID:cXGpdj8I.net
>>134を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;

136 :774ワット発電中さん:2020/08/16(日) 20:22:51 ID:UDcdAFvS.net
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);

137 :774ワット発電中さん:2020/08/16(日) 20:30:41 ID:UDcdAFvS.net
ハードウエアタイマーが足りない場合のソフト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;
}

138 :774ワット発電中さん:2020/08/16(日) 20:34:53 ID:UDcdAFvS.net
次の方法はマークスーペース法を若干修正した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;
}

139 :774ワット発電中さん:2020/08/16(日) 20:43:02 ID:UDcdAFvS.net
次は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;
}

140 :774ワット発電中さん:2021/01/03(日) 09:25:18.28 ID:9khtnhKY.net
>>123辺りでアセンブラによるソフトシリアル出力(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 :774ワット発電中さん:2021/01/03(日) 09:27:53.71 ID:9khtnhKY.net
>>140の続き
;ループカウンタを用いたディレイ(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

142 :774ワット発電中さん:2021/01/03(日) 09:33:24.85 ID:9khtnhKY.net
上記ソフトシリアル入力関数の利用例)

extern void ser_putchar(char); //ここは>>123のプロトタイプ変えただけ(要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();
/*何らかの処理*/
}
}

143 :774ワット発電中さん:2021/01/06(水) 12:10:11.20 ID:jIUrVjPR.net
次は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としてシリアル
データを送信する事も可。

144 :774ワット発電中さん:2021/01/06(水) 12:11:54.41 ID:jIUrVjPR.net
//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
}
}

145 :774ワット発電中さん:2023/07/04(火) 23:58:27.85 ID:yM7rzreL.net
疲れたら休めばいい。やめる必要はない

総レス数 145
43 KB
掲示板に戻る 全部 前100 次100 最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★