This shows you the differences between two versions of the page.
blogspace:atxmegaのタイマーカウントリセット [2015/02/12 20:18] hirosi |
blogspace:atxmegaのタイマーカウントリセット [2015/02/12 20:24] (current) hirosi |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== atxmegaのタイマーカウントリセット ====== | ====== atxmegaのタイマーカウントリセット ====== | ||
- | ATXmega32A4Uを使っていて小一時間引っかかった事が有ったのでメモ | + | ATXmega32A4Uを使っていて小一時間引っかかった事が有ったのでメモ\\ |
- | マイコンの16bitタイマーを使っていて、タイマーカウントをリセットしたかったので | + | マイコンの16bitタイマーを使っていて、タイマーカウントをリセットしたかったので\\ |
- | ASF(AtmelSoftwareFramework)のtc_reset()関数を呼んでカウントリセットを試みたのですが | + | ASF(AtmelSoftwareFramework)のtc_reset()関数を呼んでカウントリセットを試みたのですが\\ |
- | リセットされませんでした。 | + | リセットされませんでした。\\ |
- | tc_restart()関数だとカウントリセットもされるんですが、 | + | tc_restart()関数だとカウントリセットもされるんですが、\\ |
- | 当然ながらその後カウントアップが始まります。 | + | 当然ながらその後カウントアップが始まります。\\ |
- | + | \\ | |
- | で、どうにかカウントを再開させずにカウントだけをリセットできないかゴニョゴニョやって | + | で、どうにかカウントを再開させずにカウントだけをリセットできないかゴニョゴニョやって\\ |
- | 結局以下のコードを書いて解決しました。 | + | 結局以下のコードを書いて解決しました。\\ |
- | inline void tc_cnt_reset(volatile void *tc) | + | inline void tc_cnt_reset(volatile void *tc) |
- | { | + | { |
- | ((TC0_t *)tc)->CNTL = 0; | + | ((TC0_t *)tc)->CNTL = 0; |
- | ((TC0_t *)tc)->CNTH = 0; | + | ((TC0_t *)tc)->CNTH = 0; |
- | } | + | } |
- | + | \\ | |
- | 呼ぶ時はこう | + | 呼ぶ時はこう\\ |
- | tc_cnt_reset(&TCC1); //これでTCC1タイマーのカウントが0になる | + | tc_cnt_reset(&TCC1); |
- | + | これでTCC1タイマーのカウントが0になる\\ | |
- | ※ASFのタイマーカウンターモジュールが入ってないと動きません | + | ※ASFのタイマーカウンターモジュールが入ってないと動きません\\ |
- | + | \\ | |
- | 関数本体の中身を | + | 関数本体の中身を\\ |
- | ((TC0_t *)tc)->CNT = 0; | + | ((TC0_t *)tc)->CNT = 0; |
- | って書けば一行で済みそうな気もするけど、16bitのレジスタにアクセスするには | + | って書けば一行で済みそうな気もするけど、16bitのレジスタにアクセスするには\\ |
- | まず下位8bitを書いてから上位8bitを書かないといけないらしく、 | + | まず下位8bitを書いてから上位8bitを書かないといけないらしく、\\ |
- | 上記の一行だけではうまくいかない(ややこい)。 | + | 上記の一行だけではうまくいかない(ややこい)。\\ |
- | + | \\ | |
- | ちなみに。 | + | ちなみに。\\ |
- | ASFのtc_reset()は内部でCTRLFSETレジスタのCMDビットを弄っているだけっぽいので、 | + | ASFのtc_reset()は内部でCTRLFSETレジスタのCMDビットを弄っているだけっぽいので、\\ |
- | 今回はASFは無実っぽい。 | + | 今回はASFは犯人ではないっぽい。\\ |