忍者ブログ
グラビアアイドルについて語るブログ。
[1] [2] [3] [4] [5] [6] [7] [8]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

アクセス解析による、先月の検索フレーズのランキングです。
前回のランキングはこちら → [検索フレーズ (2007年7月)]

1 [Google] ぷちとまと (13.8%)
2 [Google] V850 (8.2%)
3 [Google] V850 インターフェース (3.3%)
4 [Google] v850 (3.3%)
5 [Google] CQ_V850 (1.9%)
6 [OCN] ぷちとまと (1.6%)
7 [Goo] ぷちとまと (1.6%)
8 [Goo] 縺キ縺。縺ィ縺セ縺ィ (1.6%)
9 [Yahoo!JAPAN] v850 (1.3%)
10 [Yahoo!JAPAN] ぷちとまと (1.3%)

何というか、これはもう由々しき事態です。
PR
PWM で LED の明るさを変える実験の続きです。

前回の実験では、割り込みハンドラ内でデューティ比を変更しようとすると動作しなかったと書きましたが、やり直すと動作してしまいました。

多分つまらないミスをしていたのだと思いますが、シリアルやキャラクタ LCD などで簡単な確認くらいはした方がいいですね(汗)

以下、主要なコードです。

#define T 256

static int w = 0;
static int diff = 1;

// ポート初期化
void init_port()
{
// ポート35の設定 (タイマ出力)
PFC35 = 1; // TOP11出力
PMC35 = 1; // TIP11入力/TOP11出力
}

// タイマ初期化
void init_timer()
{
// TMP1の設定
TP1CE = 0; // 動作禁止
TP1CKS = 7; // fxx/512
TP1MD = 4; // PWM出力モード
TP1OE1 = 1; // TOP11出力許可
TP1OL1 = 0; // TOP11ハイレベルスタート
TP1CCR0 = T - 1;
TP1CCR1 = w;
TP1CE = 1; // 動作許可
}

// 割り込み初期化
void init_intc()
{
// INTTP1CC0
TP1CCPR0 = 0; // 割り込み優先度 = 0
TP1CCMK0 = 0; // 割り込み許可
}

// タイマ割り込みハンドラ
void timer_int_handler()
{
w += diff;
if (w == 0 || w == T) diff = -diff;
TP1CCR1 = w;
}


【備考】gcc で開発しています。
PWM で LED の明るさを変える実験を行いました。

前回の実験と同じ回路を使用しています。

[CON2-25] TOP11 → 680Ω → (+)LED(-) → GND [CON3-10]

デューティ比は10%ずつ増加・減少させています。TMP1 の周期25msというのは、デューティ比が10%の時にチカチカしないという基準で決定しました。

以下、主要なコードです。

#define F (20000000 / 512) / 40 // 約25ms周期

// ポート初期化
void init_port()
{
// ポート35の設定 (タイマ出力)
PFC35 = 1; // TOP11出力
PMC35 = 1; // TIP11入力/TOP11出力

#if defined(DEBUG)
// ポートCT6の設定 (動作確認用)
PMCCT6 = 0; // 入出力ポート
PMCT6 = 0; // 出力モード
PCT6 = 0; // Lレベル
#endif
}

// タイマ初期化
void init_timer()
{
// TMP1の設定
TP1CE = 0; // 動作禁止
TP1CKS = 7; // fxx/512
TP1MD = 4; // PWM出力モード
TP1OE1 = 1; // TOP11出力許可
TP1OL1 = 0; // TOP11ハイレベルスタート
TP1CCR0 = F - 1;
TP1CCR1 = 0;
TP1CE = 1; // 動作許可
}

// メイン
void sample_main()
{
volatile int d = 0; // デューティ比
volatile int diff = 10;// デューティ比の増加量
volatile int i;

init_port();
init_timer();

while (1) {
for (i = 0; i < 1000000; i++) ;

#if defined(DEBUG)
PCT6 ^= 1;
#endif

// デューティ比を変更
if (d == 0) {
diff = 10;
} else if (d == 100) {
diff = -10;
}
d += diff;
TP1CCR1 = (unsigned short)(F * d / 100);
}
}


当初、デューティ比の変更は INTTP1CC0 割り込みハンドラ内で行う計画だったのですが、期待通りに動作してくれませんでした。スタティック変数やグローバル変数を使うと変になる感じなのですが、まだ詳しいことは調べていません。
【追記】動作しました。

この程度の実験であればメイン内のループで対応できますが、できれば何とか解決したいと思っています。

【備考】gcc で開発していますが、独自マクロで Applilet っぽく書けるようにしています。
前回はタイマ割り込みハンドラ内でポートへの出力値を変更することで LED を点滅させましたが、PWM を使えば、割り込みなしで LED を点滅させることが可能です。

次のように、タイマ出力(TOP11)を使用しました。

