全体表示

[ リスト | 詳細 ]

記事検索
検索
クロック信号を理解すると

適当なサイクルを作れるようだ

そこで、16MHZの発振がどのような計算になるのか

自分の覚えとして記載しておくことにしました




CPUの発振を 1ステートとか1クロックという
 (クロック信号の立ち上がりから次の立ち上がりまで)

式
1/(16*10^6)=0.0625us

 機械語レベルでステートを調べる
 たとえば、あるLOOP中 8ステートの命令があるとすると

上の式から
 8ステート×0.0625us=5×10^-4ms(マイナス4乗)

10MSのタイマを作るには
 10MS/(5×10^-4)MS = 20000

これを500回すると 5秒になる


割り込みで ERROR

割り込みは難しいですね★
なひたふさんのページにあるのを
まねしてみましたが、エラーで前にすすめません。。。
↓のページにあるとおりやってるつもりなんですが
http://www.nahitech.com/nahitafu/trg78k/interrupt.html


こんなエラーがでるんです

sample15_1.c(23) : CC78K0 error E0711: Undeclared 'NULL' ; function 'main'



//sample15_1.c
#pragma sfr
#include "trgbios.h"


void wari(void){
short i;
for(i=0;i<30000;i++){}
P6.1 ^= 0x01;
}

void main(){
PM6.1 = 0;

trg_regintsrv(TRG_INTID_BSIP0,wari);


while(1){

}


trg_regintsrv(TRG_INTID_BSIP0,NULL); // <----どうもここでエラーが出ているみたい
}
モータードライブをICを使った回路図がみつかったので

自分の覚え用に記録しておきます


ピン番号は欠けてる方を左にして
左から、1から10まで


5,6はマイコンの出力ポートに接続してこのICを制御する

7はVCC 5Vを掛けます

2,10はモーターの両端に

4,8は直結した上で5Vへ


ポートによる制御は
5番 0  6番  0 OFF
   1     0  正方向
   0     1  逆方向
   1     1  ブレーキ


イメージ 1

ORG命令を入れてみた

前回は csegで スタート番地を規定していましたが

これを ORG命令にかえてみました

結果は、どっちも同じでした(あくまで今回は)

DsegやCsegなど同じでいいような簡単なプログラムの場合
スタート番地は ORGでも CSEGでも どっちで規定しても

いいということがわかりました

あ、なんどもくどいですが
C言語のコンパイルの際のように RomStart.asm や RamStart.asmは
スタート番地をちゃんと記述できるアセンブラの場合不要(あるとエラーになる)
ので、プロジェクトの「ソースファイル」から削除しておく必要があります。


@@CNST      CSEG
@@R_INIT	CSEG	
@@INIT	    DSEG	
@@DATA  	DSEG	
@@R_INIS	CSEG	
@@CODE  	CSEG
;TSTA CSEG    AT      0F000H   ;cseg の表現を ORG命令に変更

	ORG 0F000H           ;変更箇所 org命令を入れてみた

_main:

	push	hl
	clr1	PM6.1

L004:
	movw	hl,#00H

L005:
	movw	ax,hl
	cmpw	ax,#07530H
	or1	    CY,a.7
	bnc 	$L006
	incw	hl
	br		$L005

L006:
	set1	CY
	xor1	CY,P6.1
	mov1	P6.1,CY
	br 		$L004

	pop	hl
	xor a,a
	ret
	END



割り込みも前回
ERRORがでていたところを

自分なりに変えてみたところ
コンパイルエラーはなくなりました

しかし、

今回の割り込み要因が
端子入力エッジ検出 TRG_INTID_BSIP0   というものであり

このこと自体が、78K0のどこの端子を触ると
トリガーになるのかわからないので
先に進めません。。。。。。。



//sample15_1.c
#pragma sfr
#include "trgbios.h"
//#define NULL((void(*)0)           <------ define を入れてみたがだめ

void Wari(void){
short i;
for(i=0;i<30000;i++){}
P6.1 ^= 0x01;
}

void main(){
	PM6.1 = 0;
	
	trg_regintsrv(TRG_INTID_BSIP0,Wari);
	
	
	while(1){
	
	}
	
	
	trg_regintsrv(TRG_INTID_BSIP0,0);   <-----NULL を 0 に変更
}

.


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事