저는 AVR C 프로그래밍에 익숙하지 않습니다. LED에 조광기 역할을하는 Atmega328p 카운터/타이머에서 16 비트 타이머를 사용하여 간단한 PWM을 테스트하고 있습니다.16 비트 타이머 PWM LED 조광기
내 코드 :
#define F_CPU 16000000UL
void initTimer();
int x = 1;
int n = 1000;
int main(void)
{
initTimer();
DDRB |= (1 << PB1)| (1 << PB2);
while(1)
{
x++;
if(x > 65) {
x = 1;
}
}
}
void initTimer() {
TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);
// used for TOP, makes for 50 Hz PWM
ICR1 = 40000;
OCR1A = n * x;
}
ISR(TIMER1_OVF_vect)
{
OCR1A = n * x;
}
문제점이 조광 효과를 표시하지 않는다는 것이다에서, LED의 밝기는 그 가정하자 I 처음 OCR1A (PB1) 출력 핀에 설정된 어떤 값으로 일정하게 유지 인터럽트가 발생했을 때 값을 변경하는 것만으로도이 작업을 수행하지 않는 것이 간단한 테스트 일 수 있습니다. 무엇이 잘못 되었습니까?
업데이트: OCR1A의 원래 값이 지정되었습니다 조언으로
내가 TIMSK1 레지스터와 SEI는(), 그러나 여전히 LED 밝기 같은 문제가 일정하게 유지를 사용하여 인터럽트를 사용 가능으로 무엇에 initTimer().
int main(void)
{
initTimer();
DDRB |= (1 << PB1)| (1 << PB2);
while(1)
{
x++;
if(x > 65) {
x = 1;
}
}
}
void initTimer() {
ICR1 = 40000;
OCR1A = n * x;
TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);
TIMSK1 |= (1 << ICIE1);
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);
sei();
}
ISR (TIMER1_COMPA_vect)
{
OCR1A = n * x;
}
내가 다른 방법을 시도하지만 그 날 디밍을 제공은 영향 :
는int main(void)
{
initTimer();
DDRB |= (1 << PB1)| (1 << PB2);
while(1)
{
_delay_ms(20);
OCR1A = n * 4;
_delay_ms(20);
OCR1A = n * 8;
_delay_ms(20);
OCR1A = n * 15;
_delay_ms(20);
OCR1A = n * 25;
_delay_ms(20);
OCR1A = n * 1;
}
}
void initTimer() {
ICR1 = 40000;
OCR1A = n * x;
TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);
}
그래서 문제가 PWM이 작품에 영향을 미칠하지만 단지 인터럽트 핸들러와 함께 작동하지 않는 때문에 인터럽트 것 같다 .