さて、久しぶりに立て続き更新いってみますww

AT-M6のレーザー発光電飾。例によってPICマイコン(12F675)を使います。
この辺もどろぼうひげさんの発光パターンを参考に、プログラムを書いてみました。
ちょっとスピード速めですが、じわっと光りはじめ、バッと発光してジワーーーっと消えていくようにしています。
この辺もどろぼうひげさんの発光パターンを参考に、プログラムを書いてみました。
ちょっとスピード速めですが、じわっと光りはじめ、バッと発光してジワーーーっと消えていくようにしています。
また、発光の間隔はやや不定期になるようにしています。
プログラム開発環境ですが、
●使用PIC 12F675(8ピン)
●統合開発環境MPLAB X IDE
●使用言語:C言語(XC8コンパイラ)
です。
詳しくは(あまり詳しくないww)とりあえす別カテゴリーにある記事をご参照願います。
https://blogs.yahoo.co.jp/toshi580909/15056040.html
リンクの記事にあるような環境を構築されている方は、以下のソースをコピペして12F675に書き込めば、GPIO0にPWM出力が得られ、動画のように発光するハズです。
/********************ここから **************************/
/************************************
* ファイル名:180215 AT-M6 Brast.c
* デバイス:PIC12F675
* プログラム作成日:2018年2月15日
* MPLAB X IDE ver4.01 & XC6 ver1.44
* 内容:タイマー0割り込みによるpwm
* 点灯間隔を不定期にする
* バンダイヴィークルコレクションAT-M6電飾用
* 使用ポート:GP0:LED明減
************************************/
// CONFIG
#pragma config FOSC = INTRCIO //クロックは内臓(4MHz)
#pragma config WDTE = OFF //ウオッチドッグタイマー使わない
#pragma config PWRTE = OFF //パワーアップタイマー使わない
#pragma config MCLRE = OFF // GP3をMCLRにしない
#pragma config BOREN = OFF // ブラウンアウトタイマー使わない
#pragma config CP = OFF //コードプロテクトしない
#pragma config CPD = OFF //データコードプロテクトしない
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
#define _XTAL_FREQ 4000000
char count; //char型の変数を宣言 変数名はcount
char duty_a; //char型の変数を宣言 変数名はduty_a
void interrupt warikomi(void) //割り込みルーチン
{
T0IF = 0; //TMR0オーバーフローフラグをリセット
T0IE = 0; //割り込みルーチンの間は2重にTMR0割り込みにならないように禁止する
if (count < duty_a) //もしも、countがduty_aより小さい値なら
{
GPIO0 = 1; //点灯
}
else //そうでなかったら
{
GPIO0 = 0; //消灯
}
count++; //countに1づつを足す
if (count == 100) //もしcountが100になったら、
{
count = 0; //cuntを0にしなさい。
}
T0IE = 1; //TMR0割り込み許可
} //割り込みルーチン終了
void main(void)
{
char i; //char型の変数を宣言 変数名はi
char j; //char型の変数を宣言 変数名はj
CMCON = 0x07; //コンパレータ使わない
ANSEL = 0x00; //ポートはすべてデジタル
TRISIO = 0x00; //ポートはすべて出力(ただしGP3は除く)
GPIO = 0x00; //ポート出力はすべて0(ただしGP3は除く)
count = 0; //変数の初期値countは0
duty_a = 0; //変数の初期値duty_aは0
OPTION_REG = 0x08; //TMR0クロックは内部。プリスケーラを使わない。
TMR0 = 0x00; //TMR0は0からスタート
T0IE = 1; //TMR0割り込み許可
GIE = 1; //すべての割り込み許可
while (1) //無限ループ
{
for (i = 0; i <= 15; i++) //iを0から15まで1を足しながら{ }の中を実行する
{
duty_a = i; //duty aにiの値を代入。
__delay_ms(70); //70msの間を置きつつ、duty aを15まで増やす(ちょっと点灯)
}
for (i = 100; i >= 80; i--) //いきなりフル点灯になり、
{
duty_a = i; //duty aにiの値を代入。
__delay_ms(80); //80msの間を置きつつ、duty aを80まで減らす(ちょっと暗くなる)
}
for (i = 20; i <= 100; i++) //iを20から100になるまで1を足しながら{ }の中を実行する
{
duty_a = 100-i; //duty_aは100からiを引いた値にする。つまりカウントダウンする。
__delay_ms(50); //50msの間を置きつつ、duty aを0まで減らす。(ゆっくり暗くなり消える)
}
//次回点灯するタイミングを不定期にする。
j = 30 + rand()%50; //30から79までの乱数を発生し、それをjとする。
while(j--) //得られた乱数分、{}内を繰り返す
{
__delay_ms(100);
}
}//End of while //ここまでを無限に繰り返す
}//End of main //メインルーチン終わり
/********************ここまで **************************/
このプログラムでは、LEDをふわっと点灯したり消灯したりするのに、「タイマー0割込み」を使ったPWMを使用しています。
色々な書籍や専門サイトで紹介されているものなので、詳しくはそちらを参考にして頂きたいのですが、ここでは七面倒くさい理屈は後回しで、とにかくやってみたい方向けという位置付けで公開いたします。専門家レベルの高度な質問にはお答え出来ないかも知れませんがご容赦のほどをww
今日は手短にこの辺で。3月になり、暖かくなってきたので早く塗装作業に入りたいものですなww
(つづく)