Witam
Walczę od 2 godzin z głupim programowym PWM-em.
Jest sobie tablica unsigned char PWM[8];
Do elementów tej tablicy wrzucam sobie wypełnienie w procentach dla poszczególnych kanałów. Przerwanie SIG_OUTPUT_COMPARE2 uruchamia się co 800 cykli zegara systemowego. Jest zmienna globalna CLK która zlicza sobie do 100, jeżeli PWM[x] < CLK to wtedy ma zapalać bit, jeżeli nie - gasić. Wszystko działa... oprócz bitów/ pinów 2 i 3, które działają tak, że muszą być zapalone je jednocześnie żeby coś się pojawiło na wyjściu. Tak to wygląda, jakby 2 piny były zwarte (a nie są).
CH_OUT_PORT to definicja portu wyjściowego, mam w kodzie #define CH_OUT_PORT PORTB
Może ktoś spojrzy "na świeżo" i zobaczy błąd, bo ja już zgłupiałem. Godzinę już zmarnowałem na znalezienie błędu dlaczego w ogóle nic nie działało i okazało się, że steruję rejestrem DDRB zamiast PORTB.
Dodano po 12 [minuty]:
Taśma do tranzystorów była przycięta... Zamykam.
Nie usuwam, może komuś się przyda taki wycinek kodu.
Walczę od 2 godzin z głupim programowym PWM-em.
Jest sobie tablica unsigned char PWM[8];
Do elementów tej tablicy wrzucam sobie wypełnienie w procentach dla poszczególnych kanałów. Przerwanie SIG_OUTPUT_COMPARE2 uruchamia się co 800 cykli zegara systemowego. Jest zmienna globalna CLK która zlicza sobie do 100, jeżeli PWM[x] < CLK to wtedy ma zapalać bit, jeżeli nie - gasić. Wszystko działa... oprócz bitów/ pinów 2 i 3, które działają tak, że muszą być zapalone je jednocześnie żeby coś się pojawiło na wyjściu. Tak to wygląda, jakby 2 piny były zwarte (a nie są).
CH_OUT_PORT to definicja portu wyjściowego, mam w kodzie #define CH_OUT_PORT PORTB
SIGNAL(SIG_OUTPUT_COMPARE2)
{
unsigned char channel;
unsigned char bfr = CH_OUT_PORT; // buforowanie wyjścia
// PWM
CLK++;
if (CLK >= 100) CLK=1;
for (channel=0;channel<8;channel++)
{
if (CLK <= PWM[channel])
{
sbi(bfr, channel);
}
else
{
cbi(bfr, channel);
}
}
CH_OUT_PORT = bfr; //bufor na wyjścia
}Może ktoś spojrzy "na świeżo" i zobaczy błąd, bo ja już zgłupiałem. Godzinę już zmarnowałem na znalezienie błędu dlaczego w ogóle nic nie działało i okazało się, że steruję rejestrem DDRB zamiast PORTB.
Dodano po 12 [minuty]:
Taśma do tranzystorów była przycięta... Zamykam.
Nie usuwam, może komuś się przyda taki wycinek kodu.