秒数が出ないのですがどこが違うのでしょうか?
#define TCNT0 (*(volatile unsigned int *)0xffff68)
#define GRA0 (*(volatile unsigned int *)0xffff6a)
#define GRB0 (*(volatile unsigned int *)0xffff6c)
#define TCR0 (*(volatile unsigned char *)0xffff64)
#define TIOR0 (*(volatile unsigned char *)0xffff65)
#define TIER0 (*(volatile unsigned char *)0xffff66)
#define TSR0 (*(volatile unsigned char *)0xffff67)
#define TSTR (*(volatile unsigned char *)0xffff60)
#define ITU_CLOCK8 3
#define ITU_CLEAR_GRA 32
#define ITU_IE_IMFA 1
#define DI asm( "orc.b #0xc0,ccr" )
#define EI asm( "andc.b #0x3f,ccr" )
void start_itu0();
void int_imia0(void) __attribute__ ((interrupt_handler));
int cnt = 0, sec = 0, min = 0, hour = 0;
char str[] = "timer 00:00:00";
int main(void)
{
lcd_init();
lcd_puts(str);
start_itu0();
EI;
for(;;) {
if (cnt >=100) {
cnt = 0;
sec++;
if (sec >=60) {
sec = 0;
min++;
if (min >= 60) {
min = 0;
hour++;
if (hour >= 24) hour = 0;
}
str[6] = '0' + hour /10;
str[7] = '0' + hour %10;
str[9] = '0' + min /10;
str[10] = '0' + min %10;
str[12] = '0' + sec /10;
str[13] = '0' + sec %10;
lcd_home();
lcd_puts(str);
}
}
}
return 0;
}
No.2ベストアンサー
- 回答日時:
がると申します。
えっと………。
lcd_initとかlcd_putsとか拝見するに、かなりハードよりのプログラムだと思うのですが。
とりあえずまず「普通に動くCプログラム」を書いてからのほうがよろしいように思われますがいかがなものでしょうか。
で、#1さんのおっしゃるとおり、拝見しているロジックの限りでは
・cntをインクリメントしていないのでそもそも無限ループしっぱなしで処理が続かない
です。このプログラムで「カウントはしてくれ」というのが非常に不思議です(或いは違うソースで動いてませんか?)
あと、インクリメントがあると仮定して、直接的に秒がちゃんと動かないのは
・文字列を作成する処理が
if (sec >=60) {
sec = 0;
という処理の内側にいるので、文字列作成のタイミングでは常に0しか入り得ない。
のが原因です。
まずは、ループとかifのネストとかをもう少し整理されることを強くお勧めいたします。
No.3
- 回答日時:
sec が表示されない理由は、No2 galludaさんの回答のとおりですね。
LCD に表示させる (と勝手に思い込んでいますが。。。) 箇所を、もう一度よく見直してみてください。
60s に 1回しか通らないことがわかると思います。
ところで、cnt についてですが、これは私の勝手な予想です。
おそらく 10ms 周期で割込みが入って、そのハンドラの中で cnt がインクリメントされているのでしょう。
最初にある volatile なポインタ経由でレジスタアクセスしそうなマクロもそうですが、lcd_****() などというコードを見て、なんとなく組込み機器のソースのような気がしました。
# 私も、組込み屋さんなものでして。。。
No.4
- 回答日時:
ソースを見た感じでは、H8用のGCCですよね。
encyさんのご指摘どおり、
if (sec >= 60)
のときしか表示を更新しないので、secは常に0になりますね。
そして、もう一つ問題があります。
H8/300Hとみなして、-O2オプションを付けてコンパイルすると、
mov.w @_cnt,r2
mov.w @_sec,r3
mov.w #10,r4
.L13:
cmp.w #99,r2
ble .L13
となってしまい、割り込み処理でcntを更新しても反映されません。
割り込み処理や他のタスクと変数を共有する場合は、必ずvolatileをつけましょう。
No.5
- 回答日時:
>カウントはしてくれ、minとhourは出るのですが
>secだけでないのですが???
ということなので、cntは別プロセスでインクリメントされているのでしょう。
#ほかの方の指摘にあるように、
#volatile指定がなくて平気ですか?
で、secだけ【出ない】。出ないというのは
表示されないのか、常にゼロが出力されるのか。
質問や補足があいまいなので推測ですが、たぶん
表示されないのでしょう。
であれば問題は、lcd_puts(const char*); の中じゃないですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CStringをwchar_tに変換したい
-
main の引数には const 付けた方が
-
AnsiPos相当の関数はありません...
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
ネットワークにつながっている...
-
テキストデータをそのままバイ...
-
charからLPTSTRへの変換方法
-
型変換
-
間接操作のレベルとは
-
int main()の・・・
-
phpMyAdminからストアドプロシ...
-
英単語をアルファベット順に
-
sprintfに同じ変数は使えるか
-
日付表示の方法
-
ソースコードエラー
-
C言語 バイナリファイルをfloa...
-
文字列ポインタを結合
-
16進数から10進数に変換
-
char型からのバイト数取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
CStringをwchar_tに変換したい
-
charでの計算?
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
'const char *' 型は 'char *' ...
-
テキストデータをそのままバイ...
-
配列をnビットシフトする
-
半角カナ→16進
-
double型の値をchar配列に変換...
-
sprintfに同じ変数は使えるか
-
ファイル名である文字列からbas...
-
ネットワークにつながっている...
-
ftoa の作り方
-
間接操作のレベルとは
-
型変換
-
C言語です
-
C言語のfor文です。 繰り返しの...
-
Win32APIでのエディットボック...
-
【C言語】文字型と整数型の違い
おすすめ情報