アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

がると申します。


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

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

のが原因です。

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

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

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

>カウントはしてくれ、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

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

この回答への補足

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

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

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