OCR e wiring

Salve, durante la stesura di un codice per controllare un servomotore mi sono imbattuto nella difficoltà di gestire i canali OCR direttamente da wiring.
Vi mostro il mio codice

int main(void)
{
	DDRB |= (1 << PB1);
	ICR1 = 39999; // T=20ms fcpu=16MHz :8
	TCCR1A |= (1 << COM1A1) | (1 << WGM11);
	TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS11);
	
	while(true) 
	{
		OCR1A = 999;
		_delay_ms(2000);
		OCR1A = 4499;
		_delay_ms(2000);	
	}
}

Con questo codice teoricamente dovrei gestire il fast PWM sulla porta OC1A, ho un periodo di 20ms e ho configurato i registri a dovere. Il codice funziona e fa il suo lavoro se compilato da Atmel studio, in partenza però lo stavo testando sull'IDE di arduino (ovviamente con le modifiche a delay e la divisione loop e setup) ma l'unico risultato che ottenevo era che il pin rimaneva acceso come se il duty cycle fosse del 100%.
Per caso non posso operare direttamente su questi registri da l'IDE di arduino? Devo considerare fattori in piu con il bootloader alle spalle? In poche parole cosa devo aggiungere o cambiare perché in wiring questo codice funzioni?

Grazie per ogni risposta che mi darete, so che non mi è cosi vitale dare un significato a questo problema, ma comunque ho trovato questa incompatibilità e vorrei capire da cosa è data.

PS Non è che qualcuno mi spiegherebbe anche perché la comandabilità del servo è nata con PCM legato a 2ms su 20ms invece di usare un PWM basato sull'intero periodo di modulazione.

Certo che puoi operare direttamente sui registri del micro. Però ti devi ricordare che il core di Arduino preconfigura i timer per una determinata modalità (che varia a seconda del timer) per cui li devi configurare da zero, e non usando le operazioni di OR, con le quali vai a modificare solo determinati bit e non tutto il registro.

Si può vedere il codice di Arduino?

Vero vero, non ci avevo pensato in ogni caso il codice lo avevo eliminato ma c'è voluto poco per rifarlo

void setup() {
  DDRB |= (1 << 1);
  ICR1 = 39999; // T=20ms fcpu=16MHz :8
  TCCR1A |= (1 << COM1A1) | (1 << WGM11);
  TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS11);
}

void loop() {
  OCR1A = 999;
  delay(2000);
  OCR1A = 4499;
  delay(2000);
}

Adesso sono a lavoro e non posso fare test ma dovresti intanto provare così:

void setup() {
  DDRB |= (1 << 1);
  ICR1 = 39999; // T=20ms fcpu=16MHz :8
  TCCR1A = (1 << COM1A1) | (1 << WGM11);
  TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);
}

void loop() {
  OCR1A = 999;
  delay(2000);
  OCR1A = 4499;
  delay(2000);
}

Ho tolto le operazioni di OR nel settaggio dei registri TCCR1A e 1B, in questo modo sovrascrivi le impostazioni fatte dal core, andando quindi a settare il timer da zero.

Si indubbiamente cosi dovrebbe funzionare, direi che il problema è risolto.
Grazie mille

Scusate ma mi stavo dimenticando una cosa...

Vorrei ribadire la seconda domanda

RobertoBochet:
PS Non è che qualcuno mi spiegherebbe anche perché la comandabilità del servo è nata con PCM legato a 2ms su 20ms invece di usare un PWM basato sull'intero periodo di modulazione.