10年ぶりの大型台風26号が関東地方に接近している。
今日は朝から強い雨が続いていて、秋の農作業もできない。そんな日は引きこもって電子工作だ。今日のおもちゃは先日購入した「PIC18F4553使用USB対応マイコンボード」とブレッドボード。
尾をを引いて流れるように見えるLED照明を作ってみようと思っていて、まずは照度を制御してみる。LEDの明るさはパルス駆動にしてデューテイ比を変えれば良いはず。いわゆるPWMだ。
まずはブレッドボードの組み立て。PIC18F4553のポートB4端子に480Ωの抵抗器を介しLEDが接続されている。
接続されたLEDは徐々に明るくなり、また徐々に暗くなっていくようにしたいのだ。PIC18F4553にはPWMに使えるモジュールが2セット搭載されているが、2チャンネル以上欲しいのでプログラムでPWMを実現してみた。
プログラムはC言語で、XC8コンパイラを使った。
こんなもの簡単と言いたいところだが、一日かかった。目は痛いし肩はこるし、早く台風に通りすぎてほしいものだ。
トップページに移動
#include
#include
#pragma config PLLDIV = 5 // (20MHz crystal)
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 2 // Clock source from 96MHz PLL/2
#pragma config FOSC = HSPLL_HS
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRT = OFF
#pragma config BOR = ON
#pragma config BORV = 3
#pragma config VREGEN = OFF
#pragma config WDT = OFF
#pragma config WDTPS = 32768
#pragma config MCLRE = ON
#pragma config LPT1OSC = OFF
#pragma config PBADEN = OFF
#pragma config CCP2MX = OFF
#pragma config STVREN = ON
#pragma config LVP = OFF
#pragma config ICPRT = OFF
#pragma config XINST = OFF
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CP2 = OFF
#pragma config CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
#pragma config WRTB = OFF
#pragma config WRTC = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF
#define _XTAL_FREQ 48000000 //for __delay_ms
#define SW1 PORTEbits.RE0
#define SW2 PORTEbits.RE1
#define LED PORTEbits.RE2
#define LED_Red PORTDbits.RD0
#define LED_White PORTCbits.RC2
#define LED_Red0 PORTBbits.RB0
#define LED_Red1 PORTBbits.RB1
#define LED_Red2 PORTBbits.RB2
#define LED_Red3 PORTBbits.RB3
unsigned int led1_period=0;
unsigned int led1_period_count=0;
unsigned int led1_duty=0;
bit led1_duty_up;
void init(void)
{
ADCON1 = 0b00001111;
TRISA = 0b00000000;
TRISB = 0b00000000;
TRISC = 0b00110000; //D-,D+
TRISD = 0b00000000;
TRISE = 0b00000011; //SW1,2=INPUT LED=OUTPUT
LATA = 0b00000000;
LATB = 0b00000000;
LATC = 0b00000000;
LATD = 0b00000000;
LATE = 0b00000000;
}
void main(void) {
init();
led1_period = 0x0fff;
led1_duty=0x00;
led1_duty_up=0b1;
LED=1;
LED_Red = 1;
while(1){
if(led1_period_count < led1_period){
led1_period_count++;
if(led1_period_count < led1_duty) {
LED_Red0=1;
LED_Red1=0;
LED_Red2=1;
LED_Red3=0;
}
else{
LED_Red0=0;
LED_Red1=1;
LED_Red2=0;
LED_Red3=1;
}
}
else{
LED_White = !LED_White;
if( led1_duty_up == 0) {led1_duty = led1_duty - 0x7f; }
else{led1_duty = led1_duty + 0x7f; }
if( led1_duty > led1_period){ led1_duty_up= 0; }
if( led1_duty
今日は朝から強い雨が続いていて、秋の農作業もできない。そんな日は引きこもって電子工作だ。今日のおもちゃは先日購入した「PIC18F4553使用USB対応マイコンボード」とブレッドボード。
尾をを引いて流れるように見えるLED照明を作ってみようと思っていて、まずは照度を制御してみる。LEDの明るさはパルス駆動にしてデューテイ比を変えれば良いはず。いわゆるPWMだ。
まずはブレッドボードの組み立て。PIC18F4553のポートB4端子に480Ωの抵抗器を介しLEDが接続されている。
接続されたLEDは徐々に明るくなり、また徐々に暗くなっていくようにしたいのだ。PIC18F4553にはPWMに使えるモジュールが2セット搭載されているが、2チャンネル以上欲しいのでプログラムでPWMを実現してみた。
プログラムはC言語で、XC8コンパイラを使った。
こんなもの簡単と言いたいところだが、一日かかった。目は痛いし肩はこるし、早く台風に通りすぎてほしいものだ。
トップページに移動
#include
#include
#pragma config PLLDIV = 5 // (20MHz crystal)
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 2 // Clock source from 96MHz PLL/2
#pragma config FOSC = HSPLL_HS
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRT = OFF
#pragma config BOR = ON
#pragma config BORV = 3
#pragma config VREGEN = OFF
#pragma config WDT = OFF
#pragma config WDTPS = 32768
#pragma config MCLRE = ON
#pragma config LPT1OSC = OFF
#pragma config PBADEN = OFF
#pragma config CCP2MX = OFF
#pragma config STVREN = ON
#pragma config LVP = OFF
#pragma config ICPRT = OFF
#pragma config XINST = OFF
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CP2 = OFF
#pragma config CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
#pragma config WRTB = OFF
#pragma config WRTC = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF
#define _XTAL_FREQ 48000000 //for __delay_ms
#define SW1 PORTEbits.RE0
#define SW2 PORTEbits.RE1
#define LED PORTEbits.RE2
#define LED_Red PORTDbits.RD0
#define LED_White PORTCbits.RC2
#define LED_Red0 PORTBbits.RB0
#define LED_Red1 PORTBbits.RB1
#define LED_Red2 PORTBbits.RB2
#define LED_Red3 PORTBbits.RB3
unsigned int led1_period=0;
unsigned int led1_period_count=0;
unsigned int led1_duty=0;
bit led1_duty_up;
void init(void)
{
ADCON1 = 0b00001111;
TRISA = 0b00000000;
TRISB = 0b00000000;
TRISC = 0b00110000; //D-,D+
TRISD = 0b00000000;
TRISE = 0b00000011; //SW1,2=INPUT LED=OUTPUT
LATA = 0b00000000;
LATB = 0b00000000;
LATC = 0b00000000;
LATD = 0b00000000;
LATE = 0b00000000;
}
void main(void) {
init();
led1_period = 0x0fff;
led1_duty=0x00;
led1_duty_up=0b1;
LED=1;
LED_Red = 1;
while(1){
if(led1_period_count < led1_period){
led1_period_count++;
if(led1_period_count < led1_duty) {
LED_Red0=1;
LED_Red1=0;
LED_Red2=1;
LED_Red3=0;
}
else{
LED_Red0=0;
LED_Red1=1;
LED_Red2=0;
LED_Red3=1;
}
}
else{
LED_White = !LED_White;
if( led1_duty_up == 0) {led1_duty = led1_duty - 0x7f; }
else{led1_duty = led1_duty + 0x7f; }
if( led1_duty > led1_period){ led1_duty_up= 0; }
if( led1_duty