BASIC4MCU | 질문게시판 | pwm을 이용한 led
페이지 정보
작성자 아자자자자자 작성일2023-12-02 23:04 조회1,785회 댓글1건본문
안녕하세요 앞의 저의 질문에 도움을 주셔서 감사합니다.
light_sensor_value 값에 따라서 OCR0 값을 이용하여 led pin4번에 밝기 조절을 하였는데 pin4번 처럼 PORTB에 연결된 led 전부를 pwm 모드로 동작시킬 수 있는 방법은 없을까요??
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
//
uint8_t FND_TABLE[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; // 7-segment display values 0~9
//
void display_number(uint16_t number){
uint8_t digits[4]; int i;
digits[0]= number/1000;
digits[1]=(number%1000)/100;
digits[2]=(number% 100)/ 10;
digits[3]= number% 10;
for(i=0;i<4;i++){
PORTA=FND_TABLE[digits[i]];
PORTC=~(1<<i);
_delay_ms(5); }
}
//
int main(void){
uint16_t light_sensor_value; uint8_t pwm_value;
DDRA=0xFF; // 7-segment display
DDRC=0x0F; // Common cathode 4-digit 7-segment display
DDRB=0x10;
DDRD=0xFF; // Output for PWM LEDs
ADCSRA=0xE7; ADMUX=0x02; // PF2
TCCR0|=(1<<WGM01)|(1<<WGM00)|(1<<COM01)|(1<<CS01)|(1<<CS00);
while(1){
_delay_ms(1);
light_sensor_value=ADC;
light_sensor_value<<=2; // 10비트를 8비트로 만듬
display_number(light_sensor_value);
if (light_sensor_value <= 150) {
OCR0 = 255;
} else if (light_sensor_value <= 300) {
OCR0 = 30;
} else {
OCR0 = 0;
}
}
return 0;
}
댓글 1
조회수 1,785master님의 댓글
master 작성일
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//
uint8_t FND_TABLE[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//
void display_number(uint16_t number){
uint8_t digits[4]; int i;
digits[0]= number/1000;
digits[1]=(number%1000)/100;
digits[2]=(number% 100)/ 10;
digits[3]= number% 10;
for(i=0;i<4;i++){ PORTA=FND_TABLE[digits[i]]; PORTC=~(1<<i); _delay_ms(5); }
}
//
ISR(TIMER0_OVF_vect){ PORTB=0xFF; }
ISR(TIMER0_COMP_vect){ PORTB=0x00; }
//
int main(void){
uint16_t light_sensor_value;
DDRA=0xFF; // 7-segment display
DDRC=0x0F; // Common cathode 4-digit 7-segment display
DDRB=0xFF;
DDRD=0xFF; // Output for PWM LEDs
ADCSRA=0xE7; ADMUX=0x02; // PF2
TCCR0=0x03; TIMSK=0x03; // 512us 주기
SREG=0x80;
while(1){
_delay_ms(1);
light_sensor_value=ADC;
light_sensor_value<<=2; // 10비트를 8비트로 만듬
display_number(light_sensor_value);
if (light_sensor_value <= 150){ OCR0=255; }
else if(light_sensor_value <= 300){ OCR0= 30; }
else { OCR0= 0; }
}
return 0;
}
체크해보세요