秒数が出ないのですがどこが違うのでしょうか?
#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;
}

A 回答 (5件)

>カウントはしてくれ、minとhourは出るのですが


>secだけでないのですが???

ということなので、cntは別プロセスでインクリメントされているのでしょう。
#ほかの方の指摘にあるように、
#volatile指定がなくて平気ですか?

で、secだけ【出ない】。出ないというのは
表示されないのか、常にゼロが出力されるのか。

質問や補足があいまいなので推測ですが、たぶん
表示されないのでしょう。

であれば問題は、lcd_puts(const char*); の中じゃないですか?
    • good
    • 0
この回答へのお礼

自分なりに一から勉強してみます!!
そのとき躓いたらまたお願いします!
ありがとうございました☆

お礼日時:2006/02/25 11:41

ソースを見た感じでは、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をつけましょう。
    • good
    • 0
この回答へのお礼

そうです!H8/3052Fです☆
基礎から勉強して出直してきます!
ありがとうございました☆

お礼日時:2006/02/25 11:39

sec が表示されない理由は、No2 galludaさんの回答のとおりですね。


LCD に表示させる (と勝手に思い込んでいますが。。。) 箇所を、もう一度よく見直してみてください。
60s に 1回しか通らないことがわかると思います。

ところで、cnt についてですが、これは私の勝手な予想です。
おそらく 10ms 周期で割込みが入って、そのハンドラの中で cnt がインクリメントされているのでしょう。

最初にある volatile なポインタ経由でレジスタアクセスしそうなマクロもそうですが、lcd_****() などというコードを見て、なんとなく組込み機器のソースのような気がしました。

# 私も、組込み屋さんなものでして。。。
    • good
    • 0
この回答へのお礼

返信が遅れてすみません!!
土台を作らないままプログラミングをしているのでもう少し勉強します!
ありがとうございました☆

お礼日時:2006/02/25 11:37

がると申します。


えっと………。
lcd_initとかlcd_putsとか拝見するに、かなりハードよりのプログラムだと思うのですが。
とりあえずまず「普通に動くCプログラム」を書いてからのほうがよろしいように思われますがいかがなものでしょうか。

で、#1さんのおっしゃるとおり、拝見しているロジックの限りでは
・cntをインクリメントしていないのでそもそも無限ループしっぱなしで処理が続かない
です。このプログラムで「カウントはしてくれ」というのが非常に不思議です(或いは違うソースで動いてませんか?)
あと、インクリメントがあると仮定して、直接的に秒がちゃんと動かないのは
・文字列を作成する処理が
  if (sec >=60) {
   sec = 0;
 という処理の内側にいるので、文字列作成のタイミングでは常に0しか入り得ない。

のが原因です。

まずは、ループとかifのネストとかをもう少し整理されることを強くお勧めいたします。
    • good
    • 0
この回答へのお礼

返信が遅れてすみませんでした!!
もう少し自分なりに勉強してみます!
ありがとうございました☆

お礼日時:2006/02/25 11:35

cntのインクリメントがないように見えますが。

この回答への補足

カウントはしてくれ、minとhourは出るのですがsecだけでないのですが???

補足日時:2006/02/23 20:57
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

今、見られている記事はコレ!

  • 基本情報技術者試験の言語ってどうやって選ぶ?

    SEを目指す場合、基本情報技術者試験を経て実務に就いた人も多いのではないでしょうか。教えて!gooにはSEを目指している質問者からこんな質問が寄せられました。 「基本情報技術者試験のC言語とJavaの違い?」 将...

  • 【100均グッズで!】カラフルクレヨンキャンドルを作ってみた

    市販されているキャンドルには、自分好みの色合いや、好きな形状のものなど、なかなかピッタリのものが見つからないという人も多いことだろう。自分で手作りしてみるのもありかもしれないと、そのやり方を「教えて!...

  • 不倫相手に5年ぶりに連絡したらフラれた

    常に世間の大きな関心ごととなる著名人の不貞問題。一般家庭の不倫に対してもそれは同じようで、「教えて!goo」によせられた「人は5年も経つと心は変わってしまうのでしょうか?」という質問には多くの回答が書き込...

  • 【長谷川豊】『名無しです』さんから来たメッセージ

    先日、私が別でやっている連載に対して、極めて分かりやすく、的を射たコメントが来たので是非「教えて!goo」の連載でもシェアしたいと思います。 私は沖縄で起きた痛ましい女性の暴行死事件の記事に関連して、あ...

  • おしゃれは世代を越えて。多様化する死装束の中にはドレスも!?

    日本では亡くなった人間が、現世に禍根を残していると「うらめしや~」というように幽霊になって出てくると言われている。幽霊について伝統的なイメージといえば、頭に巻いた三角の布に、真っ白な死装束、そして足が...

おしトピ編集部からのゆる~い質問を出題中

お題をもっとみる


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