- ベストアンサー
secが・・確認お願いできませんか?
秒数が出ないのですがどこが違うのでしょうか? #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; }
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
がると申します。 えっと………。 lcd_initとかlcd_putsとか拝見するに、かなりハードよりのプログラムだと思うのですが。 とりあえずまず「普通に動くCプログラム」を書いてからのほうがよろしいように思われますがいかがなものでしょうか。 で、#1さんのおっしゃるとおり、拝見しているロジックの限りでは ・cntをインクリメントしていないのでそもそも無限ループしっぱなしで処理が続かない です。このプログラムで「カウントはしてくれ」というのが非常に不思議です(或いは違うソースで動いてませんか?) あと、インクリメントがあると仮定して、直接的に秒がちゃんと動かないのは ・文字列を作成する処理が if (sec >=60) { sec = 0; という処理の内側にいるので、文字列作成のタイミングでは常に0しか入り得ない。 のが原因です。 まずは、ループとかifのネストとかをもう少し整理されることを強くお勧めいたします。
その他の回答 (4)
- ddnp009
- ベストアンサー率25% (15/58)
>カウントはしてくれ、minとhourは出るのですが >secだけでないのですが??? ということなので、cntは別プロセスでインクリメントされているのでしょう。 #ほかの方の指摘にあるように、 #volatile指定がなくて平気ですか? で、secだけ【出ない】。出ないというのは 表示されないのか、常にゼロが出力されるのか。 質問や補足があいまいなので推測ですが、たぶん 表示されないのでしょう。 であれば問題は、lcd_puts(const char*); の中じゃないですか?
お礼
自分なりに一から勉強してみます!! そのとき躓いたらまたお願いします! ありがとうございました☆
- jacta
- ベストアンサー率26% (845/3158)
ソースを見た感じでは、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をつけましょう。
お礼
そうです!H8/3052Fです☆ 基礎から勉強して出直してきます! ありがとうございました☆
- ency
- ベストアンサー率39% (93/238)
sec が表示されない理由は、No2 galludaさんの回答のとおりですね。 LCD に表示させる (と勝手に思い込んでいますが。。。) 箇所を、もう一度よく見直してみてください。 60s に 1回しか通らないことがわかると思います。 ところで、cnt についてですが、これは私の勝手な予想です。 おそらく 10ms 周期で割込みが入って、そのハンドラの中で cnt がインクリメントされているのでしょう。 最初にある volatile なポインタ経由でレジスタアクセスしそうなマクロもそうですが、lcd_****() などというコードを見て、なんとなく組込み機器のソースのような気がしました。 # 私も、組込み屋さんなものでして。。。
お礼
返信が遅れてすみません!! 土台を作らないままプログラミングをしているのでもう少し勉強します! ありがとうございました☆
- punyo-
- ベストアンサー率25% (7/27)
cntのインクリメントがないように見えますが。
補足
カウントはしてくれ、minとhourは出るのですがsecだけでないのですが???
お礼
返信が遅れてすみませんでした!! もう少し自分なりに勉強してみます! ありがとうございました☆