User Tools

Site Tools


Sidebar

製作物
燃焼系
自動車ターボ流用ジェットエンジン
空き缶パルスジェットエンジン

弱電系
半導体式γ線検出器
半導体式α線検出器
AVRプログラム集

強電系
オーディオフライバックトランス
テスラコイル1号機(PWM式)
テスラコイル2号機(DRSSTC)
テスラコイル3号機(DRSSTC)
TIG溶接機
バッテリー溶接機1号機
バッテリー溶接機2号機
HeNeレーザー
ZVSドライバ

化学系
塩化銅エッチング

その他
雑多な物、便利な技など
FETの死亡診断
表面実装部品の取り外し
ICのシリコンダイの取り出し
バッテリー溶接
放射性鉱物探し
工具の消磁
特性不明なコア材の特性調べ
携帯の温度センサーの騙し方



過去のBlog記事一覧

他サイトへのリンク

管理人の連絡先など
管理人のYoutube
管理人のTwitter

blogspace:atxmegaのタイマーカウントリセット

atxmegaのタイマーカウントリセット

ATXmega32A4Uを使っていて小一時間引っかかった事が有ったのでメモ
マイコンの16bitタイマーを使っていて、タイマーカウントをリセットしたかったので
ASF(AtmelSoftwareFramework)のtc_reset()関数を呼んでカウントリセットを試みたのですが
リセットされませんでした。
tc_restart()関数だとカウントリセットもされるんですが、
当然ながらその後カウントアップが始まります。

で、どうにかカウントを再開させずにカウントだけをリセットできないかゴニョゴニョやって
結局以下のコードを書いて解決しました。

inline void tc_cnt_reset(volatile void *tc)
{
  ((TC0_t *)tc)->CNTL = 0;
  ((TC0_t *)tc)->CNTH = 0;
}


呼ぶ時はこう

tc_cnt_reset(&TCC1);

これでTCC1タイマーのカウントが0になる
※ASFのタイマーカウンターモジュールが入ってないと動きません

関数本体の中身を

((TC0_t *)tc)->CNT = 0;

って書けば一行で済みそうな気もするけど、16bitのレジスタにアクセスするには
まず下位8bitを書いてから上位8bitを書かないといけないらしく、
上記の一行だけではうまくいかない(ややこい)。

ちなみに。
ASFのtc_reset()は内部でCTRLFSETレジスタのCMDビットを弄っているだけっぽいので、
今回はASFは犯人ではないっぽい。

blogspace/atxmegaのタイマーカウントリセット.txt · Last modified: 2015/02/12 20:24 by hirosi