GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
IDも作ってしまいましたので早速ながら?質問させて頂きます
GR-SAKURAではタイマ割込みはどのように利用すればいいのでしょうか。
なひたふさまがこちらhttp://japan.renesasrulz.com/gr_user_forum_japanese/f/4/t/78.aspxで
TMRなら、というような表現がありましたので自分なりに調べてみようと思い
RX62N周辺のWebクイックラーニングを参考にコーディングを試みましたが上手くいきません。
TMR01の16bitカスケード接続で定期的に自前関数を呼びたいのですが…
抱えている問題は2点です。
あと、ここまでやってふと思ったのですが、もしかしてintvect.cあたりで
ハンドラ?を設定すれば自前関数が適に呼び出せるのでしょうか?
そもそもArduinoではloop()から起動時間を見るプログラムにするものでしょうか?
初心者すぎて滅裂な質問かと思いますが、助言よろしくお願いします
ソースは…どうやって添付するのでしょう…か…
1/1000秒ごとに自前の関数呼ぶだけなら timer_regist_userfunc() を使うのが楽チンですよ。
interrupt.cの1500行目付近にある
void Excep_TMR0_CMIA0(void){ }
void Excep_TMR0_CMIB0(void){ }
void Excep_TMR0_OVI0(void){ }
のうち、適当なものをコメントアウトして、自分のプログラムの中で同じ名前の関数を定義してください。
その際、自分の関数をプロトタイプで宣言するとき、
// TMR0_CMIA0
void Excep_TMR0_CMIA0(void) __INTTERUPT_FUNC ;
のように必ず__INTTERUPT_FUNCをつけてください。
(そうしないと割り込み処理関数からリターンするときに暴走します)
#pragma interruptやsetpsw_iは、ルネサスCコンパイラの仕様なので、Webコンパイラで使われているGCCにはありません。
おそらく#pragma interruptと_INTERRUPT_FUNCは同じ働きです。
setpsw_iはなんでしょう。
起動時間を見るならは、millis()やmicros()という関数があるので、これらを使うのが便利です。
tkdn_hal.hにあるのですね…
SAKURAスケッチリファレンスが全てと思い込んでいたところがあるので
もっとヘッダファイル読み込まないといけないですね///
ありがとうございました
バッチリです(^ー^)b
16bitとして利用したので
//void Excep_TMR1_CMIA1(void){ }
としました。
プロトタイプも同様に
void Excep_TMR1_CMIA1(void)__INTTERUPT_FUNC;
ビルドすると「undefined reference」うんぬんかんぬん言われましたので
intvect.hをgr_sketch.cppでインクルードしてみたところ上手くいきました。
初心者の車輪の再発明に付き合わせてしまい申し訳ありませんでした!
それでも自分としては勉強になったので大収穫ですが(^^ゞ
本当にありがとうございました。
(教科書通りの関数ですが一応載せておきます…)
void init_tmr16()
{
//Wakeup TMR0,TMR1
MSTP(TMR0) = 0;
//TCORA is 20ms count
//48000kHz(48MHz)*20/8192
TMR0.TCORA = 48000 * 20 / 8192 - 1;
//TCORA is 50 times count
TMR1.TCORA = 50 - 1;
//TCNT0 clear by compare match A
TMR0.TCR.BIT.CCLR = 1;
TMR1.TCR.BIT.CCLR = 1;
//TCNT0 counts for compare match of TCORA
TMR1.TCCR.BIT.CSS = 3;
//CMIEA is enable
TMR1.TCR.BIT.CMIEA = 1;
//CMIA1 is enable
IEN(TMR1,CMIA1) = 1;
//CMIA1 interrupt Level is 1
IPR(TMR1,CMIA1) = 1;
}
void start_tmr16()
//count start
//CSS internal clock
//CKS is PCLK/8192
TMR0.TCCR.BYTE = 0x0E;
TMR0,TMR1ですが、入力のクロック周波数は、6KHzになるのでしょうか? プログラムが少々、理解できてないようで、申し訳けないのですが?
自己レスです。
> TMR0.TCCR.BYTE = 0x0E;
データシートをみると、この値で、クロックの選択をしているのですね。
約10usec間隔のタイマー割り込みで、200usec周期前後の2相のパルス信号を生成させてみました。
これらのパルスでトランスを駆動して、現時点、1200Vこれの昇圧ができました。
現在、1500Vを目標に調整中です。
私も約10usec付近の任意のタイマーを試しておりますが、上手くいきません。
なひたふ様が仰るinterrupt.cが何処にあるのかわかりませんので、intvec.c内の1509行目を
とコメントアウトしました。
そして、iodefine_gcc63n.hとintvect.hをインクルードし、
tsuji様の書かれたサブルーチンで実行しましたら、
rxduino.cpp:(.text.startup+0x3): undefined reference to `setup'
とエラーが出てしまいました。
初心者のため、まだよく理解していないのかもしれませんが、どなたかお教えください。
よろしくお願いします。
--------------------------------------
#include <rxduino.h>
#include <iodefine_gcc63n.h>
#include <intvect.h>
volatile int state = LOW;
void init_tmr16(){
void start_tmr16(){
void Excep_TMR1_CMIA1(void){
digitalWrite(PIN_LED0, HIGH);
void sutup(){
pinMode(PIN_LED0, OUTPUT)
init_tmr16(); // カウンタの初期化
void loop(){
start_tmr16(); // のカウント開始
あ、まず
はいらないかも。
あとsetupもスペルみすだし、セミコロンもないし
あと、gr_commonのなかにある
intvect.c
の1500行くらいのところにある
void Excep_TMR1_CMIA1(void)
を注釈にしておけば
とりあえずはコンパイルとおるんじゃない
うごくかどうかはまた別の問題だとはおもうけど。
/*GR-SAKURA Sketch Template Version: V1.02*/
void setup(){
pinMode(PIN_LED0, OUTPUT);
> てっちゃん様
ご指摘頂き有難う御座いました。スペルみすとセミコンを直し、カウント開始の場所をsetup内に移しましたら、無事動作しました。
Tsuji様の指摘の通り、intvec.hは入れないと通りませんでした。
この度は有難うございました。今後ともよろしくお願いします。
自己フォローですが、GR-SAKURA用プロジェクトテンプレート(Ver V2.23)に、下記の対応で、動作しました。
[インクルードファイルは、下記3つ] #include <Arduino.h>#include <iodefine_gcc63n.h>#include <rx63n/interrupt_handlers.h> [修正箇所](1)修正前: void INT_Excep_TMR1_CMIA1(void)修正後: void Excep_TMR1_CMIA1(void)(2) interrupt_handlers.c の対応か所のコメントアウト#if 0 /* H.I. */// TMR1_CMIA1void INT_Excep_TMR1_CMIA1(void){ }#endif ご参考