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
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.
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.
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.