generování PWM v CTC 328P

Tak jsem to zkusil. Ještě nevím, jak se zapisuje v Arduinu přímo do registru na určitou pozici takže požívám zatím ten delší kód, nicméně to nefunguje. Je to konstantní pwm jak kdyby neodskočil do přerušení, já si ale myslím, že se tam dostane, ale asi se mu něco nebude líbit. Část kódu “if(–x==0) x=40;” znamená, že když x zmenším o jedna a rovná-li se nule tak x nastav na hodnotu 40? Ještě jsem se nesetkal s --x a strejda google mě chce utopit v informacích co nemaj co společnýho s programováním. A ještě jsem se chtě zeptat u nastavování pinů před samotnou inicializací TIMER2 je v kódu “DDRA=0; PORTA=255;” to je jen kvůli tomu aby bylo jasný, co se na portu bude dít? tak je lepší ho obsloužit? Nebo to má i nějaký jiný mě ukrytý význam? V Arduino Uno totiž nemám přístup k PORTA. Výsledný kód vypadá takto:

unsigned char x;

ISR(TIMER2_COMPA_vect, ISR_NAKED )
{

if(–x==0) x=40;
if (x<21)
{
PIND=(1<<3);
PINB=(1<<3);
}
reti();
}

void setup() {

DDRD=(1<<3);
DDRB=(1<<3);
DDRC=0;                 //tady bylo původně DDRA
PORTD=255;
PORTC=255;            //tady bylo původně PORTA
PORTB=~(1<<3);     //tady dělám negaci jen pro B? neměl bych dělat i                                     pro D?

x=1;

TCCR2A=(0<<COM2A1)|(1<<COM2A0)|(0<<COM2B1)|(1<<COM2B0)|(0<<WGM21)|(0<<WGM20);
TCCR2B=(1<<FOC2A)|(0<<FOC2B)|(0<<WGM22)|(0<<CS22)|(0<<CS21)|(1<<CS20);
TCCR2B=(0<<FOC2A)|(0<<FOC2B)|(0<<WGM22)|(0<<CS22)|(0<<CS21)|(1<<CS20);

TCCR2A=(0<<COM2A1)|(1<<COM2A0)|(0<<COM2B1)|(1<<COM2B0)|(1<<WGM21)|(0<<WGM20);
TCCR2B=(0<<WGM22)|(0<<CS22)|(0<<CS21)|(1<<CS20);
TIMSK2 |= (1 << OCIE2A);

OCR2A=25;
OCR2B=25;
interrupts();

}

void loop() {

}