Witam serdecznie kolegów.
Mam taki oto problem. Do portu PB2(OC0A) mam podłączoną diodę LED czerwoną poprzez rezystor 470Ω. Mikrokontroler pracuje na wewnętrznym generatorze na 8MHz. Konfiguruję TIMER/COUNTER0 do pracy w trybie FAST PWM. A moim celem jest regulacja jasności świecenia diodą od 0 do max. I tu pojawia się problem bo tak jak mogę nastawić max jasności, tak przy nastawieniu wartości 0 w rejestrze OC0A dioda dalej świeci (słabo ale dalej świeci), niezależnie od nastawionej wartości preskalera dla częstotliwości taktowania PWM. Dopiero wyłączenie PWM, czyli nastawienie wartości 000 na bitach konfiguracji preskalera w rejestrze TCCR0B, powoduje zgaśnięcie diody. Nie rozumiem takiego zachowania.
1. Czy coś źle robię, może gdzieś coś źle nastawiłem w rejestrach?
2. Czy da się tę diodę zgasić przy działającym PWM dla wartości wypełnienia 0% i jeśli tak, to jak?
3. Czy ewentualnie powinienem to robić w innym trybie pracy PWM np Phase Correct?
Nadmienię jeszcze że na początku ten układ wyglądał tak, że do portu mikrokontrolera była podłączona bramka tranzystora BS170 poprzez który sterowałem diodę i efekt był ten sam. Brak możliwości całkowitego wygaszenia diody przy pracującym PWM.
Załączam też kod programu:
Za podpowiedzi z góry dziękuję!
Mam taki oto problem. Do portu PB2(OC0A) mam podłączoną diodę LED czerwoną poprzez rezystor 470Ω. Mikrokontroler pracuje na wewnętrznym generatorze na 8MHz. Konfiguruję TIMER/COUNTER0 do pracy w trybie FAST PWM. A moim celem jest regulacja jasności świecenia diodą od 0 do max. I tu pojawia się problem bo tak jak mogę nastawić max jasności, tak przy nastawieniu wartości 0 w rejestrze OC0A dioda dalej świeci (słabo ale dalej świeci), niezależnie od nastawionej wartości preskalera dla częstotliwości taktowania PWM. Dopiero wyłączenie PWM, czyli nastawienie wartości 000 na bitach konfiguracji preskalera w rejestrze TCCR0B, powoduje zgaśnięcie diody. Nie rozumiem takiego zachowania.
1. Czy coś źle robię, może gdzieś coś źle nastawiłem w rejestrach?
2. Czy da się tę diodę zgasić przy działającym PWM dla wartości wypełnienia 0% i jeśli tak, to jak?
3. Czy ewentualnie powinienem to robić w innym trybie pracy PWM np Phase Correct?
Nadmienię jeszcze że na początku ten układ wyglądał tak, że do portu mikrokontrolera była podłączona bramka tranzystora BS170 poprzez który sterowałem diodę i efekt był ten sam. Brak możliwości całkowitego wygaszenia diody przy pracującym PWM.
Załączam też kod programu:
#include<avr/io.h>
#include<util/delay.h>
void pwmset(void); //funkcja konfigurująca timery
void pinset(void); //funkcja konfigurująca porty
void lightn(void); //funkcja płynnie właczająca światło
void lightf(void); //funkcja płynnie wyłączająca światło
int main(void)
{
pinset();
pwmset();
_delay_ms(500);
lightn();
_delay_ms(500);
lightf();
while(1);
}
//---------------funkcje-----------
void lightn(void)
{
unsigned char i;
for(i=0; i<255; i++)
{
OCR0A=i;
_delay_ms(25);
}
}
void lightf(void)
{
unsigned char i;
for(i=255; i>0; i--)
{
OCR0A=i;
_delay_ms(25);
}
}
void pinset(void)
{
DDRA=0B00000000;
PORTA=0B00000110;
DDRB=0B00011100;
PORTB=0B00000000;
DDRD=0B00100000;
PORTD=0B00000000;
}
void pwmset(void)
{
TCCR0A=0xA3; //konfiguracja fast pwm timera 0
TCCR0B=0x00; //pwm stop
OCR0A= 0x00; //wspolczynnik 50%
OCR0B= 0x00; //wspolczynnik 100%
TIMSK= 0x00; //brak przerwan
TIFR= 0x00; //brak przerwan
TCCR0B=0x03; //prescaler /64 start pwm
}
Za podpowiedzi z góry dziękuję!
