martes, 15 de diciembre de 2009

freemat - Funciones para calcular tiempos TMR0

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






No hay comentarios:

IRC

#freenode->#usljujuy

Seguidores

Eventos n_n

Tira Ecol Nano,Bilo y Luca