[CON2-25] TOP11 → 680Ω → (+)LED(-) → GND [CON3-10]

以下、主要なコードです。

メイン関数内で、ポート、タイマ、割り込みの初期化を行います。タイマとして、TMP1 を PWM モードで使用しています。なお、実験対象 LED の点滅に割り込みは不要ですが、動作確認用に使用しました。

// ポート初期化
void init_port()
{
// ポート35の設定 (タイマ出力)
PFC35 = 1; // TOP11出力
PMC35 = 1; // TIP11入力/TOP11出力

#if defined(DEBUG)
// ポートCT6の設定 (動作確認用)
PMCCT6 = 0; // 入出力ポート
PMCT6 = 0; // 出力モード
PCT6 = 0; // Lレベル
#endif
}

// タイマ初期化
void init_timer()
{
// TMP1の設定
TP1CE = 0; // 動作禁止
TP1CKS = 7; // fxx/512
TP1MD = 4; // PWM出力モード
TP1OE1 = 1; // TOP11出力許可
TP1OL1 = 0; // TOP11ハイレベルスタート
// TP1OL1 = 1; // TOP11ローレベルスタート
TP1CCR0 = (20000000 / 512) - 1; // 1000ms周期
TP1CCR1 = (20000000 / 512) * 50 / 100; // デューティ比50%
// TP1CCR1 = (20000000 / 512) * 25 / 100; // デューティ比25%
TP1CE = 1; // 動作許可
}

#if defined(DEBUG)
// 割り込み初期化
void init_intc()
{
// INTTP1CC0
TP1CCPR0 = 0; // 割り込み優先度 = 0
TP1CCMK0 = 0; // 割り込み許可
}
#endif


動作確認用に、INTTP1CC0 割り込みハンドラ内で基板上の LED の点灯状態を反転します。これにより、基板上の LED は「1000ms点灯→1000ms消灯」を繰り返します。

#if defined(DEBUG)
// タイマ割り込みハンドラ
void timer_int_handler()
{
PCT6 ^= 1;
}
#endif


動作確認用 LED を基準として、実験対象 LED の点滅状態を確認します。1000ms周期で点滅しますが、init_timer() 内で TP1OL1 と TP1CCR1 を変更してみると、LED の点滅状態は次のようになりました。

ハイレベルスタート、デューティ比50% → 500ms点灯、500ms消灯
ローレベルスタート、デューティ比50% → 500ms消灯、500ms点灯
ハイレベルスタート、デューティ比25% → 250ms点灯、750ms消灯
ローレベルスタート、デューティ比25% → 250ms消灯、750ms点灯


【備考】gcc で開発していますが、独自マクロで Applilet っぽく書けるようにしています。
引き続き CQ_V850 での LED 実験です。

前回は4つのポートに LED を1個ずつ接続しての実験でしたが、今回は1ポートで2つの LED を点滅させてみました。

LED点滅実験

次のように接続しました。赤色、緑色の各 LED はそれぞれ P37 の電圧レベルH, Lで点灯します。

[CON3-8] P37 → 680Ω → (+)赤色LED(-) → GND [CON3-10]
[CON3-8] P37 → 680Ω → (-)緑色LED(+) → +3.3V [CON3-1]

以下、主要なコードです。

メイン関数内で、ポート、タイマ、割り込みの初期化を行います。タイマとして、TMP1 をインターバル・タイマ・モードで使用しています。

// ポート初期化
void init_port()
{
// ポート37の設定
PM37 = 0; // 出力モード
P37 = 0; // Lレベル
}

// タイマ初期化
void init_timer()
{
// TMP1の設定
TP1CE = 0; // 動作禁止
TP1CKS = 7; // fxx/512
TP1MD = 0; // インターバル・タイマ・モード
TP1CCR0 = (20000000 / 512) - 1; // 1000ms周期
TP1CE = 1; // 動作許可
}

// 割り込み初期化
void init_intc()
{
// INTTP1CC0
TP1CCPR0 = 0; // 割り込み優先度 = 0
TP1CCMK0 = 0; // 割り込み許可
}


INTTP1CC0 割り込みハンドラで、LED 点灯状態を切り替えます。1000 ms ごとに、赤色 LED と緑色 LED が交互に点灯します。

// タイマ割り込みハンドラ
void timer_int_handler()
{
P37 ^= 1;
}



【備考】gcc で開発していますが、独自マクロで Applilet っぽく書けるようにしています。


忍者ブログ [PR]
ブログ内検索
カレンダー
10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
最新コメント
[07/07 tiffany jewelry uk]
[09/17 車載モニター・阿蘇テック]
[08/30 愛]
[06/12 シモネッタ]
[06/11 arms22]
最新トラックバック
フリーエリア
あわせて読みたい
    Firefox 2 無料ダウンロード
    バーコード
    プロフィール
    名前:
    シモネッタ
    性別:
    非公開
    カウンター
    アクセス解析