El siguiente codigo lo extraje de
http://www.iearobotics.com/ un excelente sitio de microcontroladores pic con manuales cursos ejemplos.
El codigo calcula el valor del registro TMR0 y de su prescaler para configurarlo y poder generar notas musicales, ingresamos el valor del cristal y la frecuencia que queremos generar. Los scripts estan para matlab asi que hize unos cambios para que funcionen en freemat.
function TMR0=timer0_TMR0_frec(FOSC,frecuencia)
DIV=[2,4,8,16,32,64,128,256];
PS=[000,001,010,011,100,101,110,111];
Duracion = 1/(2*frecuencia)*1000000;
TMR0=256-timer0_ticks(FOSC,Duracion);
frec = 1000000./(2*timer0_Duracion(FOSC,Duracion));
Error = frecuencia-frec;
for i=1:length(TMR0)
if TMR0(i)<256 && TMR0(i)>=0
printf ('TMR0= %d, PS2:0= %03d, Div= %3d, Frec= %.1f Hz, Error= %.2f Hz\n', TMR0(i), PS(i), DIV(i), frec(i), Error(i));
end
end
function Dur=timer0_Duracion(FOSC,Duracion)
DIV=[2,4,8,16,32,64,128,256];
N=timer0_ticks(20,Duracion);
Dur = N.*(4*DIV/FOSC);
function N=timer0_ticks(FOSC,Duracion)
DIV = [2 4 8 16 32 64 128 256];
N = round(FOSC*Duracion./(4*DIV));
for i=1:length(N)
if N(i)>255
N(i)=NaN;
end
end
function TMR0=timer0_TMR0(FOSC,t)
DIV=[2,4,8,16,32,64,128,256];
PS=[000,001,010,011,100,101,110,111];
TMR0=256-timer0_ticks(FOSC,t);
tc=timer0_Duracion(FOSC,t);
Error = t - tc;
for i=1:length(TMR0)
if TMR0(i)<256 && TMR0(i)>=0
printf ('T0INI= %3d, PS2:0= %03d, Div= %3d, tc= %.1f us, Error= %.2f us\n',
TMR0(i),PS(i), DIV(i), tc(i),Error(i));
end
end