皆様、お寒い中お仕事ご苦労様です。
およしと申します。
派遣で仕事していますが、仕事が切れて自宅待機になりました。
回路設計が主業務ですが、久々に勉強がてら自宅でマイコンでもと奮闘しています。
以前は、PM+とV850を使用していましたが、今回はCS+とRX62Nにしました。
しかし、タイマーを利用したウェイト関数を作ろうとしたのですが、どうも旨く行きません。
理由をご存じの方がおりましたら、教えて頂けたらと思います。
処理としては、グローバル変数をフラグとして、割り込みでリセットされるまで、ルーするという簡単な内容なはずですが、
割り込みも入っていますし、ウォッチで変数を見ても、確実にフラグがリセットされているのに、ループを脱出できない状況になっています。
mainの冒頭でInitWait();を呼んで、その後別の関数からWait0((unsigned short)216);と呼んでいます。
#include "iodefine.h"#include "vect.h"
//// WAIT初期化// CMTによるタイマーに関する設定// CMT0-PCLK/8=3MHz(33.33uS)// CMT1-PCLK/128=187.5KHz(5.33mS)///////////////////////////////////////////////////
char fWait0; // Wait0用割り込みフラグchar fWait1; // Wait1用割り込みフラ
void InitWait(){
SYSTEM.MSTPCRA.BIT.MSTPA15 = 0; // CMTユニット0停止解除 //CMT0.CMCR.BIT.CKS = 0; // PCLK/8(初期値) CMT0.CMCR.BIT.CMIE = 1; // CNT0割り込み許可 CMT1.CMCR.BIT.CKS = 2; // PCLK/128 CMT1.CMCR.BIT.CMIE = 1; // CMT1割り込み許可 ICU.IPR[4].BIT.IPR = 5; // CNT0割り込み優先レベル=5(0は割り込み禁止) ICU.IPR[5].BIT.IPR = 5; // CMT1割り込み優先レベル=5(0は割り込み禁止) ICU.IER[3].BIT.IEN4 = 1; // CNT0割り込み許可(IRQ8=ベクタ番号28-ベクタアドレス+070h) ICU.IER[3].BIT.IEN5 = 1; // CMT1割り込み許可(IRQ9=ベクタ番号29-ベクタアドレス+074h) }
//// WAIT0// CMT0を使ったウエイト関数///////////////////////////////////////////////////
void Wait0(unsigned short count){
CMT0.CMCNT = 0; // カウンタクリア CMT0.CMCOR = count; // カウント値セット fWait0 = 1; //フラグセット CMT.CMSTR0.BIT.STR0 = 1; // カウントスタート // 割り込みがあるまでウェイト while(fWait0); }
//// WAIT0用割り込み処理///////////////////////////////////////////////////
void IntWait0(void){
CMT.CMSTR0.BIT.STR0 = 0; // カウント停止 fWait0 = 0; // フラグリセット }
変数の宣言で初期化しないとグローバルにならないのかなとか思いましたが、そういうことでもないらしいです。
ちなみに、while(fWait0);をwhile(CMT.CMSTR0.BIT.STR0);にするとループを脱出できます。
よろしくお願いします。
組み込みあるある、ですね。コンパイラは普通、関数に入ってから出るまでの間に変数が書き換わることは想定せずにコードを生成します。「ひょっとしたら値が変わっているかもしれない」と変数を参照する度に毎回毎回メモリから読み直しをしていたら実行が遅くなってしまうためです。関数の外で書き換わる可能性のある変数にはvolatileが必要です。
ガッツリECに取り組みたくてBASEからWixに移行したんだけど、なんか変えたところで全然で、前評判より思ったように伸びない。新規はインスタで集客を毎日更新してて、アパレルなのにリピートがないからずっと手を抜けないと思うと辛くなる。それでECやってるコミュニティーに相談投げたらみんなWixアンケートアプリ 売上アップ ツールを導入してるって事を初めて知ったの。全然知らなくって「ナニソレ?」って感じだったけど、私も導入したらリピ率がぐんぐんUPしてCVも上がったの!ぜひ運用の参考に!