Article #1070

既に発行済みのブログであっても適宜修正・追加することがあります。
We may make changes and additions to blogs already published.
posted by sakurai on March 29, 2026 #1070

Geminiに設計してもらったプログラムを以下に示します。

// --- コンフィギュレーション設定(マイコンの基本動作設定) ---
#pragma config FOSC = INTOSC    // 内蔵クロックを使用
#pragma config WDTE = OFF       // ウォッチドッグタイマーOFF
#pragma config PWRTE = ON       // パワーアップタイマーON
#pragma config MCLRE = OFF      // 4番ピンをリセットに使わずGPIO(RA3)として使う
#pragma config CP = OFF         // コードプロテクトOFF
#pragma config BOREN = ON       // 電圧低下で安全停止
#pragma config CLKOUTEN = OFF   // クロック出力OFF
#pragma config LVP = OFF        // 低電圧プログラミングOFF(ICSP動作を安定させる)

#include <xc.h>

// 動作クロックの定義(__delay_msの計算に必要)
#define _XTAL_FREQ 4000000 

void main(void) {
    // --- マイコンの初期化 ---
    OSCCON = 0x6A;          // 内部クロック4MHzに設定
    ANSELA = 0x00;          // 全ピンをデジタルモードに設定(スイッチ入力に必須)
    TRISA = 0b00100000;     // RA5(2番ピン)を入力、他を出力に設定
    WPUA = 0b00100000;      // RA5を内部プルアップ設定
    OPTION_REGbits.nWPUEN = 0; // 内部プルアップ機能を有効化

    // PWM(調光)の初期設定
    PWM1CON = 0xC0;         // PWM1(5番ピン/RA2)を有効化
    PWM3CON = 0xC0;         // PWM3(3番ピン/RA4)を有効化
    T2CON = 0x04;           // Timer2 ON, プリスケーラ1:1
    PR2 = 255;              // PWMの周期設定

    // 制御用変数の宣言
    unsigned char mode = 1;      // 0:消灯, 1:交互ゆらぎ, 2:全点灯, 3:点滅
    unsigned char duty_L = 0;    // 左側の明るさ用変数
    signed char direction = 5;   // 明るさの変化量(プラスで明るく、マイナスで暗く)

    while(1) {
        // --- モード切り替えスイッチ判定(2番ピンをGNDに落とすと反応) ---
        if (RA5 == 0) {
            __delay_ms(20);      // チャタリング防止
            if (RA5 == 0) {      // 押し続けられているか再確認
                while(RA5 == 0); // 指を離すまで待機
                __delay_ms(20);  // 離した後の安定待ち
                
                mode++;          // モードを1つ進める
                if (mode > 3) mode = 0; // モード0〜3を循環
                
                // モード切替時に明るさ変数をリセット
                duty_L = 0;
                direction = 5;
            }
        }

        // --- 各モードの動作実行 ---
        switch(mode) {
            case 0: // 【全消灯】
                PWM1DCH = 0;
                PWM3DCH = 0;
                break;

            case 1: // 【アナログ交互ゆらぎ】★初期起動モード
                PWM1DCH = duty_L;           // 5番ピン(L)を出力
                PWM3DCH = (unsigned char)(255 - duty_L); // 3番ピン(R)は逆位相で出力
                
                // 明るさを変化させる
                if (direction > 0) {
                    if (duty_L < 250) {
                        duty_L += 5;
                    } else {
                        direction = -5; // 上限で反転
                    }
                } else {
                    if (duty_L > 5) {
                        duty_L -= 5;
                    } else {
                        direction = 5;  // 下限で反転
                    }
                }
                __delay_ms(40); // 変化のスピード調整(ニューヨークの夜景風)
                break;

            case 2: // 【全点灯】
                PWM1DCH = 255;
                PWM3DCH = 255;
                break;

            case 3: // 【同時点滅】
                PWM1DCH = 255;
                PWM3DCH = 255;
                __delay_ms(300);
                PWM1DCH = 0;
                PWM3DCH = 0;
                __delay_ms(300);
                break;
        }
        __delay_ms(10); // ループの安定用ウェイト
    }
}

コンパイル(build)は金槌のアイコンをクリックします。PICへの書き込みはダウンロードのような下向き矢印アイコンをクリックします。読み出しはアップロードのような上向き矢印アイコンをクリックします。書き込んだPICかみ書き込みかは読みだすとわかります。


左矢前のブログ 次のブログ右矢

Leave a Comment

Your email address will not be published.

You may use Markdown syntax. If you include an ad such as http://, it will be invalidated by our AI system.

Please enter the numbers as they are shown in the image above.