
秒数が出ないのですがどこが違うのでしょうか?
#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.5
- 回答日時:
>カウントはしてくれ、minとhourは出るのですが
>secだけでないのですが???
ということなので、cntは別プロセスでインクリメントされているのでしょう。
#ほかの方の指摘にあるように、
#volatile指定がなくて平気ですか?
で、secだけ【出ない】。出ないというのは
表示されないのか、常にゼロが出力されるのか。
質問や補足があいまいなので推測ですが、たぶん
表示されないのでしょう。
であれば問題は、lcd_puts(const char*); の中じゃないですか?
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.3
- 回答日時:
sec が表示されない理由は、No2 galludaさんの回答のとおりですね。
LCD に表示させる (と勝手に思い込んでいますが。。。) 箇所を、もう一度よく見直してみてください。
60s に 1回しか通らないことがわかると思います。
ところで、cnt についてですが、これは私の勝手な予想です。
おそらく 10ms 周期で割込みが入って、そのハンドラの中で cnt がインクリメントされているのでしょう。
最初にある volatile なポインタ経由でレジスタアクセスしそうなマクロもそうですが、lcd_****() などというコードを見て、なんとなく組込み機器のソースのような気がしました。
# 私も、組込み屋さんなものでして。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストデータをそのままバイ...
-
配列をnビットシフトする
-
atoi( ) の反対をやりたい
-
絶対パスからのファイル名の切...
-
strncpyと_tcsncpy_sのヌルの扱...
-
secが・・確認お願いできません...
-
c言語strchrのキャスト...
-
_TCHAR*での引数の読み込み
-
問題のあるポインタ変換
-
文字列がNULLか空文字列かの判定
-
charからLPTSTRへの変換方法
-
c言語配列の結合についてです。...
-
バイナリファイルをコピーする...
-
ローマ字変換アルゴリズムを教...
-
WORDをcharに変換する方法
-
C言語でタグの抽出について
-
ネットワークにつながっている...
-
c言語の問題の説明、各所ごとに
-
c#でbmp画像の上下反転
-
決まった文字列幅でのスクロール
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
charからLPTSTRへの変換方法
-
テキストデータをそのままバイ...
-
c++ 文字列を入力して、一文字...
-
'const char *' 型は 'char *' ...
-
間接操作のレベルとは
-
WORDをcharに変換する方法
-
strncpyと_tcsncpy_sのヌルの扱...
-
型変換
-
配列をnビットシフトする
-
atoi( ) の反対をやりたい
-
Win32APIでのエディットボック...
-
間接参照のレベルが異なっています
-
c言語配列の結合についてです。...
-
【C言語】テキストファイル内の...
-
double型の値をchar配列に変換...
-
switch文で文字を比較すること...
-
C言語のfor文です。 繰り返しの...
おすすめ情報